From 57e9689be6fcb557f2ecf0a996820f8bc89631ce Mon Sep 17 00:00:00 2001 From: Nice3point Date: Thu, 1 Sep 2022 21:07:54 +0300 Subject: [PATCH] Fetch new version --- .run/Revit 2022 ENU.run.xml | 25 - .run/Revit 2023 ENU.run.xml | 25 - License - Fira Code.txt | 93 + License - Fluent System Icons.txt | 21 + License - Segoe Fluent Icons.txt | 1 + License - VirtualizingWrapPanel.txt | 21 + License - wpfui.txt | 21 + RevitLookup.UI.Tests/App.xaml | 3 +- RevitLookup.UI.Tests/App.xaml.cs | 89 +- .../Services/ApplicationHostService.cs | 65 + RevitLookup.UI.Tests/Services/PageService.cs | 48 + .../ViewModels/Converters/ValueConterters.cs | 2 +- .../ViewModels/Pages/AboutViewModel.cs | 31 +- .../ViewModels/Pages/DashboardViewModel.cs | 22 +- .../ViewModels/Pages/SettingsViewModel.cs | 106 +- .../ViewModels/RevitLookupViewModel.cs | 26 +- .../Views/Pages/AboutView.xaml | 66 +- .../Views/Pages/AboutView.xaml.cs | 22 +- .../Views/Pages/DashboardView.xaml | 19 +- .../Views/Pages/DashboardView.xaml.cs | 11 +- .../Views/Pages/SettingsView.xaml | 61 +- .../Views/Pages/SettingsView.xaml.cs | 11 +- .../Views/Pages/SnoopSummaryView.xaml | 17 +- .../Views/Pages/SnoopSummaryView.xaml.cs | 5 +- .../Views/RevitLookupView.xaml | 44 +- .../Views/RevitLookupView.xaml.cs | 46 +- RevitLookup.UI/Animations/TransitionType.cs | 42 + RevitLookup.UI/Animations/Transitions.cs | 170 + RevitLookup.UI/Appearance/Accent.cs | 118 +- RevitLookup.UI/Appearance/AppearanceData.cs | 83 +- RevitLookup.UI/Appearance/Background.cs | 441 +- RevitLookup.UI/Appearance/BackgroundType.cs | 18 +- .../Appearance/ResourceDictionaryManager.cs | 47 +- RevitLookup.UI/Appearance/SystemTheme.cs | 17 +- RevitLookup.UI/Appearance/SystemThemeType.cs | 20 +- RevitLookup.UI/Appearance/Theme.cs | 187 +- .../Appearance/ThemeChangedEvent.cs | 8 +- RevitLookup.UI/Appearance/ThemeType.cs | 12 +- RevitLookup.UI/Appearance/Watcher.cs | 122 +- .../Appearance/WindowCornerPreference.cs | 32 + RevitLookup.UI/Application.cs | 2 +- RevitLookup.UI/Assembly.cs | 29 +- RevitLookup.UI/Common/Clipboard.cs | 26 +- .../{Appearance.cs => ControlAppearance.cs} | 27 +- RevitLookup.UI/Common/DateTimeExtensions.cs | 38 - .../Common/{Designer.cs => DesignerHelper.cs} | 19 +- RevitLookup.UI/Common/Dpi.cs | 80 - ...ElementPosition.cs => ElementPlacement.cs} | 10 +- RevitLookup.UI/Common/EventIdentifier.cs | 29 +- RevitLookup.UI/Common/Glyph.cs | 18 +- RevitLookup.UI/Common/IRelayCommand.cs | 10 +- .../Common/Interfaces/INavigableView.cs | 20 + .../INavigationAware.cs} | 16 +- RevitLookup.UI/Common/ItemRange.cs | 30 + RevitLookup.UI/Common/NavigationType.cs | 13 + RevitLookup.UI/Common/RelayCommand.cs | 52 +- RevitLookup.UI/Common/RoutedDialogEvent.cs | 10 +- .../Common/RoutedNavigationEvent.cs | 5 +- .../Common/RoutedNavigationEventArgs.cs | 18 +- .../Common/RoutedNotifyIconEvent.cs | 11 +- RevitLookup.UI/Common/RoutedSnackbarEvent.cs | 10 +- RevitLookup.UI/Common/ScrollDirection.cs | 25 + RevitLookup.UI/Common/SnapLayout.cs | 171 - RevitLookup.UI/Common/SpacingMode.cs | 35 + RevitLookup.UI/Common/SymbolExtensions.cs | 73 - RevitLookup.UI/Common/SymbolFilled.cs | 7729 ++++++++-------- RevitLookup.UI/Common/SymbolRegular.cs | 7732 +++++++++-------- RevitLookup.UI/Common/ViewData.cs | 35 - RevitLookup.UI/Common/Windows.cs | 36 - RevitLookup.UI/Controls/Anchor.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/Anchor.cs | 26 +- RevitLookup.UI/Controls/Arc.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/Arc.cs | 76 +- RevitLookup.UI/Controls/AutoSuggestBox.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/AutoSuggestBox.cs | 314 + RevitLookup.UI/Controls/Badge.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/Badge.cs | 21 +- RevitLookup.UI/Controls/Barcode.cs | 9 + RevitLookup.UI/Controls/Breadcrumb.cs | 55 +- RevitLookup.UI/Controls/Button.cs | 142 +- RevitLookup.UI/Controls/Card.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/Card.cs | 21 +- RevitLookup.UI/Controls/CardAction.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/CardAction.cs | 60 +- RevitLookup.UI/Controls/CardColor.cs | 54 +- RevitLookup.UI/Controls/CardControl.cs | 67 +- RevitLookup.UI/Controls/CardExpander.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/CardExpander.cs | 70 +- RevitLookup.UI/Controls/ClientAreaBorder.cs | 126 +- RevitLookup.UI/Controls/CodeBlock.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/CodeBlock.cs | 65 +- RevitLookup.UI/Controls/ControlsServices.cs | 27 + RevitLookup.UI/Controls/Dialog.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/Dialog.cs | 390 +- RevitLookup.UI/Controls/DropDownButton.cs | 13 + RevitLookup.UI/Controls/DynamicScrollBar.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/DynamicScrollBar.cs | 47 +- .../Controls/DynamicScrollViewer.bmp | Bin 0 -> 824 bytes .../Controls/DynamicScrollViewer.cs | 68 +- RevitLookup.UI/Controls/Flyout.cs | 68 +- RevitLookup.UI/Controls/FontIcon.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/FontIcon.cs | 17 +- RevitLookup.UI/Controls/Hyperlink.cs | 27 +- .../Controls/Interfaces/IAppearanceControl.cs | 10 +- .../Controls/Interfaces/IDialogControl.cs | 152 + .../Controls/Interfaces/IDpiAwareControl.cs | 14 + .../Controls/Interfaces/IIconControl.cs | 17 +- .../Controls/Interfaces/INavigable.cs | 19 - .../Controls/Interfaces/INavigation.cs | 201 +- .../Controls/Interfaces/INavigationControl.cs | 13 + .../Controls/Interfaces/INavigationItem.cs | 41 +- .../Controls/Interfaces/INotifyIcon.cs | 82 - .../Controls/Interfaces/ISnackbarControl.cs | 122 + .../Controls/Interfaces/IThemeElement.cs | 16 +- RevitLookup.UI/Controls/LoadingScreen.cs | 10 +- RevitLookup.UI/Controls/MaximizeButton.cs | 2 +- RevitLookup.UI/Controls/MenuItem.cs | 69 + RevitLookup.UI/Controls/MessageBox.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/MessageBox.cs | 162 +- RevitLookup.UI/Controls/Navigation.cs | 208 - .../Navigation/NavigationBackButton.cs | 39 + .../Controls/Navigation/NavigationBase.cs | 722 ++ .../Controls/Navigation/NavigationHeader.bmp | Bin 0 -> 824 bytes .../Controls/Navigation/NavigationHeader.cs | 97 + .../Navigation/NavigationSeparator.bmp | Bin 0 -> 824 bytes .../Navigation/NavigationSeparator.cs | 16 + RevitLookup.UI/Controls/NavigationCompact.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/NavigationCompact.cs | 42 +- RevitLookup.UI/Controls/NavigationFluent.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/NavigationFluent.cs | 11 +- RevitLookup.UI/Controls/NavigationItem.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/NavigationItem.cs | 338 +- RevitLookup.UI/Controls/NavigationStore.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/NavigationStore.cs | 11 +- RevitLookup.UI/Controls/NavigationView.cs | 70 + RevitLookup.UI/Controls/NotifyIcon.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/NotifyIcon.cs | 464 + RevitLookup.UI/Controls/NumberBox.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/NumberBox.cs | 431 +- RevitLookup.UI/Controls/PasswordBox.cs | 144 +- RevitLookup.UI/Controls/ProgressRing.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/ProgressRing.cs | 56 +- RevitLookup.UI/Controls/QrCode.cs | 56 +- RevitLookup.UI/Controls/Rating.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/Rating.cs | 30 +- RevitLookup.UI/Controls/SearchBox.cs | 31 - RevitLookup.UI/Controls/Snackbar.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/Snackbar.cs | 402 +- RevitLookup.UI/Controls/SplitButton.cs | 13 + .../Controls/States/ThumbRateState.cs | 27 + RevitLookup.UI/Controls/SymbolIcon.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/SymbolIcon.cs | 44 +- RevitLookup.UI/Controls/TextBox.cs | 197 +- RevitLookup.UI/Controls/ThumbRate.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/ThumbRate.cs | 110 + RevitLookup.UI/Controls/TitleBar.cs | 431 +- RevitLookup.UI/Controls/ToggleSwitch.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/ToggleSwitch.cs | 13 +- RevitLookup.UI/Controls/TreeGrid.cs | 107 + RevitLookup.UI/Controls/TreeGridHeader.cs | 69 + RevitLookup.UI/Controls/TreeGridItem.cs | 14 + RevitLookup.UI/Controls/TreeViewItem.cs | 69 + RevitLookup.UI/Controls/UiPage.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/UiPage.cs | 95 + RevitLookup.UI/Controls/UiWindow.bmp | Bin 0 -> 824 bytes RevitLookup.UI/Controls/UiWindow.cs | 267 + .../Controls/VirtualizingGridView.cs | 103 + .../Controls/VirtualizingItemsControl.bmp | Bin 0 -> 824 bytes .../Controls/VirtualizingItemsControl.cs | 53 + .../Controls/VirtualizingPanelBase.cs | 709 ++ .../Controls/VirtualizingUniformGrid.cs | 304 +- .../Controls/VirtualizingWrapPanel.bmp | Bin 0 -> 824 bytes .../Controls/VirtualizingWrapPanel.cs | 546 ++ .../Converters/BrushToColorConverter.cs | 16 +- .../Converters/FallbackBrushConverter.cs | 40 + .../Converters/IconNotEmptyConverter.cs | 19 +- .../Converters/IconToStringConverter.cs | 19 +- .../Converters/ObjectToSymbolConverter.cs | 43 + .../Converters/ProgressThicknessConverter.cs | 16 +- .../Converters/TextToAsteriskConverter.cs | 12 +- RevitLookup.UI/Dpi/Dpi.cs | 63 + RevitLookup.UI/Dpi/DpiChangedEventArgs.cs | 20 + RevitLookup.UI/Dpi/DpiHelper.cs | 162 + RevitLookup.UI/Extensions/ColorExtensions.cs | 153 +- .../Extensions/ContextMenuExtensions.cs | 18 +- .../Extensions/DateTimeExtensions.cs | 40 + RevitLookup.UI/Extensions/FrameExtensions.cs | 35 + RevitLookup.UI/Extensions/SymbolExtensions.cs | 81 + RevitLookup.UI/Extensions/UriExtensions.cs | 63 + RevitLookup.UI/Extensions/WindowExtensions.cs | 140 +- .../Fonts/FluentSystemIcons-Filled.ttf | Bin 1343180 -> 1443900 bytes .../Fonts/FluentSystemIcons-Regular.ttf | Bin 1543368 -> 1659856 bytes .../Hardware/HardwareAcceleration.cs | 24 + RevitLookup.UI/Hardware/RenderingTier.cs | 33 + RevitLookup.UI/Interop/Dwmapi.cs | 561 +- RevitLookup.UI/Interop/Gdi32.cs | 19 - RevitLookup.UI/Interop/Gdip.cs | 17 - RevitLookup.UI/Interop/HT.cs | 82 - RevitLookup.UI/Interop/Kernel32.cs | 40 +- RevitLookup.UI/Interop/Libraries.cs | 55 +- RevitLookup.UI/Interop/ShObjIdl.cs | 231 + RevitLookup.UI/Interop/Shell32.cs | 234 +- RevitLookup.UI/Interop/ShobjidlCore.cs | 99 - RevitLookup.UI/Interop/UFlags.cs | 36 - RevitLookup.UI/Interop/UnsafeNativeMethods.cs | 609 ++ RevitLookup.UI/Interop/UnsafeReflection.cs | 103 + RevitLookup.UI/Interop/User32.cs | 1348 ++- RevitLookup.UI/Interop/UxTheme.cs | 166 + RevitLookup.UI/Interop/WinDef/POINT.cs | 29 + RevitLookup.UI/Interop/WinDef/POINTL.cs | 29 + RevitLookup.UI/Interop/WinDef/POINTS.cs | 29 + RevitLookup.UI/Interop/WinDef/RECT.cs | 145 + RevitLookup.UI/Interop/WinDef/RECTL.cs | 144 + RevitLookup.UI/Interop/WinDef/RefPOINT.cs | 29 + RevitLookup.UI/Interop/WinDef/SIZE.cs | 29 + RevitLookup.UI/Markup/ControlsDictionary.cs | 26 + RevitLookup.UI/Markup/ThemeResource.cs | 262 + .../Markup/ThemeResourceExtension.cs | 38 + RevitLookup.UI/Markup/ThemesDictionary.cs | 39 + .../Mvvm/Contracts/IDialogService.cs | 26 + .../Mvvm/Contracts/INavigationService.cs | 65 + .../Mvvm/Contracts/INavigationWindow.cs | 51 + .../Mvvm/Contracts/INotifyIconService.cs | 57 + RevitLookup.UI/Mvvm/Contracts/IPageService.cs | 32 + .../Mvvm/Contracts/ISnackbarService.cs | 108 + .../Mvvm/Contracts/ITaskbarService.cs | 90 + .../Mvvm/Contracts/IThemeService.cs | 52 + RevitLookup.UI/Mvvm/Interfaces/IViewModel.cs | 21 + RevitLookup.UI/Mvvm/Services/DialogService.cs | 36 + .../Mvvm/Services/NavigationService.cs | 97 + .../Mvvm/Services/NotifyIconService.cs | 132 + .../Mvvm/Services/SnackbarService.cs | 165 + .../Mvvm/Services/TaskbarService.cs | 104 + RevitLookup.UI/Mvvm/Services/ThemeService.cs | 73 + RevitLookup.UI/Notifications/Toast.cs | 2 +- RevitLookup.UI/RevitLookup.UI.csproj | 104 +- .../Services/Internal/NavigationService.cs | 839 ++ .../Internal/NavigationServiceActivator.cs | 162 + .../Internal/NavigationServiceExtraData.cs | 27 + .../Internal/NavigationServiceItem.cs | 71 + .../Services/Internal/NotifyIconService.cs | 310 + RevitLookup.UI/Styles/Assets/Accent.xaml | 57 +- RevitLookup.UI/Styles/Assets/Brushes.xaml | 336 - RevitLookup.UI/Styles/Assets/Fonts.xaml | 35 +- RevitLookup.UI/Styles/Assets/Icons.xaml | 62 - RevitLookup.UI/Styles/Assets/Palette.xaml | 184 +- .../Styles/Assets/StaticColors.xaml | 132 +- RevitLookup.UI/Styles/Assets/Variables.xaml | 57 + RevitLookup.UI/Styles/Common/ContextMenu.xaml | 16 + .../Styles/Common/FocusVisualStyle.xaml | 27 + RevitLookup.UI/Styles/Controls/Anchor.xaml | 446 +- .../Styles/Controls/AutoSuggestBox.xaml | 348 + RevitLookup.UI/Styles/Controls/Badge.xaml | 137 +- .../Styles/Controls/Breadcrumb.xaml | 62 +- RevitLookup.UI/Styles/Controls/Button.xaml | 646 +- RevitLookup.UI/Styles/Controls/Calendar.xaml | 431 +- RevitLookup.UI/Styles/Controls/Card.xaml | 99 +- .../Styles/Controls/CardAction.xaml | 185 +- RevitLookup.UI/Styles/Controls/CardColor.xaml | 39 +- .../Styles/Controls/CardControl.xaml | 218 +- .../Styles/Controls/CardExpander.xaml | 349 +- RevitLookup.UI/Styles/Controls/CheckBox.xaml | 251 +- RevitLookup.UI/Styles/Controls/CodeBlock.xaml | 114 +- RevitLookup.UI/Styles/Controls/ComboBox.xaml | 691 +- .../Styles/Controls/ContextMenu.xaml | 78 +- .../Styles/Controls/ContextMenu.xaml.cs | 69 +- RevitLookup.UI/Styles/Controls/DataGrid.xaml | 271 +- .../Styles/Controls/DatePicker.xaml | 360 +- RevitLookup.UI/Styles/Controls/Dialog.xaml | 198 +- .../Styles/Controls/DropDownButton.xaml | 91 + .../Styles/Controls/DynamicScrollBar.xaml | 390 + .../Styles/Controls/DynamicScrollViewer.xaml | 635 +- RevitLookup.UI/Styles/Controls/Expander.xaml | 226 +- RevitLookup.UI/Styles/Controls/Flyout.xaml | 81 + RevitLookup.UI/Styles/Controls/FontIcon.xaml | 62 +- RevitLookup.UI/Styles/Controls/Frame.xaml | 30 +- RevitLookup.UI/Styles/Controls/Hyperlink.xaml | 153 +- .../Styles/Controls/ItemsControl.xaml | 9 +- RevitLookup.UI/Styles/Controls/Label.xaml | 24 +- RevitLookup.UI/Styles/Controls/ListBox.xaml | 136 +- RevitLookup.UI/Styles/Controls/ListView.xaml | 132 +- .../Styles/Controls/LoadingScreen.xaml | 48 +- RevitLookup.UI/Styles/Controls/Menu.xaml | 627 +- RevitLookup.UI/Styles/Controls/Menu.xaml.cs | 33 +- RevitLookup.UI/Styles/Controls/MenuItem.xaml | 878 ++ .../Styles/Controls/MessageBox.xaml | 204 +- .../Styles/Controls/Navigation.xaml | 4 +- .../Styles/Controls/NavigationBackButton.xaml | 90 + .../Styles/Controls/NavigationCompact.xaml | 404 +- .../Styles/Controls/NavigationFluent.xaml | 233 +- .../Styles/Controls/NavigationHeader.xaml | 70 + .../Styles/Controls/NavigationSeparator.xaml | 35 + .../Styles/Controls/NavigationStore.xaml | 317 +- .../Styles/Controls/NavigationView.xaml | 91 + RevitLookup.UI/Styles/Controls/NumberBox.xaml | 421 +- RevitLookup.UI/Styles/Controls/Page.xaml | 63 +- .../Styles/Controls/PasswordBox.xaml | 571 +- .../Styles/Controls/ProgressBar.xaml | 74 +- .../Styles/Controls/ProgressRing.xaml | 69 +- .../Styles/Controls/RadioButton.xaml | 287 +- RevitLookup.UI/Styles/Controls/Rating.xaml | 175 +- .../Styles/Controls/RichTextBox.xaml | 92 +- RevitLookup.UI/Styles/Controls/Scroll.xaml | 570 -- RevitLookup.UI/Styles/Controls/ScrollBar.xaml | 385 + .../Styles/Controls/ScrollViewer.xaml | 68 + RevitLookup.UI/Styles/Controls/SearchBox.xaml | 208 - RevitLookup.UI/Styles/Controls/Separator.xaml | 40 +- RevitLookup.UI/Styles/Controls/Slider.xaml | 280 +- RevitLookup.UI/Styles/Controls/Snackbar.xaml | 328 +- .../Styles/Controls/SplitButton.xaml | 91 + RevitLookup.UI/Styles/Controls/StatusBar.xaml | 69 +- .../Styles/Controls/SymbolIcon.xaml | 77 +- .../Styles/Controls/TabControl.xaml | 141 +- RevitLookup.UI/Styles/Controls/TextBlock.xaml | 39 +- RevitLookup.UI/Styles/Controls/TextBox.xaml | 542 +- RevitLookup.UI/Styles/Controls/ThumbRate.xaml | 72 + RevitLookup.UI/Styles/Controls/TitleBar.xaml | 349 +- .../Styles/Controls/ToggleButton.xaml | 231 +- .../Styles/Controls/ToggleSwitch.xaml | 371 +- RevitLookup.UI/Styles/Controls/ToolBar.xaml | 222 +- RevitLookup.UI/Styles/Controls/ToolTip.xaml | 80 +- RevitLookup.UI/Styles/Controls/TreeGrid.xaml | 87 + RevitLookup.UI/Styles/Controls/TreeView.xaml | 352 +- .../Styles/Controls/TreeViewItem.xaml | 379 + RevitLookup.UI/Styles/Controls/UiPage.xaml | 56 + RevitLookup.UI/Styles/Controls/UiWindow.xaml | 67 + .../Styles/Controls/VirtualizingGridView.xaml | 68 + .../Controls/VirtualizingItemsControl.xaml | 50 + .../Controls/VirtualizingUniformGrid.xaml | 44 - .../Controls/VirtualizingWrapPanel.xaml | 22 + RevitLookup.UI/Styles/Controls/Window.xaml | 172 +- RevitLookup.UI/Styles/RevitLookup.UI.xaml | 221 +- RevitLookup.UI/Styles/Theme/Dark.xaml | 603 +- RevitLookup.UI/Styles/Theme/HighContrast.xaml | 540 +- RevitLookup.UI/Styles/Theme/Light.xaml | 609 +- RevitLookup.UI/Syntax/Highlighter.cs | 149 +- RevitLookup.UI/Syntax/SyntaxLanguage.cs | 5 +- RevitLookup.UI/Taskbar/Progress.cs | 100 - RevitLookup.UI/Taskbar/ProgressState.cs | 38 - RevitLookup.UI/Taskbar/TaskbarProgress.cs | 131 + .../Taskbar/TaskbarProgressState.cs | 39 + RevitLookup.UI/TitleBar/SnapLayout.cs | 200 + RevitLookup.UI/TitleBar/SnapLayoutButton.cs | 161 + RevitLookup.UI/TitleBar/TitleBarButton.cs | 42 + RevitLookup.UI/Tray/Hicon.cs | 94 + RevitLookup.UI/Tray/INotifyIcon.cs | 84 + RevitLookup.UI/Tray/NotifyIconEvent.cs | 8 + RevitLookup.UI/Tray/TrayData.cs | 20 + RevitLookup.UI/Tray/TrayHandler.cs | 30 + RevitLookup.UI/Tray/TrayManager.cs | 136 + .../BrushToColorValidationRule.cs | 29 + .../ValidationRules/FallbackValidationRule.cs | 21 + .../ValidationRulesCollection.cs | 13 + RevitLookup.UI/Win32/EntryIndex.cs | 31 - RevitLookup.UI/Win32/ErrorCodes.cs | 465 - RevitLookup.UI/Win32/ExpressionMode.cs | 59 - RevitLookup.UI/Win32/ExternDll.cs | 43 - RevitLookup.UI/Win32/NamedObject.cs | 40 - RevitLookup.UI/Win32/SafeNativeMethods.cs | 15 - RevitLookup.UI/Win32/SystemResources.cs | 11 - RevitLookup.UI/Win32/UnsafeNativeMethods.cs | 15 - RevitLookup.UI/Win32/Utilities.cs | 206 +- RevitLookup.UI/Win32/UxThemeWrapper.cs | 394 - RevitLookup.UI/Win32/Win32Constant.cs | 16 +- .../{Common => Win32}/WindowsRelease.cs | 56 +- RevitLookup.UI/WpfGfx/ApiBase.cs | 9 - RevitLookup/Application.cs | 19 +- RevitLookup/Properties/Resources.Designer.cs | 93 - RevitLookup/Properties/Resources.resx | 164 - RevitLookup/Properties/launchSettings.json | 14 - RevitLookup/Resources/Images/CopyIcon.ico | Bin 1150 -> 0 bytes RevitLookup/Resources/Images/PreviewIcon.ico | Bin 1150 -> 0 bytes RevitLookup/Resources/Images/PrintIcon.ico | Bin 1150 -> 0 bytes RevitLookup/RevitLookup.csproj | 9 +- .../ViewModels/Converters/ValueConterters.cs | 2 +- .../ViewModels/Pages/SettingsViewModel.cs | 25 +- RevitLookup/Views/Pages/AboutView.xaml | 5 +- RevitLookup/Views/Pages/DashboardView.xaml | 2 +- RevitLookup/Views/Pages/SettingsView.xaml | 6 +- RevitLookup/Views/RevitLookupView.xaml | 2 +- global.json | 5 +- 381 files changed, 34643 insertions(+), 24028 deletions(-) delete mode 100644 .run/Revit 2022 ENU.run.xml delete mode 100644 .run/Revit 2023 ENU.run.xml create mode 100644 License - Fira Code.txt create mode 100644 License - Fluent System Icons.txt create mode 100644 License - Segoe Fluent Icons.txt create mode 100644 License - VirtualizingWrapPanel.txt create mode 100644 License - wpfui.txt create mode 100644 RevitLookup.UI.Tests/Services/ApplicationHostService.cs create mode 100644 RevitLookup.UI.Tests/Services/PageService.cs create mode 100644 RevitLookup.UI/Animations/TransitionType.cs create mode 100644 RevitLookup.UI/Animations/Transitions.cs create mode 100644 RevitLookup.UI/Appearance/WindowCornerPreference.cs rename RevitLookup.UI/Common/{Appearance.cs => ControlAppearance.cs} (62%) delete mode 100644 RevitLookup.UI/Common/DateTimeExtensions.cs rename RevitLookup.UI/Common/{Designer.cs => DesignerHelper.cs} (60%) delete mode 100644 RevitLookup.UI/Common/Dpi.cs rename RevitLookup.UI/Common/{ElementPosition.cs => ElementPlacement.cs} (71%) create mode 100644 RevitLookup.UI/Common/Interfaces/INavigableView.cs rename RevitLookup.UI/Common/{RevealMode.cs => Interfaces/INavigationAware.cs} (56%) create mode 100644 RevitLookup.UI/Common/ItemRange.cs create mode 100644 RevitLookup.UI/Common/NavigationType.cs create mode 100644 RevitLookup.UI/Common/ScrollDirection.cs delete mode 100644 RevitLookup.UI/Common/SnapLayout.cs create mode 100644 RevitLookup.UI/Common/SpacingMode.cs delete mode 100644 RevitLookup.UI/Common/SymbolExtensions.cs delete mode 100644 RevitLookup.UI/Common/ViewData.cs delete mode 100644 RevitLookup.UI/Common/Windows.cs create mode 100644 RevitLookup.UI/Controls/Anchor.bmp create mode 100644 RevitLookup.UI/Controls/Arc.bmp create mode 100644 RevitLookup.UI/Controls/AutoSuggestBox.bmp create mode 100644 RevitLookup.UI/Controls/AutoSuggestBox.cs create mode 100644 RevitLookup.UI/Controls/Badge.bmp create mode 100644 RevitLookup.UI/Controls/Barcode.cs create mode 100644 RevitLookup.UI/Controls/Card.bmp create mode 100644 RevitLookup.UI/Controls/CardAction.bmp create mode 100644 RevitLookup.UI/Controls/CardExpander.bmp create mode 100644 RevitLookup.UI/Controls/CodeBlock.bmp create mode 100644 RevitLookup.UI/Controls/ControlsServices.cs create mode 100644 RevitLookup.UI/Controls/Dialog.bmp create mode 100644 RevitLookup.UI/Controls/DropDownButton.cs create mode 100644 RevitLookup.UI/Controls/DynamicScrollBar.bmp create mode 100644 RevitLookup.UI/Controls/DynamicScrollViewer.bmp create mode 100644 RevitLookup.UI/Controls/FontIcon.bmp create mode 100644 RevitLookup.UI/Controls/Interfaces/IDialogControl.cs create mode 100644 RevitLookup.UI/Controls/Interfaces/IDpiAwareControl.cs delete mode 100644 RevitLookup.UI/Controls/Interfaces/INavigable.cs create mode 100644 RevitLookup.UI/Controls/Interfaces/INavigationControl.cs delete mode 100644 RevitLookup.UI/Controls/Interfaces/INotifyIcon.cs create mode 100644 RevitLookup.UI/Controls/Interfaces/ISnackbarControl.cs create mode 100644 RevitLookup.UI/Controls/MenuItem.cs create mode 100644 RevitLookup.UI/Controls/MessageBox.bmp delete mode 100644 RevitLookup.UI/Controls/Navigation.cs create mode 100644 RevitLookup.UI/Controls/Navigation/NavigationBackButton.cs create mode 100644 RevitLookup.UI/Controls/Navigation/NavigationBase.cs create mode 100644 RevitLookup.UI/Controls/Navigation/NavigationHeader.bmp create mode 100644 RevitLookup.UI/Controls/Navigation/NavigationHeader.cs create mode 100644 RevitLookup.UI/Controls/Navigation/NavigationSeparator.bmp create mode 100644 RevitLookup.UI/Controls/Navigation/NavigationSeparator.cs create mode 100644 RevitLookup.UI/Controls/NavigationCompact.bmp create mode 100644 RevitLookup.UI/Controls/NavigationFluent.bmp create mode 100644 RevitLookup.UI/Controls/NavigationItem.bmp create mode 100644 RevitLookup.UI/Controls/NavigationStore.bmp create mode 100644 RevitLookup.UI/Controls/NavigationView.cs create mode 100644 RevitLookup.UI/Controls/NotifyIcon.bmp create mode 100644 RevitLookup.UI/Controls/NotifyIcon.cs create mode 100644 RevitLookup.UI/Controls/NumberBox.bmp create mode 100644 RevitLookup.UI/Controls/ProgressRing.bmp create mode 100644 RevitLookup.UI/Controls/Rating.bmp delete mode 100644 RevitLookup.UI/Controls/SearchBox.cs create mode 100644 RevitLookup.UI/Controls/Snackbar.bmp create mode 100644 RevitLookup.UI/Controls/SplitButton.cs create mode 100644 RevitLookup.UI/Controls/States/ThumbRateState.cs create mode 100644 RevitLookup.UI/Controls/SymbolIcon.bmp create mode 100644 RevitLookup.UI/Controls/ThumbRate.bmp create mode 100644 RevitLookup.UI/Controls/ThumbRate.cs create mode 100644 RevitLookup.UI/Controls/ToggleSwitch.bmp create mode 100644 RevitLookup.UI/Controls/TreeGrid.cs create mode 100644 RevitLookup.UI/Controls/TreeGridHeader.cs create mode 100644 RevitLookup.UI/Controls/TreeGridItem.cs create mode 100644 RevitLookup.UI/Controls/TreeViewItem.cs create mode 100644 RevitLookup.UI/Controls/UiPage.bmp create mode 100644 RevitLookup.UI/Controls/UiPage.cs create mode 100644 RevitLookup.UI/Controls/UiWindow.bmp create mode 100644 RevitLookup.UI/Controls/UiWindow.cs create mode 100644 RevitLookup.UI/Controls/VirtualizingGridView.cs create mode 100644 RevitLookup.UI/Controls/VirtualizingItemsControl.bmp create mode 100644 RevitLookup.UI/Controls/VirtualizingItemsControl.cs create mode 100644 RevitLookup.UI/Controls/VirtualizingPanelBase.cs create mode 100644 RevitLookup.UI/Controls/VirtualizingWrapPanel.bmp create mode 100644 RevitLookup.UI/Controls/VirtualizingWrapPanel.cs create mode 100644 RevitLookup.UI/Converters/FallbackBrushConverter.cs create mode 100644 RevitLookup.UI/Converters/ObjectToSymbolConverter.cs create mode 100644 RevitLookup.UI/Dpi/Dpi.cs create mode 100644 RevitLookup.UI/Dpi/DpiChangedEventArgs.cs create mode 100644 RevitLookup.UI/Dpi/DpiHelper.cs create mode 100644 RevitLookup.UI/Extensions/DateTimeExtensions.cs create mode 100644 RevitLookup.UI/Extensions/FrameExtensions.cs create mode 100644 RevitLookup.UI/Extensions/SymbolExtensions.cs create mode 100644 RevitLookup.UI/Extensions/UriExtensions.cs create mode 100644 RevitLookup.UI/Hardware/HardwareAcceleration.cs create mode 100644 RevitLookup.UI/Hardware/RenderingTier.cs delete mode 100644 RevitLookup.UI/Interop/Gdi32.cs delete mode 100644 RevitLookup.UI/Interop/Gdip.cs delete mode 100644 RevitLookup.UI/Interop/HT.cs create mode 100644 RevitLookup.UI/Interop/ShObjIdl.cs delete mode 100644 RevitLookup.UI/Interop/ShobjidlCore.cs delete mode 100644 RevitLookup.UI/Interop/UFlags.cs create mode 100644 RevitLookup.UI/Interop/UnsafeNativeMethods.cs create mode 100644 RevitLookup.UI/Interop/UnsafeReflection.cs create mode 100644 RevitLookup.UI/Interop/UxTheme.cs create mode 100644 RevitLookup.UI/Interop/WinDef/POINT.cs create mode 100644 RevitLookup.UI/Interop/WinDef/POINTL.cs create mode 100644 RevitLookup.UI/Interop/WinDef/POINTS.cs create mode 100644 RevitLookup.UI/Interop/WinDef/RECT.cs create mode 100644 RevitLookup.UI/Interop/WinDef/RECTL.cs create mode 100644 RevitLookup.UI/Interop/WinDef/RefPOINT.cs create mode 100644 RevitLookup.UI/Interop/WinDef/SIZE.cs create mode 100644 RevitLookup.UI/Markup/ControlsDictionary.cs create mode 100644 RevitLookup.UI/Markup/ThemeResource.cs create mode 100644 RevitLookup.UI/Markup/ThemeResourceExtension.cs create mode 100644 RevitLookup.UI/Markup/ThemesDictionary.cs create mode 100644 RevitLookup.UI/Mvvm/Contracts/IDialogService.cs create mode 100644 RevitLookup.UI/Mvvm/Contracts/INavigationService.cs create mode 100644 RevitLookup.UI/Mvvm/Contracts/INavigationWindow.cs create mode 100644 RevitLookup.UI/Mvvm/Contracts/INotifyIconService.cs create mode 100644 RevitLookup.UI/Mvvm/Contracts/IPageService.cs create mode 100644 RevitLookup.UI/Mvvm/Contracts/ISnackbarService.cs create mode 100644 RevitLookup.UI/Mvvm/Contracts/ITaskbarService.cs create mode 100644 RevitLookup.UI/Mvvm/Contracts/IThemeService.cs create mode 100644 RevitLookup.UI/Mvvm/Interfaces/IViewModel.cs create mode 100644 RevitLookup.UI/Mvvm/Services/DialogService.cs create mode 100644 RevitLookup.UI/Mvvm/Services/NavigationService.cs create mode 100644 RevitLookup.UI/Mvvm/Services/NotifyIconService.cs create mode 100644 RevitLookup.UI/Mvvm/Services/SnackbarService.cs create mode 100644 RevitLookup.UI/Mvvm/Services/TaskbarService.cs create mode 100644 RevitLookup.UI/Mvvm/Services/ThemeService.cs create mode 100644 RevitLookup.UI/Services/Internal/NavigationService.cs create mode 100644 RevitLookup.UI/Services/Internal/NavigationServiceActivator.cs create mode 100644 RevitLookup.UI/Services/Internal/NavigationServiceExtraData.cs create mode 100644 RevitLookup.UI/Services/Internal/NavigationServiceItem.cs create mode 100644 RevitLookup.UI/Services/Internal/NotifyIconService.cs delete mode 100644 RevitLookup.UI/Styles/Assets/Brushes.xaml delete mode 100644 RevitLookup.UI/Styles/Assets/Icons.xaml create mode 100644 RevitLookup.UI/Styles/Assets/Variables.xaml create mode 100644 RevitLookup.UI/Styles/Common/ContextMenu.xaml create mode 100644 RevitLookup.UI/Styles/Common/FocusVisualStyle.xaml create mode 100644 RevitLookup.UI/Styles/Controls/AutoSuggestBox.xaml create mode 100644 RevitLookup.UI/Styles/Controls/DropDownButton.xaml create mode 100644 RevitLookup.UI/Styles/Controls/DynamicScrollBar.xaml create mode 100644 RevitLookup.UI/Styles/Controls/Flyout.xaml create mode 100644 RevitLookup.UI/Styles/Controls/MenuItem.xaml create mode 100644 RevitLookup.UI/Styles/Controls/NavigationBackButton.xaml create mode 100644 RevitLookup.UI/Styles/Controls/NavigationHeader.xaml create mode 100644 RevitLookup.UI/Styles/Controls/NavigationSeparator.xaml create mode 100644 RevitLookup.UI/Styles/Controls/NavigationView.xaml delete mode 100644 RevitLookup.UI/Styles/Controls/Scroll.xaml create mode 100644 RevitLookup.UI/Styles/Controls/ScrollBar.xaml create mode 100644 RevitLookup.UI/Styles/Controls/ScrollViewer.xaml delete mode 100644 RevitLookup.UI/Styles/Controls/SearchBox.xaml create mode 100644 RevitLookup.UI/Styles/Controls/SplitButton.xaml create mode 100644 RevitLookup.UI/Styles/Controls/ThumbRate.xaml create mode 100644 RevitLookup.UI/Styles/Controls/TreeGrid.xaml create mode 100644 RevitLookup.UI/Styles/Controls/TreeViewItem.xaml create mode 100644 RevitLookup.UI/Styles/Controls/UiPage.xaml create mode 100644 RevitLookup.UI/Styles/Controls/UiWindow.xaml create mode 100644 RevitLookup.UI/Styles/Controls/VirtualizingGridView.xaml create mode 100644 RevitLookup.UI/Styles/Controls/VirtualizingItemsControl.xaml delete mode 100644 RevitLookup.UI/Styles/Controls/VirtualizingUniformGrid.xaml create mode 100644 RevitLookup.UI/Styles/Controls/VirtualizingWrapPanel.xaml delete mode 100644 RevitLookup.UI/Taskbar/Progress.cs delete mode 100644 RevitLookup.UI/Taskbar/ProgressState.cs create mode 100644 RevitLookup.UI/Taskbar/TaskbarProgress.cs create mode 100644 RevitLookup.UI/Taskbar/TaskbarProgressState.cs create mode 100644 RevitLookup.UI/TitleBar/SnapLayout.cs create mode 100644 RevitLookup.UI/TitleBar/SnapLayoutButton.cs create mode 100644 RevitLookup.UI/TitleBar/TitleBarButton.cs create mode 100644 RevitLookup.UI/Tray/Hicon.cs create mode 100644 RevitLookup.UI/Tray/INotifyIcon.cs create mode 100644 RevitLookup.UI/Tray/NotifyIconEvent.cs create mode 100644 RevitLookup.UI/Tray/TrayData.cs create mode 100644 RevitLookup.UI/Tray/TrayHandler.cs create mode 100644 RevitLookup.UI/Tray/TrayManager.cs create mode 100644 RevitLookup.UI/ValidationRules/BrushToColorValidationRule.cs create mode 100644 RevitLookup.UI/ValidationRules/FallbackValidationRule.cs create mode 100644 RevitLookup.UI/ValidationRules/ValidationRulesCollection.cs delete mode 100644 RevitLookup.UI/Win32/EntryIndex.cs delete mode 100644 RevitLookup.UI/Win32/ErrorCodes.cs delete mode 100644 RevitLookup.UI/Win32/ExpressionMode.cs delete mode 100644 RevitLookup.UI/Win32/ExternDll.cs delete mode 100644 RevitLookup.UI/Win32/NamedObject.cs delete mode 100644 RevitLookup.UI/Win32/SafeNativeMethods.cs delete mode 100644 RevitLookup.UI/Win32/SystemResources.cs delete mode 100644 RevitLookup.UI/Win32/UnsafeNativeMethods.cs delete mode 100644 RevitLookup.UI/Win32/UxThemeWrapper.cs rename RevitLookup.UI/{Common => Win32}/WindowsRelease.cs (61%) delete mode 100644 RevitLookup.UI/WpfGfx/ApiBase.cs delete mode 100644 RevitLookup/Properties/Resources.Designer.cs delete mode 100644 RevitLookup/Properties/Resources.resx delete mode 100644 RevitLookup/Properties/launchSettings.json delete mode 100644 RevitLookup/Resources/Images/CopyIcon.ico delete mode 100644 RevitLookup/Resources/Images/PreviewIcon.ico delete mode 100644 RevitLookup/Resources/Images/PrintIcon.ico diff --git a/.run/Revit 2022 ENU.run.xml b/.run/Revit 2022 ENU.run.xml deleted file mode 100644 index 623d570c7..000000000 --- a/.run/Revit 2022 ENU.run.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - \ No newline at end of file diff --git a/.run/Revit 2023 ENU.run.xml b/.run/Revit 2023 ENU.run.xml deleted file mode 100644 index f74f84665..000000000 --- a/.run/Revit 2023 ENU.run.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - \ No newline at end of file diff --git a/License - Fira Code.txt b/License - Fira Code.txt new file mode 100644 index 000000000..805e0b38b --- /dev/null +++ b/License - Fira Code.txt @@ -0,0 +1,93 @@ +Copyright (c) 2014, The Fira Code Project Authors (https://github.com/tonsky/FiraCode) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/License - Fluent System Icons.txt b/License - Fluent System Icons.txt new file mode 100644 index 000000000..bc9c36b28 --- /dev/null +++ b/License - Fluent System Icons.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/License - Segoe Fluent Icons.txt b/License - Segoe Fluent Icons.txt new file mode 100644 index 000000000..7574d8fd8 --- /dev/null +++ b/License - Segoe Fluent Icons.txt @@ -0,0 +1 @@ +You may use the Segoe and icon fonts, or glyphs included in this file (“Software”) solely to design, develop and test your programs that run on a Microsoft Platform, a Microsoft Platform includes but is not limited to any hardware or software product or service branded by trademark, trade dress, copyright or some other recognized means, as a product or service of Microsoft. This license does not grant you the right to distribute or sublicense all or part of the Software to any third party. By using the Software, you agree to these terms. If you do not agree to these terms, do not use the Software. \ No newline at end of file diff --git a/License - VirtualizingWrapPanel.txt b/License - VirtualizingWrapPanel.txt new file mode 100644 index 000000000..579553834 --- /dev/null +++ b/License - VirtualizingWrapPanel.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 S. Bäumlisberger + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/License - wpfui.txt b/License - wpfui.txt new file mode 100644 index 000000000..e4d5c8d2e --- /dev/null +++ b/License - wpfui.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-2022 Leszek Pomianowski and WPF UI Contributors. https://dev.lepo.co/ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/RevitLookup.UI.Tests/App.xaml b/RevitLookup.UI.Tests/App.xaml index 9263989f9..33248e7c5 100644 --- a/RevitLookup.UI.Tests/App.xaml +++ b/RevitLookup.UI.Tests/App.xaml @@ -2,5 +2,6 @@ x:Class="RevitLookup.UI.Tests.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - StartupUri="Views/RevitLookupView.xaml"> + Exit="OnExit" + Startup="OnStartup"> \ No newline at end of file diff --git a/RevitLookup.UI.Tests/App.xaml.cs b/RevitLookup.UI.Tests/App.xaml.cs index 859108af0..6d0e03e5d 100644 --- a/RevitLookup.UI.Tests/App.xaml.cs +++ b/RevitLookup.UI.Tests/App.xaml.cs @@ -1,25 +1,76 @@ -// Copyright 2003-2022 by Autodesk, Inc. -// -// Permission to use, copy, modify, and distribute this software in -// object code form for any purpose and without fee is hereby granted, -// provided that the above copyright notice appears in all copies and -// that both that copyright notice and the limited warranty and -// restricted rights notice below appear in all supporting -// documentation. -// -// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. -// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF -// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. -// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE -// UNINTERRUPTED OR ERROR FREE. -// -// Use, duplication, or disclosure by the U.S. Government is subject to -// restrictions set forth in FAR 52.227-19 (Commercial Computer -// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) -// (Rights in Technical Data and Computer Software), as applicable. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using RevitLookup.UI.Mvvm.Contracts; +using RevitLookup.UI.Mvvm.Services; +using RevitLookup.UI.Tests.Services; +using RevitLookup.UI.Tests.ViewModels; +using RevitLookup.UI.Tests.ViewModels.Pages; +using RevitLookup.UI.Tests.Views; +using RevitLookup.UI.Tests.Views.Pages; namespace RevitLookup.UI.Tests; +/// +/// Interaction logic for App.xaml +/// public partial class App { + private static readonly IHost Host = Microsoft.Extensions.Hosting.Host + .CreateDefaultBuilder() + .ConfigureServices((context, services) => + { + services.AddHostedService(); + + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + services.AddScoped(); + + services.AddScoped(); + services.AddScoped(); + + services.AddScoped(); + services.AddScoped(); + + services.AddScoped(); + services.AddScoped(); + + services.AddScoped(); + + }).Build(); + + /// + /// Gets registered service. + /// + /// Type of the service to get. + /// Instance of the service or . + public static T GetService() where T : class + { + return Host.Services.GetService(typeof(T)) as T; + } + + /// + /// Occurs when the application is loading. + /// + private async void OnStartup(object sender, StartupEventArgs e) + { + await Host.StartAsync(); + } + + /// + /// Occurs when the application is closing. + /// + private async void OnExit(object sender, ExitEventArgs e) + { + await Host.StopAsync(); + Host.Dispose(); + } } \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Services/ApplicationHostService.cs b/RevitLookup.UI.Tests/Services/ApplicationHostService.cs new file mode 100644 index 000000000..43ee09e93 --- /dev/null +++ b/RevitLookup.UI.Tests/Services/ApplicationHostService.cs @@ -0,0 +1,65 @@ +using Microsoft.Extensions.Hosting; +using RevitLookup.UI.Mvvm.Contracts; +using RevitLookup.UI.Tests.Views; + +namespace RevitLookup.UI.Tests.Services; + +/// +/// Managed host of the application. +/// +public class ApplicationHostService : IHostedService +{ + private readonly IServiceProvider _serviceProvider; + private readonly INavigationService _navigationService; + private readonly IPageService _pageService; + + private INavigationWindow _navigationWindow; + + public ApplicationHostService(IServiceProvider serviceProvider, INavigationService navigationService, IPageService pageService) + { + _serviceProvider = serviceProvider; + _navigationService = navigationService; + _pageService = pageService; + } + + /// + /// Triggered when the application host is ready to start the service. + /// + /// Indicates that the start process has been aborted. + public async Task StartAsync(CancellationToken cancellationToken) + { + await HandleActivationAsync(); + } + + /// + /// Triggered when the application host is performing a graceful shutdown. + /// + /// Indicates that the shutdown process should no longer be graceful. + public async Task StopAsync(CancellationToken cancellationToken) + { + await Task.CompletedTask; + } + + /// + /// Creates main window during activation. + /// + private async Task HandleActivationAsync() + { + await Task.CompletedTask; + + _navigationService.SetPageService(_pageService); + if (!System.Windows.Application.Current.Windows.OfType().Any()) + { + _navigationWindow = _serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow; + _navigationWindow!.ShowWindow(); + + // NOTICE: You can set this service directly in the window + // _navigationWindow.SetPageService(_pageService); + + // NOTICE: In the case of this window, we navigate to the Dashboard after loading with Container.InitializeUi() + // _navigationWindow.Navigate(typeof(Views.Pages.Dashboard)); + } + + await Task.CompletedTask; + } +} diff --git a/RevitLookup.UI.Tests/Services/PageService.cs b/RevitLookup.UI.Tests/Services/PageService.cs new file mode 100644 index 000000000..25ddd3e22 --- /dev/null +++ b/RevitLookup.UI.Tests/Services/PageService.cs @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +#nullable enable + +using System.Windows; +using RevitLookup.UI.Mvvm.Contracts; + +namespace RevitLookup.UI.Tests.Services; + +/// +/// Service that provides pages for navigation. +/// +public class PageService : IPageService +{ + /// + /// Service which provides the instances of pages. + /// + private readonly IServiceProvider _serviceProvider; + + /// + /// Creates new instance and attaches the . + /// + public PageService(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + public T? GetPage() where T : class + { + if (!typeof(FrameworkElement).IsAssignableFrom(typeof(T))) + throw new InvalidOperationException("The page should be a WPF control."); + + return (T?)_serviceProvider.GetService(typeof(T)); + } + + /// + public FrameworkElement? GetPage(Type pageType) + { + if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) + throw new InvalidOperationException("The page should be a WPF control."); + + return _serviceProvider.GetService(pageType) as FrameworkElement; + } +} diff --git a/RevitLookup.UI.Tests/ViewModels/Converters/ValueConterters.cs b/RevitLookup.UI.Tests/ViewModels/Converters/ValueConterters.cs index 19f923b98..1bbda1f34 100644 --- a/RevitLookup.UI.Tests/ViewModels/Converters/ValueConterters.cs +++ b/RevitLookup.UI.Tests/ViewModels/Converters/ValueConterters.cs @@ -35,7 +35,7 @@ public object Convert(object value, Type targetType, object parameter, CultureIn return backgroundType switch { BackgroundType.Unknown => "Invalid", - BackgroundType.Disabled => "Disabled", + BackgroundType.None => "Disabled", BackgroundType.Auto => "Windows default", BackgroundType.Mica => "Mica", BackgroundType.Acrylic => "Acrylic", diff --git a/RevitLookup.UI.Tests/ViewModels/Pages/AboutViewModel.cs b/RevitLookup.UI.Tests/ViewModels/Pages/AboutViewModel.cs index 3995dc31e..052dde924 100644 --- a/RevitLookup.UI.Tests/ViewModels/Pages/AboutViewModel.cs +++ b/RevitLookup.UI.Tests/ViewModels/Pages/AboutViewModel.cs @@ -18,12 +18,11 @@ // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. -using System.ComponentModel; using System.Diagnostics; using System.Net.Http; using System.Net.NetworkInformation; -using System.Runtime.CompilerServices; -using JetBrains.Annotations; +using System.Runtime.Versioning; +using CommunityToolkit.Mvvm.ComponentModel; using Newtonsoft.Json; using RevitLookup.UI.Common; using RevitLookup.UI.Tests.ViewModels.Enums; @@ -31,7 +30,7 @@ namespace RevitLookup.UI.Tests.ViewModels.Pages; -public sealed class AboutViewModel : INotifyPropertyChanged +public sealed class AboutViewModel : ObservableObject { private string _errorMessage; private bool _isCheckedUpdates; @@ -41,12 +40,13 @@ public sealed class AboutViewModel : INotifyPropertyChanged private UpdatingState _state; private string _version; private bool _isDownloading; + private string _frameworkVersion; public AboutViewModel() { var assembly = System.Reflection.Assembly.GetExecutingAssembly(); - var info = FileVersionInfo.GetVersionInfo(assembly.Location); - Version = info.ProductVersion; + Version = FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion; + FrameworkVersion = new FrameworkName(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName).Version.ToString(); } public UpdatingState State @@ -70,6 +70,17 @@ public string Version OnPropertyChanged(); } } + + public string FrameworkVersion + { + get => _frameworkVersion; + set + { + if (value == _frameworkVersion) return; + _frameworkVersion = value; + OnPropertyChanged(); + } + } public string LatestCheckDate { @@ -145,8 +156,6 @@ public bool IsDownloading public RelayCommand CheckUpdatesCommand => new(CheckUpdates); public RelayCommand DownloadCommand => new(DownloadUpdate); - public event PropertyChangedEventHandler PropertyChanged; - private async void CheckUpdates() { try @@ -212,10 +221,4 @@ private async void DownloadUpdate() IsDownloading = false; } } - - [NotifyPropertyChangedInvocator] - private void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } } \ No newline at end of file diff --git a/RevitLookup.UI.Tests/ViewModels/Pages/DashboardViewModel.cs b/RevitLookup.UI.Tests/ViewModels/Pages/DashboardViewModel.cs index 456196955..ee49e1603 100644 --- a/RevitLookup.UI.Tests/ViewModels/Pages/DashboardViewModel.cs +++ b/RevitLookup.UI.Tests/ViewModels/Pages/DashboardViewModel.cs @@ -18,33 +18,17 @@ // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. -using System.ComponentModel; -using System.Runtime.CompilerServices; -using JetBrains.Annotations; +using CommunityToolkit.Mvvm.ComponentModel; using RevitLookup.UI.Common; namespace RevitLookup.UI.Tests.ViewModels.Pages; -public sealed class DashboardViewModel : INotifyPropertyChanged +public sealed class DashboardViewModel : ObservableObject { - private readonly RevitLookupViewModel _lookupViewModel; private RelayCommand _snoopSelectionCommand; - public DashboardViewModel(RevitLookupViewModel lookupViewModel) - { - _lookupViewModel = lookupViewModel; - } - public RelayCommand SnoopSelectionCommand => _snoopSelectionCommand ??= new RelayCommand(o => { - _lookupViewModel.CurrentPageIndex = 1; + }); - - public event PropertyChangedEventHandler PropertyChanged; - - [NotifyPropertyChangedInvocator] - private void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } } \ No newline at end of file diff --git a/RevitLookup.UI.Tests/ViewModels/Pages/SettingsViewModel.cs b/RevitLookup.UI.Tests/ViewModels/Pages/SettingsViewModel.cs index 5f096a4d1..d1c147e21 100644 --- a/RevitLookup.UI.Tests/ViewModels/Pages/SettingsViewModel.cs +++ b/RevitLookup.UI.Tests/ViewModels/Pages/SettingsViewModel.cs @@ -18,27 +18,21 @@ // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Windows.Interop; -using System.Windows.Media; -using JetBrains.Annotations; +using CommunityToolkit.Mvvm.ComponentModel; using RevitLookup.UI.Appearance; +using RevitLookup.UI.Mvvm.Contracts; namespace RevitLookup.UI.Tests.ViewModels.Pages; -public sealed class SettingsViewModel : INotifyPropertyChanged +public sealed class SettingsViewModel : ObservableObject { - private BackgroundType _currentEffect; + private readonly IThemeService _themeService; private ThemeType _currentTheme; - public SettingsViewModel() + public SettingsViewModel(IThemeService themeService) { - Application.Current.Loaded += (_, _) => - { - CurrentTheme = ThemeType.Dark; - CurrentEffect = BackgroundType.Mica; - }; + _themeService = themeService; + CurrentTheme = themeService.GetTheme(); } public List Themes { get; } = new() @@ -48,15 +42,6 @@ public SettingsViewModel() ThemeType.Light }; - public List Effects { get; } = new() - { - BackgroundType.Disabled, - // BackgroundType.Auto, - // BackgroundType.Acrylic, - BackgroundType.Mica - // BackgroundType.Tabbed - }; - public ThemeType CurrentTheme { get => _currentTheme; @@ -64,83 +49,8 @@ public ThemeType CurrentTheme { if (value == _currentTheme) return; _currentTheme = value; - ApplyTheme(value); - OnPropertyChanged(); - } - } - - public BackgroundType CurrentEffect - { - get => _currentEffect; - set - { - if (value == _currentEffect) return; - _currentEffect = value; - ApplyBackgroundEffect(value); + _themeService.SetTheme(value); OnPropertyChanged(); } } - - public event PropertyChangedEventHandler PropertyChanged; - - private void ApplyTheme(ThemeType theme) - { - switch (theme) - { - case ThemeType.Auto: - if (new WindowInteropHelper(Application.Current).Handle == IntPtr.Zero) - Application.Current.Loaded += (_, _) => - { - Watcher.Watch(Application.Current, CurrentEffect, true, true); - }; - else - Watcher.Watch(Application.Current, CurrentEffect, true, true); - return; - case ThemeType.Dark: - Theme.Apply(ThemeType.Dark); - break; - case ThemeType.Light: - Theme.Apply(ThemeType.Light); - break; - case ThemeType.Unknown: - case ThemeType.HighContrast: - default: - throw new NotSupportedException(); - } - - ApplyBackgroundEffect(CurrentEffect); - } - - private void ApplyBackgroundEffect(BackgroundType effect) - { - var windowHandle = new WindowInteropHelper(Application.Current).Handle; - Background.Remove(windowHandle); - - if (CurrentTheme == ThemeType.Dark) - Background.ApplyDarkMode(windowHandle); - else - Background.RemoveDarkMode(windowHandle); - - switch (effect) - { - case BackgroundType.Unknown: - case BackgroundType.Disabled: - break; - case BackgroundType.Auto: - case BackgroundType.Acrylic: - case BackgroundType.Mica: - case BackgroundType.Tabbed: - Application.Current.Background = Brushes.Transparent; - Background.Apply(windowHandle, effect, true); - break; - default: - throw new NotSupportedException(); - } - } - - [NotifyPropertyChangedInvocator] - private void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } } \ No newline at end of file diff --git a/RevitLookup.UI.Tests/ViewModels/RevitLookupViewModel.cs b/RevitLookup.UI.Tests/ViewModels/RevitLookupViewModel.cs index 86fbe9ec9..c41b8bfb4 100644 --- a/RevitLookup.UI.Tests/ViewModels/RevitLookupViewModel.cs +++ b/RevitLookup.UI.Tests/ViewModels/RevitLookupViewModel.cs @@ -18,32 +18,10 @@ // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. -using System.ComponentModel; -using System.Runtime.CompilerServices; -using JetBrains.Annotations; -using RevitLookup.UI.Tests.ViewModels.Pages; +using CommunityToolkit.Mvvm.ComponentModel; namespace RevitLookup.UI.Tests.ViewModels; -public sealed class RevitLookupViewModel : INotifyPropertyChanged +public sealed class RevitLookupViewModel : ObservableObject { - public RevitLookupViewModel() - { - DashboardViewModel = new DashboardViewModel(this); - SettingsViewModel = new SettingsViewModel(); - AboutViewModel = new AboutViewModel(); - } - - public int CurrentPageIndex { get; set; } - public DashboardViewModel DashboardViewModel { get; } - public SettingsViewModel SettingsViewModel { get; } - public AboutViewModel AboutViewModel { get; } - - public event PropertyChangedEventHandler PropertyChanged; - - [NotifyPropertyChangedInvocator] - private void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } } \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/Pages/AboutView.xaml b/RevitLookup.UI.Tests/Views/Pages/AboutView.xaml index f569b5ada..71dfd8334 100644 --- a/RevitLookup.UI.Tests/Views/Pages/AboutView.xaml +++ b/RevitLookup.UI.Tests/Views/Pages/AboutView.xaml @@ -1,25 +1,24 @@ - - + d:DataContext="{d:DesignInstance pages:AboutView}"> + + Source="pack://application:,,,/RevitLookup.UI;component/Styles/Theme/Dark.xaml" /> - + - + @@ -43,14 +44,13 @@ Margin="0,20,0,0" Text="Version" /> + Command="{Binding ViewModel.CheckUpdatesCommand}" /> + Path="ViewModel.State" /> + Path="ViewModel.IsCheckedUpdates" /> @@ -121,14 +121,14 @@ Margin="10,0,0,0" Foreground="Black" VerticalAlignment="Center" - Text="{Binding NewVersion}"> + Text="{Binding ViewModel.NewVersion}"> + NavigateUri="{Binding ViewModel.ReleaseNotesUrl}" /> + IsEnabled="{Binding ViewModel.IsDownloading, Converter={converters:InverseBooleanConverter}}" + Command="{Binding ViewModel.DownloadCommand}" /> + Visibility="{Binding ViewModel.IsDownloading, Converter={converters:DownloadProgressVisibilityConverter}}" /> + Visibility="{Binding ViewModel.State, Converter={converters:ErrorCardVisibilityConverter}}"> + Text="{Binding ViewModel.ErrorMessage}"> + + + + + + + + + - + - \ No newline at end of file + \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/Pages/AboutView.xaml.cs b/RevitLookup.UI.Tests/Views/Pages/AboutView.xaml.cs index cc017afca..c9bed4135 100644 --- a/RevitLookup.UI.Tests/Views/Pages/AboutView.xaml.cs +++ b/RevitLookup.UI.Tests/Views/Pages/AboutView.xaml.cs @@ -18,15 +18,29 @@ // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. -using RevitLookup.UI.Tests.ViewModels; +using System.Windows; +using RevitLookup.UI.Common.Interfaces; +using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Mvvm.Contracts; +using RevitLookup.UI.Tests.ViewModels.Pages; namespace RevitLookup.UI.Tests.Views.Pages; -public partial class AboutView +public partial class AboutView : INavigableView { - public AboutView(RevitLookupViewModel lookupViewModel) + private readonly IDialogControl _dialogControl; + + public AboutView(AboutViewModel viewModel, IDialogService dialogService) { + _dialogControl = dialogService.GetDialogControl(); + ViewModel = viewModel; InitializeComponent(); - DataContext = lookupViewModel.AboutViewModel; + } + + public AboutViewModel ViewModel { get; } + + private void ShowOpenSourceSoftware(object sender, RoutedEventArgs e) + { + _dialogControl.Show("Work", "In progress"); } } \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/Pages/DashboardView.xaml b/RevitLookup.UI.Tests/Views/Pages/DashboardView.xaml index 179c7f0c0..d811fc22d 100644 --- a/RevitLookup.UI.Tests/Views/Pages/DashboardView.xaml +++ b/RevitLookup.UI.Tests/Views/Pages/DashboardView.xaml @@ -1,30 +1,29 @@ - - + d:DataContext="{d:DesignInstance pages:DashboardView}"> + + Source="pack://application:,,,/RevitLookup.UI;component/Styles/Theme/Dark.xaml" /> - + + Command="{Binding SnoopSelectionCommand}"> - \ No newline at end of file + \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/Pages/DashboardView.xaml.cs b/RevitLookup.UI.Tests/Views/Pages/DashboardView.xaml.cs index c60047a66..37900fd1d 100644 --- a/RevitLookup.UI.Tests/Views/Pages/DashboardView.xaml.cs +++ b/RevitLookup.UI.Tests/Views/Pages/DashboardView.xaml.cs @@ -18,15 +18,18 @@ // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. -using RevitLookup.UI.Tests.ViewModels; +using RevitLookup.UI.Common.Interfaces; +using RevitLookup.UI.Tests.ViewModels.Pages; namespace RevitLookup.UI.Tests.Views.Pages; -public partial class DashboardView +public partial class DashboardView : INavigableView { - public DashboardView(RevitLookupViewModel lookupViewModel) + public DashboardView(DashboardViewModel viewModel) { + ViewModel = viewModel; InitializeComponent(); - DataContext = lookupViewModel.DashboardViewModel; } + + public DashboardViewModel ViewModel { get; } } \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/Pages/SettingsView.xaml b/RevitLookup.UI.Tests/Views/Pages/SettingsView.xaml index 7a0cda357..ff7f9ed6f 100644 --- a/RevitLookup.UI.Tests/Views/Pages/SettingsView.xaml +++ b/RevitLookup.UI.Tests/Views/Pages/SettingsView.xaml @@ -1,36 +1,37 @@ - - - - - - - - - - - - + d:DataContext="{d:DesignInstance pages:SettingsView}"> + + + + + + + + + + SelectedItem="{Binding ViewModel.CurrentTheme}" + ItemsSource="{Binding ViewModel.Themes}"> - - - - - - - - - - - \ No newline at end of file + + \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/Pages/SettingsView.xaml.cs b/RevitLookup.UI.Tests/Views/Pages/SettingsView.xaml.cs index 93712178a..75305f3c6 100644 --- a/RevitLookup.UI.Tests/Views/Pages/SettingsView.xaml.cs +++ b/RevitLookup.UI.Tests/Views/Pages/SettingsView.xaml.cs @@ -18,15 +18,18 @@ // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. -using RevitLookup.UI.Tests.ViewModels; +using RevitLookup.UI.Common.Interfaces; +using RevitLookup.UI.Tests.ViewModels.Pages; namespace RevitLookup.UI.Tests.Views.Pages; -public partial class SettingsView +public partial class SettingsView: INavigableView { - public SettingsView(RevitLookupViewModel lookupViewModel) + public SettingsView(SettingsViewModel viewModel) { + ViewModel = viewModel; InitializeComponent(); - DataContext = lookupViewModel.SettingsViewModel; } + + public SettingsViewModel ViewModel { get; } } \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/Pages/SnoopSummaryView.xaml b/RevitLookup.UI.Tests/Views/Pages/SnoopSummaryView.xaml index 1e4e15b03..ccfe682d0 100644 --- a/RevitLookup.UI.Tests/Views/Pages/SnoopSummaryView.xaml +++ b/RevitLookup.UI.Tests/Views/Pages/SnoopSummaryView.xaml @@ -1,26 +1,25 @@ - - + d:DataContext="{d:DesignInstance pages:SnoopSummaryView, IsDesignTimeCreatable=False}"> + + Source="pack://application:,,,/RevitLookup.UI;component/Styles/Theme/Dark.xaml" /> - + - \ No newline at end of file + \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/Pages/SnoopSummaryView.xaml.cs b/RevitLookup.UI.Tests/Views/Pages/SnoopSummaryView.xaml.cs index 3daf2a38e..c4fbdcff4 100644 --- a/RevitLookup.UI.Tests/Views/Pages/SnoopSummaryView.xaml.cs +++ b/RevitLookup.UI.Tests/Views/Pages/SnoopSummaryView.xaml.cs @@ -18,15 +18,12 @@ // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. -using RevitLookup.UI.Tests.ViewModels; - namespace RevitLookup.UI.Tests.Views.Pages; public partial class SnoopSummaryView { - public SnoopSummaryView(RevitLookupViewModel lookupViewModel) + public SnoopSummaryView() { InitializeComponent(); - DataContext = lookupViewModel.DashboardViewModel; } } \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/RevitLookupView.xaml b/RevitLookup.UI.Tests/Views/RevitLookupView.xaml index 4f9e3f19f..5728294fe 100644 --- a/RevitLookup.UI.Tests/Views/RevitLookupView.xaml +++ b/RevitLookup.UI.Tests/Views/RevitLookupView.xaml @@ -1,27 +1,27 @@ - - + ExtendsContentIntoTitleBar="True" + WindowBackdropType="Mica" + WindowStartupLocation="CenterScreen"> + + Source="pack://application:,,,/RevitLookup.UI;component/Styles/Theme/Dark.xaml" /> - + + Frame="{Binding ElementName=RootFrame}"> + Icon="AppGeneric24"/> @@ -80,19 +79,26 @@ FontSize="14" Navigation="{Binding ElementName=RootNavigation}" /> - + + Margin="42,0,0,0"/> - \ No newline at end of file + \ No newline at end of file diff --git a/RevitLookup.UI.Tests/Views/RevitLookupView.xaml.cs b/RevitLookup.UI.Tests/Views/RevitLookupView.xaml.cs index 2da330cd7..d297f5cfd 100644 --- a/RevitLookup.UI.Tests/Views/RevitLookupView.xaml.cs +++ b/RevitLookup.UI.Tests/Views/RevitLookupView.xaml.cs @@ -18,21 +18,49 @@ // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. -using RevitLookup.UI.Tests.ViewModels; -using RevitLookup.UI.Tests.Views.Pages; +using System.Windows.Controls; +using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Mvvm.Contracts; namespace RevitLookup.UI.Tests.Views; -public partial class RevitLookupView +public partial class RevitLookupView : INavigationWindow { - public RevitLookupView() + public RevitLookupView(IPageService pageService, IDialogService dialogService) { Application.Current = this; InitializeComponent(); - var lookupViewModel = new RevitLookupViewModel(); - DashboardNavigationItem.Page = new DashboardView(lookupViewModel); - SettingsNavigationItem.Page = new SettingsView(lookupViewModel); - AboutNavigationItem.Page = new AboutView(lookupViewModel); - DataContext = lookupViewModel; + SetPageService(pageService); + dialogService.SetDialogControl(RootDialog); + } + + public Frame GetFrame() + { + return RootFrame; + } + + public INavigation GetNavigation() + { + return RootNavigation; + } + + public bool Navigate(Type pageType) + { + return RootNavigation.Navigate(pageType); + } + + public void SetPageService(IPageService pageService) + { + RootNavigation.PageService = pageService; + } + + public void ShowWindow() + { + Show(); + } + + public void CloseWindow() + { + Close(); } } \ No newline at end of file diff --git a/RevitLookup.UI/Animations/TransitionType.cs b/RevitLookup.UI/Animations/TransitionType.cs new file mode 100644 index 000000000..685d0b85f --- /dev/null +++ b/RevitLookup.UI/Animations/TransitionType.cs @@ -0,0 +1,42 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Animations; + +/// +/// Available types of transitions. +/// +public enum TransitionType +{ + /// + /// None. + /// + None, + + /// + /// Change opacity. + /// + FadeIn, + + /// + /// Change opacity and slide from bottom. + /// + FadeInWithSlide, + + /// + /// Slide from bottom. + /// + SlideBottom, + + /// + /// Slide from the right side. + /// + SlideRight, + + /// + /// Slide from the left side. + /// + SlideLeft, +} diff --git a/RevitLookup.UI/Animations/Transitions.cs b/RevitLookup.UI/Animations/Transitions.cs new file mode 100644 index 000000000..941b6e192 --- /dev/null +++ b/RevitLookup.UI/Animations/Transitions.cs @@ -0,0 +1,170 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Animation; +using RevitLookup.UI.Hardware; + +namespace RevitLookup.UI.Animations; + +/// +/// Provides tools for animation. +/// +public static class Transitions +{ + private const double DecelerationRatio = 0.7; + + /// + /// Attempts to apply an animation effect while adding content to the frame. + /// + /// Currently rendered element. + /// Selected transition type. + /// Transition duration. + public static bool ApplyTransition(object element, TransitionType type, int duration) + { + if (type == TransitionType.None) + return false; + + // Disable transitions for non-accelerated devices. + if (!HardwareAcceleration.IsSupported(RenderingTier.PartialAcceleration)) + return false; + + if (element is not FrameworkElement frameworkElement) + return false; + + if (duration < 10) + return false; + + if (duration > 10000) + duration = 10000; + + var timespanDuration = new Duration(TimeSpan.FromMilliseconds(duration)); + + switch (type) + { + case TransitionType.FadeIn: + FadeInTransition(frameworkElement, timespanDuration); + break; + + case TransitionType.FadeInWithSlide: + FadeInWithSlideTransition(frameworkElement, timespanDuration); + break; + + case TransitionType.SlideBottom: + SlideBottomTransition(frameworkElement, timespanDuration); + break; + + case TransitionType.SlideRight: + SlideRightTransition(frameworkElement, timespanDuration); + break; + + case TransitionType.SlideLeft: + SlideLeftTransition(frameworkElement, timespanDuration); + break; + } + + return true; + } + + private static void FadeInTransition(FrameworkElement navigatedElement, Duration duration) + { + var opacityDoubleAnimation = new DoubleAnimation + { + Duration = duration, + DecelerationRatio = DecelerationRatio, + From = 0.0, + To = 1.0, + }; + + navigatedElement.BeginAnimation(UIElement.OpacityProperty, opacityDoubleAnimation); + } + + private static void FadeInWithSlideTransition(FrameworkElement navigatedElement, Duration duration) + { + var translateDoubleAnimation = new DoubleAnimation + { + Duration = duration, + DecelerationRatio = DecelerationRatio, + From = 30, + To = 0, + }; + + if (navigatedElement.RenderTransform is not TranslateTransform) + navigatedElement!.RenderTransform = new TranslateTransform(0, 0); + + if (!navigatedElement.RenderTransformOrigin.Equals(new Point(0.5, 0.5))) + navigatedElement!.RenderTransformOrigin = new Point(0.5, 0.5); + + navigatedElement.RenderTransform.BeginAnimation(TranslateTransform.YProperty, translateDoubleAnimation); + + var opacityDoubleAnimation = new DoubleAnimation + { + Duration = duration, + DecelerationRatio = DecelerationRatio, + From = 0.0, + To = 1.0, + }; + navigatedElement.BeginAnimation(UIElement.OpacityProperty, opacityDoubleAnimation); + } + + private static void SlideBottomTransition(FrameworkElement navigatedElement, Duration duration) + { + var translateDoubleAnimation = new DoubleAnimation + { + Duration = duration, + DecelerationRatio = DecelerationRatio, + From = 30, + To = 0, + }; + + if (navigatedElement.RenderTransform is not TranslateTransform) + navigatedElement!.RenderTransform = new TranslateTransform(0, 0); + + if (!navigatedElement.RenderTransformOrigin.Equals(new Point(0.5, 0.5))) + navigatedElement!.RenderTransformOrigin = new Point(0.5, 0.5); + + navigatedElement.RenderTransform.BeginAnimation(TranslateTransform.YProperty, translateDoubleAnimation); + } + + private static void SlideRightTransition(FrameworkElement navigatedElement, Duration duration) + { + var translateDoubleAnimation = new DoubleAnimation + { + Duration = duration, + DecelerationRatio = DecelerationRatio, + From = 50, + To = 0, + }; + + if (navigatedElement.RenderTransform is not TranslateTransform) + navigatedElement!.RenderTransform = new TranslateTransform(0, 0); + + if (!navigatedElement.RenderTransformOrigin.Equals(new Point(0.5, 0.5))) + navigatedElement!.RenderTransformOrigin = new Point(0.5, 0.5); + + navigatedElement.RenderTransform.BeginAnimation(TranslateTransform.XProperty, translateDoubleAnimation); + } + + private static void SlideLeftTransition(FrameworkElement navigatedElement, Duration duration) + { + var translateDoubleAnimation = new DoubleAnimation + { + Duration = duration, + DecelerationRatio = DecelerationRatio, + From = -50, + To = 0, + }; + + if (navigatedElement.RenderTransform is not TranslateTransform) + navigatedElement!.RenderTransform = new TranslateTransform(0, 0); + + if (!navigatedElement.RenderTransformOrigin.Equals(new Point(0.5, 0.5))) + navigatedElement!.RenderTransformOrigin = new Point(0.5, 0.5); + + navigatedElement.RenderTransform.BeginAnimation(TranslateTransform.XProperty, translateDoubleAnimation); + } +} diff --git a/RevitLookup.UI/Appearance/Accent.cs b/RevitLookup.UI/Appearance/Accent.cs index 2b5320a52..121e1e61e 100644 --- a/RevitLookup.UI/Appearance/Accent.cs +++ b/RevitLookup.UI/Appearance/Accent.cs @@ -3,20 +3,25 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics; +using System.Windows; using System.Windows.Media; -using RevitLookup.UI.Extensions; using RevitLookup.UI.Interop; +using RevitLookup.UI.Extensions; namespace RevitLookup.UI.Appearance; /// -/// Lets you update the color accents of the application. +/// Lets you update the color accents of the application. /// public static class Accent { /// - /// SystemAccentColor. + /// The maximum value of the background HSV brightness after which the text on the accent will be turned dark. + /// + private const double BackgroundBrightnessThresholdValue = 80d; + + /// + /// SystemAccentColor. /// public static Color SystemAccent { @@ -32,18 +37,18 @@ public static Color SystemAccent } /// - /// Brush of the SystemAccentColor. + /// Brush of the SystemAccentColor. /// public static Brush SystemAccentBrush => new SolidColorBrush(SystemAccent); /// - /// SystemAccentColorLight1. + /// SystemAccentColorPrimary. /// public static Color PrimaryAccent { get { - var resource = Application.Current.Resources["SystemAccentColorLight1"]; + var resource = Application.Current.Resources["SystemAccentColorPrimary"]; if (resource is Color color) return color; @@ -53,18 +58,18 @@ public static Color PrimaryAccent } /// - /// Brush of the SystemAccentColorLight1. + /// Brush of the SystemAccentColorPrimary. /// public static Brush PrimaryAccentBrush => new SolidColorBrush(PrimaryAccent); /// - /// SystemAccentColorLight2. + /// SystemAccentColorSecondary. /// public static Color SecondaryAccent { get { - var resource = Application.Current.Resources["SystemAccentColorLight2"]; + var resource = Application.Current.Resources["SystemAccentColorSecondary"]; if (resource is Color color) return color; @@ -74,18 +79,18 @@ public static Color SecondaryAccent } /// - /// Brush of the SystemAccentColorLight2. + /// Brush of the SystemAccentColorSecondary. /// public static Brush SecondaryAccentBrush => new SolidColorBrush(SecondaryAccent); /// - /// SystemAccentColorLight3. + /// SystemAccentColorTertiary. /// public static Color TertiaryAccent { get { - var resource = Application.Current.Resources["SystemAccentColorLight3"]; + var resource = Application.Current.Resources["SystemAccentColorTertiary"]; if (resource is Color color) return color; @@ -95,42 +100,24 @@ public static Color TertiaryAccent } /// - /// Brush of the SystemAccentColorLight3. + /// Brush of the SystemAccentColorTertiary. /// public static Brush TertiaryAccentBrush => new SolidColorBrush(TertiaryAccent); /// - /// Obsolete alternative for . Will be removed in the future. - /// - [Obsolete] - public static void Change(Color systemAccent, ThemeType themeType = ThemeType.Light, - bool systemGlassColor = false) - { - Apply(systemAccent, themeType, systemGlassColor); - } - - /// - /// Obsolete alternative for . Will be removed in the future. - /// - [Obsolete] - public static void Change(Color systemAccent, Color primaryAccent, - Color secondaryAccent, Color tertiaryAccent) - { - Apply(systemAccent, primaryAccent, secondaryAccent, tertiaryAccent); - } - - /// - /// Changes the color accents of the application based on the color entered. + /// Changes the color accents of the application based on the color entered. /// /// Primary accent color. - /// If , the colors will be different. + /// If , the colors will be different. /// If the color is taken from the Glass Color System, its brightness will be increased with the help of the operations on HSV space. public static void Apply(Color systemAccent, ThemeType themeType = ThemeType.Light, bool systemGlassColor = false) { if (systemGlassColor) + { // WindowGlassColor is little darker than accent color systemAccent = systemAccent.UpdateBrightness(6f); + } Color primaryAccent, secondaryAccent, tertiaryAccent; @@ -156,7 +143,7 @@ public static void Apply(Color systemAccent, ThemeType themeType = ThemeType.Lig } /// - /// Changes the color accents of the application based on the entered colors. + /// Changes the color accents of the application based on the entered colors. /// /// Primary color. /// Alternative light or dark color. @@ -169,42 +156,49 @@ public static void Apply(Color systemAccent, Color primaryAccent, } /// - /// Gets current Desktop Window Manager colorization color. - /// It should be the color defined in the system Personalization. + /// Applies system accent color to the application. /// - public static Color GetColorizationColor() + public static void ApplySystemAccent() { - Dwmapi.DwmGetColorizationParameters(out var dmwParams); - - var values = BitConverter.GetBytes(dmwParams.clrColor); + Apply(GetColorizationColor(), Theme.GetAppTheme()); + } - return Color.FromArgb( - 255, - values[2], - values[1], - values[0] - ); + /// + /// Gets current Desktop Window Manager colorization color. + /// It should be the color defined in the system Personalization. + /// + public static Color GetColorizationColor() + { + return UnsafeNativeMethods.GetDwmColor(); } /// - /// Updates application resources. + /// Updates application resources. /// private static void UpdateColorResources(Color systemAccent, Color primaryAccent, Color secondaryAccent, Color tertiaryAccent) { -#if DEBUG - Debug.WriteLine("INFO | SystemAccentColor: " + systemAccent, "RevitLookup.UI.Accent"); - Debug.WriteLine("INFO | SystemAccentColorLight1: " + primaryAccent, "RevitLookup.UI.Accent"); - Debug.WriteLine("INFO | SystemAccentColorLight2: " + secondaryAccent, "RevitLookup.UI.Accent"); - Debug.WriteLine("INFO | SystemAccentColorLight3: " + tertiaryAccent, "RevitLookup.UI.Accent"); -#endif - - // TODO: Inverse TextOnAccentFillColorPrimary if background does not match + if (secondaryAccent.GetBrightness() > BackgroundBrightnessThresholdValue) + { + Application.Current.Resources["TextOnAccentFillColorPrimary"] = Color.FromArgb(0xFF, 0x00, 0x00, 0x00); + Application.Current.Resources["TextOnAccentFillColorSecondary"] = Color.FromArgb(0x80, 0x00, 0x00, 0x00); + Application.Current.Resources["TextOnAccentFillColorDisabled"] = Color.FromArgb(0x77, 0x00, 0x00, 0x00); + Application.Current.Resources["TextOnAccentFillColorSelectedText"] = Color.FromArgb(0x00, 0x00, 0x00, 0x00); + Application.Current.Resources["AccentTextFillColorDisabled"] = Color.FromArgb(0x5D, 0x00, 0x00, 0x00); + } + else + { + Application.Current.Resources["TextOnAccentFillColorPrimary"] = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF); + Application.Current.Resources["TextOnAccentFillColorSecondary"] = Color.FromArgb(0x80, 0xFF, 0xFF, 0xFF); + Application.Current.Resources["TextOnAccentFillColorDisabled"] = Color.FromArgb(0x87, 0xFF, 0xFF, 0xFF); + Application.Current.Resources["TextOnAccentFillColorSelectedText"] = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF); + Application.Current.Resources["AccentTextFillColorDisabled"] = Color.FromArgb(0x5D, 0xFF, 0xFF, 0xFF); + } Application.Current.Resources["SystemAccentColor"] = systemAccent; - Application.Current.Resources["SystemAccentColorLight1"] = primaryAccent; - Application.Current.Resources["SystemAccentColorLight2"] = secondaryAccent; - Application.Current.Resources["SystemAccentColorLight3"] = tertiaryAccent; + Application.Current.Resources["SystemAccentColorPrimary"] = primaryAccent; + Application.Current.Resources["SystemAccentColorSecondary"] = secondaryAccent; + Application.Current.Resources["SystemAccentColorTertiary"] = tertiaryAccent; Application.Current.Resources["SystemAccentBrush"] = secondaryAccent.ToBrush(); Application.Current.Resources["SystemFillColorAttentionBrush"] = secondaryAccent.ToBrush(); @@ -217,4 +211,4 @@ private static void UpdateColorResources(Color systemAccent, Color primaryAccent Application.Current.Resources["AccentFillColorSecondaryBrush"] = secondaryAccent.ToBrush(0.9); Application.Current.Resources["AccentFillColorTertiaryBrush"] = secondaryAccent.ToBrush(0.8); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Appearance/AppearanceData.cs b/RevitLookup.UI/Appearance/AppearanceData.cs index c1aabe81b..be044fb15 100644 --- a/RevitLookup.UI/Appearance/AppearanceData.cs +++ b/RevitLookup.UI/Appearance/AppearanceData.cs @@ -3,35 +3,100 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Interop; + namespace RevitLookup.UI.Appearance; /// -/// Singleton container for appearance data. +/// Static container for appearance data. /// internal static class AppearanceData { /// - /// Namespace for the XAML dictionaries. + /// Collection of handles that have a background effect applied. + /// + public static List ModifiedBackgroundHandles = new(); + + /// + /// Namespace for the XAML dictionaries. + /// + public const string LibraryNamespace = "ui;"; + + /// + /// Main dictionary for WPF UI controls. /// - public const string LibraryNamespace = "revitlookup.ui;"; + public const string LibraryMainDictionary = "RevitLookup.UI"; /// - /// Default for the application theme dictionaries. + /// Default for the application theme dictionaries. /// public const string LibraryThemeDictionariesUri = "pack://application:,,,/RevitLookup.UI;component/Styles/Theme/"; /// - /// Current system theme. + /// Default for the application theme dictionaries. + /// + public const string LibraryDictionariesUri = "pack://application:,,,/RevitLookup.UI;component/Styles/"; + + /// + /// Current system theme. /// public static SystemThemeType SystemTheme = SystemThemeType.Unknown; /// - /// Current application theme. + /// Current application theme. /// public static ThemeType ApplicationTheme = ThemeType.Unknown; /// - /// Collection of handlers that have a background effect applied. + /// Adds given window to list of modified handles. + /// + public static void AddHandle(Window window) + { + AddHandle(new WindowInteropHelper(window).Handle); + } + + /// + /// Adds given handle to list of modified handles. + /// + public static void AddHandle(IntPtr hWnd) + { + if (!ModifiedBackgroundHandles.Contains(hWnd)) + ModifiedBackgroundHandles.Add(hWnd); + } + + /// + /// Removes given window from list of modified handles. + /// + public static void RemoveHandle(Window window) + { + RemoveHandle(new WindowInteropHelper(window).Handle); + } + + /// + /// Removes given handle from list of modified handles. + /// + public static void RemoveHandle(IntPtr hWnd) + { + if (!ModifiedBackgroundHandles.Contains(hWnd)) + ModifiedBackgroundHandles.Remove(hWnd); + } + + /// + /// Returns a value indicating whether the given window had a modified background. + /// + public static bool HasHandle(Window window) + { + return HasHandle(new WindowInteropHelper(window).Handle); + } + + /// + /// Returns a value indicating whether the given handle had a modified background. /// - public static List Handlers = new(); -} \ No newline at end of file + public static bool HasHandle(IntPtr hWnd) + { + return ModifiedBackgroundHandles.Contains(hWnd); + } +} diff --git a/RevitLookup.UI/Appearance/Background.cs b/RevitLookup.UI/Appearance/Background.cs index 2c4d8beb0..dfea570ec 100644 --- a/RevitLookup.UI/Appearance/Background.cs +++ b/RevitLookup.UI/Appearance/Background.cs @@ -3,382 +3,345 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics; -using System.Runtime.InteropServices; +using System; using System.Windows; using System.Windows.Interop; using System.Windows.Media; -using RevitLookup.UI.Common; using RevitLookup.UI.Interop; namespace RevitLookup.UI.Appearance; /// -/// Lets you apply background effects to or hWnd by its . +/// Lets you apply background effects to or hWnd by its . /// public static class Background { /// - /// Checks if the current supports selected . + /// Checks if the current supports selected . /// /// Background type to check. - /// if is supported. + /// if is supported. public static bool IsSupported(BackgroundType type) { - if (!Windows.IsNt()) - return false; - return type switch { - BackgroundType.Auto => Windows.Is(WindowsRelease.Windows11Insider1) // Insider with new API - , - BackgroundType.Tabbed => Windows.Is(WindowsRelease.Windows11Insider1), - BackgroundType.Mica => Windows.Is(WindowsRelease.Windows11), - BackgroundType.Acrylic => Windows.Is(WindowsRelease.Windows7Sp1), + BackgroundType.Auto => Win32.Utilities.IsOSWindows11Insider1OrNewer, // Insider with new API + BackgroundType.Tabbed => Win32.Utilities.IsOSWindows11Insider1OrNewer, + BackgroundType.Mica => Win32.Utilities.IsOSWindows11OrNewer, + BackgroundType.Acrylic => Win32.Utilities.IsOSWindows7OrNewer, + BackgroundType.Unknown => true, + BackgroundType.None => true, _ => false }; } /// - /// Applies selected background effect to when is rendered. + /// Applies selected background effect to when is rendered. + /// + /// Window to apply effect. + /// Background type. + public static bool Apply(Window window, BackgroundType type) + => Apply(window, type, false); + + /// + /// Applies selected background effect to when is rendered. /// /// Window to apply effect. /// Background type. /// Skip the compatibility check. - public static bool Apply(Window window, BackgroundType type, bool force = false) + public static bool Apply(Window window, BackgroundType type, bool force) { - //if (!force && (!IsSupported(type) || !Theme.IsAppMatchesSystem())) - // return false; - if (!force && !IsSupported(type)) return false; - window.Loaded += (sender, args) => + if (window.IsLoaded) { - window.Background = Brushes.Transparent; + var windowHandle = new WindowInteropHelper(window).Handle; - PresentationSource.FromVisual(window)!.ContentRendered += (o, args) => - { - var windowHandle = new WindowInteropHelper(window).Handle; + if (windowHandle == IntPtr.Zero) + return false; + + // Remove currently set background of the window and it's composition area + RemoveContentBackground(window); + + return Apply(windowHandle, type, force); + } + + window.Loaded += (sender, _) => + { + var windowHandle = new WindowInteropHelper(sender as Window).Handle; - if (windowHandle == IntPtr.Zero) - return; + if (windowHandle == IntPtr.Zero) + return; - Apply(windowHandle, type, force); - }; + // Remove currently set background of the window and it's composition area + RemoveContentBackground(sender as Window); + + Apply(windowHandle, type, force); }; return true; } /// - /// Applies selected background effect to hWnd by it's pointer. + /// Applies selected background effect to hWnd by it's pointer. + /// + /// Pointer to the window handle. + /// Background type. + public static bool Apply(IntPtr handle, BackgroundType type) + => Apply(handle, type, false); + + /// + /// Applies selected background effect to hWnd by it's pointer. /// /// Pointer to the window handle. /// Background type. /// Skip the compatibility check. - public static bool Apply(IntPtr handle, BackgroundType type, bool force = false) + public static bool Apply(IntPtr handle, BackgroundType type, bool force) { - //if (!force && (!IsSupported(type) || !Theme.IsAppMatchesSystem())) - // return false; - if (!force && !IsSupported(type)) return false; - if (handle == IntPtr.Zero) + if (!force && !UnsafeNativeMethods.IsCompositionEnabled()) return false; - if (!AppearanceData.Handlers.Contains(handle)) - AppearanceData.Handlers.Add(handle); - - if (Theme.GetAppTheme() == ThemeType.Dark) - ApplyDarkMode(handle); + if (handle == IntPtr.Zero) + return false; - return type switch + if (type == BackgroundType.Unknown || type == BackgroundType.None) { - BackgroundType.Auto => TryApplyAuto(handle), - BackgroundType.Mica => TryApplyMica(handle), - BackgroundType.Acrylic => TryApplyAcrylic(handle), - BackgroundType.Tabbed => TryApplyTabbed(handle), - _ => false - }; - } - - /// - /// Tries to remove background effects if they have been applied to the . - /// - /// The window from which the effect should be removed. - public static void Remove(Window window) - { - var windowHandle = new WindowInteropHelper(window).Handle; - - if (windowHandle == IntPtr.Zero) - return; + Remove(handle); - Remove(windowHandle); - } + return true; + } - /// - /// Tries to remove all effects if they have been applied to the hWnd. - /// - /// Pointer to the window handle. - public static void Remove(IntPtr handle) - { - if (handle == IntPtr.Zero) - return; + //if (!UnsafeNativeMethods.RemoveWindowTitlebar(handle)) + // return false; - var pvAttribute = (int) Dwmapi.PvAttribute.Disable; - var backdropPvAttribute = (int) Dwmapi.DWMSBT.DWMSBT_DISABLE; + if (Theme.GetAppTheme() == ThemeType.Dark) + UnsafeNativeMethods.ApplyWindowDarkMode(handle); + else + UnsafeNativeMethods.RemoveWindowDarkMode(handle); - RemoveDarkMode(handle); - Dwmapi.DwmSetWindowAttribute(handle, Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_MICA_EFFECT, ref pvAttribute, - Marshal.SizeOf(typeof(int))); + // Caption of the window should be removed, does not respect dark theme + UnsafeNativeMethods.RemoveWindowCaption(handle); - Dwmapi.DwmSetWindowAttribute(handle, Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, - ref backdropPvAttribute, - Marshal.SizeOf(typeof(int))); + AppearanceData.AddHandle(handle); - for (var i = 0; i < AppearanceData.Handlers.Count; i++) + // First release of Windows 11 + if (!Win32.Utilities.IsOSWindows11Insider1OrNewer) { - if (AppearanceData.Handlers[i] != handle) - continue; - AppearanceData.Handlers.RemoveAt(i); + if (type == BackgroundType.Mica || type == BackgroundType.Auto) + return UnsafeNativeMethods.ApplyWindowLegacyMicaEffect(handle); + + if (type == BackgroundType.Acrylic) + return UnsafeNativeMethods.ApplyWindowLegacyAcrylicEffect(handle); - break; + return false; } + + // Newer Windows 11 versions + return UnsafeNativeMethods.ApplyWindowBackdrop(handle, type); } /// - /// Tries to inform the operating system that this window uses dark mode. + /// Tries to remove background effects if they have been applied to the . /// - /// Window to apply effect. - public static void ApplyDarkMode(Window window) + /// The window from which the effect should be removed. + public static bool Remove(Window window) { + if (window == null) + return false; + var windowHandle = new WindowInteropHelper(window).Handle; + RestoreContentBackground(window); + if (windowHandle == IntPtr.Zero) - return; + return false; + + UnsafeNativeMethods.RemoveWindowBackdrop(windowHandle); - ApplyDarkMode(windowHandle); + if (AppearanceData.HasHandle(windowHandle)) + AppearanceData.RemoveHandle(windowHandle); + + return true; } /// - /// Tries to inform the operating system that this hWnd uses dark mode. + /// Tries to remove all effects if they have been applied to the hWnd. /// /// Pointer to the window handle. - public static void ApplyDarkMode(IntPtr handle) + public static bool Remove(IntPtr handle) { if (handle == IntPtr.Zero) - return; + return false; + + RestoreContentBackground(handle); - var pvAttribute = (int) Dwmapi.PvAttribute.Enable; - var dwAttribute = Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE; + UnsafeNativeMethods.RemoveWindowBackdrop(handle); - if (Windows.IsBelow(WindowsRelease.Windows10Insider1)) - dwAttribute = Dwmapi.DWMWINDOWATTRIBUTE.DMWA_USE_IMMERSIVE_DARK_MODE_OLD; + if (AppearanceData.HasHandle(handle)) + AppearanceData.RemoveHandle(handle); - Dwmapi.DwmSetWindowAttribute(handle, dwAttribute, - ref pvAttribute, - Marshal.SizeOf(typeof(int))); + return true; } /// - /// Tries to clear the dark theme usage information. + /// Tries to remove background from and it's composition area. /// - /// Window to remove effect. - public static void RemoveDarkMode(Window window) + /// Window to manipulate. + /// if operation was successful. + public static bool RemoveContentBackground(Window window) { - var windowHandle = new WindowInteropHelper(window).Handle; + if (window == null) + return false; - if (windowHandle == IntPtr.Zero) - return; + // Remove background from visual root + window.Background = Brushes.Transparent; - RemoveDarkMode(windowHandle); - } + var windowHandle = new WindowInteropHelper(window).Handle; - /// - /// Tries to clear the dark theme usage information. - /// - /// Pointer to the window handle. - public static void RemoveDarkMode(IntPtr handle) - { - if (handle == IntPtr.Zero) - return; + if (windowHandle == IntPtr.Zero) + return false; - var pvAttribute = (int) Dwmapi.PvAttribute.Disable; - var dwAttribute = Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE; + var windowSource = HwndSource.FromHwnd(windowHandle); - if (Windows.IsBelow(WindowsRelease.Windows10Insider1)) - dwAttribute = Dwmapi.DWMWINDOWATTRIBUTE.DMWA_USE_IMMERSIVE_DARK_MODE_OLD; + // Remove background from client area + if (windowSource?.Handle != IntPtr.Zero && windowSource?.CompositionTarget != null) + windowSource.CompositionTarget.BackgroundColor = Colors.Transparent; - Dwmapi.DwmSetWindowAttribute(handle, dwAttribute, - ref pvAttribute, - Marshal.SizeOf(typeof(int))); + return true; } /// - /// Tries to remove default TitleBar from hWnd. + /// Tries to restore default background for and it's composition target. /// - /// Pointer to the window handle. - /// is problem occurs. - private static bool RemoveTitleBar(IntPtr handle) + /// Window to manipulate. + /// if operation was successful. + public static bool RestoreContentBackground(Window window) { - // Hide default TitleBar - // https://stackoverflow.com/questions/743906/how-to-hide-close-button-in-wpf-window - try - { - User32.SetWindowLong(handle, -16, User32.GetWindowLong(handle, -16) & ~0x80000); - - return true; - } - catch (Exception e) - { -#if DEBUG - Console.WriteLine(e); -#endif + if (window == null) return false; - } - } - private static bool TryApplyAuto(IntPtr handle) - { -#if DEBUG - Debug.WriteLine( - $"INFO | {typeof(Background)} tries to apply {BackgroundType.Auto} effect to: {handle}", - "RevitLookup.UI.Background"); -#endif - if (!RemoveTitleBar(handle)) - return false; + // Global resources + var backgroundBrush = Application.Current.Resources["ApplicationBackgroundBrush"]; - var backdropPvAttribute = (int) Dwmapi.DWMSBT.DWMSBT_AUTO; + // Local resources + if (backgroundBrush is not SolidColorBrush) + backgroundBrush = window.Resources["ApplicationBackgroundBrush"]; - Dwmapi.DwmSetWindowAttribute(handle, Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, - ref backdropPvAttribute, - Marshal.SizeOf(typeof(int))); + // Manual fallback + if (backgroundBrush is not SolidColorBrush) + backgroundBrush = Theme.GetAppTheme() == ThemeType.Dark + ? new SolidColorBrush(Color.FromArgb(0xFF, 0x20, 0x20, 0x20)) + : new SolidColorBrush(Color.FromArgb(0xFF, 0xFA, 0xFA, 0xFA)); - if (!AppearanceData.Handlers.Contains(handle)) - AppearanceData.Handlers.Add(handle); + window.Background = (SolidColorBrush)backgroundBrush; - return true; - } + var windowHandle = new WindowInteropHelper(window).Handle; - private static bool TryApplyTabbed(IntPtr handle) - { -#if DEBUG - Debug.WriteLine( - $"INFO | {typeof(Background)} tries to apply {BackgroundType.Tabbed} effect to: {handle}", - "RevitLookup.UI.Background"); -#endif - if (!RemoveTitleBar(handle)) + if (windowHandle == IntPtr.Zero) return false; - var backdropPvAttribute = (int) Dwmapi.DWMSBT.DWMSBT_TABBEDWINDOW; + var windowSource = HwndSource.FromHwnd(windowHandle); - Dwmapi.DwmSetWindowAttribute(handle, Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, - ref backdropPvAttribute, - Marshal.SizeOf(typeof(int))); + Remove(windowHandle); - if (!AppearanceData.Handlers.Contains(handle)) - AppearanceData.Handlers.Add(handle); + // Restore client area + if (windowSource?.Handle != IntPtr.Zero && windowSource?.CompositionTarget != null) + windowSource.CompositionTarget.BackgroundColor = SystemColors.WindowColor; return true; } - private static bool TryApplyMica(IntPtr handle) + /// + /// Tries to restore default background for composition target, based on it's handle. + /// + /// Window handle. + /// if operation was successful. + public static bool RestoreContentBackground(IntPtr hWnd) { -#if DEBUG - Debug.WriteLine( - $"INFO | {typeof(Background)} tries to apply {BackgroundType.Mica} effect to: {handle}", - "RevitLookup.UI.Background"); -#endif - int backdropPvAttribute; - - if (Windows.Is(WindowsRelease.Windows11Insider1)) - { - if (!RemoveTitleBar(handle)) - return false; - - backdropPvAttribute = (int) Dwmapi.DWMSBT.DWMSBT_MAINWINDOW; - - Dwmapi.DwmSetWindowAttribute(handle, Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, - ref backdropPvAttribute, - Marshal.SizeOf(typeof(int))); + if (hWnd == IntPtr.Zero) + return false; - if (!AppearanceData.Handlers.Contains(handle)) - AppearanceData.Handlers.Add(handle); + if (!UnsafeNativeMethods.IsValidWindow(hWnd)) + return false; - return true; - } + var windowSource = HwndSource.FromHwnd(hWnd); - if (!RemoveTitleBar(handle)) - return false; + // Restore client area + if (windowSource?.Handle != IntPtr.Zero && windowSource?.CompositionTarget != null) + windowSource.CompositionTarget.BackgroundColor = SystemColors.WindowColor; - backdropPvAttribute = (int) Dwmapi.PvAttribute.Enable; + if (windowSource?.RootVisual is Window window) + { + var backgroundBrush = window.Resources["ApplicationBackgroundBrush"]; - Dwmapi.DwmSetWindowAttribute(handle, Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_MICA_EFFECT, - ref backdropPvAttribute, - Marshal.SizeOf(typeof(int))); + // Manual fallback + if (backgroundBrush is not SolidColorBrush) + backgroundBrush = Theme.GetAppTheme() == ThemeType.Dark + ? new SolidColorBrush(Color.FromArgb(0xFF, 0x20, 0x20, 0x20)) + : new SolidColorBrush(Color.FromArgb(0xFF, 0xFA, 0xFA, 0xFA)); - if (!AppearanceData.Handlers.Contains(handle)) - AppearanceData.Handlers.Add(handle); + window.Background = (SolidColorBrush)backgroundBrush; + } return true; } - private static bool TryApplyAcrylic(IntPtr handle) + internal static void RemoveAll() { -#if DEBUG - Debug.WriteLine( - $"INFO | {typeof(Background)} tries to apply {BackgroundType.Acrylic} effect to: {handle}", - "RevitLookup.UI.Background"); -#endif - if (Windows.Is(WindowsRelease.Windows11Insider1)) - { - if (!RemoveTitleBar(handle)) - return false; - - var backdropPvAttribute = (int) Dwmapi.DWMSBT.DWMSBT_TRANSIENTWINDOW; + var handles = AppearanceData.ModifiedBackgroundHandles; - Dwmapi.DwmSetWindowAttribute(handle, Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, - ref backdropPvAttribute, - Marshal.SizeOf(typeof(int))); + foreach (var singleHandle in handles) + { + if (!UnsafeNativeMethods.IsValidWindow(singleHandle)) + continue; - if (!AppearanceData.Handlers.Contains(handle)) - AppearanceData.Handlers.Add(handle); + Remove(singleHandle); - return true; + AppearanceData.RemoveHandle(singleHandle); } + } + + internal static void UpdateAll(ThemeType themeType, + BackgroundType backdropType = BackgroundType.Unknown) + { + var handles = AppearanceData.ModifiedBackgroundHandles; - if (Windows.Is(WindowsRelease.Windows10V20H1)) + foreach (var singleHandle in handles) { - //TODO: We need to set window transparency to True + if (!UnsafeNativeMethods.IsValidWindow(singleHandle)) + continue; - var accentPolicy = new User32.ACCENT_POLICY - { - AccentState = User32.ACCENT_STATE.ACCENT_ENABLE_ACRYLICBLURBEHIND, - GradientColor = (0 << 24) | (0x990000 & 0xFFFFFF) - }; + if (themeType == ThemeType.Dark) + UnsafeNativeMethods.ApplyWindowDarkMode(singleHandle); + else + UnsafeNativeMethods.RemoveWindowDarkMode(singleHandle); - var accentStructSize = Marshal.SizeOf(accentPolicy); + if (Win32.Utilities.IsOSWindows11Insider1OrNewer) + { + if (!UnsafeNativeMethods.IsWindowHasBackdrop(singleHandle, backdropType)) + UnsafeNativeMethods.ApplyWindowBackdrop(singleHandle, backdropType); - var accentPtr = Marshal.AllocHGlobal(accentStructSize); - Marshal.StructureToPtr(accentPolicy, accentPtr, false); + continue; + } - var data = new User32.WINCOMPATTRDATA + if (backdropType == BackgroundType.Mica) { - Attribute = User32.WINCOMPATTR.WCA_ACCENT_POLICY, - SizeOfData = accentStructSize, - Data = accentPtr - }; + if (!UnsafeNativeMethods.IsWindowHasLegacyMica(singleHandle)) + UnsafeNativeMethods.ApplyWindowLegacyMicaEffect(singleHandle); + } - User32.SetWindowCompositionAttribute(handle, ref data); + // TODO: Legacy acrylic effect - Marshal.FreeHGlobal(accentPtr); - - return true; + //if (backdropType == BackgroundType.Acrylic) + //{ + // if (!UnsafeNativeMethods.IsWindowHasLegacyAcrylic(singleHandle)) + // UnsafeNativeMethods.ApplyWindowLegacyAcrylicEffect(singleHandle); + //} } - - return false; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Appearance/BackgroundType.cs b/RevitLookup.UI/Appearance/BackgroundType.cs index 94313c32d..2e553c9c7 100644 --- a/RevitLookup.UI/Appearance/BackgroundType.cs +++ b/RevitLookup.UI/Appearance/BackgroundType.cs @@ -6,37 +6,37 @@ namespace RevitLookup.UI.Appearance; /// -/// Collection of fluent background types. +/// Collection of fluent background types. /// public enum BackgroundType { /// - /// Unknown background type. + /// Unknown background type. /// Unknown, /// - /// Without effects + /// No backdrop effect. /// - Disabled, + None, /// - /// Sets DWMWA_SYSTEMBACKDROP_TYPE to . + /// Sets DWMWA_SYSTEMBACKDROP_TYPE to . /// Auto, /// - /// Windows 11 Mica effect. + /// Windows 11 Mica effect. /// Mica, /// - /// Windows Acrylic effect. + /// Windows Acrylic effect. /// Acrylic, /// - /// Windows 11 wallpaper blur effect. + /// Windows 11 wallpaper blur effect. /// Tabbed -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Appearance/ResourceDictionaryManager.cs b/RevitLookup.UI/Appearance/ResourceDictionaryManager.cs index ad70e3588..fa5e97550 100644 --- a/RevitLookup.UI/Appearance/ResourceDictionaryManager.cs +++ b/RevitLookup.UI/Appearance/ResourceDictionaryManager.cs @@ -3,41 +3,42 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; using System.Collections.ObjectModel; using System.Windows; namespace RevitLookup.UI.Appearance; /// -/// Allows managing application dictionaries. +/// Allows managing application dictionaries. /// internal class ResourceDictionaryManager { + /// + /// Namespace, e.g. the library the resource is being searched for. + /// + public string SearchNamespace { get; } + public ResourceDictionaryManager(string searchNamespace) { SearchNamespace = searchNamespace; } /// - /// Namespace, e.g. the library the resource is being searched for. - /// - public string SearchNamespace { get; } - - /// - /// Shows whether the application contains the . + /// Shows whether the application contains the . /// /// Any part of the resource name. - /// if it doesn't exist. + /// if it doesn't exist. public bool HasDictionary(string resourceLookup) { return GetDictionary(resourceLookup) != null; } /// - /// Gets the if exists. + /// Gets the if exists. /// /// Any part of the resource name. - /// , if it doesn't exist. + /// , if it doesn't exist. public ResourceDictionary GetDictionary(string resourceLookup) { var applicationDictionaries = GetAllDictionaries(); @@ -77,10 +78,10 @@ public ResourceDictionary GetDictionary(string resourceLookup) } /// - /// Shows whether the application contains the . + /// Shows whether the application contains the . /// /// Any part of the resource name. - /// A valid for the replaced resource. + /// A valid for the replaced resource. /// public bool UpdateDictionary(string resourceLookup, Uri newResourceUri) { @@ -103,24 +104,26 @@ public bool UpdateDictionary(string resourceLookup, Uri newResourceUri) if (sourceUri.Contains(SearchNamespace) && sourceUri.Contains(resourceLookup)) { - applicationDictionaries[i] = new ResourceDictionary {Source = newResourceUri}; + applicationDictionaries[i] = new() { Source = newResourceUri }; return true; } } for (var j = 0; j < applicationDictionaries[i].MergedDictionaries.Count; j++) - if (applicationDictionaries[i].MergedDictionaries[j]?.Source != null) - { - sourceUri = applicationDictionaries[i].MergedDictionaries[j].Source.ToString().ToLower().Trim(); + { + if (applicationDictionaries[i].MergedDictionaries[j]?.Source == null) + continue; + + sourceUri = applicationDictionaries[i].MergedDictionaries[j].Source.ToString().ToLower().Trim(); - if (!sourceUri.Contains(SearchNamespace) || !sourceUri.Contains(resourceLookup)) - continue; + if (!sourceUri.Contains(SearchNamespace) || !sourceUri.Contains(resourceLookup)) + continue; - applicationDictionaries[i].MergedDictionaries[j] = new ResourceDictionary {Source = newResourceUri}; + applicationDictionaries[i].MergedDictionaries[j] = new() { Source = newResourceUri }; - return true; - } + return true; + } } return false; @@ -130,4 +133,4 @@ private Collection GetAllDictionaries() { return Application.Current.Resources.MergedDictionaries; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Appearance/SystemTheme.cs b/RevitLookup.UI/Appearance/SystemTheme.cs index c42deeafc..263f11593 100644 --- a/RevitLookup.UI/Appearance/SystemTheme.cs +++ b/RevitLookup.UI/Appearance/SystemTheme.cs @@ -3,6 +3,7 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; using System.Windows; using System.Windows.Media; using Microsoft.Win32; @@ -12,25 +13,25 @@ namespace RevitLookup.UI.Appearance; internal static class SystemTheme { /// - /// Gets the current main color of the system. + /// Gets the current main color of the system. /// /// public static Color GlassColor => SystemParameters.WindowGlassColor; /// - /// Determines whether the system is currently set to hight contrast mode. + /// Determines whether the system is currently set to hight contrast mode. /// - /// if . + /// if . public static bool HighContrast => SystemParameters.HighContrast; /// - /// Gets currently set system theme based on value. + /// Gets currently set system theme based on value. /// public static SystemThemeType GetTheme() { var currentTheme = Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes", - "CurrentTheme", "aero.theme") as string; + "CurrentTheme", "aero.theme") as string ?? string.Empty; if (string.IsNullOrEmpty(currentTheme)) return SystemThemeType.Unknown; @@ -64,8 +65,8 @@ public static SystemThemeType GetTheme() // return ; custom can be light or dark var rawAppsUseLightTheme = Registry.GetValue( - "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", - "AppsUseLightTheme", 1) ?? 1; + "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", + "AppsUseLightTheme", 1) ?? 1; if (rawAppsUseLightTheme is int and 0) return SystemThemeType.Dark; @@ -76,4 +77,4 @@ public static SystemThemeType GetTheme() return rawSystemUsesLightTheme is int and 0 ? SystemThemeType.Dark : SystemThemeType.Light; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Appearance/SystemThemeType.cs b/RevitLookup.UI/Appearance/SystemThemeType.cs index 4555c7768..8f1a3bb8b 100644 --- a/RevitLookup.UI/Appearance/SystemThemeType.cs +++ b/RevitLookup.UI/Appearance/SystemThemeType.cs @@ -6,47 +6,47 @@ namespace RevitLookup.UI.Appearance; /// -/// Collection of Windows 11 themes. +/// Collection of Windows 11 themes. /// public enum SystemThemeType { /// - /// Unknown Windows theme. + /// Unknown Windows theme. /// Unknown, /// - /// Custom Windows theme. + /// Custom Windows theme. /// Custom, /// - /// Default light theme. + /// Default light theme. /// Light, /// - /// Default dark theme. + /// Default dark theme. /// Dark, /// - /// First custom, kinda purple Windows 11 theme. + /// First custom, kinda purple Windows 11 theme. /// Glow, /// - /// Second custom, kinda red Windows 11 theme. + /// Second custom, kinda red Windows 11 theme. /// CapturedMotion, /// - /// Third custom, kinda washed off cyan Windows 11 theme. + /// Third custom, kinda washed off cyan Windows 11 theme. /// Sunrise, /// - /// Fourth custom, kinda gray Windows 11 theme. + /// Fourth custom, kinda gray Windows 11 theme. /// Flow -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Appearance/Theme.cs b/RevitLookup.UI/Appearance/Theme.cs index c1d9dad08..ea6dc1825 100644 --- a/RevitLookup.UI/Appearance/Theme.cs +++ b/RevitLookup.UI/Appearance/Theme.cs @@ -3,64 +3,49 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics; -using System.Windows.Interop; -using System.Windows.Media; +using System; +using System.Windows; +using RevitLookup.UI.Interop; namespace RevitLookup.UI.Appearance; /// -/// Allows to manage available color themes from the library. +/// Allows to manage available color themes from the library. /// public static class Theme { /// - /// Event triggered when the application's theme is changed. + /// Event triggered when the application's theme is changed. /// public static event ThemeChangedEvent Changed; /// - /// Gets a value that indicates whether the application is currently using the high contrast theme. + /// Gets a value that indicates whether the application is currently using the high contrast theme. /// - /// if application uses high contrast theme. - public static bool IsHighContrast() - { - return AppearanceData.ApplicationTheme == ThemeType.HighContrast; - } - - /// - /// Gets a value that indicates whether the Windows is currently using the high contrast theme. - /// - /// if system uses high contrast theme. - public static bool IsSystemHighContrast() - { - return SystemTheme.HighContrast; - } + /// if application uses high contrast theme. + public static bool IsHighContrast() => AppearanceData.ApplicationTheme == ThemeType.HighContrast; /// - /// Obsolete alternative for . Will be removed in the future. + /// Gets a value that indicates whether the Windows is currently using the high contrast theme. /// - [Obsolete] - public static void Set(ThemeType themeType, BackgroundType backgroundEffect = BackgroundType.Mica, - bool updateAccent = true, bool forceBackground = false) - { - Apply(themeType, backgroundEffect, updateAccent, forceBackground); - } + /// if system uses high contrast theme. + public static bool IsSystemHighContrast() => SystemTheme.HighContrast; /// - /// Changes the current application theme. + /// Changes the current application theme. /// /// Theme to set. /// Whether the custom background effect should be applied. /// Whether the color accents should be changed. - /// If , bypasses the app's theme compatibility check and tries to force the change of a background effect. + /// If , bypasses the app's theme compatibility check and tries to force the change of a background effect. public static void Apply(ThemeType themeType, BackgroundType backgroundEffect = BackgroundType.Mica, bool updateAccent = true, bool forceBackground = false) { if (updateAccent) Accent.Apply( Accent.GetColorizationColor(), - themeType + themeType, + false ); if (themeType == ThemeType.Unknown || themeType == AppearanceData.ApplicationTheme) @@ -85,11 +70,26 @@ public static void Apply(ThemeType themeType, BackgroundType backgroundEffect = ) ); -#if DEBUG - Debug.WriteLine( - $"INFO | {typeof(Theme)} tries to update theme to {themeDictionaryName} ({themeType}): {isUpdated}", - "RevitLookup.UI.Theme"); -#endif + //var wpfUiDictionary = appDictionaries.GetDictionary("wpf.ui"); + + // Force reloading ALL dictionaries + // Works but is terrible + //var isCoreUpdated = appDictionaries.UpdateDictionary( + // "wpf.ui", + // new Uri( + // AppearanceData.LibraryDictionariesUri + "RevitLookup.UI.xaml", + // UriKind.Absolute + // ) + //); + + //var isBrushesUpdated = appDictionaries.UpdateDictionary( + // "assets/brushes", + // new Uri( + // AppearanceData.LibraryDictionariesUri + "Assets/Brushes.xaml", + // UriKind.Absolute + // ) + // ); + if (!isUpdated) return; @@ -101,9 +101,9 @@ public static void Apply(ThemeType themeType, BackgroundType backgroundEffect = } /// - /// Gets currently set application theme. + /// Gets currently set application theme. /// - /// if something goes wrong. + /// if something goes wrong. public static ThemeType GetAppTheme() { if (AppearanceData.ApplicationTheme == ThemeType.Unknown) @@ -113,9 +113,9 @@ public static ThemeType GetAppTheme() } /// - /// Gets currently set system theme. + /// Gets currently set system theme. /// - /// if something goes wrong. + /// if something goes wrong. public static SystemThemeType GetSystemTheme() { if (AppearanceData.SystemTheme == SystemThemeType.Unknown) @@ -125,9 +125,9 @@ public static SystemThemeType GetSystemTheme() } /// - /// Gets a value that indicates whether the application is matching the system theme. + /// Gets a value that indicates whether the application is matching the system theme. /// - /// if the application has the same theme as the system. + /// if the application has the same theme as the system. public static bool IsAppMatchesSystem() { var appTheme = GetAppTheme(); @@ -143,7 +143,7 @@ public static bool IsAppMatchesSystem() } /// - /// Checks if the application and the operating system are currently working in a dark theme. + /// Checks if the application and the operating system are currently working in a dark theme. /// public static bool IsMatchedDark() { @@ -157,7 +157,7 @@ public static bool IsMatchedDark() } /// - /// Checks if the application and the operating system are currently working in a light theme. + /// Checks if the application and the operating system are currently working in a light theme. /// public static bool IsMatchedLight() { @@ -171,7 +171,39 @@ public static bool IsMatchedLight() } /// - /// Tries to guess the currently set application theme. + /// Tries to apply dark theme to . + /// + public static bool ApplyDarkThemeToWindow(Window window) + { + if (window == null) + return false; + + if (window.IsLoaded) + return UnsafeNativeMethods.ApplyWindowDarkMode(window); + + window.Loaded += (sender, _) => UnsafeNativeMethods.ApplyWindowDarkMode(sender as Window); + + return true; + } + + /// + /// Tries to remove dark theme from . + /// + public static bool RemoveDarkThemeFromWindow(Window window) + { + if (window == null) + return false; + + if (window.IsLoaded) + return UnsafeNativeMethods.RemoveWindowDarkMode(window); + + window.Loaded += (sender, _) => UnsafeNativeMethods.RemoveWindowDarkMode(sender as Window); + + return true; + } + + /// + /// Tries to guess the currently set application theme. /// private static void FetchApplicationTheme() { @@ -192,7 +224,7 @@ private static void FetchApplicationTheme() } /// - /// Tries to guess the currently set system theme. + /// Tries to guess the currently set system theme. /// private static void FetchSystemTheme() { @@ -200,37 +232,60 @@ private static void FetchSystemTheme() } /// - /// Forces change to application background. Required if custom background effect was previously applied. + /// Forces change to application background. Required if custom background effect was previously applied. /// private static void UpdateBackground(ThemeType themeType, BackgroundType backgroundEffect = BackgroundType.Unknown, bool forceBackground = false) { - var mainWindow = Application.Current; - if (mainWindow == null) return; + // TODO: All windows + Background.UpdateAll(themeType, backgroundEffect); - var backgroundColor = Application.Current.Resources["ApplicationBackgroundColor"]; - if (backgroundColor is Color color) - mainWindow.Background = new SolidColorBrush(color); + if (!AppearanceData.HasHandle(Application.Current)) + Background.Apply(Application.Current, backgroundEffect, forceBackground); -#if DEBUG - Debug.WriteLine($"INFO | Current background color: {backgroundColor}", "RevitLookup.UI.Theme"); -#endif + // Do we really neeed this? + //if (!Win32.Utilities.IsOSWindows11OrNewer) + //{ + // var mainWindow = Application.Current; - var windowHandle = new WindowInteropHelper(mainWindow).Handle; + // if (mainWindow == null) + // return; - if (windowHandle == IntPtr.Zero) - return; + // var backgroundColor = Application.Current.Resources["ApplicationBackgroundColor"]; + // if (backgroundColor is Color color) + // mainWindow.Background = new SolidColorBrush(color); + //} - Background.Remove(windowHandle); - //if (!IsAppMatchesSystem() || backgroundEffect == BackgroundType.Unknown) - // return; + // var mainWindow = Application.Current; - if (backgroundEffect == BackgroundType.Unknown) - return; + // if (mainWindow == null) + // return; + + // // TODO: Do not refresh window presenter background if already applied + // var backgroundColor = Application.Current.Resources["ApplicationBackgroundColor"]; + // if (backgroundColor is Color color) + // mainWindow.Background = new SolidColorBrush(color); + + //#if DEBUG + // System.Diagnostics.Debug.WriteLine($"INFO | Current background color: {backgroundColor}", "RevitLookup.UI.Theme"); + //#endif + + // var windowHandle = new WindowInteropHelper(mainWindow).Handle; + + // if (windowHandle == IntPtr.Zero) + // return; + + // Background.Remove(windowHandle); + + // //if (!IsAppMatchesSystem() || backgroundEffect == BackgroundType.Unknown) + // // return; + + // if (backgroundEffect == BackgroundType.Unknown) + // return; - // TODO: Improve - if (Background.Apply(windowHandle, backgroundEffect, forceBackground)) - mainWindow.Background = Brushes.Transparent; + // // TODO: Improve + // if (Background.Apply(windowHandle, backgroundEffect, forceBackground)) + // mainWindow.Background = Brushes.Transparent; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Appearance/ThemeChangedEvent.cs b/RevitLookup.UI/Appearance/ThemeChangedEvent.cs index 42da561c6..760b90294 100644 --- a/RevitLookup.UI/Appearance/ThemeChangedEvent.cs +++ b/RevitLookup.UI/Appearance/ThemeChangedEvent.cs @@ -8,8 +8,8 @@ namespace RevitLookup.UI.Appearance; /// -/// Event triggered when application theme is updated. +/// Event triggered when application theme is updated. /// -/// Current application . -/// Current base system accent . -public delegate void ThemeChangedEvent(ThemeType currentTheme, Color systemAccent); \ No newline at end of file +/// Current application . +/// Current base system accent . +public delegate void ThemeChangedEvent(ThemeType currentTheme, Color systemAccent); diff --git a/RevitLookup.UI/Appearance/ThemeType.cs b/RevitLookup.UI/Appearance/ThemeType.cs index a6d4f90b4..dd0cba840 100644 --- a/RevitLookup.UI/Appearance/ThemeType.cs +++ b/RevitLookup.UI/Appearance/ThemeType.cs @@ -6,12 +6,12 @@ namespace RevitLookup.UI.Appearance; /// -/// Collection of application themes. +/// Collection of application themes. /// public enum ThemeType { /// - /// Unknown application theme. + /// Unknown application theme. /// Unknown, @@ -21,17 +21,17 @@ public enum ThemeType Auto, /// - /// Dark application theme. + /// Dark application theme. /// Dark, /// - /// Light application theme. + /// Light application theme. /// Light, /// - /// High contract application theme. + /// High contract application theme. /// HighContrast -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Appearance/Watcher.cs b/RevitLookup.UI/Appearance/Watcher.cs index a249c3e0c..1aba83905 100644 --- a/RevitLookup.UI/Appearance/Watcher.cs +++ b/RevitLookup.UI/Appearance/Watcher.cs @@ -3,53 +3,34 @@ // Copyright (C) Leszek Pomianowski, Ch0pstix and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics; +using System; using System.Windows; using System.Windows.Interop; -using RevitLookup.UI.Interop; namespace RevitLookup.UI.Appearance; // https://github.com/lepoco/wpfui/issues/55 /// -/// Automatically updates the application background if the system theme or color is changed. -/// settings work globally as a singleton, they cannot be changed for each . +/// Automatically updates the application background if the system theme or color is changed. +/// settings work globally and cannot be changed for each . /// public sealed class Watcher { /// - /// Initializes a new instance of . - /// - /// Window handle - /// Background effect to be applied when changing the theme. - /// If , the accents will be updated when the change is detected. - /// If , bypasses the app's theme compatibility check and tries to force the change of a background effect. - public Watcher(IntPtr hWnd, BackgroundType backgroundEffect, bool updateAccents, bool forceBackground) - { - var hWndSource = HwndSource.FromHwnd(hWnd); - - BackgroundEffect = backgroundEffect; - ForceBackground = forceBackground; - UpdateAccents = updateAccents; - - hWndSource?.AddHook(WndProc); - } - - /// - /// Gets or sets a value that indicates whether the uses custom . + /// Gets or sets a value that indicates whether the uses custom . /// public BackgroundType BackgroundEffect { get; set; } = BackgroundType.Unknown; /// - /// Gets or sets a value that indicates whether the uses . + /// Gets or sets a value that indicates whether the uses . /// - public bool UpdateAccents { get; set; } + public bool UpdateAccents { get; set; } = false; /// - /// Gets or sets a value that indicates whether the forces the background effect to be applied. + /// Gets or sets a value that indicates whether the forces the background effect to be applied. /// - public bool ForceBackground { get; set; } + public bool ForceBackground { get; set; } = false; //public static void Register(Application app, BackgroundType backgroundEffect = BackgroundType.Mica, // bool updateAccents = true) @@ -58,37 +39,77 @@ public Watcher(IntPtr hWnd, BackgroundType backgroundEffect, bool updateAccents, //} /// - /// Creates a new instance of and attaches the instance to the given . + /// Creates a new instance of and attaches the instance to the given . /// - /// The window that will be updated by . + /// The window that will be updated by . /// Background effect to be applied when changing the theme. - /// If , the accents will be updated when the change is detected. - /// If , bypasses the app's theme compatibility check and tries to force the change of a background effect. - public static Watcher Watch(Window window, BackgroundType backgroundEffect = BackgroundType.Mica, + /// If , the accents will be updated when the change is detected. + /// If , bypasses the app's theme compatibility check and tries to force the change of a background effect. + public static void Watch(Window window, BackgroundType backgroundEffect = BackgroundType.Mica, bool updateAccents = true, bool forceBackground = false) { - // Get the handle from the window - IntPtr hwnd = - (hwnd = new WindowInteropHelper(window).Handle) == IntPtr.Zero - ? throw new InvalidOperationException("Could not get window handle.") - : hwnd; + if (window == null) + return; + + if (window.IsLoaded) + { + // Get the handle from the window + IntPtr hwnd = + (hwnd = new WindowInteropHelper(window).Handle) == IntPtr.Zero + ? throw new InvalidOperationException("Could not get window handle.") + : hwnd; + + // Initialize a new instance with the window handle + var watcher = new Watcher(hwnd, backgroundEffect, updateAccents, forceBackground); + + // Updates themes on initialization if the current system theme is different from the app's. + var currentSystemTheme = SystemTheme.GetTheme(); + watcher.UpdateThemes(currentSystemTheme); + + return; + } + + window.Loaded += (sender, args) => + { + // Get the handle from the window + IntPtr hwnd = + (hwnd = new WindowInteropHelper(window).Handle) == IntPtr.Zero + ? throw new InvalidOperationException("Could not get window handle.") + : hwnd; + + // Initialize a new instance with the window handle + var watcher = new Watcher(hwnd, backgroundEffect, updateAccents, forceBackground); + + // Updates themes on initialization if the current system theme is different from the app's. + var currentSystemTheme = SystemTheme.GetTheme(); + watcher.UpdateThemes(currentSystemTheme); + }; + } - // Initialize a new instance with the window handle - Watcher watcher = new(hwnd, backgroundEffect, updateAccents, forceBackground); + /// + /// Initializes a new instance of . + /// + /// Window handle + /// Background effect to be applied when changing the theme. + /// If , the accents will be updated when the change is detected. + /// If , bypasses the app's theme compatibility check and tries to force the change of a background effect. + public Watcher(IntPtr hWnd, BackgroundType backgroundEffect, bool updateAccents, bool forceBackground) + { + var hWndSource = HwndSource.FromHwnd(hWnd); - // Updates themes on initialization if the current system theme is different from the app's. - var currentSystemTheme = SystemTheme.GetTheme(); - watcher.UpdateThemes(currentSystemTheme); + BackgroundEffect = backgroundEffect; + ForceBackground = forceBackground; + UpdateAccents = updateAccents; - return watcher; + hWndSource?.AddHook(WndProc); } /// - /// Listens to system messages on the application windows. + /// Listens to system messages on the application windows. /// private IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { - if (msg != (int) User32.WM.WININICHANGE) + if (msg != (int)Interop.User32.WM.WININICHANGE) return IntPtr.Zero; var currentSystemTheme = SystemTheme.GetTheme(); @@ -107,14 +128,5 @@ private void UpdateThemes(SystemThemeType systemTheme) themeToSet = ThemeType.Dark; Theme.Apply(themeToSet, BackgroundEffect, UpdateAccents, ForceBackground); - -#if DEBUG - Debug.WriteLine($"INFO | {typeof(Watcher)} changed the app theme.", "RevitLookup.UI.Watcher"); - Debug.WriteLine($"INFO | Current accent: {Accent.SystemAccent}", "RevitLookup.UI.Watcher"); - Debug.WriteLine($"INFO | Current app theme: {AppearanceData.ApplicationTheme}", - "RevitLookup.UI.Watcher"); - Debug.WriteLine($"INFO | Current system theme: {AppearanceData.SystemTheme}", - "RevitLookup.UI.Watcher"); -#endif } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Appearance/WindowCornerPreference.cs b/RevitLookup.UI/Appearance/WindowCornerPreference.cs new file mode 100644 index 000000000..ee275f5f2 --- /dev/null +++ b/RevitLookup.UI/Appearance/WindowCornerPreference.cs @@ -0,0 +1,32 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Appearance; + +/// +/// Ways you can round windows. +/// +public enum WindowCornerPreference +{ + /// + /// Determined by system or application preference. + /// + Default, + + /// + /// Do not round the corners. + /// + DoNotRound, + + /// + /// Round the corners. + /// + Round, + + /// + /// Round the corners slightly. + /// + RoundSmall +} diff --git a/RevitLookup.UI/Application.cs b/RevitLookup.UI/Application.cs index 4a848a515..1e14fb0bf 100644 --- a/RevitLookup.UI/Application.cs +++ b/RevitLookup.UI/Application.cs @@ -25,4 +25,4 @@ namespace RevitLookup.UI; public static class Application { public static Window Current { get; set; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Assembly.cs b/RevitLookup.UI/Assembly.cs index 568d275d1..62b1fc562 100644 --- a/RevitLookup.UI/Assembly.cs +++ b/RevitLookup.UI/Assembly.cs @@ -1,19 +1,12 @@ -using System.Windows.Markup; +using System.Runtime.InteropServices; +using System.Windows.Markup; -[assembly: XmlnsDefinition("http://revitlookup.com/controls", "RevitLookup.UI.Controls")] -[assembly: XmlnsPrefix("http://revitlookup.com/controls", "rl")] - -namespace RevitLookup.UI; - -public static class Assembly -{ - /// - /// Empty method to help Revit find a library - /// - /// - /// By default, Revit does not load the library because it is not referenced from code - /// - public static void AttachToRevit() - { - } -} \ No newline at end of file +[assembly: ComVisible(false)] +[assembly: XmlnsPrefix("http://revitlookup.com/xaml", "rl")] +[assembly: XmlnsDefinition("http://revitlookup.com/xaml", "RevitLookup.UI")] +[assembly: XmlnsDefinition("http://revitlookup.com/xaml", "RevitLookup.UI.Controls")] +[assembly: XmlnsDefinition("http://revitlookup.com/xaml", "RevitLookup.UI.Common")] +[assembly: XmlnsDefinition("http://revitlookup.com/xaml", "RevitLookup.UI.Markup")] +[assembly: XmlnsDefinition("http://revitlookup.com/xaml", "RevitLookup.UI.Converters")] +[assembly: XmlnsDefinition("http://revitlookup.com/xaml", "RevitLookup.UI.ValidationRules")] +[assembly: XmlnsDefinition("http://revitlookup.com/xaml", "RevitLookup.UI.Controls.Navigation")] diff --git a/RevitLookup.UI/Common/Clipboard.cs b/RevitLookup.UI/Common/Clipboard.cs index daa7a49f2..babb072ac 100644 --- a/RevitLookup.UI/Common/Clipboard.cs +++ b/RevitLookup.UI/Common/Clipboard.cs @@ -3,22 +3,34 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; +using System.Threading; + namespace RevitLookup.UI.Common; /// -/// Provides methods to place data on and retrieve data from the system clipboard. +/// Provides methods to place data on and retrieve data from the system clipboard. /// public static class Clipboard { /// - /// Set the text data to Clipboard. + /// Set the text data to Clipboard. /// public static void SetText(string text) { - Thread thread = new(() => System.Windows.Clipboard.SetText(text)); + try + { + Thread thread = new(() => System.Windows.Clipboard.SetText(text)); - thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA - thread.Start(); - thread.Join(); + thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA + thread.Start(); + //thread.Join(); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } } -} \ No newline at end of file +} + diff --git a/RevitLookup.UI/Common/Appearance.cs b/RevitLookup.UI/Common/ControlAppearance.cs similarity index 62% rename from RevitLookup.UI/Common/Appearance.cs rename to RevitLookup.UI/Common/ControlAppearance.cs index 9676c7abb..8bd8274b4 100644 --- a/RevitLookup.UI/Common/Appearance.cs +++ b/RevitLookup.UI/Common/ControlAppearance.cs @@ -6,47 +6,52 @@ namespace RevitLookup.UI.Common; /// -/// A collection representing the available color accents of the controls. +/// Types of the available color accents of the controls. /// -public enum Appearance +public enum ControlAppearance { /// - /// Control color according to the current theme accent. + /// Control color according to the current theme accent. /// Primary, /// - /// Control color according to the current theme element. + /// Control color according to the current theme element. /// Secondary, /// - /// Dark color theme. + /// Blue color theme. + /// + Info, + + /// + /// Dark color theme. /// Dark, /// - /// Light color theme. + /// Light color theme. /// Light, /// - /// Red color theme. + /// Red color theme. /// Danger, /// - /// Green color theme. + /// Green color theme. /// Success, /// - /// Orange color theme. + /// Orange color theme. /// Caution, /// - /// Transparent color theme. + /// Transparent color theme. /// Transparent -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Common/DateTimeExtensions.cs b/RevitLookup.UI/Common/DateTimeExtensions.cs deleted file mode 100644 index 0bae49709..000000000 --- a/RevitLookup.UI/Common/DateTimeExtensions.cs +++ /dev/null @@ -1,38 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -namespace RevitLookup.UI.Common; - -/// -/// A collection of several extensions to the class. -/// -public static class DateTimeExtensions -{ - /// - /// Gets the number of seconds that have elapsed since the Unix epoch, excluding leap seconds. The Unix epoch is 00:00:00 UTC on 1 January 1970. - /// - public static long GetTimestamp(this DateTime dateTime) - { - return (long) dateTime.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; - } - - /// - /// Gets the number of milliseconds that have elapsed since the Unix epoch, excluding leap seconds. The Unix epoch is 00:00:00 UTC on 1 January 1970. - /// - public static long GetMillisTimestamp(this DateTime dateTime) - { - // Should be 10^-3 - return (long) dateTime.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds; - } - - /// - /// Gets the number of microseconds that have elapsed since the Unix epoch, excluding leap seconds. The Unix epoch is 00:00:00 UTC on 1 January 1970. - /// - public static long GetMicroTimestamp(this DateTime dateTime) - { - // Should be 10^-6 - return dateTime.Subtract(new DateTime(1970, 1, 1)).Ticks / (TimeSpan.TicksPerMillisecond / 1000); - } -} \ No newline at end of file diff --git a/RevitLookup.UI/Common/Designer.cs b/RevitLookup.UI/Common/DesignerHelper.cs similarity index 60% rename from RevitLookup.UI/Common/Designer.cs rename to RevitLookup.UI/Common/DesignerHelper.cs index a38866b27..5d606ae77 100644 --- a/RevitLookup.UI/Common/Designer.cs +++ b/RevitLookup.UI/Common/DesignerHelper.cs @@ -4,22 +4,21 @@ // All Rights Reserved. using System.ComponentModel; -using System.Diagnostics; using System.Windows; namespace RevitLookup.UI.Common; /// -/// Helper class for Visual Studio designer. +/// Helper class for Visual Studio designer. /// -public static class Designer +public static class DesignerHelper { - private static bool _validated; + private static bool _validated = false; - private static bool _isInDesignMode; + private static bool _isInDesignMode = false; /// - /// Indicates whether the project is currently in design mode. + /// Indicates whether the project is currently in design mode. /// public static bool IsInDesignMode { @@ -29,7 +28,7 @@ public static bool IsInDesignMode return true; if (_validated) - _isInDesignMode = (bool) (DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)) + _isInDesignMode = (bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)) ?.DefaultValue ?? false); _validated = true; @@ -39,7 +38,7 @@ public static bool IsInDesignMode } /// - /// Indicates whether the project is currently debugged. + /// Indicates whether the project is currently debugged. /// - public static bool IsDebugging => Debugger.IsAttached; -} \ No newline at end of file + public static bool IsDebugging => System.Diagnostics.Debugger.IsAttached; +} diff --git a/RevitLookup.UI/Common/Dpi.cs b/RevitLookup.UI/Common/Dpi.cs deleted file mode 100644 index 2092cb932..000000000 --- a/RevitLookup.UI/Common/Dpi.cs +++ /dev/null @@ -1,80 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -using System.Reflection; -using System.Windows; - -namespace RevitLookup.UI.Common; - -/// -/// Provides access to various DPI-related methods. -/// -internal static class Dpi -{ - /// - /// Default DPI value. - /// - private const double DefaultDpi = 96.0d; - - // TODO: Look into utilizing preprocessor symbols for more functionality - // ---- - // There is an opportunity to check against NET46 if we can use - // VisualTreeHelper in this class. We are currently not utilizing - // it because it is not available in .NET Framework 4.6 (available - // starting 4.6.2). For now, there is no need to overcomplicate this - // solution for some infrequent DPI calculations. However, if this - // becomes more central to various implementations, we may want to - // look into fleshing it out a bit further. - // ---- - // Reference: https://docs.microsoft.com/en-us/dotnet/standard/frameworks - - /// - /// Gets the horizontal DPI value from . - /// - /// The horizontal DPI value from . If the property cannot be accessed, the default value 96 is returned. - public static int SystemDpiX() - { - var dpiProperty = typeof(SystemParameters).GetProperty("DpiX", - BindingFlags.NonPublic | BindingFlags.Static); - - if (dpiProperty == null) - return (int) DefaultDpi; - - return (int) dpiProperty.GetValue(null, null)!; - } - - /// - /// Gets the horizontal DPI scale factor based on . - /// - /// The horizontal DPI scale factor. - public static double SystemDpiXScale() - { - return SystemDpiX() / DefaultDpi; - } - - /// - /// Gets the vertical DPI value from . - /// - /// The vertical DPI value from . If the property cannot be accessed, the default value 96 is returned. - public static int SystemDpiY() - { - var dpiProperty = typeof(SystemParameters).GetProperty("Dpi", - BindingFlags.NonPublic | BindingFlags.Static); - - if (dpiProperty == null) - return (int) DefaultDpi; - - return (int) dpiProperty.GetValue(null, null)!; - } - - /// - /// Gets the vertical DPI scale factor based on . - /// - /// The vertical DPI scale factor. - public static double SystemDpiYScale() - { - return SystemDpiY() / DefaultDpi; - } -} \ No newline at end of file diff --git a/RevitLookup.UI/Common/ElementPosition.cs b/RevitLookup.UI/Common/ElementPlacement.cs similarity index 71% rename from RevitLookup.UI/Common/ElementPosition.cs rename to RevitLookup.UI/Common/ElementPlacement.cs index b3218bc15..a99bb35c8 100644 --- a/RevitLookup.UI/Common/ElementPosition.cs +++ b/RevitLookup.UI/Common/ElementPlacement.cs @@ -6,17 +6,17 @@ namespace RevitLookup.UI.Common; /// -/// Decides where to put the element. +/// Decides where to put the element. /// -public enum ElementPosition +public enum ElementPlacement { /// - /// Puts the control element on the left. + /// Puts the control element on the left. /// Left, /// - /// Puts the control element on the right. + /// Puts the control element on the right. /// Right -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Common/EventIdentifier.cs b/RevitLookup.UI/Common/EventIdentifier.cs index a8e3e8dc5..f7a3d9721 100644 --- a/RevitLookup.UI/Common/EventIdentifier.cs +++ b/RevitLookup.UI/Common/EventIdentifier.cs @@ -3,21 +3,24 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; +using RevitLookup.UI.Extensions; + namespace RevitLookup.UI.Common; /// -/// Class used to create identifiers of threads or tasks that can be performed multiple times within one instance. -/// represents roughly the time in Unix microseconds at which it was taken. +/// Class used to create identifiers of threads or tasks that can be performed multiple times within one instance. +/// represents roughly the time in microseconds at which it was taken. /// internal class EventIdentifier { /// - /// Current identifier. + /// Current identifier. /// - public long Current { get; internal set; } + public long Current { get; internal set; } = 0; /// - /// Creates and gets the next identifier. + /// Creates and gets the next identifier. /// public long GetNext() { @@ -27,18 +30,12 @@ public long GetNext() } /// - /// Checks if the identifiers are the same. + /// Checks if the identifiers are the same. /// - public bool IsEqual(long storedId) - { - return Current == storedId; - } + public bool IsEqual(long storedId) => Current == storedId; /// - /// Creates and assigns a random value with an extra time code if possible. + /// Creates and assigns a random value with an extra time code if possible. /// - private void UpdateIdentifier() - { - Current = DateTime.Now.GetMicroTimestamp(); - } -} \ No newline at end of file + private void UpdateIdentifier() => Current = DateTime.Now.GetMicroTimestamp(); +} diff --git a/RevitLookup.UI/Common/Glyph.cs b/RevitLookup.UI/Common/Glyph.cs index 6c25a818c..15b91fd06 100644 --- a/RevitLookup.UI/Common/Glyph.cs +++ b/RevitLookup.UI/Common/Glyph.cs @@ -3,25 +3,27 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; + namespace RevitLookup.UI.Common; /// -/// Set of static methods to operate on and . +/// Set of static methods to operate on and . /// public static class Glyph { /// - /// If the icon is not found in some places, this one will be displayed. + /// If the icon is not found in some places, this one will be displayed. /// public const SymbolRegular DefaultIcon = SymbolRegular.Heart28; /// - /// If the filled icon is not found in some places, this one will be displayed. + /// If the filled icon is not found in some places, this one will be displayed. /// public const SymbolFilled DefaultFilledIcon = SymbolFilled.Heart28; /// - /// Finds icon based on name. + /// Finds icon based on name. /// /// Name of the icon. public static SymbolRegular Parse(string name) @@ -29,11 +31,11 @@ public static SymbolRegular Parse(string name) if (string.IsNullOrEmpty(name)) return DefaultIcon; - return (SymbolRegular) Enum.Parse(typeof(SymbolRegular), name); + return (SymbolRegular)Enum.Parse(typeof(SymbolRegular), name); } /// - /// Finds icon based on name. + /// Finds icon based on name. /// /// Name of the icon. public static SymbolFilled ParseFilled(string name) @@ -41,6 +43,6 @@ public static SymbolFilled ParseFilled(string name) if (string.IsNullOrEmpty(name)) return DefaultFilledIcon; - return (SymbolFilled) Enum.Parse(typeof(SymbolFilled), name); + return (SymbolFilled)Enum.Parse(typeof(SymbolFilled), name); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Common/IRelayCommand.cs b/RevitLookup.UI/Common/IRelayCommand.cs index 53251965a..e34e262b8 100644 --- a/RevitLookup.UI/Common/IRelayCommand.cs +++ b/RevitLookup.UI/Common/IRelayCommand.cs @@ -8,20 +8,20 @@ namespace RevitLookup.UI.Common; /// -/// A command whose sole purpose is to relay its functionality to other objects by invoking delegates. The -/// default return value for the method is . +/// A command whose sole purpose is to relay its functionality to other objects by invoking delegates. The +/// default return value for the method is . /// public interface IRelayCommand : ICommand { /// - /// Gets encapsulated canExecute function. + /// Gets encapsulated canExecute function. /// /// public new bool CanExecute(object parameter); /// - /// Triggers action with provided parameter. + /// Triggers action with provided parameter. /// /// Argument to be passed. public new void Execute(object parameter); -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Common/Interfaces/INavigableView.cs b/RevitLookup.UI/Common/Interfaces/INavigableView.cs new file mode 100644 index 000000000..bff07fd89 --- /dev/null +++ b/RevitLookup.UI/Common/Interfaces/INavigableView.cs @@ -0,0 +1,20 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Common.Interfaces; + +/// +/// A view whose ViewModel is separate from the DataContext and can be navigated by . +/// +public interface INavigableView +{ + /// + /// ViewModel used by the view. + /// Optionally, it may implement and be navigated by . + /// + T ViewModel { get; } +} diff --git a/RevitLookup.UI/Common/RevealMode.cs b/RevitLookup.UI/Common/Interfaces/INavigationAware.cs similarity index 56% rename from RevitLookup.UI/Common/RevealMode.cs rename to RevitLookup.UI/Common/Interfaces/INavigationAware.cs index c868970e8..5e6fe4ce3 100644 --- a/RevitLookup.UI/Common/RevealMode.cs +++ b/RevitLookup.UI/Common/Interfaces/INavigationAware.cs @@ -3,20 +3,20 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -namespace RevitLookup.UI.Common; +namespace RevitLookup.UI.Common.Interfaces; /// -/// Controls the reveal mode of a control element. +/// Notifies class about being navigated. /// -public enum RevealMode +public interface INavigationAware { /// - /// Element should be hidden. + /// Method triggered when the class is navigated. /// - Hidden, + void OnNavigatedTo(); /// - /// Element should be visible. + /// Method triggered when the navigation leaves the current class. /// - Visible -} \ No newline at end of file + void OnNavigatedFrom(); +} diff --git a/RevitLookup.UI/Common/ItemRange.cs b/RevitLookup.UI/Common/ItemRange.cs new file mode 100644 index 000000000..cfd2f905a --- /dev/null +++ b/RevitLookup.UI/Common/ItemRange.cs @@ -0,0 +1,30 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Based on VirtualizingWrapPanel created by S. Bäumlisberger licensed under MIT license. +// https://github.com/sbaeumlisberger/VirtualizingWrapPanel +// Copyright (C) S. Bäumlisberger, Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Common; + +/// +/// Items range. +/// Based on . +/// +public struct ItemRange +{ + public int StartIndex { get; } + public int EndIndex { get; } + + public ItemRange(int startIndex, int endIndex) : this() + { + StartIndex = startIndex; + EndIndex = endIndex; + } + + public bool Contains(int itemIndex) + { + return itemIndex >= StartIndex && itemIndex <= EndIndex; + } +} + diff --git a/RevitLookup.UI/Common/NavigationType.cs b/RevitLookup.UI/Common/NavigationType.cs new file mode 100644 index 000000000..95e2c4d91 --- /dev/null +++ b/RevitLookup.UI/Common/NavigationType.cs @@ -0,0 +1,13 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Common; + +public enum NavigationType +{ + Fluent, + Compact, + Store +} diff --git a/RevitLookup.UI/Common/RelayCommand.cs b/RevitLookup.UI/Common/RelayCommand.cs index 69a93cecc..18464016c 100644 --- a/RevitLookup.UI/Common/RelayCommand.cs +++ b/RevitLookup.UI/Common/RelayCommand.cs @@ -6,24 +6,35 @@ // ICommand implementation example provided by Microsoft. // https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.input.icommand?view=winrt-22000 +using System; using System.Windows.Input; namespace RevitLookup.UI.Common; /// -/// A command whose sole purpose is to relay its functionality to other objects by invoking delegates. The -/// default return value for the method is . -/// -/// -/// +/// A command whose sole purpose is to relay its functionality to other objects by invoking delegates. The +/// default return value for the method is . +/// +/// +/// /// public sealed class RelayCommand : IRelayCommand { - private readonly Func _canExecute; - private readonly Action _execute; + readonly Action _execute; + + readonly Func _canExecute; + + /// + /// Event occuring when encapsulated canExecute method is changed. + /// + public event EventHandler CanExecuteChanged + { + add => CommandManager.RequerySuggested += value; + remove => CommandManager.RequerySuggested -= value; + } /// - /// Creates new instance of . + /// Creates new instance of . /// /// Action to be executed. public RelayCommand(Action execute) : this(execute, null) @@ -32,20 +43,20 @@ public RelayCommand(Action execute) : this(execute, null) } /// - /// Creates new instance of . + /// Creates new instance of . /// - /// Action with parameter to be executed. + /// Action with parameter to be executed. public RelayCommand(Action execute) : this(execute, null) { // Delegated to RelayCommand(Action execute, Func canExecute) } /// - /// Creates new instance of . + /// Creates new instance of . /// /// Action to be executed. /// Encapsulated method determining whether to execute action. - /// Exception occurring when no is defined. + /// Exception occurring when no is defined. public RelayCommand(Action execute, Func canExecute) { if (execute == null) @@ -56,26 +67,17 @@ public RelayCommand(Action execute, Func canExecute) } /// - /// Creates new instance of . + /// Creates new instance of . /// - /// Action with parameter to be executed. + /// Action with parameter to be executed. /// Encapsulated method determining whether to execute action. - /// Exception occurring when no is defined. + /// Exception occurring when no is defined. public RelayCommand(Action execute, Func canExecute) { _execute = execute ?? throw new ArgumentNullException("execute"); _canExecute = canExecute; } - /// - /// Event occuring when encapsulated canExecute method is changed. - /// - public event EventHandler CanExecuteChanged - { - add => CommandManager.RequerySuggested += value; - remove => CommandManager.RequerySuggested -= value; - } - /// public bool CanExecute(object parameter) { @@ -87,4 +89,4 @@ public void Execute(object parameter) { _execute(parameter); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Common/RoutedDialogEvent.cs b/RevitLookup.UI/Common/RoutedDialogEvent.cs index b10b04f68..927e0cad6 100644 --- a/RevitLookup.UI/Common/RoutedDialogEvent.cs +++ b/RevitLookup.UI/Common/RoutedDialogEvent.cs @@ -3,17 +3,17 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Diagnostics.CodeAnalysis; using System.Windows; -using RevitLookup.UI.Controls; namespace RevitLookup.UI.Common; /// -/// Event triggered on via . +/// Event triggered on via . /// -/// Current instance. +/// Current instance. #if NET5_0_OR_GREATER public delegate void RoutedDialogEvent([NotNull] Controls.Dialog sender, RoutedEventArgs e); #else -public delegate void RoutedDialogEvent(Dialog sender, RoutedEventArgs e); -#endif \ No newline at end of file +public delegate void RoutedDialogEvent(Controls.Dialog sender, RoutedEventArgs e); +#endif diff --git a/RevitLookup.UI/Common/RoutedNavigationEvent.cs b/RevitLookup.UI/Common/RoutedNavigationEvent.cs index 2b34f7dcb..324ef353d 100644 --- a/RevitLookup.UI/Common/RoutedNavigationEvent.cs +++ b/RevitLookup.UI/Common/RoutedNavigationEvent.cs @@ -3,16 +3,17 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Diagnostics.CodeAnalysis; using RevitLookup.UI.Controls.Interfaces; namespace RevitLookup.UI.Common; /// -/// Event triggered on successful navigation. +/// Event triggered on successful navigation. /// /// Current navigation instance. #if NET5_0_OR_GREATER public delegate void RoutedNavigationEvent([NotNull] INavigation sender, RoutedNavigationEventArgs e); #else public delegate void RoutedNavigationEvent(INavigation sender, RoutedNavigationEventArgs e); -#endif \ No newline at end of file +#endif diff --git a/RevitLookup.UI/Common/RoutedNavigationEventArgs.cs b/RevitLookup.UI/Common/RoutedNavigationEventArgs.cs index 412bc5a28..487bd0025 100644 --- a/RevitLookup.UI/Common/RoutedNavigationEventArgs.cs +++ b/RevitLookup.UI/Common/RoutedNavigationEventArgs.cs @@ -9,24 +9,24 @@ namespace RevitLookup.UI.Common; /// -/// with additional . +/// with additional . /// public class RoutedNavigationEventArgs : RoutedEventArgs { /// - /// Constructor for . + /// Currently displayed page. + /// + public INavigationItem CurrentPage { get; set; } + + /// + /// Constructor for . /// /// The new value that the SourceProperty is being set to. - /// The new value that the Property is being set to. + /// The new value that the Property is being set to. /// Currently displayed page. public RoutedNavigationEventArgs(RoutedEvent routedEvent, object source, INavigationItem currentPage) : base( routedEvent, source) { CurrentPage = currentPage; } - - /// - /// Currently displayed page. - /// - public INavigationItem CurrentPage { get; set; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Common/RoutedNotifyIconEvent.cs b/RevitLookup.UI/Common/RoutedNotifyIconEvent.cs index 49c55629e..05f6f222f 100644 --- a/RevitLookup.UI/Common/RoutedNotifyIconEvent.cs +++ b/RevitLookup.UI/Common/RoutedNotifyIconEvent.cs @@ -3,17 +3,18 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Diagnostics.CodeAnalysis; using System.Windows; -using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Controls; namespace RevitLookup.UI.Common; /// -/// Event triggered on successful navigation. +/// Event triggered on successful navigation. /// /// Current navigation instance. #if NET5_0_OR_GREATER -public delegate void RoutedNotifyIconEvent([NotNull] INotifyIcon sender, RoutedEventArgs e); +public delegate void RoutedNotifyIconEvent([NotNull] NotifyIcon sender, RoutedEventArgs e); #else -public delegate void RoutedNotifyIconEvent(INotifyIcon sender, RoutedEventArgs e); -#endif \ No newline at end of file +public delegate void RoutedNotifyIconEvent(NotifyIcon sender, RoutedEventArgs e); +#endif diff --git a/RevitLookup.UI/Common/RoutedSnackbarEvent.cs b/RevitLookup.UI/Common/RoutedSnackbarEvent.cs index 8dbf3e0c1..301cff0a6 100644 --- a/RevitLookup.UI/Common/RoutedSnackbarEvent.cs +++ b/RevitLookup.UI/Common/RoutedSnackbarEvent.cs @@ -3,17 +3,17 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Diagnostics.CodeAnalysis; using System.Windows; -using RevitLookup.UI.Controls; namespace RevitLookup.UI.Common; /// -/// Event triggered on via . +/// Event triggered on via . /// -/// Current instance. +/// Current instance. #if NET5_0_OR_GREATER public delegate void RoutedSnackbarEvent([NotNull] Controls.Snackbar sender, RoutedEventArgs e); #else -public delegate void RoutedSnackbarEvent(Snackbar sender, RoutedEventArgs e); -#endif \ No newline at end of file +public delegate void RoutedSnackbarEvent(Controls.Snackbar sender, RoutedEventArgs e); +#endif diff --git a/RevitLookup.UI/Common/ScrollDirection.cs b/RevitLookup.UI/Common/ScrollDirection.cs new file mode 100644 index 000000000..efe4503be --- /dev/null +++ b/RevitLookup.UI/Common/ScrollDirection.cs @@ -0,0 +1,25 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Based on VirtualizingWrapPanel created by S. Bäumlisberger licensed under MIT license. +// https://github.com/sbaeumlisberger/VirtualizingWrapPanel +// Copyright (C) S. Bäumlisberger, Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Common; + +/// +/// Direction of . +/// Based on . +/// +public enum ScrollDirection +{ + /// + /// Vertical scroll direction. + /// + Vertical, + + /// + /// Horizontal scroll direction. + /// + Horizontal +} diff --git a/RevitLookup.UI/Common/SnapLayout.cs b/RevitLookup.UI/Common/SnapLayout.cs deleted file mode 100644 index 5650eed10..000000000 --- a/RevitLookup.UI/Common/SnapLayout.cs +++ /dev/null @@ -1,171 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -using System.Windows; -using System.Windows.Automation.Peers; -using System.Windows.Automation.Provider; -using System.Windows.Controls; -using System.Windows.Interop; -using System.Windows.Media; -using RevitLookup.UI.Interop; - -namespace RevitLookup.UI.Common; - -/// -/// Brings the Snap Layout functionality from Windows 11 to a custom . -/// -internal sealed class SnapLayout -{ - private Button _button; - - private double _dpiScale; - - private SolidColorBrush _hoverColor; - - private bool _isButtonClicked; - - private bool _isButtonFocused; - public SolidColorBrush DefaultButtonBackground { get; set; } = Brushes.Transparent; - - public void Register(Button button) - { - _isButtonFocused = false; - _button = button; - _dpiScale = Dpi.SystemDpiYScale(); - - SetHoverColor(); - - var hwnd = (HwndSource) PresentationSource.FromVisual(button); - - if (hwnd != null) - hwnd.AddHook(HwndSourceHook); - } - - public static bool IsSupported() - { - return Windows.Is(WindowsRelease.Windows11); - } - - /// - /// Represents the method that handles Win32 window messages. - /// - /// The window handle. - /// The message ID. - /// The message's wParam value. - /// The message's lParam value. - /// - /// A value that indicates whether the message was handled. Set the value to if the message was handled; otherwise, - /// . - /// - /// The appropriate return value depends on the particular message. See the message documentation details for the Win32 message being handled. - private IntPtr HwndSourceHook(IntPtr hWnd, int uMsg, IntPtr wParam, IntPtr lParam, ref bool handled) - { - // TODO: This whole class is one big todo - - var mouseNotification = (User32.WM) uMsg; - - switch (mouseNotification) - { - case User32.WM.NCLBUTTONDOWN: - if (IsOverButton(wParam, lParam)) - { - _isButtonClicked = true; - - handled = true; - } - - break; - - case User32.WM.NCMOUSELEAVE: - DefocusButton(); - - break; - - case User32.WM.NCLBUTTONUP: - if (!_isButtonClicked) - break; - - if (IsOverButton(wParam, lParam)) - RaiseButtonClick(); - - _isButtonClicked = false; - handled = true; - - break; - - case User32.WM.NCHITTEST: - if (IsOverButton(wParam, lParam)) - { - FocusButton(); - - handled = true; - } - else - { - DefocusButton(); - } - - return new IntPtr((int) HT.MAXBUTTON); - - default: - handled = false; - break; - } - - return new IntPtr((int) HT.CLIENT); - } - - private void FocusButton() - { - if (_isButtonFocused) - return; - - _button.Background = _hoverColor; - _isButtonFocused = true; - } - - private void DefocusButton() - { - if (!_isButtonFocused) - return; - - _button.Background = DefaultButtonBackground; - _isButtonFocused = false; - } - - private bool IsOverButton(IntPtr wParam, IntPtr lParam) - { - try - { - var positionX = lParam.ToInt32() & 0xffff; - var positionY = lParam.ToInt32() >> 16; - - var rect = new Rect(_button.PointToScreen(new Point()), - new Size(_button.Width * _dpiScale, _button.Height * _dpiScale)); - - if (rect.Contains(new Point(positionX, positionY))) - return true; - } - catch (OverflowException) - { - return true; // or not to true, that is the question - } - - return false; - } - - private void RaiseButtonClick() - { - if (new ButtonAutomationPeer(_button).GetPattern(PatternInterface.Invoke) is IInvokeProvider invokeProv) - invokeProv?.Invoke(); - } - - private void SetHoverColor() - { - var color = Application.Current.Resources["ControlFillColorSecondary"] ?? Color.FromArgb(21, 255, 255, 255); - - _hoverColor = new SolidColorBrush((Color) color); - } -} \ No newline at end of file diff --git a/RevitLookup.UI/Common/SpacingMode.cs b/RevitLookup.UI/Common/SpacingMode.cs new file mode 100644 index 000000000..7edb03ba3 --- /dev/null +++ b/RevitLookup.UI/Common/SpacingMode.cs @@ -0,0 +1,35 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Based on VirtualizingWrapPanel created by S. Bäumlisberger licensed under MIT license. +// https://github.com/sbaeumlisberger/VirtualizingWrapPanel +// Copyright (C) S. Bäumlisberger, Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Common; + +/// +/// Specifies how remaining space is distributed. +/// Based on . +/// +public enum SpacingMode +{ + /// + /// Spacing is disabled and all items will be arranged as closely as possible. + /// + None, + + /// + /// The remaining space is evenly distributed between the items on a layout row, as well as the start and end of each row. + /// + Uniform, + + /// + /// The remaining space is evenly distributed between the items on a layout row, excluding the start and end of each row. + /// + BetweenItemsOnly, + + /// + /// The remaining space is evenly distributed between start and end of each row. + /// + StartAndEndOnly +} diff --git a/RevitLookup.UI/Common/SymbolExtensions.cs b/RevitLookup.UI/Common/SymbolExtensions.cs deleted file mode 100644 index d5091ee34..000000000 --- a/RevitLookup.UI/Common/SymbolExtensions.cs +++ /dev/null @@ -1,73 +0,0 @@ -namespace RevitLookup.UI.Common; - -/// -/// Set of extensions for the enumeration of icons to facilitate their management and replacement. -/// -public static class SymbolExtensions -{ - /// - /// Replaces with . - /// - public static SymbolFilled Swap(this SymbolRegular icon) - { - // TODO: It is possible that the alternative icon does not exist - return Glyph.ParseFilled(icon.ToString()); - } - - /// - /// Replaces with . - /// - public static SymbolRegular Swap(this SymbolFilled icon) - { - // TODO: It is possible that the alternative icon does not exist - return Glyph.Parse(icon.ToString()); - } - - /// - /// Converts to based on the ID. - /// - public static char GetGlyph(this SymbolRegular icon) - { - return ToChar(icon); - } - - /// - /// Converts to based on the ID. - /// - public static char GetGlyph(this SymbolFilled icon) - { - return ToChar(icon); - } - - /// - /// Converts to based on the ID. - /// - public static string GetString(this SymbolRegular icon) - { - return icon.GetGlyph().ToString(); - } - - /// - /// Converts to based on the ID. - /// - public static string GetString(this SymbolFilled icon) - { - return icon.GetGlyph().ToString(); - } - - /// - /// Converts to . - /// - private static char ToChar(SymbolRegular icon) - { - return Convert.ToChar(icon); - } - - /// - /// Converts to . - /// - private static char ToChar(SymbolFilled icon) - { - return Convert.ToChar(icon); - } -} \ No newline at end of file diff --git a/RevitLookup.UI/Common/SymbolFilled.cs b/RevitLookup.UI/Common/SymbolFilled.cs index 9e5511935..9670f9e50 100644 --- a/RevitLookup.UI/Common/SymbolFilled.cs +++ b/RevitLookup.UI/Common/SymbolFilled.cs @@ -6,1975 +6,3909 @@ namespace RevitLookup.UI.Common; /// -/// Represents a list of filled Fluent System Icons v.1.1.163. -/// May be converted to using GetGlyph() or to using GetString() +/// Represents a list of filled Fluent System Icons v.1.1.178. +/// May be converted to using GetGlyph() or to using GetString() /// #pragma warning disable CS1591 public enum SymbolFilled { /// - /// Actually, this icon is not empty, but makes it easier to navigate. + /// Actually, this icon is not empty, but makes it easier to navigate. /// Empty = 0x0, // Automatically generated, may contain bugs. - /// - /// Blank icon - /// - ChatArrowBack20 = 0x0, - - /// - /// Blank icon - /// - ChatArrowDoubleBack16 = 0x1, - - /// - /// Blank icon - /// - ChatArrowDoubleBack20 = 0x2, - - /// - /// Blank icon - /// - Check24 = 0x3, - - /// - /// Blank icon - /// - CheckboxCheckedSync20 = 0x4, - - /// - /// Blank icon - /// - ChevronUpDown16 = 0x5, - - /// - /// Blank icon - /// - CircleSubtractArrowBack20 = 0x6, - - /// - /// Blank icon - /// - CircleSubtractArrowForward20 = 0x7, - - /// - /// Blank icon - /// - CursorClick20 = 0x8, - - /// - /// Blank icon - /// - CursorClick24 = 0x9, - - /// - /// Blank icon - /// - Directions16 = 0xA, - - /// - /// Blank icon - /// - DividerTall20 = 0xB, - - /// - /// Blank icon - /// - DocumentArrowUp20 = 0xC, - - /// - /// Blank icon - /// - DocumentDismiss16 = 0xD, - - /// - /// Blank icon - /// - DocumentLink16 = 0xE, - - /// - /// Blank icon - /// - DocumentPerson20 = 0xF, - - /// - /// Blank icon - /// - EditArrowBack20 = 0x10, - - /// - /// Blank icon - /// - EmojiSad16 = 0x11, - - /// - /// Blank icon - /// - Extension16 = 0x12, - - /// - /// Blank icon - /// - GlobeClock16 = 0x13, - - /// - /// Blank icon - /// - GlobeClock20 = 0x14, - - /// - /// Blank icon - /// - ImmersiveReader16 = 0x15, - - /// - /// Blank icon - /// - IosArrowRight24 = 0x16, - - /// - /// Blank icon - /// - LinkDismiss16 = 0x17, - - /// - /// Blank icon - /// - LockOpen16 = 0x18, - - /// - /// Blank icon - /// - Luggage16 = 0x19, - - /// - /// Blank icon - /// - Luggage20 = 0x1A, - - /// - /// Blank icon - /// - MailArrowDoubleBack20 = 0x1B, - - /// - /// Blank icon - /// - MailArrowDown20 = 0x1C, - - /// - /// Blank icon - /// - MailArrowForward20 = 0x1D, - - /// - /// Blank icon - /// - MailAttach20 = 0x1E, - - /// - /// Blank icon - /// - MailCheckmark20 = 0x1F, - - MailError16 = 0x20, - MailInboxArrowDown20 = 0x21, - MailPause20 = 0x22, - MailSettings20 = 0x23, - MailShield20 = 0x24, - MultiselectRlt20 = 0x25, - NotePin20 = 0x26, - PauseCircle24 = 0x27, - PeopleCheckmark16 = 0x28, - PeopleSync20 = 0x29, - PeopleToolbox20 = 0x2A, - PersonSettings20 = 0x2B, - PhoneCheckmark20 = 0x2C, - Play16 = 0x2D, - Play28 = 0x2E, - Play32 = 0x2F, - ReceiptMoney24 = 0x30, - Save16 = 0x31, - ShieldError16 = 0x32, - SportSoccer16 = 0x33, - Square20 = 0x34, - TagMultiple20 = 0x35, - TextBox16 = 0x36, - TextDirectionRotate270Ltr20 = 0x37, - TextDirectionRotate270Ltr24 = 0x38, - TextQuote16 = 0x39, - VehicleCarProfileLtr20 = 0x3A, - VehicleCarProfileRtl20 = 0x3B, - WeatherPartlyCloudyDay16 = 0x3C, - WeatherSunny16 = 0x3D, - TextDirectionHorizontalLeft20 = 0x3E, - TextDirectionHorizontalLeft24 = 0x3F, - TextDirectionHorizontalRight20 = 0x40, - TextDirectionHorizontalRight24 = 0x41, - TextDirectionRotate270Right20 = 0x42, - TextDirectionRotate270Right24 = 0x43, - TextDirectionRotate90Left20 = 0x44, - TextDirectionRotate90Left24 = 0x45, - TextDirectionRotate90Right20 = 0x46, - TextDirectionRotate90Right24 = 0x47, - ArrowAutofitContent24 = 0x48, - ArrowTrendingLines20 = 0x49, - ArrowTrendingLines24 = 0x4A, - CalendarError24 = 0x4B, - CellularWarning24 = 0x4C, - CloudArrowDown16 = 0x4D, - CloudArrowDown20 = 0x4E, - CloudArrowDown24 = 0x4F, - CloudArrowDown28 = 0x50, - CloudArrowDown32 = 0x51, - CloudArrowDown48 = 0x52, - CloudArrowUp16 = 0x53, - CloudArrowUp20 = 0x54, - CloudArrowUp24 = 0x55, - CloudArrowUp28 = 0x56, - CloudArrowUp32 = 0x57, - CloudArrowUp48 = 0x58, - CloudCheckmark16 = 0x59, - CloudCheckmark20 = 0x5A, - CloudCheckmark24 = 0x5B, - CloudCheckmark28 = 0x5C, - CloudCheckmark32 = 0x5D, - CloudCheckmark48 = 0x5E, - CloudDismiss16 = 0x5F, - CloudDismiss20 = 0x60, - CloudDismiss24 = 0x61, - CloudDismiss28 = 0x62, - CloudDismiss32 = 0x63, - CloudDismiss48 = 0x64, - GridDots20 = 0x65, - GridDots24 = 0x66, - GridDots28 = 0x67, - IosArrowLtr24 = 0x68, - IosArrowRtl24 = 0x69, - MailMultiple16 = 0x6A, - MailMultiple20 = 0x6B, - MailMultiple24 = 0x6C, - PanelBottom20 = 0x6D, - PanelLeft16 = 0x6E, - PanelLeft20 = 0x6F, - PanelLeft24 = 0x70, - PanelLeft28 = 0x71, - PanelLeft48 = 0x72, - PanelRight16 = 0x73, - PanelRight20 = 0x74, - PanelRight24 = 0x75, - PanelRight28 = 0x76, - PanelRight48 = 0x77, - PanelRightContract16 = 0x78, - PanelRightContract20 = 0x79, - PanelRightContract24 = 0x7A, - PanelRightExpand16 = 0x7B, - PanelRightExpand20 = 0x7C, - PanelRightExpand24 = 0x7D, - PuzzlePiece16 = 0x7E, - PuzzlePiece20 = 0x7F, - PuzzlePiece24 = 0x80, - ScanTable24 = 0x81, - ScanText24 = 0x82, - ScanType20 = 0x83, - ScanType24 = 0x84, - ScanTypeOff20 = 0x85, - ShieldTask16 = 0x86, - ShieldTask20 = 0x87, - ShieldTask24 = 0x88, - ShieldTask28 = 0x89, - ShieldTask48 = 0x8A, - SquareMultiple16 = 0x8B, - StackStar16 = 0x8C, - StackStar20 = 0x8D, - StackStar24 = 0x8E, - SubtractCircleArrowBack16 = 0x8F, - SubtractCircleArrowBack20 = 0x90, - SubtractCircleArrowForward16 = 0x91, - SubtractCircleArrowForward20 = 0x92, - TextAddT24 = 0x93, - TextMore24 = 0x94, - TextT20 = 0x95, - TextT24 = 0x96, - UsbPlug20 = 0x97, - UsbPlug24 = 0x98, - WifiLock24 = 0x99, - ArrowBidirectionalUpDown12 = 0x9A, - ArrowBidirectionalUpDown16 = 0x9B, - ArrowBidirectionalUpDown20 = 0x9C, - ArrowBidirectionalUpDown24 = 0x9D, - ArrowCircleDownUp20 = 0x9E, - ArrowCircleLeft12 = 0x9F, - ArrowCircleLeft16 = 0xA0, - ArrowCircleRight12 = 0xA1, - ArrowCircleRight16 = 0xA2, - ArrowEject20 = 0xA3, - ArrowExportRtl16 = 0xA4, - ArrowLeft12 = 0xA5, - ArrowMoveInward20 = 0xA6, - ArrowRedo16 = 0xA7, - ArrowRight12 = 0xA8, - ArrowStepIn12 = 0xA9, - ArrowStepInLeft12 = 0xAA, - ArrowStepInLeft16 = 0xAB, - ArrowStepInRight12 = 0xAC, - ArrowStepInRight16 = 0xAD, - ArrowStepOut12 = 0xAE, - ArrowSyncOff16 = 0xAF, - ArrowSyncOff20 = 0xB0, - ArrowUp12 = 0xB1, - BezierCurveSquare12 = 0xB2, - BorderAll16 = 0xB3, - BorderAll20 = 0xB4, - Braces20 = 0xB5, - BuildingLighthouse20 = 0xB6, - CalendarAssistant16 = 0xB7, - CenterVertical20 = 0xB8, - ChatDismiss16 = 0xB9, - ChatWarning16 = 0xBA, - CheckboxIndeterminate16 = 0xBB, - CheckboxIndeterminate20 = 0xBC, - CheckboxIndeterminate24 = 0xBD, - ChevronCircleRight12 = 0xBE, - CircleOff16 = 0xBF, - ClipboardPulse24 = 0xC0, - ClockArrowDownload24 = 0xC1, - CloudFlow24 = 0xC2, - CloudSwap20 = 0xC3, - CloudSwap24 = 0xC4, - CodeCircle20 = 0xC5, - CommentMultiple28 = 0xC6, - CommentMultipleCheckmark16 = 0xC7, - CommentMultipleCheckmark20 = 0xC8, - CommentMultipleCheckmark24 = 0xC9, - CommentMultipleCheckmark28 = 0xCA, - Cube12 = 0xCB, - DeveloperBoardSearch20 = 0xCC, - DocumentArrowRight20 = 0xCD, - DocumentChevronDouble24 = 0xCE, - DocumentCss24 = 0xCF, - DocumentJavascript24 = 0xD0, - DocumentMultiplePercent20 = 0xD1, - DocumentPercent20 = 0xD2, - DocumentPercent24 = 0xD3, - DocumentSettings20 = 0xD4, - DocumentSplitHint16 = 0xD5, - DocumentSplitHint20 = 0xD6, - DocumentSync16 = 0xD7, - DocumentSync20 = 0xD8, - DoorArrowRight16 = 0xD9, - DoorArrowRight20 = 0xDA, - DualScreen20 = 0xDB, - Glance20 = 0xDC, - GlanceHorizontal20 = 0xDD, - HighlightLink20 = 0xDE, - Keyboard12324 = 0xDF, - LaptopDismiss20 = 0xE0, - LinkDismiss24 = 0xE1, - PanelBottomContract20 = 0xE2, - PanelBottomExpand20 = 0xE3, - PanelLeftExpand20 = 0xE4, - PanelSeparateWindow20 = 0xE5, - PanelTopContract20 = 0xE6, - PanelTopExpand20 = 0xE7, - PauseOff16 = 0xE8, - PersonCircle12 = 0xE9, - PersonInfo20 = 0xEA, - Phone12 = 0xEB, - Replay20 = 0xEC, - Square12 = 0xED, - SquareDismiss16 = 0xEE, - SquareDismiss20 = 0xEF, - SubtractCircle12 = 0xF0, - TagCircle20 = 0xF1, - TextBulletListLtr16 = 0xF2, - TextBulletListRtl16 = 0xF3, - TextHeader124 = 0xF4, - TextHeader224 = 0xF5, - TextHeader324 = 0xF6, - TextPeriodAsterisk20 = 0xF7, - Timeline20 = 0xF8, - Triangle12 = 0xF9, - WifiSettings20 = 0xFA, - Window16 = 0xFB, - Window24 = 0xFC, - WindowAdOff20 = 0xFD, - WindowArrowUp16 = 0xFE, - WindowArrowUp20 = 0xFF, - WindowConsole20 = 0x100, - WindowHeaderHorizontalOff20 = 0x101, - WindowMultiple16 = 0x102, - ZoomIn16 = 0x103, - ZoomOut16 = 0x104, - AlignEndHorizontal20 = 0x105, - AlignEndVertical20 = 0x106, - AlignSpaceAroundHorizontal20 = 0x107, - AlignSpaceAroundVertical20 = 0x108, - AlignSpaceBetweenHorizontal20 = 0x109, - AlignSpaceBetweenVertical20 = 0x10A, - AlignSpaceEvenlyHorizontal20 = 0x10B, - AlignSpaceEvenlyVertical20 = 0x10C, - AlignSpaceFitVertical20 = 0x10D, - AlignStartHorizontal20 = 0x10E, - AlignStartVertical20 = 0x10F, - AlignStretchHorizontal20 = 0x110, - AlignStretchVertical20 = 0x111, - ArrowCollapseAll20 = 0x112, - ArrowCollapseAll24 = 0x113, - ArrowWrap20 = 0x114, - ArrowWrapOff20 = 0x115, - CenterHorizontal20 = 0x116, - DocumentMultiple24 = 0x117, - DocumentMultiplePercent24 = 0x118, - DocumentTable16 = 0x119, - DocumentTable20 = 0x11A, - DocumentTable24 = 0x11B, - GlanceHorizontal12 = 0x11C, - PanelLeftExpand16 = 0x11D, - SquareShadow12 = 0x11E, - TextBaseline20 = 0x11F, - ArrowCircleDown12 = 0x120, - ArrowCircleDown16 = 0x121, - ArrowCircleDown28 = 0x122, - ArrowCircleDown32 = 0x123, - ArrowCircleDown48 = 0x124, - ArrowCircleLeft20 = 0x125, - ArrowCircleLeft24 = 0x126, - ArrowCircleLeft28 = 0x127, - ArrowCircleLeft32 = 0x128, - ArrowCircleLeft48 = 0x129, - ArrowCircleRight20 = 0x12A, - ArrowCircleRight28 = 0x12B, - ArrowCircleRight32 = 0x12C, - ArrowCircleRight48 = 0x12D, - ArrowCircleUp12 = 0x12E, - ArrowCircleUp28 = 0x12F, - ArrowCircleUp32 = 0x130, - ArrowCircleUp48 = 0x131, - ArrowTrendingCheckmark20 = 0x132, - ArrowTrendingCheckmark24 = 0x133, - ArrowTrendingSettings20 = 0x134, - ArrowTrendingSettings24 = 0x135, - Balloon12 = 0x136, - CalendarWorkWeek28 = 0x137, - ChannelSubtract16 = 0x138, - ChannelSubtract20 = 0x139, - ChannelSubtract24 = 0x13A, - ChannelSubtract28 = 0x13B, - ChannelSubtract48 = 0x13C, - ClipboardSettings24 = 0x13D, - CloudArchive16 = 0x13E, - CloudArchive20 = 0x13F, - CloudWords16 = 0x140, - CloudWords20 = 0x141, - CloudWords24 = 0x142, - CloudWords28 = 0x143, - CloudWords32 = 0x144, - CloudWords48 = 0x145, - ColumnArrowRight20 = 0x146, - ControlButton20 = 0x147, - ControlButton24 = 0x148, - CreditCardPerson20 = 0x149, - CreditCardPerson24 = 0x14A, - CreditCardToolbox24 = 0x14B, - CubeLink20 = 0x14C, - DeleteLines20 = 0x14D, - Dialpad28 = 0x14E, - Dialpad32 = 0x14F, - Dialpad48 = 0x150, - Diversity20 = 0x151, - Diversity24 = 0x152, - Diversity28 = 0x153, - Diversity48 = 0x154, - FoodCake12 = 0x155, - GlobeProhibited20 = 0x156, - GlobeSearch20 = 0x157, - GlobeVideo28 = 0x158, - GlobeVideo32 = 0x159, - GlobeVideo48 = 0x15A, - Guardian20 = 0x15B, - Guardian24 = 0x15C, - Guardian28 = 0x15D, - Guardian48 = 0x15E, - HatGraduation12 = 0x15F, - LockClosed32 = 0x160, - MoneyCalculator20 = 0x161, - MoneyCalculator24 = 0x162, - MoneySettings20 = 0x163, - Options48 = 0x164, - PauseSettings20 = 0x165, - PersonLock24 = 0x166, - PersonNote20 = 0x167, - RoadCone16 = 0x168, - RoadCone20 = 0x169, - RoadCone24 = 0x16A, - RoadCone28 = 0x16B, - RoadCone32 = 0x16C, - RoadCone48 = 0x16D, - ScanThumbUp16 = 0x16E, - ScanThumbUp20 = 0x16F, - ScanThumbUp24 = 0x170, - ScanThumbUp28 = 0x171, - ScanThumbUp48 = 0x172, - ScreenShareStart48 = 0x173, - Share48 = 0x174, - ShieldVideo24 = 0x175, - ShieldVideo28 = 0x176, - ShieldVideo48 = 0x177, - Speaker032 = 0x178, - Speaker132 = 0x179, - Speaker232 = 0x17A, - Sticker12 = 0x17B, - Toolbox12 = 0x17C, - VehicleCarCollision16 = 0x17D, - VehicleCarCollision20 = 0x17E, - VehicleCarCollision24 = 0x17F, - VehicleCarCollision48 = 0x180, - Wallet20 = 0x181, - Wallet24 = 0x182, - Whiteboard48 = 0x183, - Call48 = 0x184, - ClosedCaption32 = 0x185, - DesktopKeyboard16 = 0x186, - DesktopKeyboard20 = 0x187, - DesktopKeyboard24 = 0x188, - DesktopKeyboard28 = 0x189, - Heart12 = 0x18A, - ImageAltText16 = 0x18B, - InkingToolAccent32 = 0x18C, - Mail12 = 0x18D, - MoreCircle32 = 0x18E, - NumberSymbol32 = 0x18F, - Poll16 = 0x190, - RectangleLandscape12 = 0x191, - RectangleLandscape16 = 0x192, - RectangleLandscape24 = 0x193, - RectangleLandscape28 = 0x194, - RectangleLandscape32 = 0x195, - RectangleLandscape48 = 0x196, - ScanThumbUpOff16 = 0x197, - ScanThumbUpOff20 = 0x198, - ScanThumbUpOff24 = 0x199, - ScanThumbUpOff28 = 0x19A, - ScanThumbUpOff48 = 0x19B, - SendClock24 = 0x19C, - ShareScreenPerson16 = 0x19D, - ShareScreenPerson20 = 0x19E, - ShareScreenPerson24 = 0x19F, - ShareScreenPerson28 = 0x1A0, - ShareScreenPersonOverlay16 = 0x1A1, - ShareScreenPersonOverlay20 = 0x1A2, - ShareScreenPersonOverlay24 = 0x1A3, - ShareScreenPersonOverlay28 = 0x1A4, - ShareScreenPersonOverlayInside16 = 0x1A5, - ShareScreenPersonOverlayInside20 = 0x1A6, - ShareScreenPersonOverlayInside24 = 0x1A7, - ShareScreenPersonOverlayInside28 = 0x1A8, - SlideMicrophone32 = 0x1A9, - Snooze20 = 0x1AA, - Tag32 = 0x1AB, - TagDismiss16 = 0x1AC, - TagLock16 = 0x1AD, - TagLock20 = 0x1AE, - TagLock24 = 0x1AF, - TagLock32 = 0x1B0, - TagLockAccent16 = 0x1B1, - TagLockAccent20 = 0x1B2, - TagLockAccent24 = 0x1B3, - TagLockAccent32 = 0x1B4, - TextAlignCenter16 = 0x1B5, - TextAlignLeft16 = 0x1B6, - TextAlignRight16 = 0x1B7, - TextChangeCase16 = 0x1B8, - TextClearFormatting16 = 0x1B9, - TextColorAccent16 = 0x1BA, - TextColorAccent20 = 0x1BB, - TextColorAccent24 = 0x1BC, - TextFontSize16 = 0x1BD, - TextIndentDecrease16 = 0x1BE, - TextIndentDecreaseLtr16 = 0x1BF, - TextIndentDecreaseLtr20 = 0x1C0, - TextIndentDecreaseLtr24 = 0x1C1, - TextIndentDecreaseRtl16 = 0x1C2, - TextIndentDecreaseRtl20 = 0x1C3, - TextIndentDecreaseRtl24 = 0x1C4, - TextIndentIncrease16 = 0x1C5, - TextIndentIncreaseLtr16 = 0x1C6, - TextIndentIncreaseLtr20 = 0x1C7, - TextIndentIncreaseLtr24 = 0x1C8, - TextIndentIncreaseRtl16 = 0x1C9, - TextIndentIncreaseRtl20 = 0x1CA, - TextIndentIncreaseRtl24 = 0x1CB, - TextNumberListLtr16 = 0x1CC, - TextNumberListRtl16 = 0x1CD, - TextParagraphDirectionLeft16 = 0x1CE, - TextParagraphDirectionLeft20 = 0x1CF, - TextParagraphDirectionRight16 = 0x1D0, - TextParagraphDirectionRight20 = 0x1D1, - TextSubscript16 = 0x1D2, - TextSuperscript16 = 0x1D3, - AppsListDetail20 = 0x1D4, - AppsListDetail24 = 0x1D5, - ArrowMaximize32 = 0x1D6, - ArrowOutlineUpRight32 = 0x1D7, - ArrowUpRight32 = 0x1D8, - BoxEdit20 = 0x1D9, - BoxEdit24 = 0x1DA, - BoxToolbox20 = 0x1DB, - BoxToolbox24 = 0x1DC, - ChatVideo20 = 0x1DD, - ChatVideo24 = 0x1DE, - Circle32 = 0x1DF, - DatabaseLink20 = 0x1E0, - DatabaseLink24 = 0x1E1, - Diamond32 = 0x1E2, - DocumentText20 = 0x1E3, - DocumentText24 = 0x1E4, - DocumentTextLink20 = 0x1E5, - DocumentTextLink24 = 0x1E6, - GlobeShield20 = 0x1E7, - GlobeShield24 = 0x1E8, - Line32 = 0x1E9, - LineDashes32 = 0x1EA, - NumberSymbol28 = 0x1EB, - NumberSymbol48 = 0x1EC, - Oval32 = 0x1ED, - Pentagon32 = 0x1EE, - PlayCircle48 = 0x1EF, - ProjectionScreen16 = 0x1F0, - ProjectionScreen20 = 0x1F1, - ProjectionScreen24 = 0x1F2, - ProjectionScreen28 = 0x1F3, - ProjectionScreenDismiss16 = 0x1F4, - ProjectionScreenDismiss20 = 0x1F5, - ProjectionScreenDismiss24 = 0x1F6, - ProjectionScreenDismiss28 = 0x1F7, - Rhombus32 = 0x1F8, - SaveArrowRight20 = 0x1F9, - SaveArrowRight24 = 0x1FA, - Shortpick20 = 0x1FB, - Shortpick24 = 0x1FC, - Sparkle16 = 0x1FD, - Sparkle20 = 0x1FE, - Sparkle24 = 0x1FF, - Sparkle28 = 0x200, - Sparkle48 = 0x201, - Square32 = 0x202, - SubtractSquare24 = 0x203, - TextCaseLowercase16 = 0x204, - TextCaseLowercase20 = 0x205, - TextCaseLowercase24 = 0x206, - TextCaseTitle16 = 0x207, - TextCaseTitle20 = 0x208, - TextCaseTitle24 = 0x209, - TextCaseUppercase16 = 0x20A, - TextCaseUppercase20 = 0x20B, - TextCaseUppercase24 = 0x20C, - Triangle32 = 0x20D, - VideoPersonSparkle16 = 0x20E, - VideoPersonSparkle20 = 0x20F, - VideoPersonSparkle24 = 0x210, - VideoPersonSparkle28 = 0x211, - VideoPersonSparkle48 = 0x212, - Accessibility48 = 0x213, - ArchiveMultiple16 = 0x214, - ArchiveMultiple20 = 0x215, - ArchiveMultiple24 = 0x216, - ArrowReset32 = 0x217, - ArrowReset48 = 0x218, - Box20 = 0x219, - Box24 = 0x21A, - BoxDismiss20 = 0x21B, - BoxDismiss24 = 0x21C, - ClearFormatting16 = 0x21D, - ClearFormatting20 = 0x21E, - ClipboardClock20 = 0x21F, - ClipboardClock24 = 0x220, - CloudArchive24 = 0x221, - CloudArchive28 = 0x222, - CloudArchive32 = 0x223, - CloudArchive48 = 0x224, - DocumentTableArrowRight20 = 0x225, - DocumentTableArrowRight24 = 0x226, - DocumentTableCheckmark20 = 0x227, - DocumentTableCheckmark24 = 0x228, - DocumentTextClock20 = 0x229, - DocumentTextClock24 = 0x22A, - FlashSettings20 = 0x22B, - FlashSettings24 = 0x22C, - Games16 = 0x22D, - Games20 = 0x22E, - Games28 = 0x22F, - Games32 = 0x230, - Games48 = 0x231, - HandDraw28 = 0x232, - Lasso28 = 0x233, - MoneyDismiss20 = 0x234, - MoneyDismiss24 = 0x235, - MoneyOff20 = 0x236, - MoneyOff24 = 0x237, - Note28 = 0x238, - Note48 = 0x239, - PersonLightbulb20 = 0x23A, - PersonLightbulb24 = 0x23B, - PictureInPictureEnter16 = 0x23C, - PictureInPictureEnter20 = 0x23D, - PictureInPictureEnter24 = 0x23E, - PictureInPictureExit16 = 0x23F, - PictureInPictureExit20 = 0x240, - PictureInPictureExit24 = 0x241, - PlugConnected20 = 0x242, - Sanitize20 = 0x243, - Sanitize24 = 0x244, - Settings32 = 0x245, - Settings48 = 0x246, - Shapes28 = 0x247, - Shapes48 = 0x248, - ShoppingBagPercent20 = 0x249, - ShoppingBagPercent24 = 0x24A, - ShoppingBagTag20 = 0x24B, - ShoppingBagTag24 = 0x24C, - StackArrowForward20 = 0x24D, - StackArrowForward24 = 0x24E, - TableLightning20 = 0x24F, - TableLightning24 = 0x250, - TableLink20 = 0x251, - TableLink24 = 0x252, - TextT28 = 0x253, - TextT48 = 0x254, - ThumbLike28 = 0x255, - ThumbLike48 = 0x256, - VideoOff32 = 0x257, - VideoOff48 = 0x258, - BookmarkSearch20 = 0x259, - BookmarkSearch24 = 0x25A, - BuildingFactory16 = 0x25B, - BuildingFactory20 = 0x25C, - BuildingFactory28 = 0x25D, - BuildingFactory32 = 0x25E, - BuildingFactory48 = 0x25F, - CalendarChat20 = 0x260, - CalendarChat24 = 0x261, - CalendarToolbox20 = 0x262, - CalendarToolbox24 = 0x263, - CameraSwitch20 = 0x264, - CommentMultiple32 = 0x265, - CommentMultipleLink16 = 0x266, - CommentMultipleLink20 = 0x267, - CommentMultipleLink24 = 0x268, - CommentMultipleLink28 = 0x269, - CommentMultipleLink32 = 0x26A, - ContactCardRibbon16 = 0x26B, - ContactCardRibbon20 = 0x26C, - ContactCardRibbon24 = 0x26D, - ContactCardRibbon28 = 0x26E, - ContactCardRibbon32 = 0x26F, - ContactCardRibbon48 = 0x270, - DatabasePerson20 = 0x271, - DatabasePerson24 = 0x272, - DocumentFlowchart20 = 0x273, - DocumentFlowchart24 = 0x274, - DocumentTableSearch20 = 0x275, - DocumentTableSearch24 = 0x276, - DocumentTextExtract20 = 0x277, - DocumentTextExtract24 = 0x278, - FastForward16 = 0x279, - FastForward28 = 0x27A, - Flowchart20 = 0x27B, - Flowchart24 = 0x27C, - FlowchartCircle20 = 0x27D, - FlowchartCircle24 = 0x27E, - FolderSync24 = 0x27F, - HeartCircle16 = 0x280, - HeartCircle20 = 0x281, - HeartCircle24 = 0x282, - MegaphoneLoud24 = 0x283, - PeopleLock20 = 0x284, - PeopleLock24 = 0x285, - PersonCircle24 = 0x286, - PhoneUpdateCheckmark20 = 0x287, - PhoneUpdateCheckmark24 = 0x288, - PlugConnected24 = 0x289, - Rewind16 = 0x28A, - Rewind28 = 0x28B, - SaveMultiple20 = 0x28C, - SaveMultiple24 = 0x28D, - ScanTypeCheckmark20 = 0x28E, - ScanTypeCheckmark24 = 0x28F, - SelectObjectSkew20 = 0x290, - SelectObjectSkew24 = 0x291, - SelectObjectSkewDismiss20 = 0x292, - SelectObjectSkewDismiss24 = 0x293, - SelectObjectSkewEdit20 = 0x294, - SelectObjectSkewEdit24 = 0x295, - ShoppingBagDismiss20 = 0x296, - ShoppingBagDismiss24 = 0x297, - ShoppingBagPause20 = 0x298, - ShoppingBagPause24 = 0x299, - TagError16 = 0x29A, - TagError20 = 0x29B, - TagError24 = 0x29C, - TagMultiple24 = 0x29D, - TagQuestionMark20 = 0x29E, - TagQuestionMark32 = 0x29F, - TextColumnOneWideLightning20 = 0x2A0, - TextColumnOneWideLightning24 = 0x2A1, - TextFontInfo16 = 0x2A2, - TextFontInfo20 = 0x2A3, - TextFontInfo24 = 0x2A4, - TrayItemAdd20 = 0x2A5, - TrayItemAdd24 = 0x2A6, - TrayItemRemove20 = 0x2A7, - TrayItemRemove24 = 0x2A8, - VehicleTruckBag20 = 0x2A9, - VehicleTruckBag24 = 0x2AA, - CheckmarkStarburst20 = 0x2AB, - CheckmarkStarburst24 = 0x2AC, - AccessTime20 = 0x2AD, - AccessibilityCheckmark20 = 0x2AE, - AddSquare20 = 0x2AF, - Album20 = 0x2B0, - AlbumAdd20 = 0x2B1, - AlertOn20 = 0x2B2, - AppGeneric20 = 0x2B3, - AppRecent20 = 0x2B4, - AppTitle20 = 0x2B5, - ArrowAutofitDown20 = 0x2B6, - ArrowAutofitHeight20 = 0x2B7, - ArrowAutofitHeightDotted20 = 0x2B8, - ArrowAutofitUp20 = 0x2B9, - ArrowAutofitWidth20 = 0x2BA, - ArrowAutofitWidthDotted20 = 0x2BB, - ArrowBounce20 = 0x2BC, - ArrowCircleDownRight20 = 0x2BD, - ArrowCircleUpLeft20 = 0x2BE, - ArrowExpand20 = 0x2BF, - ArrowFit20 = 0x2C0, - ArrowMinimizeVertical20 = 0x2C1, - ArrowSortDownLines24 = 0x2C2, - ArrowSquareDown20 = 0x2C3, - ArrowStepBack20 = 0x2C4, - ArrowStepInDefault20 = 0x2C5, - ArrowStepInLeft20 = 0x2C6, - ArrowStepInRight20 = 0x2C7, - ArrowStepOut20 = 0x2C8, - ArrowStepOver20 = 0x2C9, - ArrowTurnBidirectionalDownRight20 = 0x2CA, - ArrowTurnRight20 = 0x2CB, - ArrowsBidirectional20 = 0x2CC, - AttachText20 = 0x2CD, - AutoFitHeight20 = 0x2CE, - AutoFitWidth20 = 0x2CF, - Autocorrect20 = 0x2D0, - Badge20 = 0x2D1, - BatteryCheckmark20 = 0x2D2, - BatteryWarning20 = 0x2D3, - BezierCurve20 = 0x2D4, - BluetoothConnected20 = 0x2D5, - BluetoothDisabled20 = 0x2D6, - BluetoothSearching20 = 0x2D7, - BookmarkMultiple16 = 0x2D8, - BookmarkMultiple28 = 0x2D9, - BookmarkMultiple32 = 0x2DA, - BookmarkMultiple48 = 0x2DB, - BranchForkHint20 = 0x2DC, - BranchForkHint24 = 0x2DD, - BranchForkLink20 = 0x2DE, - BranchForkLink24 = 0x2DF, - CalendarLtr48 = 0x2E0, - CalendarRtl48 = 0x2E1, - DataUsageToolbox20 = 0x2E2, - DataUsageToolbox24 = 0x2E3, - DesktopCursor16 = 0x2E4, - DesktopCursor20 = 0x2E5, - DesktopCursor24 = 0x2E6, - DesktopCursor28 = 0x2E7, - DesktopFlow20 = 0x2E8, - DesktopFlow24 = 0x2E9, - DesktopSignal20 = 0x2EA, - DesktopSignal24 = 0x2EB, - EmojiSadSlight20 = 0x2EC, - EmojiSadSlight24 = 0x2ED, - EmojiSmileSlight20 = 0x2EE, - EmojiSmileSlight24 = 0x2EF, - FoodApple20 = 0x2F0, - FoodApple24 = 0x2F1, - MailEdit20 = 0x2F2, - MailEdit24 = 0x2F3, - PersonArrowLeft16 = 0x2F4, - PersonEdit20 = 0x2F5, - PersonEdit24 = 0x2F6, - ScanDash12 = 0x2F7, - ScanDash16 = 0x2F8, - ScanDash20 = 0x2F9, - ScanDash24 = 0x2FA, - ScanDash28 = 0x2FB, - ScanDash32 = 0x2FC, - ScanDash48 = 0x2FD, - SquareHint20 = 0x2FE, - SquareHint24 = 0x2FF, - TagOff20 = 0x300, - TagOff24 = 0x301, - TextBoxSettings20 = 0x302, - TextBoxSettings24 = 0x303, - VehicleTruckCube20 = 0x304, - VehicleTruckCube24 = 0x305, - ArrowForwardDownLightning20 = 0x306, - ArrowForwardDownLightning24 = 0x307, - ArrowForwardDownPerson20 = 0x308, - ArrowForwardDownPerson24 = 0x309, - ArrowStepIn28 = 0x30A, - ArrowStepInDefault24 = 0x30B, - ArrowStepInLeft24 = 0x30C, - ArrowStepInLeft28 = 0x30D, - ArrowStepInRight24 = 0x30E, - ArrowStepInRight28 = 0x30F, - ArrowStepOut24 = 0x310, - ArrowStepOut28 = 0x311, - ArrowTrendingText20 = 0x312, - ArrowTrendingText24 = 0x313, - ArrowTrendingWrench20 = 0x314, - ArrowTrendingWrench24 = 0x315, - Battery1020 = 0x316, - Battery20 = 0x317, - Beach32 = 0x318, - Beach48 = 0x319, - BookClock20 = 0x31A, - BookCoins20 = 0x31B, - BookCompass20 = 0x31C, - BookDatabase20 = 0x31D, - BookExclamationMark20 = 0x31E, - BookGlobe20 = 0x31F, - BookInformation20 = 0x320, - BookLetter20 = 0x321, - BookPulse20 = 0x322, - BookQuestionMark20 = 0x323, - BookQuestionMarkRtl20 = 0x324, - BookSearch20 = 0x325, - BookStar20 = 0x326, - BookTheta20 = 0x327, - BookmarkOff20 = 0x328, - BorderBottom20 = 0x329, - BorderBottomDouble20 = 0x32A, - BorderBottomThick20 = 0x32B, - BorderLeft20 = 0x32C, - BorderNone20 = 0x32D, - BorderOutside20 = 0x32E, - BorderOutsideThick20 = 0x32F, - BorderRight20 = 0x330, - BorderTop20 = 0x331, - BorderTopBottom20 = 0x332, - BorderTopBottomDouble20 = 0x333, - BorderTopBottomThick20 = 0x334, - Branch20 = 0x335, - BrightnessHigh16 = 0x336, - BrightnessHigh20 = 0x337, - BrightnessHigh24 = 0x338, - BrightnessHigh28 = 0x339, - BrightnessHigh32 = 0x33A, - BrightnessHigh48 = 0x33B, - BrightnessLow16 = 0x33C, - BrightnessLow20 = 0x33D, - BrightnessLow24 = 0x33E, - BrightnessLow28 = 0x33F, - BrightnessLow32 = 0x340, - BrightnessLow48 = 0x341, - BuildingGovernment20 = 0x342, - BuildingMultiple20 = 0x343, - ChatDismiss20 = 0x344, - ChatDismiss24 = 0x345, - CubeTree20 = 0x346, - CubeTree24 = 0x347, - DrawImage20 = 0x348, - DrawImage24 = 0x349, - DrawShape20 = 0x34A, - DrawText20 = 0x34B, - DrawerAdd20 = 0x34C, - DrawerAdd24 = 0x34D, - DrawerArrowDownload20 = 0x34E, - DrawerArrowDownload24 = 0x34F, - DrawerDismiss20 = 0x350, - DrawerDismiss24 = 0x351, - DrawerDownload20 = 0x352, - DrawerDownload24 = 0x353, - DrawerPlay20 = 0x354, - DrawerPlay24 = 0x355, - DrawerSubtract20 = 0x356, - DrawerSubtract24 = 0x357, - Emoji28 = 0x358, - Emoji32 = 0x359, - Emoji48 = 0x35A, - EmojiSparkle16 = 0x35B, - EmojiSparkle20 = 0x35C, - EmojiSparkle24 = 0x35D, - EmojiSparkle28 = 0x35E, - EmojiSparkle32 = 0x35F, - EmojiSparkle48 = 0x360, - FlipHorizontal16 = 0x361, - FlipHorizontal20 = 0x362, - FlipHorizontal28 = 0x363, - FlipHorizontal32 = 0x364, - FlipHorizontal48 = 0x365, - FlipVertical16 = 0x366, - FlipVertical20 = 0x367, - FlipVertical28 = 0x368, - FlipVertical32 = 0x369, - FlipVertical48 = 0x36A, - FoodGrains20 = 0x36B, - FoodGrains24 = 0x36C, - GiftCardArrowRight20 = 0x36D, - GiftCardArrowRight24 = 0x36E, - Heart32 = 0x36F, - Heart48 = 0x370, - Link12 = 0x371, - Link32 = 0x372, - Luggage28 = 0x373, - Luggage32 = 0x374, - Luggage48 = 0x375, - MoneyHand20 = 0x376, - MoneyHand24 = 0x377, - Next28 = 0x378, - Next32 = 0x379, - Next48 = 0x37A, - PeopleList28 = 0x37B, - Previous28 = 0x37C, - Previous32 = 0x37D, - Previous48 = 0x37E, - QuestionCircle32 = 0x37F, - TextParagraph16 = 0x380, - VehicleCarCollision28 = 0x381, - VehicleCarCollision32 = 0x382, - VideoClipMultiple16 = 0x383, - VideoClipMultiple20 = 0x384, - VideoClipMultiple24 = 0x385, - Wallet28 = 0x386, - Wallet32 = 0x387, - Wallet48 = 0x388, - WeatherSunny28 = 0x389, - WrenchScrewdriver20 = 0x38A, - WrenchScrewdriver24 = 0x38B, - ArrowBetweenDown20 = 0x38C, - ArrowBetweenDown24 = 0x38D, - ArrowRedo28 = 0x38E, - ArrowSyncCheckmark20 = 0x38F, - ArrowSyncCheckmark24 = 0x390, - ArrowSyncDismiss20 = 0x391, - ArrowSyncDismiss24 = 0x392, - CalculatorArrowClockwise20 = 0x393, - CalculatorArrowClockwise24 = 0x394, - CalendarArrowDown20 = 0x395, - CalendarArrowRight24 = 0x396, - CalendarError20 = 0x397, - CalendarMail20 = 0x398, - CalendarWeekNumbers20 = 0x399, - CallAdd20 = 0x39A, - CameraOff20 = 0x39B, - CellularOff20 = 0x39C, - ChevronCircleDown32 = 0x39D, - ChevronCircleUp32 = 0x39E, - Circle48 = 0x39F, - ClockPause20 = 0x3A0, - ClockPause24 = 0x3A1, - Diamond16 = 0x3A2, - Diamond20 = 0x3A3, - Diamond24 = 0x3A4, - Diamond28 = 0x3A5, - Diamond48 = 0x3A6, - Door28 = 0x3A7, - DoorArrowRight28 = 0x3A8, - ImmersiveReader28 = 0x3A9, - KeyReset20 = 0x3AA, - KeyReset24 = 0x3AB, - LightbulbFilament48 = 0x3AC, - Line20 = 0x3AD, - Line24 = 0x3AE, - Line48 = 0x3AF, - LineDashes20 = 0x3B0, - LineDashes24 = 0x3B1, - LineDashes48 = 0x3B2, - MailArrowUp16 = 0x3B3, - NotepadPerson16 = 0x3B4, - Oval16 = 0x3B5, - Oval20 = 0x3B6, - Oval24 = 0x3B7, - Oval28 = 0x3B8, - Oval48 = 0x3B9, - Pentagon48 = 0x3BA, - PeopleAdd28 = 0x3BB, - PeopleList24 = 0x3BC, - PeopleQueue20 = 0x3BD, - PeopleQueue24 = 0x3BE, - PeopleSettings28 = 0x3BF, - Print28 = 0x3C0, - Rhombus16 = 0x3C1, - Rhombus20 = 0x3C2, - Rhombus24 = 0x3C3, - Rhombus28 = 0x3C4, - Rhombus48 = 0x3C5, - ScreenSearch20 = 0x3C6, - ScreenSearch24 = 0x3C7, - SettingsChat20 = 0x3C8, - SettingsChat24 = 0x3C9, - ShareScreenPersonP16 = 0x3CA, - ShareScreenPersonP20 = 0x3CB, - ShareScreenPersonP24 = 0x3CC, - ShareScreenPersonP28 = 0x3CD, - SlideAdd16 = 0x3CE, - SlideAdd20 = 0x3CF, - SlideAdd28 = 0x3D0, - SlideAdd32 = 0x3D1, - SlideAdd48 = 0x3D2, - SlideArrowRight20 = 0x3D3, - SlideArrowRight24 = 0x3D4, - SoundWaveCircle24 = 0x3D5, - Square48 = 0x3D6, - Star48 = 0x3D7, - StarAdd28 = 0x3D8, - StarDismiss16 = 0x3D9, - StarDismiss20 = 0x3DA, - StarDismiss24 = 0x3DB, - StarDismiss28 = 0x3DC, - StarEdit20 = 0x3DD, - StarSettings20 = 0x3DE, - Triangle48 = 0x3DF, - Trophy28 = 0x3E0, - Trophy32 = 0x3E1, - Trophy48 = 0x3E2, - TrophyOff16 = 0x3E3, - TrophyOff20 = 0x3E4, - TrophyOff24 = 0x3E5, - TrophyOff28 = 0x3E6, - TrophyOff32 = 0x3E7, - TrophyOff48 = 0x3E8, - Window28 = 0x3E9, - Window32 = 0x3EA, - Window48 = 0x3EB, - WindowApps16 = 0x3EC, - WindowApps20 = 0x3ED, - WindowApps24 = 0x3EE, - WindowApps28 = 0x3EF, - WindowApps32 = 0x3F0, - WindowApps48 = 0x3F1, - WindowWrench16 = 0x3F2, - WindowWrench20 = 0x3F3, - WindowWrench24 = 0x3F4, - WindowWrench28 = 0x3F5, - WindowWrench32 = 0x3F6, - WindowWrench48 = 0x3F7, - ArrowDownLeft32 = 0x3F8, - ArrowDownLeft48 = 0x3F9, - ArrowMaximize48 = 0x3FA, - ArrowMaximizeVertical48 = 0x3FB, - ArrowOutlineUpRight48 = 0x3FC, - ArrowUpLeft48 = 0x3FD, - ArrowUpRight48 = 0x3FE, - BookArrowClockwise20 = 0x3FF, - BookArrowClockwise24 = 0x400, - BoxArrowLeft20 = 0x401, - BoxArrowLeft24 = 0x402, - BoxArrowUp20 = 0x403, - BoxArrowUp24 = 0x404, - BoxCheckmark20 = 0x405, - BoxCheckmark24 = 0x406, - BoxMultiple20 = 0x407, - BoxMultiple24 = 0x408, - BoxMultipleArrowLeft20 = 0x409, - BoxMultipleArrowLeft24 = 0x40A, - BoxMultipleArrowRight20 = 0x40B, - BoxMultipleArrowRight24 = 0x40C, - BoxMultipleCheckmark20 = 0x40D, - BoxMultipleCheckmark24 = 0x40E, - BoxMultipleSearch20 = 0x40F, - BoxMultipleSearch24 = 0x410, - BoxSearch20 = 0x411, - BoxSearch24 = 0x412, - CellularWarning20 = 0x413, - ChartMultiple20 = 0x414, - ChartMultiple24 = 0x415, - CheckboxArrowRight20 = 0x416, - CheckboxWarning20 = 0x417, - ClockToolbox20 = 0x418, - ClockToolbox24 = 0x419, - CubeMultiple20 = 0x41A, - CubeMultiple24 = 0x41B, - DesktopToolbox20 = 0x41C, - DesktopToolbox24 = 0x41D, - DocumentBulletListMultiple20 = 0x41E, - DocumentBulletListMultiple24 = 0x41F, - DocumentQueue20 = 0x420, - DocumentQueue24 = 0x421, - DocumentQueueAdd20 = 0x422, - DocumentQueueAdd24 = 0x423, - DocumentQueueMultiple20 = 0x424, - DocumentQueueMultiple24 = 0x425, - DocumentTableCube20 = 0x426, - DocumentTableCube24 = 0x427, - DocumentTableTruck20 = 0x428, - DocumentTableTruck24 = 0x429, - DocumentTextToolbox20 = 0x42A, - DocumentTextToolbox24 = 0x42B, - EqualCircle20 = 0x42C, - EqualCircle24 = 0x42D, - GiftCardMoney20 = 0x42E, - GiftCardMoney24 = 0x42F, - GiftCardMultiple20 = 0x430, - GiftCardMultiple24 = 0x431, - ImageMultiple32 = 0x432, - ImageMultiple48 = 0x433, - MailAlert28 = 0x434, - PuzzlePieceShield20 = 0x435, - Ribbon12 = 0x436, - RibbonOff12 = 0x437, - RibbonOff16 = 0x438, - RibbonOff20 = 0x439, - RibbonOff24 = 0x43A, - RibbonOff32 = 0x43B, - Share28 = 0x43C, - ShoppingBagArrowLeft20 = 0x43D, - ShoppingBagArrowLeft24 = 0x43E, - ShoppingBagPlay20 = 0x43F, - ShoppingBagPlay24 = 0x440, - Square24 = 0x441, - Square28 = 0x442, - SquareHint16 = 0x443, - SquareHint28 = 0x444, - SquareHint32 = 0x445, - SquareHint48 = 0x446, - SquareHintApps20 = 0x447, - SquareHintApps24 = 0x448, - SquareHintSparkles16 = 0x449, - SquareHintSparkles20 = 0x44A, - SquareHintSparkles24 = 0x44B, - SquareHintSparkles28 = 0x44C, - SquareHintSparkles32 = 0x44D, - SquareHintSparkles48 = 0x44E, - Tablet12 = 0x44F, - Tablet16 = 0x450, - Tablet32 = 0x451, - Tablet48 = 0x452, - TagReset20 = 0x453, - TagReset24 = 0x454, - TagSearch20 = 0x455, - TagSearch24 = 0x456, - TapDouble32 = 0x457, - TapDouble48 = 0x458, - TapSingle32 = 0x459, - TapSingle48 = 0x45A, - Timer12 = 0x45B, - Timer28 = 0x45C, - Timer32 = 0x45D, - Timer48 = 0x45E, - BoardHeart16 = 0x45F, - BoardHeart20 = 0x460, - BoardHeart24 = 0x461, - Braces24 = 0x462, - BreakoutRoom24 = 0x463, - BreakoutRoom28 = 0x464, - ChatWarning20 = 0x465, - CheckboxPerson16 = 0x466, - CheckboxPerson20 = 0x467, - ChevronCircleDown12 = 0x468, - ChevronCircleDown16 = 0x469, - ChevronCircleDown20 = 0x46A, - ChevronCircleDown28 = 0x46B, - ChevronCircleDown48 = 0x46C, - ChevronCircleLeft12 = 0x46D, - ChevronCircleLeft16 = 0x46E, - ChevronCircleLeft20 = 0x46F, - ChevronCircleLeft24 = 0x470, - ChevronCircleLeft28 = 0x471, - ChevronCircleLeft32 = 0x472, - ChevronCircleLeft48 = 0x473, - ChevronCircleRight16 = 0x474, - ChevronCircleRight20 = 0x475, - ChevronCircleRight28 = 0x476, - ChevronCircleRight32 = 0x477, - ChevronCircleRight48 = 0x478, - ChevronCircleUp12 = 0x479, - ChevronCircleUp16 = 0x47A, - ChevronCircleUp20 = 0x47B, - ChevronCircleUp24 = 0x47C, - ChevronCircleUp28 = 0x47D, - ChevronCircleUp48 = 0x47E, - CircleEdit20 = 0x47F, - CircleLine20 = 0x480, - CircleOff20 = 0x481, - Class20 = 0x482, - ClipboardDataBar20 = 0x483, - ClipboardDataBar24 = 0x484, - ClipboardImage20 = 0x485, - ClipboardMore20 = 0x486, - ClockDismiss20 = 0x487, - CommentDismiss20 = 0x488, - CommentError24 = 0x489, - CommentNote20 = 0x48A, - ConvertRange20 = 0x48B, - CopyAdd20 = 0x48C, - CopyArrowRight20 = 0x48D, - Couch20 = 0x48E, - CropInterim20 = 0x48F, - CropInterimOff20 = 0x490, - CubeSync20 = 0x491, - DarkTheme20 = 0x492, - DataArea20 = 0x493, - DataBarVerticalAdd20 = 0x494, - DataFunnel20 = 0x495, - DataHistogram20 = 0x496, - DataScatter20 = 0x497, - DataSunburst20 = 0x498, - DataTreemap20 = 0x499, - DataWaterfall20 = 0x49A, - DataWhisker20 = 0x49B, - DocumentLock16 = 0x49C, - DocumentLock20 = 0x49D, - DocumentLock24 = 0x49E, - DocumentLock28 = 0x49F, - DocumentLock32 = 0x4A0, - DocumentLock48 = 0x4A1, - EyedropperOff20 = 0x4A2, - EyedropperOff24 = 0x4A3, - GlobePerson20 = 0x4A4, - MailOpenPerson20 = 0x4A5, - MailOpenPerson24 = 0x4A6, - Resize24 = 0x4A7, - ResizeImage20 = 0x4A8, - ScanCamera16 = 0x4A9, - ScanCamera20 = 0x4AA, - ScanCamera24 = 0x4AB, - ScanCamera28 = 0x4AC, - ScanCamera48 = 0x4AD, - StyleGuide20 = 0x4AE, - TabDesktop16 = 0x4AF, - TabDesktop24 = 0x4B0, - TabDesktopBottom20 = 0x4B1, - ApprovalsApp32 = 0x4B2, - ArrowExportRtl24 = 0x4B3, - ArrowSortDownLines20 = 0x4B4, - ArrowStepIn20 = 0x4B5, - ArrowStepIn24 = 0x4B6, - Battery1024 = 0x4B7, - BezierCurveSquare20 = 0x4B8, - BorderNone24 = 0x4B9, - CalendarPattern16 = 0x4BA, - CaretDownRight12 = 0x4BB, - CaretDownRight16 = 0x4BC, - CaretDownRight20 = 0x4BD, - CaretDownRight24 = 0x4BE, - CellularOff24 = 0x4BF, - Eye12 = 0x4C0, - Eye16 = 0x4C1, - Eye20 = 0x4C2, - Eye24 = 0x4C3, - EyeOff20 = 0x4C4, - EyeOff24 = 0x4C5, - EyeTracking16 = 0x4C6, - EyeTracking20 = 0x4C7, - EyeTracking24 = 0x4C8, - Flash20 = 0x4C9, - Flash24 = 0x4CA, - HdrOff24 = 0x4CB, - Mic16 = 0x4CC, - Mic20 = 0x4CD, - Mic24 = 0x4CE, - Mic28 = 0x4CF, - Mic32 = 0x4D0, - Mic48 = 0x4D1, - MultiselectLtr16 = 0x4D2, - MultiselectLtr20 = 0x4D3, - MultiselectLtr24 = 0x4D4, - MultiselectRtl20 = 0x4D5, - MultiselectRtl24 = 0x4D6, - PanelLeftContract16 = 0x4D7, - PanelLeftContract20 = 0x4D8, - PanelLeftContract24 = 0x4D9, - PersonTag20 = 0x4DA, - PersonTag24 = 0x4DB, - PersonTag28 = 0x4DC, - PersonTag32 = 0x4DD, - PersonTag48 = 0x4DE, - ShareScreenStart48 = 0x4DF, - ShieldLock24 = 0x4E0, - ShieldLock28 = 0x4E1, - ShieldLock48 = 0x4E2, - SkipBack1024 = 0x4E3, - SkipBack1028 = 0x4E4, - SkipBack1032 = 0x4E5, - SkipBack1048 = 0x4E6, - TableStackBelow20 = 0x4E7, - Textbox16 = 0x4E8, - TextboxRotate9020 = 0x4E9, - TextboxRotate9024 = 0x4EA, - BoardGames20 = 0x4EB, - BuildingHome16 = 0x4EC, - BuildingHome20 = 0x4ED, - BuildingHome24 = 0x4EE, - ColorFill16 = 0x4EF, - ColorFill28 = 0x4F0, - DecimalArrowLeft20 = 0x4F1, - DecimalArrowRight20 = 0x4F2, - DeleteArrowBack20 = 0x4F3, - DeleteDismiss20 = 0x4F4, - DesktopEdit20 = 0x4F5, - DesktopEdit24 = 0x4F6, - DesktopMac20 = 0x4F7, - DesktopMac24 = 0x4F8, - DesktopSync20 = 0x4F9, - DesktopSync24 = 0x4FA, - DeveloperBoardSearch24 = 0x4FB, - DeviceEq20 = 0x4FC, - Diagram20 = 0x4FD, - DialpadOff20 = 0x4FE, - DismissSquareMultiple20 = 0x4FF, - DividerShort16 = 0x500, - DividerShort20 = 0x501, - Dock20 = 0x502, - DockRow20 = 0x503, - DocumentBulletListOff20 = 0x504, - DocumentCheckmark20 = 0x505, - DocumentChevronDouble20 = 0x506, - DocumentCss20 = 0x507, - DocumentFooter20 = 0x508, - DocumentFooterDismiss20 = 0x509, - DocumentHeader20 = 0x50A, - DocumentHeaderArrowDown20 = 0x50B, - DocumentHeaderArrowDown24 = 0x50C, - DocumentHeaderDismiss20 = 0x50D, - DocumentJavascript20 = 0x50E, - DocumentLandscapeData20 = 0x50F, - DocumentLandscapeSplit24 = 0x510, - DoubleTapSwipeDown20 = 0x511, - DoubleTapSwipeDown24 = 0x512, - DoubleTapSwipeUp20 = 0x513, - DoubleTapSwipeUp24 = 0x514, - LocationAdd16 = 0x515, - LocationAdd20 = 0x516, - LocationAdd24 = 0x517, - MathSymbols16 = 0x518, - MathSymbols20 = 0x519, - MathSymbols24 = 0x51A, - MathSymbols28 = 0x51B, - MathSymbols32 = 0x51C, - MathSymbols48 = 0x51D, - Password16 = 0x51E, - Password20 = 0x51F, - PeopleProhibited24 = 0x520, - StickerAdd20 = 0x521, - SubtractSquare20 = 0x522, - System20 = 0x523, - TableAdd16 = 0x524, - TableAdd28 = 0x525, - TableCellEdit16 = 0x526, - TableCellEdit20 = 0x527, - TableCellEdit28 = 0x528, - TableCellsMerge16 = 0x529, - TableCellsMerge28 = 0x52A, - TableCellsSplit16 = 0x52B, - TableCellsSplit28 = 0x52C, - TableDeleteColumn16 = 0x52D, - TableDeleteColumn28 = 0x52E, - TableDeleteRow16 = 0x52F, - TableDeleteRow28 = 0x530, - TableDismiss16 = 0x531, - TableDismiss28 = 0x532, - TableEdit16 = 0x533, - TableEdit20 = 0x534, - TableEdit28 = 0x535, - TableFreezeColumn16 = 0x536, - TableFreezeColumn20 = 0x537, - TableFreezeColumn28 = 0x538, - TableFreezeColumnAndRow16 = 0x539, - TableFreezeColumnAndRow20 = 0x53A, - TableFreezeColumnAndRow28 = 0x53B, - TableFreezeRow16 = 0x53C, - TableFreezeRow20 = 0x53D, - TableFreezeRow28 = 0x53E, - TableInsertColumn16 = 0x53F, - TableInsertColumn20 = 0x540, - TableInsertColumn28 = 0x541, - TableInsertRow16 = 0x542, - TableInsertRow20 = 0x543, - TableInsertRow28 = 0x544, - TableLightning16 = 0x545, - TableLightning28 = 0x546, - TableLink16 = 0x547, - TableLink28 = 0x548, - TableMoveAbove16 = 0x549, - TableMoveAbove20 = 0x54A, - TableMoveAbove28 = 0x54B, - TableMoveBelow16 = 0x54C, - TableMoveBelow20 = 0x54D, - TableMoveBelow28 = 0x54E, - TableMoveLeft16 = 0x54F, - TableMoveLeft20 = 0x550, - TableMoveLeft28 = 0x551, - TableMoveRight16 = 0x552, - TableMoveRight20 = 0x553, - TableMoveRight28 = 0x554, - TableResizeColumn16 = 0x555, - TableResizeColumn20 = 0x556, - TableResizeColumn28 = 0x557, - TableResizeRow16 = 0x558, - TableResizeRow20 = 0x559, - TableResizeRow28 = 0x55A, - TableSettings16 = 0x55B, - TableSettings20 = 0x55C, - TableSettings28 = 0x55D, - TableStackAbove16 = 0x55E, - TableStackAbove28 = 0x55F, - TableStackBelow16 = 0x560, - TableStackBelow28 = 0x561, - TableStackLeft16 = 0x562, - TableStackLeft28 = 0x563, - TableStackRight16 = 0x564, - TableStackRight28 = 0x565, - TableSwitch16 = 0x566, - TableSwitch20 = 0x567, - TableSwitch28 = 0x568, - TabletSpeaker20 = 0x569, - TextAlignDistributedEvenly20 = 0x56A, - TextAlignDistributedVertical20 = 0x56B, - TextAlignJustifyLow20 = 0x56C, - TextContinuous20 = 0x56D, - TextboxAlignBottomRotate9020 = 0x56E, - TextboxAlignMiddleRotate9020 = 0x56F, - TextboxAlignTopRotate9020 = 0x570, - TextboxMore20 = 0x571, - VideoChat16 = 0x572, - VideoChat20 = 0x573, - VideoChat24 = 0x574, - ArrowParagraph20 = 0x575, - ClipboardEdit20 = 0x576, - ClipboardNote20 = 0x577, - DocumentMention16 = 0x578, - DocumentMention20 = 0x579, - DocumentMention24 = 0x57A, - DocumentMention28 = 0x57B, - DocumentMention48 = 0x57C, - DocumentSplitHintOff16 = 0x57D, - DocumentSplitHintOff20 = 0x57E, - DoorTag20 = 0x57F, - DoubleSwipeDown20 = 0x580, - DoubleSwipeUp20 = 0x581, - Drag20 = 0x582, - DrinkToGo20 = 0x583, - DriveTrain20 = 0x584, - DualScreenAdd20 = 0x585, - DualScreenArrowRight20 = 0x586, - DualScreenArrowUp20 = 0x587, - DualScreenClock20 = 0x588, - DualScreenClosedAlert20 = 0x589, - DualScreenDesktop20 = 0x58A, - DualScreenDismiss20 = 0x58B, - DualScreenGroup20 = 0x58C, - DualScreenHeader20 = 0x58D, - DualScreenLock20 = 0x58E, - DualScreenMirror20 = 0x58F, - DualScreenPagination20 = 0x590, - DualScreenSettings20 = 0x591, - DualScreenSpan20 = 0x592, - DualScreenSpeaker20 = 0x593, - DualScreenStatusBar20 = 0x594, - DualScreenTablet20 = 0x595, - DualScreenUpdate20 = 0x596, - DualScreenVerticalScroll20 = 0x597, - DualScreenVibrate20 = 0x598, - EditSettings20 = 0x599, - Engine20 = 0x59A, - EraserMedium20 = 0x59B, - EraserSegment20 = 0x59C, - EraserSmall20 = 0x59D, - EraserTool20 = 0x59E, - ExtendedDock20 = 0x59F, - FastAcceleration20 = 0x5A0, - FilterSync20 = 0x5A1, - Fingerprint20 = 0x5A2, - FixedWidth20 = 0x5A3, - FlashAuto20 = 0x5A4, - FlashOff20 = 0x5A5, - FlashlightOff20 = 0x5A6, - Fluent20 = 0x5A7, - FormNew20 = 0x5A8, - Fps96020 = 0x5A9, - FullScreenMinimize16 = 0x5AA, - FullScreenMinimize20 = 0x5AB, - Gas20 = 0x5AC, - GasPump20 = 0x5AD, - Gavel20 = 0x5AE, - Gesture20 = 0x5AF, - GiftCard24 = 0x5B0, - GlanceDefault12 = 0x5B1, - GlanceHorizontal24 = 0x5B2, - GlobeAdd20 = 0x5B3, - GlobeDesktop20 = 0x5B4, - GroupDismiss20 = 0x5B5, - GroupList20 = 0x5B6, - GroupReturn20 = 0x5B7, - GuestAdd20 = 0x5B8, - HandDraw20 = 0x5B9, - HomeAdd20 = 0x5BA, - MailDismiss28 = 0x5BB, - MailInboxAll20 = 0x5BC, - MailInboxArrowRight20 = 0x5BD, - MailList16 = 0x5BE, - MailMultiple28 = 0x5BF, - MailOff20 = 0x5C0, - MicSettings20 = 0x5C1, - NavigationUnread20 = 0x5C2, - New20 = 0x5C3, - Notebook20 = 0x5C4, - NotebookAdd20 = 0x5C5, - NotebookError20 = 0x5C6, - NotebookLightning20 = 0x5C7, - NotebookQuestionMark20 = 0x5C8, - NumberSymbolDismiss20 = 0x5C9, - Pair20 = 0x5CA, - Patient20 = 0x5CB, - PauseOff20 = 0x5CC, - PauseSettings16 = 0x5CD, - PeopleSync28 = 0x5CE, - PhoneAdd20 = 0x5CF, - PhoneDismiss20 = 0x5D0, - PhoneLock20 = 0x5D1, - PhonePageHeader20 = 0x5D2, - PhonePagination20 = 0x5D3, - PhoneScreenTime20 = 0x5D4, - PhoneStatusBar20 = 0x5D5, - PhoneUpdate20 = 0x5D6, - PhoneVerticalScroll20 = 0x5D7, - PhoneVibrate20 = 0x5D8, - PhotoFilter20 = 0x5D9, - Pi20 = 0x5DA, - PortHdmi20 = 0x5DB, - Predictions20 = 0x5DC, - PulseSquare20 = 0x5DD, - Remote20 = 0x5DE, - Reorder20 = 0x5DF, - ResizeVideo20 = 0x5E0, - RotateLeft20 = 0x5E1, - Router20 = 0x5E2, - Scan20 = 0x5E3, - ScanTable20 = 0x5E4, - ScanText20 = 0x5E5, - SearchSquare20 = 0x5E6, - ServiceBell20 = 0x5E7, - ShiftsAdd20 = 0x5E8, - ShiftsProhibited20 = 0x5E9, - ShiftsQuestionMark20 = 0x5EA, - SlideGrid20 = 0x5EB, - SlideSettings20 = 0x5EC, - SlideTransition20 = 0x5ED, - Spacebar20 = 0x5EE, - SpeakerSettings20 = 0x5EF, - SpeakerSettings28 = 0x5F0, - StarArrowRightEnd20 = 0x5F1, - StarArrowRightStart20 = 0x5F2, - Storage20 = 0x5F3, - SubGrid20 = 0x5F4, - TextColorGa20 = 0x5F5, - TextDensity16 = 0x5F6, - TextDensity20 = 0x5F7, - VideoPersonOff20 = 0x5F8, - VoicemailArrowBack20 = 0x5F9, - VoicemailArrowForward20 = 0x5FA, - VoicemailArrowSubtract20 = 0x5FB, - WebAsset20 = 0x5FC, - Archive32 = 0x5FD, - ArchiveSettings24 = 0x5FE, - ArrowEnter20 = 0x5FF, - ArrowExit20 = 0x600, - ArrowJoin20 = 0x601, - ArrowTrendingDown16 = 0x602, - ArrowTrendingDown20 = 0x603, - ArrowTrendingDown24 = 0x604, - BookTemplate20 = 0x605, - BorderLeftRight20 = 0x606, - BorderLeftRight24 = 0x607, - BuildingRetailMore20 = 0x608, - CalendarAdd16 = 0x609, - CalendarAdd28 = 0x60A, - Cellular3g20 = 0x60B, - Cellular4g20 = 0x60C, - Cellular5g20 = 0x60D, - Checkbox120 = 0x60E, - Checkbox220 = 0x60F, - CheckmarkNote20 = 0x610, - CodeText20 = 0x611, - CodeTextEdit20 = 0x612, - Column20 = 0x613, - CubeAdd20 = 0x614, - CubeQuick16 = 0x615, - CubeQuick20 = 0x616, - CubeQuick24 = 0x617, - CubeQuick28 = 0x618, - DatabaseArrowDown20 = 0x619, - DatabaseArrowRight20 = 0x61A, - DatabaseArrowUp20 = 0x61B, - DatabaseLightning20 = 0x61C, - DatabasePlugConnected20 = 0x61D, - DatabaseWarning20 = 0x61E, - DatabaseWindow20 = 0x61F, - DeveloperBoardLightning20 = 0x620, - DeveloperBoardLightningToolbox20 = 0x621, - Edit28 = 0x622, - Edit48 = 0x623, - EditOff28 = 0x624, - EditOff32 = 0x625, - EditOff48 = 0x626, - EditProhibited16 = 0x627, - EditProhibited20 = 0x628, - EditProhibited24 = 0x629, - EditProhibited28 = 0x62A, - EditProhibited32 = 0x62B, - EditProhibited48 = 0x62C, - EmojiEdit16 = 0x62D, - EmojiEdit20 = 0x62E, - EmojiEdit24 = 0x62F, - EmojiEdit28 = 0x630, - EmojiEdit48 = 0x631, - FilterAdd20 = 0x632, - FlashAdd20 = 0x633, - FlashFlow16 = 0x634, - FlashFlow20 = 0x635, - FlashFlow24 = 0x636, - FlashPlay20 = 0x637, - FolderArrowLeft16 = 0x638, - FolderArrowLeft20 = 0x639, - FolderArrowLeft24 = 0x63A, - FolderArrowLeft28 = 0x63B, - FolderArrowLeft32 = 0x63C, - GaugeAdd20 = 0x63D, - HandDraw16 = 0x63E, - HardDrive20 = 0x63F, - Hdr20 = 0x640, - HdrOff20 = 0x641, - HomeDatabase20 = 0x642, - ImageAdd20 = 0x643, - ImageArrowBack20 = 0x644, - ImageArrowCounterclockwise20 = 0x645, - ImageArrowForward20 = 0x646, - ImageGlobe20 = 0x647, - ImageReflection20 = 0x648, - ImageShadow20 = 0x649, - Incognito20 = 0x64A, - KeyCommand20 = 0x64B, - KeyCommand24 = 0x64C, - Keyboard12320 = 0x64D, - KeyboardDock20 = 0x64E, - KeyboardLayoutFloat20 = 0x64F, - KeyboardLayoutOneHandedLeft20 = 0x650, - KeyboardLayoutResize20 = 0x651, - KeyboardLayoutSplit20 = 0x652, - KeyboardShiftUppercase16 = 0x653, - KeyboardShiftUppercase20 = 0x654, - KeyboardTab20 = 0x655, - LauncherSettings20 = 0x656, - LightbulbCircle20 = 0x657, - LineStyle20 = 0x658, - LinkToolbox20 = 0x659, - LocationAddLeft20 = 0x65A, - LocationAddRight20 = 0x65B, - LocationAddUp20 = 0x65C, - LocationDismiss20 = 0x65D, - MailAllRead16 = 0x65E, - MailAllRead24 = 0x65F, - MailAllRead28 = 0x660, - MailList20 = 0x661, - MailList24 = 0x662, - MailList28 = 0x663, - MailReadMultiple16 = 0x664, - MailReadMultiple24 = 0x665, - MailReadMultiple28 = 0x666, - MathFormatProfessional20 = 0x667, - MathFormula20 = 0x668, - MentionArrowDown20 = 0x669, - MentionBrackets20 = 0x66A, - MusicNoteOff120 = 0x66B, - MusicNoteOff124 = 0x66C, - MusicNoteOff216 = 0x66D, - MusicNoteOff220 = 0x66E, - MusicNoteOff224 = 0x66F, - NavigationLocationTarget20 = 0x670, - NavigationPlay20 = 0x671, - NumberCircle116 = 0x672, - NumberCircle120 = 0x673, - NumberCircle124 = 0x674, - PanelLeftContract28 = 0x675, - PanelLeftExpand24 = 0x676, - PanelLeftExpand28 = 0x677, - PanelLeftFocusRight16 = 0x678, - PanelLeftFocusRight20 = 0x679, - PanelLeftFocusRight24 = 0x67A, - PanelLeftFocusRight28 = 0x67B, - Pen16 = 0x67C, - Pen20 = 0x67D, - Pen24 = 0x67E, - Pen28 = 0x67F, - Pen32 = 0x680, - Pen48 = 0x681, - PenOff16 = 0x682, - PenOff20 = 0x683, - PenOff24 = 0x684, - PenOff28 = 0x685, - PenOff32 = 0x686, - PenOff48 = 0x687, - PenProhibited16 = 0x688, - PenProhibited20 = 0x689, - PenProhibited24 = 0x68A, - PenProhibited28 = 0x68B, - PenProhibited32 = 0x68C, - PenProhibited48 = 0x68D, - PersonKey20 = 0x68E, - PhoneLinkSetup20 = 0x68F, - Pipeline20 = 0x690, - PipelineAdd20 = 0x691, - PipelinePlay20 = 0x692, - PlaySettings20 = 0x693, - PlugConnectedAdd20 = 0x694, - PlugConnectedCheckmark20 = 0x695, - PresenceAvailable20 = 0x696, - PresenceAvailable24 = 0x697, - PresenceAway20 = 0x698, - PresenceAway24 = 0x699, - PresenceBusy20 = 0x69A, - PresenceBusy24 = 0x69B, - PresenceDnd20 = 0x69C, - PresenceDnd24 = 0x69D, - ProhibitedNote20 = 0x69E, - PuzzleCubePiece20 = 0x69F, - Ram20 = 0x6A0, - ReceiptSearch20 = 0x6A1, - RectanglePortraitLocationTarget20 = 0x6A2, - SaveImage20 = 0x6A3, - Scan16 = 0x6A4, - ServerMultiple20 = 0x6A5, - ServerPlay20 = 0x6A6, - ShieldPerson20 = 0x6A7, - ShieldPersonAdd20 = 0x6A8, - SplitHint20 = 0x6A9, - SquaresNested20 = 0x6AA, - StreamInput20 = 0x6AB, - StreamInputOutput20 = 0x6AC, - StreamOutput20 = 0x6AD, - TableBottomRow16 = 0x6AE, - TableBottomRow20 = 0x6AF, - TableBottomRow24 = 0x6B0, - TableBottomRow28 = 0x6B1, - TableBottomRow32 = 0x6B2, - TableBottomRow48 = 0x6B3, - TableChecker20 = 0x6B4, - TableCopy20 = 0x6B5, - TableImage20 = 0x6B6, - TableMultiple20 = 0x6B7, - TableSearch20 = 0x6B8, - TableSplit20 = 0x6B9, - TaskListSquareDatabase20 = 0x6BA, - TextBulletListCheckmark20 = 0x6BB, - TextBulletListDismiss20 = 0x6BC, - TextBulletListSquareClock20 = 0x6BD, - TextBulletListSquarePerson20 = 0x6BE, - TextBulletListSquareSearch20 = 0x6BF, - TextBulletListSquareSettings20 = 0x6C0, - TextBulletListSquareShield20 = 0x6C1, - TextBulletListSquareToolbox20 = 0x6C2, - TextDensity24 = 0x6C3, - TextDensity28 = 0x6C4, - TextExpand20 = 0x6C5, - TimerOff20 = 0x6C6, - Triangle16 = 0x6C7, - Triangle20 = 0x6C8, - TriangleDown12 = 0x6C9, - TriangleDown16 = 0x6CA, - TriangleDown20 = 0x6CB, - TriangleDown32 = 0x6CC, - TriangleDown48 = 0x6CD, - TriangleLeft12 = 0x6CE, - TriangleLeft16 = 0x6CF, - TriangleLeft20 = 0x6D0, - TriangleLeft32 = 0x6D1, - TriangleLeft48 = 0x6D2, - TriangleRight12 = 0x6D3, - TriangleRight16 = 0x6D4, - TriangleRight20 = 0x6D5, - TriangleRight32 = 0x6D6, - TriangleRight48 = 0x6D7, - VideoChat28 = 0x6D8, - VideoChat32 = 0x6D9, - VideoChat48 = 0x6DA, - VirtualNetwork20 = 0x6DB, - VirtualNetworkToolbox20 = 0x6DC, - Wallet16 = 0x6DD, - WalletCreditCard16 = 0x6DE, - WalletCreditCard20 = 0x6DF, - WalletCreditCard24 = 0x6E0, - WalletCreditCard32 = 0x6E1, - WindowBulletList20 = 0x6E2, - WindowBulletListAdd20 = 0x6E3, - WindowDatabase20 = 0x6E4, - WindowLocationTarget20 = 0x6E5, - WindowMultipleSwap20 = 0x6E6, - WindowPlay20 = 0x6E7, - WindowSettings20 = 0x6E8, - WindowText20 = 0x6E9, - ArchiveArrowBack16 = 0x6EA, - ArchiveArrowBack20 = 0x6EB, - ArchiveArrowBack24 = 0x6EC, - ArchiveArrowBack28 = 0x6ED, - ArchiveArrowBack32 = 0x6EE, - ArchiveArrowBack48 = 0x6EF, - CircleMultipleSubtractCheckmark20 = 0x6F0, - DatabaseMultiple20 = 0x6F1, - ImageMultipleOff16 = 0x6F2, - Keyboard16 = 0x6F3, - LockMultiple20 = 0x6F4, - Lottery20 = 0x6F5, - MailWarning20 = 0x6F6, - MailWarning24 = 0x6F7, - MatchAppLayout20 = 0x6F8, - MathFormatLinear20 = 0x6F9, - MegaphoneOff16 = 0x6FA, - MegaphoneOff20 = 0x6FB, - MegaphoneOff28 = 0x6FC, - Merge20 = 0x6FD, - MicOff32 = 0x6FE, - MobileOptimized20 = 0x6FF, - NetworkCheck20 = 0x700, - NoteAdd28 = 0x701, - NoteAdd48 = 0x702, - NotebookSync20 = 0x703, - OrganizationHorizontal20 = 0x704, - PaintBrushArrowDown20 = 0x705, - PaintBrushArrowUp20 = 0x706, - Pentagon20 = 0x707, - PersonAccounts20 = 0x708, - PersonSubtract20 = 0x709, - PinOff28 = 0x70A, - PinOff32 = 0x70B, - PointScan20 = 0x70C, - PortUsbA20 = 0x70D, - QuestionCircle12 = 0x70E, - RowTriple20 = 0x70F, - Scratchpad20 = 0x710, - ShiftsAvailability20 = 0x711, - SkipForwardTab20 = 0x712, - Sleep20 = 0x713, - SlideMultiple20 = 0x714, - SlideMultipleArrowRight20 = 0x715, - SlideSize20 = 0x716, - SoundWaveCircle20 = 0x717, - SportAmericanFootball20 = 0x718, - SportBaseball20 = 0x719, - SportHockey20 = 0x71A, - SquareHintArrowBack20 = 0x71B, - SquareShadow20 = 0x71C, - TabArrowLeft20 = 0x71D, - TabProhibited20 = 0x71E, - TextCollapse20 = 0x71F, - TextMore20 = 0x720, - TimeAndWeather20 = 0x721, - Transmission20 = 0x722, - VideoPlayPause20 = 0x723, + AccessTime20 = 0xE000, + Accessibility32 = 0xE001, + Accessibility48 = 0xE002, + AccessibilityCheckmark20 = 0xE003, + AccessibilityCheckmark24 = 0xE004, + AddCircle16 = 0xE005, + AddCircle32 = 0xE006, + AddSquare20 = 0xE007, + AddSquareMultiple16 = 0xE008, + AddSquareMultiple20 = 0xE009, + AddSubtractCircle16 = 0xE00A, + AddSubtractCircle20 = 0xE00B, + AddSubtractCircle24 = 0xE00C, + AddSubtractCircle28 = 0xE00D, + AddSubtractCircle48 = 0xE00E, + Album20 = 0xE00F, + Album24 = 0xE010, + AlbumAdd20 = 0xE011, + AlbumAdd24 = 0xE012, + Alert12 = 0xE013, + Alert16 = 0xE014, + Alert32 = 0xE015, + Alert48 = 0xE016, + AlertBadge16 = 0xE017, + AlertBadge20 = 0xE018, + AlertBadge24 = 0xE019, + AlertOn20 = 0xE01A, + AlertSnooze12 = 0xE01B, + AlertSnooze16 = 0xE01C, + AlertUrgent16 = 0xE01D, + AlignBottom16 = 0xE01E, + AlignBottom20 = 0xE01F, + AlignBottom24 = 0xE020, + AlignBottom28 = 0xE021, + AlignBottom32 = 0xE022, + AlignBottom48 = 0xE023, + AlignCenterHorizontal16 = 0xE024, + AlignCenterHorizontal20 = 0xE025, + AlignCenterHorizontal24 = 0xE026, + AlignCenterHorizontal28 = 0xE027, + AlignCenterHorizontal32 = 0xE028, + AlignCenterHorizontal48 = 0xE029, + AlignCenterVertical16 = 0xE02A, + AlignCenterVertical20 = 0xE02B, + AlignCenterVertical24 = 0xE02C, + AlignCenterVertical28 = 0xE02D, + AlignCenterVertical32 = 0xE02E, + AlignCenterVertical48 = 0xE02F, + AlignEndHorizontal20 = 0xE030, + AlignEndVertical20 = 0xE031, + AlignLeft16 = 0xE032, + AlignLeft20 = 0xE033, + AlignLeft24 = 0xE034, + AlignLeft28 = 0xE035, + AlignLeft32 = 0xE036, + AlignLeft48 = 0xE037, + AlignRight16 = 0xE038, + AlignRight20 = 0xE039, + AlignRight24 = 0xE03A, + AlignRight28 = 0xE03B, + AlignRight32 = 0xE03C, + AlignRight48 = 0xE03D, + AlignSpaceAroundHorizontal20 = 0xE03E, + AlignSpaceAroundVertical20 = 0xE03F, + AlignSpaceBetweenHorizontal20 = 0xE040, + AlignSpaceBetweenVertical20 = 0xE041, + AlignSpaceEvenlyHorizontal20 = 0xE042, + AlignSpaceEvenlyVertical20 = 0xE043, + AlignSpaceFitVertical20 = 0xE044, + AlignStartHorizontal20 = 0xE045, + AlignStartVertical20 = 0xE046, + AlignStretchHorizontal20 = 0xE047, + AlignStretchVertical20 = 0xE048, + AlignTop16 = 0xE049, + AlignTop20 = 0xE04A, + AlignTop24 = 0xE04B, + AlignTop28 = 0xE04C, + AlignTop32 = 0xE04D, + AlignTop48 = 0xE04E, + AnimalDog16 = 0xE04F, + AnimalRabbit16 = 0xE050, + AnimalRabbit20 = 0xE051, + AnimalRabbit24 = 0xE052, + AnimalRabbit28 = 0xE053, + AnimalTurtle16 = 0xE054, + AnimalTurtle20 = 0xE055, + AnimalTurtle24 = 0xE056, + AnimalTurtle28 = 0xE057, + AppFolder16 = 0xE058, + AppFolder28 = 0xE059, + AppFolder32 = 0xE05A, + AppFolder48 = 0xE05B, + AppGeneric20 = 0xE05C, + AppRecent20 = 0xE05D, + AppTitle20 = 0xE05E, + ApprovalsApp16 = 0xE05F, + ApprovalsApp20 = 0xE060, + ApprovalsApp32 = 0xE061, + AppsAddIn16 = 0xE062, + AppsAddIn28 = 0xE063, + AppsListDetail20 = 0xE064, + AppsListDetail24 = 0xE065, + Archive32 = 0xE066, + ArchiveArrowBack16 = 0xE067, + ArchiveArrowBack20 = 0xE068, + ArchiveArrowBack24 = 0xE069, + ArchiveArrowBack28 = 0xE06A, + ArchiveArrowBack32 = 0xE06B, + ArchiveArrowBack48 = 0xE06C, + ArchiveMultiple16 = 0xE06D, + ArchiveMultiple20 = 0xE06E, + ArchiveMultiple24 = 0xE06F, + ArchiveSettings20 = 0xE070, + ArchiveSettings24 = 0xE071, + ArchiveSettings28 = 0xE072, + ArrowAutofitContent20 = 0xE073, + ArrowAutofitContent24 = 0xE074, + ArrowAutofitDown20 = 0xE075, + ArrowAutofitDown24 = 0xE076, + ArrowAutofitHeight20 = 0xE077, + ArrowAutofitHeightDotted20 = 0xE078, + ArrowAutofitHeightDotted24 = 0xE079, + ArrowAutofitUp20 = 0xE07A, + ArrowAutofitUp24 = 0xE07B, + ArrowAutofitWidth20 = 0xE07C, + ArrowAutofitWidthDotted20 = 0xE07D, + ArrowAutofitWidthDotted24 = 0xE07E, + ArrowBetweenDown20 = 0xE07F, + ArrowBetweenDown24 = 0xE080, + ArrowBetweenUp20 = 0xE081, + ArrowBidirectionalUpDown12 = 0xE082, + ArrowBidirectionalUpDown16 = 0xE083, + ArrowBidirectionalUpDown20 = 0xE084, + ArrowBidirectionalUpDown24 = 0xE085, + ArrowBounce16 = 0xE086, + ArrowBounce20 = 0xE087, + ArrowBounce24 = 0xE088, + ArrowCircleDown12 = 0xE089, + ArrowCircleDown16 = 0xE08A, + ArrowCircleDown28 = 0xE08B, + ArrowCircleDown32 = 0xE08C, + ArrowCircleDown48 = 0xE08D, + ArrowCircleDownRight16 = 0xE08E, + ArrowCircleDownRight20 = 0xE08F, + ArrowCircleDownRight24 = 0xE090, + ArrowCircleDownUp20 = 0xE091, + ArrowCircleLeft12 = 0xE092, + ArrowCircleLeft16 = 0xE093, + ArrowCircleLeft20 = 0xE094, + ArrowCircleLeft24 = 0xE095, + ArrowCircleLeft28 = 0xE096, + ArrowCircleLeft32 = 0xE097, + ArrowCircleLeft48 = 0xE098, + ArrowCircleRight12 = 0xE099, + ArrowCircleRight16 = 0xE09A, + ArrowCircleRight20 = 0xE09B, + ArrowCircleRight24 = 0xE09C, + ArrowCircleRight28 = 0xE09D, + ArrowCircleRight32 = 0xE09E, + ArrowCircleRight48 = 0xE09F, + ArrowCircleUp12 = 0xE0A0, + ArrowCircleUp16 = 0xE0A1, + ArrowCircleUp20 = 0xE0A2, + ArrowCircleUp24 = 0xE0A3, + ArrowCircleUp28 = 0xE0A4, + ArrowCircleUp32 = 0xE0A5, + ArrowCircleUp48 = 0xE0A6, + ArrowCircleUpLeft20 = 0xE0A7, + ArrowCircleUpLeft24 = 0xE0A8, + ArrowClockwise12 = 0xE0A9, + ArrowClockwise16 = 0xE0AA, + ArrowClockwise28 = 0xE0AB, + ArrowClockwise32 = 0xE0AC, + ArrowClockwise48 = 0xE0AD, + ArrowClockwiseDashes20 = 0xE0AE, + ArrowClockwiseDashes24 = 0xE0AF, + ArrowCollapseAll20 = 0xE0B0, + ArrowCollapseAll24 = 0xE0B1, + ArrowCounterclockwise12 = 0xE0B2, + ArrowCounterclockwise16 = 0xE0B3, + ArrowCounterclockwise32 = 0xE0B4, + ArrowCounterclockwise48 = 0xE0B5, + ArrowCounterclockwiseDashes20 = 0xE0B6, + ArrowCounterclockwiseDashes24 = 0xE0B7, + ArrowCurveDownLeft16 = 0xE0B8, + ArrowCurveDownLeft24 = 0xE0B9, + ArrowCurveDownLeft28 = 0xE0BA, + ArrowDownLeft20 = 0xE0BB, + ArrowDownLeft32 = 0xE0BC, + ArrowDownLeft48 = 0xE0BD, + ArrowEject20 = 0xE0BE, + ArrowEnter20 = 0xE0BF, + ArrowEnterLeft20 = 0xE0C0, + ArrowEnterLeft24 = 0xE0C1, + ArrowEnterUp20 = 0xE0C2, + ArrowEnterUp24 = 0xE0C3, + ArrowExit20 = 0xE0C4, + ArrowExpand20 = 0xE0C5, + ArrowExportLtr16 = 0xE0C6, + ArrowExportLtr20 = 0xE0C7, + ArrowExportLtr24 = 0xE0C8, + ArrowExportRtl16 = 0xE0C9, + ArrowExportRtl24 = 0xE0CA, + ArrowExportUp20 = 0xE0CB, + ArrowExportUp24 = 0xE0CC, + ArrowFit20 = 0xE0CD, + ArrowFitIn16 = 0xE0CE, + ArrowFitIn20 = 0xE0CF, + ArrowForward28 = 0xE0D0, + ArrowForward48 = 0xE0D1, + ArrowForwardDownLightning20 = 0xE0D2, + ArrowForwardDownLightning24 = 0xE0D3, + ArrowForwardDownPerson20 = 0xE0D4, + ArrowForwardDownPerson24 = 0xE0D5, + ArrowJoin20 = 0xE0D6, + ArrowLeft12 = 0xE0D7, + ArrowMaximize32 = 0xE0D8, + ArrowMaximize48 = 0xE0D9, + ArrowMaximizeVertical48 = 0xE0DA, + ArrowMinimizeVertical20 = 0xE0DB, + ArrowMoveInward20 = 0xE0DC, + ArrowNext12 = 0xE0DD, + ArrowOutlineUpRight20 = 0xE0DE, + ArrowOutlineUpRight24 = 0xE0DF, + ArrowOutlineUpRight32 = 0xE0E0, + ArrowOutlineUpRight48 = 0xE0E1, + ArrowParagraph20 = 0xE0E2, + ArrowPrevious12 = 0xE0E3, + ArrowRedo16 = 0xE0E4, + ArrowRedo28 = 0xE0E5, + ArrowReply28 = 0xE0E6, + ArrowReplyAll28 = 0xE0E7, + ArrowReset32 = 0xE0E8, + ArrowReset48 = 0xE0E9, + ArrowRight12 = 0xE0EA, + ArrowRight16 = 0xE0EB, + ArrowRotateClockwise16 = 0xE0EC, + ArrowRouting20 = 0xE0ED, + ArrowRouting24 = 0xE0EE, + ArrowRoutingRectangleMultiple20 = 0xE0EF, + ArrowRoutingRectangleMultiple24 = 0xE0F0, + ArrowSortDownLines20 = 0xE0F1, + ArrowSortDownLines24 = 0xE0F2, + ArrowSplit16 = 0xE0F3, + ArrowSplit20 = 0xE0F4, + ArrowSplit24 = 0xE0F5, + ArrowSquareDown20 = 0xE0F6, + ArrowSquareDown24 = 0xE0F7, + ArrowStepBack16 = 0xE0F8, + ArrowStepBack20 = 0xE0F9, + ArrowStepIn12 = 0xE0FA, + ArrowStepIn16 = 0xE0FB, + ArrowStepIn20 = 0xE0FC, + ArrowStepIn24 = 0xE0FD, + ArrowStepIn28 = 0xE0FE, + ArrowStepInLeft12 = 0xE0FF, + ArrowStepInLeft16 = 0xE100, + ArrowStepInLeft20 = 0xE101, + ArrowStepInLeft24 = 0xE102, + ArrowStepInLeft28 = 0xE103, + ArrowStepInRight12 = 0xE104, + ArrowStepInRight16 = 0xE105, + ArrowStepInRight20 = 0xE106, + ArrowStepInRight24 = 0xE107, + ArrowStepInRight28 = 0xE108, + ArrowStepOut12 = 0xE109, + ArrowStepOut16 = 0xE10A, + ArrowStepOut20 = 0xE10B, + ArrowStepOut24 = 0xE10C, + ArrowStepOut28 = 0xE10D, + ArrowStepOver16 = 0xE10E, + ArrowStepOver20 = 0xE10F, + ArrowSync16 = 0xE110, + ArrowSyncCheckmark20 = 0xE111, + ArrowSyncCheckmark24 = 0xE112, + ArrowSyncDismiss20 = 0xE113, + ArrowSyncDismiss24 = 0xE114, + ArrowSyncOff16 = 0xE115, + ArrowSyncOff20 = 0xE116, + ArrowTrendingCheckmark20 = 0xE117, + ArrowTrendingCheckmark24 = 0xE118, + ArrowTrendingDown16 = 0xE119, + ArrowTrendingDown20 = 0xE11A, + ArrowTrendingDown24 = 0xE11B, + ArrowTrendingLines20 = 0xE11C, + ArrowTrendingLines24 = 0xE11D, + ArrowTrendingSettings20 = 0xE11E, + ArrowTrendingSettings24 = 0xE11F, + ArrowTrendingText20 = 0xE120, + ArrowTrendingText24 = 0xE121, + ArrowTrendingWrench20 = 0xE122, + ArrowTrendingWrench24 = 0xE123, + ArrowTurnBidirectionalDownRight20 = 0xE124, + ArrowTurnRight20 = 0xE125, + ArrowUndo16 = 0xE126, + ArrowUndo28 = 0xE127, + ArrowUndo32 = 0xE128, + ArrowUndo48 = 0xE129, + ArrowUp12 = 0xE12A, + ArrowUpLeft16 = 0xE12B, + ArrowUpLeft20 = 0xE12C, + ArrowUpLeft48 = 0xE12D, + ArrowUpRight16 = 0xE12E, + ArrowUpRight20 = 0xE12F, + ArrowUpRight32 = 0xE130, + ArrowUpRight48 = 0xE131, + ArrowUpload16 = 0xE132, + ArrowWrap20 = 0xE133, + ArrowWrapOff20 = 0xE134, + ArrowsBidirectional20 = 0xE135, + Attach12 = 0xE136, + AttachArrowRight20 = 0xE137, + AttachArrowRight24 = 0xE138, + AttachText20 = 0xE139, + AttachText24 = 0xE13A, + AutoFitHeight20 = 0xE13B, + AutoFitHeight24 = 0xE13C, + AutoFitWidth20 = 0xE13D, + AutoFitWidth24 = 0xE13E, + Autocorrect20 = 0xE13F, + Backpack12 = 0xE140, + Backpack16 = 0xE141, + Backpack20 = 0xE142, + Backpack24 = 0xE143, + Backpack28 = 0xE144, + Backpack32 = 0xE145, + Backpack48 = 0xE146, + BackpackAdd20 = 0xE147, + BackpackAdd24 = 0xE148, + BackpackAdd28 = 0xE149, + BackpackAdd48 = 0xE14A, + Badge20 = 0xE14B, + Balloon12 = 0xE14C, + Balloon16 = 0xE14D, + Battery1020 = 0xE14E, + Battery1024 = 0xE14F, + BatteryCheckmark20 = 0xE150, + BatteryCheckmark24 = 0xE151, + BatteryWarning20 = 0xE152, + Beach16 = 0xE153, + Beach20 = 0xE154, + Beach24 = 0xE155, + Beach28 = 0xE156, + Beach32 = 0xE157, + Beach48 = 0xE158, + Bed16 = 0xE159, + BezierCurveSquare12 = 0xE15A, + BezierCurveSquare20 = 0xE15B, + BinFull20 = 0xE15C, + BinFull24 = 0xE15D, + Bluetooth28 = 0xE15E, + BluetoothConnected20 = 0xE15F, + BluetoothDisabled20 = 0xE160, + BluetoothSearching20 = 0xE161, + Blur16 = 0xE162, + Blur20 = 0xE163, + Blur24 = 0xE164, + Blur28 = 0xE165, + Board16 = 0xE166, + Board20 = 0xE167, + Board28 = 0xE168, + BoardGames20 = 0xE169, + BoardHeart16 = 0xE16A, + BoardHeart20 = 0xE16B, + BoardHeart24 = 0xE16C, + BoardSplit16 = 0xE16D, + BoardSplit20 = 0xE16E, + BoardSplit24 = 0xE16F, + BoardSplit28 = 0xE170, + BoardSplit48 = 0xE171, + Book20 = 0xE172, + Book24 = 0xE173, + BookAdd20 = 0xE174, + BookAdd24 = 0xE175, + BookArrowClockwise20 = 0xE176, + BookArrowClockwise24 = 0xE177, + BookClock20 = 0xE178, + BookClock24 = 0xE179, + BookCoins20 = 0xE17A, + BookCoins24 = 0xE17B, + BookCompass20 = 0xE17C, + BookCompass24 = 0xE17D, + BookContacts20 = 0xE17E, + BookContacts24 = 0xE17F, + BookContacts28 = 0xE180, + BookContacts32 = 0xE181, + BookDatabase20 = 0xE182, + BookDatabase24 = 0xE183, + BookExclamationMark20 = 0xE184, + BookExclamationMark24 = 0xE185, + BookGlobe20 = 0xE186, + BookInformation20 = 0xE187, + BookInformation24 = 0xE188, + BookLetter20 = 0xE189, + BookLetter24 = 0xE18A, + BookOpen16 = 0xE18B, + BookOpen20 = 0xE18C, + BookOpen24 = 0xE18D, + BookOpen28 = 0xE18E, + BookOpen32 = 0xE18F, + BookOpen48 = 0xE190, + BookOpenGlobe20 = 0xE191, + BookOpenGlobe24 = 0xE192, + BookOpenMicrophone20 = 0xE193, + BookOpenMicrophone24 = 0xE194, + BookOpenMicrophone28 = 0xE195, + BookOpenMicrophone32 = 0xE196, + BookOpenMicrophone48 = 0xE197, + BookPulse20 = 0xE198, + BookPulse24 = 0xE199, + BookQuestionMark20 = 0xE19A, + BookQuestionMark24 = 0xE19B, + BookQuestionMarkRtl20 = 0xE19C, + BookSearch20 = 0xE19D, + BookSearch24 = 0xE19E, + BookStar20 = 0xE19F, + BookStar24 = 0xE1A0, + BookTemplate20 = 0xE1A1, + BookTheta20 = 0xE1A2, + BookTheta24 = 0xE1A3, + BookToolbox24 = 0xE1A4, + Bookmark32 = 0xE1A5, + BookmarkMultiple16 = 0xE1A6, + BookmarkMultiple20 = 0xE1A7, + BookmarkMultiple24 = 0xE1A8, + BookmarkMultiple28 = 0xE1A9, + BookmarkMultiple32 = 0xE1AA, + BookmarkMultiple48 = 0xE1AB, + BookmarkOff20 = 0xE1AC, + BookmarkSearch20 = 0xE1AD, + BookmarkSearch24 = 0xE1AE, + BorderAll16 = 0xE1AF, + BorderAll20 = 0xE1B0, + BorderAll24 = 0xE1B1, + BorderBottom20 = 0xE1B2, + BorderBottom24 = 0xE1B3, + BorderBottomDouble20 = 0xE1B4, + BorderBottomDouble24 = 0xE1B5, + BorderBottomThick20 = 0xE1B6, + BorderBottomThick24 = 0xE1B7, + BorderLeft20 = 0xE1B8, + BorderLeft24 = 0xE1B9, + BorderLeftRight20 = 0xE1BA, + BorderLeftRight24 = 0xE1BB, + BorderNone20 = 0xE1BC, + BorderNone24 = 0xE1BD, + BorderOutside20 = 0xE1BE, + BorderOutside24 = 0xE1BF, + BorderOutsideThick20 = 0xE1C0, + BorderOutsideThick24 = 0xE1C1, + BorderRight20 = 0xE1C2, + BorderRight24 = 0xE1C3, + BorderTop20 = 0xE1C4, + BorderTop24 = 0xE1C5, + BorderTopBottom20 = 0xE1C6, + BorderTopBottom24 = 0xE1C7, + BorderTopBottomDouble20 = 0xE1C8, + BorderTopBottomDouble24 = 0xE1C9, + BorderTopBottomThick20 = 0xE1CA, + BorderTopBottomThick24 = 0xE1CB, + Bot20 = 0xE1CC, + BotAdd20 = 0xE1CD, + Box16 = 0xE1CE, + Box20 = 0xE1CF, + Box24 = 0xE1D0, + BoxArrowLeft20 = 0xE1D1, + BoxArrowLeft24 = 0xE1D2, + BoxArrowUp20 = 0xE1D3, + BoxArrowUp24 = 0xE1D4, + BoxCheckmark20 = 0xE1D5, + BoxCheckmark24 = 0xE1D6, + BoxDismiss20 = 0xE1D7, + BoxDismiss24 = 0xE1D8, + BoxEdit20 = 0xE1D9, + BoxEdit24 = 0xE1DA, + BoxMultiple20 = 0xE1DB, + BoxMultiple24 = 0xE1DC, + BoxMultipleArrowLeft20 = 0xE1DD, + BoxMultipleArrowLeft24 = 0xE1DE, + BoxMultipleArrowRight20 = 0xE1DF, + BoxMultipleArrowRight24 = 0xE1E0, + BoxMultipleCheckmark20 = 0xE1E1, + BoxMultipleCheckmark24 = 0xE1E2, + BoxMultipleSearch20 = 0xE1E3, + BoxMultipleSearch24 = 0xE1E4, + BoxSearch20 = 0xE1E5, + BoxSearch24 = 0xE1E6, + BoxToolbox20 = 0xE1E7, + BoxToolbox24 = 0xE1E8, + Braces20 = 0xE1E9, + Braces24 = 0xE1EA, + BracesVariable20 = 0xE1EB, + BracesVariable24 = 0xE1EC, + Branch20 = 0xE1ED, + BranchCompare16 = 0xE1EE, + BranchCompare20 = 0xE1EF, + BranchCompare24 = 0xE1F0, + BranchFork16 = 0xE1F1, + BranchFork20 = 0xE1F2, + BranchFork24 = 0xE1F3, + BranchForkHint20 = 0xE1F4, + BranchForkHint24 = 0xE1F5, + BranchForkLink20 = 0xE1F6, + BranchForkLink24 = 0xE1F7, + BranchRequest20 = 0xE1F8, + BreakoutRoom20 = 0xE1F9, + BreakoutRoom24 = 0xE1FA, + BreakoutRoom28 = 0xE1FB, + Briefcase12 = 0xE1FC, + Briefcase16 = 0xE1FD, + Briefcase28 = 0xE1FE, + Briefcase32 = 0xE1FF, + Briefcase48 = 0xE200, + BriefcaseMedical16 = 0xE201, + BriefcaseMedical24 = 0xE202, + BriefcaseMedical32 = 0xE203, + BriefcaseOff16 = 0xE204, + BriefcaseOff20 = 0xE205, + BriefcaseOff24 = 0xE206, + BriefcaseOff28 = 0xE207, + BriefcaseOff32 = 0xE208, + BriefcaseOff48 = 0xE209, + BrightnessHigh16 = 0xE20A, + BrightnessHigh20 = 0xE20B, + BrightnessHigh24 = 0xE20C, + BrightnessHigh28 = 0xE20D, + BrightnessHigh32 = 0xE20E, + BrightnessHigh48 = 0xE20F, + BrightnessLow16 = 0xE210, + BrightnessLow20 = 0xE211, + BrightnessLow24 = 0xE212, + BrightnessLow28 = 0xE213, + BrightnessLow32 = 0xE214, + BrightnessLow48 = 0xE215, + BroadActivityFeed16 = 0xE216, + BroadActivityFeed20 = 0xE217, + Broom28 = 0xE218, + Bug16 = 0xE219, + Bug20 = 0xE21A, + Bug24 = 0xE21B, + BugArrowCounterclockwise20 = 0xE21C, + BugProhibited20 = 0xE21D, + Building16 = 0xE21E, + Building20 = 0xE21F, + BuildingBank16 = 0xE220, + BuildingBank20 = 0xE221, + BuildingBank24 = 0xE222, + BuildingBank28 = 0xE223, + BuildingBank48 = 0xE224, + BuildingBankLink16 = 0xE225, + BuildingBankLink20 = 0xE226, + BuildingBankLink24 = 0xE227, + BuildingBankLink28 = 0xE228, + BuildingBankLink48 = 0xE229, + BuildingFactory16 = 0xE22A, + BuildingFactory20 = 0xE22B, + BuildingFactory24 = 0xE22C, + BuildingFactory28 = 0xE22D, + BuildingFactory32 = 0xE22E, + BuildingFactory48 = 0xE22F, + BuildingGovernment20 = 0xE230, + BuildingGovernment24 = 0xE231, + BuildingGovernment32 = 0xE232, + BuildingHome16 = 0xE233, + BuildingHome20 = 0xE234, + BuildingHome24 = 0xE235, + BuildingLighthouse20 = 0xE236, + BuildingMultiple20 = 0xE237, + BuildingMultiple24 = 0xE238, + BuildingRetail20 = 0xE239, + BuildingRetailMoney20 = 0xE23A, + BuildingRetailMoney24 = 0xE23B, + BuildingRetailMore20 = 0xE23C, + BuildingRetailShield20 = 0xE23D, + BuildingRetailShield24 = 0xE23E, + BuildingRetailToolbox20 = 0xE23F, + BuildingRetailToolbox24 = 0xE240, + BuildingShop16 = 0xE241, + BuildingShop20 = 0xE242, + BuildingShop24 = 0xE243, + BuildingSkyscraper16 = 0xE244, + BuildingSkyscraper20 = 0xE245, + BuildingSkyscraper24 = 0xE246, + Calculator24 = 0xE247, + CalculatorArrowClockwise20 = 0xE248, + CalculatorArrowClockwise24 = 0xE249, + CalculatorMultiple20 = 0xE24A, + CalculatorMultiple24 = 0xE24B, + Calendar3Day16 = 0xE24C, + CalendarAdd16 = 0xE24D, + CalendarAdd28 = 0xE24E, + CalendarArrowDown20 = 0xE24F, + CalendarArrowDown24 = 0xE250, + CalendarArrowRight16 = 0xE251, + CalendarArrowRight24 = 0xE252, + CalendarAssistant16 = 0xE253, + CalendarCancel16 = 0xE254, + CalendarChat20 = 0xE255, + CalendarChat24 = 0xE256, + CalendarClock16 = 0xE257, + CalendarDay16 = 0xE258, + CalendarEdit16 = 0xE259, + CalendarEdit20 = 0xE25A, + CalendarEdit24 = 0xE25B, + CalendarEmpty32 = 0xE25C, + CalendarError20 = 0xE25D, + CalendarError24 = 0xE25E, + CalendarInfo20 = 0xE25F, + CalendarLtr12 = 0xE260, + CalendarLtr16 = 0xE261, + CalendarLtr20 = 0xE262, + CalendarLtr24 = 0xE263, + CalendarLtr28 = 0xE264, + CalendarLtr32 = 0xE265, + CalendarLtr48 = 0xE266, + CalendarMail16 = 0xE267, + CalendarMail20 = 0xE268, + CalendarMention20 = 0xE269, + CalendarMultiple28 = 0xE26A, + CalendarMultiple32 = 0xE26B, + CalendarPattern16 = 0xE26C, + CalendarPattern20 = 0xE26D, + CalendarPerson16 = 0xE26E, + CalendarPerson24 = 0xE26F, + CalendarPhone16 = 0xE270, + CalendarPhone20 = 0xE271, + CalendarQuestionMark16 = 0xE272, + CalendarQuestionMark20 = 0xE273, + CalendarQuestionMark24 = 0xE274, + CalendarRtl12 = 0xE275, + CalendarRtl16 = 0xE276, + CalendarRtl20 = 0xE277, + CalendarRtl24 = 0xE278, + CalendarRtl28 = 0xE279, + CalendarRtl32 = 0xE27A, + CalendarRtl48 = 0xE27B, + CalendarSearch20 = 0xE27C, + CalendarSettings16 = 0xE27D, + CalendarStar16 = 0xE27E, + CalendarToolbox20 = 0xE27F, + CalendarToolbox24 = 0xE280, + CalendarWeekNumbers20 = 0xE281, + CalendarWorkWeek28 = 0xE282, + Call16 = 0xE283, + Call20 = 0xE284, + Call24 = 0xE285, + Call28 = 0xE286, + Call32 = 0xE287, + Call48 = 0xE288, + CallAdd16 = 0xE289, + CallAdd20 = 0xE28A, + CallCheckmark24 = 0xE28B, + CallConnecting20 = 0xE28C, + CallDismiss16 = 0xE28D, + CallEnd16 = 0xE28E, + CallExclamation20 = 0xE28F, + CallForward16 = 0xE290, + CallForward20 = 0xE291, + CallForward28 = 0xE292, + CallForward48 = 0xE293, + CallInbound20 = 0xE294, + CallInbound28 = 0xE295, + CallInbound48 = 0xE296, + CallMissed20 = 0xE297, + CallMissed28 = 0xE298, + CallMissed48 = 0xE299, + CallOutbound20 = 0xE29A, + CallOutbound28 = 0xE29B, + CallOutbound48 = 0xE29C, + CallPark16 = 0xE29D, + CallPark20 = 0xE29E, + CallPark28 = 0xE29F, + CallPark48 = 0xE2A0, + CallProhibited16 = 0xE2A1, + CallProhibited20 = 0xE2A2, + CallProhibited24 = 0xE2A3, + CallProhibited28 = 0xE2A4, + CallProhibited48 = 0xE2A5, + CallTransfer16 = 0xE2A6, + CallTransfer20 = 0xE2A7, + CallWarning16 = 0xE2A8, + CallWarning20 = 0xE2A9, + CalligraphyPenCheckmark20 = 0xE2AA, + CalligraphyPenError20 = 0xE2AB, + CalligraphyPenQuestionMark20 = 0xE2AC, + Camera16 = 0xE2AD, + CameraDome16 = 0xE2AE, + CameraDome20 = 0xE2AF, + CameraDome24 = 0xE2B0, + CameraDome28 = 0xE2B1, + CameraDome48 = 0xE2B2, + CameraEdit20 = 0xE2B3, + CameraOff20 = 0xE2B4, + CameraOff24 = 0xE2B5, + CameraSwitch20 = 0xE2B6, + CaretDownRight12 = 0xE2B7, + CaretDownRight16 = 0xE2B8, + CaretDownRight20 = 0xE2B9, + CaretDownRight24 = 0xE2BA, + CaretUp12 = 0xE2BB, + CaretUp16 = 0xE2BC, + CaretUp20 = 0xE2BD, + CaretUp24 = 0xE2BE, + Cart16 = 0xE2BF, + Cart20 = 0xE2C0, + CatchUp16 = 0xE2C1, + CatchUp20 = 0xE2C2, + CatchUp24 = 0xE2C3, + Cellular3g20 = 0xE2C4, + Cellular4g20 = 0xE2C5, + Cellular5g20 = 0xE2C6, + Cellular5g24 = 0xE2C7, + CellularOff20 = 0xE2C8, + CellularOff24 = 0xE2C9, + CellularWarning20 = 0xE2CA, + CellularWarning24 = 0xE2CB, + CenterHorizontal20 = 0xE2CC, + CenterHorizontal24 = 0xE2CD, + CenterVertical20 = 0xE2CE, + CenterVertical24 = 0xE2CF, + Channel28 = 0xE2D0, + Channel48 = 0xE2D1, + ChannelAdd16 = 0xE2D2, + ChannelAdd20 = 0xE2D3, + ChannelAdd24 = 0xE2D4, + ChannelAdd28 = 0xE2D5, + ChannelAdd48 = 0xE2D6, + ChannelAlert16 = 0xE2D7, + ChannelAlert20 = 0xE2D8, + ChannelAlert24 = 0xE2D9, + ChannelAlert28 = 0xE2DA, + ChannelAlert48 = 0xE2DB, + ChannelArrowLeft16 = 0xE2DC, + ChannelArrowLeft20 = 0xE2DD, + ChannelArrowLeft24 = 0xE2DE, + ChannelArrowLeft28 = 0xE2DF, + ChannelArrowLeft48 = 0xE2E0, + ChannelDismiss16 = 0xE2E1, + ChannelDismiss20 = 0xE2E2, + ChannelDismiss24 = 0xE2E3, + ChannelDismiss28 = 0xE2E4, + ChannelDismiss48 = 0xE2E5, + ChannelShare12 = 0xE2E6, + ChannelShare16 = 0xE2E7, + ChannelShare20 = 0xE2E8, + ChannelShare24 = 0xE2E9, + ChannelShare28 = 0xE2EA, + ChannelShare48 = 0xE2EB, + ChannelSubtract16 = 0xE2EC, + ChannelSubtract20 = 0xE2ED, + ChannelSubtract24 = 0xE2EE, + ChannelSubtract28 = 0xE2EF, + ChannelSubtract48 = 0xE2F0, + ChartMultiple20 = 0xE2F1, + ChartMultiple24 = 0xE2F2, + ChartPerson20 = 0xE2F3, + ChartPerson24 = 0xE2F4, + ChartPerson28 = 0xE2F5, + ChartPerson48 = 0xE2F6, + Chat12 = 0xE2F7, + Chat16 = 0xE2F8, + Chat32 = 0xE2F9, + Chat48 = 0xE2FA, + ChatArrowBack16 = 0xE2FB, + ChatArrowBack20 = 0xE2FC, + ChatArrowDoubleBack16 = 0xE2FD, + ChatArrowDoubleBack20 = 0xE2FE, + ChatBubblesQuestion20 = 0xE2FF, + ChatDismiss16 = 0xE300, + ChatDismiss20 = 0xE301, + ChatDismiss24 = 0xE302, + ChatMail20 = 0xE303, + ChatOff20 = 0xE304, + ChatVideo20 = 0xE305, + ChatVideo24 = 0xE306, + ChatWarning16 = 0xE307, + ChatWarning20 = 0xE308, + Check24 = 0xE309, + Checkbox120 = 0xE30A, + Checkbox124 = 0xE30B, + Checkbox220 = 0xE30C, + Checkbox224 = 0xE30D, + CheckboxArrowRight20 = 0xE30E, + CheckboxArrowRight24 = 0xE30F, + CheckboxCheckedSync20 = 0xE310, + CheckboxIndeterminate16 = 0xE311, + CheckboxIndeterminate20 = 0xE312, + CheckboxIndeterminate24 = 0xE313, + CheckboxPerson16 = 0xE314, + CheckboxPerson20 = 0xE315, + CheckboxPerson24 = 0xE316, + CheckboxWarning20 = 0xE317, + CheckboxWarning24 = 0xE318, + Checkmark16 = 0xE319, + Checkmark48 = 0xE31A, + CheckmarkCircle12 = 0xE31B, + CheckmarkCircle32 = 0xE31C, + CheckmarkNote20 = 0xE31D, + CheckmarkSquare20 = 0xE31E, + CheckmarkStarburst20 = 0xE31F, + CheckmarkStarburst24 = 0xE320, + Chess20 = 0xE321, + ChevronCircleDown12 = 0xE322, + ChevronCircleDown16 = 0xE323, + ChevronCircleDown20 = 0xE324, + ChevronCircleDown24 = 0xE325, + ChevronCircleDown28 = 0xE326, + ChevronCircleDown32 = 0xE327, + ChevronCircleDown48 = 0xE328, + ChevronCircleLeft12 = 0xE329, + ChevronCircleLeft16 = 0xE32A, + ChevronCircleLeft20 = 0xE32B, + ChevronCircleLeft24 = 0xE32C, + ChevronCircleLeft28 = 0xE32D, + ChevronCircleLeft32 = 0xE32E, + ChevronCircleLeft48 = 0xE32F, + ChevronCircleRight12 = 0xE330, + ChevronCircleRight16 = 0xE331, + ChevronCircleRight20 = 0xE332, + ChevronCircleRight24 = 0xE333, + ChevronCircleRight28 = 0xE334, + ChevronCircleRight32 = 0xE335, + ChevronCircleRight48 = 0xE336, + ChevronCircleUp12 = 0xE337, + ChevronCircleUp16 = 0xE338, + ChevronCircleUp20 = 0xE339, + ChevronCircleUp24 = 0xE33A, + ChevronCircleUp28 = 0xE33B, + ChevronCircleUp32 = 0xE33C, + ChevronCircleUp48 = 0xE33D, + ChevronDoubleDown20 = 0xE33E, + ChevronDoubleLeft20 = 0xE33F, + ChevronDoubleRight20 = 0xE340, + ChevronDoubleUp16 = 0xE341, + ChevronDoubleUp20 = 0xE342, + ChevronUpDown16 = 0xE343, + ChevronUpDown20 = 0xE344, + ChevronUpDown24 = 0xE345, + Circle12 = 0xE346, + Circle32 = 0xE347, + Circle48 = 0xE348, + CircleEdit20 = 0xE349, + CircleEdit24 = 0xE34A, + CircleEraser20 = 0xE34B, + CircleHalfFill12 = 0xE34C, + CircleImage20 = 0xE34D, + CircleLine12 = 0xE34E, + CircleLine20 = 0xE34F, + CircleMultipleSubtractCheckmark20 = 0xE350, + CircleOff16 = 0xE351, + CircleOff20 = 0xE352, + CircleSmall20 = 0xE353, + Class20 = 0xE354, + ClearFormatting16 = 0xE355, + ClearFormatting20 = 0xE356, + Clipboard16 = 0xE357, + Clipboard32 = 0xE358, + ClipboardArrowRight16 = 0xE359, + ClipboardArrowRight20 = 0xE35A, + ClipboardArrowRight24 = 0xE35B, + ClipboardBulletListLtr16 = 0xE35C, + ClipboardBulletListLtr20 = 0xE35D, + ClipboardBulletListRtl16 = 0xE35E, + ClipboardBulletListRtl20 = 0xE35F, + ClipboardCheckmark20 = 0xE360, + ClipboardCheckmark24 = 0xE361, + ClipboardClock20 = 0xE362, + ClipboardClock24 = 0xE363, + ClipboardDataBar20 = 0xE364, + ClipboardDataBar24 = 0xE365, + ClipboardDataBar32 = 0xE366, + ClipboardEdit20 = 0xE367, + ClipboardError20 = 0xE368, + ClipboardError24 = 0xE369, + ClipboardHeart24 = 0xE36A, + ClipboardImage20 = 0xE36B, + ClipboardImage24 = 0xE36C, + ClipboardMore20 = 0xE36D, + ClipboardNote20 = 0xE36E, + ClipboardPaste16 = 0xE36F, + ClipboardPulse24 = 0xE370, + ClipboardSettings24 = 0xE371, + ClipboardTask20 = 0xE372, + ClipboardTask24 = 0xE373, + ClipboardTaskAdd20 = 0xE374, + ClipboardTaskAdd24 = 0xE375, + ClipboardTaskListLtr20 = 0xE376, + ClipboardTaskListLtr24 = 0xE377, + ClipboardTaskListRtl20 = 0xE378, + ClipboardTaskListRtl24 = 0xE379, + ClipboardText32 = 0xE37A, + ClipboardTextEdit20 = 0xE37B, + ClipboardTextEdit24 = 0xE37C, + ClipboardTextEdit32 = 0xE37D, + ClipboardTextLtr20 = 0xE37E, + ClipboardTextLtr24 = 0xE37F, + ClipboardTextLtr32 = 0xE380, + ClipboardTextRtl20 = 0xE381, + ClipboardTextRtl24 = 0xE382, + Clock32 = 0xE383, + ClockAlarm16 = 0xE384, + ClockAlarm32 = 0xE385, + ClockArrowDownload24 = 0xE386, + ClockDismiss20 = 0xE387, + ClockDismiss24 = 0xE388, + ClockPause20 = 0xE389, + ClockPause24 = 0xE38A, + ClockToolbox20 = 0xE38B, + ClockToolbox24 = 0xE38C, + ClosedCaption16 = 0xE38D, + ClosedCaption20 = 0xE38E, + ClosedCaption28 = 0xE38F, + ClosedCaption32 = 0xE390, + ClosedCaption48 = 0xE391, + ClosedCaptionOff16 = 0xE392, + ClosedCaptionOff20 = 0xE393, + ClosedCaptionOff24 = 0xE394, + ClosedCaptionOff28 = 0xE395, + ClosedCaptionOff48 = 0xE396, + Cloud16 = 0xE397, + Cloud28 = 0xE398, + Cloud32 = 0xE399, + CloudAdd20 = 0xE39A, + CloudArchive16 = 0xE39B, + CloudArchive20 = 0xE39C, + CloudArchive24 = 0xE39D, + CloudArchive28 = 0xE39E, + CloudArchive32 = 0xE39F, + CloudArchive48 = 0xE3A0, + CloudArrowDown16 = 0xE3A1, + CloudArrowDown20 = 0xE3A2, + CloudArrowDown24 = 0xE3A3, + CloudArrowDown28 = 0xE3A4, + CloudArrowDown32 = 0xE3A5, + CloudArrowDown48 = 0xE3A6, + CloudArrowUp16 = 0xE3A7, + CloudArrowUp20 = 0xE3A8, + CloudArrowUp24 = 0xE3A9, + CloudArrowUp28 = 0xE3AA, + CloudArrowUp32 = 0xE3AB, + CloudArrowUp48 = 0xE3AC, + CloudCheckmark16 = 0xE3AD, + CloudCheckmark20 = 0xE3AE, + CloudCheckmark24 = 0xE3AF, + CloudCheckmark28 = 0xE3B0, + CloudCheckmark32 = 0xE3B1, + CloudCheckmark48 = 0xE3B2, + CloudDismiss16 = 0xE3B3, + CloudDismiss20 = 0xE3B4, + CloudDismiss24 = 0xE3B5, + CloudDismiss28 = 0xE3B6, + CloudDismiss32 = 0xE3B7, + CloudDismiss48 = 0xE3B8, + CloudEdit20 = 0xE3B9, + CloudFlow24 = 0xE3BA, + CloudLink20 = 0xE3BB, + CloudOff16 = 0xE3BC, + CloudOff20 = 0xE3BD, + CloudOff28 = 0xE3BE, + CloudOff32 = 0xE3BF, + CloudSwap20 = 0xE3C0, + CloudSwap24 = 0xE3C1, + CloudSync16 = 0xE3C2, + CloudSync20 = 0xE3C3, + CloudSync24 = 0xE3C4, + CloudSync28 = 0xE3C5, + CloudSync32 = 0xE3C6, + CloudSync48 = 0xE3C7, + CloudWords16 = 0xE3C8, + CloudWords20 = 0xE3C9, + CloudWords24 = 0xE3CA, + CloudWords28 = 0xE3CB, + CloudWords32 = 0xE3CC, + CloudWords48 = 0xE3CD, + CodeCircle20 = 0xE3CE, + CodeText20 = 0xE3CF, + CodeTextEdit20 = 0xE3D0, + Color16 = 0xE3D1, + ColorFill16 = 0xE3D2, + ColorFill28 = 0xE3D3, + ColorLine16 = 0xE3D4, + Column20 = 0xE3D5, + ColumnArrowRight20 = 0xE3D6, + ColumnDoubleCompare20 = 0xE3D7, + ColumnEdit20 = 0xE3D8, + ColumnEdit24 = 0xE3D9, + ColumnTriple20 = 0xE3DA, + ColumnTripleEdit20 = 0xE3DB, + ColumnTripleEdit24 = 0xE3DC, + Comma20 = 0xE3DD, + Comma24 = 0xE3DE, + Comment12 = 0xE3DF, + Comment28 = 0xE3E0, + Comment48 = 0xE3E1, + CommentAdd12 = 0xE3E2, + CommentAdd16 = 0xE3E3, + CommentAdd20 = 0xE3E4, + CommentAdd28 = 0xE3E5, + CommentAdd48 = 0xE3E6, + CommentArrowLeft12 = 0xE3E7, + CommentArrowLeft16 = 0xE3E8, + CommentArrowLeft20 = 0xE3E9, + CommentArrowLeft24 = 0xE3EA, + CommentArrowLeft28 = 0xE3EB, + CommentArrowLeft48 = 0xE3EC, + CommentArrowRight12 = 0xE3ED, + CommentArrowRight16 = 0xE3EE, + CommentArrowRight20 = 0xE3EF, + CommentArrowRight24 = 0xE3F0, + CommentArrowRight28 = 0xE3F1, + CommentArrowRight48 = 0xE3F2, + CommentCheckmark12 = 0xE3F3, + CommentCheckmark16 = 0xE3F4, + CommentCheckmark20 = 0xE3F5, + CommentCheckmark24 = 0xE3F6, + CommentCheckmark28 = 0xE3F7, + CommentCheckmark48 = 0xE3F8, + CommentDismiss20 = 0xE3F9, + CommentDismiss24 = 0xE3FA, + CommentEdit20 = 0xE3FB, + CommentEdit24 = 0xE3FC, + CommentError20 = 0xE3FD, + CommentError24 = 0xE3FE, + CommentMultiple28 = 0xE3FF, + CommentMultiple32 = 0xE400, + CommentMultipleCheckmark16 = 0xE401, + CommentMultipleCheckmark20 = 0xE402, + CommentMultipleCheckmark24 = 0xE403, + CommentMultipleCheckmark28 = 0xE404, + CommentMultipleLink16 = 0xE405, + CommentMultipleLink20 = 0xE406, + CommentMultipleLink24 = 0xE407, + CommentMultipleLink28 = 0xE408, + CommentMultipleLink32 = 0xE409, + CommentNote20 = 0xE40A, + CommentNote24 = 0xE40B, + CommentOff16 = 0xE40C, + CommentOff20 = 0xE40D, + CommentOff24 = 0xE40E, + CommentOff28 = 0xE40F, + CommentOff48 = 0xE410, + CommunicationPerson20 = 0xE411, + CommunicationPerson24 = 0xE412, + Component2DoubleTapSwipeDown24 = 0xE413, + Component2DoubleTapSwipeUp24 = 0xE414, + ContactCard28 = 0xE415, + ContactCard32 = 0xE416, + ContactCard48 = 0xE417, + ContactCardGroup16 = 0xE418, + ContactCardGroup20 = 0xE419, + ContactCardGroup28 = 0xE41A, + ContactCardGroup48 = 0xE41B, + ContactCardLink20 = 0xE41C, + ContactCardRibbon16 = 0xE41D, + ContactCardRibbon20 = 0xE41E, + ContactCardRibbon24 = 0xE41F, + ContactCardRibbon28 = 0xE420, + ContactCardRibbon32 = 0xE421, + ContactCardRibbon48 = 0xE422, + ContentSettings32 = 0xE423, + ContentView20 = 0xE424, + ContentView32 = 0xE425, + ContentViewGallery20 = 0xE426, + ControlButton20 = 0xE427, + ControlButton24 = 0xE428, + ConvertRange20 = 0xE429, + ConvertRange24 = 0xE42A, + CopyAdd20 = 0xE42B, + CopyAdd24 = 0xE42C, + CopyArrowRight16 = 0xE42D, + CopyArrowRight20 = 0xE42E, + CopyArrowRight24 = 0xE42F, + CopySelect20 = 0xE430, + Couch12 = 0xE431, + Couch20 = 0xE432, + Couch24 = 0xE433, + CreditCardPerson20 = 0xE434, + CreditCardPerson24 = 0xE435, + CreditCardToolbox24 = 0xE436, + Crop20 = 0xE437, + CropInterim20 = 0xE438, + CropInterimOff20 = 0xE439, + Cube12 = 0xE43A, + CubeAdd20 = 0xE43B, + CubeArrowCurveDown20 = 0xE43C, + CubeLink20 = 0xE43D, + CubeMultiple20 = 0xE43E, + CubeMultiple24 = 0xE43F, + CubeQuick16 = 0xE440, + CubeQuick20 = 0xE441, + CubeQuick24 = 0xE442, + CubeQuick28 = 0xE443, + CubeRotate20 = 0xE444, + CubeSync20 = 0xE445, + CubeSync24 = 0xE446, + CubeTree20 = 0xE447, + CubeTree24 = 0xE448, + CurrencyDollarEuro16 = 0xE449, + CurrencyDollarEuro20 = 0xE44A, + CurrencyDollarEuro24 = 0xE44B, + CurrencyDollarRupee16 = 0xE44C, + CurrencyDollarRupee20 = 0xE44D, + CurrencyDollarRupee24 = 0xE44E, + Cursor20 = 0xE44F, + Cursor24 = 0xE450, + CursorClick20 = 0xE451, + CursorClick24 = 0xE452, + CursorHover16 = 0xE453, + CursorHover20 = 0xE454, + CursorHover24 = 0xE455, + CursorHover28 = 0xE456, + CursorHover32 = 0xE457, + CursorHover48 = 0xE458, + CursorHoverOff16 = 0xE459, + CursorHoverOff20 = 0xE45A, + CursorHoverOff24 = 0xE45B, + CursorHoverOff28 = 0xE45C, + CursorHoverOff48 = 0xE45D, + DarkTheme20 = 0xE45E, + DataArea20 = 0xE45F, + DataBarVerticalAdd20 = 0xE460, + DataBarVerticalAdd24 = 0xE461, + DataFunnel20 = 0xE462, + DataHistogram20 = 0xE463, + DataLine20 = 0xE464, + DataScatter20 = 0xE465, + DataSunburst20 = 0xE466, + DataTreemap20 = 0xE467, + DataTrending16 = 0xE468, + DataTrending20 = 0xE469, + DataTrending24 = 0xE46A, + DataUsage20 = 0xE46B, + DataUsageEdit24 = 0xE46C, + DataUsageSettings20 = 0xE46D, + DataUsageToolbox20 = 0xE46E, + DataUsageToolbox24 = 0xE46F, + DataWaterfall20 = 0xE470, + DataWhisker20 = 0xE471, + Database20 = 0xE472, + Database24 = 0xE473, + DatabaseArrowDown20 = 0xE474, + DatabaseArrowRight20 = 0xE475, + DatabaseArrowUp20 = 0xE476, + DatabaseLightning20 = 0xE477, + DatabaseLink20 = 0xE478, + DatabaseLink24 = 0xE479, + DatabaseMultiple20 = 0xE47A, + DatabasePerson20 = 0xE47B, + DatabasePerson24 = 0xE47C, + DatabasePlugConnected20 = 0xE47D, + DatabaseSearch20 = 0xE47E, + DatabaseSearch24 = 0xE47F, + DatabaseSwitch20 = 0xE480, + DatabaseWarning20 = 0xE481, + DatabaseWindow20 = 0xE482, + DecimalArrowLeft20 = 0xE483, + DecimalArrowLeft24 = 0xE484, + DecimalArrowRight20 = 0xE485, + DecimalArrowRight24 = 0xE486, + Delete16 = 0xE487, + DeleteArrowBack16 = 0xE488, + DeleteArrowBack20 = 0xE489, + DeleteDismiss20 = 0xE48A, + DeleteDismiss24 = 0xE48B, + DeleteDismiss28 = 0xE48C, + DeleteLines20 = 0xE48D, + Dentist12 = 0xE48E, + Dentist16 = 0xE48F, + Dentist20 = 0xE490, + Dentist28 = 0xE491, + Dentist48 = 0xE492, + Desktop32 = 0xE493, + DesktopArrowRight16 = 0xE494, + DesktopArrowRight20 = 0xE495, + DesktopArrowRight24 = 0xE496, + DesktopCursor16 = 0xE497, + DesktopCursor20 = 0xE498, + DesktopCursor24 = 0xE499, + DesktopCursor28 = 0xE49A, + DesktopEdit16 = 0xE49B, + DesktopEdit20 = 0xE49C, + DesktopEdit24 = 0xE49D, + DesktopFlow20 = 0xE49E, + DesktopFlow24 = 0xE49F, + DesktopKeyboard16 = 0xE4A0, + DesktopKeyboard20 = 0xE4A1, + DesktopKeyboard24 = 0xE4A2, + DesktopKeyboard28 = 0xE4A3, + DesktopMac16 = 0xE4A4, + DesktopMac20 = 0xE4A5, + DesktopMac24 = 0xE4A6, + DesktopMac32 = 0xE4A7, + DesktopPulse16 = 0xE4A8, + DesktopPulse20 = 0xE4A9, + DesktopPulse24 = 0xE4AA, + DesktopPulse28 = 0xE4AB, + DesktopPulse32 = 0xE4AC, + DesktopPulse48 = 0xE4AD, + DesktopSignal20 = 0xE4AE, + DesktopSignal24 = 0xE4AF, + DesktopSpeaker20 = 0xE4B0, + DesktopSpeaker24 = 0xE4B1, + DesktopSpeakerOff20 = 0xE4B2, + DesktopSpeakerOff24 = 0xE4B3, + DesktopSync20 = 0xE4B4, + DesktopSync24 = 0xE4B5, + DesktopToolbox20 = 0xE4B6, + DesktopToolbox24 = 0xE4B7, + DeveloperBoard20 = 0xE4B8, + DeveloperBoardLightning20 = 0xE4B9, + DeveloperBoardLightningToolbox20 = 0xE4BA, + DeveloperBoardSearch20 = 0xE4BB, + DeveloperBoardSearch24 = 0xE4BC, + DeviceEq20 = 0xE4BD, + DeviceMeetingRoom20 = 0xE4BE, + DeviceMeetingRoomRemote20 = 0xE4BF, + Diagram20 = 0xE4C0, + Diagram24 = 0xE4C1, + Dialpad28 = 0xE4C2, + Dialpad32 = 0xE4C3, + Dialpad48 = 0xE4C4, + DialpadOff20 = 0xE4C5, + Diamond16 = 0xE4C6, + Diamond20 = 0xE4C7, + Diamond24 = 0xE4C8, + Diamond28 = 0xE4C9, + Diamond32 = 0xE4CA, + Diamond48 = 0xE4CB, + Directions16 = 0xE4CC, + DismissCircle12 = 0xE4CD, + DismissCircle28 = 0xE4CE, + DismissCircle32 = 0xE4CF, + DismissSquare20 = 0xE4D0, + DismissSquare24 = 0xE4D1, + DismissSquareMultiple16 = 0xE4D2, + DismissSquareMultiple20 = 0xE4D3, + Diversity20 = 0xE4D4, + Diversity24 = 0xE4D5, + Diversity28 = 0xE4D6, + Diversity48 = 0xE4D7, + DividerShort16 = 0xE4D8, + DividerShort20 = 0xE4D9, + DividerTall16 = 0xE4DA, + DividerTall20 = 0xE4DB, + Dock20 = 0xE4DC, + DockRow20 = 0xE4DD, + Doctor12 = 0xE4DE, + Doctor16 = 0xE4DF, + Doctor20 = 0xE4E0, + Doctor28 = 0xE4E1, + Doctor48 = 0xE4E2, + Document16 = 0xE4E3, + Document32 = 0xE4E4, + Document48 = 0xE4E5, + DocumentAdd16 = 0xE4E6, + DocumentAdd20 = 0xE4E7, + DocumentAdd24 = 0xE4E8, + DocumentAdd28 = 0xE4E9, + DocumentAdd48 = 0xE4EA, + DocumentArrowDown16 = 0xE4EB, + DocumentArrowDown20 = 0xE4EC, + DocumentArrowLeft16 = 0xE4ED, + DocumentArrowLeft20 = 0xE4EE, + DocumentArrowLeft24 = 0xE4EF, + DocumentArrowLeft28 = 0xE4F0, + DocumentArrowLeft48 = 0xE4F1, + DocumentArrowRight20 = 0xE4F2, + DocumentArrowRight24 = 0xE4F3, + DocumentArrowUp20 = 0xE4F4, + DocumentBulletListClock20 = 0xE4F5, + DocumentBulletListClock24 = 0xE4F6, + DocumentBulletListMultiple20 = 0xE4F7, + DocumentBulletListMultiple24 = 0xE4F8, + DocumentBulletListOff20 = 0xE4F9, + DocumentBulletListOff24 = 0xE4FA, + DocumentCatchUp16 = 0xE4FB, + DocumentCatchUp20 = 0xE4FC, + DocumentCheckmark20 = 0xE4FD, + DocumentCheckmark24 = 0xE4FE, + DocumentChevronDouble20 = 0xE4FF, + DocumentChevronDouble24 = 0xE500, + DocumentCss20 = 0xE501, + DocumentCss24 = 0xE502, + DocumentData20 = 0xE503, + DocumentData24 = 0xE504, + DocumentDismiss16 = 0xE505, + DocumentFlowchart20 = 0xE506, + DocumentFlowchart24 = 0xE507, + DocumentFooter16 = 0xE508, + DocumentFooter20 = 0xE509, + DocumentFooterDismiss20 = 0xE50A, + DocumentFooterDismiss24 = 0xE50B, + DocumentHeader16 = 0xE50C, + DocumentHeader20 = 0xE50D, + DocumentHeaderArrowDown16 = 0xE50E, + DocumentHeaderArrowDown20 = 0xE50F, + DocumentHeaderArrowDown24 = 0xE510, + DocumentHeaderDismiss20 = 0xE511, + DocumentHeaderDismiss24 = 0xE512, + DocumentHeaderFooter16 = 0xE513, + DocumentHeart20 = 0xE514, + DocumentHeart24 = 0xE515, + DocumentHeartPulse20 = 0xE516, + DocumentHeartPulse24 = 0xE517, + DocumentJavascript20 = 0xE518, + DocumentJavascript24 = 0xE519, + DocumentLandscapeData20 = 0xE51A, + DocumentLandscapeData24 = 0xE51B, + DocumentLandscapeSplit20 = 0xE51C, + DocumentLandscapeSplit24 = 0xE51D, + DocumentLandscapeSplitHint20 = 0xE51E, + DocumentLink16 = 0xE51F, + DocumentLock16 = 0xE520, + DocumentLock20 = 0xE521, + DocumentLock24 = 0xE522, + DocumentLock28 = 0xE523, + DocumentLock32 = 0xE524, + DocumentLock48 = 0xE525, + DocumentMention16 = 0xE526, + DocumentMention20 = 0xE527, + DocumentMention24 = 0xE528, + DocumentMention28 = 0xE529, + DocumentMention48 = 0xE52A, + DocumentMultiple16 = 0xE52B, + DocumentMultiple20 = 0xE52C, + DocumentMultiple24 = 0xE52D, + DocumentMultiplePercent20 = 0xE52E, + DocumentMultiplePercent24 = 0xE52F, + DocumentMultipleProhibited20 = 0xE530, + DocumentMultipleProhibited24 = 0xE531, + DocumentMultipleSync20 = 0xE532, + DocumentPageBreak20 = 0xE533, + DocumentPdf32 = 0xE534, + DocumentPercent20 = 0xE535, + DocumentPercent24 = 0xE536, + DocumentPerson20 = 0xE537, + DocumentPill20 = 0xE538, + DocumentPill24 = 0xE539, + DocumentProhibited20 = 0xE53A, + DocumentProhibited24 = 0xE53B, + DocumentQuestionMark16 = 0xE53C, + DocumentQuestionMark20 = 0xE53D, + DocumentQuestionMark24 = 0xE53E, + DocumentQueue20 = 0xE53F, + DocumentQueue24 = 0xE540, + DocumentQueueAdd20 = 0xE541, + DocumentQueueAdd24 = 0xE542, + DocumentQueueMultiple20 = 0xE543, + DocumentQueueMultiple24 = 0xE544, + DocumentRibbon16 = 0xE545, + DocumentRibbon20 = 0xE546, + DocumentRibbon24 = 0xE547, + DocumentRibbon28 = 0xE548, + DocumentRibbon32 = 0xE549, + DocumentRibbon48 = 0xE54A, + DocumentSave20 = 0xE54B, + DocumentSave24 = 0xE54C, + DocumentSearch16 = 0xE54D, + DocumentSettings20 = 0xE54E, + DocumentSplitHint16 = 0xE54F, + DocumentSplitHint20 = 0xE550, + DocumentSplitHintOff16 = 0xE551, + DocumentSplitHintOff20 = 0xE552, + DocumentSync16 = 0xE553, + DocumentSync20 = 0xE554, + DocumentSync24 = 0xE555, + DocumentTable16 = 0xE556, + DocumentTable20 = 0xE557, + DocumentTable24 = 0xE558, + DocumentTableArrowRight20 = 0xE559, + DocumentTableArrowRight24 = 0xE55A, + DocumentTableCheckmark20 = 0xE55B, + DocumentTableCheckmark24 = 0xE55C, + DocumentTableCube20 = 0xE55D, + DocumentTableCube24 = 0xE55E, + DocumentTableSearch20 = 0xE55F, + DocumentTableSearch24 = 0xE560, + DocumentTableTruck20 = 0xE561, + DocumentTableTruck24 = 0xE562, + DocumentText20 = 0xE563, + DocumentText24 = 0xE564, + DocumentTextClock20 = 0xE565, + DocumentTextClock24 = 0xE566, + DocumentTextExtract20 = 0xE567, + DocumentTextExtract24 = 0xE568, + DocumentTextLink20 = 0xE569, + DocumentTextLink24 = 0xE56A, + DocumentTextToolbox20 = 0xE56B, + DocumentTextToolbox24 = 0xE56C, + Door16 = 0xE56D, + Door20 = 0xE56E, + Door28 = 0xE56F, + DoorArrowLeft16 = 0xE570, + DoorArrowLeft20 = 0xE571, + DoorArrowLeft24 = 0xE572, + DoorArrowRight16 = 0xE573, + DoorArrowRight20 = 0xE574, + DoorArrowRight28 = 0xE575, + DoorTag20 = 0xE576, + DoorTag24 = 0xE577, + DoubleSwipeDown20 = 0xE578, + DoubleSwipeUp20 = 0xE579, + DoubleTapSwipeDown20 = 0xE57A, + DoubleTapSwipeDown24 = 0xE57B, + DoubleTapSwipeUp20 = 0xE57C, + DoubleTapSwipeUp24 = 0xE57D, + Drag20 = 0xE57E, + DrawImage20 = 0xE57F, + DrawImage24 = 0xE580, + DrawShape20 = 0xE581, + DrawShape24 = 0xE582, + DrawText20 = 0xE583, + DrawText24 = 0xE584, + DrawerAdd20 = 0xE585, + DrawerAdd24 = 0xE586, + DrawerArrowDownload20 = 0xE587, + DrawerArrowDownload24 = 0xE588, + DrawerDismiss20 = 0xE589, + DrawerDismiss24 = 0xE58A, + DrawerPlay20 = 0xE58B, + DrawerPlay24 = 0xE58C, + DrawerSubtract20 = 0xE58D, + DrawerSubtract24 = 0xE58E, + DrinkBeer16 = 0xE58F, + DrinkBeer20 = 0xE590, + DrinkCoffee16 = 0xE591, + DrinkMargarita16 = 0xE592, + DrinkMargarita20 = 0xE593, + DrinkToGo20 = 0xE594, + DrinkToGo24 = 0xE595, + DrinkWine16 = 0xE596, + DrinkWine20 = 0xE597, + DriveTrain20 = 0xE598, + DriveTrain24 = 0xE599, + Drop12 = 0xE59A, + Drop16 = 0xE59B, + Drop20 = 0xE59C, + Drop24 = 0xE59D, + Drop28 = 0xE59E, + Drop48 = 0xE59F, + DualScreen20 = 0xE5A0, + DualScreenAdd20 = 0xE5A1, + DualScreenArrowRight20 = 0xE5A2, + DualScreenArrowUp20 = 0xE5A3, + DualScreenArrowUp24 = 0xE5A4, + DualScreenClock20 = 0xE5A5, + DualScreenClosedAlert20 = 0xE5A6, + DualScreenClosedAlert24 = 0xE5A7, + DualScreenDesktop20 = 0xE5A8, + DualScreenDismiss20 = 0xE5A9, + DualScreenDismiss24 = 0xE5AA, + DualScreenGroup20 = 0xE5AB, + DualScreenHeader20 = 0xE5AC, + DualScreenHeader24 = 0xE5AD, + DualScreenLock20 = 0xE5AE, + DualScreenMirror20 = 0xE5AF, + DualScreenPagination20 = 0xE5B0, + DualScreenSettings20 = 0xE5B1, + DualScreenSpan20 = 0xE5B2, + DualScreenSpan24 = 0xE5B3, + DualScreenSpeaker20 = 0xE5B4, + DualScreenSpeaker24 = 0xE5B5, + DualScreenStatusBar20 = 0xE5B6, + DualScreenTablet20 = 0xE5B7, + DualScreenUpdate20 = 0xE5B8, + DualScreenVerticalScroll20 = 0xE5B9, + DualScreenVibrate20 = 0xE5BA, + Dumbbell16 = 0xE5BB, + Dumbbell20 = 0xE5BC, + Dumbbell24 = 0xE5BD, + Dumbbell28 = 0xE5BE, + Edit28 = 0xE5BF, + Edit32 = 0xE5C0, + Edit48 = 0xE5C1, + EditArrowBack20 = 0xE5C2, + EditOff16 = 0xE5C3, + EditOff20 = 0xE5C4, + EditOff24 = 0xE5C5, + EditOff28 = 0xE5C6, + EditOff32 = 0xE5C7, + EditOff48 = 0xE5C8, + EditProhibited16 = 0xE5C9, + EditProhibited20 = 0xE5CA, + EditProhibited24 = 0xE5CB, + EditProhibited28 = 0xE5CC, + EditProhibited32 = 0xE5CD, + EditProhibited48 = 0xE5CE, + EditSettings20 = 0xE5CF, + EditSettings24 = 0xE5D0, + Emoji28 = 0xE5D1, + Emoji32 = 0xE5D2, + Emoji48 = 0xE5D3, + EmojiAdd16 = 0xE5D4, + EmojiAdd20 = 0xE5D5, + EmojiEdit16 = 0xE5D6, + EmojiEdit20 = 0xE5D7, + EmojiEdit24 = 0xE5D8, + EmojiEdit28 = 0xE5D9, + EmojiEdit48 = 0xE5DA, + EmojiHand20 = 0xE5DB, + EmojiHand24 = 0xE5DC, + EmojiHand28 = 0xE5DD, + EmojiLaugh16 = 0xE5DE, + EmojiMultiple20 = 0xE5DF, + EmojiMultiple24 = 0xE5E0, + EmojiSad16 = 0xE5E1, + EmojiSadSlight20 = 0xE5E2, + EmojiSadSlight24 = 0xE5E3, + EmojiSmileSlight20 = 0xE5E4, + EmojiSmileSlight24 = 0xE5E5, + EmojiSparkle16 = 0xE5E6, + EmojiSparkle20 = 0xE5E7, + EmojiSparkle24 = 0xE5E8, + EmojiSparkle28 = 0xE5E9, + EmojiSparkle32 = 0xE5EA, + EmojiSparkle48 = 0xE5EB, + Engine20 = 0xE5EC, + Engine24 = 0xE5ED, + EqualCircle20 = 0xE5EE, + EqualCircle24 = 0xE5EF, + EqualOff24 = 0xE5F0, + Eraser20 = 0xE5F1, + Eraser24 = 0xE5F2, + EraserMedium20 = 0xE5F3, + EraserMedium24 = 0xE5F4, + EraserSegment20 = 0xE5F5, + EraserSegment24 = 0xE5F6, + EraserSmall20 = 0xE5F7, + EraserSmall24 = 0xE5F8, + EraserTool20 = 0xE5F9, + ErrorCircle12 = 0xE5FA, + ErrorCircleSettings20 = 0xE5FB, + ExtendedDock20 = 0xE5FC, + Eye12 = 0xE5FD, + Eye16 = 0xE5FE, + Eye20 = 0xE5FF, + Eye24 = 0xE600, + EyeOff16 = 0xE601, + EyeOff20 = 0xE602, + EyeOff24 = 0xE603, + EyeTracking16 = 0xE604, + EyeTracking20 = 0xE605, + EyeTracking24 = 0xE606, + EyeTrackingOff16 = 0xE607, + EyeTrackingOff20 = 0xE608, + EyeTrackingOff24 = 0xE609, + Eyedropper20 = 0xE60A, + Eyedropper24 = 0xE60B, + EyedropperOff20 = 0xE60C, + EyedropperOff24 = 0xE60D, + FStop16 = 0xE60E, + FStop20 = 0xE60F, + FStop24 = 0xE610, + FStop28 = 0xE611, + FastAcceleration20 = 0xE612, + FastForward16 = 0xE613, + FastForward28 = 0xE614, + Fax20 = 0xE615, + Filter12 = 0xE616, + Filter16 = 0xE617, + FilterAdd20 = 0xE618, + FilterDismiss16 = 0xE619, + FilterDismiss20 = 0xE61A, + FilterDismiss24 = 0xE61B, + FilterSync20 = 0xE61C, + FilterSync24 = 0xE61D, + Fingerprint20 = 0xE61E, + Fingerprint48 = 0xE61F, + FixedWidth20 = 0xE620, + FixedWidth24 = 0xE621, + FlagOff16 = 0xE622, + FlagOff20 = 0xE623, + Flash16 = 0xE624, + Flash20 = 0xE625, + Flash24 = 0xE626, + Flash28 = 0xE627, + FlashAdd20 = 0xE628, + FlashAuto20 = 0xE629, + FlashCheckmark16 = 0xE62A, + FlashCheckmark20 = 0xE62B, + FlashCheckmark24 = 0xE62C, + FlashCheckmark28 = 0xE62D, + FlashFlow16 = 0xE62E, + FlashFlow20 = 0xE62F, + FlashFlow24 = 0xE630, + FlashOff20 = 0xE631, + FlashPlay20 = 0xE632, + FlashSettings20 = 0xE633, + FlashSettings24 = 0xE634, + Flashlight16 = 0xE635, + Flashlight20 = 0xE636, + FlashlightOff20 = 0xE637, + FlipHorizontal16 = 0xE638, + FlipHorizontal20 = 0xE639, + FlipHorizontal24 = 0xE63A, + FlipHorizontal28 = 0xE63B, + FlipHorizontal32 = 0xE63C, + FlipHorizontal48 = 0xE63D, + FlipVertical16 = 0xE63E, + FlipVertical20 = 0xE63F, + FlipVertical24 = 0xE640, + FlipVertical28 = 0xE641, + FlipVertical32 = 0xE642, + FlipVertical48 = 0xE643, + Flow20 = 0xE644, + Flowchart20 = 0xE645, + Flowchart24 = 0xE646, + FlowchartCircle20 = 0xE647, + FlowchartCircle24 = 0xE648, + Fluent20 = 0xE649, + Fluent24 = 0xE64A, + Fluent32 = 0xE64B, + Fluent48 = 0xE64C, + Fluid16 = 0xE64D, + Fluid20 = 0xE64E, + Fluid24 = 0xE64F, + Folder16 = 0xE650, + Folder32 = 0xE651, + FolderAdd16 = 0xE652, + FolderArrowLeft16 = 0xE653, + FolderArrowLeft20 = 0xE654, + FolderArrowLeft24 = 0xE655, + FolderArrowLeft28 = 0xE656, + FolderArrowLeft32 = 0xE657, + FolderArrowRight16 = 0xE658, + FolderArrowRight20 = 0xE659, + FolderArrowRight24 = 0xE65A, + FolderArrowRight28 = 0xE65B, + FolderArrowRight48 = 0xE65C, + FolderArrowUp16 = 0xE65D, + FolderArrowUp20 = 0xE65E, + FolderArrowUp24 = 0xE65F, + FolderArrowUp28 = 0xE660, + FolderArrowUp48 = 0xE661, + FolderGlobe20 = 0xE662, + FolderMail16 = 0xE663, + FolderMail20 = 0xE664, + FolderMail24 = 0xE665, + FolderMail28 = 0xE666, + FolderPerson20 = 0xE667, + FolderProhibited16 = 0xE668, + FolderProhibited20 = 0xE669, + FolderProhibited24 = 0xE66A, + FolderProhibited28 = 0xE66B, + FolderProhibited48 = 0xE66C, + FolderSwap16 = 0xE66D, + FolderSwap20 = 0xE66E, + FolderSwap24 = 0xE66F, + FolderSync16 = 0xE670, + FolderSync20 = 0xE671, + FolderSync24 = 0xE672, + Food16 = 0xE673, + FoodApple20 = 0xE674, + FoodApple24 = 0xE675, + FoodCake12 = 0xE676, + FoodCake16 = 0xE677, + FoodCake20 = 0xE678, + FoodEgg16 = 0xE679, + FoodEgg20 = 0xE67A, + FoodGrains20 = 0xE67B, + FoodGrains24 = 0xE67C, + FoodPizza20 = 0xE67D, + FoodPizza24 = 0xE67E, + FoodToast16 = 0xE67F, + FoodToast20 = 0xE680, + FormNew20 = 0xE681, + Fps12020 = 0xE682, + Fps12024 = 0xE683, + Fps24020 = 0xE684, + Fps3016 = 0xE685, + Fps3020 = 0xE686, + Fps3024 = 0xE687, + Fps3028 = 0xE688, + Fps3048 = 0xE689, + Fps6016 = 0xE68A, + Fps6020 = 0xE68B, + Fps6024 = 0xE68C, + Fps6028 = 0xE68D, + Fps6048 = 0xE68E, + Fps96020 = 0xE68F, + FullScreenMaximize16 = 0xE690, + FullScreenMaximize20 = 0xE691, + FullScreenMaximize24 = 0xE692, + FullScreenMinimize16 = 0xE693, + FullScreenMinimize20 = 0xE694, + FullScreenMinimize24 = 0xE695, + Games16 = 0xE696, + Games20 = 0xE697, + Games28 = 0xE698, + Games32 = 0xE699, + Games48 = 0xE69A, + GanttChart20 = 0xE69B, + GanttChart24 = 0xE69C, + Gas20 = 0xE69D, + Gas24 = 0xE69E, + GasPump20 = 0xE69F, + GasPump24 = 0xE6A0, + Gather20 = 0xE6A1, + GaugeAdd20 = 0xE6A2, + Gavel20 = 0xE6A3, + Gavel24 = 0xE6A4, + Gavel32 = 0xE6A5, + Gesture20 = 0xE6A6, + Gif16 = 0xE6A7, + Gift16 = 0xE6A8, + GiftCard24 = 0xE6A9, + GiftCardAdd24 = 0xE6AA, + GiftCardArrowRight20 = 0xE6AB, + GiftCardArrowRight24 = 0xE6AC, + GiftCardMoney20 = 0xE6AD, + GiftCardMoney24 = 0xE6AE, + GiftCardMultiple20 = 0xE6AF, + GiftCardMultiple24 = 0xE6B0, + Glance20 = 0xE6B1, + GlanceDefault12 = 0xE6B2, + GlanceHorizontal12 = 0xE6B3, + GlanceHorizontal20 = 0xE6B4, + GlanceHorizontal24 = 0xE6B5, + Glasses16 = 0xE6B6, + Glasses20 = 0xE6B7, + Glasses28 = 0xE6B8, + Glasses48 = 0xE6B9, + GlassesOff16 = 0xE6BA, + GlassesOff20 = 0xE6BB, + GlassesOff28 = 0xE6BC, + GlassesOff48 = 0xE6BD, + Globe16 = 0xE6BE, + Globe32 = 0xE6BF, + GlobeAdd20 = 0xE6C0, + GlobeClock16 = 0xE6C1, + GlobeClock20 = 0xE6C2, + GlobeDesktop20 = 0xE6C3, + GlobePerson20 = 0xE6C4, + GlobePerson24 = 0xE6C5, + GlobeProhibited20 = 0xE6C6, + GlobeSearch20 = 0xE6C7, + GlobeShield20 = 0xE6C8, + GlobeShield24 = 0xE6C9, + GlobeStar20 = 0xE6CA, + GlobeSurface20 = 0xE6CB, + GlobeSurface24 = 0xE6CC, + GlobeVideo28 = 0xE6CD, + GlobeVideo32 = 0xE6CE, + GlobeVideo48 = 0xE6CF, + Grid16 = 0xE6D0, + GridDots20 = 0xE6D1, + GridDots24 = 0xE6D2, + GridDots28 = 0xE6D3, + GridKanban20 = 0xE6D4, + GroupDismiss20 = 0xE6D5, + GroupDismiss24 = 0xE6D6, + GroupList20 = 0xE6D7, + GroupReturn20 = 0xE6D8, + GroupReturn24 = 0xE6D9, + Guardian20 = 0xE6DA, + Guardian24 = 0xE6DB, + Guardian28 = 0xE6DC, + Guardian48 = 0xE6DD, + GuestAdd20 = 0xE6DE, + Guitar16 = 0xE6DF, + Guitar20 = 0xE6E0, + Guitar24 = 0xE6E1, + Guitar28 = 0xE6E2, + HandDraw16 = 0xE6E3, + HandDraw20 = 0xE6E4, + HandDraw24 = 0xE6E5, + HandDraw28 = 0xE6E6, + HandLeft16 = 0xE6E7, + HandLeft20 = 0xE6E8, + HandLeft24 = 0xE6E9, + HandLeft28 = 0xE6EA, + HandRight16 = 0xE6EB, + HandRight20 = 0xE6EC, + HandRight24 = 0xE6ED, + HandRight28 = 0xE6EE, + HandRightOff20 = 0xE6EF, + HardDrive20 = 0xE6F0, + HatGraduation12 = 0xE6F1, + HatGraduation16 = 0xE6F2, + HatGraduation20 = 0xE6F3, + HatGraduation24 = 0xE6F4, + Hd16 = 0xE6F5, + Hd20 = 0xE6F6, + Hd24 = 0xE6F7, + Hdr20 = 0xE6F8, + HdrOff20 = 0xE6F9, + HdrOff24 = 0xE6FA, + Headphones20 = 0xE6FB, + Headphones32 = 0xE6FC, + Headphones48 = 0xE6FD, + HeadphonesSoundWave20 = 0xE6FE, + HeadphonesSoundWave24 = 0xE6FF, + HeadphonesSoundWave28 = 0xE700, + HeadphonesSoundWave32 = 0xE701, + HeadphonesSoundWave48 = 0xE702, + Headset16 = 0xE703, + Headset20 = 0xE704, + Headset32 = 0xE705, + Headset48 = 0xE706, + Heart12 = 0xE707, + Heart32 = 0xE708, + Heart48 = 0xE709, + HeartBroken20 = 0xE70A, + HeartCircle16 = 0xE70B, + HeartCircle20 = 0xE70C, + HeartCircle24 = 0xE70D, + HeartPulse20 = 0xE70E, + HeartPulse24 = 0xE70F, + HeartPulse32 = 0xE710, + HighlightLink20 = 0xE711, + History16 = 0xE712, + History28 = 0xE713, + History32 = 0xE714, + History48 = 0xE715, + HistoryDismiss20 = 0xE716, + HistoryDismiss24 = 0xE717, + HistoryDismiss28 = 0xE718, + HistoryDismiss32 = 0xE719, + HistoryDismiss48 = 0xE71A, + Home12 = 0xE71B, + Home16 = 0xE71C, + Home32 = 0xE71D, + Home48 = 0xE71E, + HomeAdd20 = 0xE71F, + HomeCheckmark16 = 0xE720, + HomeCheckmark20 = 0xE721, + HomeDatabase20 = 0xE722, + HomeMore20 = 0xE723, + HomePerson20 = 0xE724, + HomePerson24 = 0xE725, + Image32 = 0xE726, + ImageAdd20 = 0xE727, + ImageAltText16 = 0xE728, + ImageArrowBack20 = 0xE729, + ImageArrowBack24 = 0xE72A, + ImageArrowCounterclockwise20 = 0xE72B, + ImageArrowCounterclockwise24 = 0xE72C, + ImageArrowForward20 = 0xE72D, + ImageArrowForward24 = 0xE72E, + ImageGlobe20 = 0xE72F, + ImageGlobe24 = 0xE730, + ImageMultiple16 = 0xE731, + ImageMultiple20 = 0xE732, + ImageMultiple24 = 0xE733, + ImageMultiple28 = 0xE734, + ImageMultiple32 = 0xE735, + ImageMultiple48 = 0xE736, + ImageMultipleOff16 = 0xE737, + ImageMultipleOff20 = 0xE738, + ImageOff20 = 0xE739, + ImageProhibited20 = 0xE73A, + ImageProhibited24 = 0xE73B, + ImageReflection20 = 0xE73C, + ImageReflection24 = 0xE73D, + ImageShadow20 = 0xE73E, + ImageShadow24 = 0xE73F, + ImmersiveReader16 = 0xE740, + ImmersiveReader28 = 0xE741, + Incognito20 = 0xE742, + Info12 = 0xE743, + InfoShield20 = 0xE744, + InkStroke20 = 0xE745, + InkStroke24 = 0xE746, + InkingTool32 = 0xE747, + InkingToolAccent32 = 0xE748, + IosArrowLtr24 = 0xE749, + IosArrowRtl24 = 0xE74A, + Iot20 = 0xE74B, + Iot24 = 0xE74C, + Joystick20 = 0xE74D, + Key16 = 0xE74E, + Key32 = 0xE74F, + KeyCommand16 = 0xE750, + KeyCommand20 = 0xE751, + KeyCommand24 = 0xE752, + KeyMultiple20 = 0xE753, + KeyReset20 = 0xE754, + KeyReset24 = 0xE755, + Keyboard12320 = 0xE756, + Keyboard12324 = 0xE757, + Keyboard16 = 0xE758, + KeyboardDock20 = 0xE759, + KeyboardLayoutFloat20 = 0xE75A, + KeyboardLayoutOneHandedLeft20 = 0xE75B, + KeyboardLayoutResize20 = 0xE75C, + KeyboardLayoutSplit20 = 0xE75D, + KeyboardShift16 = 0xE75E, + KeyboardShift20 = 0xE75F, + KeyboardShiftUppercase16 = 0xE760, + KeyboardShiftUppercase20 = 0xE761, + KeyboardTab20 = 0xE762, + LaptopDismiss20 = 0xE763, + Lasso20 = 0xE764, + Lasso28 = 0xE765, + LauncherSettings20 = 0xE766, + LeafOne16 = 0xE767, + LeafOne20 = 0xE768, + LeafOne24 = 0xE769, + LeafThree16 = 0xE76A, + LeafThree20 = 0xE76B, + LeafThree24 = 0xE76C, + LearningApp20 = 0xE76D, + LearningApp24 = 0xE76E, + Library16 = 0xE76F, + Library20 = 0xE770, + LightbulbCircle20 = 0xE771, + LightbulbFilament48 = 0xE772, + Line20 = 0xE773, + Line24 = 0xE774, + Line32 = 0xE775, + Line48 = 0xE776, + LineDashes20 = 0xE777, + LineDashes24 = 0xE778, + LineDashes32 = 0xE779, + LineDashes48 = 0xE77A, + LineHorizontal5Error20 = 0xE77B, + LineStyle20 = 0xE77C, + LineStyle24 = 0xE77D, + Link12 = 0xE77E, + Link32 = 0xE77F, + LinkDismiss16 = 0xE780, + LinkDismiss20 = 0xE781, + LinkDismiss24 = 0xE782, + LinkSquare12 = 0xE783, + LinkSquare16 = 0xE784, + LinkSquare20 = 0xE785, + LinkToolbox20 = 0xE786, + List16 = 0xE787, + LiveOff20 = 0xE788, + LiveOff24 = 0xE789, + Location48 = 0xE78A, + LocationAdd16 = 0xE78B, + LocationAdd20 = 0xE78C, + LocationAdd24 = 0xE78D, + LocationAddLeft20 = 0xE78E, + LocationAddRight20 = 0xE78F, + LocationAddUp20 = 0xE790, + LocationArrowLeft48 = 0xE791, + LocationArrowRight48 = 0xE792, + LocationArrowUp48 = 0xE793, + LocationDismiss20 = 0xE794, + LocationDismiss24 = 0xE795, + LocationOff16 = 0xE796, + LocationOff20 = 0xE797, + LocationOff24 = 0xE798, + LocationOff28 = 0xE799, + LocationOff48 = 0xE79A, + LockClosed12 = 0xE79B, + LockClosed16 = 0xE79C, + LockClosed20 = 0xE79D, + LockClosed24 = 0xE79E, + LockClosed32 = 0xE79F, + LockMultiple20 = 0xE7A0, + LockMultiple24 = 0xE7A1, + LockOpen16 = 0xE7A2, + LockOpen20 = 0xE7A3, + LockOpen24 = 0xE7A4, + LockOpen28 = 0xE7A5, + Lottery20 = 0xE7A6, + Lottery24 = 0xE7A7, + Luggage16 = 0xE7A8, + Luggage20 = 0xE7A9, + Luggage24 = 0xE7AA, + Luggage28 = 0xE7AB, + Luggage32 = 0xE7AC, + Luggage48 = 0xE7AD, + Mail12 = 0xE7AE, + Mail16 = 0xE7AF, + MailAlert28 = 0xE7B0, + MailAllRead16 = 0xE7B1, + MailAllRead24 = 0xE7B2, + MailAllRead28 = 0xE7B3, + MailArrowDoubleBack16 = 0xE7B4, + MailArrowDoubleBack20 = 0xE7B5, + MailArrowDown20 = 0xE7B6, + MailArrowForward16 = 0xE7B7, + MailArrowForward20 = 0xE7B8, + MailArrowUp16 = 0xE7B9, + MailAttach16 = 0xE7BA, + MailAttach20 = 0xE7BB, + MailAttach24 = 0xE7BC, + MailAttach28 = 0xE7BD, + MailCheckmark20 = 0xE7BE, + MailDismiss16 = 0xE7BF, + MailDismiss28 = 0xE7C0, + MailEdit20 = 0xE7C1, + MailEdit24 = 0xE7C2, + MailError16 = 0xE7C3, + MailInboxAll20 = 0xE7C4, + MailInboxAll24 = 0xE7C5, + MailInboxArrowDown20 = 0xE7C6, + MailInboxArrowRight20 = 0xE7C7, + MailInboxArrowRight24 = 0xE7C8, + MailInboxArrowUp20 = 0xE7C9, + MailInboxArrowUp24 = 0xE7CA, + MailInboxCheckmark16 = 0xE7CB, + MailInboxCheckmark20 = 0xE7CC, + MailInboxCheckmark24 = 0xE7CD, + MailInboxCheckmark28 = 0xE7CE, + MailList16 = 0xE7CF, + MailList20 = 0xE7D0, + MailList24 = 0xE7D1, + MailList28 = 0xE7D2, + MailMultiple16 = 0xE7D3, + MailMultiple20 = 0xE7D4, + MailMultiple24 = 0xE7D5, + MailMultiple28 = 0xE7D6, + MailOff20 = 0xE7D7, + MailOff24 = 0xE7D8, + MailOpenPerson16 = 0xE7D9, + MailOpenPerson20 = 0xE7DA, + MailOpenPerson24 = 0xE7DB, + MailPause20 = 0xE7DC, + MailProhibited16 = 0xE7DD, + MailProhibited28 = 0xE7DE, + MailRead16 = 0xE7DF, + MailReadMultiple16 = 0xE7E0, + MailReadMultiple24 = 0xE7E1, + MailReadMultiple28 = 0xE7E2, + MailSettings20 = 0xE7E3, + MailShield20 = 0xE7E4, + MailTemplate16 = 0xE7E5, + MailWarning20 = 0xE7E6, + MailWarning24 = 0xE7E7, + Map20 = 0xE7E8, + Markdown20 = 0xE7E9, + MatchAppLayout20 = 0xE7EA, + MathFormatLinear20 = 0xE7EB, + MathFormatLinear24 = 0xE7EC, + MathFormatProfessional20 = 0xE7ED, + MathFormatProfessional24 = 0xE7EE, + MathFormula16 = 0xE7EF, + MathFormula20 = 0xE7F0, + MathFormula24 = 0xE7F1, + MathFormula32 = 0xE7F2, + MathSymbols16 = 0xE7F3, + MathSymbols20 = 0xE7F4, + MathSymbols24 = 0xE7F5, + MathSymbols28 = 0xE7F6, + MathSymbols32 = 0xE7F7, + MathSymbols48 = 0xE7F8, + Maximize20 = 0xE7F9, + Maximize24 = 0xE7FA, + Maximize28 = 0xE7FB, + Maximize48 = 0xE7FC, + MeetNow16 = 0xE7FD, + MegaphoneLoud24 = 0xE7FE, + MegaphoneOff16 = 0xE7FF, + MegaphoneOff20 = 0xE800, + MegaphoneOff28 = 0xE801, + MentionArrowDown20 = 0xE802, + MentionBrackets20 = 0xE803, + Merge16 = 0xE804, + Merge20 = 0xE805, + Mic16 = 0xE806, + Mic20 = 0xE807, + Mic24 = 0xE808, + Mic28 = 0xE809, + Mic32 = 0xE80A, + Mic48 = 0xE80B, + MicOff20 = 0xE80C, + MicOff32 = 0xE80D, + MicOff48 = 0xE80E, + MicProhibited16 = 0xE80F, + MicProhibited20 = 0xE810, + MicProhibited24 = 0xE811, + MicProhibited28 = 0xE812, + MicProhibited48 = 0xE813, + MicPulse16 = 0xE814, + MicPulse20 = 0xE815, + MicPulse24 = 0xE816, + MicPulse28 = 0xE817, + MicPulse32 = 0xE818, + MicPulse48 = 0xE819, + MicPulseOff16 = 0xE81A, + MicPulseOff20 = 0xE81B, + MicPulseOff24 = 0xE81C, + MicPulseOff28 = 0xE81D, + MicPulseOff32 = 0xE81E, + MicPulseOff48 = 0xE81F, + MicSettings20 = 0xE820, + MicSparkle16 = 0xE821, + MicSparkle20 = 0xE822, + MicSparkle24 = 0xE823, + MicSync20 = 0xE824, + MobileOptimized20 = 0xE825, + MoneyCalculator20 = 0xE826, + MoneyCalculator24 = 0xE827, + MoneyDismiss20 = 0xE828, + MoneyDismiss24 = 0xE829, + MoneyHand20 = 0xE82A, + MoneyHand24 = 0xE82B, + MoneyOff20 = 0xE82C, + MoneyOff24 = 0xE82D, + MoneySettings20 = 0xE82E, + MoreCircle20 = 0xE82F, + MoreCircle32 = 0xE830, + MoreHorizontal16 = 0xE831, + MoreHorizontal20 = 0xE832, + MoreHorizontal24 = 0xE833, + MoreHorizontal28 = 0xE834, + MoreHorizontal32 = 0xE835, + MoreHorizontal48 = 0xE836, + MoreVertical16 = 0xE837, + MoreVertical32 = 0xE838, + MoviesAndTv16 = 0xE839, + MoviesAndTv20 = 0xE83A, + Multiplier12x20 = 0xE83B, + Multiplier12x24 = 0xE83C, + Multiplier12x28 = 0xE83D, + Multiplier12x32 = 0xE83E, + Multiplier12x48 = 0xE83F, + Multiplier15x20 = 0xE840, + Multiplier15x24 = 0xE841, + Multiplier15x28 = 0xE842, + Multiplier15x32 = 0xE843, + Multiplier15x48 = 0xE844, + Multiplier18x20 = 0xE845, + Multiplier18x24 = 0xE846, + Multiplier18x28 = 0xE847, + Multiplier18x32 = 0xE848, + Multiplier18x48 = 0xE849, + Multiplier1x20 = 0xE84A, + Multiplier1x24 = 0xE84B, + Multiplier1x28 = 0xE84C, + Multiplier1x32 = 0xE84D, + Multiplier1x48 = 0xE84E, + Multiplier2x20 = 0xE84F, + Multiplier2x24 = 0xE850, + Multiplier2x28 = 0xE851, + Multiplier2x32 = 0xE852, + Multiplier2x48 = 0xE853, + Multiplier5x20 = 0xE854, + Multiplier5x24 = 0xE855, + Multiplier5x28 = 0xE856, + Multiplier5x32 = 0xE857, + Multiplier5x48 = 0xE858, + MultiselectLtr16 = 0xE859, + MultiselectLtr20 = 0xE85A, + MultiselectLtr24 = 0xE85B, + MultiselectRtl16 = 0xE85C, + MultiselectRtl20 = 0xE85D, + MultiselectRtl24 = 0xE85E, + MusicNote120 = 0xE85F, + MusicNote124 = 0xE860, + MusicNote216 = 0xE861, + MusicNote220 = 0xE862, + MusicNote224 = 0xE863, + MusicNote2Play20 = 0xE864, + MusicNoteOff120 = 0xE865, + MusicNoteOff124 = 0xE866, + MusicNoteOff216 = 0xE867, + MusicNoteOff220 = 0xE868, + MusicNoteOff224 = 0xE869, + MyLocation12 = 0xE86A, + MyLocation16 = 0xE86B, + MyLocation20 = 0xE86C, + Navigation16 = 0xE86D, + NavigationLocationTarget20 = 0xE86E, + NavigationPlay20 = 0xE86F, + NavigationUnread20 = 0xE870, + NavigationUnread24 = 0xE871, + NetworkCheck20 = 0xE872, + New20 = 0xE873, + News16 = 0xE874, + Next28 = 0xE875, + Next32 = 0xE876, + Next48 = 0xE877, + Note28 = 0xE878, + Note48 = 0xE879, + NoteAdd28 = 0xE87A, + NoteAdd48 = 0xE87B, + NoteEdit20 = 0xE87C, + NoteEdit24 = 0xE87D, + NotePin20 = 0xE87E, + Notebook20 = 0xE87F, + NotebookAdd20 = 0xE880, + NotebookAdd24 = 0xE881, + NotebookArrowCurveDown20 = 0xE882, + NotebookError20 = 0xE883, + NotebookEye20 = 0xE884, + NotebookLightning20 = 0xE885, + NotebookQuestionMark20 = 0xE886, + NotebookSection20 = 0xE887, + NotebookSectionArrowRight24 = 0xE888, + NotebookSubsection20 = 0xE889, + NotebookSubsection24 = 0xE88A, + NotebookSync20 = 0xE88B, + Notepad12 = 0xE88C, + Notepad32 = 0xE88D, + NotepadEdit20 = 0xE88E, + NotepadPerson16 = 0xE88F, + NotepadPerson20 = 0xE890, + NotepadPerson24 = 0xE891, + NumberCircle116 = 0xE892, + NumberCircle120 = 0xE893, + NumberCircle124 = 0xE894, + NumberSymbol28 = 0xE895, + NumberSymbol32 = 0xE896, + NumberSymbol48 = 0xE897, + NumberSymbolDismiss20 = 0xE898, + NumberSymbolDismiss24 = 0xE899, + NumberSymbolSquare20 = 0xE89A, + NumberSymbolSquare24 = 0xE89B, + Open28 = 0xE89C, + Open48 = 0xE89D, + OpenFolder16 = 0xE89E, + OpenFolder20 = 0xE89F, + OpenFolder28 = 0xE8A0, + OpenFolder48 = 0xE8A1, + OpenOff16 = 0xE8A2, + OpenOff20 = 0xE8A3, + OpenOff24 = 0xE8A4, + OpenOff28 = 0xE8A5, + OpenOff48 = 0xE8A6, + Options48 = 0xE8A7, + Organization12 = 0xE8A8, + Organization16 = 0xE8A9, + Organization32 = 0xE8AA, + Organization48 = 0xE8AB, + OrganizationHorizontal20 = 0xE8AC, + Orientation20 = 0xE8AD, + Orientation24 = 0xE8AE, + Oval16 = 0xE8AF, + Oval20 = 0xE8B0, + Oval24 = 0xE8B1, + Oval28 = 0xE8B2, + Oval32 = 0xE8B3, + Oval48 = 0xE8B4, + PaintBrushArrowDown20 = 0xE8B5, + PaintBrushArrowDown24 = 0xE8B6, + PaintBrushArrowUp20 = 0xE8B7, + PaintBrushArrowUp24 = 0xE8B8, + Pair20 = 0xE8B9, + PanelBottom20 = 0xE8BA, + PanelBottomContract20 = 0xE8BB, + PanelBottomExpand20 = 0xE8BC, + PanelLeft16 = 0xE8BD, + PanelLeft20 = 0xE8BE, + PanelLeft24 = 0xE8BF, + PanelLeft28 = 0xE8C0, + PanelLeft48 = 0xE8C1, + PanelLeftContract16 = 0xE8C2, + PanelLeftContract20 = 0xE8C3, + PanelLeftContract24 = 0xE8C4, + PanelLeftContract28 = 0xE8C5, + PanelLeftExpand16 = 0xE8C6, + PanelLeftExpand20 = 0xE8C7, + PanelLeftExpand24 = 0xE8C8, + PanelLeftExpand28 = 0xE8C9, + PanelLeftFocusRight16 = 0xE8CA, + PanelLeftFocusRight20 = 0xE8CB, + PanelLeftFocusRight24 = 0xE8CC, + PanelLeftFocusRight28 = 0xE8CD, + PanelRight16 = 0xE8CE, + PanelRight20 = 0xE8CF, + PanelRight24 = 0xE8D0, + PanelRight28 = 0xE8D1, + PanelRight48 = 0xE8D2, + PanelRightContract16 = 0xE8D3, + PanelRightContract20 = 0xE8D4, + PanelRightContract24 = 0xE8D5, + PanelRightExpand20 = 0xE8D6, + PanelSeparateWindow20 = 0xE8D7, + PanelTopContract20 = 0xE8D8, + PanelTopExpand20 = 0xE8D9, + Password16 = 0xE8DA, + Password20 = 0xE8DB, + Patient20 = 0xE8DC, + Patient32 = 0xE8DD, + Pause12 = 0xE8DE, + Pause28 = 0xE8DF, + Pause32 = 0xE8E0, + PauseCircle24 = 0xE8E1, + PauseOff16 = 0xE8E2, + PauseOff20 = 0xE8E3, + PauseSettings16 = 0xE8E4, + PauseSettings20 = 0xE8E5, + Payment16 = 0xE8E6, + Payment28 = 0xE8E7, + Pen16 = 0xE8E8, + Pen20 = 0xE8E9, + Pen24 = 0xE8EA, + Pen28 = 0xE8EB, + Pen32 = 0xE8EC, + Pen48 = 0xE8ED, + PenOff16 = 0xE8EE, + PenOff20 = 0xE8EF, + PenOff24 = 0xE8F0, + PenOff28 = 0xE8F1, + PenOff32 = 0xE8F2, + PenOff48 = 0xE8F3, + PenProhibited16 = 0xE8F4, + PenProhibited20 = 0xE8F5, + PenProhibited24 = 0xE8F6, + PenProhibited28 = 0xE8F7, + PenProhibited32 = 0xE8F8, + PenProhibited48 = 0xE8F9, + Pentagon20 = 0xE8FA, + Pentagon32 = 0xE8FB, + Pentagon48 = 0xE8FC, + People12 = 0xE8FD, + People32 = 0xE8FE, + People48 = 0xE8FF, + PeopleAdd28 = 0xE900, + PeopleAudience20 = 0xE901, + PeopleCall16 = 0xE902, + PeopleCall20 = 0xE903, + PeopleCheckmark16 = 0xE904, + PeopleCheckmark20 = 0xE905, + PeopleCheckmark24 = 0xE906, + PeopleCommunityAdd20 = 0xE907, + PeopleCommunityAdd28 = 0xE908, + PeopleEdit20 = 0xE909, + PeopleError16 = 0xE90A, + PeopleError20 = 0xE90B, + PeopleError24 = 0xE90C, + PeopleList16 = 0xE90D, + PeopleList20 = 0xE90E, + PeopleList24 = 0xE90F, + PeopleList28 = 0xE910, + PeopleLock20 = 0xE911, + PeopleLock24 = 0xE912, + PeopleMoney20 = 0xE913, + PeopleMoney24 = 0xE914, + PeopleProhibited16 = 0xE915, + PeopleProhibited24 = 0xE916, + PeopleQueue20 = 0xE917, + PeopleQueue24 = 0xE918, + PeopleSearch20 = 0xE919, + PeopleSettings24 = 0xE91A, + PeopleSettings28 = 0xE91B, + PeopleSwap16 = 0xE91C, + PeopleSwap20 = 0xE91D, + PeopleSwap24 = 0xE91E, + PeopleSwap28 = 0xE91F, + PeopleSync20 = 0xE920, + PeopleSync28 = 0xE921, + PeopleTeam32 = 0xE922, + PeopleTeamAdd20 = 0xE923, + PeopleTeamAdd24 = 0xE924, + PeopleTeamDelete16 = 0xE925, + PeopleTeamDelete20 = 0xE926, + PeopleTeamDelete24 = 0xE927, + PeopleTeamDelete28 = 0xE928, + PeopleTeamDelete32 = 0xE929, + PeopleTeamToolbox20 = 0xE92A, + PeopleTeamToolbox24 = 0xE92B, + PeopleToolbox20 = 0xE92C, + Person32 = 0xE92D, + Person520 = 0xE92E, + Person532 = 0xE92F, + Person620 = 0xE930, + Person632 = 0xE931, + PersonAccounts20 = 0xE932, + PersonAdd16 = 0xE933, + PersonAdd28 = 0xE934, + PersonArrowLeft16 = 0xE935, + PersonAvailable20 = 0xE936, + PersonCall16 = 0xE937, + PersonCall20 = 0xE938, + PersonCircle12 = 0xE939, + PersonCircle20 = 0xE93A, + PersonCircle24 = 0xE93B, + PersonClock16 = 0xE93C, + PersonClock20 = 0xE93D, + PersonClock24 = 0xE93E, + PersonDelete20 = 0xE93F, + PersonEdit20 = 0xE940, + PersonEdit24 = 0xE941, + PersonFeedback16 = 0xE942, + PersonHeart24 = 0xE943, + PersonInfo20 = 0xE944, + PersonKey20 = 0xE945, + PersonLightbulb20 = 0xE946, + PersonLightbulb24 = 0xE947, + PersonLock24 = 0xE948, + PersonMail16 = 0xE949, + PersonMail20 = 0xE94A, + PersonMail24 = 0xE94B, + PersonMail28 = 0xE94C, + PersonMail48 = 0xE94D, + PersonMoney20 = 0xE94E, + PersonMoney24 = 0xE94F, + PersonNote20 = 0xE950, + PersonNote24 = 0xE951, + PersonPill20 = 0xE952, + PersonPill24 = 0xE953, + PersonProhibited16 = 0xE954, + PersonProhibited24 = 0xE955, + PersonProhibited28 = 0xE956, + PersonSettings16 = 0xE957, + PersonSettings20 = 0xE958, + PersonSubtract20 = 0xE959, + PersonSync16 = 0xE95A, + PersonSync20 = 0xE95B, + PersonSync24 = 0xE95C, + PersonSync28 = 0xE95D, + PersonSync32 = 0xE95E, + PersonSync48 = 0xE95F, + PersonTag20 = 0xE960, + PersonTag24 = 0xE961, + PersonTag28 = 0xE962, + PersonTag32 = 0xE963, + PersonTag48 = 0xE964, + Phone12 = 0xE965, + PhoneAdd20 = 0xE966, + PhoneAdd24 = 0xE967, + PhoneArrowRight20 = 0xE968, + PhoneArrowRight24 = 0xE969, + PhoneCheckmark20 = 0xE96A, + PhoneDesktopAdd20 = 0xE96B, + PhoneDismiss20 = 0xE96C, + PhoneDismiss24 = 0xE96D, + PhoneEraser16 = 0xE96E, + PhoneEraser20 = 0xE96F, + PhoneKey20 = 0xE970, + PhoneKey24 = 0xE971, + PhoneLaptop16 = 0xE972, + PhoneLaptop32 = 0xE973, + PhoneLinkSetup20 = 0xE974, + PhoneLock20 = 0xE975, + PhoneLock24 = 0xE976, + PhonePageHeader20 = 0xE977, + PhonePagination20 = 0xE978, + PhoneScreenTime20 = 0xE979, + PhoneShake20 = 0xE97A, + PhoneSpanIn16 = 0xE97B, + PhoneSpanIn20 = 0xE97C, + PhoneSpanIn24 = 0xE97D, + PhoneSpanIn28 = 0xE97E, + PhoneSpanOut16 = 0xE97F, + PhoneSpanOut20 = 0xE980, + PhoneSpanOut24 = 0xE981, + PhoneSpanOut28 = 0xE982, + PhoneSpeaker20 = 0xE983, + PhoneSpeaker24 = 0xE984, + PhoneStatusBar20 = 0xE985, + PhoneUpdate20 = 0xE986, + PhoneUpdateCheckmark20 = 0xE987, + PhoneUpdateCheckmark24 = 0xE988, + PhoneVerticalScroll20 = 0xE989, + PhoneVibrate20 = 0xE98A, + PhotoFilter20 = 0xE98B, + Pi20 = 0xE98C, + Pi24 = 0xE98D, + PictureInPictureEnter16 = 0xE98E, + PictureInPictureEnter20 = 0xE98F, + PictureInPictureEnter24 = 0xE990, + PictureInPictureExit16 = 0xE991, + PictureInPictureExit20 = 0xE992, + PictureInPictureExit24 = 0xE993, + Pin28 = 0xE994, + Pin32 = 0xE995, + Pin48 = 0xE996, + PinOff16 = 0xE997, + PinOff28 = 0xE998, + PinOff32 = 0xE999, + PinOff48 = 0xE99A, + Pipeline20 = 0xE99B, + PipelineAdd20 = 0xE99C, + PipelineArrowCurveDown20 = 0xE99D, + PipelinePlay20 = 0xE99E, + Pivot20 = 0xE99F, + Pivot24 = 0xE9A0, + Play12 = 0xE9A1, + Play16 = 0xE9A2, + Play28 = 0xE9A3, + Play32 = 0xE9A4, + PlayCircle16 = 0xE9A5, + PlayCircle20 = 0xE9A6, + PlayCircle28 = 0xE9A7, + PlayCircle48 = 0xE9A8, + PlaySettings20 = 0xE9A9, + PlayingCards20 = 0xE9AA, + PlugConnected20 = 0xE9AB, + PlugConnected24 = 0xE9AC, + PlugConnectedAdd20 = 0xE9AD, + PlugConnectedCheckmark20 = 0xE9AE, + PointScan20 = 0xE9AF, + Poll16 = 0xE9B0, + Poll20 = 0xE9B1, + PortHdmi20 = 0xE9B2, + PortHdmi24 = 0xE9B3, + PortMicroUsb20 = 0xE9B4, + PortMicroUsb24 = 0xE9B5, + PortUsbA20 = 0xE9B6, + PortUsbA24 = 0xE9B7, + PortUsbC20 = 0xE9B8, + PortUsbC24 = 0xE9B9, + PositionBackward20 = 0xE9BA, + PositionBackward24 = 0xE9BB, + PositionForward20 = 0xE9BC, + PositionForward24 = 0xE9BD, + PositionToBack20 = 0xE9BE, + PositionToBack24 = 0xE9BF, + PositionToFront20 = 0xE9C0, + PositionToFront24 = 0xE9C1, + Predictions20 = 0xE9C2, + Premium32 = 0xE9C3, + PremiumPerson16 = 0xE9C4, + PremiumPerson20 = 0xE9C5, + PremiumPerson24 = 0xE9C6, + PresenceAvailable20 = 0xE9C7, + PresenceAvailable24 = 0xE9C8, + PresenceAway20 = 0xE9C9, + PresenceAway24 = 0xE9CA, + PresenceBusy20 = 0xE9CB, + PresenceBusy24 = 0xE9CC, + PresenceDnd20 = 0xE9CD, + PresenceDnd24 = 0xE9CE, + Presenter20 = 0xE9CF, + PresenterOff20 = 0xE9D0, + Previous28 = 0xE9D1, + Previous32 = 0xE9D2, + Previous48 = 0xE9D3, + Print28 = 0xE9D4, + Print32 = 0xE9D5, + PrintAdd24 = 0xE9D6, + Prohibited12 = 0xE9D7, + ProhibitedMultiple16 = 0xE9D8, + ProhibitedMultiple20 = 0xE9D9, + ProhibitedMultiple24 = 0xE9DA, + ProhibitedNote20 = 0xE9DB, + ProjectionScreen16 = 0xE9DC, + ProjectionScreen20 = 0xE9DD, + ProjectionScreen24 = 0xE9DE, + ProjectionScreen28 = 0xE9DF, + ProjectionScreenDismiss16 = 0xE9E0, + ProjectionScreenDismiss20 = 0xE9E1, + ProjectionScreenDismiss24 = 0xE9E2, + ProjectionScreenDismiss28 = 0xE9E3, + Pulse20 = 0xE9E4, + Pulse24 = 0xE9E5, + Pulse28 = 0xE9E6, + Pulse32 = 0xE9E7, + PulseSquare20 = 0xE9E8, + PulseSquare24 = 0xE9E9, + PuzzleCube16 = 0xE9EA, + PuzzleCube20 = 0xE9EB, + PuzzleCube24 = 0xE9EC, + PuzzleCube28 = 0xE9ED, + PuzzleCube48 = 0xE9EE, + PuzzleCubePiece20 = 0xE9EF, + PuzzlePiece16 = 0xE9F0, + PuzzlePiece20 = 0xE9F1, + PuzzlePiece24 = 0xE9F2, + PuzzlePieceShield20 = 0xE9F3, + QrCode20 = 0xE9F4, + QuestionCircle12 = 0xE9F5, + QuestionCircle32 = 0xE9F6, + QuizNew20 = 0xE9F7, + Radar20 = 0xE9F8, + RadarCheckmark20 = 0xE9F9, + RadarRectangleMultiple20 = 0xE9FA, + Ram20 = 0xE9FB, + ReOrderDotsHorizontal16 = 0xE9FC, + ReOrderDotsHorizontal20 = 0xE9FD, + ReOrderDotsHorizontal24 = 0xE9FE, + ReOrderDotsVertical16 = 0xE9FF, + ReOrderDotsVertical20 = 0xEA00, + ReOrderDotsVertical24 = 0xEA01, + ReadAloud16 = 0xEA02, + ReadAloud28 = 0xEA03, + RealEstate20 = 0xEA04, + RealEstate24 = 0xEA05, + Receipt20 = 0xEA06, + Receipt24 = 0xEA07, + ReceiptAdd24 = 0xEA08, + ReceiptBag24 = 0xEA09, + ReceiptCube24 = 0xEA0A, + ReceiptMoney24 = 0xEA0B, + ReceiptPlay20 = 0xEA0C, + ReceiptPlay24 = 0xEA0D, + ReceiptSearch20 = 0xEA0E, + RectangleLandscape12 = 0xEA0F, + RectangleLandscape16 = 0xEA10, + RectangleLandscape20 = 0xEA11, + RectangleLandscape24 = 0xEA12, + RectangleLandscape28 = 0xEA13, + RectangleLandscape32 = 0xEA14, + RectangleLandscape48 = 0xEA15, + RectanglePortraitLocationTarget20 = 0xEA16, + Remote16 = 0xEA17, + Remote20 = 0xEA18, + Reorder20 = 0xEA19, + Replay20 = 0xEA1A, + Resize24 = 0xEA1B, + ResizeImage20 = 0xEA1C, + ResizeLarge16 = 0xEA1D, + ResizeLarge20 = 0xEA1E, + ResizeLarge24 = 0xEA1F, + ResizeSmall16 = 0xEA20, + ResizeSmall20 = 0xEA21, + ResizeSmall24 = 0xEA22, + ResizeTable20 = 0xEA23, + ResizeVideo20 = 0xEA24, + Rewind16 = 0xEA25, + Rewind28 = 0xEA26, + Rhombus16 = 0xEA27, + Rhombus20 = 0xEA28, + Rhombus24 = 0xEA29, + Rhombus28 = 0xEA2A, + Rhombus32 = 0xEA2B, + Rhombus48 = 0xEA2C, + Ribbon12 = 0xEA2D, + Ribbon16 = 0xEA2E, + Ribbon20 = 0xEA2F, + Ribbon24 = 0xEA30, + Ribbon32 = 0xEA31, + RibbonOff12 = 0xEA32, + RibbonOff16 = 0xEA33, + RibbonOff20 = 0xEA34, + RibbonOff24 = 0xEA35, + RibbonOff32 = 0xEA36, + RibbonStar20 = 0xEA37, + RibbonStar24 = 0xEA38, + RoadCone16 = 0xEA39, + RoadCone20 = 0xEA3A, + RoadCone24 = 0xEA3B, + RoadCone28 = 0xEA3C, + RoadCone32 = 0xEA3D, + RoadCone48 = 0xEA3E, + RotateLeft20 = 0xEA3F, + RotateLeft24 = 0xEA40, + RotateRight20 = 0xEA41, + RotateRight24 = 0xEA42, + Router20 = 0xEA43, + RowTriple20 = 0xEA44, + Rss20 = 0xEA45, + Rss24 = 0xEA46, + Run16 = 0xEA47, + Run20 = 0xEA48, + Sanitize20 = 0xEA49, + Sanitize24 = 0xEA4A, + Save16 = 0xEA4B, + Save28 = 0xEA4C, + SaveArrowRight20 = 0xEA4D, + SaveArrowRight24 = 0xEA4E, + SaveCopy20 = 0xEA4F, + SaveEdit20 = 0xEA50, + SaveEdit24 = 0xEA51, + SaveImage20 = 0xEA52, + SaveMultiple20 = 0xEA53, + SaveMultiple24 = 0xEA54, + SaveSearch20 = 0xEA55, + SaveSync20 = 0xEA56, + ScaleFill20 = 0xEA57, + Scales20 = 0xEA58, + Scales24 = 0xEA59, + Scales32 = 0xEA5A, + Scan16 = 0xEA5B, + Scan20 = 0xEA5C, + ScanCamera16 = 0xEA5D, + ScanCamera20 = 0xEA5E, + ScanCamera24 = 0xEA5F, + ScanCamera28 = 0xEA60, + ScanCamera48 = 0xEA61, + ScanDash12 = 0xEA62, + ScanDash16 = 0xEA63, + ScanDash20 = 0xEA64, + ScanDash24 = 0xEA65, + ScanDash28 = 0xEA66, + ScanDash32 = 0xEA67, + ScanDash48 = 0xEA68, + ScanObject20 = 0xEA69, + ScanObject24 = 0xEA6A, + ScanTable20 = 0xEA6B, + ScanTable24 = 0xEA6C, + ScanText20 = 0xEA6D, + ScanText24 = 0xEA6E, + ScanThumbUp16 = 0xEA6F, + ScanThumbUp20 = 0xEA70, + ScanThumbUp24 = 0xEA71, + ScanThumbUp28 = 0xEA72, + ScanThumbUp48 = 0xEA73, + ScanThumbUpOff16 = 0xEA74, + ScanThumbUpOff20 = 0xEA75, + ScanThumbUpOff24 = 0xEA76, + ScanThumbUpOff28 = 0xEA77, + ScanThumbUpOff48 = 0xEA78, + ScanType20 = 0xEA79, + ScanType24 = 0xEA7A, + ScanTypeCheckmark20 = 0xEA7B, + ScanTypeCheckmark24 = 0xEA7C, + ScanTypeOff20 = 0xEA7D, + Scratchpad20 = 0xEA7E, + ScreenCut20 = 0xEA7F, + ScreenPerson20 = 0xEA80, + ScreenSearch20 = 0xEA81, + ScreenSearch24 = 0xEA82, + Search12 = 0xEA83, + Search16 = 0xEA84, + Search32 = 0xEA85, + Search48 = 0xEA86, + SearchInfo20 = 0xEA87, + SearchSettings20 = 0xEA88, + SearchShield20 = 0xEA89, + SearchSquare20 = 0xEA8A, + SearchVisual16 = 0xEA8B, + SearchVisual20 = 0xEA8C, + SearchVisual24 = 0xEA8D, + SelectAllOff20 = 0xEA8E, + SelectAllOn20 = 0xEA8F, + SelectAllOn24 = 0xEA90, + SelectObjectSkew20 = 0xEA91, + SelectObjectSkew24 = 0xEA92, + SelectObjectSkewDismiss20 = 0xEA93, + SelectObjectSkewDismiss24 = 0xEA94, + SelectObjectSkewEdit20 = 0xEA95, + SelectObjectSkewEdit24 = 0xEA96, + Send16 = 0xEA97, + SendClock24 = 0xEA98, + SendCopy20 = 0xEA99, + ServerMultiple20 = 0xEA9A, + ServerPlay20 = 0xEA9B, + ServiceBell20 = 0xEA9C, + Settings32 = 0xEA9D, + Settings48 = 0xEA9E, + SettingsChat20 = 0xEA9F, + SettingsChat24 = 0xEAA0, + ShapeExclude16 = 0xEAA1, + ShapeExclude20 = 0xEAA2, + ShapeExclude24 = 0xEAA3, + ShapeIntersect16 = 0xEAA4, + ShapeIntersect20 = 0xEAA5, + ShapeIntersect24 = 0xEAA6, + ShapeSubtract16 = 0xEAA7, + ShapeSubtract20 = 0xEAA8, + ShapeSubtract24 = 0xEAA9, + ShapeUnion16 = 0xEAAA, + ShapeUnion20 = 0xEAAB, + ShapeUnion24 = 0xEAAC, + Shapes28 = 0xEAAD, + Shapes48 = 0xEAAE, + Share16 = 0xEAAF, + Share28 = 0xEAB0, + Share48 = 0xEAB1, + ShareCloseTray20 = 0xEAB2, + ShareScreenPerson16 = 0xEAB3, + ShareScreenPerson20 = 0xEAB4, + ShareScreenPerson24 = 0xEAB5, + ShareScreenPerson28 = 0xEAB6, + ShareScreenPersonOverlay16 = 0xEAB7, + ShareScreenPersonOverlay20 = 0xEAB8, + ShareScreenPersonOverlay24 = 0xEAB9, + ShareScreenPersonOverlay28 = 0xEABA, + ShareScreenPersonOverlayInside16 = 0xEABB, + ShareScreenPersonOverlayInside20 = 0xEABC, + ShareScreenPersonOverlayInside24 = 0xEABD, + ShareScreenPersonOverlayInside28 = 0xEABE, + ShareScreenPersonP16 = 0xEABF, + ShareScreenPersonP20 = 0xEAC0, + ShareScreenPersonP24 = 0xEAC1, + ShareScreenPersonP28 = 0xEAC2, + ShareScreenStart20 = 0xEAC3, + ShareScreenStart24 = 0xEAC4, + ShareScreenStart28 = 0xEAC5, + ShareScreenStart48 = 0xEAC6, + ShareScreenStop16 = 0xEAC7, + ShareScreenStop20 = 0xEAC8, + ShareScreenStop24 = 0xEAC9, + ShareScreenStop28 = 0xEACA, + ShareScreenStop48 = 0xEACB, + Shield16 = 0xEACC, + Shield28 = 0xEACD, + Shield48 = 0xEACE, + ShieldBadge24 = 0xEACF, + ShieldCheckmark16 = 0xEAD0, + ShieldCheckmark20 = 0xEAD1, + ShieldCheckmark24 = 0xEAD2, + ShieldCheckmark28 = 0xEAD3, + ShieldCheckmark48 = 0xEAD4, + ShieldDismiss16 = 0xEAD5, + ShieldDismissShield20 = 0xEAD6, + ShieldError16 = 0xEAD7, + ShieldLock16 = 0xEAD8, + ShieldLock20 = 0xEAD9, + ShieldLock24 = 0xEADA, + ShieldLock28 = 0xEADB, + ShieldLock48 = 0xEADC, + ShieldPerson20 = 0xEADD, + ShieldPersonAdd20 = 0xEADE, + ShieldTask16 = 0xEADF, + ShieldTask20 = 0xEAE0, + ShieldTask24 = 0xEAE1, + ShieldTask28 = 0xEAE2, + ShieldTask48 = 0xEAE3, + Shifts16 = 0xEAE4, + Shifts20 = 0xEAE5, + Shifts30Minutes20 = 0xEAE6, + Shifts32 = 0xEAE7, + ShiftsAdd20 = 0xEAE8, + ShiftsAvailability20 = 0xEAE9, + ShiftsCheckmark20 = 0xEAEA, + ShiftsCheckmark24 = 0xEAEB, + ShiftsDay20 = 0xEAEC, + ShiftsDay24 = 0xEAED, + ShiftsProhibited20 = 0xEAEE, + ShiftsProhibited24 = 0xEAEF, + ShiftsQuestionMark20 = 0xEAF0, + ShiftsQuestionMark24 = 0xEAF1, + ShiftsTeam20 = 0xEAF2, + ShoppingBagArrowLeft20 = 0xEAF3, + ShoppingBagArrowLeft24 = 0xEAF4, + ShoppingBagDismiss20 = 0xEAF5, + ShoppingBagDismiss24 = 0xEAF6, + ShoppingBagPause20 = 0xEAF7, + ShoppingBagPause24 = 0xEAF8, + ShoppingBagPercent20 = 0xEAF9, + ShoppingBagPercent24 = 0xEAFA, + ShoppingBagPlay20 = 0xEAFB, + ShoppingBagPlay24 = 0xEAFC, + ShoppingBagTag20 = 0xEAFD, + ShoppingBagTag24 = 0xEAFE, + Shortpick20 = 0xEAFF, + Shortpick24 = 0xEB00, + SidebarSearchLtr20 = 0xEB01, + SidebarSearchRtl20 = 0xEB02, + SignOut20 = 0xEB03, + SkipBack1020 = 0xEB04, + SkipBack1024 = 0xEB05, + SkipBack1028 = 0xEB06, + SkipBack1032 = 0xEB07, + SkipBack1048 = 0xEB08, + SkipForward1020 = 0xEB09, + SkipForward1024 = 0xEB0A, + SkipForward1028 = 0xEB0B, + SkipForward1032 = 0xEB0C, + SkipForward1048 = 0xEB0D, + SkipForward3020 = 0xEB0E, + SkipForward3024 = 0xEB0F, + SkipForward3028 = 0xEB10, + SkipForward3032 = 0xEB11, + SkipForward3048 = 0xEB12, + SkipForwardTab20 = 0xEB13, + SkipForwardTab24 = 0xEB14, + Sleep20 = 0xEB15, + SlideAdd16 = 0xEB16, + SlideAdd20 = 0xEB17, + SlideAdd28 = 0xEB18, + SlideAdd32 = 0xEB19, + SlideAdd48 = 0xEB1A, + SlideArrowRight20 = 0xEB1B, + SlideArrowRight24 = 0xEB1C, + SlideEraser16 = 0xEB1D, + SlideEraser20 = 0xEB1E, + SlideEraser24 = 0xEB1F, + SlideGrid20 = 0xEB20, + SlideGrid24 = 0xEB21, + SlideHide20 = 0xEB22, + SlideMicrophone20 = 0xEB23, + SlideMicrophone32 = 0xEB24, + SlideMultiple20 = 0xEB25, + SlideMultiple24 = 0xEB26, + SlideMultipleArrowRight20 = 0xEB27, + SlideMultipleArrowRight24 = 0xEB28, + SlideSearch20 = 0xEB29, + SlideSearch24 = 0xEB2A, + SlideSearch28 = 0xEB2B, + SlideSettings20 = 0xEB2C, + SlideSettings24 = 0xEB2D, + SlideSize20 = 0xEB2E, + SlideSize24 = 0xEB2F, + SlideText16 = 0xEB30, + SlideText20 = 0xEB31, + SlideText28 = 0xEB32, + SlideText48 = 0xEB33, + SlideTransition20 = 0xEB34, + SlideTransition24 = 0xEB35, + Snooze20 = 0xEB36, + SoundSource20 = 0xEB37, + SoundWaveCircle20 = 0xEB38, + SoundWaveCircle24 = 0xEB39, + Spacebar20 = 0xEB3A, + Sparkle16 = 0xEB3B, + Sparkle20 = 0xEB3C, + Sparkle24 = 0xEB3D, + Sparkle28 = 0xEB3E, + Sparkle48 = 0xEB3F, + Speaker016 = 0xEB40, + Speaker020 = 0xEB41, + Speaker028 = 0xEB42, + Speaker032 = 0xEB43, + Speaker048 = 0xEB44, + Speaker116 = 0xEB45, + Speaker120 = 0xEB46, + Speaker128 = 0xEB47, + Speaker132 = 0xEB48, + Speaker148 = 0xEB49, + Speaker216 = 0xEB4A, + Speaker220 = 0xEB4B, + Speaker224 = 0xEB4C, + Speaker228 = 0xEB4D, + Speaker232 = 0xEB4E, + Speaker248 = 0xEB4F, + SpeakerBluetooth20 = 0xEB50, + SpeakerBluetooth28 = 0xEB51, + SpeakerMute16 = 0xEB52, + SpeakerMute20 = 0xEB53, + SpeakerMute24 = 0xEB54, + SpeakerMute28 = 0xEB55, + SpeakerMute48 = 0xEB56, + SpeakerOff16 = 0xEB57, + SpeakerOff20 = 0xEB58, + SpeakerOff48 = 0xEB59, + SpeakerSettings20 = 0xEB5A, + SpeakerSettings28 = 0xEB5B, + SpeakerUsb20 = 0xEB5C, + SpeakerUsb24 = 0xEB5D, + SpeakerUsb28 = 0xEB5E, + SplitHint20 = 0xEB5F, + SplitHorizontal12 = 0xEB60, + SplitHorizontal16 = 0xEB61, + SplitHorizontal20 = 0xEB62, + SplitHorizontal24 = 0xEB63, + SplitHorizontal28 = 0xEB64, + SplitHorizontal32 = 0xEB65, + SplitHorizontal48 = 0xEB66, + SplitVertical12 = 0xEB67, + SplitVertical16 = 0xEB68, + SplitVertical20 = 0xEB69, + SplitVertical24 = 0xEB6A, + SplitVertical28 = 0xEB6B, + SplitVertical32 = 0xEB6C, + SplitVertical48 = 0xEB6D, + Sport16 = 0xEB6E, + Sport20 = 0xEB6F, + Sport24 = 0xEB70, + SportAmericanFootball20 = 0xEB71, + SportAmericanFootball24 = 0xEB72, + SportBaseball20 = 0xEB73, + SportBaseball24 = 0xEB74, + SportBasketball20 = 0xEB75, + SportBasketball24 = 0xEB76, + SportHockey20 = 0xEB77, + SportHockey24 = 0xEB78, + SportSoccer16 = 0xEB79, + SportSoccer20 = 0xEB7A, + SportSoccer24 = 0xEB7B, + Square12 = 0xEB7C, + Square16 = 0xEB7D, + Square20 = 0xEB7E, + Square24 = 0xEB7F, + Square28 = 0xEB80, + Square32 = 0xEB81, + Square48 = 0xEB82, + SquareAdd16 = 0xEB83, + SquareAdd20 = 0xEB84, + SquareArrowForward16 = 0xEB85, + SquareArrowForward20 = 0xEB86, + SquareArrowForward24 = 0xEB87, + SquareArrowForward28 = 0xEB88, + SquareArrowForward32 = 0xEB89, + SquareArrowForward48 = 0xEB8A, + SquareDismiss16 = 0xEB8B, + SquareDismiss20 = 0xEB8C, + SquareEraser20 = 0xEB8D, + SquareHint16 = 0xEB8E, + SquareHint20 = 0xEB8F, + SquareHint24 = 0xEB90, + SquareHint28 = 0xEB91, + SquareHint32 = 0xEB92, + SquareHint48 = 0xEB93, + SquareHintApps20 = 0xEB94, + SquareHintApps24 = 0xEB95, + SquareHintArrowBack16 = 0xEB96, + SquareHintArrowBack20 = 0xEB97, + SquareHintSparkles16 = 0xEB98, + SquareHintSparkles20 = 0xEB99, + SquareHintSparkles24 = 0xEB9A, + SquareHintSparkles28 = 0xEB9B, + SquareHintSparkles32 = 0xEB9C, + SquareHintSparkles48 = 0xEB9D, + SquareMultiple16 = 0xEB9E, + SquareMultiple20 = 0xEB9F, + SquareShadow12 = 0xEBA0, + SquareShadow20 = 0xEBA1, + SquaresNested20 = 0xEBA2, + StackArrowForward20 = 0xEBA3, + StackArrowForward24 = 0xEBA4, + StackStar16 = 0xEBA5, + StackStar20 = 0xEBA6, + StackStar24 = 0xEBA7, + Star48 = 0xEBA8, + StarAdd28 = 0xEBA9, + StarArrowRightEnd20 = 0xEBAA, + StarArrowRightEnd24 = 0xEBAB, + StarArrowRightStart20 = 0xEBAC, + StarDismiss16 = 0xEBAD, + StarDismiss20 = 0xEBAE, + StarDismiss24 = 0xEBAF, + StarDismiss28 = 0xEBB0, + StarEdit20 = 0xEBB1, + StarEdit24 = 0xEBB2, + StarEmphasis20 = 0xEBB3, + StarEmphasis32 = 0xEBB4, + StarLineHorizontal316 = 0xEBB5, + StarLineHorizontal320 = 0xEBB6, + StarLineHorizontal324 = 0xEBB7, + StarSettings20 = 0xEBB8, + Steps20 = 0xEBB9, + Steps24 = 0xEBBA, + Sticker12 = 0xEBBB, + StickerAdd20 = 0xEBBC, + Storage20 = 0xEBBD, + Stream20 = 0xEBBE, + Stream24 = 0xEBBF, + StreamInput20 = 0xEBC0, + StreamInputOutput20 = 0xEBC1, + StreamOutput20 = 0xEBC2, + StyleGuide20 = 0xEBC3, + SubGrid20 = 0xEBC4, + Subtitles16 = 0xEBC5, + Subtitles20 = 0xEBC6, + Subtitles24 = 0xEBC7, + Subtract12 = 0xEBC8, + Subtract16 = 0xEBC9, + Subtract20 = 0xEBCA, + Subtract24 = 0xEBCB, + Subtract28 = 0xEBCC, + Subtract48 = 0xEBCD, + SubtractCircle12 = 0xEBCE, + SubtractCircleArrowBack16 = 0xEBCF, + SubtractCircleArrowBack20 = 0xEBD0, + SubtractCircleArrowForward16 = 0xEBD1, + SubtractCircleArrowForward20 = 0xEBD2, + SubtractSquare20 = 0xEBD3, + SubtractSquare24 = 0xEBD4, + SubtractSquareMultiple16 = 0xEBD5, + SubtractSquareMultiple20 = 0xEBD6, + SwipeDown20 = 0xEBD7, + SwipeRight20 = 0xEBD8, + SwipeUp20 = 0xEBD9, + Symbols16 = 0xEBDA, + Symbols20 = 0xEBDB, + Syringe20 = 0xEBDC, + Syringe24 = 0xEBDD, + System20 = 0xEBDE, + TabAdd20 = 0xEBDF, + TabAdd24 = 0xEBE0, + TabArrowLeft20 = 0xEBE1, + TabArrowLeft24 = 0xEBE2, + TabDesktop16 = 0xEBE3, + TabDesktop24 = 0xEBE4, + TabDesktopArrowLeft20 = 0xEBE5, + TabDesktopBottom20 = 0xEBE6, + TabDesktopBottom24 = 0xEBE7, + TabDesktopMultipleBottom20 = 0xEBE8, + TabDesktopMultipleBottom24 = 0xEBE9, + TabProhibited20 = 0xEBEA, + TabProhibited24 = 0xEBEB, + TabShieldDismiss20 = 0xEBEC, + TabShieldDismiss24 = 0xEBED, + Table16 = 0xEBEE, + Table28 = 0xEBEF, + Table32 = 0xEBF0, + Table48 = 0xEBF1, + TableAdd16 = 0xEBF2, + TableAdd20 = 0xEBF3, + TableAdd28 = 0xEBF4, + TableBottomRow16 = 0xEBF5, + TableBottomRow20 = 0xEBF6, + TableBottomRow24 = 0xEBF7, + TableBottomRow28 = 0xEBF8, + TableBottomRow32 = 0xEBF9, + TableBottomRow48 = 0xEBFA, + TableCellEdit16 = 0xEBFB, + TableCellEdit20 = 0xEBFC, + TableCellEdit24 = 0xEBFD, + TableCellEdit28 = 0xEBFE, + TableCellsMerge16 = 0xEBFF, + TableCellsMerge28 = 0xEC00, + TableCellsSplit16 = 0xEC01, + TableCellsSplit28 = 0xEC02, + TableChecker20 = 0xEC03, + TableCopy20 = 0xEC04, + TableDeleteColumn16 = 0xEC05, + TableDeleteColumn20 = 0xEC06, + TableDeleteColumn24 = 0xEC07, + TableDeleteColumn28 = 0xEC08, + TableDeleteRow16 = 0xEC09, + TableDeleteRow20 = 0xEC0A, + TableDeleteRow24 = 0xEC0B, + TableDeleteRow28 = 0xEC0C, + TableDismiss16 = 0xEC0D, + TableDismiss20 = 0xEC0E, + TableDismiss24 = 0xEC0F, + TableDismiss28 = 0xEC10, + TableEdit16 = 0xEC11, + TableEdit20 = 0xEC12, + TableEdit28 = 0xEC13, + TableFreezeColumn16 = 0xEC14, + TableFreezeColumn20 = 0xEC15, + TableFreezeColumn28 = 0xEC16, + TableFreezeColumnAndRow16 = 0xEC17, + TableFreezeColumnAndRow20 = 0xEC18, + TableFreezeColumnAndRow24 = 0xEC19, + TableFreezeColumnAndRow28 = 0xEC1A, + TableFreezeRow16 = 0xEC1B, + TableFreezeRow20 = 0xEC1C, + TableFreezeRow28 = 0xEC1D, + TableImage20 = 0xEC1E, + TableInsertColumn16 = 0xEC1F, + TableInsertColumn20 = 0xEC20, + TableInsertColumn24 = 0xEC21, + TableInsertColumn28 = 0xEC22, + TableInsertRow16 = 0xEC23, + TableInsertRow20 = 0xEC24, + TableInsertRow24 = 0xEC25, + TableInsertRow28 = 0xEC26, + TableLightning16 = 0xEC27, + TableLightning20 = 0xEC28, + TableLightning24 = 0xEC29, + TableLightning28 = 0xEC2A, + TableLink16 = 0xEC2B, + TableLink20 = 0xEC2C, + TableLink24 = 0xEC2D, + TableLink28 = 0xEC2E, + TableMoveAbove16 = 0xEC2F, + TableMoveAbove20 = 0xEC30, + TableMoveAbove24 = 0xEC31, + TableMoveAbove28 = 0xEC32, + TableMoveBelow16 = 0xEC33, + TableMoveBelow20 = 0xEC34, + TableMoveBelow24 = 0xEC35, + TableMoveBelow28 = 0xEC36, + TableMoveLeft16 = 0xEC37, + TableMoveLeft20 = 0xEC38, + TableMoveLeft28 = 0xEC39, + TableMoveRight16 = 0xEC3A, + TableMoveRight20 = 0xEC3B, + TableMoveRight28 = 0xEC3C, + TableMultiple20 = 0xEC3D, + TableResizeColumn16 = 0xEC3E, + TableResizeColumn20 = 0xEC3F, + TableResizeColumn24 = 0xEC40, + TableResizeColumn28 = 0xEC41, + TableResizeRow16 = 0xEC42, + TableResizeRow20 = 0xEC43, + TableResizeRow24 = 0xEC44, + TableResizeRow28 = 0xEC45, + TableSearch20 = 0xEC46, + TableSettings16 = 0xEC47, + TableSettings20 = 0xEC48, + TableSettings28 = 0xEC49, + TableSimple16 = 0xEC4A, + TableSimple20 = 0xEC4B, + TableSimple24 = 0xEC4C, + TableSimple28 = 0xEC4D, + TableSimple48 = 0xEC4E, + TableSplit20 = 0xEC4F, + TableStackAbove16 = 0xEC50, + TableStackAbove20 = 0xEC51, + TableStackAbove24 = 0xEC52, + TableStackAbove28 = 0xEC53, + TableStackBelow16 = 0xEC54, + TableStackBelow20 = 0xEC55, + TableStackBelow24 = 0xEC56, + TableStackBelow28 = 0xEC57, + TableStackLeft16 = 0xEC58, + TableStackLeft20 = 0xEC59, + TableStackLeft24 = 0xEC5A, + TableStackLeft28 = 0xEC5B, + TableStackRight16 = 0xEC5C, + TableStackRight20 = 0xEC5D, + TableStackRight24 = 0xEC5E, + TableStackRight28 = 0xEC5F, + TableSwitch16 = 0xEC60, + TableSwitch20 = 0xEC61, + TableSwitch28 = 0xEC62, + Tablet12 = 0xEC63, + Tablet16 = 0xEC64, + Tablet32 = 0xEC65, + Tablet48 = 0xEC66, + TabletSpeaker20 = 0xEC67, + TabletSpeaker24 = 0xEC68, + Tabs20 = 0xEC69, + Tag16 = 0xEC6A, + Tag28 = 0xEC6B, + Tag32 = 0xEC6C, + TagCircle20 = 0xEC6D, + TagDismiss16 = 0xEC6E, + TagDismiss20 = 0xEC6F, + TagDismiss24 = 0xEC70, + TagError16 = 0xEC71, + TagError20 = 0xEC72, + TagError24 = 0xEC73, + TagLock16 = 0xEC74, + TagLock20 = 0xEC75, + TagLock24 = 0xEC76, + TagLock32 = 0xEC77, + TagLockAccent16 = 0xEC78, + TagLockAccent20 = 0xEC79, + TagLockAccent24 = 0xEC7A, + TagLockAccent32 = 0xEC7B, + TagMultiple20 = 0xEC7C, + TagMultiple24 = 0xEC7D, + TagOff20 = 0xEC7E, + TagOff24 = 0xEC7F, + TagQuestionMark16 = 0xEC80, + TagQuestionMark20 = 0xEC81, + TagQuestionMark24 = 0xEC82, + TagQuestionMark32 = 0xEC83, + TagReset20 = 0xEC84, + TagReset24 = 0xEC85, + TagSearch20 = 0xEC86, + TagSearch24 = 0xEC87, + TapDouble20 = 0xEC88, + TapDouble32 = 0xEC89, + TapDouble48 = 0xEC8A, + TapSingle20 = 0xEC8B, + TapSingle32 = 0xEC8C, + TapSingle48 = 0xEC8D, + Target32 = 0xEC8E, + TargetArrow24 = 0xEC8F, + TaskListLtr20 = 0xEC90, + TaskListLtr24 = 0xEC91, + TaskListRtl20 = 0xEC92, + TaskListRtl24 = 0xEC93, + TaskListSquareAdd20 = 0xEC94, + TaskListSquareAdd24 = 0xEC95, + TaskListSquareDatabase20 = 0xEC96, + TaskListSquareLtr20 = 0xEC97, + TaskListSquareLtr24 = 0xEC98, + TaskListSquarePerson20 = 0xEC99, + TaskListSquareRtl20 = 0xEC9A, + TaskListSquareRtl24 = 0xEC9B, + TaskListSquareSettings20 = 0xEC9C, + TasksApp20 = 0xEC9D, + Teddy20 = 0xEC9E, + Temperature16 = 0xEC9F, + Tent12 = 0xECA0, + Tent16 = 0xECA1, + Tent20 = 0xECA2, + Tent28 = 0xECA3, + Tent48 = 0xECA4, + TetrisApp16 = 0xECA5, + TetrisApp20 = 0xECA6, + TetrisApp24 = 0xECA7, + TetrisApp28 = 0xECA8, + TetrisApp32 = 0xECA9, + TetrisApp48 = 0xECAA, + Text12 = 0xECAB, + Text16 = 0xECAC, + Text32 = 0xECAD, + TextAdd20 = 0xECAE, + TextAddT24 = 0xECAF, + TextAlignCenter16 = 0xECB0, + TextAlignCenterRotate27016 = 0xECB1, + TextAlignCenterRotate27020 = 0xECB2, + TextAlignCenterRotate27024 = 0xECB3, + TextAlignCenterRotate9016 = 0xECB4, + TextAlignCenterRotate9020 = 0xECB5, + TextAlignCenterRotate9024 = 0xECB6, + TextAlignDistributedEvenly20 = 0xECB7, + TextAlignDistributedEvenly24 = 0xECB8, + TextAlignDistributedVertical20 = 0xECB9, + TextAlignDistributedVertical24 = 0xECBA, + TextAlignJustifyLow20 = 0xECBB, + TextAlignJustifyLow24 = 0xECBC, + TextAlignJustifyRotate27020 = 0xECBD, + TextAlignJustifyRotate27024 = 0xECBE, + TextAlignJustifyRotate9020 = 0xECBF, + TextAlignJustifyRotate9024 = 0xECC0, + TextAlignLeft16 = 0xECC1, + TextAlignLeftRotate27016 = 0xECC2, + TextAlignLeftRotate27020 = 0xECC3, + TextAlignLeftRotate27024 = 0xECC4, + TextAlignLeftRotate9016 = 0xECC5, + TextAlignLeftRotate9020 = 0xECC6, + TextAlignLeftRotate9024 = 0xECC7, + TextAlignRight16 = 0xECC8, + TextAlignRightRotate27016 = 0xECC9, + TextAlignRightRotate27020 = 0xECCA, + TextAlignRightRotate27024 = 0xECCB, + TextAlignRightRotate9016 = 0xECCC, + TextAlignRightRotate9020 = 0xECCD, + TextAlignRightRotate9024 = 0xECCE, + TextBaseline20 = 0xECCF, + TextBold16 = 0xECD0, + TextBoxSettings20 = 0xECD1, + TextBoxSettings24 = 0xECD2, + TextBulletListAdd20 = 0xECD3, + TextBulletListCheckmark20 = 0xECD4, + TextBulletListDismiss20 = 0xECD5, + TextBulletListLtr16 = 0xECD6, + TextBulletListLtr20 = 0xECD7, + TextBulletListLtr24 = 0xECD8, + TextBulletListRotate27020 = 0xECD9, + TextBulletListRotate27024 = 0xECDA, + TextBulletListRotate9020 = 0xECDB, + TextBulletListRotate9024 = 0xECDC, + TextBulletListRtl16 = 0xECDD, + TextBulletListRtl20 = 0xECDE, + TextBulletListRtl24 = 0xECDF, + TextBulletListSquare20 = 0xECE0, + TextBulletListSquareClock20 = 0xECE1, + TextBulletListSquarePerson20 = 0xECE2, + TextBulletListSquareSearch20 = 0xECE3, + TextBulletListSquareSettings20 = 0xECE4, + TextBulletListSquareShield20 = 0xECE5, + TextBulletListSquareToolbox20 = 0xECE6, + TextCaseLowercase16 = 0xECE7, + TextCaseLowercase20 = 0xECE8, + TextCaseLowercase24 = 0xECE9, + TextCaseTitle16 = 0xECEA, + TextCaseTitle20 = 0xECEB, + TextCaseTitle24 = 0xECEC, + TextCaseUppercase16 = 0xECED, + TextCaseUppercase20 = 0xECEE, + TextCaseUppercase24 = 0xECEF, + TextChangeCase16 = 0xECF0, + TextClearFormatting16 = 0xECF1, + TextCollapse20 = 0xECF2, + TextColor16 = 0xECF3, + TextColorAccent16 = 0xECF4, + TextColorAccent20 = 0xECF5, + TextColorAccent24 = 0xECF6, + TextColumnOneNarrow20 = 0xECF7, + TextColumnOneNarrow24 = 0xECF8, + TextColumnOneWide20 = 0xECF9, + TextColumnOneWide24 = 0xECFA, + TextColumnOneWideLightning20 = 0xECFB, + TextColumnOneWideLightning24 = 0xECFC, + TextContinuous20 = 0xECFD, + TextContinuous24 = 0xECFE, + TextDensity16 = 0xECFF, + TextDensity20 = 0xED00, + TextDensity24 = 0xED01, + TextDensity28 = 0xED02, + TextDirectionHorizontalLeft20 = 0xED03, + TextDirectionHorizontalLeft24 = 0xED04, + TextDirectionHorizontalRight20 = 0xED05, + TextDirectionHorizontalRight24 = 0xED06, + TextDirectionRotate270Right20 = 0xED07, + TextDirectionRotate270Right24 = 0xED08, + TextDirectionRotate90Left20 = 0xED09, + TextDirectionRotate90Left24 = 0xED0A, + TextDirectionRotate90Right20 = 0xED0B, + TextDirectionRotate90Right24 = 0xED0C, + TextExpand20 = 0xED0D, + TextFontInfo16 = 0xED0E, + TextFontInfo20 = 0xED0F, + TextFontInfo24 = 0xED10, + TextFontSize16 = 0xED11, + TextGrammarArrowLeft20 = 0xED12, + TextGrammarArrowLeft24 = 0xED13, + TextGrammarArrowRight20 = 0xED14, + TextGrammarArrowRight24 = 0xED15, + TextGrammarCheckmark20 = 0xED16, + TextGrammarCheckmark24 = 0xED17, + TextGrammarDismiss20 = 0xED18, + TextGrammarDismiss24 = 0xED19, + TextGrammarError20 = 0xED1A, + TextGrammarSettings20 = 0xED1B, + TextGrammarSettings24 = 0xED1C, + TextGrammarWand16 = 0xED1D, + TextGrammarWand20 = 0xED1E, + TextGrammarWand24 = 0xED1F, + TextHeader124 = 0xED20, + TextHeader224 = 0xED21, + TextHeader324 = 0xED22, + TextIndentDecreaseLtr16 = 0xED23, + TextIndentDecreaseLtr20 = 0xED24, + TextIndentDecreaseLtr24 = 0xED25, + TextIndentDecreaseRotate27020 = 0xED26, + TextIndentDecreaseRotate27024 = 0xED27, + TextIndentDecreaseRotate9020 = 0xED28, + TextIndentDecreaseRotate9024 = 0xED29, + TextIndentDecreaseRtl16 = 0xED2A, + TextIndentDecreaseRtl20 = 0xED2B, + TextIndentDecreaseRtl24 = 0xED2C, + TextIndentIncreaseLtr16 = 0xED2D, + TextIndentIncreaseLtr20 = 0xED2E, + TextIndentIncreaseLtr24 = 0xED2F, + TextIndentIncreaseRotate27020 = 0xED30, + TextIndentIncreaseRotate27024 = 0xED31, + TextIndentIncreaseRotate9020 = 0xED32, + TextIndentIncreaseRotate9024 = 0xED33, + TextIndentIncreaseRtl16 = 0xED34, + TextIndentIncreaseRtl20 = 0xED35, + TextIndentIncreaseRtl24 = 0xED36, + TextItalic16 = 0xED37, + TextMore20 = 0xED38, + TextMore24 = 0xED39, + TextNumberListLtr16 = 0xED3A, + TextNumberListRotate27020 = 0xED3B, + TextNumberListRotate27024 = 0xED3C, + TextNumberListRotate9020 = 0xED3D, + TextNumberListRotate9024 = 0xED3E, + TextNumberListRtl16 = 0xED3F, + TextNumberListRtl20 = 0xED40, + TextParagraph16 = 0xED41, + TextParagraph20 = 0xED42, + TextParagraph24 = 0xED43, + TextParagraphDirection20 = 0xED44, + TextParagraphDirection24 = 0xED45, + TextParagraphDirectionLeft16 = 0xED46, + TextParagraphDirectionLeft20 = 0xED47, + TextParagraphDirectionRight16 = 0xED48, + TextParagraphDirectionRight20 = 0xED49, + TextPeriodAsterisk20 = 0xED4A, + TextPositionBehind20 = 0xED4B, + TextPositionBehind24 = 0xED4C, + TextPositionFront20 = 0xED4D, + TextPositionFront24 = 0xED4E, + TextPositionLine20 = 0xED4F, + TextPositionLine24 = 0xED50, + TextPositionSquare20 = 0xED51, + TextPositionSquare24 = 0xED52, + TextPositionThrough20 = 0xED53, + TextPositionThrough24 = 0xED54, + TextPositionTight20 = 0xED55, + TextPositionTight24 = 0xED56, + TextPositionTopBottom20 = 0xED57, + TextPositionTopBottom24 = 0xED58, + TextQuote16 = 0xED59, + TextSortAscending16 = 0xED5A, + TextSortAscending24 = 0xED5B, + TextSortDescending16 = 0xED5C, + TextSortDescending24 = 0xED5D, + TextStrikethrough16 = 0xED5E, + TextStrikethrough20 = 0xED5F, + TextStrikethrough24 = 0xED60, + TextSubscript16 = 0xED61, + TextSuperscript16 = 0xED62, + TextT20 = 0xED63, + TextT24 = 0xED64, + TextT28 = 0xED65, + TextT48 = 0xED66, + TextUnderline16 = 0xED67, + TextWholeWord20 = 0xED68, + TextWrap20 = 0xED69, + Textbox16 = 0xED6A, + TextboxAlignBottomRotate9020 = 0xED6B, + TextboxAlignBottomRotate9024 = 0xED6C, + TextboxAlignCenter20 = 0xED6D, + TextboxAlignCenter24 = 0xED6E, + TextboxAlignMiddleRotate9020 = 0xED6F, + TextboxAlignMiddleRotate9024 = 0xED70, + TextboxAlignTopRotate9020 = 0xED71, + TextboxAlignTopRotate9024 = 0xED72, + TextboxMore20 = 0xED73, + TextboxMore24 = 0xED74, + TextboxRotate9020 = 0xED75, + TextboxRotate9024 = 0xED76, + ThumbDislike16 = 0xED77, + ThumbLike16 = 0xED78, + ThumbLike28 = 0xED79, + ThumbLike48 = 0xED7A, + TicketDiagonal16 = 0xED7B, + TicketDiagonal20 = 0xED7C, + TicketDiagonal24 = 0xED7D, + TicketDiagonal28 = 0xED7E, + TicketHorizontal20 = 0xED7F, + TicketHorizontal24 = 0xED80, + TimeAndWeather20 = 0xED81, + TimePicker20 = 0xED82, + Timeline20 = 0xED83, + Timer1020 = 0xED84, + Timer12 = 0xED85, + Timer16 = 0xED86, + Timer220 = 0xED87, + Timer20 = 0xED88, + Timer28 = 0xED89, + Timer320 = 0xED8A, + Timer324 = 0xED8B, + Timer32 = 0xED8C, + Timer48 = 0xED8D, + TimerOff20 = 0xED8E, + ToggleLeft16 = 0xED8F, + ToggleLeft20 = 0xED90, + ToggleLeft24 = 0xED91, + ToggleLeft28 = 0xED92, + ToggleLeft48 = 0xED93, + ToggleMultiple16 = 0xED94, + ToggleMultiple20 = 0xED95, + ToggleMultiple24 = 0xED96, + ToggleRight28 = 0xED97, + ToggleRight48 = 0xED98, + Toolbox12 = 0xED99, + TooltipQuote24 = 0xED9A, + TopSpeed20 = 0xED9B, + Transmission20 = 0xED9C, + Transmission24 = 0xED9D, + TrayItemAdd20 = 0xED9E, + TrayItemAdd24 = 0xED9F, + TrayItemRemove20 = 0xEDA0, + TrayItemRemove24 = 0xEDA1, + TreeDeciduous20 = 0xEDA2, + TreeEvergreen20 = 0xEDA3, + Triangle12 = 0xEDA4, + Triangle16 = 0xEDA5, + Triangle20 = 0xEDA6, + Triangle32 = 0xEDA7, + Triangle48 = 0xEDA8, + TriangleDown12 = 0xEDA9, + TriangleDown16 = 0xEDAA, + TriangleDown20 = 0xEDAB, + TriangleDown32 = 0xEDAC, + TriangleDown48 = 0xEDAD, + TriangleLeft12 = 0xEDAE, + TriangleLeft16 = 0xEDAF, + TriangleLeft20 = 0xEDB0, + TriangleLeft32 = 0xEDB1, + TriangleLeft48 = 0xEDB2, + TriangleRight12 = 0xEDB3, + TriangleRight16 = 0xEDB4, + TriangleRight20 = 0xEDB5, + TriangleRight32 = 0xEDB6, + TriangleRight48 = 0xEDB7, + Trophy28 = 0xEDB8, + Trophy32 = 0xEDB9, + Trophy48 = 0xEDBA, + TrophyOff16 = 0xEDBB, + TrophyOff20 = 0xEDBC, + TrophyOff24 = 0xEDBD, + TrophyOff28 = 0xEDBE, + TrophyOff32 = 0xEDBF, + TrophyOff48 = 0xEDC0, + Tv16 = 0xEDC1, + Tv20 = 0xEDC2, + Tv24 = 0xEDC3, + Tv28 = 0xEDC4, + Tv48 = 0xEDC5, + TvArrowRight20 = 0xEDC6, + TvUsb16 = 0xEDC7, + TvUsb20 = 0xEDC8, + TvUsb24 = 0xEDC9, + TvUsb28 = 0xEDCA, + TvUsb48 = 0xEDCB, + Umbrella20 = 0xEDCC, + Umbrella24 = 0xEDCD, + UninstallApp20 = 0xEDCE, + UsbPlug20 = 0xEDCF, + UsbPlug24 = 0xEDD0, + VehicleBicycle16 = 0xEDD1, + VehicleBicycle20 = 0xEDD2, + VehicleBus16 = 0xEDD3, + VehicleBus20 = 0xEDD4, + VehicleCab16 = 0xEDD5, + VehicleCab20 = 0xEDD6, + VehicleCab28 = 0xEDD7, + VehicleCar28 = 0xEDD8, + VehicleCar48 = 0xEDD9, + VehicleCarCollision16 = 0xEDDA, + VehicleCarCollision20 = 0xEDDB, + VehicleCarCollision24 = 0xEDDC, + VehicleCarCollision28 = 0xEDDD, + VehicleCarCollision32 = 0xEDDE, + VehicleCarCollision48 = 0xEDDF, + VehicleCarProfileLtr20 = 0xEDE0, + VehicleCarProfileRtl20 = 0xEDE1, + VehicleShip16 = 0xEDE2, + VehicleShip20 = 0xEDE3, + VehicleShip24 = 0xEDE4, + VehicleSubway16 = 0xEDE5, + VehicleSubway20 = 0xEDE6, + VehicleSubway24 = 0xEDE7, + VehicleTruck16 = 0xEDE8, + VehicleTruck20 = 0xEDE9, + VehicleTruckBag20 = 0xEDEA, + VehicleTruckBag24 = 0xEDEB, + VehicleTruckCube20 = 0xEDEC, + VehicleTruckCube24 = 0xEDED, + VehicleTruckProfile20 = 0xEDEE, + VehicleTruckProfile24 = 0xEDEF, + Video32 = 0xEDF0, + Video36020 = 0xEDF1, + Video36024 = 0xEDF2, + Video360Off20 = 0xEDF3, + Video48 = 0xEDF4, + VideoAdd20 = 0xEDF5, + VideoAdd24 = 0xEDF6, + VideoBackgroundEffect20 = 0xEDF7, + VideoChat16 = 0xEDF8, + VideoChat20 = 0xEDF9, + VideoChat24 = 0xEDFA, + VideoChat28 = 0xEDFB, + VideoChat32 = 0xEDFC, + VideoChat48 = 0xEDFD, + VideoClip16 = 0xEDFE, + VideoClip20 = 0xEDFF, + VideoClipMultiple16 = 0xEE00, + VideoClipMultiple20 = 0xEE01, + VideoClipMultiple24 = 0xEE02, + VideoClipOff16 = 0xEE03, + VideoClipOff20 = 0xEE04, + VideoClipOff24 = 0xEE05, + VideoOff32 = 0xEE06, + VideoOff48 = 0xEE07, + VideoPerson12 = 0xEE08, + VideoPerson16 = 0xEE09, + VideoPerson20 = 0xEE0A, + VideoPerson28 = 0xEE0B, + VideoPerson48 = 0xEE0C, + VideoPersonCall16 = 0xEE0D, + VideoPersonCall20 = 0xEE0E, + VideoPersonCall24 = 0xEE0F, + VideoPersonCall32 = 0xEE10, + VideoPersonOff20 = 0xEE11, + VideoPersonSparkle16 = 0xEE12, + VideoPersonSparkle20 = 0xEE13, + VideoPersonSparkle24 = 0xEE14, + VideoPersonSparkle28 = 0xEE15, + VideoPersonSparkle48 = 0xEE16, + VideoPersonStar20 = 0xEE17, + VideoPersonStarOff20 = 0xEE18, + VideoPersonStarOff24 = 0xEE19, + VideoPlayPause20 = 0xEE1A, + VideoProhibited16 = 0xEE1B, + VideoProhibited20 = 0xEE1C, + VideoProhibited24 = 0xEE1D, + VideoProhibited28 = 0xEE1E, + VideoRecording20 = 0xEE1F, + VideoSwitch20 = 0xEE20, + VideoSync20 = 0xEE21, + VirtualNetwork20 = 0xEE22, + VirtualNetworkToolbox20 = 0xEE23, + Voicemail28 = 0xEE24, + VoicemailArrowBack20 = 0xEE25, + VoicemailArrowForward20 = 0xEE26, + VoicemailArrowSubtract20 = 0xEE27, + Vote20 = 0xEE28, + Vote24 = 0xEE29, + WalkieTalkie20 = 0xEE2A, + Wallet16 = 0xEE2B, + Wallet20 = 0xEE2C, + Wallet24 = 0xEE2D, + Wallet28 = 0xEE2E, + Wallet32 = 0xEE2F, + Wallet48 = 0xEE30, + WalletCreditCard16 = 0xEE31, + WalletCreditCard20 = 0xEE32, + WalletCreditCard24 = 0xEE33, + WalletCreditCard32 = 0xEE34, + Wallpaper20 = 0xEE35, + Wand16 = 0xEE36, + Wand20 = 0xEE37, + Wand24 = 0xEE38, + Wand28 = 0xEE39, + Wand48 = 0xEE3A, + Warning12 = 0xEE3B, + Warning28 = 0xEE3C, + WarningShield20 = 0xEE3D, + WeatherDrizzle20 = 0xEE3E, + WeatherDrizzle24 = 0xEE3F, + WeatherDrizzle48 = 0xEE40, + WeatherHaze20 = 0xEE41, + WeatherHaze24 = 0xEE42, + WeatherHaze48 = 0xEE43, + WeatherMoon16 = 0xEE44, + WeatherMoon28 = 0xEE45, + WeatherMoonOff16 = 0xEE46, + WeatherMoonOff20 = 0xEE47, + WeatherMoonOff24 = 0xEE48, + WeatherMoonOff28 = 0xEE49, + WeatherMoonOff48 = 0xEE4A, + WeatherPartlyCloudyDay16 = 0xEE4B, + WeatherSunny16 = 0xEE4C, + WeatherSunny28 = 0xEE4D, + WeatherSunny32 = 0xEE4E, + WeatherSunnyHigh20 = 0xEE4F, + WeatherSunnyHigh24 = 0xEE50, + WeatherSunnyHigh48 = 0xEE51, + WeatherSunnyLow20 = 0xEE52, + WeatherSunnyLow24 = 0xEE53, + WeatherSunnyLow48 = 0xEE54, + WebAsset20 = 0xEE55, + Whiteboard48 = 0xEE56, + WifiLock20 = 0xEE57, + WifiLock24 = 0xEE58, + WifiOff20 = 0xEE59, + WifiOff24 = 0xEE5A, + WifiSettings20 = 0xEE5B, + WifiWarning20 = 0xEE5C, + Window16 = 0xEE5D, + Window24 = 0xEE5E, + Window28 = 0xEE5F, + Window32 = 0xEE60, + Window48 = 0xEE61, + WindowAdOff20 = 0xEE62, + WindowAdPerson20 = 0xEE63, + WindowApps16 = 0xEE64, + WindowApps20 = 0xEE65, + WindowApps24 = 0xEE66, + WindowApps28 = 0xEE67, + WindowApps32 = 0xEE68, + WindowApps48 = 0xEE69, + WindowArrowUp16 = 0xEE6A, + WindowArrowUp20 = 0xEE6B, + WindowArrowUp24 = 0xEE6C, + WindowBulletList20 = 0xEE6D, + WindowBulletListAdd20 = 0xEE6E, + WindowConsole20 = 0xEE6F, + WindowDatabase20 = 0xEE70, + WindowDevEdit16 = 0xEE71, + WindowDevEdit20 = 0xEE72, + WindowEdit20 = 0xEE73, + WindowHeaderHorizontal20 = 0xEE74, + WindowHeaderHorizontalOff20 = 0xEE75, + WindowHeaderVertical20 = 0xEE76, + WindowLocationTarget20 = 0xEE77, + WindowMultiple16 = 0xEE78, + WindowMultipleSwap20 = 0xEE79, + WindowNew16 = 0xEE7A, + WindowNew24 = 0xEE7B, + WindowPlay20 = 0xEE7C, + WindowSettings20 = 0xEE7D, + WindowText20 = 0xEE7E, + WindowWrench16 = 0xEE7F, + WindowWrench20 = 0xEE80, + WindowWrench24 = 0xEE81, + WindowWrench28 = 0xEE82, + WindowWrench32 = 0xEE83, + WindowWrench48 = 0xEE84, + Wrench16 = 0xEE85, + Wrench20 = 0xEE86, + WrenchScrewdriver20 = 0xEE87, + WrenchScrewdriver24 = 0xEE88, + Xray20 = 0xEE89, + Xray24 = 0xEE8A, + ZoomFit16 = 0xEE8B, + ZoomFit20 = 0xEE8C, + ZoomFit24 = 0xEE8D, + ZoomIn16 = 0xEE8E, + ZoomOut16 = 0xEE8F, + Braces16 = 0xEE90, + Braces28 = 0xEE91, + Braces32 = 0xEE92, + Braces48 = 0xEE93, + BranchFork32 = 0xEE94, + CalendarDataBar16 = 0xEE95, + CalendarDataBar20 = 0xEE96, + CalendarDataBar24 = 0xEE97, + CalendarDataBar28 = 0xEE98, + Clipboard3Day16 = 0xEE99, + Clipboard3Day20 = 0xEE9A, + Clipboard3Day24 = 0xEE9B, + ClipboardDay16 = 0xEE9C, + ClipboardDay20 = 0xEE9D, + ClipboardDay24 = 0xEE9E, + ClipboardMonth16 = 0xEE9F, + ClipboardMonth20 = 0xEEA0, + ClipboardMonth24 = 0xEEA1, + ContentViewGallery24 = 0xEEA2, + ContentViewGallery28 = 0xEEA3, + DataBarVertical16 = 0xEEA4, + Delete12 = 0xEEA5, + Delete32 = 0xEEA6, + Form20 = 0xEEA7, + Form24 = 0xEEA8, + Form28 = 0xEEA9, + Form48 = 0xEEAA, + MailReadMultiple20 = 0xEEAB, + MailReadMultiple32 = 0xEEAC, + MegaphoneLoud16 = 0xEEAD, + PanelRightAdd20 = 0xEEAE, + PersonNote16 = 0xEEAF, + ShieldGlobe16 = 0xEEB0, + ShieldGlobe20 = 0xEEB1, + ShieldGlobe24 = 0xEEB2, + SquareMultiple28 = 0xEEB3, + SquareMultiple32 = 0xEEB4, + SquareMultiple48 = 0xEEB5, + TableCalculator20 = 0xEEB6, + XboxController16 = 0xEEB7, + XboxController20 = 0xEEB8, + XboxController24 = 0xEEB9, + XboxController28 = 0xEEBA, + XboxController32 = 0xEEBB, + XboxController48 = 0xEEBC, + Apps32 = 0xEEBD, + ArrowParagraph16 = 0xEEBE, + ArrowParagraph24 = 0xEEBF, + Beaker32 = 0xEEC0, + AnimalRabbit32 = 0xEEC1, + BuildingRetailMore32 = 0xEEC2, + CalendarMonth32 = 0xEEC3, + ContentView24 = 0xEEC4, + ContentView28 = 0xEEC5, + CreditCardClock20 = 0xEEC6, + CreditCardClock24 = 0xEEC7, + CreditCardClock28 = 0xEEC8, + CreditCardClock32 = 0xEEC9, + Cube32 = 0xEECA, + DataBarVertical32 = 0xEECB, + Database32 = 0xEECC, + DocumentData32 = 0xEECD, + FolderPeople20 = 0xEECE, + FolderPeople24 = 0xEECF, + Gauge32 = 0xEED0, + HandLeftChat16 = 0xEED1, + HandLeftChat20 = 0xEED2, + HandLeftChat24 = 0xEED3, + HandLeftChat28 = 0xEED4, + HomeDatabase24 = 0xEED5, + HomeDatabase32 = 0xEED6, + HomeMore24 = 0xEED7, + HomeMore32 = 0xEED8, + Notebook32 = 0xEED9, + Payment32 = 0xEEDA, + Payment48 = 0xEEDB, + PersonRunning20 = 0xEEDC, + Pipeline24 = 0xEEDD, + Pipeline32 = 0xEEDE, + Stack32 = 0xEEDF, + TextAlignJustifyLowRotate27020 = 0xEEE0, + TextAlignJustifyLowRotate27024 = 0xEEE1, + TextAlignJustifyLowRotate9020 = 0xEEE2, + TextAlignJustifyLowRotate9024 = 0xEEE3, + AnimalRabbitOff20 = 0xEEE4, + AnimalRabbitOff32 = 0xEEE5, + BeakerOff20 = 0xEEE6, + BeakerOff32 = 0xEEE7, + BowlSalad20 = 0xEEE8, + BowlSalad24 = 0xEEE9, + BuildingRetailMore24 = 0xEEEA, + Connected16 = 0xEEEB, + Connected20 = 0xEEEC, + DocumentText16 = 0xEEED, + DrinkBottle20 = 0xEEEE, + DrinkBottle32 = 0xEEEF, + DrinkBottleOff20 = 0xEEF0, + DrinkBottleOff32 = 0xEEF1, + Earth32 = 0xEEF2, + EarthLeaf16 = 0xEEF3, + EarthLeaf20 = 0xEEF4, + EarthLeaf24 = 0xEEF5, + EarthLeaf32 = 0xEEF6, + Feed16 = 0xEEF7, + Feed20 = 0xEEF8, + Feed24 = 0xEEF9, + Feed28 = 0xEEFA, + Filmstrip20 = 0xEEFB, + Filmstrip24 = 0xEEFC, + FoodCarrot20 = 0xEEFD, + FoodCarrot24 = 0xEEFE, + FoodFish20 = 0xEEFF, + FoodFish24 = 0xEF00, + HandOpenHeart20 = 0xEF01, + HandOpenHeart32 = 0xEF02, + HandWave16 = 0xEF03, + HandWave20 = 0xEF04, + HandWave24 = 0xEF05, + Handshake32 = 0xEF06, + LeafOne32 = 0xEF07, + LeafTwo32 = 0xEF08, + Notebook16 = 0xEF09, + PersonHeart20 = 0xEF0A, + PersonStar16 = 0xEF0B, + PersonStar20 = 0xEF0C, + PersonStar24 = 0xEF0D, + PersonStar28 = 0xEF0E, + PersonStar32 = 0xEF0F, + PersonStar48 = 0xEF10, + PipelineAdd32 = 0xEF11, + Recycle20 = 0xEF12, + Recycle32 = 0xEF13, + Reward12 = 0xEF14, + SlideLink20 = 0xEF15, + SlideLink24 = 0xEF16, + FoodChickenLeg16 = 0xEF17, + FoodChickenLeg20 = 0xEF18, + FoodChickenLeg24 = 0xEF19, + FoodChickenLeg32 = 0xEF1A, + FormMultiple20 = 0xEF1B, + FormMultiple24 = 0xEF1C, + FormMultiple28 = 0xEF1D, + FormMultiple48 = 0xEF1E, + LaserTool20 = 0xEF1F, + Shield32 = 0xEF20, + ShieldQuestion16 = 0xEF21, + ShieldQuestion20 = 0xEF22, + ShieldQuestion24 = 0xEF23, + ShieldQuestion32 = 0xEF24, + HeartBroken24 = 0xEF25, + LayerDiagonal20 = 0xEF26, + LayerDiagonalPerson20 = 0xEF27, + TextWrap16 = 0xEF28, + TextWrapOff16 = 0xEF29, + TextWrapOff20 = 0xEF2A, + TextWrapOff24 = 0xEF2B, + TrophyLock16 = 0xEF2C, + TrophyLock20 = 0xEF2D, + TrophyLock24 = 0xEF2E, + TrophyLock28 = 0xEF2F, + TrophyLock32 = 0xEF30, + TrophyLock48 = 0xEF31, AccessTime24 = 0xF101, Accessibility16 = 0xF102, Accessibility20 = 0xF103, @@ -2057,9 +3991,7 @@ public enum SymbolFilled ArrowDownload20 = 0xF150, ArrowDownload24 = 0xF151, ArrowDownload48 = 0xF152, - ArrowGrowth20 = 0xF153, ArrowExpand24 = 0xF154, - ArrowGrowth24 = 0xF155, ArrowForward16 = 0xF156, ArrowForward20 = 0xF157, ArrowForward24 = 0xF158, @@ -2183,8 +4115,6 @@ public enum SymbolFilled Battery924 = 0xF1CE, BatteryCharge20 = 0xF1CF, BatteryCharge24 = 0xF1D0, - BatteryFull20 = 0xF1D1, - BatteryFull24 = 0xF1D2, BatterySaver20 = 0xF1D3, BatterySaver24 = 0xF1D4, BatteryWarning24 = 0xF1D5, @@ -2193,9 +4123,6 @@ public enum SymbolFilled Beaker24 = 0xF1D8, Bed20 = 0xF1D9, Bed24 = 0xF1DA, - Block16 = 0xF1DB, - Block20 = 0xF1DC, - Block24 = 0xF1DD, Bluetooth20 = 0xF1DE, Bluetooth24 = 0xF1DF, BluetoothConnected24 = 0xF1E0, @@ -2236,7 +4163,6 @@ public enum SymbolFilled CalendarInfo16 = 0xF203, CalendarMultiple16 = 0xF204, Building24 = 0xF205, - CalendarPatterns16 = 0xF206, CallCheckmark20 = 0xF207, CallDismiss20 = 0xF208, BuildingRetail24 = 0xF209, @@ -2261,7 +4187,6 @@ public enum SymbolFilled CalendarCheckmark20 = 0xF21C, CalendarClock20 = 0xF21D, CalendarClock24 = 0xF21E, - CellularDataUnavailable24 = 0xF21F, ChatHelp20 = 0xF220, ChatSettings20 = 0xF221, CalendarDay20 = 0xF222, @@ -2277,7 +4202,6 @@ public enum SymbolFilled CalendarMonth28 = 0xF22C, CalendarMultiple20 = 0xF22D, CalendarMultiple24 = 0xF22E, - CalendarOverdue24 = 0xF22F, CalendarPerson20 = 0xF230, CalendarReply16 = 0xF231, CalendarReply20 = 0xF232, @@ -2321,10 +4245,6 @@ public enum SymbolFilled CameraAdd24 = 0xF258, CameraAdd48 = 0xF259, CameraSwitch24 = 0xF25A, - Caret12 = 0xF25B, - Caret16 = 0xF25C, - Caret20 = 0xF25D, - Caret24 = 0xF25E, CaretDown12 = 0xF25F, CaretDown16 = 0xF260, CaretDown20 = 0xF261, @@ -2447,8 +4367,6 @@ public enum SymbolFilled ClipboardPaste24 = 0xF2D6, ClipboardSearch20 = 0xF2D7, ClipboardSearch24 = 0xF2D8, - Chopsticks16 = 0xF2D9, - Chopsticks20 = 0xF2DA, Clock12 = 0xF2DB, Clock16 = 0xF2DC, Clock20 = 0xF2DD, @@ -2461,14 +4379,8 @@ public enum SymbolFilled Cloud20 = 0xF2E4, Cloud24 = 0xF2E5, Cloud48 = 0xF2E6, - CloudBackup24 = 0xF2E7, - CloudBackup48 = 0xF2E8, - CloudDownload24 = 0xF2E9, CloudOff24 = 0xF2EA, CloudOff48 = 0xF2EB, - CloudOffline24 = 0xF2EC, - CloudSyncComplete24 = 0xF2ED, - CloudSyncComplete48 = 0xF2EE, Code20 = 0xF2EF, Code24 = 0xF2F0, Collections20 = 0xF2F1, @@ -2488,14 +4400,12 @@ public enum SymbolFilled Comment20 = 0xF2FF, Comment24 = 0xF300, CommentAdd24 = 0xF301, - Chopsticks24 = 0xF302, CommentMention16 = 0xF303, CommentMention20 = 0xF304, CommentMention24 = 0xF305, CommentMultiple16 = 0xF306, CommentMultiple20 = 0xF307, CommentMultiple24 = 0xF308, - Chopsticks28 = 0xF309, CircleHalfFill16 = 0xF30A, ClipboardHeart20 = 0xF30B, Communication16 = 0xF30C, @@ -2524,8 +4434,6 @@ public enum SymbolFilled ContentSettings16 = 0xF323, ContentSettings20 = 0xF324, ContentSettings24 = 0xF325, - ConvertToTable24 = 0xF326, - ConvertToText24 = 0xF327, Cookies20 = 0xF328, Cookies24 = 0xF329, Copy16 = 0xF32A, @@ -2628,11 +4536,9 @@ public enum SymbolFilled DocumentError20 = 0xF38B, DocumentError24 = 0xF38C, DocumentFooter24 = 0xF38D, - DocumentFooterRemove24 = 0xF38E, DocumentHeader24 = 0xF38F, DocumentHeaderFooter20 = 0xF390, DocumentHeaderFooter24 = 0xF391, - DocumentHeaderRemove24 = 0xF392, DocumentLandscape20 = 0xF393, DocumentLandscape24 = 0xF394, DocumentMargins20 = 0xF395, @@ -2730,14 +4636,6 @@ public enum SymbolFilled ErrorCircle24 = 0xF3F1, Dismiss32 = 0xF3F2, ExtendedDock24 = 0xF3F3, - Extension20 = 0xF3F4, - Extension24 = 0xF3F5, - EyeHide20 = 0xF3F6, - EyeHide24 = 0xF3F7, - EyeShow12 = 0xF3F8, - EyeShow16 = 0xF3F9, - EyeShow20 = 0xF3FA, - EyeShow24 = 0xF3FB, FastAcceleration24 = 0xF3FC, FastForward20 = 0xF3FD, FastForward24 = 0xF3FE, @@ -2766,8 +4664,6 @@ public enum SymbolFilled FlagPride48 = 0xF415, FlashAuto24 = 0xF416, FlashOff24 = 0xF417, - FlashOn20 = 0xF418, - FlashOn24 = 0xF419, Flashlight24 = 0xF41A, FlashlightOff24 = 0xF41B, Folder20 = 0xF41C, @@ -2928,7 +4824,6 @@ public enum SymbolFilled Insert20 = 0xF4B7, Fax16 = 0xF4B8, Flow16 = 0xF4B9, - IosArrowLeft24 = 0xF4BA, FolderGlobe16 = 0xF4BB, IosChevronRight20 = 0xF4BC, Javascript16 = 0xF4BD, @@ -3019,8 +4914,6 @@ public enum SymbolFilled Mail28 = 0xF512, Mail48 = 0xF513, MailAdd24 = 0xF514, - MailAll20 = 0xF515, - MailAll24 = 0xF516, MailAdd16 = 0xF517, MailAllRead20 = 0xF518, MailAllUnread20 = 0xF519, @@ -3075,11 +4968,6 @@ public enum SymbolFilled MicOff16 = 0xF54A, MicOff24 = 0xF54B, MicOff28 = 0xF54C, - MicOn16 = 0xF54D, - MicOn20 = 0xF54E, - MicOn24 = 0xF54F, - MicOn28 = 0xF550, - MicOn48 = 0xF551, MicSettings24 = 0xF552, Midi20 = 0xF553, Midi24 = 0xF554, @@ -3099,8 +4987,6 @@ public enum SymbolFilled MoreVertical28 = 0xF562, MoreVertical48 = 0xF563, MoviesAndTv24 = 0xF564, - Multiselect20 = 0xF565, - Multiselect24 = 0xF566, MailError24 = 0xF567, MailInboxArrowDown16 = 0xF568, MyLocation24 = 0xF569, @@ -3135,8 +5021,6 @@ public enum SymbolFilled NumberSymbol16 = 0xF586, NumberSymbol20 = 0xF587, NumberSymbol24 = 0xF588, - OfficeApps24 = 0xF589, - OfficeApps28 = 0xF58A, Open16 = 0xF58B, Open20 = 0xF58C, Open24 = 0xF58D, @@ -3149,7 +5033,6 @@ public enum SymbolFilled Organization24 = 0xF594, Organization28 = 0xF595, MailLink24 = 0xF596, - Page20 = 0xF597, PageFit16 = 0xF598, PageFit20 = 0xF599, PageFit24 = 0xF59A, @@ -3160,12 +5043,6 @@ public enum SymbolFilled PaintBucket20 = 0xF59F, PaintBucket24 = 0xF5A0, Pair24 = 0xF5A1, - PaneClose16 = 0xF5A2, - PaneClose20 = 0xF5A3, - PaneClose24 = 0xF5A4, - PaneOpen16 = 0xF5A5, - PaneOpen20 = 0xF5A6, - PaneOpen24 = 0xF5A7, Password24 = 0xF5A8, Patient24 = 0xF5A9, Pause16 = 0xF5AA, @@ -3376,7 +5253,6 @@ public enum SymbolFilled ResizeImage24 = 0xF677, ResizeTable24 = 0xF678, ResizeVideo24 = 0xF679, - Restore16 = 0xF67A, Reward16 = 0xF67B, Reward20 = 0xF67C, Reward24 = 0xF67D, @@ -3428,9 +5304,6 @@ public enum SymbolFilled SerialPort20 = 0xF6AB, SerialPort24 = 0xF6AC, ServiceBell24 = 0xF6AD, - SetTopStack16 = 0xF6AE, - SetTopStack20 = 0xF6AF, - SetTopStack24 = 0xF6B0, Settings16 = 0xF6B1, Settings20 = 0xF6B2, Settings24 = 0xF6B3, @@ -3486,15 +5359,11 @@ public enum SymbolFilled Signature20 = 0xF6E5, Signature24 = 0xF6E6, Signature28 = 0xF6E7, - Signed16 = 0xF6E8, - Signed20 = 0xF6E9, - Signed24 = 0xF6EA, Sim16 = 0xF6EB, Sim20 = 0xF6EC, Sim24 = 0xF6ED, Sleep24 = 0xF6EE, SlideAdd24 = 0xF6EF, - SlideDesign24 = 0xF6F0, SlideHide24 = 0xF6F1, SlideLayout20 = 0xF6F2, SlideLayout24 = 0xF6F3, @@ -3681,8 +5550,6 @@ public enum SymbolFilled Temperature24 = 0xF7A8, Tent24 = 0xF7A9, Stack20 = 0xF7AA, - Text24 = 0xF7AB, - TextAdd24 = 0xF7AC, TextAddSpaceAfter20 = 0xF7AD, TextAddSpaceAfter24 = 0xF7AE, TextAddSpaceBefore20 = 0xF7AF, @@ -3741,14 +5608,6 @@ public enum SymbolFilled TextDescription24 = 0xF7E4, VehicleCarProfileLtr16 = 0xF7E5, VehicleCarProfileRtl16 = 0xF7E6, - TextDirectionHorizontalLtr20 = 0xF7E7, - TextDirectionHorizontalLtr24 = 0xF7E8, - TextDirectionRotate27020 = 0xF7E9, - TextDirectionRotate27024 = 0xF7EA, - TextDirectionRotate270Ac20 = 0xF7EB, - TextDirectionRotate270Ac24 = 0xF7EC, - TextDirectionRotate9020 = 0xF7ED, - TextDirectionRotate9024 = 0xF7EE, TextDirectionVertical20 = 0xF7EF, TextDirectionVertical24 = 0xF7F0, TextEditStyle20 = 0xF7F1, @@ -3776,8 +5635,6 @@ public enum SymbolFilled TextHeader120 = 0xF807, TextHeader220 = 0xF808, TextHeader320 = 0xF809, - TextIndentDecrease24 = 0xF80A, - TextIndentIncrease24 = 0xF80B, TextItalic20 = 0xF80C, TextItalic24 = 0xF80D, TextLineSpacing20 = 0xF80E, @@ -3816,8 +5673,6 @@ public enum SymbolFilled TextboxAlignMiddle24 = 0xF82F, TextboxAlignTop20 = 0xF830, TextboxAlignTop24 = 0xF831, - TextboxVertical20 = 0xF832, - TextboxVertical24 = 0xF833, Thinking20 = 0xF834, Thinking24 = 0xF835, ThumbDislike20 = 0xF836, @@ -3851,8 +5706,6 @@ public enum SymbolFilled BookQuestionMarkRtl24 = 0xF852, BrainCircuit24 = 0xF853, BuildingBankToolbox24 = 0xF854, - UsbPort20 = 0xF855, - UsbPort24 = 0xF856, UsbStick20 = 0xF857, UsbStick24 = 0xF858, Vault16 = 0xF859, @@ -3970,7 +5823,6 @@ public enum SymbolFilled Wifi324 = 0xF8C9, Wifi420 = 0xF8CA, Wifi424 = 0xF8CB, - WifiProtected24 = 0xF8CC, Window20 = 0xF8CD, WindowAd20 = 0xF8CE, WindowDevTools16 = 0xF8CF, @@ -4022,1797 +5874,6 @@ public enum SymbolFilled ArrowMove20 = 0xF8FD, ArrowRedo32 = 0xF8FE, ArrowRedo48 = 0xF8FF, - CheckmarkCircle32 = 0xF900, - CircleSubtractArrowBack16 = 0xF901, - CircleSubtractArrowForward16 = 0xF902, - ArrowUpRight16 = 0xF903, - AttachArrowRight20 = 0xF904, - AttachArrowRight24 = 0xF905, - AttachText24 = 0xF906, - AutofitContent24 = 0xF907, - Backpack12 = 0xF908, - Backpack16 = 0xF909, - Backpack20 = 0xF90A, - Backpack24 = 0xF90B, - Backpack28 = 0xF90C, - Backpack48 = 0xF90D, - Balloon16 = 0xF90E, - Bed16 = 0xF90F, - Bluetooth28 = 0xF910, - Blur16 = 0xF911, - Blur20 = 0xF912, - Blur24 = 0xF913, - Blur28 = 0xF914, - Book20 = 0xF915, - Book24 = 0xF916, - BookAdd20 = 0xF917, - BookAdd24 = 0xF918, - BookClock24 = 0xF919, - BookCoins24 = 0xF91A, - BookCompass24 = 0xF91B, - BookDatabase24 = 0xF91C, - BookExclamationMark24 = 0xF91D, - BookInformation24 = 0xF91E, - BookLetter24 = 0xF91F, - BookOpen20 = 0xF920, - BookOpen24 = 0xF921, - BookOpenGlobe24 = 0xF922, - BookPulse24 = 0xF923, - BookQuestionMark24 = 0xF924, - BookSearch24 = 0xF925, - BookStar24 = 0xF926, - BookTheta24 = 0xF927, - BorderAll24 = 0xF928, - BorderBottom24 = 0xF929, - BorderBottomDouble24 = 0xF92A, - BorderBottomThick24 = 0xF92B, - BorderLeft24 = 0xF92C, - ClipboardBulletListLtr16 = 0xF92D, - BorderOutside24 = 0xF92E, - BorderOutsideThick24 = 0xF92F, - BorderRight24 = 0xF930, - BorderTop24 = 0xF931, - BorderTopBottom24 = 0xF932, - BorderTopBottomDouble24 = 0xF933, - BorderTopBottomThick24 = 0xF934, - Briefcase12 = 0xF935, - Briefcase32 = 0xF936, - ClipboardBulletListRtl16 = 0xF937, - ColumnEdit20 = 0xF938, - Bug16 = 0xF939, - Bug20 = 0xF93A, - Bug24 = 0xF93B, - BuildingBank16 = 0xF93C, - BuildingBank20 = 0xF93D, - BuildingBank24 = 0xF93E, - BuildingGovernment24 = 0xF93F, - BuildingGovernment32 = 0xF940, - BuildingMultiple24 = 0xF941, - BuildingShop16 = 0xF942, - BuildingShop20 = 0xF943, - BuildingShop24 = 0xF944, - BuildingSkyscraper16 = 0xF945, - BuildingSkyscraper20 = 0xF946, - BuildingSkyscraper24 = 0xF947, - CalendarCancel16 = 0xF948, - CalendarClock16 = 0xF949, - CalendarMention20 = 0xF94A, - CalendarPerson24 = 0xF94B, - CalendarQuestionMark16 = 0xF94C, - CalendarQuestionMark20 = 0xF94D, - CalendarQuestionMark24 = 0xF94E, - ColumnEdit24 = 0xF94F, - ContactCard28 = 0xF950, - ContactCard32 = 0xF951, - ContactCard48 = 0xF952, - Diagram24 = 0xF953, - CallForward16 = 0xF954, - CallForward20 = 0xF955, - CallForward28 = 0xF956, - CallForward48 = 0xF957, - CallInbound20 = 0xF958, - CallInbound28 = 0xF959, - CallInbound48 = 0xF95A, - CallMissed28 = 0xF95B, - CallMissed48 = 0xF95C, - CallOutbound20 = 0xF95D, - CallOutbound28 = 0xF95E, - CallOutbound48 = 0xF95F, - CallPark16 = 0xF960, - CallPark20 = 0xF961, - CallPark28 = 0xF962, - CallPark48 = 0xF963, - CameraEdit20 = 0xF964, - CaretUp12 = 0xF965, - CaretUp16 = 0xF966, - CaretUp20 = 0xF967, - CaretUp24 = 0xF968, - Cart16 = 0xF969, - Cart20 = 0xF96A, - DismissCircle32 = 0xF96B, - DocumentArrowDown16 = 0xF96C, - Channel28 = 0xF96D, - Channel48 = 0xF96E, - ChannelAdd16 = 0xF96F, - ChannelAdd20 = 0xF970, - ChannelAdd24 = 0xF971, - ChannelAdd28 = 0xF972, - ChannelAdd48 = 0xF973, - ChannelAlert16 = 0xF974, - ChannelAlert20 = 0xF975, - ChannelAlert24 = 0xF976, - ChannelAlert28 = 0xF977, - ChannelAlert48 = 0xF978, - ChannelArrowLeft16 = 0xF979, - ChannelArrowLeft20 = 0xF97A, - ChannelArrowLeft24 = 0xF97B, - ChannelArrowLeft28 = 0xF97C, - ChannelArrowLeft48 = 0xF97D, - ChannelDismiss16 = 0xF97E, - ChannelDismiss20 = 0xF97F, - ChannelDismiss24 = 0xF980, - ChannelDismiss28 = 0xF981, - ChannelDismiss48 = 0xF982, - Chat16 = 0xF983, - Checkmark16 = 0xF984, - DocumentBulletListClock20 = 0xF985, - ClipboardPaste16 = 0xF986, - ClockDismiss24 = 0xF987, - ClosedCaption16 = 0xF988, - ClosedCaption20 = 0xF989, - ClosedCaption28 = 0xF98A, - ClosedCaption48 = 0xF98B, - CloudDownload32 = 0xF98C, - CloudDownload48 = 0xF98D, - ColorLine16 = 0xF98E, - Comment12 = 0xF98F, - Comment28 = 0xF990, - Comment48 = 0xF991, - CommentAdd12 = 0xF992, - CommentAdd16 = 0xF993, - CommentAdd20 = 0xF994, - CommentAdd28 = 0xF995, - CommentAdd48 = 0xF996, - CommentArrowLeft12 = 0xF997, - CommentArrowLeft16 = 0xF998, - CommentArrowLeft20 = 0xF999, - CommentArrowLeft28 = 0xF99A, - CommentArrowLeft48 = 0xF99B, - CommentArrowRight12 = 0xF99C, - CommentArrowRight16 = 0xF99D, - CommentArrowRight20 = 0xF99E, - CommentArrowRight28 = 0xF99F, - CommentArrowRight48 = 0xF9A0, - CommentCheckmark12 = 0xF9A1, - CommentCheckmark16 = 0xF9A2, - CommentCheckmark20 = 0xF9A3, - CommentCheckmark24 = 0xF9A4, - CommentCheckmark28 = 0xF9A5, - CommentCheckmark48 = 0xF9A6, - CommentEdit20 = 0xF9A7, - CommentEdit24 = 0xF9A8, - CommentOff16 = 0xF9A9, - CommentOff20 = 0xF9AA, - CommentOff24 = 0xF9AB, - CommentOff28 = 0xF9AC, - CommentOff48 = 0xF9AD, - ContactCardGroup16 = 0xF9AE, - ContactCardGroup20 = 0xF9AF, - ContactCardGroup28 = 0xF9B0, - ContactCardGroup48 = 0xF9B1, - ConvertRange24 = 0xF9B2, - CopyAdd24 = 0xF9B3, - CopySelect20 = 0xF9B4, - Couch12 = 0xF9B5, - Couch24 = 0xF9B6, - Crop20 = 0xF9B7, - CurrencyDollarRupee16 = 0xF9B8, - CurrencyDollarRupee20 = 0xF9B9, - CurrencyDollarRupee24 = 0xF9BA, - Cursor20 = 0xF9BB, - Cursor24 = 0xF9BC, - CursorHover16 = 0xF9BD, - CursorHover20 = 0xF9BE, - CursorHover24 = 0xF9BF, - CursorHover28 = 0xF9C0, - CursorHover32 = 0xF9C1, - CursorHover48 = 0xF9C2, - CursorHoverOff16 = 0xF9C3, - CursorHoverOff20 = 0xF9C4, - CursorHoverOff24 = 0xF9C5, - CursorHoverOff28 = 0xF9C6, - CursorHoverOff48 = 0xF9C7, - DataBarVerticalAdd24 = 0xF9C8, - DataUsage20 = 0xF9C9, - DecimalArrowLeft24 = 0xF9CA, - DecimalArrowRight24 = 0xF9CB, - Delete16 = 0xF9CC, - Dentist12 = 0xF9CD, - Dentist16 = 0xF9CE, - Dentist20 = 0xF9CF, - Dentist28 = 0xF9D0, - Dentist48 = 0xF9D1, - DismissCircle28 = 0xF9D2, - DocumentBulletListClock24 = 0xF9D3, - DocumentBulletListOff24 = 0xF9D4, - DocumentMultiple16 = 0xF9D5, - DocumentPill20 = 0xF9D6, - DocumentPill24 = 0xF9D7, - DocumentSave20 = 0xF9D8, - DocumentSave24 = 0xF9D9, - Doctor12 = 0xF9DA, - Doctor16 = 0xF9DB, - Doctor20 = 0xF9DC, - Doctor28 = 0xF9DD, - Doctor48 = 0xF9DE, - Document16 = 0xF9DF, - Document48 = 0xF9E0, - DocumentAdd16 = 0xF9E1, - DocumentAdd20 = 0xF9E2, - DocumentAdd24 = 0xF9E3, - DocumentAdd28 = 0xF9E4, - DocumentAdd48 = 0xF9E5, - DocumentArrowLeft16 = 0xF9E6, - DocumentArrowLeft20 = 0xF9E7, - DocumentArrowLeft24 = 0xF9E8, - DocumentArrowLeft28 = 0xF9E9, - DocumentArrowLeft48 = 0xF9EA, - DocumentCatchUp16 = 0xF9EB, - DocumentCatchUp20 = 0xF9EC, - DocumentLandscapeData24 = 0xF9ED, - DocumentLandscapeSplit20 = 0xF9EE, - DocumentLandscapeSplitHint20 = 0xF9EF, - DocumentPageBreak20 = 0xF9F0, - DrinkBeer16 = 0xF9F1, - DrinkBeer20 = 0xF9F2, - DrinkCoffee16 = 0xF9F3, - DrinkMargarita16 = 0xF9F4, - DrinkMargarita20 = 0xF9F5, - DrinkWine16 = 0xF9F6, - DrinkWine20 = 0xF9F7, - DualScreenSpan24 = 0xF9F8, - Edit32 = 0xF9F9, - EditOff16 = 0xF9FA, - EditOff24 = 0xF9FB, - EditSettings24 = 0xF9FC, - EmojiAdd16 = 0xF9FD, - EmojiHand24 = 0xF9FE, - EmojiHand28 = 0xF9FF, - Eraser20 = 0xFA00, - Eraser24 = 0xFA01, - EraserMedium24 = 0xFA02, - EraserSegment24 = 0xFA03, - EraserSmall24 = 0xFA04, - ErrorCircle12 = 0xFA05, - Door16 = 0xFA06, - DualScreenArrowUp24 = 0xFA07, - DualScreenClosedAlert24 = 0xFA08, - EyeTrackingOff16 = 0xFA09, - EyeTrackingOff20 = 0xFA0A, - EyeTrackingOff24 = 0xFA0B, - FStop16 = 0xFA0C, - FStop20 = 0xFA0D, - FStop24 = 0xFA0E, - FStop28 = 0xFA0F, - Fingerprint48 = 0xFA10, - FixedWidth24 = 0xFA11, - FlipHorizontal24 = 0xFA12, - FlipVertical24 = 0xFA13, - Fluent32 = 0xFA14, - Fluent48 = 0xFA15, - Fluid20 = 0xFA16, - Fluid24 = 0xFA17, - EmojiMultiple20 = 0xFA18, - FoodEgg16 = 0xFA19, - FoodEgg20 = 0xFA1A, - FoodToast16 = 0xFA1B, - FoodToast20 = 0xFA1C, - Gavel24 = 0xFA1D, - Gavel32 = 0xFA1E, - Glasses16 = 0xFA1F, - Glasses20 = 0xFA20, - Glasses28 = 0xFA21, - Glasses48 = 0xFA22, - GlassesOff16 = 0xFA23, - GlassesOff20 = 0xFA24, - GlassesOff28 = 0xFA25, - GlassesOff48 = 0xFA26, - Globe16 = 0xFA27, - HandLeft20 = 0xFA28, - HandRight24 = 0xFA29, - HandRight28 = 0xFA2A, - HatGraduation16 = 0xFA2B, - HatGraduation20 = 0xFA2C, - HatGraduation24 = 0xFA2D, - Hd16 = 0xFA2E, - Hd20 = 0xFA2F, - Hd24 = 0xFA30, - Headset16 = 0xFA31, - Headset20 = 0xFA32, - Headset48 = 0xFA33, - HeartPulse24 = 0xFA34, - HeartPulse32 = 0xFA35, - Home16 = 0xFA36, - Home32 = 0xFA37, - Home48 = 0xFA38, - ImageArrowCounterclockwise24 = 0xFA39, - InfoShield20 = 0xFA3A, - KeyMultiple20 = 0xFA3B, - LineHorizontal5Error20 = 0xFA3C, - LinkSquare12 = 0xFA3D, - LinkSquare16 = 0xFA3E, - Location48 = 0xFA3F, - LocationOff16 = 0xFA40, - LocationOff20 = 0xFA41, - LocationOff24 = 0xFA42, - LocationOff28 = 0xFA43, - LocationOff48 = 0xFA44, - LockMultiple24 = 0xFA45, - Lottery24 = 0xFA46, - EmojiMultiple24 = 0xFA47, - GanttChart20 = 0xFA48, - GanttChart24 = 0xFA49, - GiftCardAdd24 = 0xFA4A, - Mail16 = 0xFA4B, - MailRead16 = 0xFA4C, - MathFormatLinear24 = 0xFA4D, - MathFormatProfessional24 = 0xFA4E, - MathFormula24 = 0xFA4F, - Maximize20 = 0xFA50, - Maximize24 = 0xFA51, - Maximize28 = 0xFA52, - Maximize48 = 0xFA53, - MeetNow16 = 0xFA54, - MicOff20 = 0xFA55, - MicOff48 = 0xFA56, - MicProhibited24 = 0xFA57, - HandDraw24 = 0xFA58, - ImageArrowBack24 = 0xFA59, - ImageArrowForward24 = 0xFA5A, - ImageMultiple16 = 0xFA5B, - ImageReflection24 = 0xFA5C, - ImageShadow24 = 0xFA5D, - MoreCircle20 = 0xFA5E, - MoviesAndTv16 = 0xFA5F, - MoviesAndTv20 = 0xFA60, - LocalLanguageZi24 = 0xFA61, - MailArrowDoubleBack16 = 0xFA62, - MailArrowForward16 = 0xFA63, - MailAttach16 = 0xFA64, - NavigationUnread24 = 0xFA65, - NumberSymbolDismiss24 = 0xFA66, - Open28 = 0xFA67, - Open48 = 0xFA68, - OpenFolder16 = 0xFA69, - OpenFolder20 = 0xFA6A, - OpenFolder28 = 0xFA6B, - OpenFolder48 = 0xFA6C, - OpenOff16 = 0xFA6D, - OpenOff20 = 0xFA6E, - OpenOff24 = 0xFA6F, - OpenOff28 = 0xFA70, - OpenOff48 = 0xFA71, - PaintBrushArrowDown24 = 0xFA72, - PaintBrushArrowUp24 = 0xFA73, - Pause12 = 0xFA74, - Payment16 = 0xFA75, - Payment28 = 0xFA76, - PeopleProhibited16 = 0xFA77, - PeopleSwap16 = 0xFA78, - PeopleSwap20 = 0xFA79, - PeopleSwap24 = 0xFA7A, - PeopleSwap28 = 0xFA7B, - PeopleTeamAdd20 = 0xFA7C, - PeopleTeamAdd24 = 0xFA7D, - MoreHorizontal32 = 0xFA7E, - PersonAvailable20 = 0xFA7F, - PersonClock16 = 0xFA80, - PersonClock20 = 0xFA81, - PersonClock24 = 0xFA82, - PersonDelete20 = 0xFA83, - PersonMail16 = 0xFA84, - PersonMail20 = 0xFA85, - PersonMail24 = 0xFA86, - PersonMail28 = 0xFA87, - PersonMail48 = 0xFA88, - PersonProhibited24 = 0xFA89, - MoreVertical32 = 0xFA8A, - Poll20 = 0xFA8B, - Pulse24 = 0xFA8C, - QrCode20 = 0xFA8D, - RealEstate24 = 0xFA8E, - Ribbon24 = 0xFA8F, - RibbonStar20 = 0xFA90, - RibbonStar24 = 0xFA91, - Run16 = 0xFA92, - Run20 = 0xFA93, - Scales24 = 0xFA94, - Scales32 = 0xFA95, - SearchShield20 = 0xFA96, - Multiselect16 = 0xFA97, - Organization16 = 0xFA98, - Organization32 = 0xFA99, - ShieldDismissShield20 = 0xFA9A, - ShiftsDay20 = 0xFA9B, - ShiftsDay24 = 0xFA9C, - SidebarSearchLtr20 = 0xFA9D, - SidebarSearchRtl20 = 0xFA9E, - SignOut20 = 0xFA9F, - SlideMultipleArrowRight24 = 0xFAA0, - SlideSearch24 = 0xFAA1, - SlideSearch28 = 0xFAA2, - SlideSize24 = 0xFAA3, - SlideText16 = 0xFAA4, - SlideText20 = 0xFAA5, - SlideText28 = 0xFAA6, - SlideText48 = 0xFAA7, - Speaker016 = 0xFAA8, - Speaker020 = 0xFAA9, - Speaker028 = 0xFAAA, - Speaker048 = 0xFAAB, - Speaker116 = 0xFAAC, - Speaker120 = 0xFAAD, - Speaker128 = 0xFAAE, - Speaker148 = 0xFAAF, - Organization48 = 0xFAB0, - SpeakerBluetooth28 = 0xFAB1, - Orientation24 = 0xFAB2, - PeopleList16 = 0xFAB3, - SpeakerOff16 = 0xFAB4, - SpeakerOff20 = 0xFAB5, - SpeakerOff48 = 0xFAB6, - SpeakerUsb24 = 0xFAB7, - SpeakerUsb28 = 0xFAB8, - Sport16 = 0xFAB9, - Sport20 = 0xFABA, - Sport24 = 0xFABB, - SportAmericanFootball24 = 0xFABC, - SportBaseball24 = 0xFABD, - SportBasketball24 = 0xFABE, - SportHockey24 = 0xFABF, - StarEdit24 = 0xFAC0, - TabDesktopArrowLeft20 = 0xFAC1, - TabProhibited24 = 0xFAC2, - Table16 = 0xFAC3, - Table28 = 0xFAC4, - Table48 = 0xFAC5, - TableSimple16 = 0xFAC6, - TableSimple20 = 0xFAC7, - TableSimple24 = 0xFAC8, - TableSimple28 = 0xFAC9, - TableSimple48 = 0xFACA, - Tag16 = 0xFACB, - TasksApp20 = 0xFACC, - Tent12 = 0xFACD, - Tent16 = 0xFACE, - Tent20 = 0xFACF, - Tent28 = 0xFAD0, - Tent48 = 0xFAD1, - TextBold16 = 0xFAD2, - TextColor16 = 0xFAD3, - TextColumnOneNarrow20 = 0xFAD4, - TextColumnOneNarrow24 = 0xFAD5, - TextColumnOneWide20 = 0xFAD6, - TextColumnOneWide24 = 0xFAD7, - TextContinuous24 = 0xFAD8, - TextIndentDecrease20 = 0xFAD9, - TextIndentIncrease20 = 0xFADA, - TextItalic16 = 0xFADB, - PeopleMoney20 = 0xFADC, - TextUnderline16 = 0xFADD, - PeopleMoney24 = 0xFADE, - PersonPill20 = 0xFADF, - PersonPill24 = 0xFAE0, - PersonSettings16 = 0xFAE1, - Pivot20 = 0xFAE2, - Pivot24 = 0xFAE3, - Play12 = 0xFAE4, - PrintAdd24 = 0xFAE5, - Pulse28 = 0xFAE6, - ReceiptAdd24 = 0xFAE7, - ReceiptBag24 = 0xFAE8, - ReceiptCube24 = 0xFAE9, - ScanObject20 = 0xFAEA, - ScanObject24 = 0xFAEB, - TicketDiagonal16 = 0xFAEC, - TicketDiagonal20 = 0xFAED, - TicketDiagonal24 = 0xFAEE, - TicketDiagonal28 = 0xFAEF, - Timer16 = 0xFAF0, - Timer20 = 0xFAF1, - ToggleLeft16 = 0xFAF2, - ToggleLeft20 = 0xFAF3, - ToggleLeft24 = 0xFAF4, - ToggleLeft28 = 0xFAF5, - ToggleLeft48 = 0xFAF6, - ToggleRight28 = 0xFAF7, - ToggleRight48 = 0xFAF8, - Tv16 = 0xFAF9, - Tv20 = 0xFAFA, - Tv24 = 0xFAFB, - Tv28 = 0xFAFC, - Tv48 = 0xFAFD, - VehicleBicycle16 = 0xFAFE, - VehicleBicycle20 = 0xFAFF, - VehicleBus16 = 0xFB00, - VehicleBus20 = 0xFB01, - VehicleCar28 = 0xFB02, - VehicleCar48 = 0xFB03, - VehicleShip16 = 0xFB04, - VehicleShip20 = 0xFB05, - VehicleShip24 = 0xFB06, - VehicleSubway16 = 0xFB07, - VehicleSubway20 = 0xFB08, - VehicleSubway24 = 0xFB09, - VehicleTruck16 = 0xFB0A, - VehicleTruck20 = 0xFB0B, - VideoClip20 = 0xFB0C, - Vote20 = 0xFB0D, - Vote24 = 0xFB0E, - WeatherDrizzle20 = 0xFB0F, - WeatherDrizzle24 = 0xFB10, - WeatherDrizzle48 = 0xFB11, - WeatherHaze20 = 0xFB12, - WeatherHaze24 = 0xFB13, - WeatherHaze48 = 0xFB14, - WeatherMoon16 = 0xFB15, - WeatherMoon28 = 0xFB16, - WeatherMoonOff16 = 0xFB17, - WeatherMoonOff20 = 0xFB18, - WeatherMoonOff24 = 0xFB19, - WeatherMoonOff28 = 0xFB1A, - WeatherMoonOff48 = 0xFB1B, - WeatherSunnyHigh20 = 0xFB1C, - WeatherSunnyHigh24 = 0xFB1D, - WeatherSunnyHigh48 = 0xFB1E, - WeatherSunnyLow20 = 0xFB1F, - WeatherSunnyLow24 = 0xFB20, - WeatherSunnyLow48 = 0xFB21, - Search12 = 0xFB22, - WindowNew16 = 0xFB23, - WindowNew24 = 0xFB24, - Search32 = 0xFB25, - Wrench16 = 0xFB26, - Wrench20 = 0xFB27, - VideoBackgroundEffect20 = 0xFB28, - Alert16 = 0xFB29, - ApprovalsApp16 = 0xFB2A, - ApprovalsApp20 = 0xFB2B, - ArrowBounce16 = 0xFB2C, - ArrowBounce24 = 0xFB2D, - Search48 = 0xFB2E, - ArrowEnterUp20 = 0xFB2F, - ArrowEnterUp24 = 0xFB30, - BookmarkMultiple20 = 0xFB31, - Briefcase28 = 0xFB32, - Briefcase48 = 0xFB33, - Building20 = 0xFB34, - Chat48 = 0xFB35, - Share16 = 0xFB36, - ShieldBadge24 = 0xFB37, - DesktopArrowRight16 = 0xFB38, - DesktopArrowRight20 = 0xFB39, - DesktopArrowRight24 = 0xFB3A, - DesktopSpeaker20 = 0xFB3B, - DesktopSpeaker24 = 0xFB3C, - DesktopSpeakerOff20 = 0xFB3D, - DesktopSpeakerOff24 = 0xFB3E, - EmojiAdd20 = 0xFB3F, - FoodCake20 = 0xFB40, - GridKanban20 = 0xFB41, - HandRight20 = 0xFB42, - HandRightOff20 = 0xFB43, - LearningApp20 = 0xFB44, - LearningApp24 = 0xFB45, - LiveOff20 = 0xFB46, - LiveOff24 = 0xFB47, - MicProhibited20 = 0xFB48, - NotebookSection20 = 0xFB49, - PeopleAudience20 = 0xFB4A, - PeopleCall16 = 0xFB4B, - PeopleCall20 = 0xFB4C, - PersonCall16 = 0xFB4D, - PersonCall20 = 0xFB4E, - PhoneDesktopAdd20 = 0xFB4F, - Presenter20 = 0xFB50, - PresenterOff20 = 0xFB51, - RectangleLandscape20 = 0xFB52, - Ribbon20 = 0xFB53, - SaveSync20 = 0xFB54, - Shifts20 = 0xFB55, - ShiftsCheckmark20 = 0xFB56, - ShiftsCheckmark24 = 0xFB57, - SlideMultiple24 = 0xFB58, - StarLineHorizontal320 = 0xFB59, - StarLineHorizontal324 = 0xFB5A, - TableAdd20 = 0xFB5B, - TableDismiss20 = 0xFB5C, - TableDismiss24 = 0xFB5D, - TapDouble20 = 0xFB5E, - TapSingle20 = 0xFB5F, - TextBulletListAdd20 = 0xFB60, - TextBulletListSquare20 = 0xFB61, - TextGrammarError20 = 0xFB62, - TextNumberListRtl20 = 0xFB63, - Video36020 = 0xFB64, - Video36024 = 0xFB65, - VideoPerson12 = 0xFB66, - VideoPerson16 = 0xFB67, - VideoPerson20 = 0xFB68, - VideoPerson28 = 0xFB69, - VideoPerson48 = 0xFB6A, - VideoPersonCall16 = 0xFB6B, - VideoPersonCall20 = 0xFB6C, - VideoPersonCall24 = 0xFB6D, - VideoPersonStar20 = 0xFB6E, - VideoProhibited20 = 0xFB6F, - VideoSwitch20 = 0xFB70, - WifiWarning20 = 0xFB71, - Album24 = 0xFB72, - AlbumAdd24 = 0xFB73, - AlertUrgent16 = 0xFB74, - ArrowRight16 = 0xFB75, - ArrowUndo16 = 0xFB76, - ArrowUpLeft16 = 0xFB77, - ArrowUpLeft20 = 0xFB78, - BackpackAdd20 = 0xFB79, - BackpackAdd24 = 0xFB7A, - BackpackAdd28 = 0xFB7B, - BackpackAdd48 = 0xFB7C, - Bot20 = 0xFB7D, - CallConnecting20 = 0xFB7E, - CallExclamation20 = 0xFB7F, - CallTransfer20 = 0xFB80, - CameraOff24 = 0xFB81, - ChatBubblesQuestion20 = 0xFB82, - ChatMail20 = 0xFB83, - ChatOff20 = 0xFB84, - Checkmark48 = 0xFB85, - CloudSync20 = 0xFB86, - ContentView20 = 0xFB87, - CubeRotate20 = 0xFB88, - DataLine20 = 0xFB89, - DeviceMeetingRoom20 = 0xFB8A, - DeviceMeetingRoomRemote20 = 0xFB8B, - DrawShape24 = 0xFB8C, - DrawText24 = 0xFB8D, - FolderArrowUp16 = 0xFB8E, - FolderArrowUp20 = 0xFB8F, - FolderArrowUp24 = 0xFB90, - FolderArrowUp28 = 0xFB91, - ShieldLock16 = 0xFB92, - Fps3016 = 0xFB93, - Fps3020 = 0xFB94, - Fps3024 = 0xFB95, - Fps3028 = 0xFB96, - Fps3048 = 0xFB97, - Fps6016 = 0xFB98, - Fps6020 = 0xFB99, - Fps6024 = 0xFB9A, - Fps6028 = 0xFB9B, - Fps6048 = 0xFB9C, - SlideEraser16 = 0xFB9D, - HomePerson20 = 0xFB9E, - ImageOff20 = 0xFB9F, - Lasso20 = 0xFBA0, - LeafThree16 = 0xFBA1, - LeafThree20 = 0xFBA2, - LeafThree24 = 0xFBA3, - MicSync20 = 0xFBA4, - NotebookSubsection20 = 0xFBA5, - PersonCircle20 = 0xFBA6, - Pulse20 = 0xFBA7, - PulseSquare24 = 0xFBA8, - Ribbon16 = 0xFBA9, - RotateLeft24 = 0xFBAA, - RotateRight20 = 0xFBAB, - RotateRight24 = 0xFBAC, - ShareCloseTray20 = 0xFBAD, - SquareMultiple20 = 0xFBAE, - StarEmphasis20 = 0xFBAF, - TvArrowRight20 = 0xFBB0, - VideoPersonStarOff20 = 0xFBB1, - VideoRecording20 = 0xFBB2, - VideoSync20 = 0xFBB3, - BreakoutRoom20 = 0xFBB4, - ContentViewGallery20 = 0xFBB5, - DoorTag24 = 0xFBB6, - Luggage24 = 0xFBB7, - PeopleEdit20 = 0xFBB8, - ChannelShare12 = 0xFBB9, - ChannelShare16 = 0xFBBA, - ChannelShare20 = 0xFBBB, - ChannelShare24 = 0xFBBC, - ChannelShare28 = 0xFBBD, - ChannelShare48 = 0xFBBE, - PeopleError16 = 0xFBBF, - PeopleError20 = 0xFBC0, - PeopleError24 = 0xFBC1, - PuzzleCube16 = 0xFBC2, - PuzzleCube20 = 0xFBC3, - PuzzleCube24 = 0xFBC4, - PuzzleCube28 = 0xFBC5, - PuzzleCube48 = 0xFBC6, - ArrowCircleDownRight16 = 0xFBC7, - ArrowCircleDownRight24 = 0xFBC8, - ArrowCircleRight24 = 0xFBC9, - ArrowCircleUp16 = 0xFBCA, - ArrowCircleUp20 = 0xFBCB, - ArrowCircleUp24 = 0xFBCC, - ArrowCircleUpLeft24 = 0xFBCD, - ArrowEnterLeft20 = 0xFBCE, - ArrowEnterLeft24 = 0xFBCF, - ArrowExportLtr20 = 0xFBD0, - ArrowExportLtr24 = 0xFBD1, - ArrowSquareDown24 = 0xFBD2, - ArrowUndo32 = 0xFBD3, - ArrowUndo48 = 0xFBD4, - SlideEraser20 = 0xFBD5, - SlideGrid24 = 0xFBD6, - AutoFitHeight24 = 0xFBD7, - AutoFitWidth24 = 0xFBD8, - Border24 = 0xFBD9, - BriefcaseMedical24 = 0xFBDA, - BriefcaseMedical32 = 0xFBDB, - BuildingFactory24 = 0xFBDC, - CalendarArrowDown24 = 0xFBDD, - Call16 = 0xFBDE, - Call20 = 0xFBDF, - Call24 = 0xFBE0, - Call28 = 0xFBE1, - CallMissed20 = 0xFBE2, - CallProhibited16 = 0xFBE3, - CallProhibited20 = 0xFBE4, - CallProhibited24 = 0xFBE5, - CallProhibited28 = 0xFBE6, - CallProhibited48 = 0xFBE7, - CaretDownLeft12 = 0xFBE8, - CaretDownLeft16 = 0xFBE9, - CaretDownLeft20 = 0xFBEA, - CaretDownLeft24 = 0xFBEB, - CellularDataCellularOff24 = 0xFBEC, - CellularDataCellularUnavailable24 = 0xFBED, - CenterHorizontal24 = 0xFBEE, - CenterVertical24 = 0xFBEF, - ChevronCircleDown24 = 0xFBF0, - ChevronCircleRight24 = 0xFBF1, - ClipboardImage24 = 0xFBF2, - CommentArrowLeft24 = 0xFBF3, - CommentArrowRight24 = 0xFBF4, - CommentDismiss24 = 0xFBF5, - Component2DoubleTapSwipeDown24 = 0xFBF6, - Component2DoubleTapSwipeUp24 = 0xFBF7, - CopyArrowRight16 = 0xFBF8, - CopyArrowRight24 = 0xFBF9, - CurrencyDollarEuro16 = 0xFBFA, - CurrencyDollarEuro20 = 0xFBFB, - CurrencyDollarEuro24 = 0xFBFC, - DeleteDismiss24 = 0xFBFD, - DeleteDismiss28 = 0xFBFE, - DockPanelLeft16 = 0xFBFF, - DockPanelLeft20 = 0xFC00, - DockPanelLeft24 = 0xFC01, - DockPanelLeft28 = 0xFC02, - DockPanelLeft48 = 0xFC03, - DockPanelRight16 = 0xFC04, - DockPanelRight20 = 0xFC05, - DockPanelRight24 = 0xFC06, - DockPanelRight28 = 0xFC07, - DockPanelRight48 = 0xFC08, - DocumentProhibited20 = 0xFC09, - DocumentProhibited24 = 0xFC0A, - DocumentSync24 = 0xFC0B, - DrinkToGo24 = 0xFC0C, - DualScreenHeader24 = 0xFC0D, - EyeTrackingOn16 = 0xFC0E, - EyeTrackingOn20 = 0xFC0F, - EyeTrackingOn24 = 0xFC10, - Fluent24 = 0xFC11, - FolderArrowRight16 = 0xFC12, - FolderArrowRight20 = 0xFC13, - FolderArrowRight24 = 0xFC14, - FolderArrowRight28 = 0xFC15, - FolderArrowRight48 = 0xFC16, - FolderArrowUp48 = 0xFC17, - FolderProhibited20 = 0xFC18, - FolderProhibited24 = 0xFC19, - FolderProhibited28 = 0xFC1A, - FolderProhibited48 = 0xFC1B, - FolderSwap16 = 0xFC1C, - FolderSwap20 = 0xFC1D, - FolderSwap24 = 0xFC1E, - FullScreenMaximize24 = 0xFC1F, - FullScreenMinimize24 = 0xFC20, - ImageMultiple20 = 0xFC21, - ImageMultiple24 = 0xFC22, - ImageMultiple28 = 0xFC23, - LeafOne16 = 0xFC24, - LeafOne20 = 0xFC25, - LeafOne24 = 0xFC26, - LinkDismiss20 = 0xFC27, - LocationDismiss24 = 0xFC28, - LockClosed12 = 0xFC29, - LockClosed16 = 0xFC2A, - LockClosed20 = 0xFC2B, - LockClosed24 = 0xFC2C, - LockOpen20 = 0xFC2D, - LockOpen24 = 0xFC2E, - LockOpen28 = 0xFC2F, - MailInboxAll24 = 0xFC30, - MailInboxArrowRight24 = 0xFC31, - MailInboxArrowUp20 = 0xFC32, - MailInboxArrowUp24 = 0xFC33, - MailOff24 = 0xFC34, - MoreHorizontal16 = 0xFC35, - MoreHorizontal20 = 0xFC36, - MoreHorizontal24 = 0xFC37, - MoreHorizontal28 = 0xFC38, - MoreHorizontal48 = 0xFC39, - MusicNote120 = 0xFC3A, - MusicNote124 = 0xFC3B, - MusicNote216 = 0xFC3C, - MusicNote224 = 0xFC3D, - PeopleTeamDelete24 = 0xFC3E, - PhoneAdd24 = 0xFC3F, - PhoneArrowRight20 = 0xFC40, - PhoneArrowRight24 = 0xFC41, - PhoneDismiss24 = 0xFC42, - PhoneLock24 = 0xFC43, - PhoneSpanIn16 = 0xFC44, - PhoneSpanIn20 = 0xFC45, - PhoneSpanIn24 = 0xFC46, - PhoneSpanIn28 = 0xFC47, - PhoneSpanOut16 = 0xFC48, - PhoneSpanOut20 = 0xFC49, - PhoneSpanOut24 = 0xFC4A, - PhoneSpanOut28 = 0xFC4B, - PositionBackward20 = 0xFC4C, - PositionBackward24 = 0xFC4D, - PositionForward20 = 0xFC4E, - PositionForward24 = 0xFC4F, - PositionToBack20 = 0xFC50, - PositionToBack24 = 0xFC51, - PositionToFront20 = 0xFC52, - PositionToFront24 = 0xFC53, - ResizeLarge16 = 0xFC54, - ResizeLarge20 = 0xFC55, - ResizeLarge24 = 0xFC56, - ResizeSmall16 = 0xFC57, - ResizeSmall20 = 0xFC58, - ResizeSmall24 = 0xFC59, - SaveEdit20 = 0xFC5A, - SaveEdit24 = 0xFC5B, - SearchInfo20 = 0xFC5C, - SearchVisual16 = 0xFC5D, - SearchVisual20 = 0xFC5E, - SearchVisual24 = 0xFC5F, - SelectAllOn24 = 0xFC60, - ShareScreenStart20 = 0xFC61, - ShareScreenStart24 = 0xFC62, - ShareScreenStart28 = 0xFC63, - ShareScreenStop16 = 0xFC64, - ShareScreenStop20 = 0xFC65, - ShareScreenStop24 = 0xFC66, - ShareScreenStop28 = 0xFC67, - ShareScreenStop48 = 0xFC68, - ShieldDismiss16 = 0xFC69, - ShiftsProhibited24 = 0xFC6A, - ShiftsQuestionMark24 = 0xFC6B, - Speaker216 = 0xFC6C, - Speaker220 = 0xFC6D, - Speaker224 = 0xFC6E, - Speaker228 = 0xFC6F, - Speaker248 = 0xFC70, - SpeakerMute16 = 0xFC71, - SpeakerMute20 = 0xFC72, - SpeakerMute24 = 0xFC73, - SpeakerMute28 = 0xFC74, - SpeakerMute48 = 0xFC75, - Square16 = 0xFC76, - SquareAdd16 = 0xFC77, - SquareHintArrowBack16 = 0xFC78, - StarArrowRightEnd24 = 0xFC79, - Subtract12 = 0xFC7A, - Subtract16 = 0xFC7B, - Subtract20 = 0xFC7C, - Subtract24 = 0xFC7D, - Subtract28 = 0xFC7E, - Subtract48 = 0xFC7F, - TabAdd20 = 0xFC80, - TabAdd24 = 0xFC81, - TabArrowLeft24 = 0xFC82, - TabShieldDismiss20 = 0xFC83, - TabShieldDismiss24 = 0xFC84, - TableDeleteColumn24 = 0xFC85, - TableDeleteRow24 = 0xFC86, - TableFreezeColumnAndRow24 = 0xFC87, - TableInsertColumn24 = 0xFC88, - TableInsertRow24 = 0xFC89, - TableMoveAbove24 = 0xFC8A, - TableMoveBelow24 = 0xFC8B, - TableResizeColumn24 = 0xFC8C, - TableResizeRow24 = 0xFC8D, - TableStackAbove24 = 0xFC8E, - TableStackBelow24 = 0xFC8F, - TableStackLeft24 = 0xFC90, - TableStackRight24 = 0xFC91, - TagQuestionMark16 = 0xFC92, - TagQuestionMark24 = 0xFC93, - TextGrammarArrowLeft20 = 0xFC94, - TextGrammarArrowLeft24 = 0xFC95, - TextGrammarArrowRight20 = 0xFC96, - TextGrammarArrowRight24 = 0xFC97, - TextGrammarCheckmark20 = 0xFC98, - TextGrammarCheckmark24 = 0xFC99, - TextGrammarDismiss20 = 0xFC9A, - TextGrammarDismiss24 = 0xFC9B, - TextGrammarSettings20 = 0xFC9C, - TextGrammarSettings24 = 0xFC9D, - TextGrammarWand16 = 0xFC9E, - TextGrammarWand20 = 0xFC9F, - TextGrammarWand24 = 0xFCA0, - TextParagraph20 = 0xFCA1, - TextParagraph24 = 0xFCA2, - TextParagraphDirection20 = 0xFCA3, - TextParagraphDirection24 = 0xFCA4, - TextPositionBehind20 = 0xFCA5, - TextPositionBehind24 = 0xFCA6, - TextPositionFront20 = 0xFCA7, - TextPositionFront24 = 0xFCA8, - TextPositionLine20 = 0xFCA9, - TextPositionLine24 = 0xFCAA, - TextPositionSquare20 = 0xFCAB, - TextPositionSquare24 = 0xFCAC, - TextPositionThrough20 = 0xFCAD, - TextPositionThrough24 = 0xFCAE, - TextPositionTight20 = 0xFCAF, - TextPositionTight24 = 0xFCB0, - TextPositionTopBottom20 = 0xFCB1, - TextPositionTopBottom24 = 0xFCB2, - TextboxAlignCenter20 = 0xFCB3, - TextboxAlignCenter24 = 0xFCB4, - ThumbLike16 = 0xFCB5, - TicketHorizontal20 = 0xFCB6, - TicketHorizontal24 = 0xFCB7, - Wand16 = 0xFCB8, - Wand20 = 0xFCB9, - Wand24 = 0xFCBA, - Wand28 = 0xFCBB, - Wand48 = 0xFCBC, - WindowArrowUp24 = 0xFCBD, - WindowHeaderHorizontal20 = 0xFCBE, - WindowHeaderVertical20 = 0xFCBF, - Accessibility32 = 0xFCC0, - AccessibilityCheckmark24 = 0xFCC1, - AddCircle16 = 0xFCC2, - AddCircle32 = 0xFCC3, - AnimalRabbit16 = 0xFCC4, - AnimalRabbit20 = 0xFCC5, - AnimalRabbit24 = 0xFCC6, - AnimalRabbit28 = 0xFCC7, - AnimalTurtle16 = 0xFCC8, - AnimalTurtle20 = 0xFCC9, - AnimalTurtle24 = 0xFCCA, - AnimalTurtle28 = 0xFCCB, - BookContacts20 = 0xFCCC, - BookContacts24 = 0xFCCD, - BookContacts28 = 0xFCCE, - BookOpenGlobe20 = 0xFCCF, - CalligraphyPenCheckmark20 = 0xFCD0, - CalligraphyPenQuestionMark20 = 0xFCD1, - Cellular5g24 = 0xFCD2, - Checkbox124 = 0xFCD3, - Checkbox224 = 0xFCD4, - CheckboxArrowRight24 = 0xFCD5, - CheckboxPerson24 = 0xFCD6, - CheckboxWarning24 = 0xFCD7, - CircleEdit24 = 0xFCD8, - Clock32 = 0xFCD9, - Cloud16 = 0xFCDA, - Cloud32 = 0xFCDB, - CommentNote24 = 0xFCDC, - ContentSettings32 = 0xFCDD, - DesktopMac16 = 0xFCDE, - DesktopMac32 = 0xFCDF, - DocumentArrowRight24 = 0xFCE0, - DocumentCheckmark24 = 0xFCE1, - DualScreenDismiss24 = 0xFCE2, - DualScreenSpeaker24 = 0xFCE3, - FilterDismiss24 = 0xFCE4, - FilterSync24 = 0xFCE5, - Folder16 = 0xFCE6, - Folder32 = 0xFCE7, - GlobePerson24 = 0xFCE8, - HomePerson24 = 0xFCE9, - ImageGlobe24 = 0xFCEA, - InkingTool32 = 0xFCEB, - Key16 = 0xFCEC, - Key32 = 0xFCED, - LineStyle24 = 0xFCEE, - MathFormula16 = 0xFCEF, - MathFormula32 = 0xFCF0, - NotebookAdd24 = 0xFCF1, - NotebookSectionArrowRight24 = 0xFCF2, - NotebookSubsection24 = 0xFCF3, - Orientation20 = 0xFCF4, - People32 = 0xFCF5, - PersonNote24 = 0xFCF6, - PhoneLaptop16 = 0xFCF7, - PhoneLaptop32 = 0xFCF8, - PhoneSpeaker24 = 0xFCF9, - Pi24 = 0xFCFA, - Premium32 = 0xFCFB, - Receipt20 = 0xFCFC, - Receipt24 = 0xFCFD, - Rss24 = 0xFCFE, - ScreenCut20 = 0xFCFF, - ScreenPerson20 = 0xFD00, - ShapeExclude16 = 0xFD01, - ShapeExclude20 = 0xFD02, - ShapeExclude24 = 0xFD03, - ShapeIntersect16 = 0xFD04, - ShapeIntersect20 = 0xFD05, - ShapeIntersect24 = 0xFD06, - ShapeSubtract16 = 0xFD07, - ShapeSubtract20 = 0xFD08, - ShapeSubtract24 = 0xFD09, - ShapeUnion16 = 0xFD0A, - ShapeUnion20 = 0xFD0B, - ShapeUnion24 = 0xFD0C, - Shifts16 = 0xFD0D, - SlideSettings24 = 0xFD0E, - SlideTransition24 = 0xFD0F, - StarEmphasis32 = 0xFD10, - Table32 = 0xFD11, - TableCellEdit24 = 0xFD12, - TabletSpeaker24 = 0xFD13, - Target32 = 0xFD14, - Timer324 = 0xFD15, - Voicemail28 = 0xFD16, - WalkieTalkie20 = 0xFD17, - WarningShield20 = 0xFD18, - AddSubtractCircle16 = 0xFD19, - AddSubtractCircle20 = 0xFD1A, - AddSubtractCircle24 = 0xFD1B, - AddSubtractCircle28 = 0xFD1C, - AddSubtractCircle48 = 0xFD1D, - Beach16 = 0xFD1E, - Beach20 = 0xFD1F, - Beach24 = 0xFD20, - Beach28 = 0xFD21, - Building16 = 0xFD22, - CalendarEdit16 = 0xFD23, - CalendarEdit20 = 0xFD24, - CalendarEdit24 = 0xFD25, - CalendarLtr20 = 0xFD26, - CalendarLtr24 = 0xFD27, - CalendarLtr28 = 0xFD28, - CalendarRtl20 = 0xFD29, - CalendarRtl24 = 0xFD2A, - CalendarRtl28 = 0xFD2B, - CircleSmall20 = 0xFD2C, - Clipboard16 = 0xFD2D, - ClipboardArrowRight16 = 0xFD2E, - ClipboardArrowRight20 = 0xFD2F, - ClipboardArrowRight24 = 0xFD30, - ClipboardTextLtr20 = 0xFD31, - ClipboardTextLtr24 = 0xFD32, - ClipboardTextRtl20 = 0xFD33, - ClipboardTextRtl24 = 0xFD34, - ConvertToType20 = 0xFD35, - ConvertToType24 = 0xFD36, - CubeSync24 = 0xFD37, - DocumentQuestionMark16 = 0xFD38, - DocumentQuestionMark20 = 0xFD39, - DocumentQuestionMark24 = 0xFD3A, - DoorArrowLeft20 = 0xFD3B, - Drop12 = 0xFD3C, - Drop16 = 0xFD3D, - Drop20 = 0xFD3E, - Drop24 = 0xFD3F, - Drop28 = 0xFD40, - Drop48 = 0xFD41, - Dumbbell16 = 0xFD42, - Dumbbell20 = 0xFD43, - Dumbbell24 = 0xFD44, - Dumbbell28 = 0xFD45, - EditOff20 = 0xFD46, - Eyedropper20 = 0xFD47, - Eyedropper24 = 0xFD48, - FlagOff16 = 0xFD49, - FlagOff20 = 0xFD4A, - Fps12020 = 0xFD4B, - Fps12024 = 0xFD4C, - Fps24020 = 0xFD4D, - Guitar16 = 0xFD4E, - Guitar20 = 0xFD4F, - Guitar24 = 0xFD50, - Guitar28 = 0xFD51, - KeyCommand16 = 0xFD52, - MicOn32 = 0xFD53, - MoreVertical16 = 0xFD54, - PeopleCheckmark20 = 0xFD55, - PeopleCheckmark24 = 0xFD56, - PlayCircle16 = 0xFD57, - PlayCircle20 = 0xFD58, - PlayCircle28 = 0xFD59, - ReOrderDotsHorizontal16 = 0xFD5A, - ReOrderDotsHorizontal20 = 0xFD5B, - ReOrderDotsHorizontal24 = 0xFD5C, - ReOrderDotsVertical16 = 0xFD5D, - ReOrderDotsVertical20 = 0xFD5E, - ReOrderDotsVertical24 = 0xFD5F, - ScaleFill20 = 0xFD60, - SkipBack1020 = 0xFD61, - SkipForward1020 = 0xFD62, - SkipForward3020 = 0xFD63, - SlideEraser24 = 0xFD64, - SplitHorizontal12 = 0xFD65, - SplitHorizontal16 = 0xFD66, - SplitHorizontal20 = 0xFD67, - SplitHorizontal24 = 0xFD68, - SplitHorizontal28 = 0xFD69, - SplitHorizontal32 = 0xFD6A, - SplitHorizontal48 = 0xFD6B, - SplitVertical12 = 0xFD6C, - SplitVertical16 = 0xFD6D, - SplitVertical20 = 0xFD6E, - SplitVertical24 = 0xFD6F, - SplitVertical28 = 0xFD70, - SplitVertical32 = 0xFD71, - SplitVertical48 = 0xFD72, - SportSoccer20 = 0xFD73, - SportSoccer24 = 0xFD74, - StrikethroughGaNa16 = 0xFD75, - StrikethroughGaNa20 = 0xFD76, - StrikethroughGaNa24 = 0xFD77, - Symbols20 = 0xFD78, - TableDeleteColumn20 = 0xFD79, - TableDeleteRow20 = 0xFD7A, - TableStackAbove20 = 0xFD7B, - TableStackDown20 = 0xFD7C, - TableStackLeft20 = 0xFD7D, - TableStackRight20 = 0xFD7E, - TaskListLtr20 = 0xFD7F, - TaskListLtr24 = 0xFD80, - TaskListRtl20 = 0xFD81, - TaskListRtl24 = 0xFD82, - TetrisApp16 = 0xFD83, - TetrisApp20 = 0xFD84, - TetrisApp24 = 0xFD85, - TetrisApp28 = 0xFD86, - TetrisApp32 = 0xFD87, - TetrisApp48 = 0xFD88, - TextBulletListLtr20 = 0xFD89, - TextBulletListLtr24 = 0xFD8A, - TextBulletListRtl20 = 0xFD8B, - TextBulletListRtl24 = 0xFD8C, - TextStrikethroughS16 = 0xFD8D, - TextStrikethroughS20 = 0xFD8E, - TextStrikethroughS24 = 0xFD8F, - VehicleCab16 = 0xFD90, - VehicleCab20 = 0xFD91, - VehicleCab28 = 0xFD92, - VehicleTruckProfile24 = 0xFD93, - BotAdd20 = 0xFD94, - ChartPerson20 = 0xFD95, - ChartPerson24 = 0xFD96, - ChartPerson28 = 0xFD97, - ChartPerson48 = 0xFD98, - ConvertToTypeOff20 = 0xFD99, - MicProhibited16 = 0xFD9A, - MicProhibited28 = 0xFD9B, - MicProhibited48 = 0xFD9C, - TvUsb16 = 0xFD9D, - TvUsb20 = 0xFD9E, - TvUsb24 = 0xFD9F, - TvUsb28 = 0xFDA0, - TvUsb48 = 0xFDA1, - Video360Off20 = 0xFDA2, - VideoProhibited16 = 0xFDA3, - VideoProhibited24 = 0xFDA4, - VideoProhibited28 = 0xFDA5, - Alert32 = 0xFDA6, - ApprovalApp32 = 0xFDA7, - ArrowDownLeft20 = 0xFDA8, - ArrowStepBack16 = 0xFDA9, - ArrowStepIn16 = 0xFDAA, - ArrowStepOut16 = 0xFDAB, - ArrowStepOver16 = 0xFDAC, - ArrowUpRight20 = 0xFDAD, - Backpack32 = 0xFDAE, - BookContacts32 = 0xFDAF, - Bookmark32 = 0xFDB0, - BookmarkMultiple24 = 0xFDB1, - BranchCompare16 = 0xFDB2, - BranchCompare20 = 0xFDB3, - BranchCompare24 = 0xFDB4, - BranchFork16 = 0xFDB5, - BranchFork20 = 0xFDB6, - BranchFork24 = 0xFDB7, - CalendarLtr16 = 0xFDB8, - CalendarLtr32 = 0xFDB9, - CalendarRtl32 = 0xFDBA, - Call32 = 0xFDBB, - CalligraphyPenError20 = 0xFDBC, - Chat32 = 0xFDBD, - ClipboardDataBar32 = 0xFDBE, - ClockAlarm32 = 0xFDBF, - ContentView32 = 0xFDC0, - Desktop32 = 0xFDC1, - DismissSquareMultiple16 = 0xFDC2, - Document32 = 0xFDC3, - DocumentPdf32 = 0xFDC4, - FoodPizza20 = 0xFDC5, - FoodPizza24 = 0xFDC6, - Globe32 = 0xFDC7, - Headset32 = 0xFDC8, - HeartPulse20 = 0xFDC9, - Multiplier12x20 = 0xFDCA, - Multiplier12x24 = 0xFDCB, - Multiplier12x28 = 0xFDCC, - Multiplier12x32 = 0xFDCD, - Multiplier12x48 = 0xFDCE, - Multiplier15x20 = 0xFDCF, - Multiplier15x24 = 0xFDD0, - Multiplier15x28 = 0xFDD1, - Multiplier15x32 = 0xFDD2, - Multiplier15x48 = 0xFDD3, - Multiplier18x20 = 0xFDD4, - Multiplier18x24 = 0xFDD5, - Multiplier18x28 = 0xFDD6, - Multiplier18x32 = 0xFDD7, - Multiplier18x48 = 0xFDD8, - Multiplier1x20 = 0xFDD9, - Multiplier1x24 = 0xFDDA, - Multiplier1x28 = 0xFDDB, - Multiplier1x32 = 0xFDDC, - Multiplier1x48 = 0xFDDD, - Multiplier2x20 = 0xFDDE, - Multiplier2x24 = 0xFDDF, - Multiplier2x28 = 0xFDE0, - Multiplier2x32 = 0xFDE1, - Multiplier2x48 = 0xFDE2, - MyLocation16 = 0xFDE3, - MyLocation20 = 0xFDE4, - Notepad32 = 0xFDE5, - Patient32 = 0xFDE6, - PeopleTeam32 = 0xFDE7, - Pulse32 = 0xFDE8, - Remote16 = 0xFDE9, - Ribbon32 = 0xFDEA, - Shifts32 = 0xFDEB, - SkipBackward1024 = 0xFDEC, - SkipBackward1028 = 0xFDED, - SkipBackward1032 = 0xFDEE, - SkipBackward1048 = 0xFDEF, - SkipForward1024 = 0xFDF0, - SkipForward1028 = 0xFDF1, - SkipForward1032 = 0xFDF2, - SkipForward1048 = 0xFDF3, - SkipForward3024 = 0xFDF4, - SkipForward3028 = 0xFDF5, - SkipForward3032 = 0xFDF6, - SkipForward3048 = 0xFDF7, - SubtractSquareMultiple16 = 0xFDF8, - Text20 = 0xFDF9, - TextSortAscending16 = 0xFDFA, - TextSortAscending24 = 0xFDFB, - TextSortDescending16 = 0xFDFC, - TextSortDescending24 = 0xFDFD, - VideoPersonCall32 = 0xFDFE, - WeatherSunny32 = 0xFDFF, - AlignBottom16 = 0xFE00, - AlignBottom20 = 0xFE01, - AlignBottom24 = 0xFE02, - AlignBottom28 = 0xFE03, - AlignBottom32 = 0xFE04, - AlignBottom48 = 0xFE05, - AlignCenterHorizontal16 = 0xFE06, - AlignCenterHorizontal20 = 0xFE07, - AlignCenterHorizontal24 = 0xFE08, - AlignCenterHorizontal28 = 0xFE09, - AlignCenterHorizontal32 = 0xFE0A, - AlignCenterHorizontal48 = 0xFE0B, - AlignCenterVertical16 = 0xFE0C, - AlignCenterVertical20 = 0xFE0D, - AlignCenterVertical24 = 0xFE0E, - AlignCenterVertical28 = 0xFE0F, - AlignCenterVertical32 = 0xFE10, - AlignCenterVertical48 = 0xFE11, - AlignLeft16 = 0xFE12, - AlignLeft20 = 0xFE13, - AlignLeft24 = 0xFE14, - AlignLeft28 = 0xFE15, - AlignLeft32 = 0xFE16, - AlignLeft48 = 0xFE17, - AlignRight16 = 0xFE18, - AlignRight20 = 0xFE19, - AlignRight24 = 0xFE1A, - AlignRight28 = 0xFE1B, - AlignRight32 = 0xFE1C, - AlignRight48 = 0xFE1D, - AlignTop16 = 0xFE1E, - AlignTop20 = 0xFE1F, - AlignTop24 = 0xFE20, - AlignTop28 = 0xFE21, - AlignTop32 = 0xFE22, - AlignTop48 = 0xFE23, - Calculator24 = 0xFE24, - Camera16 = 0xFE25, - GroupDismiss24 = 0xFE26, - GroupReturn24 = 0xFE27, - HandLeft16 = 0xFE28, - HandLeft24 = 0xFE29, - HandLeft28 = 0xFE2A, - HandRight16 = 0xFE2B, - Home12 = 0xFE2C, - KeyboardShift16 = 0xFE2D, - KeyboardShift20 = 0xFE2E, - LinkSquare20 = 0xFE2F, - MailInboxCheckmark16 = 0xFE30, - MailInboxCheckmark20 = 0xFE31, - MailInboxCheckmark24 = 0xFE32, - MusicNote220 = 0xFE33, - MyLocation12 = 0xFE34, - NumberSymbolSquare20 = 0xFE35, - NumberSymbolSquare24 = 0xFE36, - Person32 = 0xFE37, - Person532 = 0xFE38, - Search16 = 0xFE39, - Send16 = 0xFE3A, - Symbols16 = 0xFE3B, - Teddy20 = 0xFE3C, - VideoPersonStarOff24 = 0xFE3D, - AppsAddIn16 = 0xFE3E, - AppsAddIn28 = 0xFE3F, - ArrowCurveDownLeft16 = 0xFE40, - ArrowCurveDownLeft24 = 0xFE41, - ArrowCurveDownLeft28 = 0xFE42, - ArrowUpload16 = 0xFE43, - Attach12 = 0xFE44, - Board16 = 0xFE45, - Board20 = 0xFE46, - Board28 = 0xFE47, - BoardSplit16 = 0xFE48, - BoardSplit20 = 0xFE49, - BoardSplit24 = 0xFE4A, - BoardSplit28 = 0xFE4B, - BoardSplit48 = 0xFE4C, - CalendarEmpty32 = 0xFE4D, - CalendarLtr12 = 0xFE4E, - CalendarMultiple32 = 0xFE4F, - ChevronUpDown20 = 0xFE50, - ChevronUpDown24 = 0xFE51, - Circle12 = 0xFE52, - CircleHalfFill12 = 0xFE53, - CircleLine12 = 0xFE54, - ClosedCaptionOff16 = 0xFE55, - ClosedCaptionOff20 = 0xFE56, - ClosedCaptionOff24 = 0xFE57, - ClosedCaptionOff28 = 0xFE58, - ClosedCaptionOff48 = 0xFE59, - CloudDownload16 = 0xFE5A, - CloudDownload20 = 0xFE5B, - DesktopPulse16 = 0xFE5C, - DesktopPulse20 = 0xFE5D, - DesktopPulse24 = 0xFE5E, - DesktopPulse28 = 0xFE5F, - DesktopPulse32 = 0xFE60, - DesktopPulse48 = 0xFE61, - DeveloperBoard20 = 0xFE62, - DismissSquare24 = 0xFE63, - DoorArrowLeft24 = 0xFE64, - EmojiHand20 = 0xFE65, - Filter16 = 0xFE66, - Flash16 = 0xFE67, - Flash28 = 0xFE68, - FlashCheckmark16 = 0xFE69, - FlashCheckmark20 = 0xFE6A, - FlashCheckmark24 = 0xFE6B, - FlashCheckmark28 = 0xFE6C, - FolderProhibited16 = 0xFE6D, - Grid16 = 0xFE6E, - Headphones20 = 0xFE6F, - Headphones32 = 0xFE70, - Headphones48 = 0xFE71, - HeadphonesSoundWave20 = 0xFE72, - HeadphonesSoundWave24 = 0xFE73, - HeadphonesSoundWave28 = 0xFE74, - HeadphonesSoundWave32 = 0xFE75, - HeadphonesSoundWave48 = 0xFE76, - HomeCheckmark16 = 0xFE77, - HomeCheckmark20 = 0xFE78, - InkStroke20 = 0xFE79, - InkStroke24 = 0xFE7A, - Library16 = 0xFE7B, - Library20 = 0xFE7C, - List16 = 0xFE7D, - LocationArrowLeft48 = 0xFE7E, - LocationArrowRight48 = 0xFE7F, - LocationArrowUp48 = 0xFE80, - MailInboxCheckmark28 = 0xFE81, - Map20 = 0xFE82, - Multiplier5x20 = 0xFE83, - Multiplier5x24 = 0xFE84, - Multiplier5x28 = 0xFE85, - Multiplier5x32 = 0xFE86, - Multiplier5x48 = 0xFE87, - MusicNote2Play20 = 0xFE88, - Notepad12 = 0xFE89, - Organization12 = 0xFE8A, - PeopleCommunityAdd20 = 0xFE8B, - PeopleCommunityAdd28 = 0xFE8C, - Person632 = 0xFE8D, - PersonAdd16 = 0xFE8E, - PersonAdd28 = 0xFE8F, - PersonProhibited16 = 0xFE90, - PersonProhibited28 = 0xFE91, - Pin28 = 0xFE92, - Pin32 = 0xFE93, - Pin48 = 0xFE94, - PremiumPerson20 = 0xFE95, - PremiumPerson24 = 0xFE96, - ProhibitedMultiple16 = 0xFE97, - ProhibitedMultiple20 = 0xFE98, - ProhibitedMultiple24 = 0xFE99, - ReadAloud16 = 0xFE9A, - ReadAloud28 = 0xFE9B, - Shield16 = 0xFE9C, - Shield28 = 0xFE9D, - Shield48 = 0xFE9E, - ShieldCheckmark16 = 0xFE9F, - ShieldCheckmark20 = 0xFEA0, - ShieldCheckmark24 = 0xFEA1, - ShieldCheckmark28 = 0xFEA2, - ShieldCheckmark48 = 0xFEA3, - TopSpeed20 = 0xFEA4, - CheckmarkCircle12 = 0xFEA5, - AddSquareMultiple16 = 0xFEA6, - AddSquareMultiple20 = 0xFEA7, - ArrowForward48 = 0xFEA8, - ArrowSync16 = 0xFEA9, - BookOpen28 = 0xFEAA, - BookOpen32 = 0xFEAB, - BookOpen48 = 0xFEAC, - BookOpenMicrophone20 = 0xFEAD, - BookOpenMicrophone24 = 0xFEAE, - BookOpenMicrophone28 = 0xFEAF, - BookOpenMicrophone32 = 0xFEB0, - BookOpenMicrophone48 = 0xFEB1, - BriefcaseOff16 = 0xFEB2, - BriefcaseOff20 = 0xFEB3, - BriefcaseOff24 = 0xFEB4, - BriefcaseOff28 = 0xFEB5, - BriefcaseOff32 = 0xFEB6, - BriefcaseOff48 = 0xFEB7, - BuildingBank28 = 0xFEB8, - BuildingBank48 = 0xFEB9, - BuildingBankLink16 = 0xFEBA, - BuildingBankLink20 = 0xFEBB, - BuildingBankLink24 = 0xFEBC, - BuildingBankLink28 = 0xFEBD, - BuildingBankLink48 = 0xFEBE, - CalendarMail16 = 0xFEBF, - CalendarRtl12 = 0xFEC0, - CalendarRtl16 = 0xFEC1, - ChevronDoubleUp16 = 0xFEC2, - ChevronDoubleUp20 = 0xFEC3, - Cloud28 = 0xFEC4, - CloudBackup16 = 0xFEC5, - CloudBackup20 = 0xFEC6, - CloudBackup28 = 0xFEC7, - CloudBackup32 = 0xFEC8, - CloudDownload28 = 0xFEC9, - CloudOff16 = 0xFECA, - CloudOff20 = 0xFECB, - CloudOff28 = 0xFECC, - CloudOff32 = 0xFECD, - CloudSync16 = 0xFECE, - CloudSync24 = 0xFECF, - CloudSync28 = 0xFED0, - CloudSync32 = 0xFED1, - CloudSync48 = 0xFED2, - CloudSyncComplete16 = 0xFED3, - CloudSyncComplete20 = 0xFED4, - CloudSyncComplete28 = 0xFED5, - CloudSyncComplete32 = 0xFED6, - DismissSquare20 = 0xFED7, - DocumentFooter16 = 0xFED8, - DocumentFooterDismiss24 = 0xFED9, - DocumentHeader16 = 0xFEDA, - DocumentHeaderArrowDown16 = 0xFEDB, - DocumentHeaderDismiss24 = 0xFEDC, - DocumentHeaderFooter16 = 0xFEDD, - DocumentRibbon16 = 0xFEDE, - DocumentRibbon20 = 0xFEDF, - DocumentRibbon24 = 0xFEE0, - DocumentRibbon28 = 0xFEE1, - DocumentRibbon32 = 0xFEE2, - DocumentRibbon48 = 0xFEE3, - DoorArrowLeft16 = 0xFEE4, - DriveTrain24 = 0xFEE5, - Engine24 = 0xFEE6, - FolderMail16 = 0xFEE7, - FolderSync16 = 0xFEE8, - Gas24 = 0xFEE9, - GasPump24 = 0xFEEA, - MailAll16 = 0xFEEB, - MailDismiss16 = 0xFEEC, - MailProhibited16 = 0xFEED, - MicSparkle16 = 0xFEEE, - MicSparkle20 = 0xFEEF, - MicSparkle24 = 0xFEF0, - NotepadPerson20 = 0xFEF1, - NotepadPerson24 = 0xFEF2, - PinOff16 = 0xFEF3, - PinOff48 = 0xFEF4, - SkipForwardTab24 = 0xFEF5, - SquareArrowForward16 = 0xFEF6, - SquareArrowForward20 = 0xFEF7, - SquareArrowForward24 = 0xFEF8, - SquareArrowForward28 = 0xFEF9, - SquareArrowForward32 = 0xFEFA, - SquareArrowForward48 = 0xFEFB, - SubtractSquareMultiple20 = 0xFEFC, - Transmission24 = 0xFEFD, - WifiOff20 = 0xFEFE, - WifiOff24 = 0xFEFF, - Steps20 = 0xFF00, - Steps24 = 0xFF01, - TabDesktopBottom24 = 0xFF02, - TabDesktopMultipleBottom24 = 0xFF03, - TaskListSquareAdd20 = 0xFF04, - TaskListSquareAdd24 = 0xFF05, - TaskListSquareLtr20 = 0xFF06, - TaskListSquareLtr24 = 0xFF07, - TaskListSquareRtl20 = 0xFF08, - TaskListSquareRtl24 = 0xFF09, - TextAlignDistributedEvenly24 = 0xFF0A, - TextAlignDistributedVertical24 = 0xFF0B, - TextAlignJustifyLow24 = 0xFF0C, - TextBulletList20 = 0xFF0D, - TextBulletList24 = 0xFF0E, - TextClearFormattingGa24 = 0xFF0F, - TextColorGa24 = 0xFF10, - TextDirectionLtrAc20 = 0xFF11, - TextDirectionLtrAc24 = 0xFF12, - TextDirectionRotate90Ac24 = 0xFF13, - TextDirectionVerticalAc24 = 0xFF14, - TextEditStyleGa24 = 0xFF15, - TextEffectsGa24 = 0xFF16, - TextFootnoteGaNa24 = 0xFF17, - TextNumberFormatGaNaDa24 = 0xFF18, - TextProofingToolsGaNaDa24 = 0xFF19, - TextProofingToolsZi24 = 0xFF1A, - TextboxMore24 = 0xFF1B, - Video32 = 0xFF1C, - Video48 = 0xFF1D, - VideoClip16 = 0xFF1E, - WindowAdPerson20 = 0xFF1F, - WindowDevEdit16 = 0xFF20, - ArrowAutofitHeightDotted24 = 0xFF21, - ArrowAutofitWidthDotted24 = 0xFF22, - MultiselectRtl16 = 0xFF23, - TextDirectionHorizontalRtl20 = 0xFF24, - TextDirectionHorizontalRtl24 = 0xFF25, - TextDirectionRotate90Rtl20 = 0xFF26, - TextDirectionRotate90Rtl24 = 0xFF27, - AnimalDog16 = 0xFF28, - ArchiveSettings20 = 0xFF29, - ArrowClockwise16 = 0xFF2A, - ArrowClockwiseDashes20 = 0xFF2B, - ArrowClockwiseDashes24 = 0xFF2C, - ArrowCounterclockwiseDashes20 = 0xFF2D, - ArrowCounterclockwiseDashes24 = 0xFF2E, - ArrowExportLtr16 = 0xFF2F, - ArrowExportUp20 = 0xFF30, - ArrowExportUp24 = 0xFF31, - ArrowRouting20 = 0xFF32, - ArrowRouting24 = 0xFF33, - ArrowRoutingRectangleMultiple20 = 0xFF34, - ArrowRoutingRectangleMultiple24 = 0xFF35, - BinFull20 = 0xFF36, - BinFull24 = 0xFF37, - BookToolbox24 = 0xFF38, - Box16 = 0xFF39, - BracesVariable20 = 0xFF3A, - BracesVariable24 = 0xFF3B, - Briefcase16 = 0xFF3C, - BriefcaseMedical16 = 0xFF3D, - BuildingRetail20 = 0xFF3E, - BuildingRetailMoney20 = 0xFF3F, - BuildingRetailMoney24 = 0xFF40, - BuildingRetailShield20 = 0xFF41, - BuildingRetailShield24 = 0xFF42, - BuildingRetailToolbox20 = 0xFF43, - BuildingRetailToolbox24 = 0xFF44, - CalculatorMultiple20 = 0xFF45, - CalculatorMultiple24 = 0xFF46, - Calendar3Day16 = 0xFF47, - CalendarArrowRight16 = 0xFF48, - CalendarDay16 = 0xFF49, - CalendarInfo20 = 0xFF4A, - CalendarSettings16 = 0xFF4B, - CallCheckmark24 = 0xFF4C, - CallEnd16 = 0xFF4D, - CameraDome16 = 0xFF4E, - CameraDome20 = 0xFF4F, - CameraDome24 = 0xFF50, - CameraDome28 = 0xFF51, - CameraDome48 = 0xFF52, - Chat12 = 0xFF53, - ChevronDoubleDown20 = 0xFF54, - ChevronDoubleLeft20 = 0xFF55, - ChevronDoubleRight20 = 0xFF56, - ClipboardBulletListLtr20 = 0xFF57, - ClipboardBulletListRtl20 = 0xFF58, - ClipboardCheckmark20 = 0xFF59, - ClipboardCheckmark24 = 0xFF5A, - ClipboardError20 = 0xFF5B, - ClipboardError24 = 0xFF5C, - ClipboardHeart24 = 0xFF5D, - ClipboardTask20 = 0xFF5E, - ClipboardTask24 = 0xFF5F, - ClipboardTaskAdd20 = 0xFF60, - ClipboardTaskAdd24 = 0xFF61, - ClipboardTaskListLtr20 = 0xFF62, - ClipboardTaskListLtr24 = 0xFF63, - ClockAlarm16 = 0xFF64, - CloudAdd20 = 0xFF65, - CloudEdit20 = 0xFF66, - CloudLink20 = 0xFF67, - Color16 = 0xFF68, - ColumnTriple20 = 0xFF69, - ColumnTripleEdit20 = 0xFF6A, - ColumnTripleEdit24 = 0xFF6B, - CommentError20 = 0xFF6C, - CommunicationPerson20 = 0xFF6D, - CommunicationPerson24 = 0xFF6E, - ContactCardLink20 = 0xFF6F, - DataTrending16 = 0xFF70, - DataTrending20 = 0xFF71, - DataTrending24 = 0xFF72, - DataUsageEdit24 = 0xFF73, - Database20 = 0xFF74, - Database24 = 0xFF75, - DatabaseSearch20 = 0xFF76, - DatabaseSearch24 = 0xFF77, - DeleteArrowBack16 = 0xFF78, - DesktopEdit16 = 0xFF79, - DismissCircle12 = 0xFF7A, - DividerTall16 = 0xFF7B, - DockPanelBottom20 = 0xFF7C, - DocumentArrowDown20 = 0xFF7D, - DocumentHeart20 = 0xFF7E, - DocumentHeart24 = 0xFF7F, - DocumentHeartPulse20 = 0xFF80, - DocumentHeartPulse24 = 0xFF81, - DocumentMultiple20 = 0xFF82, - DocumentMultipleProhibited20 = 0xFF83, - DocumentMultipleProhibited24 = 0xFF84, - DocumentSearch16 = 0xFF85, - Door20 = 0xFF86, - EmojiLaugh16 = 0xFF87, - EqualOff24 = 0xFF88, - ErrorCircleSettings20 = 0xFF89, - EyeOff16 = 0xFF8A, - Fax20 = 0xFF8B, - FilterDismiss16 = 0xFF8C, - FilterDismiss20 = 0xFF8D, - Flashlight16 = 0xFF8E, - Flashlight20 = 0xFF8F, - Flow20 = 0xFF90, - Fluid16 = 0xFF91, - FolderAdd16 = 0xFF92, - FolderGlobe20 = 0xFF93, - FolderMail20 = 0xFF94, - FolderPerson20 = 0xFF95, - FolderSync20 = 0xFF96, - Food16 = 0xFF97, - FoodCake16 = 0xFF98, - FullScreenMaximize16 = 0xFF99, - FullScreenMaximize20 = 0xFF9A, - Gif16 = 0xFF9B, - Gift16 = 0xFF9C, - GlobeStar20 = 0xFF9D, - GlobeSurface20 = 0xFF9E, - GlobeSurface24 = 0xFF9F, - HeartBroken20 = 0xFFA0, - History16 = 0xFFA1, - ImageProhibited20 = 0xFFA2, - ImageProhibited24 = 0xFFA3, - Info12 = 0xFFA4, - Iot20 = 0xFFA5, - Iot24 = 0xFFA6, - MailOpenPerson16 = 0xFFA7, - MailTemplate16 = 0xFFA8, - Navigation16 = 0xFFA9, - News16 = 0xFFAA, - NoteEdit20 = 0xFFAB, - NoteEdit24 = 0xFFAC, - NotepadEdit20 = 0xFFAD, - OfficeApps20 = 0xFFAE, - PeopleList20 = 0xFFAF, - PeopleSettings24 = 0xFFB0, - PeopleTeamToolbox20 = 0xFFB1, - PeopleTeamToolbox24 = 0xFFB2, - PersonFeedback16 = 0xFFB3, - PersonMoney20 = 0xFFB4, - PersonMoney24 = 0xFFB5, - PhoneEraser16 = 0xFFB6, - PortHdmi24 = 0xFFB7, - PortMicroUsb24 = 0xFFB8, - PortUsbA24 = 0xFFB9, - PortUsbC24 = 0xFFBA, - Prohibited12 = 0xFFBB, - ReceiptPlay20 = 0xFFBC, - ReceiptPlay24 = 0xFFBD, - SaveSearch20 = 0xFFBE, - SearchSettings20 = 0xFFBF, - ShieldLock20 = 0xFFC0, - SquareAdd20 = 0xFFC1, - StarLineHorizontal316 = 0xFFC2, - Stream20 = 0xFFC3, - Stream24 = 0xFFC4, - Syringe20 = 0xFFC5, - Syringe24 = 0xFFC6, - TagDismiss20 = 0xFFC7, - TagDismiss24 = 0xFFC8, - TargetArrow24 = 0xFFC9, - Temperature16 = 0xFFCA, - ThumbDislike16 = 0xFFCB, - TooltipQuote24 = 0xFFCC, - Umbrella20 = 0xFFCD, - Umbrella24 = 0xFFCE, - VehicleTruckProfile20 = 0xFFCF, - VideoAdd20 = 0xFFD0, - VideoAdd24 = 0xFFD1, - Warning12 = 0xFFD2, - WindowDevEdit20 = 0xFFD3, - Xray20 = 0xFFD4, - Xray24 = 0xFFD5, - ArrowAutofitDown24 = 0xFFD6, - ArrowAutofitUp24 = 0xFFD7, - ClipboardTaskListRtl20 = 0xFFD8, - ClipboardTaskListRtl24 = 0xFFD9, - Comma24 = 0xFFDA, - TextAlignCenterRotate27024 = 0xFFDB, - TextAlignJustifyLowRotate9024 = 0xFFDC, - TextAlignJustifyRotate9024 = 0xFFDD, - TextAlignLeftRotate27024 = 0xFFDE, - TextAlignRightRotate27024 = 0xFFDF, - TextDirectionRtlAc20 = 0xFFE0, - TextDirectionRtlAc24 = 0xFFE1, - TextStrikethrough16 = 0xFFE2, - TextStrikethrough20 = 0xFFE3, - TextStrikethrough24 = 0xFFE4, - TextboxAlignBottomRotate9024 = 0xFFE5, - TextboxAlignMiddleRotate9024 = 0xFFE6, - TextboxAlignTopRotate9024 = 0xFFE7, - TextDirectionRotate90Ltr20 = 0xFFE8, - TextDirectionRotate90Ltr24 = 0xFFE9, - ArrowClockwise12 = 0xFFEA, - ArrowClockwise28 = 0xFFEB, - ArrowClockwise32 = 0xFFEC, - ArrowClockwise48 = 0xFFED, - ArrowCounterclockwise12 = 0xFFEE, - ArrowCounterclockwise16 = 0xFFEF, - ArrowCounterclockwise32 = 0xFFF0, - ArrowCounterclockwise48 = 0xFFF1, - ArrowRotateClockwise16 = 0xFFF2, - ArrowSortDownLine20 = 0xFFF3, - ArrowSplit20 = 0xFFF4, - BatteryCheckmark24 = 0xFFF5, - BookOpen16 = 0xFFF6, - BroadActivityFeed16 = 0xFFF7, - BroadActivityFeed20 = 0xFFF8, - CalendarPattern20 = 0xFFF9, - CalendarPerson16 = 0xFFFA, - CalendarPhone16 = 0xFFFB, - CalendarPhone20 = 0xFFFC, - CalendarSearch20 = 0xFFFD, - CalendarStar16 = 0xFFFE, - ChatArrowBack16 = 0xFFFF } -#pragma warning restore CS1591 \ No newline at end of file + +#pragma warning restore CS1591 diff --git a/RevitLookup.UI/Common/SymbolRegular.cs b/RevitLookup.UI/Common/SymbolRegular.cs index cd5175860..72d8bf8a3 100644 --- a/RevitLookup.UI/Common/SymbolRegular.cs +++ b/RevitLookup.UI/Common/SymbolRegular.cs @@ -6,1975 +6,3909 @@ namespace RevitLookup.UI.Common; /// -/// Represents a list of Fluent System Icons v.1.1.163. -/// May be converted to using GetGlyph() or to using GetString() +/// Represents a list of regular Fluent System Icons v.1.1.178. +/// May be converted to using GetGlyph() or to using GetString() /// #pragma warning disable CS1591 public enum SymbolRegular { /// - /// Actually, this icon is not empty, but makes it easier to navigate. + /// Actually, this icon is not empty, but makes it easier to navigate. /// Empty = 0x0, // Automatically generated, may contain bugs. - /// - /// Blank icon - /// - [Obsolete] CheckboxCheckedSync20 = 0x0, - - /// - /// Blank icon - /// - [Obsolete] ChevronUpDown16 = 0x1, - - /// - /// Blank icon - /// - [Obsolete] CircleSubtractArrowBack20 = 0x2, - - /// - /// Blank icon - /// - [Obsolete] CircleSubtractArrowForward20 = 0x3, - - /// - /// Blank icon - /// - [Obsolete] CursorClick20 = 0x4, - - /// - /// Blank icon - /// - [Obsolete] CursorClick24 = 0x5, - - /// - /// Blank icon - /// - [Obsolete] Directions16 = 0x6, - - /// - /// Blank icon - /// - [Obsolete] DividerTall20 = 0x7, - - /// - /// Blank icon - /// - [Obsolete] DocumentArrowUp20 = 0x8, - - /// - /// Blank icon - /// - [Obsolete] DocumentDismiss16 = 0x9, - - /// - /// Blank icon - /// - [Obsolete] DocumentLink16 = 0xA, - - /// - /// Blank icon - /// - [Obsolete] DocumentPerson20 = 0xB, - - /// - /// Blank icon - /// - [Obsolete] EditArrowBack20 = 0xC, - - /// - /// Blank icon - /// - [Obsolete] EmojiSad16 = 0xD, - - /// - /// Blank icon - /// - [Obsolete] Extension16 = 0xE, - - /// - /// Blank icon - /// - [Obsolete] GlobeClock16 = 0xF, - - /// - /// Blank icon - /// - [Obsolete] GlobeClock20 = 0x10, - - /// - /// Blank icon - /// - [Obsolete] ImmersiveReader16 = 0x11, - - /// - /// Blank icon - /// - [Obsolete] IosArrowRight24 = 0x12, - - /// - /// Blank icon - /// - [Obsolete] LinkDismiss16 = 0x13, - - /// - /// Blank icon - /// - [Obsolete] LockOpen16 = 0x14, - - /// - /// Blank icon - /// - [Obsolete] Luggage16 = 0x15, - - /// - /// Blank icon - /// - [Obsolete] Luggage20 = 0x16, - - /// - /// Blank icon - /// - [Obsolete] MailArrowDoubleBack20 = 0x17, - - /// - /// Blank icon - /// - [Obsolete] MailArrowDown20 = 0x18, - - /// - /// Blank icon - /// - [Obsolete] MailArrowForward20 = 0x19, - - /// - /// Blank icon - /// - [Obsolete] MailAttach20 = 0x1A, - - /// - /// Blank icon - /// - [Obsolete] MailCheckmark20 = 0x1B, - - /// - /// Blank icon - /// - [Obsolete] MailError16 = 0x1C, - - /// - /// Blank icon - /// - [Obsolete] MailInboxArrowDown20 = 0x1D, - - /// - /// Blank icon - /// - [Obsolete] MailPause20 = 0x1E, - - /// - /// Blank icon - /// - [Obsolete] MailSettings20 = 0x1F, - - MailShield20 = 0x20, - MultiselectRlt20 = 0x21, - NotePin20 = 0x22, - PauseCircle24 = 0x23, - PeopleCheckmark16 = 0x24, - PeopleSync20 = 0x25, - PeopleToolbox20 = 0x26, - PersonSettings20 = 0x27, - PhoneCheckmark20 = 0x28, - Play16 = 0x29, - Play28 = 0x2A, - Play32 = 0x2B, - ReceiptMoney24 = 0x2C, - Save16 = 0x2D, - ShieldError16 = 0x2E, - SportSoccer16 = 0x2F, - Square20 = 0x30, - TagMultiple20 = 0x31, - TextBox16 = 0x32, - TextDirectionRotate270Ltr20 = 0x33, - TextDirectionRotate270Ltr24 = 0x34, - TextQuote16 = 0x35, - VehicleCarProfileLtr20 = 0x36, - VehicleCarProfileRtl20 = 0x37, - WeatherPartlyCloudyDay16 = 0x38, - WeatherSunny16 = 0x39, - TextDirectionHorizontalLeft20 = 0x3A, - TextDirectionHorizontalLeft24 = 0x3B, - TextDirectionHorizontalRight20 = 0x3C, - TextDirectionHorizontalRight24 = 0x3D, - TextDirectionRotate270Right20 = 0x3E, - TextDirectionRotate270Right24 = 0x3F, - TextDirectionRotate90Left20 = 0x40, - TextDirectionRotate90Left24 = 0x41, - TextDirectionRotate90Right20 = 0x42, - TextDirectionRotate90Right24 = 0x43, - ArrowAutofitContent24 = 0x44, - ArrowTrendingLines20 = 0x45, - ArrowTrendingLines24 = 0x46, - CalendarError24 = 0x47, - CellularWarning24 = 0x48, - CloudArrowDown16 = 0x49, - CloudArrowDown20 = 0x4A, - CloudArrowDown24 = 0x4B, - CloudArrowDown28 = 0x4C, - CloudArrowDown32 = 0x4D, - CloudArrowDown48 = 0x4E, - CloudArrowUp16 = 0x4F, - CloudArrowUp20 = 0x50, - CloudArrowUp24 = 0x51, - CloudArrowUp28 = 0x52, - CloudArrowUp32 = 0x53, - CloudArrowUp48 = 0x54, - CloudCheckmark16 = 0x55, - CloudCheckmark20 = 0x56, - CloudCheckmark24 = 0x57, - CloudCheckmark28 = 0x58, - CloudCheckmark32 = 0x59, - CloudCheckmark48 = 0x5A, - CloudDismiss16 = 0x5B, - CloudDismiss20 = 0x5C, - CloudDismiss24 = 0x5D, - CloudDismiss28 = 0x5E, - CloudDismiss32 = 0x5F, - CloudDismiss48 = 0x60, - GridDots20 = 0x61, - GridDots24 = 0x62, - GridDots28 = 0x63, - IosArrowLtr24 = 0x64, - IosArrowRtl24 = 0x65, - MailMultiple16 = 0x66, - MailMultiple20 = 0x67, - MailMultiple24 = 0x68, - PanelBottom20 = 0x69, - PanelLeft16 = 0x6A, - PanelLeft20 = 0x6B, - PanelLeft24 = 0x6C, - PanelLeft28 = 0x6D, - PanelLeft48 = 0x6E, - PanelRight16 = 0x6F, - PanelRight20 = 0x70, - PanelRight24 = 0x71, - PanelRight28 = 0x72, - PanelRight48 = 0x73, - PanelRightContract16 = 0x74, - PanelRightContract20 = 0x75, - PanelRightContract24 = 0x76, - PanelRightExpand16 = 0x77, - PanelRightExpand20 = 0x78, - PanelRightExpand24 = 0x79, - PuzzlePiece16 = 0x7A, - PuzzlePiece20 = 0x7B, - PuzzlePiece24 = 0x7C, - ScanTable24 = 0x7D, - ScanText24 = 0x7E, - ScanType20 = 0x7F, - ScanType24 = 0x80, - ScanTypeOff20 = 0x81, - ShieldTask16 = 0x82, - ShieldTask20 = 0x83, - ShieldTask24 = 0x84, - ShieldTask28 = 0x85, - ShieldTask48 = 0x86, - SquareMultiple16 = 0x87, - StackStar16 = 0x88, - StackStar20 = 0x89, - StackStar24 = 0x8A, - SubtractCircleArrowBack16 = 0x8B, - SubtractCircleArrowBack20 = 0x8C, - SubtractCircleArrowForward16 = 0x8D, - SubtractCircleArrowForward20 = 0x8E, - TextAddT24 = 0x8F, - TextMore24 = 0x90, - TextT20 = 0x91, - TextT24 = 0x92, - UsbPlug20 = 0x93, - UsbPlug24 = 0x94, - WifiLock24 = 0x95, - ArrowBidirectionalUpDown12 = 0x96, - ArrowBidirectionalUpDown16 = 0x97, - ArrowBidirectionalUpDown20 = 0x98, - ArrowBidirectionalUpDown24 = 0x99, - ArrowCircleDownUp20 = 0x9A, - ArrowCircleLeft12 = 0x9B, - ArrowCircleLeft16 = 0x9C, - ArrowCircleRight12 = 0x9D, - ArrowCircleRight16 = 0x9E, - ArrowEject20 = 0x9F, - ArrowExportRtl16 = 0xA0, - ArrowLeft12 = 0xA1, - ArrowMoveInward20 = 0xA2, - ArrowRedo16 = 0xA3, - ArrowRight12 = 0xA4, - ArrowStepIn12 = 0xA5, - ArrowStepInLeft12 = 0xA6, - ArrowStepInLeft16 = 0xA7, - ArrowStepInRight12 = 0xA8, - ArrowStepInRight16 = 0xA9, - ArrowStepOut12 = 0xAA, - ArrowSyncOff16 = 0xAB, - ArrowSyncOff20 = 0xAC, - ArrowUp12 = 0xAD, - BezierCurveSquare12 = 0xAE, - BorderAll16 = 0xAF, - BorderAll20 = 0xB0, - Braces20 = 0xB1, - BuildingLighthouse20 = 0xB2, - CalendarAssistant16 = 0xB3, - CenterVertical20 = 0xB4, - ChatDismiss16 = 0xB5, - ChatWarning16 = 0xB6, - CheckboxIndeterminate16 = 0xB7, - CheckboxIndeterminate20 = 0xB8, - CheckboxIndeterminate24 = 0xB9, - ChevronCircleRight12 = 0xBA, - CircleOff16 = 0xBB, - ClipboardPulse24 = 0xBC, - ClockArrowDownload24 = 0xBD, - CloudFlow24 = 0xBE, - CloudSwap20 = 0xBF, - CloudSwap24 = 0xC0, - CodeCircle20 = 0xC1, - CommentMultiple28 = 0xC2, - CommentMultipleCheckmark16 = 0xC3, - CommentMultipleCheckmark20 = 0xC4, - CommentMultipleCheckmark24 = 0xC5, - CommentMultipleCheckmark28 = 0xC6, - Cube12 = 0xC7, - DeveloperBoardSearch20 = 0xC8, - DocumentArrowRight20 = 0xC9, - DocumentChevronDouble24 = 0xCA, - DocumentCss24 = 0xCB, - DocumentJavascript24 = 0xCC, - DocumentMultiplePercent20 = 0xCD, - DocumentPercent20 = 0xCE, - DocumentPercent24 = 0xCF, - DocumentSettings20 = 0xD0, - DocumentSplitHint16 = 0xD1, - DocumentSplitHint20 = 0xD2, - DocumentSync16 = 0xD3, - DocumentSync20 = 0xD4, - DoorArrowRight16 = 0xD5, - DoorArrowRight20 = 0xD6, - DualScreen20 = 0xD7, - Glance20 = 0xD8, - GlanceHorizontal20 = 0xD9, - HighlightLink20 = 0xDA, - Keyboard12324 = 0xDB, - LaptopDismiss20 = 0xDC, - LinkDismiss24 = 0xDD, - PanelBottomContract20 = 0xDE, - PanelBottomExpand20 = 0xDF, - PanelLeftExpand20 = 0xE0, - PanelSeparateWindow20 = 0xE1, - PanelTopContract20 = 0xE2, - PanelTopExpand20 = 0xE3, - PauseOff16 = 0xE4, - PersonCircle12 = 0xE5, - PersonInfo20 = 0xE6, - Phone12 = 0xE7, - Replay20 = 0xE8, - Square12 = 0xE9, - SquareDismiss16 = 0xEA, - SquareDismiss20 = 0xEB, - SubtractCircle12 = 0xEC, - TagCircle20 = 0xED, - TextBulletListLtr16 = 0xEE, - TextBulletListRtl16 = 0xEF, - TextHeader124 = 0xF0, - TextHeader224 = 0xF1, - TextHeader324 = 0xF2, - TextPeriodAsterisk20 = 0xF3, - Timeline20 = 0xF4, - Triangle12 = 0xF5, - WifiSettings20 = 0xF6, - Window16 = 0xF7, - Window24 = 0xF8, - WindowAdOff20 = 0xF9, - WindowArrowUp16 = 0xFA, - WindowArrowUp20 = 0xFB, - WindowConsole20 = 0xFC, - WindowHeaderHorizontalOff20 = 0xFD, - WindowMultiple16 = 0xFE, - ZoomIn16 = 0xFF, - ZoomOut16 = 0x100, - AlignEndHorizontal20 = 0x101, - AlignEndVertical20 = 0x102, - AlignSpaceAroundHorizontal20 = 0x103, - AlignSpaceAroundVertical20 = 0x104, - AlignSpaceBetweenHorizontal20 = 0x105, - AlignSpaceBetweenVertical20 = 0x106, - AlignSpaceEvenlyHorizontal20 = 0x107, - AlignSpaceEvenlyVertical20 = 0x108, - AlignSpaceFitVertical20 = 0x109, - AlignStartHorizontal20 = 0x10A, - AlignStartVertical20 = 0x10B, - AlignStretchHorizontal20 = 0x10C, - AlignStretchVertical20 = 0x10D, - ArrowCollapseAll20 = 0x10E, - ArrowCollapseAll24 = 0x10F, - ArrowWrap20 = 0x110, - ArrowWrapOff20 = 0x111, - CenterHorizontal20 = 0x112, - DocumentMultiple24 = 0x113, - DocumentMultiplePercent24 = 0x114, - DocumentTable16 = 0x115, - DocumentTable20 = 0x116, - DocumentTable24 = 0x117, - GlanceHorizontal12 = 0x118, - PanelLeftExpand16 = 0x119, - SquareShadow12 = 0x11A, - TextBaseline20 = 0x11B, - ArrowCircleDown12 = 0x11C, - ArrowCircleDown16 = 0x11D, - ArrowCircleDown28 = 0x11E, - ArrowCircleDown32 = 0x11F, - ArrowCircleDown48 = 0x120, - ArrowCircleLeft20 = 0x121, - ArrowCircleLeft24 = 0x122, - ArrowCircleLeft28 = 0x123, - ArrowCircleLeft32 = 0x124, - ArrowCircleLeft48 = 0x125, - ArrowCircleRight20 = 0x126, - ArrowCircleRight28 = 0x127, - ArrowCircleRight32 = 0x128, - ArrowCircleRight48 = 0x129, - ArrowCircleUp12 = 0x12A, - ArrowCircleUp28 = 0x12B, - ArrowCircleUp32 = 0x12C, - ArrowCircleUp48 = 0x12D, - ArrowTrendingCheckmark20 = 0x12E, - ArrowTrendingCheckmark24 = 0x12F, - ArrowTrendingSettings20 = 0x130, - ArrowTrendingSettings24 = 0x131, - Balloon12 = 0x132, - CalendarWorkWeek28 = 0x133, - ChannelSubtract16 = 0x134, - ChannelSubtract20 = 0x135, - ChannelSubtract24 = 0x136, - ChannelSubtract28 = 0x137, - ChannelSubtract48 = 0x138, - ClipboardSettings24 = 0x139, - CloudArchive16 = 0x13A, - CloudArchive20 = 0x13B, - CloudWords16 = 0x13C, - CloudWords20 = 0x13D, - CloudWords24 = 0x13E, - CloudWords28 = 0x13F, - CloudWords32 = 0x140, - CloudWords48 = 0x141, - ColumnArrowRight20 = 0x142, - ControlButton20 = 0x143, - ControlButton24 = 0x144, - CreditCardPerson20 = 0x145, - CreditCardPerson24 = 0x146, - CreditCardToolbox24 = 0x147, - CubeLink20 = 0x148, - DeleteLines20 = 0x149, - Dialpad28 = 0x14A, - Dialpad32 = 0x14B, - Dialpad48 = 0x14C, - Diversity20 = 0x14D, - Diversity24 = 0x14E, - Diversity28 = 0x14F, - Diversity48 = 0x150, - FoodCake12 = 0x151, - GlobeProhibited20 = 0x152, - GlobeSearch20 = 0x153, - GlobeVideo28 = 0x154, - GlobeVideo32 = 0x155, - GlobeVideo48 = 0x156, - Guardian20 = 0x157, - Guardian24 = 0x158, - Guardian28 = 0x159, - Guardian48 = 0x15A, - HatGraduation12 = 0x15B, - LockClosed32 = 0x15C, - MoneyCalculator20 = 0x15D, - MoneyCalculator24 = 0x15E, - MoneySettings20 = 0x15F, - Options48 = 0x160, - PauseSettings20 = 0x161, - PersonLock24 = 0x162, - PersonNote20 = 0x163, - RoadCone16 = 0x164, - RoadCone20 = 0x165, - RoadCone24 = 0x166, - RoadCone28 = 0x167, - RoadCone32 = 0x168, - RoadCone48 = 0x169, - ScanThumbUp16 = 0x16A, - ScanThumbUp20 = 0x16B, - ScanThumbUp24 = 0x16C, - ScanThumbUp28 = 0x16D, - ScanThumbUp48 = 0x16E, - ScreenShareStart48 = 0x16F, - Share48 = 0x170, - ShieldVideo24 = 0x171, - ShieldVideo28 = 0x172, - ShieldVideo48 = 0x173, - Speaker032 = 0x174, - Speaker132 = 0x175, - Speaker232 = 0x176, - Sticker12 = 0x177, - Toolbox12 = 0x178, - VehicleCarCollision16 = 0x179, - VehicleCarCollision20 = 0x17A, - VehicleCarCollision24 = 0x17B, - VehicleCarCollision48 = 0x17C, - Wallet20 = 0x17D, - Wallet24 = 0x17E, - Whiteboard48 = 0x17F, - Call48 = 0x180, - ClosedCaption32 = 0x181, - DesktopKeyboard16 = 0x182, - DesktopKeyboard20 = 0x183, - DesktopKeyboard24 = 0x184, - DesktopKeyboard28 = 0x185, - Heart12 = 0x186, - ImageAltText16 = 0x187, - Mail12 = 0x188, - MoreCircle32 = 0x189, - NumberSymbol32 = 0x18A, - Poll16 = 0x18B, - RectangleLandscape12 = 0x18C, - RectangleLandscape16 = 0x18D, - RectangleLandscape24 = 0x18E, - RectangleLandscape28 = 0x18F, - RectangleLandscape32 = 0x190, - RectangleLandscape48 = 0x191, - ScanThumbUpOff16 = 0x192, - ScanThumbUpOff20 = 0x193, - ScanThumbUpOff24 = 0x194, - ScanThumbUpOff28 = 0x195, - ScanThumbUpOff48 = 0x196, - SendClock24 = 0x197, - ShareScreenPerson16 = 0x198, - ShareScreenPerson20 = 0x199, - ShareScreenPerson24 = 0x19A, - ShareScreenPerson28 = 0x19B, - ShareScreenPersonOverlay16 = 0x19C, - ShareScreenPersonOverlay20 = 0x19D, - ShareScreenPersonOverlay24 = 0x19E, - ShareScreenPersonOverlay28 = 0x19F, - ShareScreenPersonOverlayInside16 = 0x1A0, - ShareScreenPersonOverlayInside20 = 0x1A1, - ShareScreenPersonOverlayInside24 = 0x1A2, - ShareScreenPersonOverlayInside28 = 0x1A3, - SlideMicrophone32 = 0x1A4, - Snooze20 = 0x1A5, - Tag32 = 0x1A6, - TagDismiss16 = 0x1A7, - TagLock16 = 0x1A8, - TagLock20 = 0x1A9, - TagLock24 = 0x1AA, - TagLock32 = 0x1AB, - TextAlignCenter16 = 0x1AC, - TextAlignLeft16 = 0x1AD, - TextAlignRight16 = 0x1AE, - TextChangeCase16 = 0x1AF, - TextClearFormatting16 = 0x1B0, - TextFontSize16 = 0x1B1, - TextIndentDecrease16 = 0x1B2, - TextIndentDecreaseLtr16 = 0x1B3, - TextIndentDecreaseLtr20 = 0x1B4, - TextIndentDecreaseLtr24 = 0x1B5, - TextIndentDecreaseRtl16 = 0x1B6, - TextIndentDecreaseRtl20 = 0x1B7, - TextIndentDecreaseRtl24 = 0x1B8, - TextIndentIncrease16 = 0x1B9, - TextIndentIncreaseLtr16 = 0x1BA, - TextIndentIncreaseLtr20 = 0x1BB, - TextIndentIncreaseLtr24 = 0x1BC, - TextIndentIncreaseRtl16 = 0x1BD, - TextIndentIncreaseRtl20 = 0x1BE, - TextIndentIncreaseRtl24 = 0x1BF, - TextNumberListLtr16 = 0x1C0, - TextNumberListRtl16 = 0x1C1, - TextParagraphDirectionLeft16 = 0x1C2, - TextParagraphDirectionLeft20 = 0x1C3, - TextParagraphDirectionRight16 = 0x1C4, - TextParagraphDirectionRight20 = 0x1C5, - TextSubscript16 = 0x1C6, - TextSuperscript16 = 0x1C7, - AppsListDetail20 = 0x1C8, - AppsListDetail24 = 0x1C9, - ArrowMaximize32 = 0x1CA, - ArrowOutlineUpRight32 = 0x1CB, - ArrowUpRight32 = 0x1CC, - BoxEdit20 = 0x1CD, - BoxEdit24 = 0x1CE, - BoxToolbox20 = 0x1CF, - BoxToolbox24 = 0x1D0, - ChatVideo20 = 0x1D1, - ChatVideo24 = 0x1D2, - Circle32 = 0x1D3, - DatabaseLink20 = 0x1D4, - DatabaseLink24 = 0x1D5, - Diamond32 = 0x1D6, - DocumentText20 = 0x1D7, - DocumentText24 = 0x1D8, - DocumentTextLink20 = 0x1D9, - DocumentTextLink24 = 0x1DA, - GlobeShield20 = 0x1DB, - GlobeShield24 = 0x1DC, - Line32 = 0x1DD, - LineDashes32 = 0x1DE, - NumberSymbol28 = 0x1DF, - NumberSymbol48 = 0x1E0, - Oval32 = 0x1E1, - Pentagon32 = 0x1E2, - PlayCircle48 = 0x1E3, - ProjectionScreen16 = 0x1E4, - ProjectionScreen20 = 0x1E5, - ProjectionScreen24 = 0x1E6, - ProjectionScreen28 = 0x1E7, - ProjectionScreenDismiss16 = 0x1E8, - ProjectionScreenDismiss20 = 0x1E9, - ProjectionScreenDismiss24 = 0x1EA, - ProjectionScreenDismiss28 = 0x1EB, - Rhombus32 = 0x1EC, - SaveArrowRight20 = 0x1ED, - SaveArrowRight24 = 0x1EE, - Shortpick20 = 0x1EF, - Shortpick24 = 0x1F0, - Sparkle16 = 0x1F1, - Sparkle20 = 0x1F2, - Sparkle24 = 0x1F3, - Sparkle28 = 0x1F4, - Sparkle48 = 0x1F5, - Square32 = 0x1F6, - SubtractSquare24 = 0x1F7, - TextCaseLowercase16 = 0x1F8, - TextCaseLowercase20 = 0x1F9, - TextCaseLowercase24 = 0x1FA, - TextCaseTitle16 = 0x1FB, - TextCaseTitle20 = 0x1FC, - TextCaseTitle24 = 0x1FD, - TextCaseUppercase16 = 0x1FE, - TextCaseUppercase20 = 0x1FF, - TextCaseUppercase24 = 0x200, - Triangle32 = 0x201, - VideoPersonSparkle16 = 0x202, - VideoPersonSparkle20 = 0x203, - VideoPersonSparkle24 = 0x204, - VideoPersonSparkle28 = 0x205, - VideoPersonSparkle48 = 0x206, - Accessibility48 = 0x207, - ArchiveMultiple16 = 0x208, - ArchiveMultiple20 = 0x209, - ArchiveMultiple24 = 0x20A, - ArrowReset32 = 0x20B, - ArrowReset48 = 0x20C, - Box20 = 0x20D, - Box24 = 0x20E, - BoxDismiss20 = 0x20F, - BoxDismiss24 = 0x210, - ClearFormatting16 = 0x211, - ClearFormatting20 = 0x212, - ClipboardClock20 = 0x213, - ClipboardClock24 = 0x214, - CloudArchive24 = 0x215, - CloudArchive28 = 0x216, - CloudArchive32 = 0x217, - CloudArchive48 = 0x218, - DocumentTableArrowRight20 = 0x219, - DocumentTableArrowRight24 = 0x21A, - DocumentTableCheckmark20 = 0x21B, - DocumentTableCheckmark24 = 0x21C, - DocumentTextClock20 = 0x21D, - DocumentTextClock24 = 0x21E, - FlashSettings20 = 0x21F, - FlashSettings24 = 0x220, - Games16 = 0x221, - Games20 = 0x222, - Games28 = 0x223, - Games32 = 0x224, - Games48 = 0x225, - HandDraw28 = 0x226, - Lasso28 = 0x227, - MoneyDismiss20 = 0x228, - MoneyDismiss24 = 0x229, - MoneyOff20 = 0x22A, - MoneyOff24 = 0x22B, - Note28 = 0x22C, - Note48 = 0x22D, - PersonLightbulb20 = 0x22E, - PersonLightbulb24 = 0x22F, - PictureInPictureEnter16 = 0x230, - PictureInPictureEnter20 = 0x231, - PictureInPictureEnter24 = 0x232, - PictureInPictureExit16 = 0x233, - PictureInPictureExit20 = 0x234, - PictureInPictureExit24 = 0x235, - PlugConnected20 = 0x236, - Sanitize20 = 0x237, - Sanitize24 = 0x238, - Settings32 = 0x239, - Settings48 = 0x23A, - Shapes28 = 0x23B, - Shapes48 = 0x23C, - ShoppingBagPercent20 = 0x23D, - ShoppingBagPercent24 = 0x23E, - ShoppingBagTag20 = 0x23F, - ShoppingBagTag24 = 0x240, - StackArrowForward20 = 0x241, - StackArrowForward24 = 0x242, - TableLightning20 = 0x243, - TableLightning24 = 0x244, - TableLink20 = 0x245, - TableLink24 = 0x246, - TextT28 = 0x247, - TextT48 = 0x248, - ThumbLike28 = 0x249, - ThumbLike48 = 0x24A, - VideoOff32 = 0x24B, - VideoOff48 = 0x24C, - BookmarkSearch20 = 0x24D, - BookmarkSearch24 = 0x24E, - BuildingFactory16 = 0x24F, - BuildingFactory20 = 0x250, - BuildingFactory28 = 0x251, - BuildingFactory32 = 0x252, - BuildingFactory48 = 0x253, - CalendarChat20 = 0x254, - CalendarChat24 = 0x255, - CalendarToolbox20 = 0x256, - CalendarToolbox24 = 0x257, - CameraSwitch20 = 0x258, - CommentMultiple32 = 0x259, - CommentMultipleLink16 = 0x25A, - CommentMultipleLink20 = 0x25B, - CommentMultipleLink24 = 0x25C, - CommentMultipleLink28 = 0x25D, - CommentMultipleLink32 = 0x25E, - ContactCardRibbon16 = 0x25F, - ContactCardRibbon20 = 0x260, - ContactCardRibbon24 = 0x261, - ContactCardRibbon28 = 0x262, - ContactCardRibbon32 = 0x263, - ContactCardRibbon48 = 0x264, - DatabasePerson20 = 0x265, - DatabasePerson24 = 0x266, - DocumentFlowchart20 = 0x267, - DocumentFlowchart24 = 0x268, - DocumentTableSearch20 = 0x269, - DocumentTableSearch24 = 0x26A, - DocumentTextExtract20 = 0x26B, - DocumentTextExtract24 = 0x26C, - FastForward16 = 0x26D, - FastForward28 = 0x26E, - Flowchart20 = 0x26F, - Flowchart24 = 0x270, - FlowchartCircle20 = 0x271, - FlowchartCircle24 = 0x272, - FolderSync24 = 0x273, - HeartCircle16 = 0x274, - HeartCircle20 = 0x275, - HeartCircle24 = 0x276, - MegaphoneLoud24 = 0x277, - PeopleLock20 = 0x278, - PeopleLock24 = 0x279, - PersonCircle24 = 0x27A, - PhoneUpdateCheckmark20 = 0x27B, - PhoneUpdateCheckmark24 = 0x27C, - PlugConnected24 = 0x27D, - Rewind16 = 0x27E, - Rewind28 = 0x27F, - SaveMultiple20 = 0x280, - SaveMultiple24 = 0x281, - ScanTypeCheckmark20 = 0x282, - ScanTypeCheckmark24 = 0x283, - SelectObjectSkew20 = 0x284, - SelectObjectSkew24 = 0x285, - SelectObjectSkewDismiss20 = 0x286, - SelectObjectSkewDismiss24 = 0x287, - SelectObjectSkewEdit20 = 0x288, - SelectObjectSkewEdit24 = 0x289, - ShoppingBagDismiss20 = 0x28A, - ShoppingBagDismiss24 = 0x28B, - ShoppingBagPause20 = 0x28C, - ShoppingBagPause24 = 0x28D, - TagError16 = 0x28E, - TagError20 = 0x28F, - TagError24 = 0x290, - TagMultiple24 = 0x291, - TagQuestionMark20 = 0x292, - TagQuestionMark32 = 0x293, - TextColumnOneWideLightning20 = 0x294, - TextColumnOneWideLightning24 = 0x295, - TextFontInfo16 = 0x296, - TextFontInfo20 = 0x297, - TextFontInfo24 = 0x298, - TrayItemAdd20 = 0x299, - TrayItemAdd24 = 0x29A, - TrayItemRemove20 = 0x29B, - TrayItemRemove24 = 0x29C, - VehicleTruckBag20 = 0x29D, - VehicleTruckBag24 = 0x29E, - CheckmarkStarburst20 = 0x29F, - CheckmarkStarburst24 = 0x2A0, - AccessTime20 = 0x2A1, - AccessibilityCheckmark20 = 0x2A2, - AddSquare20 = 0x2A3, - Album20 = 0x2A4, - AlbumAdd20 = 0x2A5, - AlertOn20 = 0x2A6, - AppGeneric20 = 0x2A7, - AppRecent20 = 0x2A8, - AppTitle20 = 0x2A9, - ArrowAutofitDown20 = 0x2AA, - ArrowAutofitHeight20 = 0x2AB, - ArrowAutofitHeightDotted20 = 0x2AC, - ArrowAutofitUp20 = 0x2AD, - ArrowAutofitWidth20 = 0x2AE, - ArrowAutofitWidthDotted20 = 0x2AF, - ArrowBounce20 = 0x2B0, - ArrowCircleDownRight20 = 0x2B1, - ArrowCircleUpLeft20 = 0x2B2, - ArrowExpand20 = 0x2B3, - ArrowFit20 = 0x2B4, - ArrowMinimizeVertical20 = 0x2B5, - ArrowSortDownLines24 = 0x2B6, - ArrowSquareDown20 = 0x2B7, - ArrowStepBack20 = 0x2B8, - ArrowStepInDefault20 = 0x2B9, - ArrowStepInLeft20 = 0x2BA, - ArrowStepInRight20 = 0x2BB, - ArrowStepOut20 = 0x2BC, - ArrowStepOver20 = 0x2BD, - ArrowTurnBidirectionalDownRight20 = 0x2BE, - ArrowTurnRight20 = 0x2BF, - ArrowsBidirectional20 = 0x2C0, - AttachText20 = 0x2C1, - AutoFitHeight20 = 0x2C2, - AutoFitWidth20 = 0x2C3, - Autocorrect20 = 0x2C4, - Badge20 = 0x2C5, - BatteryCheckmark20 = 0x2C6, - BatteryWarning20 = 0x2C7, - BezierCurve20 = 0x2C8, - BluetoothConnected20 = 0x2C9, - BluetoothDisabled20 = 0x2CA, - BluetoothSearching20 = 0x2CB, - BookmarkMultiple16 = 0x2CC, - BookmarkMultiple28 = 0x2CD, - BookmarkMultiple32 = 0x2CE, - BookmarkMultiple48 = 0x2CF, - BranchForkHint20 = 0x2D0, - BranchForkHint24 = 0x2D1, - BranchForkLink20 = 0x2D2, - BranchForkLink24 = 0x2D3, - CalendarLtr48 = 0x2D4, - CalendarRtl48 = 0x2D5, - DataUsageToolbox20 = 0x2D6, - DataUsageToolbox24 = 0x2D7, - DesktopCursor16 = 0x2D8, - DesktopCursor20 = 0x2D9, - DesktopCursor24 = 0x2DA, - DesktopCursor28 = 0x2DB, - DesktopFlow20 = 0x2DC, - DesktopFlow24 = 0x2DD, - DesktopSignal20 = 0x2DE, - DesktopSignal24 = 0x2DF, - EmojiSadSlight20 = 0x2E0, - EmojiSadSlight24 = 0x2E1, - EmojiSmileSlight20 = 0x2E2, - EmojiSmileSlight24 = 0x2E3, - FoodApple20 = 0x2E4, - FoodApple24 = 0x2E5, - MailEdit20 = 0x2E6, - MailEdit24 = 0x2E7, - PersonArrowLeft16 = 0x2E8, - PersonEdit20 = 0x2E9, - PersonEdit24 = 0x2EA, - ScanDash12 = 0x2EB, - ScanDash16 = 0x2EC, - ScanDash20 = 0x2ED, - ScanDash24 = 0x2EE, - ScanDash28 = 0x2EF, - ScanDash32 = 0x2F0, - ScanDash48 = 0x2F1, - SquareHint20 = 0x2F2, - SquareHint24 = 0x2F3, - TagOff20 = 0x2F4, - TagOff24 = 0x2F5, - TextBoxSettings20 = 0x2F6, - TextBoxSettings24 = 0x2F7, - VehicleTruckCube20 = 0x2F8, - VehicleTruckCube24 = 0x2F9, - ArrowForwardDownLightning20 = 0x2FA, - ArrowForwardDownLightning24 = 0x2FB, - ArrowForwardDownPerson20 = 0x2FC, - ArrowForwardDownPerson24 = 0x2FD, - ArrowStepIn28 = 0x2FE, - ArrowStepInDefault24 = 0x2FF, - ArrowStepInLeft24 = 0x300, - ArrowStepInLeft28 = 0x301, - ArrowStepInRight24 = 0x302, - ArrowStepInRight28 = 0x303, - ArrowStepOut24 = 0x304, - ArrowStepOut28 = 0x305, - ArrowTrendingText20 = 0x306, - ArrowTrendingText24 = 0x307, - ArrowTrendingWrench20 = 0x308, - ArrowTrendingWrench24 = 0x309, - Battery1020 = 0x30A, - Battery20 = 0x30B, - Beach32 = 0x30C, - Beach48 = 0x30D, - BookClock20 = 0x30E, - BookCoins20 = 0x30F, - BookCompass20 = 0x310, - BookDatabase20 = 0x311, - BookExclamationMark20 = 0x312, - BookGlobe20 = 0x313, - BookInformation20 = 0x314, - BookLetter20 = 0x315, - BookPulse20 = 0x316, - BookQuestionMark20 = 0x317, - BookQuestionMarkRtl20 = 0x318, - BookSearch20 = 0x319, - BookStar20 = 0x31A, - BookTheta20 = 0x31B, - BookmarkOff20 = 0x31C, - BorderBottom20 = 0x31D, - BorderBottomDouble20 = 0x31E, - BorderBottomThick20 = 0x31F, - BorderLeft20 = 0x320, - BorderNone20 = 0x321, - BorderOutside20 = 0x322, - BorderOutsideThick20 = 0x323, - BorderRight20 = 0x324, - BorderTop20 = 0x325, - BorderTopBottom20 = 0x326, - BorderTopBottomDouble20 = 0x327, - BorderTopBottomThick20 = 0x328, - Branch20 = 0x329, - BrightnessHigh16 = 0x32A, - BrightnessHigh20 = 0x32B, - BrightnessHigh24 = 0x32C, - BrightnessHigh28 = 0x32D, - BrightnessHigh32 = 0x32E, - BrightnessHigh48 = 0x32F, - BrightnessLow16 = 0x330, - BrightnessLow20 = 0x331, - BrightnessLow24 = 0x332, - BrightnessLow28 = 0x333, - BrightnessLow32 = 0x334, - BrightnessLow48 = 0x335, - BuildingGovernment20 = 0x336, - BuildingMultiple20 = 0x337, - ChatDismiss20 = 0x338, - ChatDismiss24 = 0x339, - CubeTree20 = 0x33A, - CubeTree24 = 0x33B, - DrawImage20 = 0x33C, - DrawImage24 = 0x33D, - DrawShape20 = 0x33E, - DrawText20 = 0x33F, - DrawerAdd20 = 0x340, - DrawerAdd24 = 0x341, - DrawerArrowDownload20 = 0x342, - DrawerArrowDownload24 = 0x343, - DrawerDismiss20 = 0x344, - DrawerDismiss24 = 0x345, - DrawerDownload20 = 0x346, - DrawerDownload24 = 0x347, - DrawerPlay20 = 0x348, - DrawerPlay24 = 0x349, - DrawerSubtract20 = 0x34A, - DrawerSubtract24 = 0x34B, - Emoji28 = 0x34C, - Emoji32 = 0x34D, - Emoji48 = 0x34E, - EmojiSparkle16 = 0x34F, - EmojiSparkle20 = 0x350, - EmojiSparkle24 = 0x351, - EmojiSparkle28 = 0x352, - EmojiSparkle32 = 0x353, - EmojiSparkle48 = 0x354, - FlipHorizontal16 = 0x355, - FlipHorizontal20 = 0x356, - FlipHorizontal28 = 0x357, - FlipHorizontal32 = 0x358, - FlipHorizontal48 = 0x359, - FlipVertical16 = 0x35A, - FlipVertical20 = 0x35B, - FlipVertical28 = 0x35C, - FlipVertical32 = 0x35D, - FlipVertical48 = 0x35E, - FoodGrains20 = 0x35F, - FoodGrains24 = 0x360, - GiftCardArrowRight20 = 0x361, - GiftCardArrowRight24 = 0x362, - Heart32 = 0x363, - Heart48 = 0x364, - Link12 = 0x365, - Link32 = 0x366, - Luggage28 = 0x367, - Luggage32 = 0x368, - Luggage48 = 0x369, - MoneyHand20 = 0x36A, - MoneyHand24 = 0x36B, - Next28 = 0x36C, - Next32 = 0x36D, - Next48 = 0x36E, - PeopleList28 = 0x36F, - Previous28 = 0x370, - Previous32 = 0x371, - Previous48 = 0x372, - QuestionCircle32 = 0x373, - TextParagraph16 = 0x374, - VehicleCarCollision28 = 0x375, - VehicleCarCollision32 = 0x376, - VideoClipMultiple16 = 0x377, - VideoClipMultiple20 = 0x378, - VideoClipMultiple24 = 0x379, - Wallet28 = 0x37A, - Wallet32 = 0x37B, - Wallet48 = 0x37C, - WeatherSunny28 = 0x37D, - WrenchScrewdriver20 = 0x37E, - WrenchScrewdriver24 = 0x37F, - ArrowBetweenDown20 = 0x380, - ArrowBetweenDown24 = 0x381, - ArrowRedo28 = 0x382, - ArrowSyncCheckmark20 = 0x383, - ArrowSyncCheckmark24 = 0x384, - ArrowSyncDismiss20 = 0x385, - ArrowSyncDismiss24 = 0x386, - CalculatorArrowClockwise20 = 0x387, - CalculatorArrowClockwise24 = 0x388, - CalendarArrowDown20 = 0x389, - CalendarArrowRight24 = 0x38A, - CalendarError20 = 0x38B, - CalendarMail20 = 0x38C, - CalendarWeekNumbers20 = 0x38D, - CallAdd20 = 0x38E, - CameraOff20 = 0x38F, - CellularOff20 = 0x390, - ChevronCircleDown32 = 0x391, - ChevronCircleUp32 = 0x392, - Circle48 = 0x393, - ClockPause20 = 0x394, - ClockPause24 = 0x395, - Diamond16 = 0x396, - Diamond20 = 0x397, - Diamond24 = 0x398, - Diamond28 = 0x399, - Diamond48 = 0x39A, - Door28 = 0x39B, - DoorArrowRight28 = 0x39C, - ImmersiveReader28 = 0x39D, - KeyReset20 = 0x39E, - KeyReset24 = 0x39F, - LightbulbFilament48 = 0x3A0, - Line20 = 0x3A1, - Line24 = 0x3A2, - Line48 = 0x3A3, - LineDashes20 = 0x3A4, - LineDashes24 = 0x3A5, - LineDashes48 = 0x3A6, - MailArrowUp16 = 0x3A7, - NotepadPerson16 = 0x3A8, - Oval16 = 0x3A9, - Oval20 = 0x3AA, - Oval24 = 0x3AB, - Oval28 = 0x3AC, - Oval48 = 0x3AD, - Pentagon48 = 0x3AE, - PeopleAdd28 = 0x3AF, - PeopleList24 = 0x3B0, - PeopleQueue20 = 0x3B1, - PeopleQueue24 = 0x3B2, - PeopleSettings28 = 0x3B3, - Print28 = 0x3B4, - Rhombus16 = 0x3B5, - Rhombus20 = 0x3B6, - Rhombus24 = 0x3B7, - Rhombus28 = 0x3B8, - Rhombus48 = 0x3B9, - ScreenSearch20 = 0x3BA, - ScreenSearch24 = 0x3BB, - SettingsChat20 = 0x3BC, - SettingsChat24 = 0x3BD, - ShareScreenPersonP16 = 0x3BE, - ShareScreenPersonP20 = 0x3BF, - ShareScreenPersonP24 = 0x3C0, - ShareScreenPersonP28 = 0x3C1, - SlideAdd16 = 0x3C2, - SlideAdd20 = 0x3C3, - SlideAdd28 = 0x3C4, - SlideAdd32 = 0x3C5, - SlideAdd48 = 0x3C6, - SlideArrowRight20 = 0x3C7, - SlideArrowRight24 = 0x3C8, - SoundWaveCircle24 = 0x3C9, - Square48 = 0x3CA, - Star48 = 0x3CB, - StarAdd28 = 0x3CC, - StarDismiss16 = 0x3CD, - StarDismiss20 = 0x3CE, - StarDismiss24 = 0x3CF, - StarDismiss28 = 0x3D0, - StarEdit20 = 0x3D1, - StarSettings20 = 0x3D2, - Triangle48 = 0x3D3, - Trophy28 = 0x3D4, - Trophy32 = 0x3D5, - Trophy48 = 0x3D6, - TrophyOff16 = 0x3D7, - TrophyOff20 = 0x3D8, - TrophyOff24 = 0x3D9, - TrophyOff28 = 0x3DA, - TrophyOff32 = 0x3DB, - TrophyOff48 = 0x3DC, - Window28 = 0x3DD, - Window32 = 0x3DE, - Window48 = 0x3DF, - WindowApps16 = 0x3E0, - WindowApps20 = 0x3E1, - WindowApps24 = 0x3E2, - WindowApps28 = 0x3E3, - WindowApps32 = 0x3E4, - WindowApps48 = 0x3E5, - WindowWrench16 = 0x3E6, - WindowWrench20 = 0x3E7, - WindowWrench24 = 0x3E8, - WindowWrench28 = 0x3E9, - WindowWrench32 = 0x3EA, - WindowWrench48 = 0x3EB, - ArrowDownLeft32 = 0x3EC, - ArrowDownLeft48 = 0x3ED, - ArrowMaximize48 = 0x3EE, - ArrowMaximizeVertical48 = 0x3EF, - ArrowOutlineUpRight48 = 0x3F0, - ArrowUpLeft48 = 0x3F1, - ArrowUpRight48 = 0x3F2, - BookArrowClockwise20 = 0x3F3, - BookArrowClockwise24 = 0x3F4, - BoxArrowLeft20 = 0x3F5, - BoxArrowLeft24 = 0x3F6, - BoxArrowUp20 = 0x3F7, - BoxArrowUp24 = 0x3F8, - BoxCheckmark20 = 0x3F9, - BoxCheckmark24 = 0x3FA, - BoxMultiple20 = 0x3FB, - BoxMultiple24 = 0x3FC, - BoxMultipleArrowLeft20 = 0x3FD, - BoxMultipleArrowLeft24 = 0x3FE, - BoxMultipleArrowRight20 = 0x3FF, - BoxMultipleArrowRight24 = 0x400, - BoxMultipleCheckmark20 = 0x401, - BoxMultipleCheckmark24 = 0x402, - BoxMultipleSearch20 = 0x403, - BoxMultipleSearch24 = 0x404, - BoxSearch20 = 0x405, - BoxSearch24 = 0x406, - CellularWarning20 = 0x407, - ChartMultiple20 = 0x408, - ChartMultiple24 = 0x409, - CheckboxArrowRight20 = 0x40A, - CheckboxWarning20 = 0x40B, - ClockToolbox20 = 0x40C, - ClockToolbox24 = 0x40D, - CubeMultiple20 = 0x40E, - CubeMultiple24 = 0x40F, - DesktopToolbox20 = 0x410, - DesktopToolbox24 = 0x411, - DocumentBulletListMultiple20 = 0x412, - DocumentBulletListMultiple24 = 0x413, - DocumentQueue20 = 0x414, - DocumentQueue24 = 0x415, - DocumentQueueAdd20 = 0x416, - DocumentQueueAdd24 = 0x417, - DocumentQueueMultiple20 = 0x418, - DocumentQueueMultiple24 = 0x419, - DocumentTableCube20 = 0x41A, - DocumentTableCube24 = 0x41B, - DocumentTableTruck20 = 0x41C, - DocumentTableTruck24 = 0x41D, - DocumentTextToolbox20 = 0x41E, - DocumentTextToolbox24 = 0x41F, - EqualCircle20 = 0x420, - EqualCircle24 = 0x421, - GiftCardMoney20 = 0x422, - GiftCardMoney24 = 0x423, - GiftCardMultiple20 = 0x424, - GiftCardMultiple24 = 0x425, - ImageMultiple32 = 0x426, - ImageMultiple48 = 0x427, - MailAlert28 = 0x428, - PuzzlePieceShield20 = 0x429, - Ribbon12 = 0x42A, - RibbonOff12 = 0x42B, - RibbonOff16 = 0x42C, - RibbonOff20 = 0x42D, - RibbonOff24 = 0x42E, - RibbonOff32 = 0x42F, - Share28 = 0x430, - ShoppingBagArrowLeft20 = 0x431, - ShoppingBagArrowLeft24 = 0x432, - ShoppingBagPlay20 = 0x433, - ShoppingBagPlay24 = 0x434, - Square24 = 0x435, - Square28 = 0x436, - SquareHint16 = 0x437, - SquareHint28 = 0x438, - SquareHint32 = 0x439, - SquareHint48 = 0x43A, - SquareHintApps20 = 0x43B, - SquareHintApps24 = 0x43C, - SquareHintSparkles16 = 0x43D, - SquareHintSparkles20 = 0x43E, - SquareHintSparkles24 = 0x43F, - SquareHintSparkles28 = 0x440, - SquareHintSparkles32 = 0x441, - SquareHintSparkles48 = 0x442, - Tablet12 = 0x443, - Tablet16 = 0x444, - Tablet32 = 0x445, - Tablet48 = 0x446, - TagReset20 = 0x447, - TagReset24 = 0x448, - TagSearch20 = 0x449, - TagSearch24 = 0x44A, - TapDouble32 = 0x44B, - TapDouble48 = 0x44C, - TapSingle32 = 0x44D, - TapSingle48 = 0x44E, - Timer12 = 0x44F, - Timer28 = 0x450, - Timer32 = 0x451, - Timer48 = 0x452, - BoardHeart16 = 0x453, - BoardHeart20 = 0x454, - BoardHeart24 = 0x455, - Braces24 = 0x456, - BreakoutRoom24 = 0x457, - BreakoutRoom28 = 0x458, - ChatWarning20 = 0x459, - CheckboxPerson16 = 0x45A, - CheckboxPerson20 = 0x45B, - ChevronCircleDown12 = 0x45C, - ChevronCircleDown16 = 0x45D, - ChevronCircleDown20 = 0x45E, - ChevronCircleDown28 = 0x45F, - ChevronCircleDown48 = 0x460, - ChevronCircleLeft12 = 0x461, - ChevronCircleLeft16 = 0x462, - ChevronCircleLeft20 = 0x463, - ChevronCircleLeft24 = 0x464, - ChevronCircleLeft28 = 0x465, - ChevronCircleLeft32 = 0x466, - ChevronCircleLeft48 = 0x467, - ChevronCircleRight16 = 0x468, - ChevronCircleRight20 = 0x469, - ChevronCircleRight28 = 0x46A, - ChevronCircleRight32 = 0x46B, - ChevronCircleRight48 = 0x46C, - ChevronCircleUp12 = 0x46D, - ChevronCircleUp16 = 0x46E, - ChevronCircleUp20 = 0x46F, - ChevronCircleUp24 = 0x470, - ChevronCircleUp28 = 0x471, - ChevronCircleUp48 = 0x472, - CircleEdit20 = 0x473, - CircleLine20 = 0x474, - CircleOff20 = 0x475, - Class20 = 0x476, - ClipboardDataBar20 = 0x477, - ClipboardDataBar24 = 0x478, - ClipboardImage20 = 0x479, - ClipboardMore20 = 0x47A, - ClockDismiss20 = 0x47B, - CommentDismiss20 = 0x47C, - CommentError24 = 0x47D, - CommentNote20 = 0x47E, - ConvertRange20 = 0x47F, - CopyAdd20 = 0x480, - CopyArrowRight20 = 0x481, - Couch20 = 0x482, - CropInterim20 = 0x483, - CropInterimOff20 = 0x484, - CubeSync20 = 0x485, - DarkTheme20 = 0x486, - DataArea20 = 0x487, - DataBarVerticalAdd20 = 0x488, - DataFunnel20 = 0x489, - DataHistogram20 = 0x48A, - DataScatter20 = 0x48B, - DataSunburst20 = 0x48C, - DataTreemap20 = 0x48D, - DataWaterfall20 = 0x48E, - DataWhisker20 = 0x48F, - DocumentLock16 = 0x490, - DocumentLock20 = 0x491, - DocumentLock24 = 0x492, - DocumentLock28 = 0x493, - DocumentLock32 = 0x494, - DocumentLock48 = 0x495, - EyedropperOff20 = 0x496, - EyedropperOff24 = 0x497, - GlobePerson20 = 0x498, - MailOpenPerson20 = 0x499, - MailOpenPerson24 = 0x49A, - Resize24 = 0x49B, - ResizeImage20 = 0x49C, - ScanCamera16 = 0x49D, - ScanCamera20 = 0x49E, - ScanCamera24 = 0x49F, - ScanCamera28 = 0x4A0, - ScanCamera48 = 0x4A1, - StyleGuide20 = 0x4A2, - TabDesktop16 = 0x4A3, - TabDesktop24 = 0x4A4, - TabDesktopBottom20 = 0x4A5, - ApprovalsApp32 = 0x4A6, - ArrowExportRtl24 = 0x4A7, - ArrowSortDownLines20 = 0x4A8, - ArrowStepIn20 = 0x4A9, - ArrowStepIn24 = 0x4AA, - Battery1024 = 0x4AB, - BezierCurveSquare20 = 0x4AC, - BorderNone24 = 0x4AD, - CalendarPattern16 = 0x4AE, - CaretDownRight12 = 0x4AF, - CaretDownRight16 = 0x4B0, - CaretDownRight20 = 0x4B1, - CaretDownRight24 = 0x4B2, - CellularOff24 = 0x4B3, - Eye12 = 0x4B4, - Eye16 = 0x4B5, - Eye20 = 0x4B6, - Eye24 = 0x4B7, - EyeOff20 = 0x4B8, - EyeOff24 = 0x4B9, - EyeTracking16 = 0x4BA, - EyeTracking20 = 0x4BB, - EyeTracking24 = 0x4BC, - Flash20 = 0x4BD, - Flash24 = 0x4BE, - HdrOff24 = 0x4BF, - Mic16 = 0x4C0, - Mic20 = 0x4C1, - Mic24 = 0x4C2, - Mic28 = 0x4C3, - Mic32 = 0x4C4, - Mic48 = 0x4C5, - MultiselectLtr16 = 0x4C6, - MultiselectLtr20 = 0x4C7, - MultiselectLtr24 = 0x4C8, - MultiselectRtl20 = 0x4C9, - MultiselectRtl24 = 0x4CA, - PanelLeftContract16 = 0x4CB, - PanelLeftContract20 = 0x4CC, - PanelLeftContract24 = 0x4CD, - ShareScreenStart48 = 0x4CE, - ShieldLock24 = 0x4CF, - ShieldLock28 = 0x4D0, - ShieldLock48 = 0x4D1, - SkipBack1024 = 0x4D2, - SkipBack1028 = 0x4D3, - SkipBack1032 = 0x4D4, - SkipBack1048 = 0x4D5, - TableStackBelow20 = 0x4D6, - Textbox16 = 0x4D7, - TextboxRotate9020 = 0x4D8, - TextboxRotate9024 = 0x4D9, - BoardGames20 = 0x4DA, - BuildingHome16 = 0x4DB, - BuildingHome20 = 0x4DC, - BuildingHome24 = 0x4DD, - ColorFill16 = 0x4DE, - ColorFill28 = 0x4DF, - ColorFillAccent16 = 0x4E0, - ColorFillAccent28 = 0x4E1, - DecimalArrowLeft20 = 0x4E2, - DecimalArrowRight20 = 0x4E3, - DeleteArrowBack20 = 0x4E4, - DeleteDismiss20 = 0x4E5, - DesktopEdit20 = 0x4E6, - DesktopEdit24 = 0x4E7, - DesktopMac20 = 0x4E8, - DesktopMac24 = 0x4E9, - DesktopSync20 = 0x4EA, - DesktopSync24 = 0x4EB, - DeveloperBoardSearch24 = 0x4EC, - DeviceEq20 = 0x4ED, - Diagram20 = 0x4EE, - DialpadOff20 = 0x4EF, - DismissSquareMultiple20 = 0x4F0, - DividerShort16 = 0x4F1, - DividerShort20 = 0x4F2, - Dock20 = 0x4F3, - DockRow20 = 0x4F4, - DocumentBulletListOff20 = 0x4F5, - DocumentCheckmark20 = 0x4F6, - DocumentChevronDouble20 = 0x4F7, - DocumentCss20 = 0x4F8, - DocumentFooter20 = 0x4F9, - DocumentFooterDismiss20 = 0x4FA, - DocumentHeader20 = 0x4FB, - DocumentHeaderArrowDown20 = 0x4FC, - DocumentHeaderArrowDown24 = 0x4FD, - DocumentHeaderDismiss20 = 0x4FE, - DocumentJavascript20 = 0x4FF, - DocumentLandscapeData20 = 0x500, - DocumentLandscapeSplit24 = 0x501, - DoubleTapSwipeDown20 = 0x502, - DoubleTapSwipeDown24 = 0x503, - DoubleTapSwipeUp20 = 0x504, - DoubleTapSwipeUp24 = 0x505, - LocationAdd16 = 0x506, - LocationAdd20 = 0x507, - LocationAdd24 = 0x508, - MathSymbols16 = 0x509, - MathSymbols20 = 0x50A, - MathSymbols24 = 0x50B, - MathSymbols28 = 0x50C, - MathSymbols32 = 0x50D, - MathSymbols48 = 0x50E, - Password16 = 0x50F, - Password20 = 0x510, - PeopleProhibited24 = 0x511, - StickerAdd20 = 0x512, - SubtractSquare20 = 0x513, - System20 = 0x514, - TableAdd16 = 0x515, - TableAdd28 = 0x516, - TableCellEdit16 = 0x517, - TableCellEdit20 = 0x518, - TableCellEdit28 = 0x519, - TableCellsMerge16 = 0x51A, - TableCellsMerge28 = 0x51B, - TableCellsSplit16 = 0x51C, - TableCellsSplit28 = 0x51D, - TableDeleteColumn16 = 0x51E, - TableDeleteColumn28 = 0x51F, - TableDeleteRow16 = 0x520, - TableDeleteRow28 = 0x521, - TableDismiss16 = 0x522, - TableDismiss28 = 0x523, - TableEdit16 = 0x524, - TableEdit20 = 0x525, - TableEdit28 = 0x526, - TableFreezeColumn16 = 0x527, - TableFreezeColumn20 = 0x528, - TableFreezeColumn28 = 0x529, - TableFreezeColumnAndRow16 = 0x52A, - TableFreezeColumnAndRow20 = 0x52B, - TableFreezeColumnAndRow28 = 0x52C, - TableFreezeRow16 = 0x52D, - TableFreezeRow20 = 0x52E, - TableFreezeRow28 = 0x52F, - TableInsertColumn16 = 0x530, - TableInsertColumn20 = 0x531, - TableInsertColumn28 = 0x532, - TableInsertRow16 = 0x533, - TableInsertRow20 = 0x534, - TableInsertRow28 = 0x535, - TableLightning16 = 0x536, - TableLightning28 = 0x537, - TableLink16 = 0x538, - TableLink28 = 0x539, - TableMoveAbove16 = 0x53A, - TableMoveAbove20 = 0x53B, - TableMoveAbove28 = 0x53C, - TableMoveBelow16 = 0x53D, - TableMoveBelow20 = 0x53E, - TableMoveBelow28 = 0x53F, - TableMoveLeft16 = 0x540, - TableMoveLeft20 = 0x541, - TableMoveLeft28 = 0x542, - TableMoveRight16 = 0x543, - TableMoveRight20 = 0x544, - TableMoveRight28 = 0x545, - TableResizeColumn16 = 0x546, - TableResizeColumn20 = 0x547, - TableResizeColumn28 = 0x548, - TableResizeRow16 = 0x549, - TableResizeRow20 = 0x54A, - TableResizeRow28 = 0x54B, - TableSettings16 = 0x54C, - TableSettings20 = 0x54D, - TableSettings28 = 0x54E, - TableStackAbove16 = 0x54F, - TableStackAbove28 = 0x550, - TableStackBelow16 = 0x551, - TableStackBelow28 = 0x552, - TableStackLeft16 = 0x553, - TableStackLeft28 = 0x554, - TableStackRight16 = 0x555, - TableStackRight28 = 0x556, - TableSwitch16 = 0x557, - TableSwitch20 = 0x558, - TableSwitch28 = 0x559, - TabletSpeaker20 = 0x55A, - TextAlignDistributedEvenly20 = 0x55B, - TextAlignDistributedVertical20 = 0x55C, - TextAlignJustifyLow20 = 0x55D, - TextContinuous20 = 0x55E, - TextboxAlignBottomRotate9020 = 0x55F, - TextboxAlignMiddleRotate9020 = 0x560, - TextboxAlignTopRotate9020 = 0x561, - TextboxMore20 = 0x562, - VideoChat16 = 0x563, - VideoChat20 = 0x564, - VideoChat24 = 0x565, - ArrowParagraph20 = 0x566, - ClipboardEdit20 = 0x567, - ClipboardNote20 = 0x568, - DocumentMention16 = 0x569, - DocumentMention20 = 0x56A, - DocumentMention24 = 0x56B, - DocumentMention28 = 0x56C, - DocumentMention48 = 0x56D, - DocumentSplitHintOff16 = 0x56E, - DocumentSplitHintOff20 = 0x56F, - DoorTag20 = 0x570, - DoubleSwipeDown20 = 0x571, - DoubleSwipeUp20 = 0x572, - Drag20 = 0x573, - DrinkToGo20 = 0x574, - DriveTrain20 = 0x575, - DualScreenAdd20 = 0x576, - DualScreenArrowRight20 = 0x577, - DualScreenArrowUp20 = 0x578, - DualScreenClock20 = 0x579, - DualScreenClosedAlert20 = 0x57A, - DualScreenDesktop20 = 0x57B, - DualScreenDismiss20 = 0x57C, - DualScreenGroup20 = 0x57D, - DualScreenHeader20 = 0x57E, - DualScreenLock20 = 0x57F, - DualScreenMirror20 = 0x580, - DualScreenPagination20 = 0x581, - DualScreenSettings20 = 0x582, - DualScreenSpan20 = 0x583, - DualScreenSpeaker20 = 0x584, - DualScreenStatusBar20 = 0x585, - DualScreenTablet20 = 0x586, - DualScreenUpdate20 = 0x587, - DualScreenVerticalScroll20 = 0x588, - DualScreenVibrate20 = 0x589, - EditSettings20 = 0x58A, - Engine20 = 0x58B, - EraserMedium20 = 0x58C, - EraserSegment20 = 0x58D, - EraserSmall20 = 0x58E, - EraserTool20 = 0x58F, - ExtendedDock20 = 0x590, - FastAcceleration20 = 0x591, - FilterSync20 = 0x592, - Fingerprint20 = 0x593, - FixedWidth20 = 0x594, - FlashAuto20 = 0x595, - FlashOff20 = 0x596, - FlashlightOff20 = 0x597, - Fluent20 = 0x598, - FormNew20 = 0x599, - Fps96020 = 0x59A, - FullScreenMinimize16 = 0x59B, - FullScreenMinimize20 = 0x59C, - Gas20 = 0x59D, - GasPump20 = 0x59E, - Gavel20 = 0x59F, - Gesture20 = 0x5A0, - GiftCard24 = 0x5A1, - GlanceDefault12 = 0x5A2, - GlanceHorizontal24 = 0x5A3, - GlobeAdd20 = 0x5A4, - GlobeDesktop20 = 0x5A5, - GroupDismiss20 = 0x5A6, - GroupList20 = 0x5A7, - GroupReturn20 = 0x5A8, - GuestAdd20 = 0x5A9, - HandDraw20 = 0x5AA, - HomeAdd20 = 0x5AB, - MailDismiss28 = 0x5AC, - MailInboxAll20 = 0x5AD, - MailInboxArrowRight20 = 0x5AE, - MailList16 = 0x5AF, - MailMultiple28 = 0x5B0, - MailOff20 = 0x5B1, - MicSettings20 = 0x5B2, - NavigationUnread20 = 0x5B3, - New20 = 0x5B4, - Notebook20 = 0x5B5, - NotebookAdd20 = 0x5B6, - NotebookError20 = 0x5B7, - NotebookLightning20 = 0x5B8, - NotebookQuestionMark20 = 0x5B9, - NumberSymbolDismiss20 = 0x5BA, - Pair20 = 0x5BB, - Patient20 = 0x5BC, - PauseOff20 = 0x5BD, - PauseSettings16 = 0x5BE, - PeopleSync28 = 0x5BF, - PhoneAdd20 = 0x5C0, - PhoneDismiss20 = 0x5C1, - PhoneLock20 = 0x5C2, - PhonePageHeader20 = 0x5C3, - PhonePagination20 = 0x5C4, - PhoneScreenTime20 = 0x5C5, - PhoneStatusBar20 = 0x5C6, - PhoneUpdate20 = 0x5C7, - PhoneVerticalScroll20 = 0x5C8, - PhoneVibrate20 = 0x5C9, - PhotoFilter20 = 0x5CA, - Pi20 = 0x5CB, - PortHdmi20 = 0x5CC, - Predictions20 = 0x5CD, - PulseSquare20 = 0x5CE, - Remote20 = 0x5CF, - Reorder20 = 0x5D0, - ResizeVideo20 = 0x5D1, - RotateLeft20 = 0x5D2, - Router20 = 0x5D3, - Scan20 = 0x5D4, - ScanTable20 = 0x5D5, - ScanText20 = 0x5D6, - SearchSquare20 = 0x5D7, - ServiceBell20 = 0x5D8, - ShiftsAdd20 = 0x5D9, - ShiftsProhibited20 = 0x5DA, - ShiftsQuestionMark20 = 0x5DB, - SlideGrid20 = 0x5DC, - SlideSettings20 = 0x5DD, - SlideTransition20 = 0x5DE, - Spacebar20 = 0x5DF, - SpeakerSettings20 = 0x5E0, - SpeakerSettings28 = 0x5E1, - StarArrowRightEnd20 = 0x5E2, - StarArrowRightStart20 = 0x5E3, - StarHalf12 = 0x5E4, - StarHalf16 = 0x5E5, - StarHalf20 = 0x5E6, - StarHalf24 = 0x5E7, - StarHalf28 = 0x5E8, - StarOneQuarter12 = 0x5E9, - StarOneQuarter16 = 0x5EA, - StarOneQuarter20 = 0x5EB, - StarOneQuarter24 = 0x5EC, - StarOneQuarter28 = 0x5ED, - StarThreeQuarter12 = 0x5EE, - StarThreeQuarter16 = 0x5EF, - StarThreeQuarter20 = 0x5F0, - StarThreeQuarter24 = 0x5F1, - StarThreeQuarter28 = 0x5F2, - Storage20 = 0x5F3, - SubGrid20 = 0x5F4, - TextColorGa20 = 0x5F5, - TextDensity16 = 0x5F6, - TextDensity20 = 0x5F7, - VideoPersonOff20 = 0x5F8, - VoicemailArrowBack20 = 0x5F9, - VoicemailArrowForward20 = 0x5FA, - VoicemailArrowSubtract20 = 0x5FB, - WebAsset20 = 0x5FC, - Archive32 = 0x5FD, - ArchiveSettings24 = 0x5FE, - ArrowEnter20 = 0x5FF, - ArrowExit20 = 0x600, - ArrowJoin20 = 0x601, - ArrowTrendingDown16 = 0x602, - ArrowTrendingDown20 = 0x603, - ArrowTrendingDown24 = 0x604, - BookTemplate20 = 0x605, - BorderLeftRight20 = 0x606, - BorderLeftRight24 = 0x607, - BuildingRetailMore20 = 0x608, - CalendarAdd16 = 0x609, - CalendarAdd28 = 0x60A, - Cellular3g20 = 0x60B, - Cellular4g20 = 0x60C, - Cellular5g20 = 0x60D, - Checkbox120 = 0x60E, - Checkbox220 = 0x60F, - CheckmarkNote20 = 0x610, - CodeText20 = 0x611, - CodeTextEdit20 = 0x612, - Column20 = 0x613, - CubeAdd20 = 0x614, - CubeQuick16 = 0x615, - CubeQuick20 = 0x616, - CubeQuick24 = 0x617, - CubeQuick28 = 0x618, - DatabaseArrowDown20 = 0x619, - DatabaseArrowRight20 = 0x61A, - DatabaseArrowUp20 = 0x61B, - DatabaseLightning20 = 0x61C, - DatabasePlugConnected20 = 0x61D, - DatabaseWarning20 = 0x61E, - DatabaseWindow20 = 0x61F, - DeveloperBoardLightning20 = 0x620, - DeveloperBoardLightningToolbox20 = 0x621, - Edit28 = 0x622, - Edit48 = 0x623, - EditOff28 = 0x624, - EditOff32 = 0x625, - EditOff48 = 0x626, - EditProhibited16 = 0x627, - EditProhibited20 = 0x628, - EditProhibited24 = 0x629, - EditProhibited28 = 0x62A, - EditProhibited32 = 0x62B, - EditProhibited48 = 0x62C, - EmojiEdit16 = 0x62D, - EmojiEdit20 = 0x62E, - EmojiEdit24 = 0x62F, - EmojiEdit28 = 0x630, - EmojiEdit48 = 0x631, - FilterAdd20 = 0x632, - FlashAdd20 = 0x633, - FlashFlow16 = 0x634, - FlashFlow20 = 0x635, - FlashFlow24 = 0x636, - FlashPlay20 = 0x637, - FolderArrowLeft16 = 0x638, - FolderArrowLeft20 = 0x639, - FolderArrowLeft24 = 0x63A, - FolderArrowLeft28 = 0x63B, - FolderArrowLeft32 = 0x63C, - GaugeAdd20 = 0x63D, - HandDraw16 = 0x63E, - HardDrive20 = 0x63F, - Hdr20 = 0x640, - HdrOff20 = 0x641, - HomeDatabase20 = 0x642, - ImageAdd20 = 0x643, - ImageArrowBack20 = 0x644, - ImageArrowCounterclockwise20 = 0x645, - ImageArrowForward20 = 0x646, - ImageGlobe20 = 0x647, - ImageReflection20 = 0x648, - ImageShadow20 = 0x649, - Incognito20 = 0x64A, - KeyCommand20 = 0x64B, - KeyCommand24 = 0x64C, - Keyboard12320 = 0x64D, - KeyboardDock20 = 0x64E, - KeyboardLayoutFloat20 = 0x64F, - KeyboardLayoutOneHandedLeft20 = 0x650, - KeyboardLayoutResize20 = 0x651, - KeyboardLayoutSplit20 = 0x652, - KeyboardShiftUppercase16 = 0x653, - KeyboardShiftUppercase20 = 0x654, - KeyboardTab20 = 0x655, - LauncherSettings20 = 0x656, - LightbulbCircle20 = 0x657, - LineStyle20 = 0x658, - LinkToolbox20 = 0x659, - LocationAddLeft20 = 0x65A, - LocationAddRight20 = 0x65B, - LocationAddUp20 = 0x65C, - LocationDismiss20 = 0x65D, - MailAllRead16 = 0x65E, - MailAllRead24 = 0x65F, - MailAllRead28 = 0x660, - MailList20 = 0x661, - MailList24 = 0x662, - MailList28 = 0x663, - MailReadMultiple16 = 0x664, - MailReadMultiple24 = 0x665, - MailReadMultiple28 = 0x666, - MathFormatProfessional20 = 0x667, - MathFormula20 = 0x668, - MentionArrowDown20 = 0x669, - MentionBrackets20 = 0x66A, - MusicNoteOff120 = 0x66B, - MusicNoteOff124 = 0x66C, - MusicNoteOff216 = 0x66D, - MusicNoteOff220 = 0x66E, - MusicNoteOff224 = 0x66F, - NavigationLocationTarget20 = 0x670, - NavigationPlay20 = 0x671, - NumberCircle116 = 0x672, - NumberCircle120 = 0x673, - NumberCircle124 = 0x674, - PanelLeftContract28 = 0x675, - PanelLeftExpand24 = 0x676, - PanelLeftExpand28 = 0x677, - Pen16 = 0x678, - Pen20 = 0x679, - Pen24 = 0x67A, - Pen28 = 0x67B, - Pen32 = 0x67C, - Pen48 = 0x67D, - PenOff16 = 0x67E, - PenOff20 = 0x67F, - PenOff24 = 0x680, - PenOff28 = 0x681, - PenOff32 = 0x682, - PenOff48 = 0x683, - PenProhibited16 = 0x684, - PenProhibited20 = 0x685, - PenProhibited24 = 0x686, - PenProhibited28 = 0x687, - PenProhibited32 = 0x688, - PenProhibited48 = 0x689, - PersonKey20 = 0x68A, - PhoneLinkSetup20 = 0x68B, - Pipeline20 = 0x68C, - PipelineAdd20 = 0x68D, - PipelinePlay20 = 0x68E, - PlaySettings20 = 0x68F, - PlugConnectedAdd20 = 0x690, - PlugConnectedCheckmark20 = 0x691, - PresenceAvailable20 = 0x692, - PresenceAvailable24 = 0x693, - PresenceBlocked20 = 0x694, - PresenceBlocked24 = 0x695, - PresenceDnd20 = 0x696, - PresenceDnd24 = 0x697, - PresenceOffline20 = 0x698, - PresenceOffline24 = 0x699, - PresenceOof20 = 0x69A, - PresenceOof24 = 0x69B, - PresenceUnknown20 = 0x69C, - PresenceUnknown24 = 0x69D, - ProhibitedNote20 = 0x69E, - PuzzleCubePiece20 = 0x69F, - Ram20 = 0x6A0, - ReceiptSearch20 = 0x6A1, - RectanglePortraitLocationTarget20 = 0x6A2, - SaveImage20 = 0x6A3, - Scan16 = 0x6A4, - ServerMultiple20 = 0x6A5, - ServerPlay20 = 0x6A6, - ShieldPerson20 = 0x6A7, - ShieldPersonAdd20 = 0x6A8, - SplitHint20 = 0x6A9, - SquaresNested20 = 0x6AA, - StreamInput20 = 0x6AB, - StreamInputOutput20 = 0x6AC, - StreamOutput20 = 0x6AD, - TableBottomRow16 = 0x6AE, - TableBottomRow20 = 0x6AF, - TableBottomRow24 = 0x6B0, - TableBottomRow28 = 0x6B1, - TableBottomRow32 = 0x6B2, - TableBottomRow48 = 0x6B3, - TableChecker20 = 0x6B4, - TableCopy20 = 0x6B5, - TableImage20 = 0x6B6, - TableMultiple20 = 0x6B7, - TableSearch20 = 0x6B8, - TableSplit20 = 0x6B9, - TaskListSquareDatabase20 = 0x6BA, - TextBulletListCheckmark20 = 0x6BB, - TextBulletListDismiss20 = 0x6BC, - TextBulletListSquareClock20 = 0x6BD, - TextBulletListSquarePerson20 = 0x6BE, - TextBulletListSquareSearch20 = 0x6BF, - TextBulletListSquareSettings20 = 0x6C0, - TextBulletListSquareShield20 = 0x6C1, - TextBulletListSquareToolbox20 = 0x6C2, - TextDensity24 = 0x6C3, - TextDensity28 = 0x6C4, - TextExpand20 = 0x6C5, - TimerOff20 = 0x6C6, - Triangle16 = 0x6C7, - Triangle20 = 0x6C8, - TriangleDown12 = 0x6C9, - TriangleDown16 = 0x6CA, - TriangleDown20 = 0x6CB, - TriangleDown32 = 0x6CC, - TriangleDown48 = 0x6CD, - TriangleLeft12 = 0x6CE, - TriangleLeft16 = 0x6CF, - TriangleLeft20 = 0x6D0, - TriangleLeft32 = 0x6D1, - TriangleLeft48 = 0x6D2, - TriangleRight12 = 0x6D3, - TriangleRight16 = 0x6D4, - TriangleRight20 = 0x6D5, - TriangleRight32 = 0x6D6, - TriangleRight48 = 0x6D7, - VideoChat28 = 0x6D8, - VideoChat32 = 0x6D9, - VideoChat48 = 0x6DA, - VirtualNetwork20 = 0x6DB, - VirtualNetworkToolbox20 = 0x6DC, - Wallet16 = 0x6DD, - WalletCreditCard16 = 0x6DE, - WalletCreditCard20 = 0x6DF, - WalletCreditCard24 = 0x6E0, - WalletCreditCard32 = 0x6E1, - WindowBulletList20 = 0x6E2, - WindowBulletListAdd20 = 0x6E3, - WindowDatabase20 = 0x6E4, - WindowLocationTarget20 = 0x6E5, - WindowMultipleSwap20 = 0x6E6, - WindowPlay20 = 0x6E7, - WindowSettings20 = 0x6E8, - WindowText20 = 0x6E9, - ArchiveArrowBack16 = 0x6EA, - ArchiveArrowBack20 = 0x6EB, - ArchiveArrowBack24 = 0x6EC, - ArchiveArrowBack28 = 0x6ED, - ArchiveArrowBack32 = 0x6EE, - ArchiveArrowBack48 = 0x6EF, - CircleMultipleSubtractCheckmark20 = 0x6F0, - DatabaseMultiple20 = 0x6F1, - ImageMultipleOff16 = 0x6F2, - Keyboard16 = 0x6F3, - LockMultiple20 = 0x6F4, - Lottery20 = 0x6F5, - MailWarning20 = 0x6F6, - MailWarning24 = 0x6F7, - MatchAppLayout20 = 0x6F8, - MathFormatLinear20 = 0x6F9, - MegaphoneOff16 = 0x6FA, - MegaphoneOff20 = 0x6FB, - MegaphoneOff28 = 0x6FC, - Merge20 = 0x6FD, - MicOff32 = 0x6FE, - MobileOptimized20 = 0x6FF, - NetworkCheck20 = 0x700, - NoteAdd28 = 0x701, - NoteAdd48 = 0x702, - NotebookSync20 = 0x703, - OrganizationHorizontal20 = 0x704, - PaintBrushArrowDown20 = 0x705, - PaintBrushArrowUp20 = 0x706, - Pentagon20 = 0x707, - PersonAccounts20 = 0x708, - PersonSubtract20 = 0x709, - PinOff28 = 0x70A, - PinOff32 = 0x70B, - PointScan20 = 0x70C, - PortUsbA20 = 0x70D, - QuestionCircle12 = 0x70E, - RowTriple20 = 0x70F, - Scratchpad20 = 0x710, - ShiftsAvailability20 = 0x711, - SkipForwardTab20 = 0x712, - Sleep20 = 0x713, - SlideMultiple20 = 0x714, - SlideMultipleArrowRight20 = 0x715, - SlideSize20 = 0x716, - SoundWaveCircle20 = 0x717, - SportAmericanFootball20 = 0x718, - SportBaseball20 = 0x719, - SportHockey20 = 0x71A, - SquareHintArrowBack20 = 0x71B, - SquareShadow20 = 0x71C, - TabArrowLeft20 = 0x71D, - TabProhibited20 = 0x71E, - TextCollapse20 = 0x71F, - TextMore20 = 0x720, - TimeAndWeather20 = 0x721, - Transmission20 = 0x722, - VideoPlayPause20 = 0x723, + AccessTime20 = 0xE000, + Accessibility32 = 0xE001, + Accessibility48 = 0xE002, + AccessibilityCheckmark20 = 0xE003, + AccessibilityCheckmark24 = 0xE004, + AddCircle16 = 0xE005, + AddCircle32 = 0xE006, + AddSquare20 = 0xE007, + AddSquareMultiple16 = 0xE008, + AddSquareMultiple20 = 0xE009, + AddSubtractCircle16 = 0xE00A, + AddSubtractCircle20 = 0xE00B, + AddSubtractCircle24 = 0xE00C, + AddSubtractCircle28 = 0xE00D, + AddSubtractCircle48 = 0xE00E, + Album20 = 0xE00F, + Album24 = 0xE010, + AlbumAdd20 = 0xE011, + AlbumAdd24 = 0xE012, + Alert12 = 0xE013, + Alert16 = 0xE014, + Alert32 = 0xE015, + Alert48 = 0xE016, + AlertBadge16 = 0xE017, + AlertBadge20 = 0xE018, + AlertBadge24 = 0xE019, + AlertOn20 = 0xE01A, + AlertSnooze12 = 0xE01B, + AlertSnooze16 = 0xE01C, + AlertUrgent16 = 0xE01D, + AlignBottom16 = 0xE01E, + AlignBottom20 = 0xE01F, + AlignBottom24 = 0xE020, + AlignBottom28 = 0xE021, + AlignBottom32 = 0xE022, + AlignBottom48 = 0xE023, + AlignCenterHorizontal16 = 0xE024, + AlignCenterHorizontal20 = 0xE025, + AlignCenterHorizontal24 = 0xE026, + AlignCenterHorizontal28 = 0xE027, + AlignCenterHorizontal32 = 0xE028, + AlignCenterHorizontal48 = 0xE029, + AlignCenterVertical16 = 0xE02A, + AlignCenterVertical20 = 0xE02B, + AlignCenterVertical24 = 0xE02C, + AlignCenterVertical28 = 0xE02D, + AlignCenterVertical32 = 0xE02E, + AlignCenterVertical48 = 0xE02F, + AlignEndHorizontal20 = 0xE030, + AlignEndVertical20 = 0xE031, + AlignLeft16 = 0xE032, + AlignLeft20 = 0xE033, + AlignLeft24 = 0xE034, + AlignLeft28 = 0xE035, + AlignLeft32 = 0xE036, + AlignLeft48 = 0xE037, + AlignRight16 = 0xE038, + AlignRight20 = 0xE039, + AlignRight24 = 0xE03A, + AlignRight28 = 0xE03B, + AlignRight32 = 0xE03C, + AlignRight48 = 0xE03D, + AlignSpaceAroundHorizontal20 = 0xE03E, + AlignSpaceAroundVertical20 = 0xE03F, + AlignSpaceBetweenHorizontal20 = 0xE040, + AlignSpaceBetweenVertical20 = 0xE041, + AlignSpaceEvenlyHorizontal20 = 0xE042, + AlignSpaceEvenlyVertical20 = 0xE043, + AlignSpaceFitVertical20 = 0xE044, + AlignStartHorizontal20 = 0xE045, + AlignStartVertical20 = 0xE046, + AlignStretchHorizontal20 = 0xE047, + AlignStretchVertical20 = 0xE048, + AlignTop16 = 0xE049, + AlignTop20 = 0xE04A, + AlignTop24 = 0xE04B, + AlignTop28 = 0xE04C, + AlignTop32 = 0xE04D, + AlignTop48 = 0xE04E, + AnimalDog16 = 0xE04F, + AnimalRabbit16 = 0xE050, + AnimalRabbit20 = 0xE051, + AnimalRabbit24 = 0xE052, + AnimalRabbit28 = 0xE053, + AnimalTurtle16 = 0xE054, + AnimalTurtle20 = 0xE055, + AnimalTurtle24 = 0xE056, + AnimalTurtle28 = 0xE057, + AppFolder16 = 0xE058, + AppFolder28 = 0xE059, + AppFolder32 = 0xE05A, + AppFolder48 = 0xE05B, + AppGeneric20 = 0xE05C, + AppRecent20 = 0xE05D, + AppTitle20 = 0xE05E, + ApprovalsApp16 = 0xE05F, + ApprovalsApp20 = 0xE060, + ApprovalsApp32 = 0xE061, + AppsAddIn16 = 0xE062, + AppsAddIn28 = 0xE063, + AppsListDetail20 = 0xE064, + AppsListDetail24 = 0xE065, + Archive32 = 0xE066, + ArchiveArrowBack16 = 0xE067, + ArchiveArrowBack20 = 0xE068, + ArchiveArrowBack24 = 0xE069, + ArchiveArrowBack28 = 0xE06A, + ArchiveArrowBack32 = 0xE06B, + ArchiveArrowBack48 = 0xE06C, + ArchiveMultiple16 = 0xE06D, + ArchiveMultiple20 = 0xE06E, + ArchiveMultiple24 = 0xE06F, + ArchiveSettings20 = 0xE070, + ArchiveSettings24 = 0xE071, + ArchiveSettings28 = 0xE072, + ArrowAutofitContent20 = 0xE073, + ArrowAutofitContent24 = 0xE074, + ArrowAutofitDown20 = 0xE075, + ArrowAutofitDown24 = 0xE076, + ArrowAutofitHeight20 = 0xE077, + ArrowAutofitHeightDotted20 = 0xE078, + ArrowAutofitHeightDotted24 = 0xE079, + ArrowAutofitUp20 = 0xE07A, + ArrowAutofitUp24 = 0xE07B, + ArrowAutofitWidth20 = 0xE07C, + ArrowAutofitWidthDotted20 = 0xE07D, + ArrowAutofitWidthDotted24 = 0xE07E, + ArrowBetweenDown20 = 0xE07F, + ArrowBetweenDown24 = 0xE080, + ArrowBetweenUp20 = 0xE081, + ArrowBidirectionalUpDown12 = 0xE082, + ArrowBidirectionalUpDown16 = 0xE083, + ArrowBidirectionalUpDown20 = 0xE084, + ArrowBidirectionalUpDown24 = 0xE085, + ArrowBounce16 = 0xE086, + ArrowBounce20 = 0xE087, + ArrowBounce24 = 0xE088, + ArrowCircleDown12 = 0xE089, + ArrowCircleDown16 = 0xE08A, + ArrowCircleDown28 = 0xE08B, + ArrowCircleDown32 = 0xE08C, + ArrowCircleDown48 = 0xE08D, + ArrowCircleDownRight16 = 0xE08E, + ArrowCircleDownRight20 = 0xE08F, + ArrowCircleDownRight24 = 0xE090, + ArrowCircleDownUp20 = 0xE091, + ArrowCircleLeft12 = 0xE092, + ArrowCircleLeft16 = 0xE093, + ArrowCircleLeft20 = 0xE094, + ArrowCircleLeft24 = 0xE095, + ArrowCircleLeft28 = 0xE096, + ArrowCircleLeft32 = 0xE097, + ArrowCircleLeft48 = 0xE098, + ArrowCircleRight12 = 0xE099, + ArrowCircleRight16 = 0xE09A, + ArrowCircleRight20 = 0xE09B, + ArrowCircleRight24 = 0xE09C, + ArrowCircleRight28 = 0xE09D, + ArrowCircleRight32 = 0xE09E, + ArrowCircleRight48 = 0xE09F, + ArrowCircleUp12 = 0xE0A0, + ArrowCircleUp16 = 0xE0A1, + ArrowCircleUp20 = 0xE0A2, + ArrowCircleUp24 = 0xE0A3, + ArrowCircleUp28 = 0xE0A4, + ArrowCircleUp32 = 0xE0A5, + ArrowCircleUp48 = 0xE0A6, + ArrowCircleUpLeft20 = 0xE0A7, + ArrowCircleUpLeft24 = 0xE0A8, + ArrowClockwise12 = 0xE0A9, + ArrowClockwise16 = 0xE0AA, + ArrowClockwise28 = 0xE0AB, + ArrowClockwise32 = 0xE0AC, + ArrowClockwise48 = 0xE0AD, + ArrowClockwiseDashes20 = 0xE0AE, + ArrowClockwiseDashes24 = 0xE0AF, + ArrowCollapseAll20 = 0xE0B0, + ArrowCollapseAll24 = 0xE0B1, + ArrowCounterclockwise12 = 0xE0B2, + ArrowCounterclockwise16 = 0xE0B3, + ArrowCounterclockwise32 = 0xE0B4, + ArrowCounterclockwise48 = 0xE0B5, + ArrowCounterclockwiseDashes20 = 0xE0B6, + ArrowCounterclockwiseDashes24 = 0xE0B7, + ArrowCurveDownLeft16 = 0xE0B8, + ArrowCurveDownLeft24 = 0xE0B9, + ArrowCurveDownLeft28 = 0xE0BA, + ArrowDownLeft20 = 0xE0BB, + ArrowDownLeft32 = 0xE0BC, + ArrowDownLeft48 = 0xE0BD, + ArrowEject20 = 0xE0BE, + ArrowEnter20 = 0xE0BF, + ArrowEnterLeft20 = 0xE0C0, + ArrowEnterLeft24 = 0xE0C1, + ArrowEnterUp20 = 0xE0C2, + ArrowEnterUp24 = 0xE0C3, + ArrowExit20 = 0xE0C4, + ArrowExpand20 = 0xE0C5, + ArrowExportLtr16 = 0xE0C6, + ArrowExportLtr20 = 0xE0C7, + ArrowExportLtr24 = 0xE0C8, + ArrowExportRtl16 = 0xE0C9, + ArrowExportRtl24 = 0xE0CA, + ArrowExportUp20 = 0xE0CB, + ArrowExportUp24 = 0xE0CC, + ArrowFit20 = 0xE0CD, + ArrowFitIn16 = 0xE0CE, + ArrowFitIn20 = 0xE0CF, + ArrowForward28 = 0xE0D0, + ArrowForward48 = 0xE0D1, + ArrowForwardDownLightning20 = 0xE0D2, + ArrowForwardDownLightning24 = 0xE0D3, + ArrowForwardDownPerson20 = 0xE0D4, + ArrowForwardDownPerson24 = 0xE0D5, + ArrowJoin20 = 0xE0D6, + ArrowLeft12 = 0xE0D7, + ArrowMaximize32 = 0xE0D8, + ArrowMaximize48 = 0xE0D9, + ArrowMaximizeVertical48 = 0xE0DA, + ArrowMinimizeVertical20 = 0xE0DB, + ArrowMoveInward20 = 0xE0DC, + ArrowNext12 = 0xE0DD, + ArrowOutlineUpRight20 = 0xE0DE, + ArrowOutlineUpRight24 = 0xE0DF, + ArrowOutlineUpRight32 = 0xE0E0, + ArrowOutlineUpRight48 = 0xE0E1, + ArrowParagraph20 = 0xE0E2, + ArrowPrevious12 = 0xE0E3, + ArrowRedo16 = 0xE0E4, + ArrowRedo28 = 0xE0E5, + ArrowReply28 = 0xE0E6, + ArrowReplyAll28 = 0xE0E7, + ArrowReset32 = 0xE0E8, + ArrowReset48 = 0xE0E9, + ArrowRight12 = 0xE0EA, + ArrowRight16 = 0xE0EB, + ArrowRotateClockwise16 = 0xE0EC, + ArrowRouting20 = 0xE0ED, + ArrowRouting24 = 0xE0EE, + ArrowRoutingRectangleMultiple20 = 0xE0EF, + ArrowRoutingRectangleMultiple24 = 0xE0F0, + ArrowSortDownLines20 = 0xE0F1, + ArrowSortDownLines24 = 0xE0F2, + ArrowSplit16 = 0xE0F3, + ArrowSplit20 = 0xE0F4, + ArrowSplit24 = 0xE0F5, + ArrowSquareDown20 = 0xE0F6, + ArrowSquareDown24 = 0xE0F7, + ArrowStepBack16 = 0xE0F8, + ArrowStepBack20 = 0xE0F9, + ArrowStepIn12 = 0xE0FA, + ArrowStepIn16 = 0xE0FB, + ArrowStepIn20 = 0xE0FC, + ArrowStepIn24 = 0xE0FD, + ArrowStepIn28 = 0xE0FE, + ArrowStepInLeft12 = 0xE0FF, + ArrowStepInLeft16 = 0xE100, + ArrowStepInLeft20 = 0xE101, + ArrowStepInLeft24 = 0xE102, + ArrowStepInLeft28 = 0xE103, + ArrowStepInRight12 = 0xE104, + ArrowStepInRight16 = 0xE105, + ArrowStepInRight20 = 0xE106, + ArrowStepInRight24 = 0xE107, + ArrowStepInRight28 = 0xE108, + ArrowStepOut12 = 0xE109, + ArrowStepOut16 = 0xE10A, + ArrowStepOut20 = 0xE10B, + ArrowStepOut24 = 0xE10C, + ArrowStepOut28 = 0xE10D, + ArrowStepOver16 = 0xE10E, + ArrowStepOver20 = 0xE10F, + ArrowSync16 = 0xE110, + ArrowSyncCheckmark20 = 0xE111, + ArrowSyncCheckmark24 = 0xE112, + ArrowSyncDismiss20 = 0xE113, + ArrowSyncDismiss24 = 0xE114, + ArrowSyncOff16 = 0xE115, + ArrowSyncOff20 = 0xE116, + ArrowTrendingCheckmark20 = 0xE117, + ArrowTrendingCheckmark24 = 0xE118, + ArrowTrendingDown16 = 0xE119, + ArrowTrendingDown20 = 0xE11A, + ArrowTrendingDown24 = 0xE11B, + ArrowTrendingLines20 = 0xE11C, + ArrowTrendingLines24 = 0xE11D, + ArrowTrendingSettings20 = 0xE11E, + ArrowTrendingSettings24 = 0xE11F, + ArrowTrendingText20 = 0xE120, + ArrowTrendingText24 = 0xE121, + ArrowTrendingWrench20 = 0xE122, + ArrowTrendingWrench24 = 0xE123, + ArrowTurnBidirectionalDownRight20 = 0xE124, + ArrowTurnRight20 = 0xE125, + ArrowUndo16 = 0xE126, + ArrowUndo28 = 0xE127, + ArrowUndo32 = 0xE128, + ArrowUndo48 = 0xE129, + ArrowUp12 = 0xE12A, + ArrowUpLeft16 = 0xE12B, + ArrowUpLeft20 = 0xE12C, + ArrowUpLeft48 = 0xE12D, + ArrowUpRight20 = 0xE12E, + ArrowUpRight32 = 0xE12F, + ArrowUpRight48 = 0xE130, + ArrowUpload16 = 0xE131, + ArrowWrap20 = 0xE132, + ArrowWrapOff20 = 0xE133, + ArrowsBidirectional20 = 0xE134, + Attach12 = 0xE135, + AttachText20 = 0xE136, + AutoFitHeight20 = 0xE137, + AutoFitHeight24 = 0xE138, + AutoFitWidth20 = 0xE139, + AutoFitWidth24 = 0xE13A, + Autocorrect20 = 0xE13B, + Backpack32 = 0xE13C, + BackpackAdd20 = 0xE13D, + BackpackAdd24 = 0xE13E, + BackpackAdd28 = 0xE13F, + BackpackAdd48 = 0xE140, + Badge20 = 0xE141, + Balloon12 = 0xE142, + Battery1020 = 0xE143, + Battery1024 = 0xE144, + BatteryCheckmark20 = 0xE145, + BatteryCheckmark24 = 0xE146, + BatteryWarning20 = 0xE147, + Beach16 = 0xE148, + Beach20 = 0xE149, + Beach24 = 0xE14A, + Beach28 = 0xE14B, + Beach32 = 0xE14C, + Beach48 = 0xE14D, + BezierCurveSquare12 = 0xE14E, + BezierCurveSquare20 = 0xE14F, + BinFull20 = 0xE150, + BinFull24 = 0xE151, + BluetoothConnected20 = 0xE152, + BluetoothDisabled20 = 0xE153, + BluetoothSearching20 = 0xE154, + Board16 = 0xE155, + Board20 = 0xE156, + Board28 = 0xE157, + BoardGames20 = 0xE158, + BoardHeart16 = 0xE159, + BoardHeart20 = 0xE15A, + BoardHeart24 = 0xE15B, + BoardSplit16 = 0xE15C, + BoardSplit20 = 0xE15D, + BoardSplit24 = 0xE15E, + BoardSplit28 = 0xE15F, + BoardSplit48 = 0xE160, + BookAdd24 = 0xE161, + BookArrowClockwise20 = 0xE162, + BookArrowClockwise24 = 0xE163, + BookClock20 = 0xE164, + BookClock24 = 0xE165, + BookCoins20 = 0xE166, + BookCoins24 = 0xE167, + BookCompass20 = 0xE168, + BookCompass24 = 0xE169, + BookContacts20 = 0xE16A, + BookContacts24 = 0xE16B, + BookContacts28 = 0xE16C, + BookContacts32 = 0xE16D, + BookDatabase20 = 0xE16E, + BookDatabase24 = 0xE16F, + BookExclamationMark20 = 0xE170, + BookExclamationMark24 = 0xE171, + BookGlobe20 = 0xE172, + BookInformation20 = 0xE173, + BookInformation24 = 0xE174, + BookLetter20 = 0xE175, + BookLetter24 = 0xE176, + BookOpen16 = 0xE177, + BookOpen20 = 0xE178, + BookOpen24 = 0xE179, + BookOpen28 = 0xE17A, + BookOpen32 = 0xE17B, + BookOpen48 = 0xE17C, + BookOpenGlobe20 = 0xE17D, + BookOpenGlobe24 = 0xE17E, + BookOpenMicrophone20 = 0xE17F, + BookOpenMicrophone24 = 0xE180, + BookOpenMicrophone28 = 0xE181, + BookOpenMicrophone32 = 0xE182, + BookOpenMicrophone48 = 0xE183, + BookPulse20 = 0xE184, + BookPulse24 = 0xE185, + BookQuestionMark20 = 0xE186, + BookQuestionMark24 = 0xE187, + BookQuestionMarkRtl20 = 0xE188, + BookSearch20 = 0xE189, + BookSearch24 = 0xE18A, + BookStar20 = 0xE18B, + BookStar24 = 0xE18C, + BookTemplate20 = 0xE18D, + BookTheta20 = 0xE18E, + BookTheta24 = 0xE18F, + BookToolbox24 = 0xE190, + Bookmark32 = 0xE191, + BookmarkMultiple16 = 0xE192, + BookmarkMultiple20 = 0xE193, + BookmarkMultiple24 = 0xE194, + BookmarkMultiple28 = 0xE195, + BookmarkMultiple32 = 0xE196, + BookmarkMultiple48 = 0xE197, + BookmarkOff20 = 0xE198, + BookmarkSearch20 = 0xE199, + BookmarkSearch24 = 0xE19A, + BorderAll16 = 0xE19B, + BorderAll20 = 0xE19C, + BorderAll24 = 0xE19D, + BorderBottom20 = 0xE19E, + BorderBottom24 = 0xE19F, + BorderBottomDouble20 = 0xE1A0, + BorderBottomDouble24 = 0xE1A1, + BorderBottomThick20 = 0xE1A2, + BorderBottomThick24 = 0xE1A3, + BorderLeft20 = 0xE1A4, + BorderLeft24 = 0xE1A5, + BorderLeftRight20 = 0xE1A6, + BorderLeftRight24 = 0xE1A7, + BorderNone20 = 0xE1A8, + BorderNone24 = 0xE1A9, + BorderOutside20 = 0xE1AA, + BorderOutside24 = 0xE1AB, + BorderOutsideThick20 = 0xE1AC, + BorderOutsideThick24 = 0xE1AD, + BorderRight20 = 0xE1AE, + BorderRight24 = 0xE1AF, + BorderTop20 = 0xE1B0, + BorderTop24 = 0xE1B1, + BorderTopBottom20 = 0xE1B2, + BorderTopBottom24 = 0xE1B3, + BorderTopBottomDouble20 = 0xE1B4, + BorderTopBottomDouble24 = 0xE1B5, + BorderTopBottomThick20 = 0xE1B6, + BorderTopBottomThick24 = 0xE1B7, + Bot20 = 0xE1B8, + BotAdd20 = 0xE1B9, + Box16 = 0xE1BA, + Box20 = 0xE1BB, + Box24 = 0xE1BC, + BoxArrowLeft20 = 0xE1BD, + BoxArrowLeft24 = 0xE1BE, + BoxArrowUp20 = 0xE1BF, + BoxArrowUp24 = 0xE1C0, + BoxCheckmark20 = 0xE1C1, + BoxCheckmark24 = 0xE1C2, + BoxDismiss20 = 0xE1C3, + BoxDismiss24 = 0xE1C4, + BoxEdit20 = 0xE1C5, + BoxEdit24 = 0xE1C6, + BoxMultiple20 = 0xE1C7, + BoxMultiple24 = 0xE1C8, + BoxMultipleArrowLeft20 = 0xE1C9, + BoxMultipleArrowLeft24 = 0xE1CA, + BoxMultipleArrowRight20 = 0xE1CB, + BoxMultipleArrowRight24 = 0xE1CC, + BoxMultipleCheckmark20 = 0xE1CD, + BoxMultipleCheckmark24 = 0xE1CE, + BoxMultipleSearch20 = 0xE1CF, + BoxMultipleSearch24 = 0xE1D0, + BoxSearch20 = 0xE1D1, + BoxSearch24 = 0xE1D2, + BoxToolbox20 = 0xE1D3, + BoxToolbox24 = 0xE1D4, + Braces20 = 0xE1D5, + Braces24 = 0xE1D6, + BracesVariable20 = 0xE1D7, + BracesVariable24 = 0xE1D8, + Branch20 = 0xE1D9, + BranchCompare16 = 0xE1DA, + BranchCompare20 = 0xE1DB, + BranchCompare24 = 0xE1DC, + BranchFork16 = 0xE1DD, + BranchFork20 = 0xE1DE, + BranchFork24 = 0xE1DF, + BranchForkHint20 = 0xE1E0, + BranchForkHint24 = 0xE1E1, + BranchForkLink20 = 0xE1E2, + BranchForkLink24 = 0xE1E3, + BranchRequest20 = 0xE1E4, + BreakoutRoom20 = 0xE1E5, + BreakoutRoom24 = 0xE1E6, + BreakoutRoom28 = 0xE1E7, + Briefcase12 = 0xE1E8, + Briefcase16 = 0xE1E9, + Briefcase28 = 0xE1EA, + Briefcase32 = 0xE1EB, + Briefcase48 = 0xE1EC, + BriefcaseMedical16 = 0xE1ED, + BriefcaseMedical24 = 0xE1EE, + BriefcaseMedical32 = 0xE1EF, + BriefcaseOff16 = 0xE1F0, + BriefcaseOff20 = 0xE1F1, + BriefcaseOff24 = 0xE1F2, + BriefcaseOff28 = 0xE1F3, + BriefcaseOff32 = 0xE1F4, + BriefcaseOff48 = 0xE1F5, + BrightnessHigh16 = 0xE1F6, + BrightnessHigh20 = 0xE1F7, + BrightnessHigh24 = 0xE1F8, + BrightnessHigh28 = 0xE1F9, + BrightnessHigh32 = 0xE1FA, + BrightnessHigh48 = 0xE1FB, + BrightnessLow16 = 0xE1FC, + BrightnessLow20 = 0xE1FD, + BrightnessLow24 = 0xE1FE, + BrightnessLow28 = 0xE1FF, + BrightnessLow32 = 0xE200, + BrightnessLow48 = 0xE201, + BroadActivityFeed16 = 0xE202, + BroadActivityFeed20 = 0xE203, + Broom28 = 0xE204, + Bug16 = 0xE205, + Bug20 = 0xE206, + Bug24 = 0xE207, + BugArrowCounterclockwise20 = 0xE208, + BugProhibited20 = 0xE209, + Building16 = 0xE20A, + Building20 = 0xE20B, + BuildingBank16 = 0xE20C, + BuildingBank20 = 0xE20D, + BuildingBank24 = 0xE20E, + BuildingBank28 = 0xE20F, + BuildingBank48 = 0xE210, + BuildingBankLink16 = 0xE211, + BuildingBankLink20 = 0xE212, + BuildingBankLink24 = 0xE213, + BuildingBankLink28 = 0xE214, + BuildingBankLink48 = 0xE215, + BuildingFactory16 = 0xE216, + BuildingFactory20 = 0xE217, + BuildingFactory24 = 0xE218, + BuildingFactory28 = 0xE219, + BuildingFactory32 = 0xE21A, + BuildingFactory48 = 0xE21B, + BuildingGovernment20 = 0xE21C, + BuildingGovernment24 = 0xE21D, + BuildingGovernment32 = 0xE21E, + BuildingHome16 = 0xE21F, + BuildingHome20 = 0xE220, + BuildingHome24 = 0xE221, + BuildingLighthouse20 = 0xE222, + BuildingMultiple20 = 0xE223, + BuildingMultiple24 = 0xE224, + BuildingRetail20 = 0xE225, + BuildingRetailMoney20 = 0xE226, + BuildingRetailMoney24 = 0xE227, + BuildingRetailMore20 = 0xE228, + BuildingRetailShield20 = 0xE229, + BuildingRetailShield24 = 0xE22A, + BuildingRetailToolbox20 = 0xE22B, + BuildingRetailToolbox24 = 0xE22C, + BuildingShop16 = 0xE22D, + BuildingShop20 = 0xE22E, + BuildingShop24 = 0xE22F, + BuildingSkyscraper16 = 0xE230, + BuildingSkyscraper20 = 0xE231, + BuildingSkyscraper24 = 0xE232, + Calculator24 = 0xE233, + CalculatorArrowClockwise20 = 0xE234, + CalculatorArrowClockwise24 = 0xE235, + CalculatorMultiple20 = 0xE236, + CalculatorMultiple24 = 0xE237, + Calendar3Day16 = 0xE238, + CalendarAdd16 = 0xE239, + CalendarAdd28 = 0xE23A, + CalendarArrowDown20 = 0xE23B, + CalendarArrowDown24 = 0xE23C, + CalendarArrowRight16 = 0xE23D, + CalendarArrowRight24 = 0xE23E, + CalendarAssistant16 = 0xE23F, + CalendarCancel16 = 0xE240, + CalendarChat20 = 0xE241, + CalendarChat24 = 0xE242, + CalendarClock16 = 0xE243, + CalendarDay16 = 0xE244, + CalendarEdit16 = 0xE245, + CalendarEdit20 = 0xE246, + CalendarEdit24 = 0xE247, + CalendarEmpty32 = 0xE248, + CalendarError20 = 0xE249, + CalendarError24 = 0xE24A, + CalendarInfo20 = 0xE24B, + CalendarLtr12 = 0xE24C, + CalendarLtr16 = 0xE24D, + CalendarLtr20 = 0xE24E, + CalendarLtr24 = 0xE24F, + CalendarLtr28 = 0xE250, + CalendarLtr32 = 0xE251, + CalendarLtr48 = 0xE252, + CalendarMail16 = 0xE253, + CalendarMail20 = 0xE254, + CalendarMention20 = 0xE255, + CalendarMultiple28 = 0xE256, + CalendarMultiple32 = 0xE257, + CalendarPattern16 = 0xE258, + CalendarPattern20 = 0xE259, + CalendarPerson16 = 0xE25A, + CalendarPerson24 = 0xE25B, + CalendarPhone16 = 0xE25C, + CalendarPhone20 = 0xE25D, + CalendarQuestionMark16 = 0xE25E, + CalendarQuestionMark20 = 0xE25F, + CalendarQuestionMark24 = 0xE260, + CalendarRtl12 = 0xE261, + CalendarRtl16 = 0xE262, + CalendarRtl20 = 0xE263, + CalendarRtl24 = 0xE264, + CalendarRtl28 = 0xE265, + CalendarRtl32 = 0xE266, + CalendarRtl48 = 0xE267, + CalendarSearch20 = 0xE268, + CalendarSettings16 = 0xE269, + CalendarStar16 = 0xE26A, + CalendarToolbox20 = 0xE26B, + CalendarToolbox24 = 0xE26C, + CalendarWeekNumbers20 = 0xE26D, + CalendarWorkWeek28 = 0xE26E, + Call16 = 0xE26F, + Call20 = 0xE270, + Call24 = 0xE271, + Call28 = 0xE272, + Call32 = 0xE273, + Call48 = 0xE274, + CallAdd16 = 0xE275, + CallAdd20 = 0xE276, + CallCheckmark24 = 0xE277, + CallConnecting20 = 0xE278, + CallDismiss16 = 0xE279, + CallEnd16 = 0xE27A, + CallExclamation20 = 0xE27B, + CallForward16 = 0xE27C, + CallForward20 = 0xE27D, + CallForward28 = 0xE27E, + CallForward48 = 0xE27F, + CallInbound20 = 0xE280, + CallInbound28 = 0xE281, + CallInbound48 = 0xE282, + CallMissed20 = 0xE283, + CallMissed28 = 0xE284, + CallMissed48 = 0xE285, + CallOutbound20 = 0xE286, + CallOutbound28 = 0xE287, + CallOutbound48 = 0xE288, + CallPark16 = 0xE289, + CallPark20 = 0xE28A, + CallPark28 = 0xE28B, + CallPark48 = 0xE28C, + CallProhibited16 = 0xE28D, + CallProhibited20 = 0xE28E, + CallProhibited24 = 0xE28F, + CallProhibited28 = 0xE290, + CallProhibited48 = 0xE291, + CallTransfer16 = 0xE292, + CallTransfer20 = 0xE293, + CallWarning16 = 0xE294, + CallWarning20 = 0xE295, + CalligraphyPenCheckmark20 = 0xE296, + CalligraphyPenError20 = 0xE297, + CalligraphyPenQuestionMark20 = 0xE298, + Camera16 = 0xE299, + CameraDome16 = 0xE29A, + CameraDome20 = 0xE29B, + CameraDome24 = 0xE29C, + CameraDome28 = 0xE29D, + CameraDome48 = 0xE29E, + CameraEdit20 = 0xE29F, + CameraOff20 = 0xE2A0, + CameraOff24 = 0xE2A1, + CameraSwitch20 = 0xE2A2, + CaretDownRight12 = 0xE2A3, + CaretDownRight16 = 0xE2A4, + CaretDownRight20 = 0xE2A5, + CaretDownRight24 = 0xE2A6, + CaretUp12 = 0xE2A7, + CaretUp16 = 0xE2A8, + CaretUp20 = 0xE2A9, + CaretUp24 = 0xE2AA, + Cart16 = 0xE2AB, + Cart20 = 0xE2AC, + CatchUp16 = 0xE2AD, + CatchUp20 = 0xE2AE, + CatchUp24 = 0xE2AF, + Cellular3g20 = 0xE2B0, + Cellular4g20 = 0xE2B1, + Cellular5g20 = 0xE2B2, + Cellular5g24 = 0xE2B3, + CellularOff20 = 0xE2B4, + CellularOff24 = 0xE2B5, + CellularWarning20 = 0xE2B6, + CellularWarning24 = 0xE2B7, + CenterHorizontal20 = 0xE2B8, + CenterHorizontal24 = 0xE2B9, + CenterVertical20 = 0xE2BA, + CenterVertical24 = 0xE2BB, + Channel28 = 0xE2BC, + Channel48 = 0xE2BD, + ChannelAdd16 = 0xE2BE, + ChannelAdd20 = 0xE2BF, + ChannelAdd24 = 0xE2C0, + ChannelAdd28 = 0xE2C1, + ChannelAdd48 = 0xE2C2, + ChannelAlert16 = 0xE2C3, + ChannelAlert20 = 0xE2C4, + ChannelAlert24 = 0xE2C5, + ChannelAlert28 = 0xE2C6, + ChannelAlert48 = 0xE2C7, + ChannelArrowLeft16 = 0xE2C8, + ChannelArrowLeft20 = 0xE2C9, + ChannelArrowLeft24 = 0xE2CA, + ChannelArrowLeft28 = 0xE2CB, + ChannelArrowLeft48 = 0xE2CC, + ChannelDismiss16 = 0xE2CD, + ChannelDismiss20 = 0xE2CE, + ChannelDismiss24 = 0xE2CF, + ChannelDismiss28 = 0xE2D0, + ChannelDismiss48 = 0xE2D1, + ChannelShare12 = 0xE2D2, + ChannelShare16 = 0xE2D3, + ChannelShare20 = 0xE2D4, + ChannelShare24 = 0xE2D5, + ChannelShare28 = 0xE2D6, + ChannelShare48 = 0xE2D7, + ChannelSubtract16 = 0xE2D8, + ChannelSubtract20 = 0xE2D9, + ChannelSubtract24 = 0xE2DA, + ChannelSubtract28 = 0xE2DB, + ChannelSubtract48 = 0xE2DC, + ChartMultiple20 = 0xE2DD, + ChartMultiple24 = 0xE2DE, + ChartPerson20 = 0xE2DF, + ChartPerson24 = 0xE2E0, + ChartPerson28 = 0xE2E1, + ChartPerson48 = 0xE2E2, + Chat12 = 0xE2E3, + Chat16 = 0xE2E4, + Chat32 = 0xE2E5, + Chat48 = 0xE2E6, + ChatArrowBack16 = 0xE2E7, + ChatArrowBack20 = 0xE2E8, + ChatArrowDoubleBack16 = 0xE2E9, + ChatArrowDoubleBack20 = 0xE2EA, + ChatBubblesQuestion20 = 0xE2EB, + ChatDismiss16 = 0xE2EC, + ChatDismiss20 = 0xE2ED, + ChatDismiss24 = 0xE2EE, + ChatMail20 = 0xE2EF, + ChatOff20 = 0xE2F0, + ChatVideo20 = 0xE2F1, + ChatVideo24 = 0xE2F2, + ChatWarning16 = 0xE2F3, + ChatWarning20 = 0xE2F4, + Check24 = 0xE2F5, + Checkbox120 = 0xE2F6, + Checkbox124 = 0xE2F7, + Checkbox220 = 0xE2F8, + Checkbox224 = 0xE2F9, + CheckboxArrowRight20 = 0xE2FA, + CheckboxArrowRight24 = 0xE2FB, + CheckboxCheckedSync20 = 0xE2FC, + CheckboxIndeterminate16 = 0xE2FD, + CheckboxIndeterminate20 = 0xE2FE, + CheckboxIndeterminate24 = 0xE2FF, + CheckboxPerson16 = 0xE300, + CheckboxPerson20 = 0xE301, + CheckboxPerson24 = 0xE302, + CheckboxWarning20 = 0xE303, + CheckboxWarning24 = 0xE304, + Checkmark16 = 0xE305, + Checkmark48 = 0xE306, + CheckmarkCircle12 = 0xE307, + CheckmarkNote20 = 0xE308, + CheckmarkSquare20 = 0xE309, + CheckmarkStarburst20 = 0xE30A, + CheckmarkStarburst24 = 0xE30B, + Chess20 = 0xE30C, + ChevronCircleDown12 = 0xE30D, + ChevronCircleDown16 = 0xE30E, + ChevronCircleDown20 = 0xE30F, + ChevronCircleDown24 = 0xE310, + ChevronCircleDown28 = 0xE311, + ChevronCircleDown32 = 0xE312, + ChevronCircleDown48 = 0xE313, + ChevronCircleLeft12 = 0xE314, + ChevronCircleLeft16 = 0xE315, + ChevronCircleLeft20 = 0xE316, + ChevronCircleLeft24 = 0xE317, + ChevronCircleLeft28 = 0xE318, + ChevronCircleLeft32 = 0xE319, + ChevronCircleLeft48 = 0xE31A, + ChevronCircleRight12 = 0xE31B, + ChevronCircleRight16 = 0xE31C, + ChevronCircleRight20 = 0xE31D, + ChevronCircleRight24 = 0xE31E, + ChevronCircleRight28 = 0xE31F, + ChevronCircleRight32 = 0xE320, + ChevronCircleRight48 = 0xE321, + ChevronCircleUp12 = 0xE322, + ChevronCircleUp16 = 0xE323, + ChevronCircleUp20 = 0xE324, + ChevronCircleUp24 = 0xE325, + ChevronCircleUp28 = 0xE326, + ChevronCircleUp32 = 0xE327, + ChevronCircleUp48 = 0xE328, + ChevronDoubleDown20 = 0xE329, + ChevronDoubleLeft20 = 0xE32A, + ChevronDoubleRight20 = 0xE32B, + ChevronDoubleUp16 = 0xE32C, + ChevronDoubleUp20 = 0xE32D, + ChevronUpDown16 = 0xE32E, + ChevronUpDown20 = 0xE32F, + ChevronUpDown24 = 0xE330, + Circle12 = 0xE331, + Circle32 = 0xE332, + Circle48 = 0xE333, + CircleEdit20 = 0xE334, + CircleEdit24 = 0xE335, + CircleEraser20 = 0xE336, + CircleHalfFill12 = 0xE337, + CircleImage20 = 0xE338, + CircleLine12 = 0xE339, + CircleLine20 = 0xE33A, + CircleMultipleSubtractCheckmark20 = 0xE33B, + CircleOff16 = 0xE33C, + CircleOff20 = 0xE33D, + CircleSmall20 = 0xE33E, + Class20 = 0xE33F, + ClearFormatting16 = 0xE340, + ClearFormatting20 = 0xE341, + Clipboard16 = 0xE342, + Clipboard32 = 0xE343, + ClipboardArrowRight16 = 0xE344, + ClipboardArrowRight20 = 0xE345, + ClipboardArrowRight24 = 0xE346, + ClipboardBulletListLtr16 = 0xE347, + ClipboardBulletListLtr20 = 0xE348, + ClipboardBulletListRtl16 = 0xE349, + ClipboardBulletListRtl20 = 0xE34A, + ClipboardCheckmark20 = 0xE34B, + ClipboardCheckmark24 = 0xE34C, + ClipboardClock20 = 0xE34D, + ClipboardClock24 = 0xE34E, + ClipboardDataBar20 = 0xE34F, + ClipboardDataBar24 = 0xE350, + ClipboardDataBar32 = 0xE351, + ClipboardEdit20 = 0xE352, + ClipboardError20 = 0xE353, + ClipboardError24 = 0xE354, + ClipboardHeart24 = 0xE355, + ClipboardImage20 = 0xE356, + ClipboardImage24 = 0xE357, + ClipboardMore20 = 0xE358, + ClipboardNote20 = 0xE359, + ClipboardPaste16 = 0xE35A, + ClipboardPulse24 = 0xE35B, + ClipboardSettings24 = 0xE35C, + ClipboardTask20 = 0xE35D, + ClipboardTask24 = 0xE35E, + ClipboardTaskAdd20 = 0xE35F, + ClipboardTaskAdd24 = 0xE360, + ClipboardTaskListLtr20 = 0xE361, + ClipboardTaskListLtr24 = 0xE362, + ClipboardTaskListRtl20 = 0xE363, + ClipboardTaskListRtl24 = 0xE364, + ClipboardText32 = 0xE365, + ClipboardTextEdit20 = 0xE366, + ClipboardTextEdit24 = 0xE367, + ClipboardTextEdit32 = 0xE368, + ClipboardTextLtr20 = 0xE369, + ClipboardTextLtr24 = 0xE36A, + ClipboardTextLtr32 = 0xE36B, + ClipboardTextRtl20 = 0xE36C, + ClipboardTextRtl24 = 0xE36D, + Clock32 = 0xE36E, + ClockAlarm16 = 0xE36F, + ClockAlarm32 = 0xE370, + ClockArrowDownload24 = 0xE371, + ClockDismiss20 = 0xE372, + ClockDismiss24 = 0xE373, + ClockPause20 = 0xE374, + ClockPause24 = 0xE375, + ClockToolbox20 = 0xE376, + ClockToolbox24 = 0xE377, + ClosedCaption16 = 0xE378, + ClosedCaption20 = 0xE379, + ClosedCaption28 = 0xE37A, + ClosedCaption32 = 0xE37B, + ClosedCaption48 = 0xE37C, + ClosedCaptionOff16 = 0xE37D, + ClosedCaptionOff20 = 0xE37E, + ClosedCaptionOff24 = 0xE37F, + ClosedCaptionOff28 = 0xE380, + ClosedCaptionOff48 = 0xE381, + Cloud16 = 0xE382, + Cloud28 = 0xE383, + Cloud32 = 0xE384, + CloudAdd20 = 0xE385, + CloudArchive16 = 0xE386, + CloudArchive20 = 0xE387, + CloudArchive24 = 0xE388, + CloudArchive28 = 0xE389, + CloudArchive32 = 0xE38A, + CloudArchive48 = 0xE38B, + CloudArrowDown16 = 0xE38C, + CloudArrowDown20 = 0xE38D, + CloudArrowDown24 = 0xE38E, + CloudArrowDown28 = 0xE38F, + CloudArrowDown32 = 0xE390, + CloudArrowDown48 = 0xE391, + CloudArrowUp16 = 0xE392, + CloudArrowUp20 = 0xE393, + CloudArrowUp24 = 0xE394, + CloudArrowUp28 = 0xE395, + CloudArrowUp32 = 0xE396, + CloudArrowUp48 = 0xE397, + CloudCheckmark16 = 0xE398, + CloudCheckmark20 = 0xE399, + CloudCheckmark24 = 0xE39A, + CloudCheckmark28 = 0xE39B, + CloudCheckmark32 = 0xE39C, + CloudCheckmark48 = 0xE39D, + CloudDismiss16 = 0xE39E, + CloudDismiss20 = 0xE39F, + CloudDismiss24 = 0xE3A0, + CloudDismiss28 = 0xE3A1, + CloudDismiss32 = 0xE3A2, + CloudDismiss48 = 0xE3A3, + CloudEdit20 = 0xE3A4, + CloudFlow24 = 0xE3A5, + CloudLink20 = 0xE3A6, + CloudOff16 = 0xE3A7, + CloudOff20 = 0xE3A8, + CloudOff28 = 0xE3A9, + CloudOff32 = 0xE3AA, + CloudSwap20 = 0xE3AB, + CloudSwap24 = 0xE3AC, + CloudSync16 = 0xE3AD, + CloudSync20 = 0xE3AE, + CloudSync24 = 0xE3AF, + CloudSync28 = 0xE3B0, + CloudSync32 = 0xE3B1, + CloudSync48 = 0xE3B2, + CloudWords16 = 0xE3B3, + CloudWords20 = 0xE3B4, + CloudWords24 = 0xE3B5, + CloudWords28 = 0xE3B6, + CloudWords32 = 0xE3B7, + CloudWords48 = 0xE3B8, + CodeCircle20 = 0xE3B9, + CodeText20 = 0xE3BA, + CodeTextEdit20 = 0xE3BB, + Color16 = 0xE3BC, + ColorBackgroundAccent20 = 0xE3BD, + ColorBackgroundAccent24 = 0xE3BE, + ColorFill16 = 0xE3BF, + ColorFill28 = 0xE3C0, + ColorFillAccent16 = 0xE3C1, + ColorFillAccent20 = 0xE3C2, + ColorFillAccent24 = 0xE3C3, + ColorFillAccent28 = 0xE3C4, + ColorLine16 = 0xE3C5, + ColorLineAccent16 = 0xE3C6, + ColorLineAccent20 = 0xE3C7, + ColorLineAccent24 = 0xE3C8, + Column20 = 0xE3C9, + ColumnArrowRight20 = 0xE3CA, + ColumnDoubleCompare20 = 0xE3CB, + ColumnEdit20 = 0xE3CC, + ColumnEdit24 = 0xE3CD, + ColumnTriple20 = 0xE3CE, + ColumnTripleEdit20 = 0xE3CF, + ColumnTripleEdit24 = 0xE3D0, + Comma20 = 0xE3D1, + Comma24 = 0xE3D2, + Comment12 = 0xE3D3, + Comment28 = 0xE3D4, + Comment48 = 0xE3D5, + CommentAdd12 = 0xE3D6, + CommentAdd16 = 0xE3D7, + CommentAdd20 = 0xE3D8, + CommentAdd28 = 0xE3D9, + CommentAdd48 = 0xE3DA, + CommentArrowLeft12 = 0xE3DB, + CommentArrowLeft16 = 0xE3DC, + CommentArrowLeft20 = 0xE3DD, + CommentArrowLeft24 = 0xE3DE, + CommentArrowLeft28 = 0xE3DF, + CommentArrowLeft48 = 0xE3E0, + CommentArrowRight12 = 0xE3E1, + CommentArrowRight16 = 0xE3E2, + CommentArrowRight20 = 0xE3E3, + CommentArrowRight24 = 0xE3E4, + CommentArrowRight28 = 0xE3E5, + CommentArrowRight48 = 0xE3E6, + CommentCheckmark12 = 0xE3E7, + CommentCheckmark16 = 0xE3E8, + CommentCheckmark20 = 0xE3E9, + CommentCheckmark24 = 0xE3EA, + CommentCheckmark28 = 0xE3EB, + CommentCheckmark48 = 0xE3EC, + CommentDismiss20 = 0xE3ED, + CommentDismiss24 = 0xE3EE, + CommentEdit20 = 0xE3EF, + CommentEdit24 = 0xE3F0, + CommentError20 = 0xE3F1, + CommentError24 = 0xE3F2, + CommentMultiple28 = 0xE3F3, + CommentMultiple32 = 0xE3F4, + CommentMultipleCheckmark16 = 0xE3F5, + CommentMultipleCheckmark20 = 0xE3F6, + CommentMultipleCheckmark24 = 0xE3F7, + CommentMultipleCheckmark28 = 0xE3F8, + CommentMultipleLink16 = 0xE3F9, + CommentMultipleLink20 = 0xE3FA, + CommentMultipleLink24 = 0xE3FB, + CommentMultipleLink28 = 0xE3FC, + CommentMultipleLink32 = 0xE3FD, + CommentNote20 = 0xE3FE, + CommentNote24 = 0xE3FF, + CommentOff16 = 0xE400, + CommentOff20 = 0xE401, + CommentOff24 = 0xE402, + CommentOff28 = 0xE403, + CommentOff48 = 0xE404, + CommunicationPerson20 = 0xE405, + CommunicationPerson24 = 0xE406, + Component2DoubleTapSwipeDown24 = 0xE407, + Component2DoubleTapSwipeUp24 = 0xE408, + ContactCard28 = 0xE409, + ContactCard32 = 0xE40A, + ContactCard48 = 0xE40B, + ContactCardGroup16 = 0xE40C, + ContactCardGroup20 = 0xE40D, + ContactCardGroup28 = 0xE40E, + ContactCardGroup48 = 0xE40F, + ContactCardLink20 = 0xE410, + ContactCardRibbon16 = 0xE411, + ContactCardRibbon20 = 0xE412, + ContactCardRibbon24 = 0xE413, + ContactCardRibbon28 = 0xE414, + ContactCardRibbon32 = 0xE415, + ContactCardRibbon48 = 0xE416, + ContentSettings32 = 0xE417, + ContentView20 = 0xE418, + ContentView32 = 0xE419, + ContentViewGallery20 = 0xE41A, + ControlButton20 = 0xE41B, + ControlButton24 = 0xE41C, + ConvertRange20 = 0xE41D, + ConvertRange24 = 0xE41E, + CopyAdd20 = 0xE41F, + CopyAdd24 = 0xE420, + CopyArrowRight16 = 0xE421, + CopyArrowRight20 = 0xE422, + CopyArrowRight24 = 0xE423, + CopySelect20 = 0xE424, + Couch12 = 0xE425, + Couch20 = 0xE426, + Couch24 = 0xE427, + CreditCardPerson20 = 0xE428, + CreditCardPerson24 = 0xE429, + CreditCardToolbox24 = 0xE42A, + Crop20 = 0xE42B, + CropInterim20 = 0xE42C, + CropInterimOff20 = 0xE42D, + Cube12 = 0xE42E, + CubeAdd20 = 0xE42F, + CubeArrowCurveDown20 = 0xE430, + CubeLink20 = 0xE431, + CubeMultiple20 = 0xE432, + CubeMultiple24 = 0xE433, + CubeQuick16 = 0xE434, + CubeQuick20 = 0xE435, + CubeQuick24 = 0xE436, + CubeQuick28 = 0xE437, + CubeRotate20 = 0xE438, + CubeSync20 = 0xE439, + CubeSync24 = 0xE43A, + CubeTree20 = 0xE43B, + CubeTree24 = 0xE43C, + CurrencyDollarEuro16 = 0xE43D, + CurrencyDollarEuro20 = 0xE43E, + CurrencyDollarEuro24 = 0xE43F, + CurrencyDollarRupee16 = 0xE440, + CurrencyDollarRupee20 = 0xE441, + CurrencyDollarRupee24 = 0xE442, + Cursor20 = 0xE443, + Cursor24 = 0xE444, + CursorClick20 = 0xE445, + CursorClick24 = 0xE446, + CursorHover16 = 0xE447, + CursorHover20 = 0xE448, + CursorHover24 = 0xE449, + CursorHover28 = 0xE44A, + CursorHover32 = 0xE44B, + CursorHover48 = 0xE44C, + CursorHoverOff16 = 0xE44D, + CursorHoverOff20 = 0xE44E, + CursorHoverOff24 = 0xE44F, + CursorHoverOff28 = 0xE450, + CursorHoverOff48 = 0xE451, + DarkTheme20 = 0xE452, + DataArea20 = 0xE453, + DataBarVerticalAdd20 = 0xE454, + DataBarVerticalAdd24 = 0xE455, + DataFunnel20 = 0xE456, + DataHistogram20 = 0xE457, + DataLine20 = 0xE458, + DataScatter20 = 0xE459, + DataSunburst20 = 0xE45A, + DataTreemap20 = 0xE45B, + DataTrending16 = 0xE45C, + DataTrending20 = 0xE45D, + DataTrending24 = 0xE45E, + DataUsage20 = 0xE45F, + DataUsageEdit24 = 0xE460, + DataUsageSettings20 = 0xE461, + DataUsageToolbox20 = 0xE462, + DataUsageToolbox24 = 0xE463, + DataWaterfall20 = 0xE464, + DataWhisker20 = 0xE465, + Database20 = 0xE466, + Database24 = 0xE467, + DatabaseArrowDown20 = 0xE468, + DatabaseArrowRight20 = 0xE469, + DatabaseArrowUp20 = 0xE46A, + DatabaseLightning20 = 0xE46B, + DatabaseLink20 = 0xE46C, + DatabaseLink24 = 0xE46D, + DatabaseMultiple20 = 0xE46E, + DatabasePerson20 = 0xE46F, + DatabasePerson24 = 0xE470, + DatabasePlugConnected20 = 0xE471, + DatabaseSearch20 = 0xE472, + DatabaseSearch24 = 0xE473, + DatabaseSwitch20 = 0xE474, + DatabaseWarning20 = 0xE475, + DatabaseWindow20 = 0xE476, + DecimalArrowLeft20 = 0xE477, + DecimalArrowLeft24 = 0xE478, + DecimalArrowRight20 = 0xE479, + DecimalArrowRight24 = 0xE47A, + Delete16 = 0xE47B, + DeleteArrowBack16 = 0xE47C, + DeleteArrowBack20 = 0xE47D, + DeleteDismiss20 = 0xE47E, + DeleteDismiss24 = 0xE47F, + DeleteDismiss28 = 0xE480, + DeleteLines20 = 0xE481, + Dentist12 = 0xE482, + Dentist16 = 0xE483, + Dentist20 = 0xE484, + Dentist28 = 0xE485, + Dentist48 = 0xE486, + Desktop32 = 0xE487, + DesktopArrowRight16 = 0xE488, + DesktopArrowRight20 = 0xE489, + DesktopArrowRight24 = 0xE48A, + DesktopCursor16 = 0xE48B, + DesktopCursor20 = 0xE48C, + DesktopCursor24 = 0xE48D, + DesktopCursor28 = 0xE48E, + DesktopEdit16 = 0xE48F, + DesktopEdit20 = 0xE490, + DesktopEdit24 = 0xE491, + DesktopFlow20 = 0xE492, + DesktopFlow24 = 0xE493, + DesktopKeyboard16 = 0xE494, + DesktopKeyboard20 = 0xE495, + DesktopKeyboard24 = 0xE496, + DesktopKeyboard28 = 0xE497, + DesktopMac16 = 0xE498, + DesktopMac20 = 0xE499, + DesktopMac24 = 0xE49A, + DesktopMac32 = 0xE49B, + DesktopPulse16 = 0xE49C, + DesktopPulse20 = 0xE49D, + DesktopPulse24 = 0xE49E, + DesktopPulse28 = 0xE49F, + DesktopPulse32 = 0xE4A0, + DesktopPulse48 = 0xE4A1, + DesktopSignal20 = 0xE4A2, + DesktopSignal24 = 0xE4A3, + DesktopSpeaker20 = 0xE4A4, + DesktopSpeaker24 = 0xE4A5, + DesktopSpeakerOff20 = 0xE4A6, + DesktopSpeakerOff24 = 0xE4A7, + DesktopSync20 = 0xE4A8, + DesktopSync24 = 0xE4A9, + DesktopToolbox20 = 0xE4AA, + DesktopToolbox24 = 0xE4AB, + DeveloperBoard20 = 0xE4AC, + DeveloperBoardLightning20 = 0xE4AD, + DeveloperBoardLightningToolbox20 = 0xE4AE, + DeveloperBoardSearch20 = 0xE4AF, + DeveloperBoardSearch24 = 0xE4B0, + DeviceEq20 = 0xE4B1, + DeviceMeetingRoom20 = 0xE4B2, + DeviceMeetingRoomRemote20 = 0xE4B3, + Diagram20 = 0xE4B4, + Diagram24 = 0xE4B5, + Dialpad28 = 0xE4B6, + Dialpad32 = 0xE4B7, + Dialpad48 = 0xE4B8, + DialpadOff20 = 0xE4B9, + Diamond16 = 0xE4BA, + Diamond20 = 0xE4BB, + Diamond24 = 0xE4BC, + Diamond28 = 0xE4BD, + Diamond32 = 0xE4BE, + Diamond48 = 0xE4BF, + Directions16 = 0xE4C0, + DismissCircle12 = 0xE4C1, + DismissCircle28 = 0xE4C2, + DismissCircle32 = 0xE4C3, + DismissSquare20 = 0xE4C4, + DismissSquare24 = 0xE4C5, + DismissSquareMultiple16 = 0xE4C6, + DismissSquareMultiple20 = 0xE4C7, + Diversity20 = 0xE4C8, + Diversity24 = 0xE4C9, + Diversity28 = 0xE4CA, + Diversity48 = 0xE4CB, + DividerShort16 = 0xE4CC, + DividerShort20 = 0xE4CD, + DividerTall16 = 0xE4CE, + DividerTall20 = 0xE4CF, + Dock20 = 0xE4D0, + DockRow20 = 0xE4D1, + Doctor12 = 0xE4D2, + Doctor16 = 0xE4D3, + Doctor20 = 0xE4D4, + Doctor28 = 0xE4D5, + Doctor48 = 0xE4D6, + Document16 = 0xE4D7, + Document32 = 0xE4D8, + Document48 = 0xE4D9, + DocumentAdd16 = 0xE4DA, + DocumentAdd20 = 0xE4DB, + DocumentAdd24 = 0xE4DC, + DocumentAdd28 = 0xE4DD, + DocumentAdd48 = 0xE4DE, + DocumentArrowDown16 = 0xE4DF, + DocumentArrowDown20 = 0xE4E0, + DocumentArrowLeft16 = 0xE4E1, + DocumentArrowLeft20 = 0xE4E2, + DocumentArrowLeft24 = 0xE4E3, + DocumentArrowLeft28 = 0xE4E4, + DocumentArrowLeft48 = 0xE4E5, + DocumentArrowRight20 = 0xE4E6, + DocumentArrowRight24 = 0xE4E7, + DocumentArrowUp20 = 0xE4E8, + DocumentBulletListClock20 = 0xE4E9, + DocumentBulletListClock24 = 0xE4EA, + DocumentBulletListMultiple20 = 0xE4EB, + DocumentBulletListMultiple24 = 0xE4EC, + DocumentBulletListOff20 = 0xE4ED, + DocumentBulletListOff24 = 0xE4EE, + DocumentCatchUp16 = 0xE4EF, + DocumentCatchUp20 = 0xE4F0, + DocumentCheckmark20 = 0xE4F1, + DocumentCheckmark24 = 0xE4F2, + DocumentChevronDouble20 = 0xE4F3, + DocumentChevronDouble24 = 0xE4F4, + DocumentCss20 = 0xE4F5, + DocumentCss24 = 0xE4F6, + DocumentData20 = 0xE4F7, + DocumentData24 = 0xE4F8, + DocumentDismiss16 = 0xE4F9, + DocumentFlowchart20 = 0xE4FA, + DocumentFlowchart24 = 0xE4FB, + DocumentFooter16 = 0xE4FC, + DocumentFooter20 = 0xE4FD, + DocumentFooterDismiss20 = 0xE4FE, + DocumentFooterDismiss24 = 0xE4FF, + DocumentHeader16 = 0xE500, + DocumentHeader20 = 0xE501, + DocumentHeaderArrowDown16 = 0xE502, + DocumentHeaderArrowDown20 = 0xE503, + DocumentHeaderArrowDown24 = 0xE504, + DocumentHeaderDismiss20 = 0xE505, + DocumentHeaderDismiss24 = 0xE506, + DocumentHeaderFooter16 = 0xE507, + DocumentHeart20 = 0xE508, + DocumentHeart24 = 0xE509, + DocumentHeartPulse20 = 0xE50A, + DocumentHeartPulse24 = 0xE50B, + DocumentJavascript20 = 0xE50C, + DocumentJavascript24 = 0xE50D, + DocumentLandscapeData20 = 0xE50E, + DocumentLandscapeData24 = 0xE50F, + DocumentLandscapeSplit20 = 0xE510, + DocumentLandscapeSplit24 = 0xE511, + DocumentLandscapeSplitHint20 = 0xE512, + DocumentLink16 = 0xE513, + DocumentLock16 = 0xE514, + DocumentLock20 = 0xE515, + DocumentLock24 = 0xE516, + DocumentLock28 = 0xE517, + DocumentLock32 = 0xE518, + DocumentLock48 = 0xE519, + DocumentMention16 = 0xE51A, + DocumentMention20 = 0xE51B, + DocumentMention24 = 0xE51C, + DocumentMention28 = 0xE51D, + DocumentMention48 = 0xE51E, + DocumentMultiple16 = 0xE51F, + DocumentMultiple20 = 0xE520, + DocumentMultiple24 = 0xE521, + DocumentMultiplePercent20 = 0xE522, + DocumentMultiplePercent24 = 0xE523, + DocumentMultipleProhibited20 = 0xE524, + DocumentMultipleProhibited24 = 0xE525, + DocumentMultipleSync20 = 0xE526, + DocumentPageBreak20 = 0xE527, + DocumentPdf32 = 0xE528, + DocumentPercent20 = 0xE529, + DocumentPercent24 = 0xE52A, + DocumentPerson20 = 0xE52B, + DocumentPill20 = 0xE52C, + DocumentPill24 = 0xE52D, + DocumentProhibited20 = 0xE52E, + DocumentProhibited24 = 0xE52F, + DocumentQuestionMark16 = 0xE530, + DocumentQuestionMark20 = 0xE531, + DocumentQuestionMark24 = 0xE532, + DocumentQueue20 = 0xE533, + DocumentQueue24 = 0xE534, + DocumentQueueAdd20 = 0xE535, + DocumentQueueAdd24 = 0xE536, + DocumentQueueMultiple20 = 0xE537, + DocumentQueueMultiple24 = 0xE538, + DocumentRibbon16 = 0xE539, + DocumentRibbon20 = 0xE53A, + DocumentRibbon24 = 0xE53B, + DocumentRibbon28 = 0xE53C, + DocumentRibbon32 = 0xE53D, + DocumentRibbon48 = 0xE53E, + DocumentSave20 = 0xE53F, + DocumentSave24 = 0xE540, + DocumentSearch16 = 0xE541, + DocumentSettings20 = 0xE542, + DocumentSplitHint16 = 0xE543, + DocumentSplitHint20 = 0xE544, + DocumentSplitHintOff16 = 0xE545, + DocumentSplitHintOff20 = 0xE546, + DocumentSync16 = 0xE547, + DocumentSync20 = 0xE548, + DocumentSync24 = 0xE549, + DocumentTable16 = 0xE54A, + DocumentTable20 = 0xE54B, + DocumentTable24 = 0xE54C, + DocumentTableArrowRight20 = 0xE54D, + DocumentTableArrowRight24 = 0xE54E, + DocumentTableCheckmark20 = 0xE54F, + DocumentTableCheckmark24 = 0xE550, + DocumentTableCube20 = 0xE551, + DocumentTableCube24 = 0xE552, + DocumentTableSearch20 = 0xE553, + DocumentTableSearch24 = 0xE554, + DocumentTableTruck20 = 0xE555, + DocumentTableTruck24 = 0xE556, + DocumentText20 = 0xE557, + DocumentText24 = 0xE558, + DocumentTextClock20 = 0xE559, + DocumentTextClock24 = 0xE55A, + DocumentTextExtract20 = 0xE55B, + DocumentTextExtract24 = 0xE55C, + DocumentTextLink20 = 0xE55D, + DocumentTextLink24 = 0xE55E, + DocumentTextToolbox20 = 0xE55F, + DocumentTextToolbox24 = 0xE560, + Door16 = 0xE561, + Door20 = 0xE562, + Door28 = 0xE563, + DoorArrowLeft16 = 0xE564, + DoorArrowLeft20 = 0xE565, + DoorArrowLeft24 = 0xE566, + DoorArrowRight16 = 0xE567, + DoorArrowRight20 = 0xE568, + DoorArrowRight28 = 0xE569, + DoorTag20 = 0xE56A, + DoorTag24 = 0xE56B, + DoubleSwipeDown20 = 0xE56C, + DoubleSwipeUp20 = 0xE56D, + DoubleTapSwipeDown20 = 0xE56E, + DoubleTapSwipeDown24 = 0xE56F, + DoubleTapSwipeUp20 = 0xE570, + DoubleTapSwipeUp24 = 0xE571, + Drag20 = 0xE572, + DrawImage20 = 0xE573, + DrawImage24 = 0xE574, + DrawShape20 = 0xE575, + DrawShape24 = 0xE576, + DrawText20 = 0xE577, + DrawText24 = 0xE578, + DrawerAdd20 = 0xE579, + DrawerAdd24 = 0xE57A, + DrawerArrowDownload20 = 0xE57B, + DrawerArrowDownload24 = 0xE57C, + DrawerDismiss20 = 0xE57D, + DrawerDismiss24 = 0xE57E, + DrawerPlay20 = 0xE57F, + DrawerPlay24 = 0xE580, + DrawerSubtract20 = 0xE581, + DrawerSubtract24 = 0xE582, + DrinkBeer16 = 0xE583, + DrinkBeer20 = 0xE584, + DrinkCoffee16 = 0xE585, + DrinkMargarita16 = 0xE586, + DrinkMargarita20 = 0xE587, + DrinkToGo20 = 0xE588, + DrinkToGo24 = 0xE589, + DrinkWine16 = 0xE58A, + DrinkWine20 = 0xE58B, + DriveTrain20 = 0xE58C, + DriveTrain24 = 0xE58D, + Drop12 = 0xE58E, + Drop16 = 0xE58F, + Drop20 = 0xE590, + Drop24 = 0xE591, + Drop28 = 0xE592, + Drop48 = 0xE593, + DualScreen20 = 0xE594, + DualScreenAdd20 = 0xE595, + DualScreenArrowRight20 = 0xE596, + DualScreenArrowUp20 = 0xE597, + DualScreenArrowUp24 = 0xE598, + DualScreenClock20 = 0xE599, + DualScreenClosedAlert20 = 0xE59A, + DualScreenClosedAlert24 = 0xE59B, + DualScreenDesktop20 = 0xE59C, + DualScreenDismiss20 = 0xE59D, + DualScreenDismiss24 = 0xE59E, + DualScreenGroup20 = 0xE59F, + DualScreenHeader20 = 0xE5A0, + DualScreenLock20 = 0xE5A1, + DualScreenMirror20 = 0xE5A2, + DualScreenPagination20 = 0xE5A3, + DualScreenSettings20 = 0xE5A4, + DualScreenSpan20 = 0xE5A5, + DualScreenSpan24 = 0xE5A6, + DualScreenSpeaker20 = 0xE5A7, + DualScreenSpeaker24 = 0xE5A8, + DualScreenStatusBar20 = 0xE5A9, + DualScreenTablet20 = 0xE5AA, + DualScreenUpdate20 = 0xE5AB, + DualScreenVerticalScroll20 = 0xE5AC, + DualScreenVibrate20 = 0xE5AD, + Dumbbell16 = 0xE5AE, + Dumbbell20 = 0xE5AF, + Dumbbell24 = 0xE5B0, + Dumbbell28 = 0xE5B1, + Edit28 = 0xE5B2, + Edit32 = 0xE5B3, + Edit48 = 0xE5B4, + EditArrowBack20 = 0xE5B5, + EditOff16 = 0xE5B6, + EditOff20 = 0xE5B7, + EditOff24 = 0xE5B8, + EditOff28 = 0xE5B9, + EditOff32 = 0xE5BA, + EditOff48 = 0xE5BB, + EditProhibited16 = 0xE5BC, + EditProhibited20 = 0xE5BD, + EditProhibited24 = 0xE5BE, + EditProhibited28 = 0xE5BF, + EditProhibited32 = 0xE5C0, + EditProhibited48 = 0xE5C1, + EditSettings20 = 0xE5C2, + EditSettings24 = 0xE5C3, + Emoji28 = 0xE5C4, + Emoji32 = 0xE5C5, + Emoji48 = 0xE5C6, + EmojiAdd16 = 0xE5C7, + EmojiAdd20 = 0xE5C8, + EmojiEdit16 = 0xE5C9, + EmojiEdit20 = 0xE5CA, + EmojiEdit24 = 0xE5CB, + EmojiEdit28 = 0xE5CC, + EmojiEdit48 = 0xE5CD, + EmojiHand20 = 0xE5CE, + EmojiHand24 = 0xE5CF, + EmojiHand28 = 0xE5D0, + EmojiLaugh16 = 0xE5D1, + EmojiMultiple20 = 0xE5D2, + EmojiMultiple24 = 0xE5D3, + EmojiSad16 = 0xE5D4, + EmojiSadSlight20 = 0xE5D5, + EmojiSadSlight24 = 0xE5D6, + EmojiSmileSlight20 = 0xE5D7, + EmojiSmileSlight24 = 0xE5D8, + EmojiSparkle16 = 0xE5D9, + EmojiSparkle20 = 0xE5DA, + EmojiSparkle24 = 0xE5DB, + EmojiSparkle28 = 0xE5DC, + EmojiSparkle32 = 0xE5DD, + EmojiSparkle48 = 0xE5DE, + Engine20 = 0xE5DF, + Engine24 = 0xE5E0, + EqualCircle20 = 0xE5E1, + EqualCircle24 = 0xE5E2, + EqualOff24 = 0xE5E3, + Eraser20 = 0xE5E4, + Eraser24 = 0xE5E5, + EraserMedium20 = 0xE5E6, + EraserMedium24 = 0xE5E7, + EraserSegment20 = 0xE5E8, + EraserSegment24 = 0xE5E9, + EraserSmall20 = 0xE5EA, + EraserSmall24 = 0xE5EB, + EraserTool20 = 0xE5EC, + ErrorCircle12 = 0xE5ED, + ErrorCircleSettings20 = 0xE5EE, + ExtendedDock20 = 0xE5EF, + Eye12 = 0xE5F0, + Eye16 = 0xE5F1, + Eye20 = 0xE5F2, + Eye24 = 0xE5F3, + EyeOff16 = 0xE5F4, + EyeOff20 = 0xE5F5, + EyeOff24 = 0xE5F6, + EyeTracking16 = 0xE5F7, + EyeTracking20 = 0xE5F8, + EyeTracking24 = 0xE5F9, + EyeTrackingOff16 = 0xE5FA, + EyeTrackingOff20 = 0xE5FB, + EyeTrackingOff24 = 0xE5FC, + Eyedropper20 = 0xE5FD, + Eyedropper24 = 0xE5FE, + EyedropperOff20 = 0xE5FF, + EyedropperOff24 = 0xE600, + FStop16 = 0xE601, + FStop20 = 0xE602, + FStop24 = 0xE603, + FStop28 = 0xE604, + FastAcceleration20 = 0xE605, + FastForward16 = 0xE606, + FastForward28 = 0xE607, + Fax20 = 0xE608, + Filter12 = 0xE609, + Filter16 = 0xE60A, + FilterAdd20 = 0xE60B, + FilterDismiss16 = 0xE60C, + FilterDismiss20 = 0xE60D, + FilterDismiss24 = 0xE60E, + FilterSync20 = 0xE60F, + FilterSync24 = 0xE610, + Fingerprint20 = 0xE611, + Fingerprint48 = 0xE612, + FixedWidth20 = 0xE613, + FixedWidth24 = 0xE614, + FlagOff16 = 0xE615, + FlagOff20 = 0xE616, + Flash16 = 0xE617, + Flash20 = 0xE618, + Flash24 = 0xE619, + Flash28 = 0xE61A, + FlashAdd20 = 0xE61B, + FlashAuto20 = 0xE61C, + FlashCheckmark16 = 0xE61D, + FlashCheckmark20 = 0xE61E, + FlashCheckmark24 = 0xE61F, + FlashCheckmark28 = 0xE620, + FlashFlow16 = 0xE621, + FlashFlow20 = 0xE622, + FlashFlow24 = 0xE623, + FlashOff20 = 0xE624, + FlashPlay20 = 0xE625, + FlashSettings20 = 0xE626, + FlashSettings24 = 0xE627, + Flashlight16 = 0xE628, + Flashlight20 = 0xE629, + FlashlightOff20 = 0xE62A, + FlipHorizontal16 = 0xE62B, + FlipHorizontal20 = 0xE62C, + FlipHorizontal24 = 0xE62D, + FlipHorizontal28 = 0xE62E, + FlipHorizontal32 = 0xE62F, + FlipHorizontal48 = 0xE630, + FlipVertical16 = 0xE631, + FlipVertical20 = 0xE632, + FlipVertical24 = 0xE633, + FlipVertical28 = 0xE634, + FlipVertical32 = 0xE635, + FlipVertical48 = 0xE636, + Flow20 = 0xE637, + Flowchart20 = 0xE638, + Flowchart24 = 0xE639, + FlowchartCircle20 = 0xE63A, + FlowchartCircle24 = 0xE63B, + Fluent20 = 0xE63C, + Fluent24 = 0xE63D, + Fluent32 = 0xE63E, + Fluent48 = 0xE63F, + Fluid16 = 0xE640, + Fluid20 = 0xE641, + Fluid24 = 0xE642, + Folder16 = 0xE643, + Folder32 = 0xE644, + FolderAdd16 = 0xE645, + FolderArrowLeft16 = 0xE646, + FolderArrowLeft20 = 0xE647, + FolderArrowLeft24 = 0xE648, + FolderArrowLeft28 = 0xE649, + FolderArrowLeft32 = 0xE64A, + FolderArrowRight16 = 0xE64B, + FolderArrowRight20 = 0xE64C, + FolderArrowRight24 = 0xE64D, + FolderArrowRight28 = 0xE64E, + FolderArrowRight48 = 0xE64F, + FolderArrowUp16 = 0xE650, + FolderArrowUp20 = 0xE651, + FolderArrowUp24 = 0xE652, + FolderArrowUp28 = 0xE653, + FolderArrowUp48 = 0xE654, + FolderGlobe20 = 0xE655, + FolderMail16 = 0xE656, + FolderMail20 = 0xE657, + FolderMail24 = 0xE658, + FolderMail28 = 0xE659, + FolderPerson20 = 0xE65A, + FolderProhibited16 = 0xE65B, + FolderProhibited20 = 0xE65C, + FolderProhibited24 = 0xE65D, + FolderProhibited28 = 0xE65E, + FolderProhibited48 = 0xE65F, + FolderSwap16 = 0xE660, + FolderSwap20 = 0xE661, + FolderSwap24 = 0xE662, + FolderSync16 = 0xE663, + FolderSync20 = 0xE664, + FolderSync24 = 0xE665, + Food16 = 0xE666, + FoodApple20 = 0xE667, + FoodApple24 = 0xE668, + FoodCake12 = 0xE669, + FoodCake16 = 0xE66A, + FoodCake20 = 0xE66B, + FoodEgg16 = 0xE66C, + FoodEgg20 = 0xE66D, + FoodGrains20 = 0xE66E, + FoodGrains24 = 0xE66F, + FoodPizza20 = 0xE670, + FoodPizza24 = 0xE671, + FoodToast16 = 0xE672, + FoodToast20 = 0xE673, + FormNew20 = 0xE674, + Fps12020 = 0xE675, + Fps12024 = 0xE676, + Fps24020 = 0xE677, + Fps3016 = 0xE678, + Fps3020 = 0xE679, + Fps3024 = 0xE67A, + Fps3028 = 0xE67B, + Fps3048 = 0xE67C, + Fps6016 = 0xE67D, + Fps6020 = 0xE67E, + Fps6024 = 0xE67F, + Fps6028 = 0xE680, + Fps6048 = 0xE681, + Fps96020 = 0xE682, + FullScreenMaximize16 = 0xE683, + FullScreenMaximize20 = 0xE684, + FullScreenMaximize24 = 0xE685, + FullScreenMinimize16 = 0xE686, + FullScreenMinimize20 = 0xE687, + FullScreenMinimize24 = 0xE688, + Games16 = 0xE689, + Games20 = 0xE68A, + Games28 = 0xE68B, + Games32 = 0xE68C, + Games48 = 0xE68D, + GanttChart20 = 0xE68E, + GanttChart24 = 0xE68F, + Gas20 = 0xE690, + Gas24 = 0xE691, + GasPump20 = 0xE692, + GasPump24 = 0xE693, + Gather20 = 0xE694, + GaugeAdd20 = 0xE695, + Gavel20 = 0xE696, + Gavel24 = 0xE697, + Gavel32 = 0xE698, + Gesture20 = 0xE699, + Gif16 = 0xE69A, + Gift16 = 0xE69B, + GiftCard24 = 0xE69C, + GiftCardAdd24 = 0xE69D, + GiftCardArrowRight20 = 0xE69E, + GiftCardArrowRight24 = 0xE69F, + GiftCardMoney20 = 0xE6A0, + GiftCardMoney24 = 0xE6A1, + GiftCardMultiple20 = 0xE6A2, + GiftCardMultiple24 = 0xE6A3, + Glance20 = 0xE6A4, + GlanceDefault12 = 0xE6A5, + GlanceHorizontal12 = 0xE6A6, + GlanceHorizontal20 = 0xE6A7, + GlanceHorizontal24 = 0xE6A8, + Glasses16 = 0xE6A9, + Glasses20 = 0xE6AA, + Glasses28 = 0xE6AB, + Glasses48 = 0xE6AC, + GlassesOff16 = 0xE6AD, + GlassesOff20 = 0xE6AE, + GlassesOff28 = 0xE6AF, + GlassesOff48 = 0xE6B0, + Globe16 = 0xE6B1, + Globe32 = 0xE6B2, + GlobeAdd20 = 0xE6B3, + GlobeClock16 = 0xE6B4, + GlobeClock20 = 0xE6B5, + GlobeDesktop20 = 0xE6B6, + GlobePerson20 = 0xE6B7, + GlobePerson24 = 0xE6B8, + GlobeProhibited20 = 0xE6B9, + GlobeSearch20 = 0xE6BA, + GlobeShield20 = 0xE6BB, + GlobeShield24 = 0xE6BC, + GlobeStar20 = 0xE6BD, + GlobeSurface20 = 0xE6BE, + GlobeSurface24 = 0xE6BF, + GlobeVideo28 = 0xE6C0, + GlobeVideo32 = 0xE6C1, + GlobeVideo48 = 0xE6C2, + Grid16 = 0xE6C3, + GridDots20 = 0xE6C4, + GridDots24 = 0xE6C5, + GridDots28 = 0xE6C6, + GridKanban20 = 0xE6C7, + GroupDismiss20 = 0xE6C8, + GroupDismiss24 = 0xE6C9, + GroupList20 = 0xE6CA, + GroupReturn20 = 0xE6CB, + GroupReturn24 = 0xE6CC, + Guardian20 = 0xE6CD, + Guardian24 = 0xE6CE, + Guardian28 = 0xE6CF, + Guardian48 = 0xE6D0, + GuestAdd20 = 0xE6D1, + Guitar16 = 0xE6D2, + Guitar20 = 0xE6D3, + Guitar24 = 0xE6D4, + Guitar28 = 0xE6D5, + HandDraw16 = 0xE6D6, + HandDraw20 = 0xE6D7, + HandDraw24 = 0xE6D8, + HandDraw28 = 0xE6D9, + HandLeft16 = 0xE6DA, + HandLeft20 = 0xE6DB, + HandLeft24 = 0xE6DC, + HandLeft28 = 0xE6DD, + HandRight16 = 0xE6DE, + HandRight20 = 0xE6DF, + HandRight24 = 0xE6E0, + HandRight28 = 0xE6E1, + HandRightOff20 = 0xE6E2, + HardDrive20 = 0xE6E3, + HatGraduation12 = 0xE6E4, + HatGraduation16 = 0xE6E5, + HatGraduation20 = 0xE6E6, + HatGraduation24 = 0xE6E7, + Hd16 = 0xE6E8, + Hd20 = 0xE6E9, + Hd24 = 0xE6EA, + Hdr20 = 0xE6EB, + HdrOff20 = 0xE6EC, + HdrOff24 = 0xE6ED, + Headphones20 = 0xE6EE, + Headphones32 = 0xE6EF, + Headphones48 = 0xE6F0, + HeadphonesSoundWave20 = 0xE6F1, + HeadphonesSoundWave24 = 0xE6F2, + HeadphonesSoundWave28 = 0xE6F3, + HeadphonesSoundWave32 = 0xE6F4, + HeadphonesSoundWave48 = 0xE6F5, + Headset16 = 0xE6F6, + Headset20 = 0xE6F7, + Headset32 = 0xE6F8, + Headset48 = 0xE6F9, + Heart12 = 0xE6FA, + Heart32 = 0xE6FB, + Heart48 = 0xE6FC, + HeartBroken20 = 0xE6FD, + HeartCircle16 = 0xE6FE, + HeartCircle20 = 0xE6FF, + HeartCircle24 = 0xE700, + HeartPulse20 = 0xE701, + HeartPulse24 = 0xE702, + HeartPulse32 = 0xE703, + HighlightLink20 = 0xE704, + History16 = 0xE705, + History28 = 0xE706, + History32 = 0xE707, + History48 = 0xE708, + HistoryDismiss20 = 0xE709, + HistoryDismiss24 = 0xE70A, + HistoryDismiss28 = 0xE70B, + HistoryDismiss32 = 0xE70C, + HistoryDismiss48 = 0xE70D, + Home12 = 0xE70E, + Home16 = 0xE70F, + Home32 = 0xE710, + Home48 = 0xE711, + HomeAdd20 = 0xE712, + HomeCheckmark16 = 0xE713, + HomeCheckmark20 = 0xE714, + HomeDatabase20 = 0xE715, + HomeMore20 = 0xE716, + HomePerson20 = 0xE717, + HomePerson24 = 0xE718, + Image32 = 0xE719, + ImageAdd20 = 0xE71A, + ImageAltText16 = 0xE71B, + ImageArrowBack20 = 0xE71C, + ImageArrowBack24 = 0xE71D, + ImageArrowCounterclockwise20 = 0xE71E, + ImageArrowCounterclockwise24 = 0xE71F, + ImageArrowForward20 = 0xE720, + ImageArrowForward24 = 0xE721, + ImageGlobe20 = 0xE722, + ImageGlobe24 = 0xE723, + ImageMultiple16 = 0xE724, + ImageMultiple20 = 0xE725, + ImageMultiple24 = 0xE726, + ImageMultiple28 = 0xE727, + ImageMultiple32 = 0xE728, + ImageMultiple48 = 0xE729, + ImageMultipleOff16 = 0xE72A, + ImageMultipleOff20 = 0xE72B, + ImageOff20 = 0xE72C, + ImageProhibited20 = 0xE72D, + ImageProhibited24 = 0xE72E, + ImageReflection20 = 0xE72F, + ImageReflection24 = 0xE730, + ImageShadow20 = 0xE731, + ImageShadow24 = 0xE732, + ImmersiveReader16 = 0xE733, + ImmersiveReader28 = 0xE734, + Incognito20 = 0xE735, + Info12 = 0xE736, + InfoShield20 = 0xE737, + InkStroke20 = 0xE738, + InkStroke24 = 0xE739, + InkingTool32 = 0xE73A, + IosArrowLtr24 = 0xE73B, + IosArrowRtl24 = 0xE73C, + Iot20 = 0xE73D, + Iot24 = 0xE73E, + Joystick20 = 0xE73F, + Key16 = 0xE740, + Key32 = 0xE741, + KeyCommand16 = 0xE742, + KeyCommand20 = 0xE743, + KeyCommand24 = 0xE744, + KeyMultiple20 = 0xE745, + KeyReset20 = 0xE746, + KeyReset24 = 0xE747, + Keyboard12320 = 0xE748, + Keyboard12324 = 0xE749, + Keyboard16 = 0xE74A, + KeyboardDock20 = 0xE74B, + KeyboardLayoutFloat20 = 0xE74C, + KeyboardLayoutOneHandedLeft20 = 0xE74D, + KeyboardLayoutResize20 = 0xE74E, + KeyboardLayoutSplit20 = 0xE74F, + KeyboardShift16 = 0xE750, + KeyboardShift20 = 0xE751, + KeyboardShiftUppercase16 = 0xE752, + KeyboardShiftUppercase20 = 0xE753, + KeyboardTab20 = 0xE754, + LaptopDismiss20 = 0xE755, + Lasso20 = 0xE756, + Lasso28 = 0xE757, + LauncherSettings20 = 0xE758, + LeafOne16 = 0xE759, + LeafOne20 = 0xE75A, + LeafOne24 = 0xE75B, + LeafThree16 = 0xE75C, + LeafThree20 = 0xE75D, + LeafThree24 = 0xE75E, + LearningApp20 = 0xE75F, + LearningApp24 = 0xE760, + Library16 = 0xE761, + Library20 = 0xE762, + LightbulbCircle20 = 0xE763, + LightbulbFilament48 = 0xE764, + Line20 = 0xE765, + Line24 = 0xE766, + Line32 = 0xE767, + Line48 = 0xE768, + LineDashes20 = 0xE769, + LineDashes24 = 0xE76A, + LineDashes32 = 0xE76B, + LineDashes48 = 0xE76C, + LineHorizontal5Error20 = 0xE76D, + LineStyle20 = 0xE76E, + LineStyle24 = 0xE76F, + Link12 = 0xE770, + Link32 = 0xE771, + LinkDismiss16 = 0xE772, + LinkDismiss20 = 0xE773, + LinkDismiss24 = 0xE774, + LinkSquare12 = 0xE775, + LinkSquare16 = 0xE776, + LinkSquare20 = 0xE777, + LinkToolbox20 = 0xE778, + List16 = 0xE779, + LiveOff20 = 0xE77A, + LiveOff24 = 0xE77B, + Location48 = 0xE77C, + LocationAdd16 = 0xE77D, + LocationAdd20 = 0xE77E, + LocationAdd24 = 0xE77F, + LocationAddLeft20 = 0xE780, + LocationAddRight20 = 0xE781, + LocationAddUp20 = 0xE782, + LocationArrowLeft48 = 0xE783, + LocationArrowRight48 = 0xE784, + LocationArrowUp48 = 0xE785, + LocationDismiss20 = 0xE786, + LocationDismiss24 = 0xE787, + LocationOff16 = 0xE788, + LocationOff20 = 0xE789, + LocationOff24 = 0xE78A, + LocationOff28 = 0xE78B, + LocationOff48 = 0xE78C, + LockClosed12 = 0xE78D, + LockClosed16 = 0xE78E, + LockClosed20 = 0xE78F, + LockClosed24 = 0xE790, + LockClosed32 = 0xE791, + LockMultiple20 = 0xE792, + LockMultiple24 = 0xE793, + LockOpen16 = 0xE794, + LockOpen20 = 0xE795, + LockOpen24 = 0xE796, + LockOpen28 = 0xE797, + Lottery20 = 0xE798, + Lottery24 = 0xE799, + Luggage16 = 0xE79A, + Luggage20 = 0xE79B, + Luggage24 = 0xE79C, + Luggage28 = 0xE79D, + Luggage32 = 0xE79E, + Luggage48 = 0xE79F, + Mail12 = 0xE7A0, + Mail16 = 0xE7A1, + MailAlert28 = 0xE7A2, + MailAllRead16 = 0xE7A3, + MailAllRead24 = 0xE7A4, + MailAllRead28 = 0xE7A5, + MailArrowDoubleBack16 = 0xE7A6, + MailArrowDoubleBack20 = 0xE7A7, + MailArrowDown20 = 0xE7A8, + MailArrowForward16 = 0xE7A9, + MailArrowForward20 = 0xE7AA, + MailArrowUp16 = 0xE7AB, + MailAttach16 = 0xE7AC, + MailAttach20 = 0xE7AD, + MailAttach24 = 0xE7AE, + MailAttach28 = 0xE7AF, + MailCheckmark20 = 0xE7B0, + MailDismiss16 = 0xE7B1, + MailDismiss28 = 0xE7B2, + MailEdit20 = 0xE7B3, + MailEdit24 = 0xE7B4, + MailError16 = 0xE7B5, + MailInboxAll20 = 0xE7B6, + MailInboxAll24 = 0xE7B7, + MailInboxArrowDown20 = 0xE7B8, + MailInboxArrowRight20 = 0xE7B9, + MailInboxArrowRight24 = 0xE7BA, + MailInboxArrowUp20 = 0xE7BB, + MailInboxArrowUp24 = 0xE7BC, + MailInboxCheckmark16 = 0xE7BD, + MailInboxCheckmark20 = 0xE7BE, + MailInboxCheckmark24 = 0xE7BF, + MailInboxCheckmark28 = 0xE7C0, + MailList16 = 0xE7C1, + MailList20 = 0xE7C2, + MailList24 = 0xE7C3, + MailList28 = 0xE7C4, + MailMultiple16 = 0xE7C5, + MailMultiple20 = 0xE7C6, + MailMultiple24 = 0xE7C7, + MailMultiple28 = 0xE7C8, + MailOff20 = 0xE7C9, + MailOff24 = 0xE7CA, + MailOpenPerson16 = 0xE7CB, + MailOpenPerson20 = 0xE7CC, + MailOpenPerson24 = 0xE7CD, + MailPause20 = 0xE7CE, + MailProhibited16 = 0xE7CF, + MailProhibited28 = 0xE7D0, + MailRead16 = 0xE7D1, + MailReadMultiple16 = 0xE7D2, + MailReadMultiple24 = 0xE7D3, + MailReadMultiple28 = 0xE7D4, + MailSettings20 = 0xE7D5, + MailShield20 = 0xE7D6, + MailTemplate16 = 0xE7D7, + MailWarning20 = 0xE7D8, + MailWarning24 = 0xE7D9, + Map20 = 0xE7DA, + Markdown20 = 0xE7DB, + MatchAppLayout20 = 0xE7DC, + MathFormatLinear20 = 0xE7DD, + MathFormatLinear24 = 0xE7DE, + MathFormatProfessional20 = 0xE7DF, + MathFormatProfessional24 = 0xE7E0, + MathFormula16 = 0xE7E1, + MathFormula20 = 0xE7E2, + MathFormula24 = 0xE7E3, + MathFormula32 = 0xE7E4, + MathSymbols16 = 0xE7E5, + MathSymbols20 = 0xE7E6, + MathSymbols24 = 0xE7E7, + MathSymbols28 = 0xE7E8, + MathSymbols32 = 0xE7E9, + MathSymbols48 = 0xE7EA, + Maximize20 = 0xE7EB, + Maximize24 = 0xE7EC, + Maximize28 = 0xE7ED, + Maximize48 = 0xE7EE, + MeetNow16 = 0xE7EF, + MegaphoneLoud24 = 0xE7F0, + MegaphoneOff16 = 0xE7F1, + MegaphoneOff20 = 0xE7F2, + MegaphoneOff28 = 0xE7F3, + MentionArrowDown20 = 0xE7F4, + MentionBrackets20 = 0xE7F5, + Merge16 = 0xE7F6, + Merge20 = 0xE7F7, + Mic16 = 0xE7F8, + Mic20 = 0xE7F9, + Mic24 = 0xE7FA, + Mic28 = 0xE7FB, + Mic32 = 0xE7FC, + Mic48 = 0xE7FD, + MicOff20 = 0xE7FE, + MicOff32 = 0xE7FF, + MicOff48 = 0xE800, + MicProhibited16 = 0xE801, + MicProhibited20 = 0xE802, + MicProhibited24 = 0xE803, + MicProhibited28 = 0xE804, + MicProhibited48 = 0xE805, + MicPulse16 = 0xE806, + MicPulse20 = 0xE807, + MicPulse24 = 0xE808, + MicPulse28 = 0xE809, + MicPulse32 = 0xE80A, + MicPulse48 = 0xE80B, + MicPulseOff16 = 0xE80C, + MicPulseOff20 = 0xE80D, + MicPulseOff24 = 0xE80E, + MicPulseOff28 = 0xE80F, + MicPulseOff32 = 0xE810, + MicPulseOff48 = 0xE811, + MicSettings20 = 0xE812, + MicSparkle16 = 0xE813, + MicSparkle20 = 0xE814, + MicSparkle24 = 0xE815, + MicSync20 = 0xE816, + MobileOptimized20 = 0xE817, + MoneyCalculator20 = 0xE818, + MoneyCalculator24 = 0xE819, + MoneyDismiss20 = 0xE81A, + MoneyDismiss24 = 0xE81B, + MoneyHand20 = 0xE81C, + MoneyHand24 = 0xE81D, + MoneyOff20 = 0xE81E, + MoneyOff24 = 0xE81F, + MoneySettings20 = 0xE820, + MoreCircle20 = 0xE821, + MoreCircle32 = 0xE822, + MoreHorizontal16 = 0xE823, + MoreHorizontal20 = 0xE824, + MoreHorizontal24 = 0xE825, + MoreHorizontal28 = 0xE826, + MoreHorizontal32 = 0xE827, + MoreHorizontal48 = 0xE828, + MoreVertical16 = 0xE829, + MoreVertical32 = 0xE82A, + MoviesAndTv16 = 0xE82B, + MoviesAndTv20 = 0xE82C, + Multiplier12x20 = 0xE82D, + Multiplier12x24 = 0xE82E, + Multiplier12x28 = 0xE82F, + Multiplier12x32 = 0xE830, + Multiplier12x48 = 0xE831, + Multiplier15x20 = 0xE832, + Multiplier15x24 = 0xE833, + Multiplier15x28 = 0xE834, + Multiplier15x32 = 0xE835, + Multiplier15x48 = 0xE836, + Multiplier18x20 = 0xE837, + Multiplier18x24 = 0xE838, + Multiplier18x28 = 0xE839, + Multiplier18x32 = 0xE83A, + Multiplier18x48 = 0xE83B, + Multiplier1x20 = 0xE83C, + Multiplier1x24 = 0xE83D, + Multiplier1x28 = 0xE83E, + Multiplier1x32 = 0xE83F, + Multiplier1x48 = 0xE840, + Multiplier2x20 = 0xE841, + Multiplier2x24 = 0xE842, + Multiplier2x28 = 0xE843, + Multiplier2x32 = 0xE844, + Multiplier2x48 = 0xE845, + Multiplier5x20 = 0xE846, + Multiplier5x24 = 0xE847, + Multiplier5x28 = 0xE848, + Multiplier5x32 = 0xE849, + Multiplier5x48 = 0xE84A, + MultiselectLtr16 = 0xE84B, + MultiselectLtr20 = 0xE84C, + MultiselectLtr24 = 0xE84D, + MultiselectRtl16 = 0xE84E, + MultiselectRtl20 = 0xE84F, + MultiselectRtl24 = 0xE850, + MusicNote120 = 0xE851, + MusicNote124 = 0xE852, + MusicNote216 = 0xE853, + MusicNote220 = 0xE854, + MusicNote224 = 0xE855, + MusicNote2Play20 = 0xE856, + MusicNoteOff120 = 0xE857, + MusicNoteOff124 = 0xE858, + MusicNoteOff216 = 0xE859, + MusicNoteOff220 = 0xE85A, + MusicNoteOff224 = 0xE85B, + MyLocation12 = 0xE85C, + MyLocation16 = 0xE85D, + MyLocation20 = 0xE85E, + Navigation16 = 0xE85F, + NavigationLocationTarget20 = 0xE860, + NavigationPlay20 = 0xE861, + NavigationUnread20 = 0xE862, + NavigationUnread24 = 0xE863, + NetworkCheck20 = 0xE864, + New20 = 0xE865, + News16 = 0xE866, + Next28 = 0xE867, + Next32 = 0xE868, + Next48 = 0xE869, + Note28 = 0xE86A, + Note48 = 0xE86B, + NoteAdd28 = 0xE86C, + NoteAdd48 = 0xE86D, + NoteEdit20 = 0xE86E, + NoteEdit24 = 0xE86F, + NotePin20 = 0xE870, + Notebook20 = 0xE871, + NotebookAdd20 = 0xE872, + NotebookAdd24 = 0xE873, + NotebookArrowCurveDown20 = 0xE874, + NotebookError20 = 0xE875, + NotebookEye20 = 0xE876, + NotebookLightning20 = 0xE877, + NotebookQuestionMark20 = 0xE878, + NotebookSection20 = 0xE879, + NotebookSectionArrowRight24 = 0xE87A, + NotebookSubsection20 = 0xE87B, + NotebookSubsection24 = 0xE87C, + NotebookSync20 = 0xE87D, + Notepad12 = 0xE87E, + Notepad32 = 0xE87F, + NotepadEdit20 = 0xE880, + NotepadPerson16 = 0xE881, + NotepadPerson20 = 0xE882, + NotepadPerson24 = 0xE883, + NumberCircle116 = 0xE884, + NumberCircle120 = 0xE885, + NumberCircle124 = 0xE886, + NumberSymbol28 = 0xE887, + NumberSymbol32 = 0xE888, + NumberSymbol48 = 0xE889, + NumberSymbolDismiss20 = 0xE88A, + NumberSymbolDismiss24 = 0xE88B, + NumberSymbolSquare20 = 0xE88C, + NumberSymbolSquare24 = 0xE88D, + Open28 = 0xE88E, + Open48 = 0xE88F, + OpenFolder16 = 0xE890, + OpenFolder20 = 0xE891, + OpenFolder28 = 0xE892, + OpenFolder48 = 0xE893, + OpenOff16 = 0xE894, + OpenOff20 = 0xE895, + OpenOff24 = 0xE896, + OpenOff28 = 0xE897, + OpenOff48 = 0xE898, + Options48 = 0xE899, + Organization12 = 0xE89A, + Organization16 = 0xE89B, + Organization32 = 0xE89C, + Organization48 = 0xE89D, + OrganizationHorizontal20 = 0xE89E, + Orientation20 = 0xE89F, + Orientation24 = 0xE8A0, + Oval16 = 0xE8A1, + Oval20 = 0xE8A2, + Oval24 = 0xE8A3, + Oval28 = 0xE8A4, + Oval32 = 0xE8A5, + Oval48 = 0xE8A6, + PaintBrushArrowDown20 = 0xE8A7, + PaintBrushArrowDown24 = 0xE8A8, + PaintBrushArrowUp20 = 0xE8A9, + PaintBrushArrowUp24 = 0xE8AA, + Pair20 = 0xE8AB, + PanelBottom20 = 0xE8AC, + PanelBottomContract20 = 0xE8AD, + PanelBottomExpand20 = 0xE8AE, + PanelLeft16 = 0xE8AF, + PanelLeft20 = 0xE8B0, + PanelLeft24 = 0xE8B1, + PanelLeft28 = 0xE8B2, + PanelLeft48 = 0xE8B3, + PanelLeftContract16 = 0xE8B4, + PanelLeftContract20 = 0xE8B5, + PanelLeftContract24 = 0xE8B6, + PanelLeftContract28 = 0xE8B7, + PanelLeftExpand16 = 0xE8B8, + PanelLeftExpand20 = 0xE8B9, + PanelLeftExpand24 = 0xE8BA, + PanelLeftExpand28 = 0xE8BB, + PanelRight16 = 0xE8BC, + PanelRight20 = 0xE8BD, + PanelRight24 = 0xE8BE, + PanelRight28 = 0xE8BF, + PanelRight48 = 0xE8C0, + PanelRightContract16 = 0xE8C1, + PanelRightContract20 = 0xE8C2, + PanelRightContract24 = 0xE8C3, + PanelRightExpand20 = 0xE8C4, + PanelSeparateWindow20 = 0xE8C5, + PanelTopContract20 = 0xE8C6, + PanelTopExpand20 = 0xE8C7, + Password16 = 0xE8C8, + Password20 = 0xE8C9, + Patient20 = 0xE8CA, + Patient32 = 0xE8CB, + Pause12 = 0xE8CC, + Pause28 = 0xE8CD, + Pause32 = 0xE8CE, + PauseCircle24 = 0xE8CF, + PauseOff16 = 0xE8D0, + PauseOff20 = 0xE8D1, + PauseSettings16 = 0xE8D2, + PauseSettings20 = 0xE8D3, + Payment16 = 0xE8D4, + Payment28 = 0xE8D5, + Pen16 = 0xE8D6, + Pen20 = 0xE8D7, + Pen24 = 0xE8D8, + Pen28 = 0xE8D9, + Pen32 = 0xE8DA, + Pen48 = 0xE8DB, + PenOff16 = 0xE8DC, + PenOff20 = 0xE8DD, + PenOff24 = 0xE8DE, + PenOff28 = 0xE8DF, + PenOff32 = 0xE8E0, + PenOff48 = 0xE8E1, + PenProhibited16 = 0xE8E2, + PenProhibited20 = 0xE8E3, + PenProhibited24 = 0xE8E4, + PenProhibited28 = 0xE8E5, + PenProhibited32 = 0xE8E6, + PenProhibited48 = 0xE8E7, + Pentagon20 = 0xE8E8, + Pentagon32 = 0xE8E9, + Pentagon48 = 0xE8EA, + People12 = 0xE8EB, + People32 = 0xE8EC, + People48 = 0xE8ED, + PeopleAdd28 = 0xE8EE, + PeopleAudience20 = 0xE8EF, + PeopleCall16 = 0xE8F0, + PeopleCall20 = 0xE8F1, + PeopleCheckmark16 = 0xE8F2, + PeopleCheckmark20 = 0xE8F3, + PeopleCheckmark24 = 0xE8F4, + PeopleCommunityAdd20 = 0xE8F5, + PeopleCommunityAdd28 = 0xE8F6, + PeopleEdit20 = 0xE8F7, + PeopleError16 = 0xE8F8, + PeopleError20 = 0xE8F9, + PeopleError24 = 0xE8FA, + PeopleList16 = 0xE8FB, + PeopleList20 = 0xE8FC, + PeopleList24 = 0xE8FD, + PeopleList28 = 0xE8FE, + PeopleLock20 = 0xE8FF, + PeopleLock24 = 0xE900, + PeopleMoney20 = 0xE901, + PeopleMoney24 = 0xE902, + PeopleProhibited16 = 0xE903, + PeopleProhibited24 = 0xE904, + PeopleQueue20 = 0xE905, + PeopleQueue24 = 0xE906, + PeopleSearch20 = 0xE907, + PeopleSettings24 = 0xE908, + PeopleSettings28 = 0xE909, + PeopleSwap16 = 0xE90A, + PeopleSwap20 = 0xE90B, + PeopleSwap24 = 0xE90C, + PeopleSwap28 = 0xE90D, + PeopleSync20 = 0xE90E, + PeopleSync28 = 0xE90F, + PeopleTeam32 = 0xE910, + PeopleTeamAdd20 = 0xE911, + PeopleTeamAdd24 = 0xE912, + PeopleTeamDelete16 = 0xE913, + PeopleTeamDelete20 = 0xE914, + PeopleTeamDelete24 = 0xE915, + PeopleTeamDelete28 = 0xE916, + PeopleTeamDelete32 = 0xE917, + PeopleTeamToolbox20 = 0xE918, + PeopleTeamToolbox24 = 0xE919, + PeopleToolbox20 = 0xE91A, + Person32 = 0xE91B, + Person520 = 0xE91C, + Person532 = 0xE91D, + Person620 = 0xE91E, + Person632 = 0xE91F, + PersonAccounts20 = 0xE920, + PersonAdd16 = 0xE921, + PersonAdd28 = 0xE922, + PersonArrowLeft16 = 0xE923, + PersonAvailable20 = 0xE924, + PersonCall16 = 0xE925, + PersonCall20 = 0xE926, + PersonCircle12 = 0xE927, + PersonCircle20 = 0xE928, + PersonCircle24 = 0xE929, + PersonClock16 = 0xE92A, + PersonClock20 = 0xE92B, + PersonClock24 = 0xE92C, + PersonDelete20 = 0xE92D, + PersonEdit20 = 0xE92E, + PersonEdit24 = 0xE92F, + PersonFeedback16 = 0xE930, + PersonHeart24 = 0xE931, + PersonInfo20 = 0xE932, + PersonKey20 = 0xE933, + PersonLightbulb20 = 0xE934, + PersonLightbulb24 = 0xE935, + PersonLock24 = 0xE936, + PersonMail16 = 0xE937, + PersonMail20 = 0xE938, + PersonMail24 = 0xE939, + PersonMail28 = 0xE93A, + PersonMail48 = 0xE93B, + PersonMoney20 = 0xE93C, + PersonMoney24 = 0xE93D, + PersonNote20 = 0xE93E, + PersonNote24 = 0xE93F, + PersonPill20 = 0xE940, + PersonPill24 = 0xE941, + PersonProhibited16 = 0xE942, + PersonProhibited24 = 0xE943, + PersonProhibited28 = 0xE944, + PersonSettings16 = 0xE945, + PersonSettings20 = 0xE946, + PersonSubtract20 = 0xE947, + PersonSync16 = 0xE948, + PersonSync20 = 0xE949, + PersonSync24 = 0xE94A, + PersonSync28 = 0xE94B, + PersonSync32 = 0xE94C, + PersonSync48 = 0xE94D, + PersonTag20 = 0xE94E, + PersonTag24 = 0xE94F, + PersonTag28 = 0xE950, + PersonTag32 = 0xE951, + PersonTag48 = 0xE952, + Phone12 = 0xE953, + PhoneAdd20 = 0xE954, + PhoneAdd24 = 0xE955, + PhoneArrowRight20 = 0xE956, + PhoneArrowRight24 = 0xE957, + PhoneCheckmark20 = 0xE958, + PhoneDesktopAdd20 = 0xE959, + PhoneDismiss20 = 0xE95A, + PhoneDismiss24 = 0xE95B, + PhoneEraser16 = 0xE95C, + PhoneEraser20 = 0xE95D, + PhoneKey20 = 0xE95E, + PhoneKey24 = 0xE95F, + PhoneLaptop16 = 0xE960, + PhoneLaptop32 = 0xE961, + PhoneLinkSetup20 = 0xE962, + PhoneLock20 = 0xE963, + PhoneLock24 = 0xE964, + PhonePageHeader20 = 0xE965, + PhonePagination20 = 0xE966, + PhoneScreenTime20 = 0xE967, + PhoneShake20 = 0xE968, + PhoneSpanIn16 = 0xE969, + PhoneSpanIn20 = 0xE96A, + PhoneSpanIn24 = 0xE96B, + PhoneSpanIn28 = 0xE96C, + PhoneSpanOut16 = 0xE96D, + PhoneSpanOut20 = 0xE96E, + PhoneSpanOut24 = 0xE96F, + PhoneSpanOut28 = 0xE970, + PhoneSpeaker20 = 0xE971, + PhoneSpeaker24 = 0xE972, + PhoneStatusBar20 = 0xE973, + PhoneUpdate20 = 0xE974, + PhoneUpdateCheckmark20 = 0xE975, + PhoneUpdateCheckmark24 = 0xE976, + PhoneVerticalScroll20 = 0xE977, + PhoneVibrate20 = 0xE978, + PhotoFilter20 = 0xE979, + Pi20 = 0xE97A, + Pi24 = 0xE97B, + PictureInPictureEnter16 = 0xE97C, + PictureInPictureEnter20 = 0xE97D, + PictureInPictureEnter24 = 0xE97E, + PictureInPictureExit16 = 0xE97F, + PictureInPictureExit20 = 0xE980, + PictureInPictureExit24 = 0xE981, + Pin28 = 0xE982, + Pin32 = 0xE983, + Pin48 = 0xE984, + PinOff16 = 0xE985, + PinOff28 = 0xE986, + PinOff32 = 0xE987, + PinOff48 = 0xE988, + Pipeline20 = 0xE989, + PipelineAdd20 = 0xE98A, + PipelineArrowCurveDown20 = 0xE98B, + PipelinePlay20 = 0xE98C, + Pivot20 = 0xE98D, + Pivot24 = 0xE98E, + Play12 = 0xE98F, + Play16 = 0xE990, + Play28 = 0xE991, + Play32 = 0xE992, + PlayCircle16 = 0xE993, + PlayCircle20 = 0xE994, + PlayCircle28 = 0xE995, + PlayCircle48 = 0xE996, + PlaySettings20 = 0xE997, + PlayingCards20 = 0xE998, + PlugConnected20 = 0xE999, + PlugConnected24 = 0xE99A, + PlugConnectedAdd20 = 0xE99B, + PlugConnectedCheckmark20 = 0xE99C, + PointScan20 = 0xE99D, + Poll16 = 0xE99E, + Poll20 = 0xE99F, + PortHdmi20 = 0xE9A0, + PortHdmi24 = 0xE9A1, + PortMicroUsb20 = 0xE9A2, + PortMicroUsb24 = 0xE9A3, + PortUsbA20 = 0xE9A4, + PortUsbA24 = 0xE9A5, + PortUsbC20 = 0xE9A6, + PortUsbC24 = 0xE9A7, + PositionBackward20 = 0xE9A8, + PositionBackward24 = 0xE9A9, + PositionForward20 = 0xE9AA, + PositionForward24 = 0xE9AB, + PositionToBack20 = 0xE9AC, + PositionToBack24 = 0xE9AD, + PositionToFront20 = 0xE9AE, + PositionToFront24 = 0xE9AF, + Predictions20 = 0xE9B0, + Premium32 = 0xE9B1, + PremiumPerson16 = 0xE9B2, + PremiumPerson20 = 0xE9B3, + PremiumPerson24 = 0xE9B4, + PresenceAvailable10 = 0xE9B5, + PresenceAvailable12 = 0xE9B6, + PresenceAvailable16 = 0xE9B7, + PresenceAvailable20 = 0xE9B8, + PresenceAvailable24 = 0xE9B9, + PresenceBlocked20 = 0xE9BA, + PresenceBlocked24 = 0xE9BB, + PresenceDnd10 = 0xE9BC, + PresenceDnd12 = 0xE9BD, + PresenceDnd16 = 0xE9BE, + PresenceDnd20 = 0xE9BF, + PresenceDnd24 = 0xE9C0, + PresenceOffline20 = 0xE9C1, + PresenceOffline24 = 0xE9C2, + PresenceOof20 = 0xE9C3, + PresenceOof24 = 0xE9C4, + PresenceUnknown20 = 0xE9C5, + PresenceUnknown24 = 0xE9C6, + Presenter20 = 0xE9C7, + PresenterOff20 = 0xE9C8, + Previous28 = 0xE9C9, + Previous32 = 0xE9CA, + Previous48 = 0xE9CB, + Print28 = 0xE9CC, + Print32 = 0xE9CD, + PrintAdd24 = 0xE9CE, + Prohibited12 = 0xE9CF, + ProhibitedMultiple16 = 0xE9D0, + ProhibitedMultiple20 = 0xE9D1, + ProhibitedMultiple24 = 0xE9D2, + ProhibitedNote20 = 0xE9D3, + ProjectionScreen16 = 0xE9D4, + ProjectionScreen20 = 0xE9D5, + ProjectionScreen24 = 0xE9D6, + ProjectionScreen28 = 0xE9D7, + ProjectionScreenDismiss16 = 0xE9D8, + ProjectionScreenDismiss20 = 0xE9D9, + ProjectionScreenDismiss24 = 0xE9DA, + ProjectionScreenDismiss28 = 0xE9DB, + Pulse20 = 0xE9DC, + Pulse24 = 0xE9DD, + Pulse28 = 0xE9DE, + Pulse32 = 0xE9DF, + PulseSquare20 = 0xE9E0, + PulseSquare24 = 0xE9E1, + PuzzleCube16 = 0xE9E2, + PuzzleCube20 = 0xE9E3, + PuzzleCube24 = 0xE9E4, + PuzzleCube28 = 0xE9E5, + PuzzleCube48 = 0xE9E6, + PuzzleCubePiece20 = 0xE9E7, + PuzzlePiece16 = 0xE9E8, + PuzzlePiece20 = 0xE9E9, + PuzzlePiece24 = 0xE9EA, + PuzzlePieceShield20 = 0xE9EB, + QrCode20 = 0xE9EC, + QuestionCircle12 = 0xE9ED, + QuestionCircle32 = 0xE9EE, + QuizNew20 = 0xE9EF, + Radar20 = 0xE9F0, + RadarCheckmark20 = 0xE9F1, + RadarRectangleMultiple20 = 0xE9F2, + Ram20 = 0xE9F3, + ReOrderDotsHorizontal16 = 0xE9F4, + ReOrderDotsHorizontal20 = 0xE9F5, + ReOrderDotsHorizontal24 = 0xE9F6, + ReOrderDotsVertical16 = 0xE9F7, + ReOrderDotsVertical20 = 0xE9F8, + ReOrderDotsVertical24 = 0xE9F9, + ReadAloud16 = 0xE9FA, + ReadAloud28 = 0xE9FB, + RealEstate20 = 0xE9FC, + RealEstate24 = 0xE9FD, + Receipt20 = 0xE9FE, + Receipt24 = 0xE9FF, + ReceiptAdd24 = 0xEA00, + ReceiptBag24 = 0xEA01, + ReceiptCube24 = 0xEA02, + ReceiptMoney24 = 0xEA03, + ReceiptPlay20 = 0xEA04, + ReceiptPlay24 = 0xEA05, + ReceiptSearch20 = 0xEA06, + RectangleLandscape12 = 0xEA07, + RectangleLandscape16 = 0xEA08, + RectangleLandscape20 = 0xEA09, + RectangleLandscape24 = 0xEA0A, + RectangleLandscape28 = 0xEA0B, + RectangleLandscape32 = 0xEA0C, + RectangleLandscape48 = 0xEA0D, + RectanglePortraitLocationTarget20 = 0xEA0E, + Remote16 = 0xEA0F, + Remote20 = 0xEA10, + Reorder20 = 0xEA11, + Replay20 = 0xEA12, + Resize24 = 0xEA13, + ResizeImage20 = 0xEA14, + ResizeLarge16 = 0xEA15, + ResizeLarge20 = 0xEA16, + ResizeLarge24 = 0xEA17, + ResizeSmall16 = 0xEA18, + ResizeSmall20 = 0xEA19, + ResizeSmall24 = 0xEA1A, + ResizeTable20 = 0xEA1B, + ResizeVideo20 = 0xEA1C, + Rewind16 = 0xEA1D, + Rewind28 = 0xEA1E, + Rhombus16 = 0xEA1F, + Rhombus20 = 0xEA20, + Rhombus24 = 0xEA21, + Rhombus28 = 0xEA22, + Rhombus32 = 0xEA23, + Rhombus48 = 0xEA24, + Ribbon12 = 0xEA25, + Ribbon16 = 0xEA26, + Ribbon20 = 0xEA27, + Ribbon24 = 0xEA28, + Ribbon32 = 0xEA29, + RibbonOff12 = 0xEA2A, + RibbonOff16 = 0xEA2B, + RibbonOff20 = 0xEA2C, + RibbonOff24 = 0xEA2D, + RibbonOff32 = 0xEA2E, + RibbonStar20 = 0xEA2F, + RibbonStar24 = 0xEA30, + RoadCone16 = 0xEA31, + RoadCone20 = 0xEA32, + RoadCone24 = 0xEA33, + RoadCone28 = 0xEA34, + RoadCone32 = 0xEA35, + RoadCone48 = 0xEA36, + RotateLeft20 = 0xEA37, + RotateLeft24 = 0xEA38, + RotateRight20 = 0xEA39, + RotateRight24 = 0xEA3A, + Router20 = 0xEA3B, + RowTriple20 = 0xEA3C, + Rss20 = 0xEA3D, + Rss24 = 0xEA3E, + Run16 = 0xEA3F, + Run20 = 0xEA40, + Sanitize20 = 0xEA41, + Sanitize24 = 0xEA42, + Save16 = 0xEA43, + Save28 = 0xEA44, + SaveArrowRight20 = 0xEA45, + SaveArrowRight24 = 0xEA46, + SaveCopy20 = 0xEA47, + SaveEdit20 = 0xEA48, + SaveEdit24 = 0xEA49, + SaveImage20 = 0xEA4A, + SaveMultiple20 = 0xEA4B, + SaveMultiple24 = 0xEA4C, + SaveSearch20 = 0xEA4D, + SaveSync20 = 0xEA4E, + ScaleFill20 = 0xEA4F, + Scales20 = 0xEA50, + Scales24 = 0xEA51, + Scales32 = 0xEA52, + Scan16 = 0xEA53, + Scan20 = 0xEA54, + ScanCamera16 = 0xEA55, + ScanCamera20 = 0xEA56, + ScanCamera24 = 0xEA57, + ScanCamera28 = 0xEA58, + ScanCamera48 = 0xEA59, + ScanDash12 = 0xEA5A, + ScanDash16 = 0xEA5B, + ScanDash20 = 0xEA5C, + ScanDash24 = 0xEA5D, + ScanDash28 = 0xEA5E, + ScanDash32 = 0xEA5F, + ScanDash48 = 0xEA60, + ScanObject20 = 0xEA61, + ScanObject24 = 0xEA62, + ScanTable20 = 0xEA63, + ScanTable24 = 0xEA64, + ScanText20 = 0xEA65, + ScanText24 = 0xEA66, + ScanThumbUp16 = 0xEA67, + ScanThumbUp20 = 0xEA68, + ScanThumbUp24 = 0xEA69, + ScanThumbUp28 = 0xEA6A, + ScanThumbUp48 = 0xEA6B, + ScanThumbUpOff16 = 0xEA6C, + ScanThumbUpOff20 = 0xEA6D, + ScanThumbUpOff24 = 0xEA6E, + ScanThumbUpOff28 = 0xEA6F, + ScanThumbUpOff48 = 0xEA70, + ScanType20 = 0xEA71, + ScanType24 = 0xEA72, + ScanTypeCheckmark20 = 0xEA73, + ScanTypeCheckmark24 = 0xEA74, + ScanTypeOff20 = 0xEA75, + Scratchpad20 = 0xEA76, + ScreenCut20 = 0xEA77, + ScreenPerson20 = 0xEA78, + ScreenSearch20 = 0xEA79, + ScreenSearch24 = 0xEA7A, + Search12 = 0xEA7B, + Search16 = 0xEA7C, + Search32 = 0xEA7D, + Search48 = 0xEA7E, + SearchSettings20 = 0xEA7F, + SearchShield20 = 0xEA80, + SearchSquare20 = 0xEA81, + SearchVisual16 = 0xEA82, + SearchVisual20 = 0xEA83, + SearchVisual24 = 0xEA84, + SelectAllOff20 = 0xEA85, + SelectAllOn20 = 0xEA86, + SelectAllOn24 = 0xEA87, + SelectObjectSkew20 = 0xEA88, + SelectObjectSkew24 = 0xEA89, + SelectObjectSkewDismiss20 = 0xEA8A, + SelectObjectSkewDismiss24 = 0xEA8B, + SelectObjectSkewEdit20 = 0xEA8C, + SelectObjectSkewEdit24 = 0xEA8D, + Send16 = 0xEA8E, + SendClock24 = 0xEA8F, + SendCopy20 = 0xEA90, + ServerMultiple20 = 0xEA91, + ServerPlay20 = 0xEA92, + ServiceBell20 = 0xEA93, + Settings32 = 0xEA94, + Settings48 = 0xEA95, + SettingsChat20 = 0xEA96, + SettingsChat24 = 0xEA97, + ShapeExclude16 = 0xEA98, + ShapeExclude20 = 0xEA99, + ShapeExclude24 = 0xEA9A, + ShapeIntersect16 = 0xEA9B, + ShapeIntersect20 = 0xEA9C, + ShapeIntersect24 = 0xEA9D, + ShapeSubtract16 = 0xEA9E, + ShapeSubtract20 = 0xEA9F, + ShapeSubtract24 = 0xEAA0, + ShapeUnion16 = 0xEAA1, + ShapeUnion20 = 0xEAA2, + ShapeUnion24 = 0xEAA3, + Shapes28 = 0xEAA4, + Shapes48 = 0xEAA5, + Share16 = 0xEAA6, + Share28 = 0xEAA7, + Share48 = 0xEAA8, + ShareCloseTray20 = 0xEAA9, + ShareScreenPerson16 = 0xEAAA, + ShareScreenPerson20 = 0xEAAB, + ShareScreenPerson24 = 0xEAAC, + ShareScreenPerson28 = 0xEAAD, + ShareScreenPersonOverlay16 = 0xEAAE, + ShareScreenPersonOverlay20 = 0xEAAF, + ShareScreenPersonOverlay24 = 0xEAB0, + ShareScreenPersonOverlay28 = 0xEAB1, + ShareScreenPersonOverlayInside16 = 0xEAB2, + ShareScreenPersonOverlayInside20 = 0xEAB3, + ShareScreenPersonOverlayInside24 = 0xEAB4, + ShareScreenPersonOverlayInside28 = 0xEAB5, + ShareScreenPersonP16 = 0xEAB6, + ShareScreenPersonP20 = 0xEAB7, + ShareScreenPersonP24 = 0xEAB8, + ShareScreenPersonP28 = 0xEAB9, + ShareScreenStart20 = 0xEABA, + ShareScreenStart24 = 0xEABB, + ShareScreenStart28 = 0xEABC, + ShareScreenStart48 = 0xEABD, + ShareScreenStop16 = 0xEABE, + ShareScreenStop20 = 0xEABF, + ShareScreenStop24 = 0xEAC0, + ShareScreenStop28 = 0xEAC1, + ShareScreenStop48 = 0xEAC2, + Shield16 = 0xEAC3, + Shield28 = 0xEAC4, + Shield48 = 0xEAC5, + ShieldBadge24 = 0xEAC6, + ShieldCheckmark16 = 0xEAC7, + ShieldCheckmark20 = 0xEAC8, + ShieldCheckmark24 = 0xEAC9, + ShieldCheckmark28 = 0xEACA, + ShieldCheckmark48 = 0xEACB, + ShieldDismiss16 = 0xEACC, + ShieldDismissShield20 = 0xEACD, + ShieldError16 = 0xEACE, + ShieldLock16 = 0xEACF, + ShieldLock20 = 0xEAD0, + ShieldLock24 = 0xEAD1, + ShieldLock28 = 0xEAD2, + ShieldLock48 = 0xEAD3, + ShieldPerson20 = 0xEAD4, + ShieldPersonAdd20 = 0xEAD5, + ShieldTask16 = 0xEAD6, + ShieldTask20 = 0xEAD7, + ShieldTask24 = 0xEAD8, + ShieldTask28 = 0xEAD9, + ShieldTask48 = 0xEADA, + Shifts16 = 0xEADB, + Shifts20 = 0xEADC, + Shifts30Minutes20 = 0xEADD, + Shifts32 = 0xEADE, + ShiftsAdd20 = 0xEADF, + ShiftsAvailability20 = 0xEAE0, + ShiftsCheckmark20 = 0xEAE1, + ShiftsCheckmark24 = 0xEAE2, + ShiftsDay20 = 0xEAE3, + ShiftsDay24 = 0xEAE4, + ShiftsProhibited20 = 0xEAE5, + ShiftsProhibited24 = 0xEAE6, + ShiftsQuestionMark20 = 0xEAE7, + ShiftsQuestionMark24 = 0xEAE8, + ShiftsTeam20 = 0xEAE9, + ShoppingBagArrowLeft20 = 0xEAEA, + ShoppingBagArrowLeft24 = 0xEAEB, + ShoppingBagDismiss20 = 0xEAEC, + ShoppingBagDismiss24 = 0xEAED, + ShoppingBagPause20 = 0xEAEE, + ShoppingBagPause24 = 0xEAEF, + ShoppingBagPercent20 = 0xEAF0, + ShoppingBagPercent24 = 0xEAF1, + ShoppingBagPlay20 = 0xEAF2, + ShoppingBagPlay24 = 0xEAF3, + ShoppingBagTag20 = 0xEAF4, + ShoppingBagTag24 = 0xEAF5, + Shortpick20 = 0xEAF6, + Shortpick24 = 0xEAF7, + SidebarSearchLtr20 = 0xEAF8, + SidebarSearchRtl20 = 0xEAF9, + SignOut20 = 0xEAFA, + SkipBack1020 = 0xEAFB, + SkipBack1024 = 0xEAFC, + SkipBack1028 = 0xEAFD, + SkipBack1032 = 0xEAFE, + SkipBack1048 = 0xEAFF, + SkipForward1020 = 0xEB00, + SkipForward1024 = 0xEB01, + SkipForward1028 = 0xEB02, + SkipForward1032 = 0xEB03, + SkipForward1048 = 0xEB04, + SkipForward3020 = 0xEB05, + SkipForward3024 = 0xEB06, + SkipForward3028 = 0xEB07, + SkipForward3032 = 0xEB08, + SkipForward3048 = 0xEB09, + SkipForwardTab20 = 0xEB0A, + SkipForwardTab24 = 0xEB0B, + Sleep20 = 0xEB0C, + SlideAdd16 = 0xEB0D, + SlideAdd20 = 0xEB0E, + SlideAdd28 = 0xEB0F, + SlideAdd32 = 0xEB10, + SlideAdd48 = 0xEB11, + SlideArrowRight20 = 0xEB12, + SlideArrowRight24 = 0xEB13, + SlideEraser16 = 0xEB14, + SlideEraser20 = 0xEB15, + SlideEraser24 = 0xEB16, + SlideGrid20 = 0xEB17, + SlideGrid24 = 0xEB18, + SlideHide20 = 0xEB19, + SlideMicrophone20 = 0xEB1A, + SlideMicrophone32 = 0xEB1B, + SlideMultiple20 = 0xEB1C, + SlideMultiple24 = 0xEB1D, + SlideMultipleArrowRight20 = 0xEB1E, + SlideMultipleArrowRight24 = 0xEB1F, + SlideSearch20 = 0xEB20, + SlideSearch24 = 0xEB21, + SlideSearch28 = 0xEB22, + SlideSettings20 = 0xEB23, + SlideSettings24 = 0xEB24, + SlideSize20 = 0xEB25, + SlideSize24 = 0xEB26, + SlideText16 = 0xEB27, + SlideText20 = 0xEB28, + SlideText28 = 0xEB29, + SlideText48 = 0xEB2A, + SlideTransition20 = 0xEB2B, + SlideTransition24 = 0xEB2C, + Snooze20 = 0xEB2D, + SoundSource20 = 0xEB2E, + SoundWaveCircle20 = 0xEB2F, + SoundWaveCircle24 = 0xEB30, + Spacebar20 = 0xEB31, + Sparkle16 = 0xEB32, + Sparkle20 = 0xEB33, + Sparkle24 = 0xEB34, + Sparkle28 = 0xEB35, + Sparkle48 = 0xEB36, + Speaker016 = 0xEB37, + Speaker020 = 0xEB38, + Speaker028 = 0xEB39, + Speaker032 = 0xEB3A, + Speaker048 = 0xEB3B, + Speaker116 = 0xEB3C, + Speaker120 = 0xEB3D, + Speaker128 = 0xEB3E, + Speaker132 = 0xEB3F, + Speaker148 = 0xEB40, + Speaker216 = 0xEB41, + Speaker220 = 0xEB42, + Speaker224 = 0xEB43, + Speaker228 = 0xEB44, + Speaker232 = 0xEB45, + Speaker248 = 0xEB46, + SpeakerBluetooth20 = 0xEB47, + SpeakerBluetooth28 = 0xEB48, + SpeakerMute16 = 0xEB49, + SpeakerMute20 = 0xEB4A, + SpeakerMute24 = 0xEB4B, + SpeakerMute28 = 0xEB4C, + SpeakerMute48 = 0xEB4D, + SpeakerOff16 = 0xEB4E, + SpeakerOff20 = 0xEB4F, + SpeakerOff48 = 0xEB50, + SpeakerSettings20 = 0xEB51, + SpeakerSettings28 = 0xEB52, + SpeakerUsb20 = 0xEB53, + SpeakerUsb24 = 0xEB54, + SpeakerUsb28 = 0xEB55, + SplitHint20 = 0xEB56, + SplitHorizontal12 = 0xEB57, + SplitHorizontal16 = 0xEB58, + SplitHorizontal20 = 0xEB59, + SplitHorizontal24 = 0xEB5A, + SplitHorizontal28 = 0xEB5B, + SplitHorizontal32 = 0xEB5C, + SplitHorizontal48 = 0xEB5D, + SplitVertical12 = 0xEB5E, + SplitVertical16 = 0xEB5F, + SplitVertical20 = 0xEB60, + SplitVertical24 = 0xEB61, + SplitVertical28 = 0xEB62, + SplitVertical32 = 0xEB63, + SplitVertical48 = 0xEB64, + Sport16 = 0xEB65, + Sport20 = 0xEB66, + Sport24 = 0xEB67, + SportAmericanFootball20 = 0xEB68, + SportAmericanFootball24 = 0xEB69, + SportBaseball20 = 0xEB6A, + SportBaseball24 = 0xEB6B, + SportBasketball20 = 0xEB6C, + SportBasketball24 = 0xEB6D, + SportHockey20 = 0xEB6E, + SportHockey24 = 0xEB6F, + SportSoccer16 = 0xEB70, + SportSoccer20 = 0xEB71, + SportSoccer24 = 0xEB72, + Square12 = 0xEB73, + Square16 = 0xEB74, + Square20 = 0xEB75, + Square24 = 0xEB76, + Square28 = 0xEB77, + Square32 = 0xEB78, + Square48 = 0xEB79, + SquareAdd16 = 0xEB7A, + SquareAdd20 = 0xEB7B, + SquareArrowForward16 = 0xEB7C, + SquareArrowForward20 = 0xEB7D, + SquareArrowForward24 = 0xEB7E, + SquareArrowForward28 = 0xEB7F, + SquareArrowForward32 = 0xEB80, + SquareArrowForward48 = 0xEB81, + SquareDismiss16 = 0xEB82, + SquareDismiss20 = 0xEB83, + SquareEraser20 = 0xEB84, + SquareHint16 = 0xEB85, + SquareHint20 = 0xEB86, + SquareHint24 = 0xEB87, + SquareHint28 = 0xEB88, + SquareHint32 = 0xEB89, + SquareHint48 = 0xEB8A, + SquareHintApps20 = 0xEB8B, + SquareHintApps24 = 0xEB8C, + SquareHintArrowBack16 = 0xEB8D, + SquareHintArrowBack20 = 0xEB8E, + SquareHintSparkles16 = 0xEB8F, + SquareHintSparkles20 = 0xEB90, + SquareHintSparkles24 = 0xEB91, + SquareHintSparkles28 = 0xEB92, + SquareHintSparkles32 = 0xEB93, + SquareHintSparkles48 = 0xEB94, + SquareMultiple16 = 0xEB95, + SquareMultiple20 = 0xEB96, + SquareShadow12 = 0xEB97, + SquareShadow20 = 0xEB98, + SquaresNested20 = 0xEB99, + StackArrowForward20 = 0xEB9A, + StackArrowForward24 = 0xEB9B, + StackStar16 = 0xEB9C, + StackStar20 = 0xEB9D, + StackStar24 = 0xEB9E, + Star48 = 0xEB9F, + StarAdd28 = 0xEBA0, + StarArrowRightEnd20 = 0xEBA1, + StarArrowRightEnd24 = 0xEBA2, + StarArrowRightStart20 = 0xEBA3, + StarDismiss16 = 0xEBA4, + StarDismiss20 = 0xEBA5, + StarDismiss24 = 0xEBA6, + StarDismiss28 = 0xEBA7, + StarEdit20 = 0xEBA8, + StarEdit24 = 0xEBA9, + StarEmphasis20 = 0xEBAA, + StarEmphasis32 = 0xEBAB, + StarHalf12 = 0xEBAC, + StarHalf16 = 0xEBAD, + StarHalf20 = 0xEBAE, + StarHalf24 = 0xEBAF, + StarHalf28 = 0xEBB0, + StarLineHorizontal316 = 0xEBB1, + StarLineHorizontal320 = 0xEBB2, + StarLineHorizontal324 = 0xEBB3, + StarOneQuarter12 = 0xEBB4, + StarOneQuarter16 = 0xEBB5, + StarOneQuarter20 = 0xEBB6, + StarOneQuarter24 = 0xEBB7, + StarOneQuarter28 = 0xEBB8, + StarSettings20 = 0xEBB9, + StarThreeQuarter12 = 0xEBBA, + StarThreeQuarter16 = 0xEBBB, + StarThreeQuarter20 = 0xEBBC, + StarThreeQuarter24 = 0xEBBD, + StarThreeQuarter28 = 0xEBBE, + Steps20 = 0xEBBF, + Steps24 = 0xEBC0, + Sticker12 = 0xEBC1, + StickerAdd20 = 0xEBC2, + Storage20 = 0xEBC3, + Stream20 = 0xEBC4, + Stream24 = 0xEBC5, + StreamInput20 = 0xEBC6, + StreamInputOutput20 = 0xEBC7, + StreamOutput20 = 0xEBC8, + StyleGuide20 = 0xEBC9, + SubGrid20 = 0xEBCA, + Subtitles16 = 0xEBCB, + Subtitles20 = 0xEBCC, + Subtitles24 = 0xEBCD, + Subtract12 = 0xEBCE, + Subtract16 = 0xEBCF, + Subtract20 = 0xEBD0, + Subtract24 = 0xEBD1, + Subtract28 = 0xEBD2, + Subtract48 = 0xEBD3, + SubtractCircle12 = 0xEBD4, + SubtractCircleArrowBack16 = 0xEBD5, + SubtractCircleArrowBack20 = 0xEBD6, + SubtractCircleArrowForward16 = 0xEBD7, + SubtractCircleArrowForward20 = 0xEBD8, + SubtractSquare20 = 0xEBD9, + SubtractSquare24 = 0xEBDA, + SubtractSquareMultiple16 = 0xEBDB, + SubtractSquareMultiple20 = 0xEBDC, + SwipeDown20 = 0xEBDD, + SwipeRight20 = 0xEBDE, + SwipeUp20 = 0xEBDF, + Symbols16 = 0xEBE0, + Symbols20 = 0xEBE1, + Syringe20 = 0xEBE2, + Syringe24 = 0xEBE3, + System20 = 0xEBE4, + TabAdd20 = 0xEBE5, + TabAdd24 = 0xEBE6, + TabArrowLeft20 = 0xEBE7, + TabArrowLeft24 = 0xEBE8, + TabDesktop16 = 0xEBE9, + TabDesktop24 = 0xEBEA, + TabDesktopArrowLeft20 = 0xEBEB, + TabDesktopBottom20 = 0xEBEC, + TabDesktopBottom24 = 0xEBED, + TabDesktopMultipleBottom20 = 0xEBEE, + TabDesktopMultipleBottom24 = 0xEBEF, + TabProhibited20 = 0xEBF0, + TabProhibited24 = 0xEBF1, + TabShieldDismiss20 = 0xEBF2, + TabShieldDismiss24 = 0xEBF3, + Table16 = 0xEBF4, + Table28 = 0xEBF5, + Table32 = 0xEBF6, + Table48 = 0xEBF7, + TableAdd16 = 0xEBF8, + TableAdd20 = 0xEBF9, + TableAdd28 = 0xEBFA, + TableBottomRow16 = 0xEBFB, + TableBottomRow20 = 0xEBFC, + TableBottomRow24 = 0xEBFD, + TableBottomRow28 = 0xEBFE, + TableBottomRow32 = 0xEBFF, + TableBottomRow48 = 0xEC00, + TableCellEdit16 = 0xEC01, + TableCellEdit20 = 0xEC02, + TableCellEdit24 = 0xEC03, + TableCellEdit28 = 0xEC04, + TableCellsMerge16 = 0xEC05, + TableCellsMerge28 = 0xEC06, + TableCellsSplit16 = 0xEC07, + TableCellsSplit28 = 0xEC08, + TableChecker20 = 0xEC09, + TableCopy20 = 0xEC0A, + TableDeleteColumn16 = 0xEC0B, + TableDeleteColumn20 = 0xEC0C, + TableDeleteColumn24 = 0xEC0D, + TableDeleteColumn28 = 0xEC0E, + TableDeleteRow16 = 0xEC0F, + TableDeleteRow20 = 0xEC10, + TableDeleteRow24 = 0xEC11, + TableDeleteRow28 = 0xEC12, + TableDismiss16 = 0xEC13, + TableDismiss20 = 0xEC14, + TableDismiss24 = 0xEC15, + TableDismiss28 = 0xEC16, + TableEdit16 = 0xEC17, + TableEdit20 = 0xEC18, + TableEdit28 = 0xEC19, + TableFreezeColumn16 = 0xEC1A, + TableFreezeColumn20 = 0xEC1B, + TableFreezeColumn28 = 0xEC1C, + TableFreezeColumnAndRow16 = 0xEC1D, + TableFreezeColumnAndRow20 = 0xEC1E, + TableFreezeColumnAndRow24 = 0xEC1F, + TableFreezeColumnAndRow28 = 0xEC20, + TableFreezeRow16 = 0xEC21, + TableFreezeRow20 = 0xEC22, + TableFreezeRow28 = 0xEC23, + TableImage20 = 0xEC24, + TableInsertColumn16 = 0xEC25, + TableInsertColumn20 = 0xEC26, + TableInsertColumn24 = 0xEC27, + TableInsertColumn28 = 0xEC28, + TableInsertRow16 = 0xEC29, + TableInsertRow20 = 0xEC2A, + TableInsertRow24 = 0xEC2B, + TableInsertRow28 = 0xEC2C, + TableLightning16 = 0xEC2D, + TableLightning20 = 0xEC2E, + TableLightning24 = 0xEC2F, + TableLightning28 = 0xEC30, + TableLink16 = 0xEC31, + TableLink20 = 0xEC32, + TableLink24 = 0xEC33, + TableLink28 = 0xEC34, + TableMoveAbove16 = 0xEC35, + TableMoveAbove20 = 0xEC36, + TableMoveAbove24 = 0xEC37, + TableMoveAbove28 = 0xEC38, + TableMoveBelow16 = 0xEC39, + TableMoveBelow20 = 0xEC3A, + TableMoveBelow24 = 0xEC3B, + TableMoveBelow28 = 0xEC3C, + TableMoveLeft16 = 0xEC3D, + TableMoveLeft20 = 0xEC3E, + TableMoveLeft28 = 0xEC3F, + TableMoveRight16 = 0xEC40, + TableMoveRight20 = 0xEC41, + TableMoveRight28 = 0xEC42, + TableMultiple20 = 0xEC43, + TableResizeColumn16 = 0xEC44, + TableResizeColumn20 = 0xEC45, + TableResizeColumn24 = 0xEC46, + TableResizeColumn28 = 0xEC47, + TableResizeRow16 = 0xEC48, + TableResizeRow20 = 0xEC49, + TableResizeRow24 = 0xEC4A, + TableResizeRow28 = 0xEC4B, + TableSearch20 = 0xEC4C, + TableSettings16 = 0xEC4D, + TableSettings20 = 0xEC4E, + TableSettings28 = 0xEC4F, + TableSimple16 = 0xEC50, + TableSimple20 = 0xEC51, + TableSimple24 = 0xEC52, + TableSimple28 = 0xEC53, + TableSimple48 = 0xEC54, + TableSplit20 = 0xEC55, + TableStackAbove16 = 0xEC56, + TableStackAbove20 = 0xEC57, + TableStackAbove24 = 0xEC58, + TableStackAbove28 = 0xEC59, + TableStackBelow16 = 0xEC5A, + TableStackBelow20 = 0xEC5B, + TableStackBelow24 = 0xEC5C, + TableStackBelow28 = 0xEC5D, + TableStackLeft16 = 0xEC5E, + TableStackLeft20 = 0xEC5F, + TableStackLeft24 = 0xEC60, + TableStackLeft28 = 0xEC61, + TableStackRight16 = 0xEC62, + TableStackRight20 = 0xEC63, + TableStackRight24 = 0xEC64, + TableStackRight28 = 0xEC65, + TableSwitch16 = 0xEC66, + TableSwitch20 = 0xEC67, + TableSwitch28 = 0xEC68, + Tablet12 = 0xEC69, + Tablet16 = 0xEC6A, + Tablet32 = 0xEC6B, + Tablet48 = 0xEC6C, + TabletSpeaker20 = 0xEC6D, + TabletSpeaker24 = 0xEC6E, + Tabs20 = 0xEC6F, + Tag16 = 0xEC70, + Tag28 = 0xEC71, + Tag32 = 0xEC72, + TagCircle20 = 0xEC73, + TagDismiss16 = 0xEC74, + TagDismiss20 = 0xEC75, + TagDismiss24 = 0xEC76, + TagError16 = 0xEC77, + TagError20 = 0xEC78, + TagError24 = 0xEC79, + TagLock16 = 0xEC7A, + TagLock20 = 0xEC7B, + TagLock24 = 0xEC7C, + TagLock32 = 0xEC7D, + TagMultiple20 = 0xEC7E, + TagMultiple24 = 0xEC7F, + TagOff20 = 0xEC80, + TagOff24 = 0xEC81, + TagQuestionMark16 = 0xEC82, + TagQuestionMark20 = 0xEC83, + TagQuestionMark24 = 0xEC84, + TagQuestionMark32 = 0xEC85, + TagReset20 = 0xEC86, + TagReset24 = 0xEC87, + TagSearch20 = 0xEC88, + TagSearch24 = 0xEC89, + TapDouble20 = 0xEC8A, + TapDouble32 = 0xEC8B, + TapDouble48 = 0xEC8C, + TapSingle20 = 0xEC8D, + TapSingle32 = 0xEC8E, + TapSingle48 = 0xEC8F, + Target32 = 0xEC90, + TargetArrow24 = 0xEC91, + TaskListLtr20 = 0xEC92, + TaskListLtr24 = 0xEC93, + TaskListRtl20 = 0xEC94, + TaskListRtl24 = 0xEC95, + TaskListSquareAdd20 = 0xEC96, + TaskListSquareAdd24 = 0xEC97, + TaskListSquareDatabase20 = 0xEC98, + TaskListSquareLtr20 = 0xEC99, + TaskListSquareLtr24 = 0xEC9A, + TaskListSquarePerson20 = 0xEC9B, + TaskListSquareRtl20 = 0xEC9C, + TaskListSquareRtl24 = 0xEC9D, + TaskListSquareSettings20 = 0xEC9E, + TasksApp20 = 0xEC9F, + Teddy20 = 0xECA0, + Temperature16 = 0xECA1, + Tent12 = 0xECA2, + Tent16 = 0xECA3, + Tent20 = 0xECA4, + Tent28 = 0xECA5, + Tent48 = 0xECA6, + TetrisApp16 = 0xECA7, + TetrisApp20 = 0xECA8, + TetrisApp24 = 0xECA9, + TetrisApp28 = 0xECAA, + TetrisApp32 = 0xECAB, + TetrisApp48 = 0xECAC, + Text12 = 0xECAD, + Text16 = 0xECAE, + Text32 = 0xECAF, + TextAdd20 = 0xECB0, + TextAddT24 = 0xECB1, + TextAlignCenter16 = 0xECB2, + TextAlignCenterRotate27016 = 0xECB3, + TextAlignCenterRotate27020 = 0xECB4, + TextAlignCenterRotate27024 = 0xECB5, + TextAlignCenterRotate9016 = 0xECB6, + TextAlignCenterRotate9020 = 0xECB7, + TextAlignCenterRotate9024 = 0xECB8, + TextAlignDistributedEvenly20 = 0xECB9, + TextAlignDistributedEvenly24 = 0xECBA, + TextAlignDistributedVertical20 = 0xECBB, + TextAlignDistributedVertical24 = 0xECBC, + TextAlignJustifyLow20 = 0xECBD, + TextAlignJustifyLow24 = 0xECBE, + TextAlignJustifyRotate27020 = 0xECBF, + TextAlignJustifyRotate27024 = 0xECC0, + TextAlignJustifyRotate9020 = 0xECC1, + TextAlignJustifyRotate9024 = 0xECC2, + TextAlignLeft16 = 0xECC3, + TextAlignLeftRotate27016 = 0xECC4, + TextAlignLeftRotate27020 = 0xECC5, + TextAlignLeftRotate27024 = 0xECC6, + TextAlignLeftRotate9016 = 0xECC7, + TextAlignLeftRotate9020 = 0xECC8, + TextAlignLeftRotate9024 = 0xECC9, + TextAlignRight16 = 0xECCA, + TextAlignRightRotate27016 = 0xECCB, + TextAlignRightRotate27020 = 0xECCC, + TextAlignRightRotate27024 = 0xECCD, + TextAlignRightRotate9016 = 0xECCE, + TextAlignRightRotate9020 = 0xECCF, + TextAlignRightRotate9024 = 0xECD0, + TextBaseline20 = 0xECD1, + TextBold16 = 0xECD2, + TextBoxSettings20 = 0xECD3, + TextBoxSettings24 = 0xECD4, + TextBulletListAdd20 = 0xECD5, + TextBulletListCheckmark20 = 0xECD6, + TextBulletListDismiss20 = 0xECD7, + TextBulletListLtr16 = 0xECD8, + TextBulletListLtr20 = 0xECD9, + TextBulletListLtr24 = 0xECDA, + TextBulletListRotate27020 = 0xECDB, + TextBulletListRotate27024 = 0xECDC, + TextBulletListRotate9020 = 0xECDD, + TextBulletListRotate9024 = 0xECDE, + TextBulletListRtl16 = 0xECDF, + TextBulletListRtl20 = 0xECE0, + TextBulletListRtl24 = 0xECE1, + TextBulletListSquare20 = 0xECE2, + TextBulletListSquareClock20 = 0xECE3, + TextBulletListSquarePerson20 = 0xECE4, + TextBulletListSquareSearch20 = 0xECE5, + TextBulletListSquareSettings20 = 0xECE6, + TextBulletListSquareShield20 = 0xECE7, + TextBulletListSquareToolbox20 = 0xECE8, + TextCaseLowercase16 = 0xECE9, + TextCaseLowercase20 = 0xECEA, + TextCaseLowercase24 = 0xECEB, + TextCaseTitle16 = 0xECEC, + TextCaseTitle20 = 0xECED, + TextCaseTitle24 = 0xECEE, + TextCaseUppercase16 = 0xECEF, + TextCaseUppercase20 = 0xECF0, + TextCaseUppercase24 = 0xECF1, + TextChangeCase16 = 0xECF2, + TextClearFormatting16 = 0xECF3, + TextCollapse20 = 0xECF4, + TextColor16 = 0xECF5, + TextColumnOneNarrow20 = 0xECF6, + TextColumnOneNarrow24 = 0xECF7, + TextColumnOneWide20 = 0xECF8, + TextColumnOneWide24 = 0xECF9, + TextColumnOneWideLightning20 = 0xECFA, + TextColumnOneWideLightning24 = 0xECFB, + TextContinuous20 = 0xECFC, + TextContinuous24 = 0xECFD, + TextDensity16 = 0xECFE, + TextDensity20 = 0xECFF, + TextDensity24 = 0xED00, + TextDensity28 = 0xED01, + TextDirectionHorizontalLeft20 = 0xED02, + TextDirectionHorizontalLeft24 = 0xED03, + TextDirectionHorizontalRight20 = 0xED04, + TextDirectionHorizontalRight24 = 0xED05, + TextDirectionRotate270Right20 = 0xED06, + TextDirectionRotate270Right24 = 0xED07, + TextDirectionRotate90Left20 = 0xED08, + TextDirectionRotate90Left24 = 0xED09, + TextDirectionRotate90Right20 = 0xED0A, + TextDirectionRotate90Right24 = 0xED0B, + TextExpand20 = 0xED0C, + TextFontInfo16 = 0xED0D, + TextFontInfo20 = 0xED0E, + TextFontInfo24 = 0xED0F, + TextFontSize16 = 0xED10, + TextGrammarArrowLeft20 = 0xED11, + TextGrammarArrowLeft24 = 0xED12, + TextGrammarArrowRight20 = 0xED13, + TextGrammarArrowRight24 = 0xED14, + TextGrammarCheckmark20 = 0xED15, + TextGrammarCheckmark24 = 0xED16, + TextGrammarDismiss20 = 0xED17, + TextGrammarDismiss24 = 0xED18, + TextGrammarError20 = 0xED19, + TextGrammarSettings20 = 0xED1A, + TextGrammarSettings24 = 0xED1B, + TextGrammarWand16 = 0xED1C, + TextGrammarWand20 = 0xED1D, + TextGrammarWand24 = 0xED1E, + TextHeader124 = 0xED1F, + TextHeader224 = 0xED20, + TextHeader324 = 0xED21, + TextIndentDecreaseLtr16 = 0xED22, + TextIndentDecreaseLtr20 = 0xED23, + TextIndentDecreaseLtr24 = 0xED24, + TextIndentDecreaseRotate27020 = 0xED25, + TextIndentDecreaseRotate27024 = 0xED26, + TextIndentDecreaseRotate9020 = 0xED27, + TextIndentDecreaseRotate9024 = 0xED28, + TextIndentDecreaseRtl16 = 0xED29, + TextIndentDecreaseRtl20 = 0xED2A, + TextIndentDecreaseRtl24 = 0xED2B, + TextIndentIncreaseLtr16 = 0xED2C, + TextIndentIncreaseLtr20 = 0xED2D, + TextIndentIncreaseLtr24 = 0xED2E, + TextIndentIncreaseRotate27020 = 0xED2F, + TextIndentIncreaseRotate27024 = 0xED30, + TextIndentIncreaseRotate9020 = 0xED31, + TextIndentIncreaseRotate9024 = 0xED32, + TextIndentIncreaseRtl16 = 0xED33, + TextIndentIncreaseRtl20 = 0xED34, + TextIndentIncreaseRtl24 = 0xED35, + TextItalic16 = 0xED36, + TextMore20 = 0xED37, + TextMore24 = 0xED38, + TextNumberFormat20 = 0xED39, + TextNumberListLtr16 = 0xED3A, + TextNumberListRotate27020 = 0xED3B, + TextNumberListRotate27024 = 0xED3C, + TextNumberListRotate9020 = 0xED3D, + TextNumberListRotate9024 = 0xED3E, + TextNumberListRtl16 = 0xED3F, + TextNumberListRtl20 = 0xED40, + TextParagraph16 = 0xED41, + TextParagraph20 = 0xED42, + TextParagraph24 = 0xED43, + TextParagraphDirection20 = 0xED44, + TextParagraphDirection24 = 0xED45, + TextParagraphDirectionLeft16 = 0xED46, + TextParagraphDirectionLeft20 = 0xED47, + TextParagraphDirectionRight16 = 0xED48, + TextParagraphDirectionRight20 = 0xED49, + TextPeriodAsterisk20 = 0xED4A, + TextPositionBehind20 = 0xED4B, + TextPositionBehind24 = 0xED4C, + TextPositionFront20 = 0xED4D, + TextPositionFront24 = 0xED4E, + TextPositionLine20 = 0xED4F, + TextPositionLine24 = 0xED50, + TextPositionSquare20 = 0xED51, + TextPositionSquare24 = 0xED52, + TextPositionThrough20 = 0xED53, + TextPositionThrough24 = 0xED54, + TextPositionTight20 = 0xED55, + TextPositionTight24 = 0xED56, + TextPositionTopBottom20 = 0xED57, + TextPositionTopBottom24 = 0xED58, + TextQuote16 = 0xED59, + TextSortAscending16 = 0xED5A, + TextSortAscending24 = 0xED5B, + TextSortDescending16 = 0xED5C, + TextSortDescending24 = 0xED5D, + TextStrikethrough16 = 0xED5E, + TextStrikethrough20 = 0xED5F, + TextStrikethrough24 = 0xED60, + TextSubscript16 = 0xED61, + TextSuperscript16 = 0xED62, + TextT20 = 0xED63, + TextT24 = 0xED64, + TextT28 = 0xED65, + TextT48 = 0xED66, + TextUnderline16 = 0xED67, + TextWholeWord20 = 0xED68, + TextWrap20 = 0xED69, + Textbox16 = 0xED6A, + TextboxAlignBottomRotate9020 = 0xED6B, + TextboxAlignBottomRotate9024 = 0xED6C, + TextboxAlignCenter20 = 0xED6D, + TextboxAlignCenter24 = 0xED6E, + TextboxAlignMiddleRotate9020 = 0xED6F, + TextboxAlignMiddleRotate9024 = 0xED70, + TextboxAlignTopRotate9020 = 0xED71, + TextboxAlignTopRotate9024 = 0xED72, + TextboxMore20 = 0xED73, + TextboxMore24 = 0xED74, + TextboxRotate9020 = 0xED75, + TextboxRotate9024 = 0xED76, + ThumbDislike16 = 0xED77, + ThumbLike16 = 0xED78, + ThumbLike28 = 0xED79, + ThumbLike48 = 0xED7A, + TicketDiagonal16 = 0xED7B, + TicketDiagonal20 = 0xED7C, + TicketDiagonal24 = 0xED7D, + TicketDiagonal28 = 0xED7E, + TicketHorizontal20 = 0xED7F, + TicketHorizontal24 = 0xED80, + TimeAndWeather20 = 0xED81, + TimePicker20 = 0xED82, + Timeline20 = 0xED83, + Timer1020 = 0xED84, + Timer12 = 0xED85, + Timer16 = 0xED86, + Timer220 = 0xED87, + Timer20 = 0xED88, + Timer28 = 0xED89, + Timer320 = 0xED8A, + Timer324 = 0xED8B, + Timer32 = 0xED8C, + Timer48 = 0xED8D, + TimerOff20 = 0xED8E, + ToggleLeft16 = 0xED8F, + ToggleLeft20 = 0xED90, + ToggleLeft24 = 0xED91, + ToggleLeft28 = 0xED92, + ToggleLeft48 = 0xED93, + ToggleMultiple16 = 0xED94, + ToggleMultiple20 = 0xED95, + ToggleMultiple24 = 0xED96, + ToggleRight28 = 0xED97, + ToggleRight48 = 0xED98, + Toolbox12 = 0xED99, + TooltipQuote24 = 0xED9A, + TopSpeed20 = 0xED9B, + Transmission20 = 0xED9C, + Transmission24 = 0xED9D, + TrayItemAdd20 = 0xED9E, + TrayItemAdd24 = 0xED9F, + TrayItemRemove20 = 0xEDA0, + TrayItemRemove24 = 0xEDA1, + TreeDeciduous20 = 0xEDA2, + TreeEvergreen20 = 0xEDA3, + Triangle12 = 0xEDA4, + Triangle16 = 0xEDA5, + Triangle20 = 0xEDA6, + Triangle32 = 0xEDA7, + Triangle48 = 0xEDA8, + TriangleDown12 = 0xEDA9, + TriangleDown16 = 0xEDAA, + TriangleDown20 = 0xEDAB, + TriangleDown32 = 0xEDAC, + TriangleDown48 = 0xEDAD, + TriangleLeft12 = 0xEDAE, + TriangleLeft16 = 0xEDAF, + TriangleLeft20 = 0xEDB0, + TriangleLeft32 = 0xEDB1, + TriangleLeft48 = 0xEDB2, + TriangleRight12 = 0xEDB3, + TriangleRight16 = 0xEDB4, + TriangleRight20 = 0xEDB5, + TriangleRight32 = 0xEDB6, + TriangleRight48 = 0xEDB7, + Trophy28 = 0xEDB8, + Trophy32 = 0xEDB9, + Trophy48 = 0xEDBA, + TrophyOff16 = 0xEDBB, + TrophyOff20 = 0xEDBC, + TrophyOff24 = 0xEDBD, + TrophyOff28 = 0xEDBE, + TrophyOff32 = 0xEDBF, + TrophyOff48 = 0xEDC0, + Tv16 = 0xEDC1, + Tv20 = 0xEDC2, + Tv24 = 0xEDC3, + Tv28 = 0xEDC4, + Tv48 = 0xEDC5, + TvArrowRight20 = 0xEDC6, + TvUsb16 = 0xEDC7, + TvUsb20 = 0xEDC8, + TvUsb24 = 0xEDC9, + TvUsb28 = 0xEDCA, + TvUsb48 = 0xEDCB, + Umbrella20 = 0xEDCC, + Umbrella24 = 0xEDCD, + UninstallApp20 = 0xEDCE, + UsbPlug20 = 0xEDCF, + UsbPlug24 = 0xEDD0, + VehicleBicycle16 = 0xEDD1, + VehicleBicycle20 = 0xEDD2, + VehicleBus16 = 0xEDD3, + VehicleBus20 = 0xEDD4, + VehicleCab16 = 0xEDD5, + VehicleCab20 = 0xEDD6, + VehicleCab28 = 0xEDD7, + VehicleCar28 = 0xEDD8, + VehicleCar48 = 0xEDD9, + VehicleCarCollision16 = 0xEDDA, + VehicleCarCollision20 = 0xEDDB, + VehicleCarCollision24 = 0xEDDC, + VehicleCarCollision28 = 0xEDDD, + VehicleCarCollision32 = 0xEDDE, + VehicleCarCollision48 = 0xEDDF, + VehicleCarProfileLtr20 = 0xEDE0, + VehicleCarProfileRtl20 = 0xEDE1, + VehicleShip16 = 0xEDE2, + VehicleShip20 = 0xEDE3, + VehicleShip24 = 0xEDE4, + VehicleSubway16 = 0xEDE5, + VehicleSubway20 = 0xEDE6, + VehicleSubway24 = 0xEDE7, + VehicleTruck16 = 0xEDE8, + VehicleTruck20 = 0xEDE9, + VehicleTruckBag20 = 0xEDEA, + VehicleTruckBag24 = 0xEDEB, + VehicleTruckCube20 = 0xEDEC, + VehicleTruckCube24 = 0xEDED, + VehicleTruckProfile20 = 0xEDEE, + VehicleTruckProfile24 = 0xEDEF, + Video32 = 0xEDF0, + Video36020 = 0xEDF1, + Video36024 = 0xEDF2, + Video360Off20 = 0xEDF3, + Video48 = 0xEDF4, + VideoAdd20 = 0xEDF5, + VideoAdd24 = 0xEDF6, + VideoBackgroundEffect20 = 0xEDF7, + VideoChat16 = 0xEDF8, + VideoChat20 = 0xEDF9, + VideoChat24 = 0xEDFA, + VideoChat28 = 0xEDFB, + VideoChat32 = 0xEDFC, + VideoChat48 = 0xEDFD, + VideoClip16 = 0xEDFE, + VideoClip20 = 0xEDFF, + VideoClipMultiple16 = 0xEE00, + VideoClipMultiple20 = 0xEE01, + VideoClipMultiple24 = 0xEE02, + VideoClipOff16 = 0xEE03, + VideoClipOff20 = 0xEE04, + VideoClipOff24 = 0xEE05, + VideoOff32 = 0xEE06, + VideoOff48 = 0xEE07, + VideoPerson12 = 0xEE08, + VideoPerson16 = 0xEE09, + VideoPerson20 = 0xEE0A, + VideoPerson28 = 0xEE0B, + VideoPerson48 = 0xEE0C, + VideoPersonCall16 = 0xEE0D, + VideoPersonCall20 = 0xEE0E, + VideoPersonCall24 = 0xEE0F, + VideoPersonCall32 = 0xEE10, + VideoPersonOff20 = 0xEE11, + VideoPersonSparkle16 = 0xEE12, + VideoPersonSparkle20 = 0xEE13, + VideoPersonSparkle24 = 0xEE14, + VideoPersonSparkle28 = 0xEE15, + VideoPersonSparkle48 = 0xEE16, + VideoPersonStar20 = 0xEE17, + VideoPersonStarOff20 = 0xEE18, + VideoPersonStarOff24 = 0xEE19, + VideoPlayPause20 = 0xEE1A, + VideoProhibited16 = 0xEE1B, + VideoProhibited20 = 0xEE1C, + VideoProhibited24 = 0xEE1D, + VideoProhibited28 = 0xEE1E, + VideoRecording20 = 0xEE1F, + VideoSwitch20 = 0xEE20, + VideoSync20 = 0xEE21, + VirtualNetwork20 = 0xEE22, + VirtualNetworkToolbox20 = 0xEE23, + Voicemail28 = 0xEE24, + VoicemailArrowBack20 = 0xEE25, + VoicemailArrowForward20 = 0xEE26, + VoicemailArrowSubtract20 = 0xEE27, + Vote20 = 0xEE28, + Vote24 = 0xEE29, + WalkieTalkie20 = 0xEE2A, + Wallet16 = 0xEE2B, + Wallet20 = 0xEE2C, + Wallet24 = 0xEE2D, + Wallet28 = 0xEE2E, + Wallet32 = 0xEE2F, + Wallet48 = 0xEE30, + WalletCreditCard16 = 0xEE31, + WalletCreditCard20 = 0xEE32, + WalletCreditCard24 = 0xEE33, + WalletCreditCard32 = 0xEE34, + Wallpaper20 = 0xEE35, + Wand16 = 0xEE36, + Wand20 = 0xEE37, + Wand24 = 0xEE38, + Wand28 = 0xEE39, + Wand48 = 0xEE3A, + Warning12 = 0xEE3B, + Warning28 = 0xEE3C, + WarningShield20 = 0xEE3D, + WeatherDrizzle20 = 0xEE3E, + WeatherDrizzle24 = 0xEE3F, + WeatherDrizzle48 = 0xEE40, + WeatherHaze20 = 0xEE41, + WeatherHaze24 = 0xEE42, + WeatherHaze48 = 0xEE43, + WeatherMoon16 = 0xEE44, + WeatherMoon28 = 0xEE45, + WeatherMoonOff16 = 0xEE46, + WeatherMoonOff20 = 0xEE47, + WeatherMoonOff24 = 0xEE48, + WeatherMoonOff28 = 0xEE49, + WeatherMoonOff48 = 0xEE4A, + WeatherPartlyCloudyDay16 = 0xEE4B, + WeatherSunny16 = 0xEE4C, + WeatherSunny28 = 0xEE4D, + WeatherSunny32 = 0xEE4E, + WeatherSunnyHigh20 = 0xEE4F, + WeatherSunnyHigh24 = 0xEE50, + WeatherSunnyHigh48 = 0xEE51, + WeatherSunnyLow20 = 0xEE52, + WeatherSunnyLow24 = 0xEE53, + WeatherSunnyLow48 = 0xEE54, + WebAsset20 = 0xEE55, + Whiteboard48 = 0xEE56, + WifiLock20 = 0xEE57, + WifiLock24 = 0xEE58, + WifiOff20 = 0xEE59, + WifiOff24 = 0xEE5A, + WifiSettings20 = 0xEE5B, + WifiWarning20 = 0xEE5C, + Window16 = 0xEE5D, + Window24 = 0xEE5E, + Window28 = 0xEE5F, + Window32 = 0xEE60, + Window48 = 0xEE61, + WindowAdOff20 = 0xEE62, + WindowAdPerson20 = 0xEE63, + WindowApps16 = 0xEE64, + WindowApps20 = 0xEE65, + WindowApps24 = 0xEE66, + WindowApps28 = 0xEE67, + WindowApps32 = 0xEE68, + WindowApps48 = 0xEE69, + WindowArrowUp16 = 0xEE6A, + WindowArrowUp20 = 0xEE6B, + WindowArrowUp24 = 0xEE6C, + WindowBulletList20 = 0xEE6D, + WindowBulletListAdd20 = 0xEE6E, + WindowConsole20 = 0xEE6F, + WindowDatabase20 = 0xEE70, + WindowDevEdit16 = 0xEE71, + WindowDevEdit20 = 0xEE72, + WindowEdit20 = 0xEE73, + WindowHeaderHorizontal20 = 0xEE74, + WindowHeaderHorizontalOff20 = 0xEE75, + WindowHeaderVertical20 = 0xEE76, + WindowLocationTarget20 = 0xEE77, + WindowMultiple16 = 0xEE78, + WindowMultipleSwap20 = 0xEE79, + WindowNew16 = 0xEE7A, + WindowNew24 = 0xEE7B, + WindowPlay20 = 0xEE7C, + WindowSettings20 = 0xEE7D, + WindowText20 = 0xEE7E, + WindowWrench16 = 0xEE7F, + WindowWrench20 = 0xEE80, + WindowWrench24 = 0xEE81, + WindowWrench28 = 0xEE82, + WindowWrench32 = 0xEE83, + WindowWrench48 = 0xEE84, + Wrench16 = 0xEE85, + Wrench20 = 0xEE86, + WrenchScrewdriver20 = 0xEE87, + WrenchScrewdriver24 = 0xEE88, + Xray20 = 0xEE89, + Xray24 = 0xEE8A, + ZoomFit16 = 0xEE8B, + ZoomFit20 = 0xEE8C, + ZoomFit24 = 0xEE8D, + ZoomIn16 = 0xEE8E, + ZoomOut16 = 0xEE8F, + Braces16 = 0xEE90, + Braces28 = 0xEE91, + Braces32 = 0xEE92, + Braces48 = 0xEE93, + BranchFork32 = 0xEE94, + CalendarDataBar16 = 0xEE95, + CalendarDataBar20 = 0xEE96, + CalendarDataBar24 = 0xEE97, + CalendarDataBar28 = 0xEE98, + Clipboard3Day16 = 0xEE99, + Clipboard3Day20 = 0xEE9A, + Clipboard3Day24 = 0xEE9B, + ClipboardDay16 = 0xEE9C, + ClipboardDay20 = 0xEE9D, + ClipboardDay24 = 0xEE9E, + ClipboardMonth16 = 0xEE9F, + ClipboardMonth20 = 0xEEA0, + ClipboardMonth24 = 0xEEA1, + ContentViewGallery24 = 0xEEA2, + ContentViewGallery28 = 0xEEA3, + DataBarVertical16 = 0xEEA4, + Delete12 = 0xEEA5, + Delete32 = 0xEEA6, + Form20 = 0xEEA7, + Form24 = 0xEEA8, + Form28 = 0xEEA9, + Form48 = 0xEEAA, + MailReadMultiple20 = 0xEEAB, + MailReadMultiple32 = 0xEEAC, + MegaphoneLoud16 = 0xEEAD, + PanelRightAdd20 = 0xEEAE, + PersonNote16 = 0xEEAF, + ShieldGlobe16 = 0xEEB0, + ShieldGlobe20 = 0xEEB1, + ShieldGlobe24 = 0xEEB2, + SquareMultiple28 = 0xEEB3, + SquareMultiple32 = 0xEEB4, + SquareMultiple48 = 0xEEB5, + TableCalculator20 = 0xEEB6, + XboxController16 = 0xEEB7, + XboxController20 = 0xEEB8, + XboxController24 = 0xEEB9, + XboxController28 = 0xEEBA, + XboxController32 = 0xEEBB, + XboxController48 = 0xEEBC, + Apps32 = 0xEEBD, + ArrowParagraph16 = 0xEEBE, + ArrowParagraph24 = 0xEEBF, + Beaker32 = 0xEEC0, + AnimalRabbit32 = 0xEEC1, + BuildingRetailMore32 = 0xEEC2, + CalendarMonth32 = 0xEEC3, + ContentView24 = 0xEEC4, + ContentView28 = 0xEEC5, + CreditCardClock20 = 0xEEC6, + CreditCardClock24 = 0xEEC7, + CreditCardClock28 = 0xEEC8, + CreditCardClock32 = 0xEEC9, + Cube32 = 0xEECA, + DataBarVertical32 = 0xEECB, + Database32 = 0xEECC, + DocumentData32 = 0xEECD, + FolderPeople20 = 0xEECE, + FolderPeople24 = 0xEECF, + Gauge32 = 0xEED0, + HandLeftChat16 = 0xEED1, + HandLeftChat20 = 0xEED2, + HandLeftChat24 = 0xEED3, + HandLeftChat28 = 0xEED4, + HomeDatabase24 = 0xEED5, + HomeDatabase32 = 0xEED6, + HomeMore24 = 0xEED7, + HomeMore32 = 0xEED8, + Notebook32 = 0xEED9, + Payment32 = 0xEEDA, + Payment48 = 0xEEDB, + PersonRunning20 = 0xEEDC, + Pipeline24 = 0xEEDD, + Pipeline32 = 0xEEDE, + Stack32 = 0xEEDF, + TextAlignJustifyLowRotate27020 = 0xEEE0, + TextAlignJustifyLowRotate27024 = 0xEEE1, + TextAlignJustifyLowRotate9020 = 0xEEE2, + TextAlignJustifyLowRotate9024 = 0xEEE3, + AnimalRabbitOff20 = 0xEEE4, + AnimalRabbitOff32 = 0xEEE5, + BeakerOff20 = 0xEEE6, + BeakerOff32 = 0xEEE7, + BowlSalad20 = 0xEEE8, + BowlSalad24 = 0xEEE9, + BuildingRetailMore24 = 0xEEEA, + Connected16 = 0xEEEB, + Connected20 = 0xEEEC, + DocumentText16 = 0xEEED, + DrinkBottle20 = 0xEEEE, + DrinkBottle32 = 0xEEEF, + DrinkBottleOff20 = 0xEEF0, + DrinkBottleOff32 = 0xEEF1, + Earth32 = 0xEEF2, + EarthLeaf16 = 0xEEF3, + EarthLeaf20 = 0xEEF4, + EarthLeaf24 = 0xEEF5, + EarthLeaf32 = 0xEEF6, + Feed16 = 0xEEF7, + Feed20 = 0xEEF8, + Feed24 = 0xEEF9, + Feed28 = 0xEEFA, + Filmstrip20 = 0xEEFB, + Filmstrip24 = 0xEEFC, + FoodCarrot20 = 0xEEFD, + FoodCarrot24 = 0xEEFE, + FoodFish20 = 0xEEFF, + FoodFish24 = 0xEF00, + HandOpenHeart20 = 0xEF01, + HandOpenHeart32 = 0xEF02, + HandWave16 = 0xEF03, + HandWave20 = 0xEF04, + HandWave24 = 0xEF05, + Handshake32 = 0xEF06, + LeafOne32 = 0xEF07, + LeafTwo32 = 0xEF08, + Notebook16 = 0xEF09, + PersonHeart20 = 0xEF0A, + PersonStar16 = 0xEF0B, + PersonStar20 = 0xEF0C, + PersonStar24 = 0xEF0D, + PersonStar28 = 0xEF0E, + PersonStar32 = 0xEF0F, + PersonStar48 = 0xEF10, + PipelineAdd32 = 0xEF11, + Recycle20 = 0xEF12, + Recycle32 = 0xEF13, + Reward12 = 0xEF14, + SlideLink20 = 0xEF15, + SlideLink24 = 0xEF16, + FoodChickenLeg16 = 0xEF17, + FoodChickenLeg20 = 0xEF18, + FoodChickenLeg24 = 0xEF19, + FoodChickenLeg32 = 0xEF1A, + FormMultiple20 = 0xEF1B, + FormMultiple24 = 0xEF1C, + FormMultiple28 = 0xEF1D, + FormMultiple48 = 0xEF1E, + LaserTool20 = 0xEF1F, + Shield32 = 0xEF20, + ShieldQuestion16 = 0xEF21, + ShieldQuestion20 = 0xEF22, + ShieldQuestion24 = 0xEF23, + ShieldQuestion32 = 0xEF24, + HeartBroken24 = 0xEF25, + LayerDiagonal20 = 0xEF26, + LayerDiagonalPerson20 = 0xEF27, + TextWrap16 = 0xEF28, + TextWrapOff16 = 0xEF29, + TextWrapOff20 = 0xEF2A, + TextWrapOff24 = 0xEF2B, + TrophyLock16 = 0xEF2C, + TrophyLock20 = 0xEF2D, + TrophyLock24 = 0xEF2E, + TrophyLock28 = 0xEF2F, + TrophyLock32 = 0xEF30, + TrophyLock48 = 0xEF31, AccessTime24 = 0xF101, Accessibility16 = 0xF102, Accessibility20 = 0xF103, @@ -2057,9 +3991,7 @@ public enum SymbolRegular ArrowDownload20 = 0xF150, ArrowDownload24 = 0xF151, ArrowDownload48 = 0xF152, - ArrowGrowth20 = 0xF153, ArrowExpand24 = 0xF154, - ArrowGrowth24 = 0xF155, ArrowForward16 = 0xF156, ArrowForward20 = 0xF157, ArrowForward24 = 0xF158, @@ -2183,8 +4115,6 @@ public enum SymbolRegular Battery924 = 0xF1CE, BatteryCharge20 = 0xF1CF, BatteryCharge24 = 0xF1D0, - BatteryFull20 = 0xF1D1, - BatteryFull24 = 0xF1D2, BatterySaver20 = 0xF1D3, BatterySaver24 = 0xF1D4, BatteryWarning24 = 0xF1D5, @@ -2193,9 +4123,6 @@ public enum SymbolRegular Beaker24 = 0xF1D8, Bed20 = 0xF1D9, Bed24 = 0xF1DA, - Block16 = 0xF1DB, - Block20 = 0xF1DC, - Block24 = 0xF1DD, Bluetooth20 = 0xF1DE, Bluetooth24 = 0xF1DF, BluetoothConnected24 = 0xF1E0, @@ -2236,7 +4163,6 @@ public enum SymbolRegular CalendarInfo16 = 0xF203, CalendarMultiple16 = 0xF204, Building24 = 0xF205, - CalendarPatterns16 = 0xF206, CallCheckmark20 = 0xF207, CallDismiss20 = 0xF208, BuildingRetail24 = 0xF209, @@ -2261,7 +4187,6 @@ public enum SymbolRegular CalendarCheckmark20 = 0xF21C, CalendarClock20 = 0xF21D, CalendarClock24 = 0xF21E, - CellularDataUnavailable24 = 0xF21F, ChatHelp20 = 0xF220, ChatSettings20 = 0xF221, CalendarDay20 = 0xF222, @@ -2277,7 +4202,6 @@ public enum SymbolRegular CalendarMonth28 = 0xF22C, CalendarMultiple20 = 0xF22D, CalendarMultiple24 = 0xF22E, - CalendarOverdue24 = 0xF22F, CalendarPerson20 = 0xF230, CalendarReply16 = 0xF231, CalendarReply20 = 0xF232, @@ -2321,10 +4245,6 @@ public enum SymbolRegular CameraAdd24 = 0xF258, CameraAdd48 = 0xF259, CameraSwitch24 = 0xF25A, - Caret12 = 0xF25B, - Caret16 = 0xF25C, - Caret20 = 0xF25D, - Caret24 = 0xF25E, CaretDown12 = 0xF25F, CaretDown16 = 0xF260, CaretDown20 = 0xF261, @@ -2447,8 +4367,6 @@ public enum SymbolRegular ClipboardPaste24 = 0xF2D6, ClipboardSearch20 = 0xF2D7, ClipboardSearch24 = 0xF2D8, - Chopsticks16 = 0xF2D9, - Chopsticks20 = 0xF2DA, Clock12 = 0xF2DB, Clock16 = 0xF2DC, Clock20 = 0xF2DD, @@ -2461,14 +4379,8 @@ public enum SymbolRegular Cloud20 = 0xF2E4, Cloud24 = 0xF2E5, Cloud48 = 0xF2E6, - CloudBackup24 = 0xF2E7, - CloudBackup48 = 0xF2E8, - CloudDownload24 = 0xF2E9, CloudOff24 = 0xF2EA, CloudOff48 = 0xF2EB, - CloudOffline24 = 0xF2EC, - CloudSyncComplete24 = 0xF2ED, - CloudSyncComplete48 = 0xF2EE, Code20 = 0xF2EF, Code24 = 0xF2F0, Collections20 = 0xF2F1, @@ -2488,14 +4400,12 @@ public enum SymbolRegular Comment20 = 0xF2FF, Comment24 = 0xF300, CommentAdd24 = 0xF301, - Chopsticks24 = 0xF302, CommentMention16 = 0xF303, CommentMention20 = 0xF304, CommentMention24 = 0xF305, CommentMultiple16 = 0xF306, CommentMultiple20 = 0xF307, CommentMultiple24 = 0xF308, - Chopsticks28 = 0xF309, CircleHalfFill16 = 0xF30A, ClipboardHeart20 = 0xF30B, Communication16 = 0xF30C, @@ -2524,8 +4434,6 @@ public enum SymbolRegular ContentSettings16 = 0xF323, ContentSettings20 = 0xF324, ContentSettings24 = 0xF325, - ConvertToTable24 = 0xF326, - ConvertToText24 = 0xF327, Cookies20 = 0xF328, Cookies24 = 0xF329, Copy16 = 0xF32A, @@ -2628,11 +4536,9 @@ public enum SymbolRegular DocumentError20 = 0xF38B, DocumentError24 = 0xF38C, DocumentFooter24 = 0xF38D, - DocumentFooterRemove24 = 0xF38E, DocumentHeader24 = 0xF38F, DocumentHeaderFooter20 = 0xF390, DocumentHeaderFooter24 = 0xF391, - DocumentHeaderRemove24 = 0xF392, DocumentLandscape20 = 0xF393, DocumentLandscape24 = 0xF394, DocumentMargins20 = 0xF395, @@ -2731,14 +4637,6 @@ public enum SymbolRegular ErrorCircle24 = 0xF3F2, Dismiss32 = 0xF3F3, ExtendedDock24 = 0xF3F4, - Extension20 = 0xF3F5, - Extension24 = 0xF3F6, - EyeHide20 = 0xF3F7, - EyeHide24 = 0xF3F8, - EyeShow12 = 0xF3F9, - EyeShow16 = 0xF3FA, - EyeShow20 = 0xF3FB, - EyeShow24 = 0xF3FC, FastAcceleration24 = 0xF3FD, FastForward20 = 0xF3FE, FastForward24 = 0xF3FF, @@ -2762,8 +4660,6 @@ public enum SymbolRegular FlagOff48 = 0xF411, FlashAuto24 = 0xF412, FlashOff24 = 0xF413, - FlashOn20 = 0xF414, - FlashOn24 = 0xF415, Flashlight24 = 0xF416, FlashlightOff24 = 0xF417, Folder20 = 0xF418, @@ -2918,7 +4814,6 @@ public enum SymbolRegular Insert20 = 0xF4AD, Fax16 = 0xF4AE, Flow16 = 0xF4AF, - IosArrowLeft24 = 0xF4B0, FolderGlobe16 = 0xF4B1, IosChevronRight20 = 0xF4B2, Javascript16 = 0xF4B3, @@ -3009,8 +4904,6 @@ public enum SymbolRegular Mail28 = 0xF508, Mail48 = 0xF509, MailAdd24 = 0xF50A, - MailAll20 = 0xF50B, - MailAll24 = 0xF50C, MailAdd16 = 0xF50D, MailAllRead20 = 0xF50E, MailAllUnread20 = 0xF50F, @@ -3065,11 +4958,6 @@ public enum SymbolRegular MicOff16 = 0xF540, MicOff24 = 0xF541, MicOff28 = 0xF542, - MicOn16 = 0xF543, - MicOn20 = 0xF544, - MicOn24 = 0xF545, - MicOn28 = 0xF546, - MicOn48 = 0xF547, MicSettings24 = 0xF548, Midi20 = 0xF549, Midi24 = 0xF54A, @@ -3089,8 +4977,6 @@ public enum SymbolRegular MoreVertical28 = 0xF558, MoreVertical48 = 0xF559, MoviesAndTv24 = 0xF55A, - Multiselect20 = 0xF55B, - Multiselect24 = 0xF55C, MailError24 = 0xF55D, MailInboxArrowDown16 = 0xF55E, MyLocation24 = 0xF55F, @@ -3125,8 +5011,6 @@ public enum SymbolRegular NumberSymbol16 = 0xF57C, NumberSymbol20 = 0xF57D, NumberSymbol24 = 0xF57E, - OfficeApps24 = 0xF57F, - OfficeApps28 = 0xF580, Open16 = 0xF581, Open20 = 0xF582, Open24 = 0xF583, @@ -3139,7 +5023,6 @@ public enum SymbolRegular Organization24 = 0xF58A, Organization28 = 0xF58B, MailLink24 = 0xF58C, - Page20 = 0xF58D, PageFit16 = 0xF58E, PageFit20 = 0xF58F, PageFit24 = 0xF590, @@ -3150,12 +5033,6 @@ public enum SymbolRegular PaintBucket20 = 0xF595, PaintBucket24 = 0xF596, Pair24 = 0xF597, - PaneClose16 = 0xF598, - PaneClose20 = 0xF599, - PaneClose24 = 0xF59A, - PaneOpen16 = 0xF59B, - PaneOpen20 = 0xF59C, - PaneOpen24 = 0xF59D, Password24 = 0xF59E, Patient24 = 0xF59F, Pause16 = 0xF5A0, @@ -3366,7 +5243,6 @@ public enum SymbolRegular ResizeImage24 = 0xF66D, ResizeTable24 = 0xF66E, ResizeVideo24 = 0xF66F, - Restore16 = 0xF670, Reward16 = 0xF671, Reward20 = 0xF672, Reward24 = 0xF673, @@ -3419,9 +5295,6 @@ public enum SymbolRegular SerialPort20 = 0xF6A2, SerialPort24 = 0xF6A3, ServiceBell24 = 0xF6A4, - SetTopStack16 = 0xF6A5, - SetTopStack20 = 0xF6A6, - SetTopStack24 = 0xF6A7, Settings16 = 0xF6A8, Settings20 = 0xF6A9, Settings24 = 0xF6AA, @@ -3477,15 +5350,11 @@ public enum SymbolRegular Signature20 = 0xF6DC, Signature24 = 0xF6DD, Signature28 = 0xF6DE, - Signed16 = 0xF6DF, - Signed20 = 0xF6E0, - Signed24 = 0xF6E1, Sim16 = 0xF6E2, Sim20 = 0xF6E3, Sim24 = 0xF6E4, Sleep24 = 0xF6E5, SlideAdd24 = 0xF6E6, - SlideDesign24 = 0xF6E7, SlideHide24 = 0xF6E8, SlideLayout20 = 0xF6E9, SlideLayout24 = 0xF6EA, @@ -3657,8 +5526,6 @@ public enum SymbolRegular Temperature24 = 0xF790, Tent24 = 0xF791, Stack20 = 0xF792, - Text24 = 0xF793, - TextAdd24 = 0xF794, TextAddSpaceAfter20 = 0xF795, TextAddSpaceAfter24 = 0xF796, TextAddSpaceBefore20 = 0xF797, @@ -3717,14 +5584,6 @@ public enum SymbolRegular TextDescription24 = 0xF7CC, VehicleCarProfileLtr16 = 0xF7CD, VehicleCarProfileRtl16 = 0xF7CE, - TextDirectionHorizontalLtr20 = 0xF7CF, - TextDirectionHorizontalLtr24 = 0xF7D0, - TextDirectionRotate27020 = 0xF7D1, - TextDirectionRotate27024 = 0xF7D2, - TextDirectionRotate270Ac20 = 0xF7D3, - TextDirectionRotate270Ac24 = 0xF7D4, - TextDirectionRotate9020 = 0xF7D5, - TextDirectionRotate9024 = 0xF7D6, TextDirectionVertical20 = 0xF7D7, TextDirectionVertical24 = 0xF7D8, TextEditStyle20 = 0xF7D9, @@ -3752,8 +5611,6 @@ public enum SymbolRegular TextHeader120 = 0xF7EF, TextHeader220 = 0xF7F0, TextHeader320 = 0xF7F1, - TextIndentDecrease24 = 0xF7F2, - TextIndentIncrease24 = 0xF7F3, TextItalic20 = 0xF7F4, TextItalic24 = 0xF7F5, TextLineSpacing20 = 0xF7F6, @@ -3791,8 +5648,6 @@ public enum SymbolRegular TextboxAlignMiddle24 = 0xF816, TextboxAlignTop20 = 0xF817, TextboxAlignTop24 = 0xF818, - TextboxVertical20 = 0xF819, - TextboxVertical24 = 0xF81A, Thinking20 = 0xF81B, Thinking24 = 0xF81C, ThumbDislike20 = 0xF81D, @@ -3827,8 +5682,6 @@ public enum SymbolRegular BookQuestionMarkRtl24 = 0xF83A, BrainCircuit24 = 0xF83B, BuildingBankToolbox24 = 0xF83C, - UsbPort20 = 0xF83D, - UsbPort24 = 0xF83E, UsbStick20 = 0xF83F, UsbStick24 = 0xF840, Vault16 = 0xF841, @@ -3946,7 +5799,6 @@ public enum SymbolRegular Wifi324 = 0xF8B1, Wifi420 = 0xF8B2, Wifi424 = 0xF8B3, - WifiProtected24 = 0xF8B4, Window20 = 0xF8B5, WindowAd20 = 0xF8B6, WindowDevTools16 = 0xF8B7, @@ -3999,13 +5851,10 @@ public enum SymbolRegular ArrowRedo32 = 0xF8E6, ArrowRedo48 = 0xF8E7, CheckmarkCircle32 = 0xF8E8, - CircleSubtractArrowBack16 = 0xF8E9, - CircleSubtractArrowForward16 = 0xF8EA, ArrowUpRight16 = 0xF8EB, AttachArrowRight20 = 0xF8EC, AttachArrowRight24 = 0xF8ED, AttachText24 = 0xF8EE, - AutofitContent24 = 0xF8EF, Backpack12 = 0xF8F0, Backpack16 = 0xF8F1, Backpack20 = 0xF8F2, @@ -4022,1797 +5871,6 @@ public enum SymbolRegular Book20 = 0xF8FD, Book24 = 0xF8FE, BookAdd20 = 0xF8FF, - BookAdd24 = 0xF900, - BookClock24 = 0xF901, - BookCoins24 = 0xF902, - BookCompass24 = 0xF903, - BookDatabase24 = 0xF904, - BookExclamationMark24 = 0xF905, - BookInformation24 = 0xF906, - BookLetter24 = 0xF907, - BookOpen20 = 0xF908, - BookOpen24 = 0xF909, - BookOpenGlobe24 = 0xF90A, - BookPulse24 = 0xF90B, - BookQuestionMark24 = 0xF90C, - BookSearch24 = 0xF90D, - BookStar24 = 0xF90E, - BookTheta24 = 0xF90F, - BorderAll24 = 0xF910, - BorderBottom24 = 0xF911, - BorderBottomDouble24 = 0xF912, - BorderBottomThick24 = 0xF913, - BorderLeft24 = 0xF914, - ClipboardBulletListLtr16 = 0xF915, - BorderOutside24 = 0xF916, - BorderOutsideThick24 = 0xF917, - BorderRight24 = 0xF918, - BorderTop24 = 0xF919, - BorderTopBottom24 = 0xF91A, - BorderTopBottomDouble24 = 0xF91B, - BorderTopBottomThick24 = 0xF91C, - Briefcase12 = 0xF91D, - Briefcase32 = 0xF91E, - ClipboardBulletListRtl16 = 0xF91F, - ColumnEdit20 = 0xF920, - Bug16 = 0xF921, - Bug20 = 0xF922, - Bug24 = 0xF923, - BuildingBank16 = 0xF924, - BuildingBank20 = 0xF925, - BuildingBank24 = 0xF926, - BuildingGovernment24 = 0xF927, - BuildingGovernment32 = 0xF928, - BuildingMultiple24 = 0xF929, - BuildingShop16 = 0xF92A, - BuildingShop20 = 0xF92B, - BuildingShop24 = 0xF92C, - BuildingSkyscraper16 = 0xF92D, - BuildingSkyscraper20 = 0xF92E, - BuildingSkyscraper24 = 0xF92F, - CalendarCancel16 = 0xF930, - CalendarClock16 = 0xF931, - CalendarMention20 = 0xF932, - CalendarPerson24 = 0xF933, - CalendarQuestionMark16 = 0xF934, - CalendarQuestionMark20 = 0xF935, - CalendarQuestionMark24 = 0xF936, - ColumnEdit24 = 0xF937, - ContactCard28 = 0xF938, - ContactCard32 = 0xF939, - ContactCard48 = 0xF93A, - Diagram24 = 0xF93B, - CallForward16 = 0xF93C, - CallForward20 = 0xF93D, - CallForward28 = 0xF93E, - CallForward48 = 0xF93F, - CallInbound20 = 0xF940, - CallInbound28 = 0xF941, - CallInbound48 = 0xF942, - CallMissed28 = 0xF943, - CallMissed48 = 0xF944, - CallOutbound20 = 0xF945, - CallOutbound28 = 0xF946, - CallOutbound48 = 0xF947, - CallPark16 = 0xF948, - CallPark20 = 0xF949, - CallPark28 = 0xF94A, - CallPark48 = 0xF94B, - CameraEdit20 = 0xF94C, - CaretUp12 = 0xF94D, - CaretUp16 = 0xF94E, - CaretUp20 = 0xF94F, - CaretUp24 = 0xF950, - Cart16 = 0xF951, - Cart20 = 0xF952, - DismissCircle32 = 0xF953, - DocumentArrowDown16 = 0xF954, - Channel28 = 0xF955, - Channel48 = 0xF956, - ChannelAdd16 = 0xF957, - ChannelAdd20 = 0xF958, - ChannelAdd24 = 0xF959, - ChannelAdd28 = 0xF95A, - ChannelAdd48 = 0xF95B, - ChannelAlert16 = 0xF95C, - ChannelAlert20 = 0xF95D, - ChannelAlert24 = 0xF95E, - ChannelAlert28 = 0xF95F, - ChannelAlert48 = 0xF960, - ChannelArrowLeft16 = 0xF961, - ChannelArrowLeft20 = 0xF962, - ChannelArrowLeft24 = 0xF963, - ChannelArrowLeft28 = 0xF964, - ChannelArrowLeft48 = 0xF965, - ChannelDismiss16 = 0xF966, - ChannelDismiss20 = 0xF967, - ChannelDismiss24 = 0xF968, - ChannelDismiss28 = 0xF969, - ChannelDismiss48 = 0xF96A, - Chat16 = 0xF96B, - Checkmark16 = 0xF96C, - DocumentBulletListClock20 = 0xF96D, - ClipboardPaste16 = 0xF96E, - ClockDismiss24 = 0xF96F, - ClosedCaption16 = 0xF970, - ClosedCaption20 = 0xF971, - ClosedCaption28 = 0xF972, - ClosedCaption48 = 0xF973, - CloudDownload32 = 0xF974, - CloudDownload48 = 0xF975, - ColorBackgroundAccent20 = 0xF976, - ColorBackgroundAccent24 = 0xF977, - ColorFillAccent20 = 0xF978, - ColorFillAccent24 = 0xF979, - ColorLine16 = 0xF97A, - ColorLineAccent16 = 0xF97B, - ColorLineAccent20 = 0xF97C, - ColorLineAccent24 = 0xF97D, - Comment12 = 0xF97E, - Comment28 = 0xF97F, - Comment48 = 0xF980, - CommentAdd12 = 0xF981, - CommentAdd16 = 0xF982, - CommentAdd20 = 0xF983, - CommentAdd28 = 0xF984, - CommentAdd48 = 0xF985, - CommentArrowLeft12 = 0xF986, - CommentArrowLeft16 = 0xF987, - CommentArrowLeft20 = 0xF988, - CommentArrowLeft28 = 0xF989, - CommentArrowLeft48 = 0xF98A, - CommentArrowRight12 = 0xF98B, - CommentArrowRight16 = 0xF98C, - CommentArrowRight20 = 0xF98D, - CommentArrowRight28 = 0xF98E, - CommentArrowRight48 = 0xF98F, - CommentCheckmark12 = 0xF990, - CommentCheckmark16 = 0xF991, - CommentCheckmark20 = 0xF992, - CommentCheckmark24 = 0xF993, - CommentCheckmark28 = 0xF994, - CommentCheckmark48 = 0xF995, - CommentEdit20 = 0xF996, - CommentEdit24 = 0xF997, - CommentOff16 = 0xF998, - CommentOff20 = 0xF999, - CommentOff24 = 0xF99A, - CommentOff28 = 0xF99B, - CommentOff48 = 0xF99C, - ContactCardGroup16 = 0xF99D, - ContactCardGroup20 = 0xF99E, - ContactCardGroup28 = 0xF99F, - ContactCardGroup48 = 0xF9A0, - ConvertRange24 = 0xF9A1, - CopyAdd24 = 0xF9A2, - CopySelect20 = 0xF9A3, - Couch12 = 0xF9A4, - Couch24 = 0xF9A5, - Crop20 = 0xF9A6, - CurrencyDollarRupee16 = 0xF9A7, - CurrencyDollarRupee20 = 0xF9A8, - CurrencyDollarRupee24 = 0xF9A9, - Cursor20 = 0xF9AA, - Cursor24 = 0xF9AB, - CursorHover16 = 0xF9AC, - CursorHover20 = 0xF9AD, - CursorHover24 = 0xF9AE, - CursorHover28 = 0xF9AF, - CursorHover32 = 0xF9B0, - CursorHover48 = 0xF9B1, - CursorHoverOff16 = 0xF9B2, - CursorHoverOff20 = 0xF9B3, - CursorHoverOff24 = 0xF9B4, - CursorHoverOff28 = 0xF9B5, - CursorHoverOff48 = 0xF9B6, - DataBarVerticalAdd24 = 0xF9B7, - DataUsage20 = 0xF9B8, - DecimalArrowLeft24 = 0xF9B9, - DecimalArrowRight24 = 0xF9BA, - Delete16 = 0xF9BB, - Dentist12 = 0xF9BC, - Dentist16 = 0xF9BD, - Dentist20 = 0xF9BE, - Dentist28 = 0xF9BF, - Dentist48 = 0xF9C0, - DismissCircle28 = 0xF9C1, - DocumentBulletListClock24 = 0xF9C2, - DocumentBulletListOff24 = 0xF9C3, - DocumentMultiple16 = 0xF9C4, - DocumentPill20 = 0xF9C5, - DocumentPill24 = 0xF9C6, - DocumentSave20 = 0xF9C7, - DocumentSave24 = 0xF9C8, - Doctor12 = 0xF9C9, - Doctor16 = 0xF9CA, - Doctor20 = 0xF9CB, - Doctor28 = 0xF9CC, - Doctor48 = 0xF9CD, - Document16 = 0xF9CE, - Document48 = 0xF9CF, - DocumentAdd16 = 0xF9D0, - DocumentAdd20 = 0xF9D1, - DocumentAdd24 = 0xF9D2, - DocumentAdd28 = 0xF9D3, - DocumentAdd48 = 0xF9D4, - DocumentArrowLeft16 = 0xF9D5, - DocumentArrowLeft20 = 0xF9D6, - DocumentArrowLeft24 = 0xF9D7, - DocumentArrowLeft28 = 0xF9D8, - DocumentArrowLeft48 = 0xF9D9, - DocumentCatchUp16 = 0xF9DA, - DocumentCatchUp20 = 0xF9DB, - DocumentLandscapeData24 = 0xF9DC, - DocumentLandscapeSplit20 = 0xF9DD, - DocumentLandscapeSplitHint20 = 0xF9DE, - DocumentPageBreak20 = 0xF9DF, - DrinkBeer16 = 0xF9E0, - DrinkBeer20 = 0xF9E1, - DrinkCoffee16 = 0xF9E2, - DrinkMargarita16 = 0xF9E3, - DrinkMargarita20 = 0xF9E4, - DrinkWine16 = 0xF9E5, - DrinkWine20 = 0xF9E6, - DualScreenSpan24 = 0xF9E7, - Edit32 = 0xF9E8, - EditOff16 = 0xF9E9, - EditOff24 = 0xF9EA, - EditSettings24 = 0xF9EB, - EmojiAdd16 = 0xF9EC, - EmojiHand24 = 0xF9ED, - EmojiHand28 = 0xF9EE, - Eraser20 = 0xF9EF, - Eraser24 = 0xF9F0, - EraserMedium24 = 0xF9F1, - EraserSegment24 = 0xF9F2, - EraserSmall24 = 0xF9F3, - ErrorCircle12 = 0xF9F4, - Door16 = 0xF9F5, - DualScreenArrowUp24 = 0xF9F6, - DualScreenClosedAlert24 = 0xF9F7, - EyeTrackingOff16 = 0xF9F8, - EyeTrackingOff20 = 0xF9F9, - EyeTrackingOff24 = 0xF9FA, - FStop16 = 0xF9FB, - FStop20 = 0xF9FC, - FStop24 = 0xF9FD, - FStop28 = 0xF9FE, - Fingerprint48 = 0xF9FF, - FixedWidth24 = 0xFA00, - FlipHorizontal24 = 0xFA01, - FlipVertical24 = 0xFA02, - Fluent32 = 0xFA03, - Fluent48 = 0xFA04, - Fluid20 = 0xFA05, - Fluid24 = 0xFA06, - EmojiMultiple20 = 0xFA07, - FoodEgg16 = 0xFA08, - FoodEgg20 = 0xFA09, - FoodToast16 = 0xFA0A, - FoodToast20 = 0xFA0B, - Gavel24 = 0xFA0C, - Gavel32 = 0xFA0D, - Glasses16 = 0xFA0E, - Glasses20 = 0xFA0F, - Glasses28 = 0xFA10, - Glasses48 = 0xFA11, - GlassesOff16 = 0xFA12, - GlassesOff20 = 0xFA13, - GlassesOff28 = 0xFA14, - GlassesOff48 = 0xFA15, - Globe16 = 0xFA16, - HandLeft20 = 0xFA17, - HandRight24 = 0xFA18, - HandRight28 = 0xFA19, - HatGraduation16 = 0xFA1A, - HatGraduation20 = 0xFA1B, - HatGraduation24 = 0xFA1C, - Hd16 = 0xFA1D, - Hd20 = 0xFA1E, - Hd24 = 0xFA1F, - Headset16 = 0xFA20, - Headset20 = 0xFA21, - Headset48 = 0xFA22, - HeartPulse24 = 0xFA23, - HeartPulse32 = 0xFA24, - Home16 = 0xFA25, - Home32 = 0xFA26, - Home48 = 0xFA27, - ImageArrowCounterclockwise24 = 0xFA28, - InfoShield20 = 0xFA29, - KeyMultiple20 = 0xFA2A, - LineHorizontal5Error20 = 0xFA2B, - LinkSquare12 = 0xFA2C, - LinkSquare16 = 0xFA2D, - Location48 = 0xFA2E, - LocationOff16 = 0xFA2F, - LocationOff20 = 0xFA30, - LocationOff24 = 0xFA31, - LocationOff28 = 0xFA32, - LocationOff48 = 0xFA33, - LockMultiple24 = 0xFA34, - Lottery24 = 0xFA35, - EmojiMultiple24 = 0xFA36, - GanttChart20 = 0xFA37, - GanttChart24 = 0xFA38, - GiftCardAdd24 = 0xFA39, - Mail16 = 0xFA3A, - MailRead16 = 0xFA3B, - MathFormatLinear24 = 0xFA3C, - MathFormatProfessional24 = 0xFA3D, - MathFormula24 = 0xFA3E, - Maximize20 = 0xFA3F, - Maximize24 = 0xFA40, - Maximize28 = 0xFA41, - Maximize48 = 0xFA42, - MeetNow16 = 0xFA43, - MicOff20 = 0xFA44, - MicOff48 = 0xFA45, - MicProhibited24 = 0xFA46, - HandDraw24 = 0xFA47, - ImageArrowBack24 = 0xFA48, - ImageArrowForward24 = 0xFA49, - ImageMultiple16 = 0xFA4A, - ImageReflection24 = 0xFA4B, - ImageShadow24 = 0xFA4C, - MoreCircle20 = 0xFA4D, - MoviesAndTv16 = 0xFA4E, - MoviesAndTv20 = 0xFA4F, - LocalLanguageZi24 = 0xFA50, - MailArrowDoubleBack16 = 0xFA51, - MailArrowForward16 = 0xFA52, - MailAttach16 = 0xFA53, - NavigationUnread24 = 0xFA54, - NumberSymbolDismiss24 = 0xFA55, - Open28 = 0xFA56, - Open48 = 0xFA57, - OpenFolder16 = 0xFA58, - OpenFolder20 = 0xFA59, - OpenFolder28 = 0xFA5A, - OpenFolder48 = 0xFA5B, - OpenOff16 = 0xFA5C, - OpenOff20 = 0xFA5D, - OpenOff24 = 0xFA5E, - OpenOff28 = 0xFA5F, - OpenOff48 = 0xFA60, - PaintBrushArrowDown24 = 0xFA61, - PaintBrushArrowUp24 = 0xFA62, - Pause12 = 0xFA63, - Payment16 = 0xFA64, - Payment28 = 0xFA65, - PeopleProhibited16 = 0xFA66, - PeopleSwap16 = 0xFA67, - PeopleSwap20 = 0xFA68, - PeopleSwap24 = 0xFA69, - PeopleSwap28 = 0xFA6A, - PeopleTeamAdd20 = 0xFA6B, - PeopleTeamAdd24 = 0xFA6C, - MoreHorizontal32 = 0xFA6D, - PersonAvailable20 = 0xFA6E, - PersonClock16 = 0xFA6F, - PersonClock20 = 0xFA70, - PersonClock24 = 0xFA71, - PersonDelete20 = 0xFA72, - PersonMail16 = 0xFA73, - PersonMail20 = 0xFA74, - PersonMail24 = 0xFA75, - PersonMail28 = 0xFA76, - PersonMail48 = 0xFA77, - PersonProhibited24 = 0xFA78, - MoreVertical32 = 0xFA79, - Poll20 = 0xFA7A, - PresenceAvailable10 = 0xFA7B, - PresenceAvailable12 = 0xFA7C, - PresenceAvailable16 = 0xFA7D, - PresenceDnd10 = 0xFA7E, - PresenceDnd12 = 0xFA7F, - PresenceDnd16 = 0xFA80, - Pulse24 = 0xFA81, - QrCode20 = 0xFA82, - RealEstate24 = 0xFA83, - Ribbon24 = 0xFA84, - RibbonStar20 = 0xFA85, - RibbonStar24 = 0xFA86, - Run16 = 0xFA87, - Run20 = 0xFA88, - Scales24 = 0xFA89, - Scales32 = 0xFA8A, - SearchShield20 = 0xFA8B, - Multiselect16 = 0xFA8C, - Organization16 = 0xFA8D, - Organization32 = 0xFA8E, - ShieldDismissShield20 = 0xFA8F, - ShiftsDay20 = 0xFA90, - ShiftsDay24 = 0xFA91, - SidebarSearchLtr20 = 0xFA92, - SidebarSearchRtl20 = 0xFA93, - SignOut20 = 0xFA94, - SlideMultipleArrowRight24 = 0xFA95, - SlideSearch24 = 0xFA96, - SlideSearch28 = 0xFA97, - SlideSize24 = 0xFA98, - SlideText16 = 0xFA99, - SlideText20 = 0xFA9A, - SlideText28 = 0xFA9B, - SlideText48 = 0xFA9C, - Speaker016 = 0xFA9D, - Speaker020 = 0xFA9E, - Speaker028 = 0xFA9F, - Speaker048 = 0xFAA0, - Speaker116 = 0xFAA1, - Speaker120 = 0xFAA2, - Speaker128 = 0xFAA3, - Speaker148 = 0xFAA4, - Organization48 = 0xFAA5, - SpeakerBluetooth28 = 0xFAA6, - Orientation24 = 0xFAA7, - PeopleList16 = 0xFAA8, - SpeakerOff16 = 0xFAA9, - SpeakerOff20 = 0xFAAA, - SpeakerOff48 = 0xFAAB, - SpeakerUsb24 = 0xFAAC, - SpeakerUsb28 = 0xFAAD, - Sport16 = 0xFAAE, - Sport20 = 0xFAAF, - Sport24 = 0xFAB0, - SportAmericanFootball24 = 0xFAB1, - SportBaseball24 = 0xFAB2, - SportBasketball24 = 0xFAB3, - SportHockey24 = 0xFAB4, - StarEdit24 = 0xFAB5, - TabDesktopArrowLeft20 = 0xFAB6, - TabProhibited24 = 0xFAB7, - Table16 = 0xFAB8, - Table28 = 0xFAB9, - Table48 = 0xFABA, - TableSimple16 = 0xFABB, - TableSimple20 = 0xFABC, - TableSimple24 = 0xFABD, - TableSimple28 = 0xFABE, - TableSimple48 = 0xFABF, - Tag16 = 0xFAC0, - TasksApp20 = 0xFAC1, - Tent12 = 0xFAC2, - Tent16 = 0xFAC3, - Tent20 = 0xFAC4, - Tent28 = 0xFAC5, - Tent48 = 0xFAC6, - TextBold16 = 0xFAC7, - TextColor16 = 0xFAC8, - TextColorAccent16 = 0xFAC9, - TextColorAccent20 = 0xFACA, - TextColorAccent24 = 0xFACB, - TextColumnOneNarrow20 = 0xFACC, - TextColumnOneNarrow24 = 0xFACD, - TextColumnOneWide20 = 0xFACE, - TextColumnOneWide24 = 0xFACF, - TextContinuous24 = 0xFAD0, - TextIndentDecrease20 = 0xFAD1, - TextIndentIncrease20 = 0xFAD2, - TextItalic16 = 0xFAD3, - PeopleMoney20 = 0xFAD4, - TextUnderline16 = 0xFAD5, - PeopleMoney24 = 0xFAD6, - PersonPill20 = 0xFAD7, - PersonPill24 = 0xFAD8, - PersonSettings16 = 0xFAD9, - Pivot20 = 0xFADA, - Pivot24 = 0xFADB, - Play12 = 0xFADC, - PrintAdd24 = 0xFADD, - Pulse28 = 0xFADE, - ReceiptAdd24 = 0xFADF, - ReceiptBag24 = 0xFAE0, - ReceiptCube24 = 0xFAE1, - ScanObject20 = 0xFAE2, - ScanObject24 = 0xFAE3, - TicketDiagonal16 = 0xFAE4, - TicketDiagonal20 = 0xFAE5, - TicketDiagonal24 = 0xFAE6, - TicketDiagonal28 = 0xFAE7, - Timer16 = 0xFAE8, - Timer20 = 0xFAE9, - ToggleLeft16 = 0xFAEA, - ToggleLeft20 = 0xFAEB, - ToggleLeft24 = 0xFAEC, - ToggleLeft28 = 0xFAED, - ToggleLeft48 = 0xFAEE, - ToggleRight28 = 0xFAEF, - ToggleRight48 = 0xFAF0, - Tv16 = 0xFAF1, - Tv20 = 0xFAF2, - Tv24 = 0xFAF3, - Tv28 = 0xFAF4, - Tv48 = 0xFAF5, - VehicleBicycle16 = 0xFAF6, - VehicleBicycle20 = 0xFAF7, - VehicleBus16 = 0xFAF8, - VehicleBus20 = 0xFAF9, - VehicleCar28 = 0xFAFA, - VehicleCar48 = 0xFAFB, - VehicleShip16 = 0xFAFC, - VehicleShip20 = 0xFAFD, - VehicleShip24 = 0xFAFE, - VehicleSubway16 = 0xFAFF, - VehicleSubway20 = 0xFB00, - VehicleSubway24 = 0xFB01, - VehicleTruck16 = 0xFB02, - VehicleTruck20 = 0xFB03, - VideoClip20 = 0xFB04, - Vote20 = 0xFB05, - Vote24 = 0xFB06, - WeatherDrizzle20 = 0xFB07, - WeatherDrizzle24 = 0xFB08, - WeatherDrizzle48 = 0xFB09, - WeatherHaze20 = 0xFB0A, - WeatherHaze24 = 0xFB0B, - WeatherHaze48 = 0xFB0C, - WeatherMoon16 = 0xFB0D, - WeatherMoon28 = 0xFB0E, - WeatherMoonOff16 = 0xFB0F, - WeatherMoonOff20 = 0xFB10, - WeatherMoonOff24 = 0xFB11, - WeatherMoonOff28 = 0xFB12, - WeatherMoonOff48 = 0xFB13, - WeatherSunnyHigh20 = 0xFB14, - WeatherSunnyHigh24 = 0xFB15, - WeatherSunnyHigh48 = 0xFB16, - WeatherSunnyLow20 = 0xFB17, - WeatherSunnyLow24 = 0xFB18, - WeatherSunnyLow48 = 0xFB19, - Search12 = 0xFB1A, - WindowNew16 = 0xFB1B, - WindowNew24 = 0xFB1C, - Search32 = 0xFB1D, - Wrench16 = 0xFB1E, - Wrench20 = 0xFB1F, - VideoBackgroundEffect20 = 0xFB20, - Alert16 = 0xFB21, - ApprovalsApp16 = 0xFB22, - ApprovalsApp20 = 0xFB23, - ArrowBounce16 = 0xFB24, - ArrowBounce24 = 0xFB25, - Search48 = 0xFB26, - ArrowEnterUp20 = 0xFB27, - ArrowEnterUp24 = 0xFB28, - BookmarkMultiple20 = 0xFB29, - Briefcase28 = 0xFB2A, - Briefcase48 = 0xFB2B, - Building20 = 0xFB2C, - Chat48 = 0xFB2D, - Share16 = 0xFB2E, - ShieldBadge24 = 0xFB2F, - DesktopArrowRight16 = 0xFB30, - DesktopArrowRight20 = 0xFB31, - DesktopArrowRight24 = 0xFB32, - DesktopSpeaker20 = 0xFB33, - DesktopSpeaker24 = 0xFB34, - DesktopSpeakerOff20 = 0xFB35, - DesktopSpeakerOff24 = 0xFB36, - EmojiAdd20 = 0xFB37, - FoodCake20 = 0xFB38, - GridKanban20 = 0xFB39, - HandRight20 = 0xFB3A, - HandRightOff20 = 0xFB3B, - LearningApp20 = 0xFB3C, - LearningApp24 = 0xFB3D, - LiveOff20 = 0xFB3E, - LiveOff24 = 0xFB3F, - MicProhibited20 = 0xFB40, - NotebookSection20 = 0xFB41, - PeopleAudience20 = 0xFB42, - PeopleCall16 = 0xFB43, - PeopleCall20 = 0xFB44, - PersonCall16 = 0xFB45, - PersonCall20 = 0xFB46, - PhoneDesktopAdd20 = 0xFB47, - Presenter20 = 0xFB48, - PresenterOff20 = 0xFB49, - RectangleLandscape20 = 0xFB4A, - Ribbon20 = 0xFB4B, - SaveSync20 = 0xFB4C, - Shifts20 = 0xFB4D, - ShiftsCheckmark20 = 0xFB4E, - ShiftsCheckmark24 = 0xFB4F, - SlideMultiple24 = 0xFB50, - StarLineHorizontal320 = 0xFB51, - StarLineHorizontal324 = 0xFB52, - TableAdd20 = 0xFB53, - TableDismiss20 = 0xFB54, - TableDismiss24 = 0xFB55, - TapDouble20 = 0xFB56, - TapSingle20 = 0xFB57, - TextBulletListAdd20 = 0xFB58, - TextBulletListSquare20 = 0xFB59, - TextGrammarError20 = 0xFB5A, - TextNumberListRtl20 = 0xFB5B, - Video36020 = 0xFB5C, - Video36024 = 0xFB5D, - VideoPerson12 = 0xFB5E, - VideoPerson16 = 0xFB5F, - VideoPerson20 = 0xFB60, - VideoPerson28 = 0xFB61, - VideoPerson48 = 0xFB62, - VideoPersonCall16 = 0xFB63, - VideoPersonCall20 = 0xFB64, - VideoPersonCall24 = 0xFB65, - VideoPersonStar20 = 0xFB66, - VideoProhibited20 = 0xFB67, - VideoSwitch20 = 0xFB68, - WifiWarning20 = 0xFB69, - Album24 = 0xFB6A, - AlbumAdd24 = 0xFB6B, - AlertUrgent16 = 0xFB6C, - ArrowRight16 = 0xFB6D, - ArrowUndo16 = 0xFB6E, - ArrowUpLeft16 = 0xFB6F, - ArrowUpLeft20 = 0xFB70, - BackpackAdd20 = 0xFB71, - BackpackAdd24 = 0xFB72, - BackpackAdd28 = 0xFB73, - BackpackAdd48 = 0xFB74, - Bot20 = 0xFB75, - CallConnecting20 = 0xFB76, - CallExclamation20 = 0xFB77, - CallTransfer20 = 0xFB78, - CameraOff24 = 0xFB79, - ChatBubblesQuestion20 = 0xFB7A, - ChatMail20 = 0xFB7B, - ChatOff20 = 0xFB7C, - Checkmark48 = 0xFB7D, - CloudSync20 = 0xFB7E, - ContentView20 = 0xFB7F, - CubeRotate20 = 0xFB80, - DataLine20 = 0xFB81, - DeviceMeetingRoom20 = 0xFB82, - DeviceMeetingRoomRemote20 = 0xFB83, - DrawShape24 = 0xFB84, - DrawText24 = 0xFB85, - FolderArrowUp16 = 0xFB86, - FolderArrowUp20 = 0xFB87, - FolderArrowUp24 = 0xFB88, - FolderArrowUp28 = 0xFB89, - ShieldLock16 = 0xFB8A, - Fps3016 = 0xFB8B, - Fps3020 = 0xFB8C, - Fps3024 = 0xFB8D, - Fps3028 = 0xFB8E, - Fps3048 = 0xFB8F, - Fps6016 = 0xFB90, - Fps6020 = 0xFB91, - Fps6024 = 0xFB92, - Fps6028 = 0xFB93, - Fps6048 = 0xFB94, - SlideEraser16 = 0xFB95, - HomePerson20 = 0xFB96, - ImageOff20 = 0xFB97, - Lasso20 = 0xFB98, - LeafThree16 = 0xFB99, - LeafThree20 = 0xFB9A, - LeafThree24 = 0xFB9B, - MicSync20 = 0xFB9C, - NotebookSubsection20 = 0xFB9D, - PersonCircle20 = 0xFB9E, - Pulse20 = 0xFB9F, - PulseSquare24 = 0xFBA0, - Ribbon16 = 0xFBA1, - RotateLeft24 = 0xFBA2, - RotateRight20 = 0xFBA3, - RotateRight24 = 0xFBA4, - ShareCloseTray20 = 0xFBA5, - SquareMultiple20 = 0xFBA6, - StarEmphasis20 = 0xFBA7, - TvArrowRight20 = 0xFBA8, - VideoPersonStarOff20 = 0xFBA9, - VideoRecording20 = 0xFBAA, - VideoSync20 = 0xFBAB, - BreakoutRoom20 = 0xFBAC, - ContentViewGallery20 = 0xFBAD, - DoorTag24 = 0xFBAE, - Luggage24 = 0xFBAF, - PeopleEdit20 = 0xFBB0, - ChannelShare12 = 0xFBB1, - ChannelShare16 = 0xFBB2, - ChannelShare20 = 0xFBB3, - ChannelShare24 = 0xFBB4, - ChannelShare28 = 0xFBB5, - ChannelShare48 = 0xFBB6, - PeopleError16 = 0xFBB7, - PeopleError20 = 0xFBB8, - PeopleError24 = 0xFBB9, - PuzzleCube16 = 0xFBBA, - PuzzleCube20 = 0xFBBB, - PuzzleCube24 = 0xFBBC, - PuzzleCube28 = 0xFBBD, - PuzzleCube48 = 0xFBBE, - ArrowCircleDownRight16 = 0xFBBF, - ArrowCircleDownRight24 = 0xFBC0, - ArrowCircleRight24 = 0xFBC1, - ArrowCircleUp16 = 0xFBC2, - ArrowCircleUp20 = 0xFBC3, - ArrowCircleUp24 = 0xFBC4, - ArrowCircleUpLeft24 = 0xFBC5, - ArrowEnterLeft20 = 0xFBC6, - ArrowEnterLeft24 = 0xFBC7, - ArrowExportLtr20 = 0xFBC8, - ArrowExportLtr24 = 0xFBC9, - ArrowSquareDown24 = 0xFBCA, - ArrowUndo32 = 0xFBCB, - ArrowUndo48 = 0xFBCC, - SlideEraser20 = 0xFBCD, - SlideGrid24 = 0xFBCE, - AutoFitHeight24 = 0xFBCF, - AutoFitWidth24 = 0xFBD0, - Border24 = 0xFBD1, - BriefcaseMedical24 = 0xFBD2, - BriefcaseMedical32 = 0xFBD3, - BuildingFactory24 = 0xFBD4, - CalendarArrowDown24 = 0xFBD5, - Call16 = 0xFBD6, - Call20 = 0xFBD7, - Call24 = 0xFBD8, - Call28 = 0xFBD9, - CallMissed20 = 0xFBDA, - CallProhibited16 = 0xFBDB, - CallProhibited20 = 0xFBDC, - CallProhibited24 = 0xFBDD, - CallProhibited28 = 0xFBDE, - CallProhibited48 = 0xFBDF, - CaretDownLeft12 = 0xFBE0, - CaretDownLeft16 = 0xFBE1, - CaretDownLeft20 = 0xFBE2, - CaretDownLeft24 = 0xFBE3, - CellularDataCellularOff24 = 0xFBE4, - CellularDataCellularUnavailable24 = 0xFBE5, - CenterHorizontal24 = 0xFBE6, - CenterVertical24 = 0xFBE7, - ChevronCircleDown24 = 0xFBE8, - ChevronCircleRight24 = 0xFBE9, - ClipboardImage24 = 0xFBEA, - CommentArrowLeft24 = 0xFBEB, - CommentArrowRight24 = 0xFBEC, - CommentDismiss24 = 0xFBED, - Component2DoubleTapSwipeDown24 = 0xFBEE, - Component2DoubleTapSwipeUp24 = 0xFBEF, - CopyArrowRight16 = 0xFBF0, - CopyArrowRight24 = 0xFBF1, - CurrencyDollarEuro16 = 0xFBF2, - CurrencyDollarEuro20 = 0xFBF3, - CurrencyDollarEuro24 = 0xFBF4, - DeleteDismiss24 = 0xFBF5, - DeleteDismiss28 = 0xFBF6, - DockPanelLeft16 = 0xFBF7, - DockPanelLeft20 = 0xFBF8, - DockPanelLeft24 = 0xFBF9, - DockPanelLeft28 = 0xFBFA, - DockPanelLeft48 = 0xFBFB, - DockPanelRight16 = 0xFBFC, - DockPanelRight20 = 0xFBFD, - DockPanelRight24 = 0xFBFE, - DockPanelRight28 = 0xFBFF, - DockPanelRight48 = 0xFC00, - DocumentProhibited20 = 0xFC01, - DocumentProhibited24 = 0xFC02, - DocumentSync24 = 0xFC03, - DrinkToGo24 = 0xFC04, - EyeTrackingOn16 = 0xFC05, - EyeTrackingOn20 = 0xFC06, - EyeTrackingOn24 = 0xFC07, - Fluent24 = 0xFC08, - FolderArrowRight16 = 0xFC09, - FolderArrowRight20 = 0xFC0A, - FolderArrowRight24 = 0xFC0B, - FolderArrowRight28 = 0xFC0C, - FolderArrowRight48 = 0xFC0D, - FolderArrowUp48 = 0xFC0E, - FolderProhibited20 = 0xFC0F, - FolderProhibited24 = 0xFC10, - FolderProhibited28 = 0xFC11, - FolderProhibited48 = 0xFC12, - FolderSwap16 = 0xFC13, - FolderSwap20 = 0xFC14, - FolderSwap24 = 0xFC15, - FullScreenMaximize24 = 0xFC16, - FullScreenMinimize24 = 0xFC17, - ImageMultiple20 = 0xFC18, - ImageMultiple24 = 0xFC19, - ImageMultiple28 = 0xFC1A, - LeafOne16 = 0xFC1B, - LeafOne20 = 0xFC1C, - LeafOne24 = 0xFC1D, - LinkDismiss20 = 0xFC1E, - LocationDismiss24 = 0xFC1F, - LockClosed12 = 0xFC20, - LockClosed16 = 0xFC21, - LockClosed20 = 0xFC22, - LockClosed24 = 0xFC23, - LockOpen20 = 0xFC24, - LockOpen24 = 0xFC25, - LockOpen28 = 0xFC26, - MailInboxAll24 = 0xFC27, - MailInboxArrowRight24 = 0xFC28, - MailInboxArrowUp20 = 0xFC29, - MailInboxArrowUp24 = 0xFC2A, - MailOff24 = 0xFC2B, - MoreHorizontal16 = 0xFC2C, - MoreHorizontal20 = 0xFC2D, - MoreHorizontal24 = 0xFC2E, - MoreHorizontal28 = 0xFC2F, - MoreHorizontal48 = 0xFC30, - MusicNote120 = 0xFC31, - MusicNote124 = 0xFC32, - MusicNote216 = 0xFC33, - MusicNote224 = 0xFC34, - PeopleTeamDelete24 = 0xFC35, - PhoneAdd24 = 0xFC36, - PhoneArrowRight20 = 0xFC37, - PhoneArrowRight24 = 0xFC38, - PhoneDismiss24 = 0xFC39, - PhoneLock24 = 0xFC3A, - PhoneSpanIn16 = 0xFC3B, - PhoneSpanIn20 = 0xFC3C, - PhoneSpanIn24 = 0xFC3D, - PhoneSpanIn28 = 0xFC3E, - PhoneSpanOut16 = 0xFC3F, - PhoneSpanOut20 = 0xFC40, - PhoneSpanOut24 = 0xFC41, - PhoneSpanOut28 = 0xFC42, - PositionBackward20 = 0xFC43, - PositionBackward24 = 0xFC44, - PositionForward20 = 0xFC45, - PositionForward24 = 0xFC46, - PositionToBack20 = 0xFC47, - PositionToBack24 = 0xFC48, - PositionToFront20 = 0xFC49, - PositionToFront24 = 0xFC4A, - ResizeLarge16 = 0xFC4B, - ResizeLarge20 = 0xFC4C, - ResizeLarge24 = 0xFC4D, - ResizeSmall16 = 0xFC4E, - ResizeSmall20 = 0xFC4F, - ResizeSmall24 = 0xFC50, - SaveEdit20 = 0xFC51, - SaveEdit24 = 0xFC52, - SearchVisual16 = 0xFC53, - SearchVisual20 = 0xFC54, - SearchVisual24 = 0xFC55, - SelectAllOn24 = 0xFC56, - ShareScreenStart20 = 0xFC57, - ShareScreenStart24 = 0xFC58, - ShareScreenStart28 = 0xFC59, - ShareScreenStop16 = 0xFC5A, - ShareScreenStop20 = 0xFC5B, - ShareScreenStop24 = 0xFC5C, - ShareScreenStop28 = 0xFC5D, - ShareScreenStop48 = 0xFC5E, - ShieldDismiss16 = 0xFC5F, - ShiftsProhibited24 = 0xFC60, - ShiftsQuestionMark24 = 0xFC61, - Speaker216 = 0xFC62, - Speaker220 = 0xFC63, - Speaker224 = 0xFC64, - Speaker228 = 0xFC65, - Speaker248 = 0xFC66, - SpeakerMute16 = 0xFC67, - SpeakerMute20 = 0xFC68, - SpeakerMute24 = 0xFC69, - SpeakerMute28 = 0xFC6A, - SpeakerMute48 = 0xFC6B, - Square16 = 0xFC6C, - SquareAdd16 = 0xFC6D, - SquareHintArrowBack16 = 0xFC6E, - StarArrowRightEnd24 = 0xFC6F, - Subtract12 = 0xFC70, - Subtract16 = 0xFC71, - Subtract20 = 0xFC72, - Subtract24 = 0xFC73, - Subtract28 = 0xFC74, - Subtract48 = 0xFC75, - TabAdd20 = 0xFC76, - TabAdd24 = 0xFC77, - TabArrowLeft24 = 0xFC78, - TabShieldDismiss20 = 0xFC79, - TabShieldDismiss24 = 0xFC7A, - TableDeleteColumn24 = 0xFC7B, - TableDeleteRow24 = 0xFC7C, - TableFreezeColumnAndRow24 = 0xFC7D, - TableInsertColumn24 = 0xFC7E, - TableInsertRow24 = 0xFC7F, - TableMoveAbove24 = 0xFC80, - TableMoveBelow24 = 0xFC81, - TableResizeColumn24 = 0xFC82, - TableResizeRow24 = 0xFC83, - TableStackAbove24 = 0xFC84, - TableStackBelow24 = 0xFC85, - TableStackLeft24 = 0xFC86, - TableStackRight24 = 0xFC87, - TagQuestionMark16 = 0xFC88, - TagQuestionMark24 = 0xFC89, - TextGrammarArrowLeft20 = 0xFC8A, - TextGrammarArrowLeft24 = 0xFC8B, - TextGrammarArrowRight20 = 0xFC8C, - TextGrammarArrowRight24 = 0xFC8D, - TextGrammarCheckmark20 = 0xFC8E, - TextGrammarCheckmark24 = 0xFC8F, - TextGrammarDismiss20 = 0xFC90, - TextGrammarDismiss24 = 0xFC91, - TextGrammarSettings20 = 0xFC92, - TextGrammarSettings24 = 0xFC93, - TextGrammarWand16 = 0xFC94, - TextGrammarWand20 = 0xFC95, - TextGrammarWand24 = 0xFC96, - TextNumberFormat20 = 0xFC97, - TextParagraph20 = 0xFC98, - TextParagraph24 = 0xFC99, - TextParagraphDirection20 = 0xFC9A, - TextParagraphDirection24 = 0xFC9B, - TextPositionBehind20 = 0xFC9C, - TextPositionBehind24 = 0xFC9D, - TextPositionFront20 = 0xFC9E, - TextPositionFront24 = 0xFC9F, - TextPositionLine20 = 0xFCA0, - TextPositionLine24 = 0xFCA1, - TextPositionSquare20 = 0xFCA2, - TextPositionSquare24 = 0xFCA3, - TextPositionThrough20 = 0xFCA4, - TextPositionThrough24 = 0xFCA5, - TextPositionTight20 = 0xFCA6, - TextPositionTight24 = 0xFCA7, - TextPositionTopBottom20 = 0xFCA8, - TextPositionTopBottom24 = 0xFCA9, - TextboxAlignCenter20 = 0xFCAA, - TextboxAlignCenter24 = 0xFCAB, - ThumbLike16 = 0xFCAC, - TicketHorizontal20 = 0xFCAD, - TicketHorizontal24 = 0xFCAE, - Wand16 = 0xFCAF, - Wand20 = 0xFCB0, - Wand24 = 0xFCB1, - Wand28 = 0xFCB2, - Wand48 = 0xFCB3, - WindowArrowUp24 = 0xFCB4, - WindowHeaderHorizontal20 = 0xFCB5, - WindowHeaderVertical20 = 0xFCB6, - Accessibility32 = 0xFCB7, - AccessibilityCheckmark24 = 0xFCB8, - AddCircle16 = 0xFCB9, - AddCircle32 = 0xFCBA, - AnimalRabbit16 = 0xFCBB, - AnimalRabbit20 = 0xFCBC, - AnimalRabbit24 = 0xFCBD, - AnimalRabbit28 = 0xFCBE, - AnimalTurtle16 = 0xFCBF, - AnimalTurtle20 = 0xFCC0, - AnimalTurtle24 = 0xFCC1, - AnimalTurtle28 = 0xFCC2, - BookContacts20 = 0xFCC3, - BookContacts24 = 0xFCC4, - BookContacts28 = 0xFCC5, - BookOpenGlobe20 = 0xFCC6, - CalligraphyPenCheckmark20 = 0xFCC7, - CalligraphyPenQuestionMark20 = 0xFCC8, - Cellular5g24 = 0xFCC9, - Checkbox124 = 0xFCCA, - Checkbox224 = 0xFCCB, - CheckboxArrowRight24 = 0xFCCC, - CheckboxPerson24 = 0xFCCD, - CheckboxWarning24 = 0xFCCE, - CircleEdit24 = 0xFCCF, - Clock32 = 0xFCD0, - Cloud16 = 0xFCD1, - Cloud32 = 0xFCD2, - CommentNote24 = 0xFCD3, - ContentSettings32 = 0xFCD4, - DesktopMac16 = 0xFCD5, - DesktopMac32 = 0xFCD6, - DocumentArrowRight24 = 0xFCD7, - DocumentCheckmark24 = 0xFCD8, - DualScreenDismiss24 = 0xFCD9, - DualScreenSpeaker24 = 0xFCDA, - FilterDismiss24 = 0xFCDB, - FilterSync24 = 0xFCDC, - Folder16 = 0xFCDD, - Folder32 = 0xFCDE, - GlobePerson24 = 0xFCDF, - HomePerson24 = 0xFCE0, - ImageGlobe24 = 0xFCE1, - InkingTool32 = 0xFCE2, - Key16 = 0xFCE3, - Key32 = 0xFCE4, - LineStyle24 = 0xFCE5, - MathFormula16 = 0xFCE6, - MathFormula32 = 0xFCE7, - NotebookAdd24 = 0xFCE8, - NotebookSectionArrowRight24 = 0xFCE9, - NotebookSubsection24 = 0xFCEA, - Orientation20 = 0xFCEB, - People32 = 0xFCEC, - PersonNote24 = 0xFCED, - PhoneLaptop16 = 0xFCEE, - PhoneLaptop32 = 0xFCEF, - PhoneSpeaker24 = 0xFCF0, - Pi24 = 0xFCF1, - Premium32 = 0xFCF2, - Receipt20 = 0xFCF3, - Receipt24 = 0xFCF4, - Rss24 = 0xFCF5, - ScreenCut20 = 0xFCF6, - ScreenPerson20 = 0xFCF7, - ShapeExclude16 = 0xFCF8, - ShapeExclude20 = 0xFCF9, - ShapeExclude24 = 0xFCFA, - ShapeIntersect16 = 0xFCFB, - ShapeIntersect20 = 0xFCFC, - ShapeIntersect24 = 0xFCFD, - ShapeSubtract16 = 0xFCFE, - ShapeSubtract20 = 0xFCFF, - ShapeSubtract24 = 0xFD00, - ShapeUnion16 = 0xFD01, - ShapeUnion20 = 0xFD02, - ShapeUnion24 = 0xFD03, - Shifts16 = 0xFD04, - SlideSettings24 = 0xFD05, - SlideTransition24 = 0xFD06, - StarEmphasis32 = 0xFD07, - Table32 = 0xFD08, - TableCellEdit24 = 0xFD09, - TabletSpeaker24 = 0xFD0A, - Target32 = 0xFD0B, - Timer324 = 0xFD0C, - Voicemail28 = 0xFD0D, - WalkieTalkie20 = 0xFD0E, - WarningShield20 = 0xFD0F, - AddSubtractCircle16 = 0xFD10, - AddSubtractCircle20 = 0xFD11, - AddSubtractCircle24 = 0xFD12, - AddSubtractCircle28 = 0xFD13, - AddSubtractCircle48 = 0xFD14, - Beach16 = 0xFD15, - Beach20 = 0xFD16, - Beach24 = 0xFD17, - Beach28 = 0xFD18, - Building16 = 0xFD19, - CalendarEdit16 = 0xFD1A, - CalendarEdit20 = 0xFD1B, - CalendarEdit24 = 0xFD1C, - CalendarLtr20 = 0xFD1D, - CalendarLtr24 = 0xFD1E, - CalendarLtr28 = 0xFD1F, - CalendarRtl20 = 0xFD20, - CalendarRtl24 = 0xFD21, - CalendarRtl28 = 0xFD22, - CircleSmall20 = 0xFD23, - Clipboard16 = 0xFD24, - ClipboardArrowRight16 = 0xFD25, - ClipboardArrowRight20 = 0xFD26, - ClipboardArrowRight24 = 0xFD27, - ClipboardTextLtr20 = 0xFD28, - ClipboardTextLtr24 = 0xFD29, - ClipboardTextRtl20 = 0xFD2A, - ClipboardTextRtl24 = 0xFD2B, - ConvertToType20 = 0xFD2C, - ConvertToType24 = 0xFD2D, - CubeSync24 = 0xFD2E, - DocumentQuestionMark16 = 0xFD2F, - DocumentQuestionMark20 = 0xFD30, - DocumentQuestionMark24 = 0xFD31, - DoorArrowLeft20 = 0xFD32, - Drop12 = 0xFD33, - Drop16 = 0xFD34, - Drop20 = 0xFD35, - Drop24 = 0xFD36, - Drop28 = 0xFD37, - Drop48 = 0xFD38, - Dumbbell16 = 0xFD39, - Dumbbell20 = 0xFD3A, - Dumbbell24 = 0xFD3B, - Dumbbell28 = 0xFD3C, - EditOff20 = 0xFD3D, - Eyedropper20 = 0xFD3E, - Eyedropper24 = 0xFD3F, - FlagOff16 = 0xFD40, - FlagOff20 = 0xFD41, - Fps12020 = 0xFD42, - Fps12024 = 0xFD43, - Fps24020 = 0xFD44, - Guitar16 = 0xFD45, - Guitar20 = 0xFD46, - Guitar24 = 0xFD47, - Guitar28 = 0xFD48, - KeyCommand16 = 0xFD49, - MicOn32 = 0xFD4A, - MoreVertical16 = 0xFD4B, - PeopleCheckmark20 = 0xFD4C, - PeopleCheckmark24 = 0xFD4D, - PlayCircle16 = 0xFD4E, - PlayCircle20 = 0xFD4F, - PlayCircle28 = 0xFD50, - ReOrderDotsHorizontal16 = 0xFD51, - ReOrderDotsHorizontal20 = 0xFD52, - ReOrderDotsHorizontal24 = 0xFD53, - ReOrderDotsVertical16 = 0xFD54, - ReOrderDotsVertical20 = 0xFD55, - ReOrderDotsVertical24 = 0xFD56, - ScaleFill20 = 0xFD57, - SkipBack1020 = 0xFD58, - SkipForward1020 = 0xFD59, - SkipForward3020 = 0xFD5A, - SlideEraser24 = 0xFD5B, - SplitHorizontal12 = 0xFD5C, - SplitHorizontal16 = 0xFD5D, - SplitHorizontal20 = 0xFD5E, - SplitHorizontal24 = 0xFD5F, - SplitHorizontal28 = 0xFD60, - SplitHorizontal32 = 0xFD61, - SplitHorizontal48 = 0xFD62, - SplitVertical12 = 0xFD63, - SplitVertical16 = 0xFD64, - SplitVertical20 = 0xFD65, - SplitVertical24 = 0xFD66, - SplitVertical28 = 0xFD67, - SplitVertical32 = 0xFD68, - SplitVertical48 = 0xFD69, - SportSoccer20 = 0xFD6A, - SportSoccer24 = 0xFD6B, - StrikethroughGaNa16 = 0xFD6C, - StrikethroughGaNa20 = 0xFD6D, - StrikethroughGaNa24 = 0xFD6E, - Symbols20 = 0xFD6F, - TableDeleteColumn20 = 0xFD70, - TableDeleteRow20 = 0xFD71, - TableStackAbove20 = 0xFD72, - TableStackDown20 = 0xFD73, - TableStackLeft20 = 0xFD74, - TableStackRight20 = 0xFD75, - TaskListLtr20 = 0xFD76, - TaskListLtr24 = 0xFD77, - TaskListRtl20 = 0xFD78, - TaskListRtl24 = 0xFD79, - TetrisApp16 = 0xFD7A, - TetrisApp20 = 0xFD7B, - TetrisApp24 = 0xFD7C, - TetrisApp28 = 0xFD7D, - TetrisApp32 = 0xFD7E, - TetrisApp48 = 0xFD7F, - TextBulletListLtr20 = 0xFD80, - TextBulletListLtr24 = 0xFD81, - TextBulletListRtl20 = 0xFD82, - TextBulletListRtl24 = 0xFD83, - TextStrikethroughS16 = 0xFD84, - TextStrikethroughS20 = 0xFD85, - TextStrikethroughS24 = 0xFD86, - VehicleCab16 = 0xFD87, - VehicleCab20 = 0xFD88, - VehicleCab28 = 0xFD89, - VehicleTruckProfile24 = 0xFD8A, - BotAdd20 = 0xFD8B, - ChartPerson20 = 0xFD8C, - ChartPerson24 = 0xFD8D, - ChartPerson28 = 0xFD8E, - ChartPerson48 = 0xFD8F, - ConvertToTypeOff20 = 0xFD90, - MicProhibited16 = 0xFD91, - MicProhibited28 = 0xFD92, - MicProhibited48 = 0xFD93, - TvUsb16 = 0xFD94, - TvUsb20 = 0xFD95, - TvUsb24 = 0xFD96, - TvUsb28 = 0xFD97, - TvUsb48 = 0xFD98, - Video360Off20 = 0xFD99, - VideoProhibited16 = 0xFD9A, - VideoProhibited24 = 0xFD9B, - VideoProhibited28 = 0xFD9C, - Alert32 = 0xFD9D, - ApprovalApp32 = 0xFD9E, - ArrowDownLeft20 = 0xFD9F, - ArrowStepBack16 = 0xFDA0, - ArrowStepIn16 = 0xFDA1, - ArrowStepOut16 = 0xFDA2, - ArrowStepOver16 = 0xFDA3, - ArrowUpRight20 = 0xFDA4, - Backpack32 = 0xFDA5, - BookContacts32 = 0xFDA6, - Bookmark32 = 0xFDA7, - BookmarkMultiple24 = 0xFDA8, - BranchCompare16 = 0xFDA9, - BranchCompare20 = 0xFDAA, - BranchCompare24 = 0xFDAB, - BranchFork16 = 0xFDAC, - BranchFork20 = 0xFDAD, - BranchFork24 = 0xFDAE, - CalendarLtr16 = 0xFDAF, - CalendarLtr32 = 0xFDB0, - CalendarRtl32 = 0xFDB1, - Call32 = 0xFDB2, - CalligraphyPenError20 = 0xFDB3, - Chat32 = 0xFDB4, - ClipboardDataBar32 = 0xFDB5, - ClockAlarm32 = 0xFDB6, - ContentView32 = 0xFDB7, - Desktop32 = 0xFDB8, - DismissSquareMultiple16 = 0xFDB9, - Document32 = 0xFDBA, - DocumentPdf32 = 0xFDBB, - FoodPizza20 = 0xFDBC, - FoodPizza24 = 0xFDBD, - Globe32 = 0xFDBE, - Headset32 = 0xFDBF, - HeartPulse20 = 0xFDC0, - Multiplier12x20 = 0xFDC1, - Multiplier12x24 = 0xFDC2, - Multiplier12x28 = 0xFDC3, - Multiplier12x32 = 0xFDC4, - Multiplier12x48 = 0xFDC5, - Multiplier15x20 = 0xFDC6, - Multiplier15x24 = 0xFDC7, - Multiplier15x28 = 0xFDC8, - Multiplier15x32 = 0xFDC9, - Multiplier15x48 = 0xFDCA, - Multiplier18x20 = 0xFDCB, - Multiplier18x24 = 0xFDCC, - Multiplier18x28 = 0xFDCD, - Multiplier18x32 = 0xFDCE, - Multiplier18x48 = 0xFDCF, - Multiplier1x20 = 0xFDD0, - Multiplier1x24 = 0xFDD1, - Multiplier1x28 = 0xFDD2, - Multiplier1x32 = 0xFDD3, - Multiplier1x48 = 0xFDD4, - Multiplier2x20 = 0xFDD5, - Multiplier2x24 = 0xFDD6, - Multiplier2x28 = 0xFDD7, - Multiplier2x32 = 0xFDD8, - Multiplier2x48 = 0xFDD9, - MyLocation16 = 0xFDDA, - MyLocation20 = 0xFDDB, - Notepad32 = 0xFDDC, - Patient32 = 0xFDDD, - PeopleTeam32 = 0xFDDE, - Pulse32 = 0xFDDF, - Remote16 = 0xFDE0, - Ribbon32 = 0xFDE1, - Shifts32 = 0xFDE2, - SkipBackward1024 = 0xFDE3, - SkipBackward1028 = 0xFDE4, - SkipBackward1032 = 0xFDE5, - SkipBackward1048 = 0xFDE6, - SkipForward1024 = 0xFDE7, - SkipForward1028 = 0xFDE8, - SkipForward1032 = 0xFDE9, - SkipForward1048 = 0xFDEA, - SkipForward3024 = 0xFDEB, - SkipForward3028 = 0xFDEC, - SkipForward3032 = 0xFDED, - SkipForward3048 = 0xFDEE, - SubtractSquareMultiple16 = 0xFDEF, - Text20 = 0xFDF0, - TextSortAscending16 = 0xFDF1, - TextSortAscending24 = 0xFDF2, - TextSortDescending16 = 0xFDF3, - TextSortDescending24 = 0xFDF4, - VideoPersonCall32 = 0xFDF5, - WeatherSunny32 = 0xFDF6, - AlignBottom16 = 0xFDF7, - AlignBottom20 = 0xFDF8, - AlignBottom24 = 0xFDF9, - AlignBottom28 = 0xFDFA, - AlignBottom32 = 0xFDFB, - AlignBottom48 = 0xFDFC, - AlignCenterHorizontal16 = 0xFDFD, - AlignCenterHorizontal20 = 0xFDFE, - AlignCenterHorizontal24 = 0xFDFF, - AlignCenterHorizontal28 = 0xFE00, - AlignCenterHorizontal32 = 0xFE01, - AlignCenterHorizontal48 = 0xFE02, - AlignCenterVertical16 = 0xFE03, - AlignCenterVertical20 = 0xFE04, - AlignCenterVertical24 = 0xFE05, - AlignCenterVertical28 = 0xFE06, - AlignCenterVertical32 = 0xFE07, - AlignCenterVertical48 = 0xFE08, - AlignLeft16 = 0xFE09, - AlignLeft20 = 0xFE0A, - AlignLeft24 = 0xFE0B, - AlignLeft28 = 0xFE0C, - AlignLeft32 = 0xFE0D, - AlignLeft48 = 0xFE0E, - AlignRight16 = 0xFE0F, - AlignRight20 = 0xFE10, - AlignRight24 = 0xFE11, - AlignRight28 = 0xFE12, - AlignRight32 = 0xFE13, - AlignRight48 = 0xFE14, - AlignTop16 = 0xFE15, - AlignTop20 = 0xFE16, - AlignTop24 = 0xFE17, - AlignTop28 = 0xFE18, - AlignTop32 = 0xFE19, - AlignTop48 = 0xFE1A, - Calculator24 = 0xFE1B, - Camera16 = 0xFE1C, - GroupDismiss24 = 0xFE1D, - GroupReturn24 = 0xFE1E, - HandLeft16 = 0xFE1F, - HandLeft24 = 0xFE20, - HandLeft28 = 0xFE21, - HandRight16 = 0xFE22, - Home12 = 0xFE23, - KeyboardShift16 = 0xFE24, - KeyboardShift20 = 0xFE25, - LinkSquare20 = 0xFE26, - MailInboxCheckmark16 = 0xFE27, - MailInboxCheckmark20 = 0xFE28, - MailInboxCheckmark24 = 0xFE29, - MusicNote220 = 0xFE2A, - MyLocation12 = 0xFE2B, - NumberSymbolSquare20 = 0xFE2C, - NumberSymbolSquare24 = 0xFE2D, - Person32 = 0xFE2E, - Person532 = 0xFE2F, - PersonTag20 = 0xFE30, - PersonTag24 = 0xFE31, - PersonTag28 = 0xFE32, - PersonTag32 = 0xFE33, - PersonTag48 = 0xFE34, - Search16 = 0xFE35, - Send16 = 0xFE36, - Symbols16 = 0xFE37, - Teddy20 = 0xFE38, - VideoPersonStarOff24 = 0xFE39, - AppsAddIn16 = 0xFE3A, - AppsAddIn28 = 0xFE3B, - ArrowCurveDownLeft16 = 0xFE3C, - ArrowCurveDownLeft24 = 0xFE3D, - ArrowCurveDownLeft28 = 0xFE3E, - ArrowUpload16 = 0xFE3F, - Attach12 = 0xFE40, - Board16 = 0xFE41, - Board20 = 0xFE42, - Board28 = 0xFE43, - BoardSplit16 = 0xFE44, - BoardSplit20 = 0xFE45, - BoardSplit24 = 0xFE46, - BoardSplit28 = 0xFE47, - BoardSplit48 = 0xFE48, - CalendarEmpty32 = 0xFE49, - CalendarLtr12 = 0xFE4A, - CalendarMultiple32 = 0xFE4B, - ChevronUpDown20 = 0xFE4C, - ChevronUpDown24 = 0xFE4D, - Circle12 = 0xFE4E, - CircleHalfFill12 = 0xFE4F, - CircleLine12 = 0xFE50, - ClosedCaptionOff16 = 0xFE51, - ClosedCaptionOff20 = 0xFE52, - ClosedCaptionOff24 = 0xFE53, - ClosedCaptionOff28 = 0xFE54, - ClosedCaptionOff48 = 0xFE55, - CloudDownload16 = 0xFE56, - CloudDownload20 = 0xFE57, - DesktopPulse16 = 0xFE58, - DesktopPulse20 = 0xFE59, - DesktopPulse24 = 0xFE5A, - DesktopPulse28 = 0xFE5B, - DesktopPulse32 = 0xFE5C, - DesktopPulse48 = 0xFE5D, - DeveloperBoard20 = 0xFE5E, - DismissSquare24 = 0xFE5F, - DoorArrowLeft24 = 0xFE60, - EmojiHand20 = 0xFE61, - Filter16 = 0xFE62, - Flash16 = 0xFE63, - Flash28 = 0xFE64, - FlashCheckmark16 = 0xFE65, - FlashCheckmark20 = 0xFE66, - FlashCheckmark24 = 0xFE67, - FlashCheckmark28 = 0xFE68, - FolderProhibited16 = 0xFE69, - Grid16 = 0xFE6A, - Headphones20 = 0xFE6B, - Headphones32 = 0xFE6C, - Headphones48 = 0xFE6D, - HeadphonesSoundWave20 = 0xFE6E, - HeadphonesSoundWave24 = 0xFE6F, - HeadphonesSoundWave28 = 0xFE70, - HeadphonesSoundWave32 = 0xFE71, - HeadphonesSoundWave48 = 0xFE72, - HomeCheckmark16 = 0xFE73, - HomeCheckmark20 = 0xFE74, - InkStroke20 = 0xFE75, - InkStroke24 = 0xFE76, - Library16 = 0xFE77, - Library20 = 0xFE78, - List16 = 0xFE79, - LocationArrowLeft48 = 0xFE7A, - LocationArrowRight48 = 0xFE7B, - LocationArrowUp48 = 0xFE7C, - MailInboxCheckmark28 = 0xFE7D, - Map20 = 0xFE7E, - Multiplier5x20 = 0xFE7F, - Multiplier5x24 = 0xFE80, - Multiplier5x28 = 0xFE81, - Multiplier5x32 = 0xFE82, - Multiplier5x48 = 0xFE83, - MusicNote2Play20 = 0xFE84, - Notepad12 = 0xFE85, - Organization12 = 0xFE86, - PeopleCommunityAdd20 = 0xFE87, - PeopleCommunityAdd28 = 0xFE88, - Person632 = 0xFE89, - PersonAdd16 = 0xFE8A, - PersonAdd28 = 0xFE8B, - PersonProhibited16 = 0xFE8C, - PersonProhibited28 = 0xFE8D, - Pin28 = 0xFE8E, - Pin32 = 0xFE8F, - Pin48 = 0xFE90, - PremiumPerson20 = 0xFE91, - PremiumPerson24 = 0xFE92, - ProhibitedMultiple16 = 0xFE93, - ProhibitedMultiple20 = 0xFE94, - ProhibitedMultiple24 = 0xFE95, - ReadAloud16 = 0xFE96, - ReadAloud28 = 0xFE97, - Shield16 = 0xFE98, - Shield28 = 0xFE99, - Shield48 = 0xFE9A, - ShieldCheckmark16 = 0xFE9B, - ShieldCheckmark20 = 0xFE9C, - ShieldCheckmark24 = 0xFE9D, - ShieldCheckmark28 = 0xFE9E, - ShieldCheckmark48 = 0xFE9F, - TopSpeed20 = 0xFEA0, - CheckmarkCircle12 = 0xFEA1, - AddSquareMultiple16 = 0xFEA2, - AddSquareMultiple20 = 0xFEA3, - ArrowForward48 = 0xFEA4, - ArrowSync16 = 0xFEA5, - BookOpen28 = 0xFEA6, - BookOpen32 = 0xFEA7, - BookOpen48 = 0xFEA8, - BookOpenMicrophone20 = 0xFEA9, - BookOpenMicrophone24 = 0xFEAA, - BookOpenMicrophone28 = 0xFEAB, - BookOpenMicrophone32 = 0xFEAC, - BookOpenMicrophone48 = 0xFEAD, - BriefcaseOff16 = 0xFEAE, - BriefcaseOff20 = 0xFEAF, - BriefcaseOff24 = 0xFEB0, - BriefcaseOff28 = 0xFEB1, - BriefcaseOff32 = 0xFEB2, - BriefcaseOff48 = 0xFEB3, - BuildingBank28 = 0xFEB4, - BuildingBank48 = 0xFEB5, - BuildingBankLink16 = 0xFEB6, - BuildingBankLink20 = 0xFEB7, - BuildingBankLink24 = 0xFEB8, - BuildingBankLink28 = 0xFEB9, - BuildingBankLink48 = 0xFEBA, - CalendarMail16 = 0xFEBB, - CalendarRtl12 = 0xFEBC, - CalendarRtl16 = 0xFEBD, - ChevronDoubleUp16 = 0xFEBE, - ChevronDoubleUp20 = 0xFEBF, - Cloud28 = 0xFEC0, - CloudBackup16 = 0xFEC1, - CloudBackup20 = 0xFEC2, - CloudBackup28 = 0xFEC3, - CloudBackup32 = 0xFEC4, - CloudDownload28 = 0xFEC5, - CloudOff16 = 0xFEC6, - CloudOff20 = 0xFEC7, - CloudOff28 = 0xFEC8, - CloudOff32 = 0xFEC9, - CloudSync16 = 0xFECA, - CloudSync24 = 0xFECB, - CloudSync28 = 0xFECC, - CloudSync32 = 0xFECD, - CloudSync48 = 0xFECE, - CloudSyncComplete16 = 0xFECF, - CloudSyncComplete20 = 0xFED0, - CloudSyncComplete28 = 0xFED1, - CloudSyncComplete32 = 0xFED2, - DismissSquare20 = 0xFED3, - DocumentFooter16 = 0xFED4, - DocumentFooterDismiss24 = 0xFED5, - DocumentHeader16 = 0xFED6, - DocumentHeaderArrowDown16 = 0xFED7, - DocumentHeaderDismiss24 = 0xFED8, - DocumentHeaderFooter16 = 0xFED9, - DocumentRibbon16 = 0xFEDA, - DocumentRibbon20 = 0xFEDB, - DocumentRibbon24 = 0xFEDC, - DocumentRibbon28 = 0xFEDD, - DocumentRibbon32 = 0xFEDE, - DocumentRibbon48 = 0xFEDF, - DoorArrowLeft16 = 0xFEE0, - DriveTrain24 = 0xFEE1, - Engine24 = 0xFEE2, - FolderMail16 = 0xFEE3, - FolderSync16 = 0xFEE4, - Gas24 = 0xFEE5, - GasPump24 = 0xFEE6, - MailAll16 = 0xFEE7, - MailDismiss16 = 0xFEE8, - MailProhibited16 = 0xFEE9, - MicSparkle16 = 0xFEEA, - MicSparkle20 = 0xFEEB, - MicSparkle24 = 0xFEEC, - NotepadPerson20 = 0xFEED, - NotepadPerson24 = 0xFEEE, - PinOff16 = 0xFEEF, - PinOff48 = 0xFEF0, - SkipForwardTab24 = 0xFEF1, - SquareArrowForward16 = 0xFEF2, - SquareArrowForward20 = 0xFEF3, - SquareArrowForward24 = 0xFEF4, - SquareArrowForward28 = 0xFEF5, - SquareArrowForward32 = 0xFEF6, - SquareArrowForward48 = 0xFEF7, - SubtractSquareMultiple20 = 0xFEF8, - Transmission24 = 0xFEF9, - WifiOff20 = 0xFEFA, - WifiOff24 = 0xFEFB, - Steps20 = 0xFEFC, - Steps24 = 0xFEFD, - TabDesktopBottom24 = 0xFEFE, - TabDesktopMultipleBottom24 = 0xFEFF, - TaskListSquareAdd20 = 0xFF00, - TaskListSquareAdd24 = 0xFF01, - TaskListSquareLtr20 = 0xFF02, - TaskListSquareLtr24 = 0xFF03, - TaskListSquareRtl20 = 0xFF04, - TaskListSquareRtl24 = 0xFF05, - TextAlignDistributedEvenly24 = 0xFF06, - TextAlignDistributedVertical24 = 0xFF07, - TextAlignJustifyLow24 = 0xFF08, - TextBulletList20 = 0xFF09, - TextBulletList24 = 0xFF0A, - TextClearFormattingGa24 = 0xFF0B, - TextColorGa24 = 0xFF0C, - TextDirectionLtrAc20 = 0xFF0D, - TextDirectionLtrAc24 = 0xFF0E, - TextDirectionRotate90Ac24 = 0xFF0F, - TextDirectionVerticalAc24 = 0xFF10, - TextEditStyleGa24 = 0xFF11, - TextEffectsGa24 = 0xFF12, - TextFootnoteGaNa24 = 0xFF13, - TextNumberFormatGaNaDa24 = 0xFF14, - TextProofingToolsGaNaDa24 = 0xFF15, - TextProofingToolsZi24 = 0xFF16, - TextboxMore24 = 0xFF17, - Video32 = 0xFF18, - Video48 = 0xFF19, - VideoClip16 = 0xFF1A, - WindowAdPerson20 = 0xFF1B, - WindowDevEdit16 = 0xFF1C, - ArrowAutofitHeightDotted24 = 0xFF1D, - ArrowAutofitWidthDotted24 = 0xFF1E, - MultiselectRtl16 = 0xFF1F, - TextDirectionHorizontalRtl20 = 0xFF20, - TextDirectionHorizontalRtl24 = 0xFF21, - TextDirectionRotate90Rtl20 = 0xFF22, - TextDirectionRotate90Rtl24 = 0xFF23, - AnimalDog16 = 0xFF24, - ArchiveSettings20 = 0xFF25, - ArrowClockwise16 = 0xFF26, - ArrowClockwiseDashes20 = 0xFF27, - ArrowClockwiseDashes24 = 0xFF28, - ArrowCounterclockwiseDashes20 = 0xFF29, - ArrowCounterclockwiseDashes24 = 0xFF2A, - ArrowExportLtr16 = 0xFF2B, - ArrowExportUp20 = 0xFF2C, - ArrowExportUp24 = 0xFF2D, - ArrowRouting20 = 0xFF2E, - ArrowRouting24 = 0xFF2F, - ArrowRoutingRectangleMultiple20 = 0xFF30, - ArrowRoutingRectangleMultiple24 = 0xFF31, - BinFull20 = 0xFF32, - BinFull24 = 0xFF33, - BookToolbox24 = 0xFF34, - Box16 = 0xFF35, - BracesVariable20 = 0xFF36, - BracesVariable24 = 0xFF37, - Briefcase16 = 0xFF38, - BriefcaseMedical16 = 0xFF39, - BuildingRetail20 = 0xFF3A, - BuildingRetailMoney20 = 0xFF3B, - BuildingRetailMoney24 = 0xFF3C, - BuildingRetailShield20 = 0xFF3D, - BuildingRetailShield24 = 0xFF3E, - BuildingRetailToolbox20 = 0xFF3F, - BuildingRetailToolbox24 = 0xFF40, - CalculatorMultiple20 = 0xFF41, - CalculatorMultiple24 = 0xFF42, - Calendar3Day16 = 0xFF43, - CalendarArrowRight16 = 0xFF44, - CalendarDay16 = 0xFF45, - CalendarInfo20 = 0xFF46, - CalendarSettings16 = 0xFF47, - CallCheckmark24 = 0xFF48, - CallEnd16 = 0xFF49, - CameraDome16 = 0xFF4A, - CameraDome20 = 0xFF4B, - CameraDome24 = 0xFF4C, - CameraDome28 = 0xFF4D, - CameraDome48 = 0xFF4E, - Chat12 = 0xFF4F, - ChevronDoubleDown20 = 0xFF50, - ChevronDoubleLeft20 = 0xFF51, - ChevronDoubleRight20 = 0xFF52, - ClipboardBulletListLtr20 = 0xFF53, - ClipboardBulletListRtl20 = 0xFF54, - ClipboardCheckmark20 = 0xFF55, - ClipboardCheckmark24 = 0xFF56, - ClipboardError20 = 0xFF57, - ClipboardError24 = 0xFF58, - ClipboardHeart24 = 0xFF59, - ClipboardTask20 = 0xFF5A, - ClipboardTask24 = 0xFF5B, - ClipboardTaskAdd20 = 0xFF5C, - ClipboardTaskAdd24 = 0xFF5D, - ClipboardTaskListLtr20 = 0xFF5E, - ClipboardTaskListLtr24 = 0xFF5F, - ClockAlarm16 = 0xFF60, - CloudAdd20 = 0xFF61, - CloudEdit20 = 0xFF62, - CloudLink20 = 0xFF63, - Color16 = 0xFF64, - ColumnTriple20 = 0xFF65, - ColumnTripleEdit20 = 0xFF66, - ColumnTripleEdit24 = 0xFF67, - CommentError20 = 0xFF68, - CommunicationPerson20 = 0xFF69, - CommunicationPerson24 = 0xFF6A, - ContactCardLink20 = 0xFF6B, - DataTrending16 = 0xFF6C, - DataTrending20 = 0xFF6D, - DataTrending24 = 0xFF6E, - DataUsageEdit24 = 0xFF6F, - Database20 = 0xFF70, - Database24 = 0xFF71, - DatabaseSearch20 = 0xFF72, - DatabaseSearch24 = 0xFF73, - DeleteArrowBack16 = 0xFF74, - DesktopEdit16 = 0xFF75, - DismissCircle12 = 0xFF76, - DividerTall16 = 0xFF77, - DockPanelBottom20 = 0xFF78, - DocumentArrowDown20 = 0xFF79, - DocumentHeart20 = 0xFF7A, - DocumentHeart24 = 0xFF7B, - DocumentHeartPulse20 = 0xFF7C, - DocumentHeartPulse24 = 0xFF7D, - DocumentMultiple20 = 0xFF7E, - DocumentMultipleProhibited20 = 0xFF7F, - DocumentMultipleProhibited24 = 0xFF80, - DocumentSearch16 = 0xFF81, - Door20 = 0xFF82, - EmojiLaugh16 = 0xFF83, - EqualOff24 = 0xFF84, - ErrorCircleSettings20 = 0xFF85, - EyeOff16 = 0xFF86, - Fax20 = 0xFF87, - FilterDismiss16 = 0xFF88, - FilterDismiss20 = 0xFF89, - Flashlight16 = 0xFF8A, - Flashlight20 = 0xFF8B, - Flow20 = 0xFF8C, - Fluid16 = 0xFF8D, - FolderAdd16 = 0xFF8E, - FolderGlobe20 = 0xFF8F, - FolderMail20 = 0xFF90, - FolderPerson20 = 0xFF91, - FolderSync20 = 0xFF92, - Food16 = 0xFF93, - FoodCake16 = 0xFF94, - FullScreenMaximize16 = 0xFF95, - FullScreenMaximize20 = 0xFF96, - Gif16 = 0xFF97, - Gift16 = 0xFF98, - GlobeStar20 = 0xFF99, - GlobeSurface20 = 0xFF9A, - GlobeSurface24 = 0xFF9B, - HeartBroken20 = 0xFF9C, - History16 = 0xFF9D, - ImageProhibited20 = 0xFF9E, - ImageProhibited24 = 0xFF9F, - Info12 = 0xFFA0, - Iot20 = 0xFFA1, - Iot24 = 0xFFA2, - MailOpenPerson16 = 0xFFA3, - MailTemplate16 = 0xFFA4, - Navigation16 = 0xFFA5, - News16 = 0xFFA6, - NoteEdit20 = 0xFFA7, - NoteEdit24 = 0xFFA8, - NotepadEdit20 = 0xFFA9, - OfficeApps20 = 0xFFAA, - PeopleList20 = 0xFFAB, - PeopleSettings24 = 0xFFAC, - PeopleTeamToolbox20 = 0xFFAD, - PeopleTeamToolbox24 = 0xFFAE, - PersonFeedback16 = 0xFFAF, - PersonMoney20 = 0xFFB0, - PersonMoney24 = 0xFFB1, - PhoneEraser16 = 0xFFB2, - PortHdmi24 = 0xFFB3, - PortMicroUsb24 = 0xFFB4, - PortUsbA24 = 0xFFB5, - PortUsbC24 = 0xFFB6, - Prohibited12 = 0xFFB7, - ReceiptPlay20 = 0xFFB8, - ReceiptPlay24 = 0xFFB9, - SaveSearch20 = 0xFFBA, - SearchSettings20 = 0xFFBB, - ShieldLock20 = 0xFFBC, - SquareAdd20 = 0xFFBD, - StarLineHorizontal316 = 0xFFBE, - Stream20 = 0xFFBF, - Stream24 = 0xFFC0, - Syringe20 = 0xFFC1, - Syringe24 = 0xFFC2, - TagDismiss20 = 0xFFC3, - TagDismiss24 = 0xFFC4, - TargetArrow24 = 0xFFC5, - Temperature16 = 0xFFC6, - ThumbDislike16 = 0xFFC7, - TooltipQuote24 = 0xFFC8, - Umbrella20 = 0xFFC9, - Umbrella24 = 0xFFCA, - VehicleTruckProfile20 = 0xFFCB, - VideoAdd20 = 0xFFCC, - VideoAdd24 = 0xFFCD, - Warning12 = 0xFFCE, - WindowDevEdit20 = 0xFFCF, - Xray20 = 0xFFD0, - Xray24 = 0xFFD1, - ArrowAutofitDown24 = 0xFFD2, - ArrowAutofitUp24 = 0xFFD3, - ClipboardTaskListRtl20 = 0xFFD4, - ClipboardTaskListRtl24 = 0xFFD5, - Comma24 = 0xFFD6, - TextAlignCenterRotate27024 = 0xFFD7, - TextAlignJustifyLowRotate9024 = 0xFFD8, - TextAlignJustifyRotate9024 = 0xFFD9, - TextAlignLeftRotate27024 = 0xFFDA, - TextAlignRightRotate27024 = 0xFFDB, - TextDirectionRtlAc20 = 0xFFDC, - TextDirectionRtlAc24 = 0xFFDD, - TextStrikethrough16 = 0xFFDE, - TextStrikethrough20 = 0xFFDF, - TextStrikethrough24 = 0xFFE0, - TextboxAlignBottomRotate9024 = 0xFFE1, - TextboxAlignMiddleRotate9024 = 0xFFE2, - TextboxAlignTopRotate9024 = 0xFFE3, - TextDirectionRotate90Ltr20 = 0xFFE4, - TextDirectionRotate90Ltr24 = 0xFFE5, - ArrowClockwise12 = 0xFFE6, - ArrowClockwise28 = 0xFFE7, - ArrowClockwise32 = 0xFFE8, - ArrowClockwise48 = 0xFFE9, - ArrowCounterclockwise12 = 0xFFEA, - ArrowCounterclockwise16 = 0xFFEB, - ArrowCounterclockwise32 = 0xFFEC, - ArrowCounterclockwise48 = 0xFFED, - ArrowRotateClockwise16 = 0xFFEE, - ArrowSortDownLine20 = 0xFFEF, - ArrowSplit20 = 0xFFF0, - BatteryCheckmark24 = 0xFFF1, - BookOpen16 = 0xFFF2, - BroadActivityFeed16 = 0xFFF3, - BroadActivityFeed20 = 0xFFF4, - CalendarPattern20 = 0xFFF5, - CalendarPerson16 = 0xFFF6, - CalendarPhone16 = 0xFFF7, - CalendarPhone20 = 0xFFF8, - CalendarSearch20 = 0xFFF9, - CalendarStar16 = 0xFFFA, - ChatArrowBack16 = 0xFFFB, - ChatArrowBack20 = 0xFFFC, - ChatArrowDoubleBack16 = 0xFFFD, - ChatArrowDoubleBack20 = 0xFFFE, - Check24 = 0xFFFF } -#pragma warning restore CS1591 \ No newline at end of file + +#pragma warning restore CS1591 diff --git a/RevitLookup.UI/Common/ViewData.cs b/RevitLookup.UI/Common/ViewData.cs deleted file mode 100644 index b73c136ca..000000000 --- a/RevitLookup.UI/Common/ViewData.cs +++ /dev/null @@ -1,35 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -using System.ComponentModel; - -namespace RevitLookup.UI.Common; - -/// -/// Simple tool that makes it easy to notify a view of changes. -/// -public class ViewData : INotifyPropertyChanged -{ - /// - public event PropertyChangedEventHandler PropertyChanged; - - /// - /// Updates property by reference if value was changed. - /// - protected virtual void UpdateProperty(ref T property, object value, string propertyName) - { - if (property == null || property.Equals(value)) - return; - - property = (T) value; - - OnPropertyChanged(propertyName); - } - - protected virtual void OnPropertyChanged(string name) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); - } -} \ No newline at end of file diff --git a/RevitLookup.UI/Common/Windows.cs b/RevitLookup.UI/Common/Windows.cs deleted file mode 100644 index d29b3c0bf..000000000 --- a/RevitLookup.UI/Common/Windows.cs +++ /dev/null @@ -1,36 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -namespace RevitLookup.UI.Common; - -/// -/// Facilitates the management of support for the functionality of the operating system. -/// -internal class Windows -{ - /// - /// Indicates whether the operating system is of this version or higher. - /// - public static bool Is(WindowsRelease release) - { - return Environment.OSVersion.Version.Build >= (int) release; - } - - /// - /// Indicates whether the operating system is lower than the specified version. - /// - public static bool IsBelow(WindowsRelease release) - { - return Environment.OSVersion.Version.Build < (int) release; - } - - /// - /// Indicates whether the operating system is NT or newer. - /// - public static bool IsNt() - { - return Environment.OSVersion.Platform == PlatformID.Win32NT; - } -} \ No newline at end of file diff --git a/RevitLookup.UI/Controls/Anchor.bmp b/RevitLookup.UI/Controls/Anchor.bmp new file mode 100644 index 0000000000000000000000000000000000000000..890c8099a316efec625ee7bb7adfd0b7190a8554 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSy8(Z}~6fC%n9G%j2m!T`!T zfdNDrG8auHkPDXu>OfNu5kb}hR}5E)%z#@8*Mh7bA`2&xrKqAF*(DG*rh7>BFT`QU VPQ_y~+!qjAFx`W!U=Xqy7yu*#_F@14 literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/Anchor.cs b/RevitLookup.UI/Controls/Anchor.cs index 906a55a7b..68430a7a9 100644 --- a/RevitLookup.UI/Controls/Anchor.cs +++ b/RevitLookup.UI/Controls/Anchor.cs @@ -3,52 +3,54 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics; +using System; +using System.ComponentModel; +using System.Drawing; using System.Windows; +using System.Windows.Controls.Primitives; // https://docs.microsoft.com/en-us/fluent-ui/web-components/components/anchor namespace RevitLookup.UI.Controls; /// -/// Creates a hyperlink to web pages, files, email addresses, locations in the same page, or anything else a URL can address. +/// Creates a hyperlink to web pages, files, email addresses, locations in the same page, or anything else a URL can address. /// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(Anchor), "Anchor.bmp")] public class Anchor : Button { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty NavigateUriProperty = DependencyProperty.Register(nameof(NavigateUri), typeof(string), typeof(Anchor), new PropertyMetadata(string.Empty)); /// - /// Gets or sets the URL that the hyperlink points to. + /// Gets or sets the URL that the hyperlink points to. /// public string NavigateUri { - get => (string) GetValue(NavigateUriProperty); + get => (string)GetValue(NavigateUriProperty); set => SetValue(NavigateUriProperty, value); } /// - /// This virtual method is called when button is clicked and it raises the Click event + /// This virtual method is called when button is clicked and it raises the Click event /// protected override void OnClick() { var newEvent = new RoutedEventArgs(ClickEvent, this); RaiseEvent(newEvent); -#if DEBUG - Debug.WriteLine($"INFO | Anchor clicked, with href: {NavigateUri}", "RevitLookup.UI.Anchor"); -#endif if (string.IsNullOrEmpty(NavigateUri)) return; - ProcessStartInfo sInfo = new(new Uri(NavigateUri).AbsoluteUri) + System.Diagnostics.ProcessStartInfo sInfo = new(new Uri(NavigateUri).AbsoluteUri) { UseShellExecute = true }; - Process.Start(sInfo); + System.Diagnostics.Process.Start(sInfo); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/Arc.bmp b/RevitLookup.UI/Controls/Arc.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cd009831f8edee5e2890cdb09ac9fca7e8a8ed02 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTM~^zr=%I3j2-P^A+R0CI`Z z0x=(=j~FcwGvRiTs)g3-fgT~!3WyhoR1EYrN$Mer2|5O-41$OWf4G^%D27K9+zNt; Jffxl03;_070Mh^f literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/Arc.cs b/RevitLookup.UI/Controls/Arc.cs index 0cd9160a1..bc65dd1b6 100644 --- a/RevitLookup.UI/Controls/Arc.cs +++ b/RevitLookup.UI/Controls/Arc.cs @@ -3,78 +3,82 @@ // Copyright (C) Mark Feldman, Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; +using System.ComponentModel; +using System.Drawing; using System.Windows; using System.Windows.Media; -using System.Windows.Shapes; +using Point = System.Windows.Point; +using Size = System.Windows.Size; namespace RevitLookup.UI.Controls; /// -/// Control that draws a symmetrical arc with rounded edges. +/// Control that draws a symmetrical arc with rounded edges. /// -public class Arc : Shape +[ToolboxItem(true)] +[ToolboxBitmap(typeof(Arc), "Arc.bmp")] +public class Arc : System.Windows.Shapes.Shape { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty StartAngleProperty = DependencyProperty.Register(nameof(StartAngle), typeof(double), typeof(Arc), new PropertyMetadata(0.0d, PropertyChangedCallback)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty EndAngleProperty = DependencyProperty.Register(nameof(EndAngle), typeof(double), typeof(Arc), new PropertyMetadata(0.0d, PropertyChangedCallback)); /// - /// Overrides default properties. - /// - static Arc() - { - StrokeStartLineCapProperty.OverrideMetadata( - typeof(Arc), - new FrameworkPropertyMetadata(PenLineCap.Round) - ); - - StrokeEndLineCapProperty.OverrideMetadata( - typeof(Arc), - new FrameworkPropertyMetadata(PenLineCap.Round) - ); - } - - /// - /// Gets or sets the initial angle from which the arc will be drawn. + /// Gets or sets the initial angle from which the arc will be drawn. /// public double StartAngle { - get => (double) GetValue(StartAngleProperty); + get => (double)GetValue(StartAngleProperty); set => SetValue(StartAngleProperty, value); } /// - /// Gets or sets the final angle from which the arc will be drawn. + /// Gets or sets the final angle from which the arc will be drawn. /// public double EndAngle { - get => (double) GetValue(EndAngleProperty); + get => (double)GetValue(EndAngleProperty); set => SetValue(EndAngleProperty, value); } /// - /// If IsLargeArc is , then one of the two larger arc sweeps is chosen; otherwise, if is , one of the smaller arc sweeps is chosen. + /// If IsLargeArc is , then one of the two larger arc sweeps is chosen; otherwise, if is , one of the smaller arc sweeps is chosen. /// - public bool IsLargeArc { get; internal set; } + public bool IsLargeArc { get; internal set; } = false; /// protected override Geometry DefiningGeometry => GetDefiningGeometry(); /// - /// Get the geometry that defines this shape. - /// - /// Based on Mark Feldman implementation. - /// + /// Overrides default properties. + /// + static Arc() + { + StrokeStartLineCapProperty.OverrideMetadata( + typeof(Arc), + new FrameworkPropertyMetadata(PenLineCap.Round) + ); + + StrokeEndLineCapProperty.OverrideMetadata( + typeof(Arc), + new FrameworkPropertyMetadata(PenLineCap.Round) + ); + } + + /// + /// Get the geometry that defines this shape. + /// Based on Mark Feldman implementation. /// protected Geometry GetDefiningGeometry() { @@ -109,10 +113,8 @@ protected Geometry GetDefiningGeometry() } /// - /// Draws a point on the coordinates of the given angle. - /// - /// Based on Mark Feldman implementation. - /// + /// Draws a point on the coordinates of the given angle. + /// Based on Mark Feldman implementation. /// /// The angle at which to create the point. protected Point PointAtAngle(double angle) @@ -128,7 +130,7 @@ protected Point PointAtAngle(double angle) } /// - /// Event triggered when one of the key parameters is changed. Forces the geometry to be redrawn. + /// Event triggered when one of the key parameters is changed. Forces the geometry to be redrawn. /// protected static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -140,4 +142,4 @@ protected static void PropertyChangedCallback(DependencyObject d, DependencyProp // Force complete new layout pass control.InvalidateVisual(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/AutoSuggestBox.bmp b/RevitLookup.UI/Controls/AutoSuggestBox.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eb8dd77d0f38e74c83b249694748e8e96122c08a GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTMN`uP3>@d#)#P_Ywn0H_kK z9@z?rZny~CFj}Yw8V<1t!XU;y!&N;zoY5G#{EMax&c&r3B94m$Y6nWe!yj%M9tK=J NE;BL3f#x$X005?N3jY8A literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/AutoSuggestBox.cs b/RevitLookup.UI/Controls/AutoSuggestBox.cs new file mode 100644 index 000000000..1b1b6ad56 --- /dev/null +++ b/RevitLookup.UI/Controls/AutoSuggestBox.cs @@ -0,0 +1,314 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Input; + +namespace RevitLookup.UI.Controls; + +/// +/// Represents a text control that makes suggestions to users as they enter text using a keyboard. +/// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(AutoSuggestBox), "AutoSuggestBox.bmp")] +[TemplatePart(Name = "PART_Popup", Type = typeof(Popup))] +[TemplatePart(Name = "PART_SuggestionsPresenter", Type = typeof(ListView))] +public class AutoSuggestBox : TextBox +{ + /// + /// The current text in used for validation purposes. + /// + private string _currentText; + + /// + /// Template element represented by the PART_Popup name. + /// + private const string ElementPopup = "PART_Popup"; + + /// + /// Template element represented by the PART_SuggestionsPresenter name. + /// + private const string ElementSuggestionsPresenter = "PART_SuggestionsPresenter"; + + /// + /// Popup with suggestions. + /// + protected Popup Popup { get; private set; } + + /// + /// List of suggestions inside . + /// + protected ListView SuggestionsPresenter { get; private set; } + + /// + /// Property for . + /// + public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(nameof(ItemsSource), + typeof(IEnumerable), typeof(AutoSuggestBox), + new PropertyMetadata((IEnumerable)null, OnItemsSourceChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty FilteredItemsSourceProperty = DependencyProperty.Register(nameof(FilteredItemsSource), + typeof(IEnumerable), typeof(AutoSuggestBox), + new PropertyMetadata((IEnumerable)null)); + + /// + /// Property for . + /// + public static readonly DependencyProperty IsSuggestionListOpenProperty = DependencyProperty.Register(nameof(IsSuggestionListOpen), + typeof(bool), typeof(AutoSuggestBox), + new PropertyMetadata(false)); + + /// + /// Property for . + /// + public static readonly DependencyProperty MaxDropDownHeightProperty = DependencyProperty.Register(nameof(MaxDropDownHeight), + typeof(double), typeof(AutoSuggestBox), + new PropertyMetadata(240d)); + + /// + /// Routed event for . + /// + public static readonly RoutedEvent QuerySubmittedEvent = EventManager.RegisterRoutedEvent( + nameof(QuerySubmitted), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AutoSuggestBox)); + + /// + /// Routed event for . + /// + public static readonly RoutedEvent SuggestionChosenEvent = EventManager.RegisterRoutedEvent( + nameof(SuggestionChosen), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AutoSuggestBox)); + + /// + /// does no accept returns. + /// + public new bool AcceptsReturn + { + get => false; + set => throw new NotImplementedException($"{typeof(AutoSuggestBox)} does not accept returns."); + } + + /// + /// does not accept changes to the number of lines. + /// + public new int MaxLines + { + get => 1; + set => throw new NotImplementedException($"{typeof(AutoSuggestBox)} does not accept changes to the number of lines."); + } + + /// + /// does not accept changes to the number of lines. + /// + public new int MinLines + { + get => 1; + set => throw new NotImplementedException($"{typeof(AutoSuggestBox)} does not accept changes to the number of lines."); + } + + /// + /// ItemsSource specifies a collection used to generate the list of suggestions + /// for . + /// + public IEnumerable ItemsSource + { + get => (IEnumerable)GetValue(ItemsSourceProperty); + set + { + if (value == null) + ClearValue(ItemsSourceProperty); + else + SetValue(ItemsSourceProperty, value); + } + } + + /// + /// Filtered based on provided text. + /// + public IEnumerable FilteredItemsSource + { + get => (IEnumerable)GetValue(FilteredItemsSourceProperty); + private set + { + if (value == null) + ClearValue(FilteredItemsSourceProperty); + else + SetValue(FilteredItemsSourceProperty, value); + } + } + + /// + /// Gets or sets a value representing whether the suggestion list should be opened. + /// + public bool IsSuggestionListOpen + { + get => (bool)GetValue(IsSuggestionListOpenProperty); + set => SetValue(IsSuggestionListOpenProperty, value); + } + + /// + /// Gets or sets the maximum height of the drop-down list with suggestions. + /// + public double MaxDropDownHeight + { + get => (double)GetValue(MaxDropDownHeightProperty); + set => SetValue(MaxDropDownHeightProperty, value); + } + + /// + /// Event occurs when a user commits a query string. + /// + public event RoutedEventHandler QuerySubmitted + { + add => AddHandler(QuerySubmittedEvent, value); + remove => RemoveHandler(QuerySubmittedEvent, value); + } + + /// + /// Event occurs when the user selects an item from the recommended ones. + /// + public event RoutedEventHandler SuggestionChosen + { + add => AddHandler(SuggestionChosenEvent, value); + remove => RemoveHandler(SuggestionChosenEvent, value); + } + + /// + /// Invoked whenever application code or an internal process, + /// such as a rebuilding layout pass, calls the ApplyTemplate method. + /// + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + Popup = GetTemplateChild(ElementPopup) as Popup; + SuggestionsPresenter = GetTemplateChild(ElementSuggestionsPresenter) as ListView; + + if (SuggestionsPresenter == null) + return; + + SuggestionsPresenter.SelectionChanged += OnSuggestionsPresenterSelectionChanged; + SuggestionsPresenter.LostFocus += OnSuggestionsPresenterLostFocus; + } + + /// + protected override void OnTextChanged(TextChangedEventArgs e) + { + base.OnTextChanged(e); + + if (ItemsSource == null || !ItemsSource.Any()) + return; + + var newText = Text; + + if (_currentText == newText) + return; + + if (string.IsNullOrEmpty(newText)) + { + FilteredItemsSource = ItemsSource; + } + else + { + var formattedNewText = newText.ToLower(); + + FilteredItemsSource = ItemsSource.Where(elem => elem.ToLower().Contains(formattedNewText)).ToArray(); + } + + OnQuerySubmitted(); + + IsSuggestionListOpen = true; + } + + /// + protected override void OnKeyDown(KeyEventArgs e) + { + if (e.Key == Key.Down && Popup != null && SuggestionsPresenter != null && Popup.IsOpen) + { + SuggestionsPresenter.Focus(); + + e.Handled = true; + + return; + } + + base.OnKeyDown(e); + } + + /// + /// This virtual method is called after presenter containing suggestion loses focus. + /// + protected virtual void OnSuggestionsPresenterLostFocus(object sender, RoutedEventArgs e) + { + if (!IsFocused) + IsSuggestionListOpen = false; + } + + /// + /// This virtual method is called after one of the suggestion is selected. + /// + protected virtual void OnSuggestionsPresenterSelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (sender is not ListView listView) + return; + + var selected = listView.SelectedItem; + + listView.UnselectAll(); + + _currentText = selected?.ToString() ?? string.Empty; + + Text = _currentText; + CaretIndex = _currentText.Length; + IsSuggestionListOpen = false; + + Focus(); + + OnSuggestionChosen(); + } + + /// + /// This virtual method is called after submitting a query. + /// + protected virtual void OnQuerySubmitted() + { + var newEvent = new RoutedEventArgs(QuerySubmittedEvent, this); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called after selecting a suggestion. + /// + protected virtual void OnSuggestionChosen() + { + var newEvent = new RoutedEventArgs(SuggestionChosenEvent, this); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called after is changed. + /// + protected virtual void OnItemsSourceChanged(IEnumerable itemsSource) + { + FilteredItemsSource = itemsSource; + } + + private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not AutoSuggestBox autoSuggestBox) + return; + + autoSuggestBox.OnItemsSourceChanged(e.NewValue as IEnumerable); + } +} + diff --git a/RevitLookup.UI/Controls/Badge.bmp b/RevitLookup.UI/Controls/Badge.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fa96bf2b2d95b7692153e9141334b92f9c62202b GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTNR^o?i$bO})Hl`B^wA|jmd z0-yq*GKj%Iwy&@6(lvf|%-Y`2eC3 qO+7Bf5OJUuH1%k -/// Used to highlight an item, attract attention or flag status. +/// Used to highlight an item, attract attention or flag status. /// -public class Badge : ContentControl, IAppearanceControl +[ToolboxItem(true)] +[ToolboxBitmap(typeof(Badge), "Badge.bmp")] +public class Badge : System.Windows.Controls.ContentControl, IAppearanceControl { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty AppearanceProperty = DependencyProperty.Register(nameof(Appearance), - typeof(Common.Appearance), typeof(Badge), - new PropertyMetadata(Common.Appearance.Primary)); + typeof(Common.ControlAppearance), typeof(Badge), + new PropertyMetadata(Common.ControlAppearance.Primary)); /// - public Common.Appearance Appearance + public Common.ControlAppearance Appearance { - get => (Common.Appearance) GetValue(AppearanceProperty); + get => (Common.ControlAppearance)GetValue(AppearanceProperty); set => SetValue(AppearanceProperty, value); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/Barcode.cs b/RevitLookup.UI/Controls/Barcode.cs new file mode 100644 index 000000000..eef332dd6 --- /dev/null +++ b/RevitLookup.UI/Controls/Barcode.cs @@ -0,0 +1,9 @@ +using System; + +namespace RevitLookup.UI.Controls; + +// TODO: Another for fun +[Obsolete] +internal class Barcode : System.Windows.Controls.Control +{ +} diff --git a/RevitLookup.UI/Controls/Breadcrumb.cs b/RevitLookup.UI/Controls/Breadcrumb.cs index 433637831..5abf97d98 100644 --- a/RevitLookup.UI/Controls/Breadcrumb.cs +++ b/RevitLookup.UI/Controls/Breadcrumb.cs @@ -3,43 +3,42 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics; +using System; using System.Windows; -using System.Windows.Controls; using RevitLookup.UI.Common; using RevitLookup.UI.Controls.Interfaces; namespace RevitLookup.UI.Controls; /// -/// Displays the name of the current and it's parents that can be navigated using . +/// Displays the name of the current and it's parents that can be navigated using . /// -public class Breadcrumb : Control +public class Breadcrumb : System.Windows.Controls.Control { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty CurrentProperty = DependencyProperty.Register(nameof(Current), typeof(string), typeof(Breadcrumb), new PropertyMetadata(string.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty NavigationProperty = DependencyProperty.Register(nameof(Navigation), typeof(INavigation), typeof(Breadcrumb), - new PropertyMetadata(null, NavigationPropertyChangedCallback)); + new PropertyMetadata(null, OnNavigationChanged)); /// - /// based on which displays the titles. + /// based on which displays the titles. /// public string Current { - get => (string) GetValue(CurrentProperty); + get => (string)GetValue(CurrentProperty); set => SetValue(CurrentProperty, value); } /// - /// based on which displays the titles. + /// based on which displays the titles. /// public INavigation Navigation { @@ -47,35 +46,31 @@ public INavigation Navigation set => SetValue(NavigationProperty, value); } - private void BuildBreadcrumb() + protected virtual void OnNavigated(INavigation sender, RoutedNavigationEventArgs e) { -#if DEBUG - Debug.WriteLine($"INFO | {typeof(Breadcrumb)} builded, current nav: {Navigation.GetType()}", "RevitLookup.UI.Breadcrumb"); -#endif - //TODO: Navigate with previous levels - if (Navigation?.Current is INavigationItem item) - { - var pageName = item.Content as string; + if (Navigation?.Current is not INavigationItem item) + return; + + var pageName = item.Content as string; - if (string.IsNullOrEmpty(pageName)) - return; + if (string.IsNullOrEmpty(pageName)) + return; - Current = pageName; - } + Current = pageName; } - private static void NavigationPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) + protected virtual void OnNavigationChanged() { - if (d is not Breadcrumb control) - return; - - control.Navigation.Navigated += control.NavigationOnNavigated; + Navigation.Navigated += OnNavigated; } - private void NavigationOnNavigated(INavigation sender, RoutedNavigationEventArgs e) + private static void OnNavigationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { - BuildBreadcrumb(); + if (d is not Breadcrumb breadcrumb) + return; + + breadcrumb.OnNavigationChanged(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/Button.cs b/RevitLookup.UI/Controls/Button.cs index 8c081b97c..2f89ccfca 100644 --- a/RevitLookup.UI/Controls/Button.cs +++ b/RevitLookup.UI/Controls/Button.cs @@ -7,114 +7,158 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Media; -using RevitLookup.UI.Common; using RevitLookup.UI.Controls.Interfaces; namespace RevitLookup.UI.Controls; /// -/// Inherited from the , adding . +/// Inherited from the , adding . /// public class Button : System.Windows.Controls.Button, IIconControl, IAppearanceControl { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), - typeof(SymbolRegular), typeof(Button), - new PropertyMetadata(SymbolRegular.Empty)); + typeof(Common.SymbolRegular), typeof(Button), + new PropertyMetadata(Common.SymbolRegular.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconFilledProperty = DependencyProperty.Register(nameof(IconFilled), typeof(bool), typeof(Button), new PropertyMetadata(false)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.Register(nameof(IconForeground), typeof(Brush), typeof(Button), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, FrameworkPropertyMetadataOptions.Inherits)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty AppearanceProperty = DependencyProperty.Register(nameof(Appearance), - typeof(Common.Appearance), typeof(Button), - new PropertyMetadata(Common.Appearance.Primary)); + typeof(Common.ControlAppearance), typeof(Button), + new PropertyMetadata(Common.ControlAppearance.Primary)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty HoverBackgroundProperty = DependencyProperty.Register(nameof(HoverBackground), + public static readonly DependencyProperty MouseOverBackgroundProperty = DependencyProperty.Register(nameof(MouseOverBackground), typeof(Brush), typeof(Button), new PropertyMetadata(Border.BackgroundProperty.DefaultMetadata.DefaultValue)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty HoverBorderBrushProperty = DependencyProperty.Register(nameof(HoverBorderBrush), + public static readonly DependencyProperty MouseOverBorderBrushProperty = DependencyProperty.Register(nameof(MouseOverBorderBrush), typeof(Brush), typeof(Button), new PropertyMetadata(Border.BorderBrushProperty.DefaultMetadata.DefaultValue)); /// - /// Foreground of the . + /// Property for . /// - [Bindable(true)] - [Category("Appearance")] + public static readonly DependencyProperty PressedForegroundProperty = DependencyProperty.Register(nameof(PressedForeground), + typeof(Brush), typeof(Button), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, + FrameworkPropertyMetadataOptions.Inherits)); + + /// + /// Property for . + /// + public static readonly DependencyProperty PressedBackgroundProperty = DependencyProperty.Register(nameof(PressedBackground), + typeof(Brush), typeof(Button), + new PropertyMetadata(Border.BackgroundProperty.DefaultMetadata.DefaultValue)); + + /// + /// Property for . + /// + public static readonly DependencyProperty PressedBorderBrushProperty = DependencyProperty.Register(nameof(PressedBorderBrush), + typeof(Brush), typeof(Button), + new PropertyMetadata(Border.BorderBrushProperty.DefaultMetadata.DefaultValue)); + + /// + [Bindable(true), Category("Appearance")] + public Common.SymbolRegular Icon + { + get => (Common.SymbolRegular)GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + /// + [Bindable(true), Category("Appearance")] + public bool IconFilled + { + get => (bool)GetValue(IconFilledProperty); + set => SetValue(IconFilledProperty, value); + } + + /// + /// Foreground of the . + /// + [Bindable(true), Category("Appearance")] public Brush IconForeground { - get => (Brush) GetValue(IconForegroundProperty); + get => (Brush)GetValue(IconForegroundProperty); set => SetValue(IconForegroundProperty, value); } + /// + [Bindable(true), Category("Appearance")] + public Common.ControlAppearance Appearance + { + get => (Common.ControlAppearance)GetValue(AppearanceProperty); + set => SetValue(AppearanceProperty, value); + } + /// - /// Background when the user interacts with an element with a pointing device. + /// Background when the user interacts with an element with a pointing device. /// - [Bindable(true)] - [Category("Appearance")] - public Brush HoverBackground + [Bindable(true), Category("Appearance")] + public Brush MouseOverBackground { - get => (Brush) GetValue(HoverBackgroundProperty); - set => SetValue(HoverBackgroundProperty, value); + get => (Brush)GetValue(MouseOverBackgroundProperty); + set => SetValue(MouseOverBackgroundProperty, value); } /// - /// Border when the user interacts with an element with a pointing device. + /// Border when the user interacts with an element with a pointing device. /// - [Bindable(true)] - [Category("Appearance")] - public Brush HoverBorderBrush + [Bindable(true), Category("Appearance")] + public Brush MouseOverBorderBrush { - get => (Brush) GetValue(HoverBorderBrushProperty); - set => SetValue(HoverBorderBrushProperty, value); + get => (Brush)GetValue(MouseOverBorderBrushProperty); + set => SetValue(MouseOverBorderBrushProperty, value); } - /// - [Bindable(true)] - [Category("Appearance")] - public Common.Appearance Appearance + /// + /// Foreground when pressed. + /// + [Bindable(true), Category("Appearance")] + public Brush PressedForeground { - get => (Common.Appearance) GetValue(AppearanceProperty); - set => SetValue(AppearanceProperty, value); + get => (Brush)GetValue(PressedForegroundProperty); + set => SetValue(PressedForegroundProperty, value); } - /// - [Bindable(true)] - [Category("Appearance")] - public SymbolRegular Icon + /// + /// Background when the user clicks the button. + /// + [Bindable(true), Category("Appearance")] + public Brush PressedBackground { - get => (SymbolRegular) GetValue(IconProperty); - set => SetValue(IconProperty, value); + get => (Brush)GetValue(PressedBackgroundProperty); + set => SetValue(PressedBackgroundProperty, value); } - /// - [Bindable(true)] - [Category("Appearance")] - public bool IconFilled + /// + /// Border when the user clicks the button. + /// + [Bindable(true), Category("Appearance")] + public Brush PressedBorderBrush { - get => (bool) GetValue(IconFilledProperty); - set => SetValue(IconFilledProperty, value); + get => (Brush)GetValue(PressedBorderBrushProperty); + set => SetValue(PressedBorderBrushProperty, value); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/Card.bmp b/RevitLookup.UI/Controls/Card.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9f863423ef6c5175c35b0e8055f2a67e83251e42 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTMZ`i2`|8VFSDgc|^5k+tAg z3^4{-3*FQMEy4s;bPuNCKoKgMk2?mOfEK}{0B$Lf>VX>ZYe6;~*%qKURsdH+2L=NJ E0IKh@KmY&$ literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/Card.cs b/RevitLookup.UI/Controls/Card.cs index ade769f5d..33b4b7c5d 100644 --- a/RevitLookup.UI/Controls/Card.cs +++ b/RevitLookup.UI/Controls/Card.cs @@ -3,32 +3,35 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.ComponentModel; +using System.Drawing; using System.Windows; -using System.Windows.Controls; namespace RevitLookup.UI.Controls; /// -/// Simple Card with content and . +/// Simple Card with content and . /// -public class Card : ContentControl +[ToolboxItem(true)] +[ToolboxBitmap(typeof(Card), "Card.bmp")] +public class Card : System.Windows.Controls.ContentControl { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty FooterProperty = DependencyProperty.Register(nameof(Footer), typeof(object), typeof(Card), new PropertyMetadata(null, FooterChangedCallback)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty HasFooterProperty = DependencyProperty.Register(nameof(HasFooter), typeof(bool), typeof(Card), new PropertyMetadata(false)); /// - /// Gets or sets additional content displayed at the bottom. + /// Gets or sets additional content displayed at the bottom. /// public object Footer { @@ -37,11 +40,11 @@ public object Footer } /// - /// Gets information whether the has a . + /// Gets information whether the has a . /// public bool HasFooter { - get => (bool) GetValue(HasFooterProperty); + get => (bool)GetValue(HasFooterProperty); internal set => SetValue(HasFooterProperty, value); } @@ -52,4 +55,4 @@ private static void FooterChangedCallback(DependencyObject d, DependencyProperty control.SetValue(HasFooterProperty, control.Footer != null); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/CardAction.bmp b/RevitLookup.UI/Controls/CardAction.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9f863423ef6c5175c35b0e8055f2a67e83251e42 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTMZ`i2`|8VFSDgc|^5k+tAg z3^4{-3*FQMEy4s;bPuNCKoKgMk2?mOfEK}{0B$Lf>VX>ZYe6;~*%qKURsdH+2L=NJ E0IKh@KmY&$ literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/CardAction.cs b/RevitLookup.UI/Controls/CardAction.cs index 6e3f3497f..0ebc2cb51 100644 --- a/RevitLookup.UI/Controls/CardAction.cs +++ b/RevitLookup.UI/Controls/CardAction.cs @@ -3,60 +3,84 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.ComponentModel; +using System.Drawing; using System.Windows; -using System.Windows.Controls.Primitives; -using RevitLookup.UI.Common; using RevitLookup.UI.Controls.Interfaces; +using Brush = System.Windows.Media.Brush; +using SystemColors = System.Windows.SystemColors; namespace RevitLookup.UI.Controls; /// -/// Inherited from the interactive card styled according to Fluent Design. +/// Inherited from the interactive card styled according to Fluent Design. /// //#if NETFRAMEWORK // [ToolboxBitmap(typeof(Button))] //#endif -public class CardAction : ButtonBase, IIconControl +[ToolboxItem(true)] +[ToolboxBitmap(typeof(CardAction), "CardAction.bmp")] +public class CardAction : System.Windows.Controls.Primitives.ButtonBase, IIconControl { /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty ShowChevronProperty = DependencyProperty.Register(nameof(ShowChevron), + public static readonly DependencyProperty IsChevronVisibleProperty = DependencyProperty.Register(nameof(IsChevronVisible), typeof(bool), typeof(CardAction), new PropertyMetadata(true)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), - typeof(SymbolRegular), typeof(CardAction), - new PropertyMetadata(SymbolRegular.Empty)); + typeof(Common.SymbolRegular), typeof(CardAction), + new PropertyMetadata(Common.SymbolRegular.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconFilledProperty = DependencyProperty.Register(nameof(IconFilled), typeof(bool), typeof(CardAction), new PropertyMetadata(false)); /// - /// Gets or sets information whether to display the chevron icon on the right side of the card. + /// Property for . /// - public bool ShowChevron + public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.Register(nameof(IconForeground), + typeof(Brush), typeof(CardAction), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, + FrameworkPropertyMetadataOptions.Inherits)); + + /// + /// Gets or sets information whether to display the chevron icon on the right side of the card. + /// + [Bindable(true), Category("Appearance")] + public bool IsChevronVisible { - get => (bool) GetValue(ShowChevronProperty); - set => SetValue(ShowChevronProperty, value); + get => (bool)GetValue(IsChevronVisibleProperty); + set => SetValue(IsChevronVisibleProperty, value); } /// - public SymbolRegular Icon + [Bindable(true), Category("Appearance")] + public Common.SymbolRegular Icon { - get => (SymbolRegular) GetValue(IconProperty); + get => (Common.SymbolRegular)GetValue(IconProperty); set => SetValue(IconProperty, value); } /// + [Bindable(true), Category("Appearance")] public bool IconFilled { - get => (bool) GetValue(IconFilledProperty); + get => (bool)GetValue(IconFilledProperty); set => SetValue(IconFilledProperty, value); } -} \ No newline at end of file + + /// + /// Foreground of the . + /// + [Bindable(true), Category("Appearance")] + public Brush IconForeground + { + get => (Brush)GetValue(IconForegroundProperty); + set => SetValue(IconForegroundProperty, value); + } +} diff --git a/RevitLookup.UI/Controls/CardColor.cs b/RevitLookup.UI/Controls/CardColor.cs index b1c11af4b..673b8b8f5 100644 --- a/RevitLookup.UI/Controls/CardColor.cs +++ b/RevitLookup.UI/Controls/CardColor.cs @@ -3,118 +3,118 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; using System.Windows; -using System.Windows.Controls; using System.Windows.Media; namespace RevitLookup.UI.Controls; /// -/// Ala Pa**one color card. +/// Ala Pa**one color card. /// -public class CardColor : Control +public class CardColor : System.Windows.Controls.Control { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(CardColor), new PropertyMetadata(string.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty SubtitleProperty = DependencyProperty.Register(nameof(Subtitle), typeof(string), typeof(CardColor), new PropertyMetadata(string.Empty, OnSubtitlePropertyChanged)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty SubtitleFontSizeProperty = DependencyProperty.Register(nameof(SubtitleFontSize), typeof(double), typeof(CardColor), new PropertyMetadata(11.0d)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ColorProperty = DependencyProperty.Register(nameof(Color), typeof(Color), typeof(CardColor), new PropertyMetadata(Color.FromArgb(0, 0, 0, 0), OnColorPropertyChanged)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty BrushProperty = DependencyProperty.Register(nameof(Brush), typeof(Brush), typeof(CardColor), - new PropertyMetadata(new SolidColorBrush {Color = Color.FromArgb(0, 0, 0, 0)}, OnBrushPropertyChanged)); + new PropertyMetadata(new SolidColorBrush { Color = Color.FromArgb(0, 0, 0, 0) }, OnBrushPropertyChanged)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty CardBrushProperty = DependencyProperty.Register(nameof(CardBrush), typeof(Brush), typeof(CardColor), - new PropertyMetadata(new SolidColorBrush {Color = Color.FromArgb(0, 0, 0, 0)})); + new PropertyMetadata(new SolidColorBrush { Color = Color.FromArgb(0, 0, 0, 0) })); /// - /// Gets or sets the main text displayed below the color. + /// Gets or sets the main text displayed below the color. /// public string Title { - get => (string) GetValue(TitleProperty); + get => (string)GetValue(TitleProperty); set => SetValue(TitleProperty, value); } /// - /// Gets or sets text displayed under main . + /// Gets or sets text displayed under main . /// public string Subtitle { - get => (string) GetValue(SubtitleProperty); + get => (string)GetValue(SubtitleProperty); set => SetValue(SubtitleProperty, value); } /// - /// Gets or sets the font size of . + /// Gets or sets the font size of . /// public double SubtitleFontSize { - get => (double) GetValue(SubtitleFontSizeProperty); + get => (double)GetValue(SubtitleFontSizeProperty); set => SetValue(SubtitleFontSizeProperty, value); } /// - /// Gets or sets the displayed . + /// Gets or sets the displayed . /// public Color Color { - get => (Color) GetValue(ColorProperty); + get => (Color)GetValue(ColorProperty); set => SetValue(ColorProperty, value); } /// - /// Gets or sets the displayed . + /// Gets or sets the displayed . /// public Brush Brush { - get => (Brush) GetValue(BrushProperty); + get => (Brush)GetValue(BrushProperty); set => SetValue(BrushProperty, value); } /// - /// Gets the displayed in . + /// Gets the displayed in . /// public Brush CardBrush { - get => (Brush) GetValue(CardBrushProperty); + get => (Brush)GetValue(CardBrushProperty); internal set => SetValue(CardBrushProperty, value); } /// - /// Virtual method triggered when is changed. + /// Virtual method triggered when is changed. /// protected virtual void OnSubtitlePropertyChanged() { } /// - /// Virtual method triggered when is changed. + /// Virtual method triggered when is changed. /// protected virtual void OnColorPropertyChanged() { @@ -122,7 +122,7 @@ protected virtual void OnColorPropertyChanged() } /// - /// Virtual method triggered when is changed. + /// Virtual method triggered when is changed. /// protected virtual void OnBrushPropertyChanged() { @@ -152,4 +152,4 @@ private static void OnBrushPropertyChanged(DependencyObject d, DependencyPropert cardColor.OnBrushPropertyChanged(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/CardControl.cs b/RevitLookup.UI/Controls/CardControl.cs index bfa30765b..20be027fe 100644 --- a/RevitLookup.UI/Controls/CardControl.cs +++ b/RevitLookup.UI/Controls/CardControl.cs @@ -3,72 +3,77 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.ComponentModel; using System.Windows; -using System.Windows.Controls.Primitives; -using RevitLookup.UI.Common; +using System.Windows.Media; using RevitLookup.UI.Controls.Interfaces; namespace RevitLookup.UI.Controls; /// -/// Inherited from the control which displays an additional control on the right side of the card. +/// Inherited from the control which displays an additional control on the right side of the card. /// -public class CardControl : ButtonBase, IIconControl +public class CardControl : System.Windows.Controls.Primitives.ButtonBase, IIconControl { /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), - typeof(string), typeof(CardControl), new PropertyMetadata("")); + public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(nameof(Header), + typeof(object), typeof(CardControl), new PropertyMetadata(null)); /// - /// Property for . - /// - public static readonly DependencyProperty SubtitleProperty = DependencyProperty.Register(nameof(Subtitle), - typeof(string), typeof(CardControl), new PropertyMetadata("")); - - /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), - typeof(SymbolRegular), typeof(CardControl), - new PropertyMetadata(SymbolRegular.Empty)); + typeof(Common.SymbolRegular), typeof(CardControl), + new PropertyMetadata(Common.SymbolRegular.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconFilledProperty = DependencyProperty.Register(nameof(IconFilled), typeof(bool), typeof(CardControl), new PropertyMetadata(false)); /// - /// Gets or sets text displayed on the left side of the card. + /// Property for . /// - public string Title - { - get => (string) GetValue(TitleProperty); - set => SetValue(TitleProperty, value); - } + public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.Register(nameof(IconForeground), + typeof(Brush), typeof(CardControl), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, + FrameworkPropertyMetadataOptions.Inherits)); /// - /// Gets or sets text displayed under main . + /// Header is the data used to for the header of each item in the control. /// - public string Subtitle + [Bindable(true)] + public object Header { - get => (string) GetValue(SubtitleProperty); - set => SetValue(SubtitleProperty, value); + get => GetValue(HeaderProperty); + set => SetValue(HeaderProperty, value); } /// - public SymbolRegular Icon + [Bindable(true), Category("Appearance")] + public Common.SymbolRegular Icon { - get => (SymbolRegular) GetValue(IconProperty); + get => (Common.SymbolRegular)GetValue(IconProperty); set => SetValue(IconProperty, value); } /// + [Bindable(true), Category("Appearance")] public bool IconFilled { - get => (bool) GetValue(IconFilledProperty); + get => (bool)GetValue(IconFilledProperty); set => SetValue(IconFilledProperty, value); } -} \ No newline at end of file + + /// + /// Foreground of the . + /// + [Bindable(true), Category("Appearance")] + public Brush IconForeground + { + get => (Brush)GetValue(IconForegroundProperty); + set => SetValue(IconForegroundProperty, value); + } +} diff --git a/RevitLookup.UI/Controls/CardExpander.bmp b/RevitLookup.UI/Controls/CardExpander.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9f863423ef6c5175c35b0e8055f2a67e83251e42 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTMZ`i2`|8VFSDgc|^5k+tAg z3^4{-3*FQMEy4s;bPuNCKoKgMk2?mOfEK}{0B$Lf>VX>ZYe6;~*%qKURsdH+2L=NJ E0IKh@KmY&$ literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/CardExpander.cs b/RevitLookup.UI/Controls/CardExpander.cs index f404024ee..b25a544f4 100644 --- a/RevitLookup.UI/Controls/CardExpander.cs +++ b/RevitLookup.UI/Controls/CardExpander.cs @@ -3,72 +3,64 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.ComponentModel; +using System.Drawing; using System.Windows; -using System.Windows.Controls; -using RevitLookup.UI.Common; using RevitLookup.UI.Controls.Interfaces; +using Brush = System.Windows.Media.Brush; +using SystemColors = System.Windows.SystemColors; namespace RevitLookup.UI.Controls; /// -/// Inherited from the control which can hide the collapsible content. +/// Inherited from the control which can hide the collapsible content. /// -public class CardExpander : Expander, IIconControl +[ToolboxItem(true)] +[ToolboxBitmap(typeof(CardExpander), "CardExpander.bmp")] +public class CardExpander : System.Windows.Controls.Expander, IIconControl { /// - /// Property for . - /// - public static readonly DependencyProperty SubtitleProperty = DependencyProperty.Register(nameof(Subtitle), - typeof(string), typeof(CardExpander), new PropertyMetadata(null)); - - /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), - typeof(SymbolRegular), typeof(CardExpander), new PropertyMetadata(SymbolRegular.Empty)); + typeof(Common.SymbolRegular), typeof(CardExpander), new PropertyMetadata(Common.SymbolRegular.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconFilledProperty = DependencyProperty.Register(nameof(IconFilled), typeof(bool), typeof(CardExpander), new PropertyMetadata(false)); /// - /// Property for . - /// - public static readonly DependencyProperty HeaderContentProperty = - DependencyProperty.Register(nameof(HeaderContent), typeof(object), typeof(CardExpander), - new PropertyMetadata(null)); - - /// - /// Gets or sets text displayed under main . - /// - public string Subtitle - { - get => (string) GetValue(SubtitleProperty); - set => SetValue(SubtitleProperty, value); - } - - /// - /// Gets or sets additional content displayed next to the chevron. + /// Property for . /// - public object HeaderContent - { - get => GetValue(HeaderContentProperty); - set => SetValue(HeaderContentProperty, value); - } + public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.Register(nameof(IconForeground), + typeof(Brush), typeof(CardExpander), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, + FrameworkPropertyMetadataOptions.Inherits)); /// - public SymbolRegular Icon + [Bindable(true), Category("Appearance")] + public Common.SymbolRegular Icon { - get => (SymbolRegular) GetValue(IconProperty); + get => (Common.SymbolRegular)GetValue(IconProperty); set => SetValue(IconProperty, value); } /// + [Bindable(true), Category("Appearance")] public bool IconFilled { - get => (bool) GetValue(IconFilledProperty); + get => (bool)GetValue(IconFilledProperty); set => SetValue(IconFilledProperty, value); } -} \ No newline at end of file + + /// + /// Foreground of the . + /// + [Bindable(true), Category("Appearance")] + public Brush IconForeground + { + get => (Brush)GetValue(IconForegroundProperty); + set => SetValue(IconForegroundProperty, value); + } +} diff --git a/RevitLookup.UI/Controls/ClientAreaBorder.cs b/RevitLookup.UI/Controls/ClientAreaBorder.cs index 7beac17b7..956178cc8 100644 --- a/RevitLookup.UI/Controls/ClientAreaBorder.cs +++ b/RevitLookup.UI/Controls/ClientAreaBorder.cs @@ -4,53 +4,70 @@ // All Rights Reserved. #nullable enable + +using System; using System.Windows; -using System.Windows.Controls; +using System.Windows.Media; using System.Windows.Shell; -using RevitLookup.UI.Common; -using static RevitLookup.UI.Interop.User32; +using RevitLookup.UI.Appearance; +using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Dpi; +using Size = System.Windows.Size; namespace RevitLookup.UI.Controls; /// -/// If you use to extend the UI elements to the non-client area, you can include this container in the template of so that the -/// content inside automatically fills the client area. -/// Using this container can let you get rid of various margin adaptations done in Setter/Trigger of the style of when the window state changes. +/// If you use to extend the UI elements to the non-client area, you can include this container +/// in the template of so that the content inside automatically fills the client area. +/// Using this container can let you get rid of various margin adaptations done in +/// Setter/Trigger of the style of when the window state changes. /// -public class ClientAreaBorder : Border +public class ClientAreaBorder : System.Windows.Controls.Border, IThemeControl { + private bool _borderBrushApplied = false; + private const int SM_CXFRAME = 32; + private const int SM_CYFRAME = 33; + private const int SM_CXPADDEDBORDER = 92; + + private Window? _oldWindow; + private static Thickness? _paddedBorderThickness; + private static Thickness? _resizeFrameBorderThickness; + private static Thickness? _windowChromeNonClientFrameThickness; - private Window? _oldWindow; + public ThemeType Theme { get; set; } = ThemeType.Unknown; /// - /// Get the system value in WPF units. + /// Get the system value in WPF units. /// public Thickness PaddedBorderThickness { get { - if (_paddedBorderThickness is null) - { - var paddedBorder = GetSystemMetrics(SM_CXPADDEDBORDER); - var (factorX, factorY) = GetDpi(); - var frameSize = new Size(paddedBorder, paddedBorder); - var frameSizeInDips = new Size(frameSize.Width / factorX, frameSize.Height / factorY); - _paddedBorderThickness = new Thickness(frameSizeInDips.Width, frameSizeInDips.Height, - frameSizeInDips.Width, frameSizeInDips.Height); - } + if (_paddedBorderThickness is not null) + return _paddedBorderThickness.Value; + + var paddedBorder = Interop.User32.GetSystemMetrics( + Interop.User32.SM.CXPADDEDBORDER); + + var (factorX, factorY) = GetDpi(); + var frameSize = new Size(paddedBorder, paddedBorder); + var frameSizeInDips = new Size(frameSize.Width / factorX, frameSize.Height / factorY); + + _paddedBorderThickness = new Thickness(frameSizeInDips.Width, frameSizeInDips.Height, + frameSizeInDips.Width, frameSizeInDips.Height); return _paddedBorderThickness.Value; } } /// - /// Get the system and values in WPF units. + /// Get the system and values in WPF units. /// public Thickness ResizeFrameBorderThickness => _resizeFrameBorderThickness ??= new Thickness( SystemParameters.ResizeFrameVerticalBorderWidth, @@ -59,10 +76,9 @@ public Thickness PaddedBorderThickness SystemParameters.ResizeFrameHorizontalBorderHeight); /// - /// If you use a to extend the client area of a window to the non-client area, you need to handle the edge margin issue when the window is maximized. - /// Use this property to get the correct margin value when the window is maximized, so that when the window is maximized, the client area can completely cover the screen client - /// area by no less than a single pixel at any DPI. - /// The method cannot obtain this value directly. + /// If you use a to extend the client area of a window to the non-client area, you need to handle the edge margin issue when the window is maximized. + /// Use this property to get the correct margin value when the window is maximized, so that when the window is maximized, the client area can completely cover the screen client area by no less than a single pixel at any DPI. + /// The method cannot obtain this value directly. /// public Thickness WindowChromeNonClientFrameThickness => _windowChromeNonClientFrameThickness ??= new Thickness( ResizeFrameBorderThickness.Left + PaddedBorderThickness.Left, @@ -70,38 +86,78 @@ public Thickness PaddedBorderThickness ResizeFrameBorderThickness.Right + PaddedBorderThickness.Right, ResizeFrameBorderThickness.Bottom + PaddedBorderThickness.Bottom); + public ClientAreaBorder() + { + Theme = Appearance.Theme.GetAppTheme(); + Appearance.Theme.Changed += OnThemeChanged; + } + + private void OnThemeChanged(ThemeType currentTheme, Color systemAccent) + { + Theme = currentTheme; + + if (!_borderBrushApplied || _oldWindow == null) + return; + + ApplyDefaultWindowBorder(); + } + /// protected override void OnVisualParentChanged(DependencyObject oldParent) { base.OnVisualParentChanged(oldParent); - if (_oldWindow is { } oldWindow) oldWindow.StateChanged -= Window_StateChanged; + if (_oldWindow is { } oldWindow) + { + oldWindow.StateChanged -= OnWindowStateChanged; + } + + var newWindow = (Window?)Window.GetWindow(this); - var newWindow = (Window?) Window.GetWindow(this); if (newWindow is not null) { - newWindow.StateChanged -= Window_StateChanged; - newWindow.StateChanged += Window_StateChanged; + newWindow.StateChanged -= OnWindowStateChanged; // Unsafe + newWindow.StateChanged += OnWindowStateChanged; } _oldWindow = newWindow; + + ApplyDefaultWindowBorder(); } - private void Window_StateChanged(object? sender, EventArgs e) + private void OnWindowStateChanged(object? sender, EventArgs e) { - var window = (Window) sender!; + if (sender is not Window window) + return; + Padding = window.WindowState switch { WindowState.Maximized => WindowChromeNonClientFrameThickness, - _ => default + _ => default, }; } + private void ApplyDefaultWindowBorder() + { + if (Win32.Utilities.IsOSWindows11OrNewer || _oldWindow == null) + return; + + _borderBrushApplied = true; + + // SystemParameters.WindowGlassBrush + + _oldWindow.BorderThickness = new Thickness(1); + _oldWindow.BorderBrush = new SolidColorBrush(Theme == ThemeType.Light ? Color.FromArgb(0xFF, 0x7A, 0x7A, 0x7A) : Color.FromArgb(0xFF, 0x3A, 0x3A, 0x3A)); + } + private (double factorX, double factorY) GetDpi() { - return PresentationSource.FromVisual(this) is { } source - ? (source.CompositionTarget.TransformToDevice.M11, - source.CompositionTarget.TransformToDevice.M22) - : (Dpi.SystemDpiXScale(), Dpi.SystemDpiYScale()); + if (PresentationSource.FromVisual(this) is { } source) + return (source.CompositionTarget.TransformToDevice.M11, // Possible null reference + source.CompositionTarget.TransformToDevice.M22); + + var systemDPi = DpiHelper.GetSystemDpi(); + + return (systemDPi.DpiScaleX, systemDPi.DpiScaleY); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/CodeBlock.bmp b/RevitLookup.UI/Controls/CodeBlock.bmp new file mode 100644 index 0000000000000000000000000000000000000000..231cb0509c4a0de7846644a5a79bd33a9533a13b GIT binary patch literal 824 zcmcgnu?>JQ3=1%_ASO=W0>sSD|7QRf6stj2KZe>H} zYt;MJZzhnErQhP%c7%`fH(}fXr6nIK38NTHsgF=v+>?d^qu7;q8SSy9+~?WfdrLhS of#NR$@dp$=-9CRoCW^m9PVof<#ugC>jCwH8AXpMe{{6%31OZ>_G5`Po literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/CodeBlock.cs b/RevitLookup.UI/Controls/CodeBlock.cs index c6592811d..3658ebbfa 100644 --- a/RevitLookup.UI/Controls/CodeBlock.cs +++ b/RevitLookup.UI/Controls/CodeBlock.cs @@ -3,50 +3,40 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics; +using System; +using System.ComponentModel; +using System.Drawing; using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; using RevitLookup.UI.Appearance; -using RevitLookup.UI.Common; -using RevitLookup.UI.Syntax; -using Clipboard = RevitLookup.UI.Common.Clipboard; +using Color = System.Windows.Media.Color; namespace RevitLookup.UI.Controls; /// -/// Formats and display a fragment of the source code. +/// Formats and display a fragment of the source code. /// -public class CodeBlock : ContentControl +[ToolboxItem(true)] +[ToolboxBitmap(typeof(CodeBlock), "CodeBlock.bmp")] +public class CodeBlock : System.Windows.Controls.ContentControl { + private string _sourceCode = string.Empty; + /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty SyntaxContentProperty = DependencyProperty.Register(nameof(SyntaxContent), typeof(object), typeof(CodeBlock), new PropertyMetadata(null)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonCommandProperty = DependencyProperty.Register(nameof(NumberBox), - typeof(IRelayCommand), typeof(CodeBlock), new PropertyMetadata(null)); - - private string _sourceCode = string.Empty; - - /// - /// Creates new instance and assigns default action. - /// - public CodeBlock() - { - SetValue(ButtonCommandProperty, new RelayCommand(o => Button_Click(this, o))); - - Theme.Changed += ThemeOnChanged; - } + typeof(Common.IRelayCommand), typeof(CodeBlock), new PropertyMetadata(null)); /// - /// Formatted . + /// Formatted . /// public object SyntaxContent { @@ -55,9 +45,19 @@ public object SyntaxContent } /// - /// Command triggered after clicking the control button. + /// Command triggered after clicking the control button. + /// + public Common.IRelayCommand ButtonCommand => (Common.IRelayCommand)GetValue(ButtonCommandProperty); + + /// + /// Creates new instance and assigns default action. /// - public IRelayCommand ButtonCommand => (IRelayCommand) GetValue(ButtonCommandProperty); + public CodeBlock() + { + SetValue(ButtonCommandProperty, new Common.RelayCommand(o => Button_Click(this, o))); + + Theme.Changed += ThemeOnChanged; + } private void ThemeOnChanged(ThemeType currentTheme, Color systemAccent) { @@ -65,7 +65,7 @@ private void ThemeOnChanged(ThemeType currentTheme, Color systemAccent) } /// - /// This method is invoked when the Content property changes. + /// This method is invoked when the Content property changes. /// /// The old value of the Content property. /// The new value of the Content property. @@ -76,15 +76,12 @@ protected override void OnContentChanged(object oldContent, object newContent) protected virtual void UpdateSyntax() { - _sourceCode = Highlighter.Clean(Content as string ?? string.Empty); - SyntaxContent = Highlighter.Format(_sourceCode); + _sourceCode = Syntax.Highlighter.Clean(Content as string ?? string.Empty); + SyntaxContent = Syntax.Highlighter.Format(_sourceCode); } private void Button_Click(object sender, object parameter) { -#if DEBUG - Debug.WriteLine($"INFO | CodeBlock source: \n{_sourceCode}", "RevitLookup.UI.CodeBlock"); -#endif - Clipboard.SetText(_sourceCode); + Common.Clipboard.SetText(_sourceCode); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/ControlsServices.cs b/RevitLookup.UI/Controls/ControlsServices.cs new file mode 100644 index 000000000..d70280c26 --- /dev/null +++ b/RevitLookup.UI/Controls/ControlsServices.cs @@ -0,0 +1,27 @@ +using System; + +namespace RevitLookup.UI.Controls +{ + /// + /// Used to initialize the library controls with static values. + /// + public static class ControlsServices + { +#if NET48_OR_GREATER || NETCOREAPP3_0_OR_GREATER + internal static IServiceProvider ControlsServiceProvider { get; private set; } + + /// + /// Accepts a ServiceProvider for configuring dependency injection. + /// + /// + /// + public static void Initialize(IServiceProvider serviceProvider) + { + if (serviceProvider == null) + throw new ArgumentNullException(nameof(serviceProvider)); + + ControlsServiceProvider = serviceProvider; + } +#endif + } +} diff --git a/RevitLookup.UI/Controls/Dialog.bmp b/RevitLookup.UI/Controls/Dialog.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4fcd099351afa45f63afecce3419b91ed51bcaac GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSy;&^J;5(B(koPQ(GAO1S!u p??2#2KqDzpPmGHwF(2r7pcVK@O3Ww8{XmO|1cNH2K^()t005es59 -/// Displays a large card with a slightly transparent background and two action buttons. +/// Displays a large card with a slightly transparent background and two action buttons. /// -public class Dialog : ContentControl +[ToolboxItem(true)] +[ToolboxBitmap(typeof(Dialog), "Dialog.bmp")] +[TemplatePart(Name = "PART_FooterButtonLeft", Type = typeof(System.Windows.Controls.Primitives.ButtonBase))] +[TemplatePart(Name = "PART_FooterButtonRight", Type = typeof(System.Windows.Controls.Primitives.ButtonBase))] +public class Dialog : System.Windows.Controls.ContentControl, IDialogControl { + private TaskCompletionSource? _tcs = null; + + private bool _automaticHide; + + private System.Windows.Controls.Primitives.ButtonBase? _leftFooterButton = null; + + private System.Windows.Controls.Primitives.ButtonBase? _rightFooterButton = null; + + /// + /// Template element represented by the PART_FooterButtonLeft name. + /// + private const string ElementFooterButtonLeft = "PART_FooterButtonLeft"; + + /// + /// Template element represented by the PART_FooterButtonRight name. + /// + private const string ElementFooterButtonRight = "PART_FooterButtonRight"; + + #region Static properties + /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IsShownProperty = DependencyProperty.Register(nameof(IsShown), - typeof(bool), typeof(Dialog), new PropertyMetadata(false, IsShownProperty_OnChange)); + typeof(bool), typeof(Dialog), new PropertyMetadata(false, OnIsShownChange)); + + /// + /// Property for . + /// + public static readonly DependencyProperty FooterProperty = DependencyProperty.Register(nameof(Footer), + typeof(object), typeof(Dialog), new PropertyMetadata(null)); /// - /// Property for . + /// Property for . + /// + public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), + typeof(string), typeof(Dialog), new PropertyMetadata(string.Empty)); + + /// + /// Property for . + /// + public static readonly DependencyProperty MessageProperty = DependencyProperty.Register(nameof(Message), + typeof(string), typeof(Dialog), new PropertyMetadata(string.Empty)); + + /// + /// Property for . /// public static readonly DependencyProperty DialogWidthProperty = DependencyProperty.Register(nameof(DialogWidth), typeof(double), typeof(Dialog), new PropertyMetadata(420.0)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty DialogHeightProperty = DependencyProperty.Register(nameof(DialogHeight), typeof(double), typeof(Dialog), new PropertyMetadata(200.0)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonLeftNameProperty = DependencyProperty.Register( nameof(ButtonLeftName), typeof(string), typeof(Dialog), new PropertyMetadata("Action")); /// - /// Routed event for . + /// Routed event for . /// public static readonly RoutedEvent ButtonLeftClickEvent = EventManager.RegisterRoutedEvent( nameof(ButtonLeftClick), RoutingStrategy.Bubble, typeof(Dialog), typeof(Dialog)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonRightNameProperty = DependencyProperty.Register( nameof(ButtonRightName), typeof(string), typeof(Dialog), new PropertyMetadata("Close")); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonLeftAppearanceProperty = DependencyProperty.Register( nameof(ButtonLeftAppearance), - typeof(Common.Appearance), typeof(Dialog), - new PropertyMetadata(Common.Appearance.Primary)); + typeof(ControlAppearance), typeof(Dialog), + new PropertyMetadata(ControlAppearance.Primary)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonLeftVisibilityProperty = DependencyProperty.Register( nameof(ButtonLeftVisibility), @@ -72,22 +120,22 @@ public class Dialog : ContentControl new PropertyMetadata(Visibility.Visible)); /// - /// Routed event for . + /// Routed event for . /// public static readonly RoutedEvent ButtonRightClickEvent = EventManager.RegisterRoutedEvent( nameof(ButtonRightClick), RoutingStrategy.Bubble, typeof(Dialog), typeof(Dialog)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonRightAppearanceProperty = DependencyProperty.Register( nameof(ButtonRightAppearance), - typeof(Common.Appearance), typeof(Dialog), - new PropertyMetadata(Common.Appearance.Secondary)); + typeof(ControlAppearance), typeof(Dialog), + new PropertyMetadata(ControlAppearance.Secondary)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonRightVisibilityProperty = DependencyProperty.Register( nameof(ButtonRightVisibility), @@ -95,131 +143,114 @@ public class Dialog : ContentControl new PropertyMetadata(Visibility.Visible)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TemplateButtonCommandProperty = DependencyProperty.Register(nameof(TemplateButtonCommand), typeof(IRelayCommand), typeof(Dialog), new PropertyMetadata(null)); - /// - /// Event triggered when opens. - /// - public static readonly RoutedEvent OpenedEvent = EventManager.RegisterRoutedEvent(nameof(Opened), - RoutingStrategy.Bubble, typeof(RoutedDialogEvent), typeof(Dialog)); + #endregion Static properties - /// - /// Event triggered when opens. - /// - public static readonly RoutedEvent ClosedEvent = EventManager.RegisterRoutedEvent(nameof(Closed), - RoutingStrategy.Bubble, typeof(RoutedDialogEvent), typeof(Dialog)); + /// + public bool IsShown + { + get => (bool)GetValue(IsShownProperty); + protected set => SetValue(IsShownProperty, value); + } - /// - /// Creates new instance and sets default . - /// - public Dialog() + /// + public object Footer { - SetValue(TemplateButtonCommandProperty, new RelayCommand(o => RelayCommandButton_OnClick(this, o))); + get => GetValue(FooterProperty); + set => SetValue(FooterProperty, value); } - /// - /// Gets or sets information whether the dialog should be displayed. - /// - public bool IsShown + /// + public string Title { - get => (bool) GetValue(IsShownProperty); - set => SetValue(IsShownProperty, value); + get => (string)GetValue(TitleProperty); + set => SetValue(TitleProperty, value); } - /// - /// Gets or sets maximum dialog width. - /// + /// + public string Message + { + get => (string)GetValue(MessageProperty); + set => SetValue(MessageProperty, value); + } + + /// public double DialogWidth { - get => (int) GetValue(DialogWidthProperty); + get => (int)GetValue(DialogWidthProperty); set => SetValue(DialogWidthProperty, value); } - /// - /// Gets or sets dialog height. - /// + /// public double DialogHeight { - get => (int) GetValue(DialogHeightProperty); + get => (int)GetValue(DialogHeightProperty); set => SetValue(DialogHeightProperty, value); } - /// - /// Name of the button on the left side of footer. - /// + /// public string ButtonLeftName { - get => (string) GetValue(ButtonLeftNameProperty); + get => (string)GetValue(ButtonLeftNameProperty); set => SetValue(ButtonLeftNameProperty, value); } /// - /// Gets or sets the of the button on the left, if available. + /// Gets or sets the of the button on the left, if available. /// - public Common.Appearance ButtonLeftAppearance + public ControlAppearance ButtonLeftAppearance { - get => (Common.Appearance) GetValue(ButtonLeftAppearanceProperty); + get => (ControlAppearance)GetValue(ButtonLeftAppearanceProperty); set => SetValue(ButtonLeftAppearanceProperty, value); } /// - /// Gets or sets the visibility of the button on the left. + /// Gets or sets the visibility of the button on the left. /// public Visibility ButtonLeftVisibility { - get => (Visibility) GetValue(ButtonLeftVisibilityProperty); + get => (Visibility)GetValue(ButtonLeftVisibilityProperty); set => SetValue(ButtonLeftVisibilityProperty, value); } - /// - /// Name of the button on the right side of footer. - /// + /// + public event RoutedEventHandler ButtonLeftClick + { + add => AddHandler(ButtonLeftClickEvent, value); + remove => RemoveHandler(ButtonLeftClickEvent, value); + } + + /// public string ButtonRightName { - get => (string) GetValue(ButtonRightNameProperty); + get => (string)GetValue(ButtonRightNameProperty); set => SetValue(ButtonRightNameProperty, value); } /// - /// Gets or sets the of the button on the right, if available. + /// Gets or sets the of the button on the right, if available. /// - public Common.Appearance ButtonRightAppearance + public ControlAppearance ButtonRightAppearance { - get => (Common.Appearance) GetValue(ButtonRightAppearanceProperty); + get => (ControlAppearance)GetValue(ButtonRightAppearanceProperty); set => SetValue(ButtonRightAppearanceProperty, value); } /// - /// Gets or sets the visibility of the button on the right. + /// Gets or sets the visibility of the button on the right. /// public Visibility ButtonRightVisibility { - get => (Visibility) GetValue(ButtonRightVisibilityProperty); + get => (Visibility)GetValue(ButtonRightVisibilityProperty); set => SetValue(ButtonRightVisibilityProperty, value); } - /// - /// Command triggered after clicking the button on the Footer. - /// - public IRelayCommand TemplateButtonCommand => - (IRelayCommand) GetValue(TemplateButtonCommandProperty); - - /// - /// Action triggered after clicking left button. - /// - public event RoutedEventHandler ButtonLeftClick - { - add => AddHandler(ButtonLeftClickEvent, value); - remove => RemoveHandler(ButtonLeftClickEvent, value); - } - - /// - /// Action triggered after clicking right button. - /// + /// public event RoutedEventHandler ButtonRightClick { add => AddHandler(ButtonRightClickEvent, value); @@ -227,8 +258,18 @@ public event RoutedEventHandler ButtonRightClick } /// - /// Add / Remove handler. + /// Command triggered after clicking the button in the template. + /// + public IRelayCommand TemplateButtonCommand => + (IRelayCommand)GetValue(TemplateButtonCommandProperty); + + /// + /// Event triggered when opens. /// + public static readonly RoutedEvent OpenedEvent = EventManager.RegisterRoutedEvent(nameof(Opened), + RoutingStrategy.Bubble, typeof(RoutedDialogEvent), typeof(Dialog)); + + /// public event RoutedDialogEvent Opened { add => AddHandler(OpenedEvent, value); @@ -236,8 +277,12 @@ public event RoutedDialogEvent Opened } /// - /// Add / Remove handler. + /// Event triggered when opens. /// + public static readonly RoutedEvent ClosedEvent = EventManager.RegisterRoutedEvent(nameof(Closed), + RoutingStrategy.Bubble, typeof(RoutedDialogEvent), typeof(Dialog)); + + /// public event RoutedDialogEvent Closed { add => AddHandler(ClosedEvent, value); @@ -245,25 +290,123 @@ public event RoutedDialogEvent Closed } /// - /// Reveals the . + /// Creates new instance and sets default . /// - public void Show() + public Dialog() { - if (!IsShown) - IsShown = true; + SetValue(TemplateButtonCommandProperty, new RelayCommand(o => OnTemplateButtonClick(this, o))); } - /// - /// Hides the . - /// - public void Hide() + /// + public Task ShowAndWaitAsync() + { + _automaticHide = false; + + Show(); + + _tcs = new TaskCompletionSource(); + + return _tcs.Task; + } + + /// + public Task ShowAndWaitAsync(bool hideOnClick) + { + _automaticHide = hideOnClick; + + Show(); + + _tcs = new TaskCompletionSource(); + + return _tcs.Task; + } + + /// + public Task ShowAndWaitAsync(string title, string message) + { + _automaticHide = false; + + if (IsShown) + Hide(); + + Show(title, message); + + _tcs = new TaskCompletionSource(); + + return _tcs.Task; + } + + /// + public Task ShowAndWaitAsync(string title, string message, bool hideOnClick) + { + _automaticHide = hideOnClick; + + if (IsShown) + Hide(); + + Show(title, message); + + _tcs = new TaskCompletionSource(); + + return _tcs.Task; + } + + /// + public bool Show() + { + if (IsShown) + return false; + + _automaticHide = false; + + IsShown = true; + + FocusFirstButton(); + + return true; + } + + /// + public bool Show(string title, string message) { if (IsShown) - IsShown = false; + Hide(); + + _automaticHide = false; + + Title = title; + Message = message; + IsShown = true; + + FocusFirstButton(); + + return true; + } + + /// + public bool Hide() + { + if (!IsShown) + return false; + + IsShown = false; + + return true; + } + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + if (GetTemplateChild(ElementFooterButtonLeft) is System.Windows.Controls.Primitives.ButtonBase leftButton) + _leftFooterButton = leftButton; + + if (GetTemplateChild(ElementFooterButtonLeft) is System.Windows.Controls.Primitives.ButtonBase rightButton) + _rightFooterButton = rightButton; } /// - /// This virtual method is called when is opening and it raises the . + /// This virtual method is called when is opening and it raises the . /// protected virtual void OnOpened() { @@ -272,7 +415,7 @@ protected virtual void OnOpened() } /// - /// This virtual method is called when is closing and it raises the . + /// This virtual method is called when is closing and it raises the . /// protected virtual void OnClosed() { @@ -280,33 +423,38 @@ protected virtual void OnClosed() RaiseEvent(newEvent); } - private void RelayCommandButton_OnClick(object sender, object parameter) + /// + /// Triggered by clicking a button in the control template. + /// + /// Sender of the click event. + /// Additional parameters. + protected virtual void OnTemplateButtonClick(object sender, object? parameter) { - if (parameter == null) + if (parameter is not string parameterString) return; - var param = parameter as string ?? string.Empty; - -#if DEBUG - Debug.WriteLine($"INFO: {typeof(Dialog)} button clicked with param: {param}", - "RevitLookup.UI.Dialog"); -#endif - - switch (param) + switch (parameterString) { case "left": RaiseEvent(new RoutedEventArgs(ButtonLeftClickEvent, this)); + _tcs?.TrySetResult(IDialogControl.ButtonPressed.Left); + break; case "right": RaiseEvent(new RoutedEventArgs(ButtonRightClickEvent, this)); + _tcs?.TrySetResult(IDialogControl.ButtonPressed.Right); + break; } + + if (_automaticHide) + Hide(); } - private static void IsShownProperty_OnChange(DependencyObject d, DependencyPropertyChangedEventArgs e) + private static void OnIsShownChange(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not Dialog control) return; @@ -316,4 +464,24 @@ private static void IsShownProperty_OnChange(DependencyObject d, DependencyPrope else control.OnClosed(); } -} \ No newline at end of file + + private void FocusFirstButton() + { + if (Footer != null) + return; + + if (ButtonLeftVisibility == Visibility.Visible) + { + if (_leftFooterButton != null) + _leftFooterButton.Focus(); + + return; + } + + if (ButtonRightVisibility != Visibility.Visible) + return; + + if (_rightFooterButton != null) + _rightFooterButton.Focus(); + } +} diff --git a/RevitLookup.UI/Controls/DropDownButton.cs b/RevitLookup.UI/Controls/DropDownButton.cs new file mode 100644 index 000000000..916cd082c --- /dev/null +++ b/RevitLookup.UI/Controls/DropDownButton.cs @@ -0,0 +1,13 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Controls; + +/// +/// A control that drop downs a flyout of choices from which one can be chosen. +/// +public class DropDownButton : System.Windows.Controls.Button +{ +} diff --git a/RevitLookup.UI/Controls/DynamicScrollBar.bmp b/RevitLookup.UI/Controls/DynamicScrollBar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4dec72f55637e23ce9784c2d3729da3ceae7a39e GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTMB`u6SH{rmTUBr$q{$~JA< zJ|h|6mH>akjlsReF6 zrWDX6n1TbY9_Rox00|$UAX?Bt+)qa6#m2^>MGYi&(Cme9fl`=JkIPcHI7AD?79vw4 Ja?)jB001TWE&2ce literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/DynamicScrollBar.cs b/RevitLookup.UI/Controls/DynamicScrollBar.cs index c4c1c34e2..ecb11617c 100644 --- a/RevitLookup.UI/Controls/DynamicScrollBar.cs +++ b/RevitLookup.UI/Controls/DynamicScrollBar.cs @@ -3,75 +3,80 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.ComponentModel; +using System.Drawing; +using System.Threading.Tasks; using System.Windows; -using System.Windows.Controls.Primitives; using System.Windows.Input; using RevitLookup.UI.Common; namespace RevitLookup.UI.Controls; /// -/// Custom with events depending on actions taken by the user. +/// Custom with events depending on actions taken by the user. /// -public class DynamicScrollBar : ScrollBar +[ToolboxItem(true)] +[ToolboxBitmap(typeof(DynamicScrollBar), "DynamicScrollBar.bmp")] +public class DynamicScrollBar : System.Windows.Controls.Primitives.ScrollBar { + private bool _isScrolling = false; + + private bool _isInteracted = false; + + private readonly EventIdentifier _interactiveIdentifier = new(); + /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IsScrollingProperty = DependencyProperty.Register(nameof(IsScrolling), typeof(bool), typeof(DynamicScrollBar), new PropertyMetadata(false, IsScrollingProperty_OnChange)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IsInteractedProperty = DependencyProperty.Register( nameof(IsInteracted), typeof(bool), typeof(DynamicScrollBar), new PropertyMetadata(false, IsInteractedProperty_OnChange)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TimeoutProperty = DependencyProperty.Register(nameof(Timeout), typeof(int), typeof(DynamicScrollBar), new PropertyMetadata(1000)); - private readonly EventIdentifier _interactiveIdentifier = new(); - - private bool _isInteracted; - private bool _isScrolling; - /// - /// Gets or sets information whether the user was scrolling for the last few seconds. + /// Gets or sets information whether the user was scrolling for the last few seconds. /// public bool IsScrolling { - get => (bool) GetValue(IsScrollingProperty); + get => (bool)GetValue(IsScrollingProperty); set => SetValue(IsScrollingProperty, value); } /// - /// Informs whether the user has taken an action related to scrolling. + /// Informs whether the user has taken an action related to scrolling. /// public bool IsInteracted { - get => (bool) GetValue(IsInteractedProperty); + get => (bool)GetValue(IsInteractedProperty); set { - if ((bool) GetValue(IsInteractedProperty) != value) + if ((bool)GetValue(IsInteractedProperty) != value) SetValue(IsInteractedProperty, value); } } /// - /// Gets or sets additional delay after which the should be hidden. + /// Gets or sets additional delay after which the should be hidden. /// public int Timeout { - get => (int) GetValue(TimeoutProperty); + get => (int)GetValue(TimeoutProperty); set => SetValue(TimeoutProperty, value); } /// - /// Method reporting the mouse entered this element. + /// Method reporting the mouse entered this element. /// protected override void OnMouseEnter(MouseEventArgs e) { @@ -81,7 +86,7 @@ protected override void OnMouseEnter(MouseEventArgs e) } /// - /// Method reporting the mouse leaved this element. + /// Method reporting the mouse leaved this element. /// protected override void OnMouseLeave(MouseEventArgs e) { @@ -132,4 +137,4 @@ private static void IsInteractedProperty_OnChange(DependencyObject d, Dependency bar.UpdateScroll().GetAwaiter(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/DynamicScrollViewer.bmp b/RevitLookup.UI/Controls/DynamicScrollViewer.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4dec72f55637e23ce9784c2d3729da3ceae7a39e GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTMB`u6SH{rmTUBr$q{$~JA< zJ|h|6mH>akjlsReF6 zrWDX6n1TbY9_Rox00|$UAX?Bt+)qa6#m2^>MGYi&(Cme9fl`=JkIPcHI7AD?79vw4 Ja?)jB001TWE&2ce literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/DynamicScrollViewer.cs b/RevitLookup.UI/Controls/DynamicScrollViewer.cs index 55fb6d30d..f3026db6a 100644 --- a/RevitLookup.UI/Controls/DynamicScrollViewer.cs +++ b/RevitLookup.UI/Controls/DynamicScrollViewer.cs @@ -4,6 +4,8 @@ // All Rights Reserved. using System.ComponentModel; +using System.Drawing; +using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using RevitLookup.UI.Common; @@ -11,13 +13,28 @@ namespace RevitLookup.UI.Controls; /// -/// Custom with events depending on actions taken by the user. +/// Custom with events depending on actions taken by the user. /// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(DynamicScrollViewer), "DynamicScrollViewer.bmp")] [DefaultEvent("ScrollChangedEvent")] public class DynamicScrollViewer : ScrollViewer { + private readonly EventIdentifier _verticalIdentifier = new(); + + private readonly EventIdentifier _horizontalIdentifier = new(); + + // Due to the large number of triggered events, we limit the complex logic of DependencyProperty + private bool _scrollingVertically = false; + + private bool _scrollingHorizontally = false; + + private int _timeout = 1200; + + private double _minimalChange = 40d; + /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IsScrollingVerticallyProperty = DependencyProperty.Register( nameof(IsScrollingVertically), @@ -25,70 +42,58 @@ public class DynamicScrollViewer : ScrollViewer new PropertyMetadata(false, IsScrollingVerticallyProperty_OnChanged)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IsScrollingHorizontallyProperty = DependencyProperty.Register( nameof(IsScrollingHorizontally), typeof(bool), typeof(DynamicScrollViewer), new PropertyMetadata(false, IsScrollingHorizontally_OnChanged)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty MinimalChangeProperty = DependencyProperty.Register( nameof(MinimalChange), typeof(double), typeof(DynamicScrollViewer), new PropertyMetadata(40d, MinimalChangeProperty_OnChanged)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TimeoutProperty = DependencyProperty.Register(nameof(Timeout), typeof(int), typeof(DynamicScrollViewer), new PropertyMetadata(1200, TimeoutProperty_OnChanged)); - private readonly EventIdentifier _horizontalIdentifier = new(); - private readonly EventIdentifier _verticalIdentifier = new(); - - private double _minimalChange = 40d; - - private bool _scrollingHorizontally; - - // Due to the large number of triggered events, we limit the complex logic of DependencyProperty - private bool _scrollingVertically; - - private int _timeout = 1200; - /// - /// Gets or sets information whether the user was scrolling vertically for the last few seconds. + /// Gets or sets information whether the user was scrolling vertically for the last few seconds. /// public bool IsScrollingVertically { - get => (bool) GetValue(IsScrollingVerticallyProperty); + get => (bool)GetValue(IsScrollingVerticallyProperty); set => SetValue(IsScrollingVerticallyProperty, value); } /// - /// Gets or sets information whether the user was scrolling horizontally for the last few seconds. + /// Gets or sets information whether the user was scrolling horizontally for the last few seconds. /// public bool IsScrollingHorizontally { - get => (bool) GetValue(IsScrollingHorizontallyProperty); + get => (bool)GetValue(IsScrollingHorizontallyProperty); set => SetValue(IsScrollingHorizontallyProperty, value); } /// - /// Gets or sets the value required for the scroll to show automatically. + /// Gets or sets the value required for the scroll to show automatically. /// public double MinimalChange { - get => (double) GetValue(MinimalChangeProperty); + get => (double)GetValue(MinimalChangeProperty); set => SetValue(MinimalChangeProperty, value); } /// - /// Gets or sets time after which the scroll is to be hidden. + /// Gets or sets time after which the scroll is to be hidden. /// public int Timeout { - get => (int) GetValue(TimeoutProperty); + get => (int)GetValue(TimeoutProperty); set => SetValue(TimeoutProperty, value); } @@ -103,22 +108,17 @@ public int Timeout //} /// - /// OnScrollChanged is an override called whenever scrolling state changes on this . + /// OnScrollChanged is an override called whenever scrolling state changes on this . /// /// - /// OnScrollChanged fires the ScrollChangedEvent. Overriders of this method should call - /// base.OnScrollChanged(args) if they want the event to be fired. + /// OnScrollChanged fires the ScrollChangedEvent. Overriders of this method should call + /// base.OnScrollChanged(args) if they want the event to be fired. /// /// ScrollChangedEventArgs containing information about the change in scrolling state. protected override void OnScrollChanged(ScrollChangedEventArgs e) { base.OnScrollChanged(e); - //#if DEBUG - // System.Diagnostics.Debug.WriteLine($"DEBUG | {typeof(DynamicScrollBar)}.{nameof(e.VerticalChange)} - {e.VerticalChange}", "RevitLookup.UI"); - // System.Diagnostics.Debug.WriteLine($"DEBUG | {typeof(DynamicScrollBar)}.{nameof(e.HorizontalChange)} - {e.HorizontalChange}", "RevitLookup.UI"); - //#endif - if (e.HorizontalChange > _minimalChange || e.HorizontalChange < -_minimalChange) UpdateHorizontalScrollingState(); @@ -197,4 +197,4 @@ private static void TimeoutProperty_OnChanged(DependencyObject d, DependencyProp scroll._timeout = scroll.Timeout; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/Flyout.cs b/RevitLookup.UI/Controls/Flyout.cs index c489014e1..1559e37fb 100644 --- a/RevitLookup.UI/Controls/Flyout.cs +++ b/RevitLookup.UI/Controls/Flyout.cs @@ -3,14 +3,72 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Windows.Controls; +using System; +using System.Windows; namespace RevitLookup.UI.Controls; /// -/// Control that displays a flying element that can, for example, contain tips. +/// Represents a control that creates a pop-up window that displays information for an element in the interface. /// -public class Flyout : ContentControl +[TemplatePart(Name = "PART_Popup", Type = typeof(System.Windows.Controls.Primitives.Popup))] +public class Flyout : System.Windows.Controls.ContentControl { - // TODO: Well... to do -} \ No newline at end of file + private const string ElementPopup = "PART_Popup"; + + private System.Windows.Controls.Primitives.Popup _popup = null; + + /// + /// Property for . + /// + public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register(nameof(IsOpen), + typeof(bool), typeof(Flyout), new PropertyMetadata(false)); + + /// + /// Invoked whenever application code or an internal process, + /// such as a rebuilding layout pass, calls the ApplyTemplate method. + /// + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _popup = GetTemplateChild(ElementPopup) as System.Windows.Controls.Primitives.Popup; + + if (_popup != null) + { + _popup.Opened -= OnPopupOpened; + _popup.Opened += OnPopupOpened; + + _popup.Closed -= OnPopupClosed; + _popup.Closed += OnPopupClosed; + } + } + + public bool IsOpen + { + get => (bool)GetValue(IsOpenProperty); + protected set => SetValue(IsOpenProperty, value); + } + + public void Show() + { + if (!IsOpen) + IsOpen = true; + } + + public void Hide() + { + if (IsOpen) + IsOpen = false; + } + + protected virtual void OnPopupOpened(object sender, EventArgs e) + { + + } + + protected virtual void OnPopupClosed(object sender, EventArgs e) + { + Hide(); + } +} diff --git a/RevitLookup.UI/Controls/FontIcon.bmp b/RevitLookup.UI/Controls/FontIcon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4fe46c317b076b931c584ed319707350f5ecd9e3 GIT binary patch literal 824 zcma))ziI+O5QkS&+K5#i!6yjT_I820>Y4+EdxN`5TW#(MVxv!?No)_2JVR8_Ks-zu zTm9Gx!)Ow4*j;`z^X=~JpLVBpvemUPm)Aj05D*T^Jyh%nm)}Rg+bto1^`oD*L-_<9rXM6-VnH&`jaO+ z8V={P84aN@!tz?rdbN(CNHE05W-Hp(W6!&MUj{)ymWIF;-k#UqC)w#_0*Q?u#=5xP lr#|kL? -/// Represents a text element containing an icon glyph with selectable font family. +/// Represents a text element containing an icon glyph with selectable font family. /// -public class FontIcon : Label +[ToolboxItem(true)] +[ToolboxBitmap(typeof(FontIcon), "FontIcon.bmp")] +public class FontIcon : System.Windows.Controls.Control { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty GlyphProperty = DependencyProperty.Register( nameof(Glyph), @@ -24,11 +27,11 @@ public class FontIcon : Label ); /// - /// Gets or sets displayed . + /// Gets or sets displayed . /// public char Glyph { - get => (char) GetValue(GlyphProperty); + get => (char)GetValue(GlyphProperty); set => SetValue(GlyphProperty, value); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/Hyperlink.cs b/RevitLookup.UI/Controls/Hyperlink.cs index 6949e74c7..810ed1b39 100644 --- a/RevitLookup.UI/Controls/Hyperlink.cs +++ b/RevitLookup.UI/Controls/Hyperlink.cs @@ -3,33 +3,25 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics; +using System; using System.Windows; using static System.String; namespace RevitLookup.UI.Controls; /// -/// Button that opens a URL in a web browser. +/// Button that opens a URL in a web browser. /// public class Hyperlink : Button { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty NavigateUriProperty = DependencyProperty.Register("NavigateUri", typeof(string), typeof(Hyperlink), new PropertyMetadata(Empty)); /// - /// Action triggered when the button is clicked. - /// - public Hyperlink() - { - Click += RequestNavigate; - } - - /// - /// The URL (or application shortcut) to open. + /// The URL (or application shortcut) to open. /// public string NavigateUri { @@ -37,15 +29,20 @@ public string NavigateUri set => SetValue(NavigateUriProperty, value); } + /// + /// Action triggered when the button is clicked. + /// + public Hyperlink() => Click += RequestNavigate; + private void RequestNavigate(object sender, RoutedEventArgs eventArgs) { if (IsNullOrEmpty(NavigateUri)) return; - ProcessStartInfo sInfo = new(new Uri(NavigateUri).AbsoluteUri) + System.Diagnostics.ProcessStartInfo sInfo = new(new Uri(NavigateUri).AbsoluteUri) { UseShellExecute = true }; - Process.Start(sInfo); + System.Diagnostics.Process.Start(sInfo); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/Interfaces/IAppearanceControl.cs b/RevitLookup.UI/Controls/Interfaces/IAppearanceControl.cs index bd45fb3f4..5b115378b 100644 --- a/RevitLookup.UI/Controls/Interfaces/IAppearanceControl.cs +++ b/RevitLookup.UI/Controls/Interfaces/IAppearanceControl.cs @@ -3,15 +3,17 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using RevitLookup.UI.Common; + namespace RevitLookup.UI.Controls.Interfaces; /// -/// UI with attributes. +/// UI with attributes. /// public interface IAppearanceControl { /// - /// Gets or sets the of the control, if available. + /// Gets or sets the of the control, if available. /// - public Common.Appearance Appearance { get; set; } -} \ No newline at end of file + public ControlAppearance Appearance { get; set; } +} diff --git a/RevitLookup.UI/Controls/Interfaces/IDialogControl.cs b/RevitLookup.UI/Controls/Interfaces/IDialogControl.cs new file mode 100644 index 000000000..e55aa659e --- /dev/null +++ b/RevitLookup.UI/Controls/Interfaces/IDialogControl.cs @@ -0,0 +1,152 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Threading.Tasks; +using System.Windows; +using RevitLookup.UI.Common; + +namespace RevitLookup.UI.Controls.Interfaces; + +/// +/// Represents a Dialog control. +/// +public interface IDialogControl +{ + /// + /// Which of the button is pressed. + /// + public enum ButtonPressed + { + /// + /// None. + /// + None, + + /// + /// Left button. + /// + Left, + + /// + /// Right button. + /// + Right + } + + /// + /// Gets the information whether the is visible. + /// + bool IsShown { get; } + + /// + /// Custom control or text displayed at the bottom of the instead of the buttons. + /// + object Footer { get; set; } + + /// + /// Gets or sets maximum dialog width. + /// + double DialogWidth { get; set; } + + /// + /// Gets or sets maximum dialog height. + /// + double DialogHeight { get; set; } + + /// + /// Gets or sets the title displayed at the top of the . + /// + string Title { get; set; } + + /// + /// Gets or sets the message displayed inside the . + /// + string Message { get; set; } + + /// + /// or displayed below the and . + /// + object Content { get; set; } + + /// + /// Gets or sets the name of the left button displayed in the footer. + /// + string ButtonLeftName { get; set; } + + /// + /// Gets or sets the name of the right button displayed in the footer. + /// + string ButtonRightName { get; set; } + + /// + /// Occurs when the right button in the dialog footer is clicked. + /// + event RoutedEventHandler ButtonRightClick; + + /// + /// Occurs when the left button in the dialog footer is clicked. + /// + event RoutedEventHandler ButtonLeftClick; + + /// + /// Occurs when the dialog is about to open. + /// + public event RoutedDialogEvent Opened; + + /// + /// Occurs when the dialog is about to close. + /// + public event RoutedDialogEvent Closed; + + /// + /// Reveals the . + /// + /// if the operation was successful. + bool Show(); + + /// + /// Reveals the . + /// + /// at the top of the dialog. + /// above the of the dialog. + /// if the operation was successful. + bool Show(string title, string message); + + /// + /// Reveals the and waits for the user to click on of the footer buttons. + /// + /// Information about which button was pressed. + Task ShowAndWaitAsync(); + + /// + /// Reveals the and waits for the user to click on of the footer buttons. + /// + /// Whether the dialogue should be hidden after pressing any button in the footer. + /// Information about which button was pressed. + Task ShowAndWaitAsync(bool hideOnClick); + + /// + /// Reveals the and waits for the user to click on of the footer buttons. + /// + /// at the top of the dialog. + /// above the of the dialog. + /// Information about which button was pressed. + Task ShowAndWaitAsync(string title, string message); + + /// + /// Reveals the and waits for the user to click on of the footer buttons. + /// + /// at the top of the dialog. + /// above the of the dialog. + /// Whether the dialogue should be hidden after pressing any button in the footer. + /// Information about which button was pressed. + Task ShowAndWaitAsync(string title, string message, bool hideOnClick); + + /// + /// Hides the . + /// if the operation was successful. + /// + bool Hide(); +} diff --git a/RevitLookup.UI/Controls/Interfaces/IDpiAwareControl.cs b/RevitLookup.UI/Controls/Interfaces/IDpiAwareControl.cs new file mode 100644 index 000000000..cab999b70 --- /dev/null +++ b/RevitLookup.UI/Controls/Interfaces/IDpiAwareControl.cs @@ -0,0 +1,14 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Controls.Interfaces; + +/// +/// The control that should react to changes in the screen DPI. +/// +public interface IDpiAwareControl +{ + Dpi.Dpi CurrentWindowDpi { get; } +} diff --git a/RevitLookup.UI/Controls/Interfaces/IIconControl.cs b/RevitLookup.UI/Controls/Interfaces/IIconControl.cs index e6bbc9fea..016a6b4c8 100644 --- a/RevitLookup.UI/Controls/Interfaces/IIconControl.cs +++ b/RevitLookup.UI/Controls/Interfaces/IIconControl.cs @@ -3,22 +3,27 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using RevitLookup.UI.Common; +using System.Windows.Media; namespace RevitLookup.UI.Controls.Interfaces; /// -/// UI with attributes. +/// UI with attributes. /// public interface IIconControl { /// - /// Gets or sets displayed . + /// Gets or sets displayed . /// - SymbolRegular Icon { get; set; } + Common.SymbolRegular Icon { get; set; } /// - /// Defines whether or not we should use the . + /// Defines whether or not we should use the . /// bool IconFilled { get; set; } -} \ No newline at end of file + + /// + /// Foreground of the . + /// + Brush IconForeground { get; set; } +} diff --git a/RevitLookup.UI/Controls/Interfaces/INavigable.cs b/RevitLookup.UI/Controls/Interfaces/INavigable.cs deleted file mode 100644 index db109657a..000000000 --- a/RevitLookup.UI/Controls/Interfaces/INavigable.cs +++ /dev/null @@ -1,19 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -namespace RevitLookup.UI.Controls.Interfaces; - -/// -/// Notifies page about being navigated. -/// -public interface INavigable -{ - /// - /// Method triggered when the page is navigated. - /// - /// Navigation service, from which the navigation was made. - /// Current page. - void OnNavigationRequest(INavigation sender, object current); -} \ No newline at end of file diff --git a/RevitLookup.UI/Controls/Interfaces/INavigation.cs b/RevitLookup.UI/Controls/Interfaces/INavigation.cs index 173fc2273..54a7e7cff 100644 --- a/RevitLookup.UI/Controls/Interfaces/INavigation.cs +++ b/RevitLookup.UI/Controls/Interfaces/INavigation.cs @@ -3,39 +3,216 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Windows.Controls; +using RevitLookup.UI.Animations; using RevitLookup.UI.Common; +using RevitLookup.UI.Mvvm.Contracts; namespace RevitLookup.UI.Controls.Interfaces; /// -/// Represents navigation class. +/// Represents navigation class. /// public interface INavigation { /// - /// Currently used item like . + /// Service providing views. /// - public INavigationItem Current { get; } + IPageService PageService { get; set; } /// - /// Gets or sets the in which the will be loaded after navigation. + /// Navigation item ID of the current page. + /// If set to a value less than , no will be loaded during initialization. /// - public ContentPresenter Frame { get; set; } + int SelectedPageIndex { get; set; } /// - /// Gets or sets the list of that will be displayed on the menu. + /// Navigation item ID of the previous page. /// - public ObservableCollection Items { get; set; } + int PreviousPageIndex { get; } /// - /// Gets or sets the list of which will be displayed at the bottom of the navigation and will not be scrolled. + /// Creates an instance of all pages defined with after the is loaded. /// - public ObservableCollection Footer { get; set; } + bool Precache { get; set; } /// - /// Gets or sets the that will be triggered during navigation. + /// Indicates the possibility of navigation back /// - public event RoutedNavigationEvent Navigated; -} \ No newline at end of file + bool CanGoBack { get; } + + /// + /// Currently used item like . + /// + INavigationItem Current { get; } + + /// + /// Gets or sets the in which the will be loaded after navigation. + /// + [Bindable(true)] + Frame Frame { get; set; } + + /// + /// Gets or sets the list of that will be displayed on the navigation. + /// + [Bindable(true)] + ObservableCollection Items { get; set; } + + /// + /// Gets or sets the list of which will be displayed at the bottom of the navigation and will not be scrolled. + /// + [Bindable(true)] + ObservableCollection Footer { get; set; } + + /// + /// Specifies dimension of children stacking. + /// + Orientation Orientation { get; set; } + + /// + /// Gets or sets the that will be triggered during navigation. + /// + [Category("Behavior")] + event RoutedNavigationEvent Navigated; + + /// + /// Gets or sets the that will be triggered during forward navigation. + /// + [Category("Behavior")] + event RoutedNavigationEvent NavigatedForward; + + /// + /// Gets or sets the that will be triggered during backward navigation. + /// + [Category("Behavior")] + event RoutedNavigationEvent NavigatedBackward; + + /// + /// Gets or sets a value deciding how long the effect of the transition between the pages should take. + /// + [Bindable(true), Category("Appearance")] + int TransitionDuration { get; set; } + + /// + /// Gets or sets type of transitions during navigation. + /// + [Bindable(true), Category("Appearance")] + TransitionType TransitionType { get; set; } + + /// + /// Clears all navigation items. + /// + void Flush(); + + /// + /// Clears all initialized instances of the pages. + /// + void ClearCache(); + + /// + /// Navigates to the previous page using the . + /// + /// + bool NavigateBack(); + + /// + /// Navigates to the page using the . + /// + /// Type of the page to navigate. + /// if the operation was successful. + bool Navigate(Type pageType); + + /// + /// Navigates to the page using the . + /// + /// Type of the page to navigate. + /// When an DataContext changes, all data-bound properties (on this element or any other element) whose Bindings use this DataContext will change to reflect the new value. + /// if the operation was successful. + bool Navigate(Type pageType, object dataContext); + + /// + /// Loads a instance into based on the tag of . + /// + /// ID of the page to be loaded. + /// if the operation was successful. + bool Navigate(int pageIndex); + + /// + /// Loads a instance into based on the tag of . + /// + /// ID of the page to be loaded. + /// When an DataContext changes, all data-bound properties (on this element or any other element) whose Bindings use this DataContext will change to reflect the new value. + /// if the operation was successful. + bool Navigate(int pageIndex, object dataContext); + + /// + /// Loads a instance into based on the tag of . + /// + /// to be loaded. + /// if the operation was successful. + bool Navigate(string pageTag); + + /// + /// Loads a instance into based on the tag of . + /// + /// to be loaded. + /// When an DataContext changes, all data-bound properties (on this element or any other element) whose Bindings use this DataContext will change to reflect the new value. + bool Navigate(string pageTag, object dataContext); + + /// + /// Navigate to the given object that is outside the current navigation. + /// + /// The element you want to navigate to a that is not in the or pool. + /// if the operation was successful. + bool NavigateExternal(object frameworkElement); + + /// + /// Navigate to the given object that is outside the current navigation. + /// + /// The element you want to navigate to a that is not in the or pool. + /// Context of the data for data binding. + /// if the operation was successful. + bool NavigateExternal(object frameworkElement, object dataContext); + + /// + /// Navigate to the given that is outside the current navigation. + /// + /// to the element you want to navigate to a that is not in the or pool. + /// if the operation was successful. + bool NavigateExternal(Uri absolutePageUri); + + /// + /// Navigate to the given that is outside the current navigation. + /// + /// to the element you want to navigate to a that is not in the or pool. + /// Context of the data for data binding. + /// if the operation was successful. + bool NavigateExternal(Uri absolutePageUri, object dataContext); + + /// + /// Sets of the page. + /// If the page is not in the Cache, and is defined based on , its object will be created and then its DataContext will be defined. + /// + /// Id of the page from or . + /// Context of the data for data binding. + /// if the operation was successful. + bool SetContext(int pageId, object dataContext); + + /// + /// Sets of the page. + /// If the page is not in the Cache, and is defined based on , its object will be created and then its DataContext will be defined. + /// + /// Tag of the page from or . + /// Context of the data for data binding. + /// if the operation was successful. + bool SetContext(string pageTag, object dataContext); + + /// + /// Tires to set the DataContext for the currently displayed page. + /// + /// Data context to be set. + void SetCurrentContext(object dataContext); +} diff --git a/RevitLookup.UI/Controls/Interfaces/INavigationControl.cs b/RevitLookup.UI/Controls/Interfaces/INavigationControl.cs new file mode 100644 index 000000000..b130f82e7 --- /dev/null +++ b/RevitLookup.UI/Controls/Interfaces/INavigationControl.cs @@ -0,0 +1,13 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Controls.Interfaces; + +/// +/// An interface element that can be part of a navigation list. +/// +public interface INavigationControl +{ +} diff --git a/RevitLookup.UI/Controls/Interfaces/INavigationItem.cs b/RevitLookup.UI/Controls/Interfaces/INavigationItem.cs index 2289ee97a..16f1f3b76 100644 --- a/RevitLookup.UI/Controls/Interfaces/INavigationItem.cs +++ b/RevitLookup.UI/Controls/Interfaces/INavigationItem.cs @@ -3,39 +3,56 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; using System.ComponentModel; using System.Windows; +using System.Windows.Controls; namespace RevitLookup.UI.Controls.Interfaces; /// -/// Navigation element. +/// Navigation element. /// public interface INavigationItem { /// - /// Content is the data used to generate the child elements of this control. + /// Represents a text page identifier that can be navigated with . /// - public object Content { get; } + string PageTag { get; set; } /// - /// Gets information whether the page has a tag and type. + /// Content is the data used to generate the child elements of this control. /// - public bool IsValid { get; } + object Content { get; } /// - /// Gets information whether the current element is active. + /// Gets information whether the current element is active. /// - public bool IsActive { get; set; } + bool IsActive { get; set; } /// - /// type. + /// Determines whether an should be cached. /// - public object Page { get; set; } + bool Cache { get; set; } /// - /// Add / Remove ClickEvent handler + /// URI of the application or content being navigated to. + /// + Uri PageSource { get; set; } + + /// + /// A inherited from that defines page of the item. + /// + Type PageType { get; set; } + + /// + /// Absolute path to the XAML template based on and . + /// + Uri AbsolutePageSource { get; } + + /// + /// Add / Remove ClickEvent handler /// [Category("Behavior")] - public event RoutedEventHandler Click; -} \ No newline at end of file + event RoutedEventHandler Click; +} diff --git a/RevitLookup.UI/Controls/Interfaces/INotifyIcon.cs b/RevitLookup.UI/Controls/Interfaces/INotifyIcon.cs deleted file mode 100644 index 24fb7bd95..000000000 --- a/RevitLookup.UI/Controls/Interfaces/INotifyIcon.cs +++ /dev/null @@ -1,82 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -using System.Windows.Controls; -using System.Windows.Interop; -using System.Windows.Media; -using RevitLookup.UI.Common; - -namespace RevitLookup.UI.Controls.Interfaces; - -/// -/// Represents an icon in the tray menu. -/// -public interface INotifyIcon : IDisposable -{ - /// - /// Gets the Shell identifier of the icon. - /// - public int Id { get; } - - /// - /// Gets or sets the ToolTip text displayed when the mouse pointer rests on a notification area icon. - /// - public string TooltipText { get; set; } - - /// - /// Gets or sets the of the tray icon. - /// - public ImageSource Icon { get; set; } - - /// - /// Gets or sets the hWnd that will receive messages for the icon. - /// - public HwndSource HookWindow { get; set; } - - /// - /// Gets or sets the hWnd that the icon belongs to. - /// - public IntPtr ParentHandle { get; set; } - - /// - /// Gets or sets the menu displayed when the icon is right-clicked. - /// - public ContextMenu ContextMenu { get; set; } - - /// - /// Triggered when the user left-clicks on the . - /// - public event RoutedNotifyIconEvent LeftClick; - - /// - /// Triggered when the user double-clicks the with the left mouse button. - /// - public event RoutedNotifyIconEvent LeftDoubleClick; - - /// - /// Triggered when the user right-clicks on the . - /// - public event RoutedNotifyIconEvent RightClick; - - /// - /// Triggered when the user double-clicks the with the right mouse button. - /// - public event RoutedNotifyIconEvent RightDoubleClick; - - /// - /// Triggered when the user middle-clicks on the . - /// - public event RoutedNotifyIconEvent MiddleClick; - - /// - /// Triggered when the user double-clicks the with the middle mouse button. - /// - public event RoutedNotifyIconEvent MiddleDoubleClick; - - /// - /// Shows the menu if it has been added. - /// - public void ShowMenu(); -} \ No newline at end of file diff --git a/RevitLookup.UI/Controls/Interfaces/ISnackbarControl.cs b/RevitLookup.UI/Controls/Interfaces/ISnackbarControl.cs new file mode 100644 index 000000000..70918a0a5 --- /dev/null +++ b/RevitLookup.UI/Controls/Interfaces/ISnackbarControl.cs @@ -0,0 +1,122 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Threading.Tasks; +using RevitLookup.UI.Common; + +namespace RevitLookup.UI.Controls.Interfaces; + +/// +/// Snackbar inform user of a process that an app has performed or will perform. It appears temporarily, towards the bottom of the window. +/// +public interface ISnackbarControl +{ + /// + /// Gets the information whether the is visible. + /// + bool IsShown { get; } + + /// + /// Gets or sets a time for which the should be visible. + /// + int Timeout { get; set; } + + /// + /// Gets or sets the text displayed on the top of the . + /// + string Title { get; set; } + + /// + /// Gets or sets the text displayed on the bottom of the . + /// + string Message { get; set; } + + /// + /// Gets or sets a value indicating whether the close button should be visible. + /// + bool CloseButtonEnabled { get; set; } + + /// + /// Occurs when the snackbar is about to open. + /// + event RoutedSnackbarEvent Opened; + + /// + /// Occurs when the snackbar is about to close. + /// + event RoutedSnackbarEvent Closed; + + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// if invocation of method succeeded, Exception otherwise. + bool Show(); + + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// if invocation of method succeeded, Exception otherwise. + bool Show(string title); + + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// if invocation of method succeeded, Exception otherwise. + bool Show(string title, string message); + + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// Icon on the left. + /// if invocation of method succeeded, Exception otherwise. + bool Show(string title, string message, SymbolRegular icon); + + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// if the operation was successful. + Task ShowAsync(); + + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// if the operation was successful. + Task ShowAsync(string title); + + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// if the operation was successful. + Task ShowAsync(string title, string message); + + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// on the left. + /// if the operation was successful. + Task ShowAsync(string title, string message, SymbolRegular icon); + + /// + /// Hides the snackbar based on the selected animation, if control is visible. + /// + /// if invocation of method succeeded, Exception otherwise. + bool Hide(); + + /// + /// Asynchronously hides the snackbar based on the selected animation, if control is visible. + /// + /// if the operation was successful. + Task HideAsync(); +} diff --git a/RevitLookup.UI/Controls/Interfaces/IThemeElement.cs b/RevitLookup.UI/Controls/Interfaces/IThemeElement.cs index 37393a0e0..0417cce6f 100644 --- a/RevitLookup.UI/Controls/Interfaces/IThemeElement.cs +++ b/RevitLookup.UI/Controls/Interfaces/IThemeElement.cs @@ -5,15 +5,13 @@ namespace RevitLookup.UI.Controls.Interfaces; -internal interface IThemeElement +/// +/// Control changing its properties or appearance depending on the theme. +/// +public interface IThemeControl { /// - /// Indicates whether the application has a Mica effect applied at the moment. + /// The theme is currently set. /// - public int IsMica { get; } - - /// - /// Indicates whether the application is in dark mode. - /// - public int IsDarkTheme { get; } -} \ No newline at end of file + public Appearance.ThemeType Theme { get; } +} diff --git a/RevitLookup.UI/Controls/LoadingScreen.cs b/RevitLookup.UI/Controls/LoadingScreen.cs index e4f701995..0c8304a3f 100644 --- a/RevitLookup.UI/Controls/LoadingScreen.cs +++ b/RevitLookup.UI/Controls/LoadingScreen.cs @@ -1,10 +1,8 @@ -using System.Windows.Controls; - -namespace RevitLookup.UI.Controls; +namespace RevitLookup.UI.Controls; /// -/// Prestyled loading screen with . +/// Prestyled loading screen with . /// -public class LoadingScreen : ContentControl +public class LoadingScreen : System.Windows.Controls.ContentControl { -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/MaximizeButton.cs b/RevitLookup.UI/Controls/MaximizeButton.cs index 9dc5e6168..350a3c287 100644 --- a/RevitLookup.UI/Controls/MaximizeButton.cs +++ b/RevitLookup.UI/Controls/MaximizeButton.cs @@ -2,4 +2,4 @@ internal class MaximizeButton : System.Windows.Controls.Button { -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/MenuItem.cs b/RevitLookup.UI/Controls/MenuItem.cs new file mode 100644 index 000000000..a2423e855 --- /dev/null +++ b/RevitLookup.UI/Controls/MenuItem.cs @@ -0,0 +1,69 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.ComponentModel; +using System.Windows; +using RevitLookup.UI.Common; + +namespace RevitLookup.UI.Controls; + +/// +/// Extended with properties. +/// +public class MenuItem : System.Windows.Controls.MenuItem +{ + /// + /// Property for . + /// + public static readonly DependencyProperty SymbolIconProperty = DependencyProperty.Register(nameof(SymbolIcon), + typeof(Common.SymbolRegular), typeof(MenuItem), + new PropertyMetadata(Common.SymbolRegular.Empty)); + + /// + /// Property for . + /// + public static readonly DependencyProperty SymbolIconFilledProperty = DependencyProperty.Register( + nameof(SymbolIconFilled), + typeof(bool), typeof(MenuItem), new PropertyMetadata(false)); + + ///// + ///// Property for . + ///// + //public static readonly DependencyProperty SymbolIconForegroundProperty = DependencyProperty.Register( + // nameof(SymbolIconForeground), + // typeof(Brush), typeof(RevitLookup.UI.Controls.MenuItem), new FrameworkPropertyMetadata( + // System.Windows.SystemColors.ControlTextBrush, + // FrameworkPropertyMetadataOptions.Inherits)); + + /// + /// Gets or sets displayed . + /// + [Bindable(true), Category("Appearance")] + public Common.SymbolRegular SymbolIcon + { + get => (Common.SymbolRegular)GetValue(SymbolIconProperty); + set => SetValue(SymbolIconProperty, value); + } + + /// + /// Defines whether or not we should use the . + /// + [Bindable(true), Category("Appearance")] + public bool SymbolIconFilled + { + get => (bool)GetValue(SymbolIconFilledProperty); + set => SetValue(SymbolIconFilledProperty, value); + } + + ///// + ///// Foreground of the . + ///// + //[Bindable(true), Category("Appearance")] + //public Brush SymbolIconForeground + //{ + // get => (Brush)GetValue(SymbolIconForegroundProperty); + // set => SetValue(SymbolIconForegroundProperty, value); + //} +} diff --git a/RevitLookup.UI/Controls/MessageBox.bmp b/RevitLookup.UI/Controls/MessageBox.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4fcd099351afa45f63afecce3419b91ed51bcaac GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSy;&^J;5(B(koPQ(GAO1S!u p??2#2KqDzpPmGHwF(2r7pcVK@O3Ww8{XmO|1cNH2K^()t005es59 -/// Customized window for notifications. +/// Customized window for notifications. /// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(MessageBox), "MessageBox.bmp")] public class MessageBox : Window { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty FooterProperty = DependencyProperty.Register(nameof(Footer), typeof(object), typeof(MessageBox), new PropertyMetadata(null)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ShowFooterProperty = DependencyProperty.Register(nameof(ShowFooter), typeof(bool), typeof(MessageBox), new PropertyMetadata(true)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ShowTitleProperty = DependencyProperty.Register(nameof(ShowTitle), typeof(bool), typeof(MessageBox), new PropertyMetadata(true)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty MicaEnabledProperty = DependencyProperty.Register(nameof(MicaEnabled), typeof(bool), typeof(MessageBox), new PropertyMetadata(true)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonLeftNameProperty = DependencyProperty.Register(nameof(ButtonLeftName), typeof(string), typeof(MessageBox), new PropertyMetadata("Action")); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonLeftAppearanceProperty = DependencyProperty.Register(nameof(ButtonLeftAppearance), - typeof(Common.Appearance), typeof(MessageBox), - new PropertyMetadata(Common.Appearance.Primary)); + typeof(ControlAppearance), typeof(MessageBox), + new PropertyMetadata(ControlAppearance.Primary)); /// - /// Routed event for . + /// Routed event for . /// public static readonly RoutedEvent ButtonLeftClickEvent = EventManager.RegisterRoutedEvent( - nameof(ButtonLeftClick), RoutingStrategy.Bubble, typeof(MessageBox), typeof(MessageBox)); + nameof(ButtonLeftClick), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MessageBox)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonRightNameProperty = DependencyProperty.Register(nameof(ButtonRightName), typeof(string), typeof(MessageBox), new PropertyMetadata("Close")); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ButtonRightAppearanceProperty = DependencyProperty.Register(nameof(ButtonRightAppearance), - typeof(Common.Appearance), typeof(MessageBox), - new PropertyMetadata(Common.Appearance.Secondary)); + typeof(ControlAppearance), typeof(MessageBox), + new PropertyMetadata(ControlAppearance.Secondary)); /// - /// Routed event for . + /// Routed event for . /// public static readonly RoutedEvent ButtonRightClickEvent = EventManager.RegisterRoutedEvent( - nameof(ButtonRightClick), RoutingStrategy.Bubble, typeof(MessageBox), typeof(MessageBox)); + nameof(ButtonRightClick), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MessageBox)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TemplateButtonCommandProperty = DependencyProperty.Register(nameof(TemplateButtonCommand), typeof(IRelayCommand), typeof(MessageBox), new PropertyMetadata(null)); /// - /// Creates new instance and sets default event. - /// - public MessageBox() - { - Owner = Application.Current; - - Topmost = true; - - Height = 200; - Width = 400; - - WindowStartupLocation = WindowStartupLocation.CenterOwner; - - SetValue(TemplateButtonCommandProperty, new RelayCommand(o => Button_OnClick(this, o))); - } - - /// - /// Gets or sets a content of the bottom element. + /// Gets or sets a content of the bottom element. /// public object Footer { @@ -111,108 +99,123 @@ public object Footer } /// - /// Gets or sets a value that determines whether to show the . + /// Gets or sets a value that determines whether to show the . /// public bool ShowFooter { - get => (bool) GetValue(ShowFooterProperty); + get => (bool)GetValue(ShowFooterProperty); set => SetValue(ShowFooterProperty, value); } /// - /// Gets or sets a value that determines whether to show the in . + /// Gets or sets a value that determines whether to show the in . /// public bool ShowTitle { - get => (bool) GetValue(ShowTitleProperty); + get => (bool)GetValue(ShowTitleProperty); set => SetValue(ShowTitleProperty, value); } /// - /// Gets or sets a value that determines whether should contain a effect. + /// Gets or sets a value that determines whether should contain a effect. /// public bool MicaEnabled { - get => (bool) GetValue(MicaEnabledProperty); + get => (bool)GetValue(MicaEnabledProperty); set => SetValue(MicaEnabledProperty, value); } /// - /// Name of the button on the left side of footer. + /// Name of the button on the left side of footer. /// public string ButtonLeftName { - get => (string) GetValue(ButtonLeftNameProperty); + get => (string)GetValue(ButtonLeftNameProperty); set => SetValue(ButtonLeftNameProperty, value); } /// - /// Gets or sets the of the button on the left, if available. + /// Gets or sets the of the button on the left, if available. /// - public Common.Appearance ButtonLeftAppearance + public ControlAppearance ButtonLeftAppearance { - get => (Common.Appearance) GetValue(ButtonLeftAppearanceProperty); + get => (ControlAppearance)GetValue(ButtonLeftAppearanceProperty); set => SetValue(ButtonLeftAppearanceProperty, value); } /// - /// Name of the button on the right side of footer. + /// Action triggered after clicking left button. + /// + public event RoutedEventHandler ButtonLeftClick + { + add => AddHandler(ButtonLeftClickEvent, value); + remove => RemoveHandler(ButtonLeftClickEvent, value); + } + + /// + /// Name of the button on the right side of footer. /// public string ButtonRightName { - get => (string) GetValue(ButtonRightNameProperty); + get => (string)GetValue(ButtonRightNameProperty); set => SetValue(ButtonRightNameProperty, value); } /// - /// Gets or sets the of the button on the right, if available. + /// Gets or sets the of the button on the right, if available. /// - public Common.Appearance ButtonRightAppearance + public ControlAppearance ButtonRightAppearance { - get => (Common.Appearance) GetValue(ButtonRightAppearanceProperty); + get => (ControlAppearance)GetValue(ButtonRightAppearanceProperty); set => SetValue(ButtonRightAppearanceProperty, value); } /// - /// Command triggered after clicking the button on the Footer. + /// Action triggered after clicking right button. /// - public IRelayCommand TemplateButtonCommand => (IRelayCommand) GetValue(TemplateButtonCommandProperty); + public event RoutedEventHandler ButtonRightClick + { + add => AddHandler(ButtonRightClickEvent, value); + remove => RemoveHandler(ButtonRightClickEvent, value); + } /// - /// Action triggered after clicking left button. + /// Command triggered after clicking the button on the Footer. /// - public event RoutedEventHandler ButtonLeftClick - { - add => AddHandler(ButtonLeftClickEvent, value); - remove => RemoveHandler(ButtonLeftClickEvent, value); - } + public IRelayCommand TemplateButtonCommand => (IRelayCommand)GetValue(TemplateButtonCommandProperty); /// - /// Action triggered after clicking right button. + /// Creates new instance and sets default event. /// - public event RoutedEventHandler ButtonRightClick + public MessageBox() { - add => AddHandler(ButtonRightClickEvent, value); - remove => RemoveHandler(ButtonRightClickEvent, value); + Owner = Application.Current; + + Topmost = true; + + Height = 200; + Width = 400; + + WindowStartupLocation = WindowStartupLocation.CenterOwner; + + SetValue(TemplateButtonCommandProperty, new RelayCommand(o => Button_OnClick(this, o))); } - /// Shows a - /// - /// . + /// Shows a . public new void Show() { - Appearance.Background.Apply(this, BackgroundType.Mica); + UnsafeNativeMethods.RemoveWindowTitlebar(this); + + Appearance.Background.Apply(this, Appearance.BackgroundType.Mica); base.Show(); } /// - /// Sets and content of , then calls . + /// Sets and content of , then calls . /// - /// - /// - /// - /// Content of + /// + /// Content of public void Show(string title, object content) { Title = title; @@ -238,14 +241,13 @@ public void Show(string title, object content) private void Button_OnClick(object sender, object parameter) { - if (parameter == null) return; + if (parameter == null) + { + return; + } var param = parameter as string ?? string.Empty; -#if DEBUG - Debug.WriteLine($"INFO | {typeof(MessageBox)} button clicked with param: {param}", "RevitLookup.UI.MessageBox"); -#endif - switch (param) { case "left": @@ -259,4 +261,4 @@ private void Button_OnClick(object sender, object parameter) break; } } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/Navigation.cs b/RevitLookup.UI/Controls/Navigation.cs deleted file mode 100644 index cee6ab7c7..000000000 --- a/RevitLookup.UI/Controls/Navigation.cs +++ /dev/null @@ -1,208 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.Windows; -using System.Windows.Controls; -using RevitLookup.UI.Common; -using RevitLookup.UI.Controls.Interfaces; - -namespace RevitLookup.UI.Controls; - -// TODO: It's still a disgusting mix. Requirements are: preview in the designer, and the ability to add items with XAML. - -/// -/// Base class for creating new navigation controls. -/// -public abstract class Navigation : Control, INavigation -{ - /// - /// Property for . - /// - public static readonly DependencyProperty SelectedPageIndexProperty = DependencyProperty.Register( - nameof(SelectedPageIndex), - typeof(int), typeof(Navigation), - new PropertyMetadata(0)); - - /// - /// Property for . - /// - public static readonly DependencyProperty FrameProperty = DependencyProperty.Register(nameof(Frame), - typeof(ContentPresenter), typeof(Navigation), - new PropertyMetadata(null)); - - /// - /// Property for . - /// - public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(nameof(Items), - typeof(ObservableCollection), typeof(Navigation), - new PropertyMetadata(default(ObservableCollection), Items_OnChanged)); - - /// - /// Property for . - /// - public static readonly DependencyProperty FooterProperty = DependencyProperty.Register(nameof(Footer), - typeof(ObservableCollection), typeof(Navigation), - new PropertyMetadata(default(ObservableCollection), Footer_OnChanged)); - - /// - /// Event triggered when navigate to page. - /// - public static readonly RoutedEvent NavigatedEvent = EventManager.RegisterRoutedEvent(nameof(Navigated), - RoutingStrategy.Bubble, typeof(RoutedNavigationEvent), typeof(Navigation)); - - /// - /// Creates new instance of and sets it's default event. - /// - protected Navigation() - { - Items = new ObservableCollection(); - Footer = new ObservableCollection(); - Loaded += LoadFirstPage; - } - - /// - public int SelectedPageIndex - { - get => (int) GetValue(SelectedPageIndexProperty); - set => SetValue(SelectedPageIndexProperty, value); - } - - /// - public ContentPresenter Frame - { - get => (ContentPresenter) GetValue(FrameProperty); - set => SetValue(FrameProperty, value); - } - - /// - public ObservableCollection Items - { - get => GetValue(ItemsProperty) as ObservableCollection; - set => SetValue(ItemsProperty, value); - } - - /// - public ObservableCollection Footer - { - get => GetValue(FooterProperty) as ObservableCollection; - set => SetValue(FooterProperty, value); - } - - /// - public event RoutedNavigationEvent Navigated - { - add => AddHandler(NavigatedEvent, value); - remove => RemoveHandler(NavigatedEvent, value); - } - - /// - public INavigationItem Current { get; internal set; } - - private void LoadFirstPage(object sender, RoutedEventArgs e) - { - if (SelectedPageIndex < 0 || Items.Count == 0 && Footer.Count == 0) return; - - var indexShift = SelectedPageIndex; - - for (var i = 0; i < Items?.Count; i++) - { - if (i != indexShift) continue; - - Navigate(Items[i]); - return; - } - - indexShift -= Items?.Count ?? 0; - - if (indexShift < 0) return; - - for (var i = 0; i < Footer?.Count; i++) - { - if (i != indexShift) - continue; - - Navigate(Footer[i]); - return; - } - } - - private void Items_OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) - { - if (e.NewItems != null) - foreach (var addedItem in e.NewItems) - - if (addedItem is INavigationItem) - ((INavigationItem) addedItem).Click += Item_OnClicked; - - if (e.OldItems == null) - return; - - foreach (var deletedItem in e.OldItems) - ((INavigationItem) deletedItem).Click -= Item_OnClicked; - } - - private void Footer_OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) - { - if (e.NewItems != null) - foreach (var addedItem in e.NewItems) - if (addedItem is INavigationItem) - ((INavigationItem) addedItem).Click += Item_OnClicked; - - if (e.OldItems == null) - return; - - foreach (var deletedItem in e.OldItems) - ((INavigationItem) deletedItem).Click -= Item_OnClicked; - } - - private static void Items_OnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - // TODO: Fix Navigation direct class reference - if (d is not Navigation navigation) - return; - - if (navigation.Items == null) - return; - - foreach (var navigationItem in navigation.Items) - if (navigationItem.Page != null) - navigationItem.Click += navigation.Item_OnClicked; - - navigation.Items.CollectionChanged += navigation.Items_OnCollectionChanged; - } - - private static void Footer_OnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not Navigation navigation) - return; - - if (navigation.Footer == null) - return; - - foreach (var navigationItem in navigation.Footer) - if (navigationItem.Page != null) - navigationItem.Click += navigation.Item_OnClicked; - - navigation.Footer.CollectionChanged += navigation.Footer_OnCollectionChanged; - } - - private void Item_OnClicked(object sender, RoutedEventArgs e) - { - if (sender is not INavigationItem item) return; - Navigate(item); - } - - private void Navigate(INavigationItem item) - { - if (item.Page == null) return; - Current = item; - Frame.Content = item.Page; - - var newEvent = new RoutedNavigationEventArgs(NavigatedEvent, this, item); - RaiseEvent(newEvent); - } -} \ No newline at end of file diff --git a/RevitLookup.UI/Controls/Navigation/NavigationBackButton.cs b/RevitLookup.UI/Controls/Navigation/NavigationBackButton.cs new file mode 100644 index 000000000..d00f4aa8a --- /dev/null +++ b/RevitLookup.UI/Controls/Navigation/NavigationBackButton.cs @@ -0,0 +1,39 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +#nullable enable + +using System.ComponentModel; +using System.Windows; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Controls.Navigation; + +/// +/// Inherited from the , used to navigate backwards inside the . +/// +public class NavigationBackButton : System.Windows.Controls.Button +{ + /// + /// Property for . + /// + public static readonly DependencyProperty NavigationProperty = DependencyProperty.Register(nameof(Navigation), + typeof(INavigation), typeof(NavigationBackButton), new PropertyMetadata(null)); + + /// + /// Parent control. + /// + [Bindable(true), Category("Behavior")] + public INavigation? Navigation + { + get => (INavigation)GetValue(NavigationProperty); + set => SetValue(NavigationProperty, value); + } + + public NavigationBackButton() + { + SetValue(CommandProperty, new Common.RelayCommand(_ => Navigation?.NavigateBack(), () => Navigation is not null && Navigation.CanGoBack)); + } +} diff --git a/RevitLookup.UI/Controls/Navigation/NavigationBase.cs b/RevitLookup.UI/Controls/Navigation/NavigationBase.cs new file mode 100644 index 000000000..d21720135 --- /dev/null +++ b/RevitLookup.UI/Controls/Navigation/NavigationBase.cs @@ -0,0 +1,722 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +#nullable enable +#pragma warning disable CS8600 +#pragma warning disable CS8603 + +using System; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using RevitLookup.UI.Common; +using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Mvvm.Contracts; +using RevitLookup.UI.Mvvm.Interfaces; + +namespace RevitLookup.UI.Controls.Navigation; + +/// +/// Base implementation for the navigation view. +/// +public abstract class NavigationBase : Control, INavigation +{ + /// + /// Service used for navigation purposes. + /// + private readonly Services.Internal.NavigationService? _navigationService; + + /// + /// Property for . + /// + public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(nameof(Items), + typeof(ObservableCollection), typeof(NavigationBase), + new PropertyMetadata((ObservableCollection)null, OnItemsChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty FooterProperty = DependencyProperty.Register(nameof(Footer), + typeof(ObservableCollection), typeof(NavigationBase), + new PropertyMetadata((ObservableCollection)null, OnFooterChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register(nameof(Orientation), + typeof(Orientation), typeof(NavigationBase), + new FrameworkPropertyMetadata(Orientation.Vertical, + FrameworkPropertyMetadataOptions.AffectsMeasure)); + + /// + /// Property for . + /// + public static readonly DependencyProperty FrameProperty = DependencyProperty.Register(nameof(Frame), + typeof(Frame), typeof(NavigationBase), + new PropertyMetadata((Frame)null, OnFrameChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty TransitionDurationProperty = DependencyProperty.Register( + nameof(TransitionDuration), + typeof(int), typeof(NavigationBase), + new PropertyMetadata(300, OnTransitionDurationChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty TransitionTypeProperty = DependencyProperty.Register( + nameof(TransitionType), + typeof(Animations.TransitionType), typeof(NavigationBase), + new PropertyMetadata(Animations.TransitionType.FadeInWithSlide, OnTransitionTypeChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty SelectedPageIndexProperty = DependencyProperty.Register( + nameof(SelectedPageIndex), + typeof(int), typeof(NavigationBase), + new PropertyMetadata(-1)); + + /// + /// Property for . + /// + public static readonly DependencyProperty PrecacheProperty = DependencyProperty.Register( + nameof(Precache), + typeof(bool), typeof(NavigationBase), + new PropertyMetadata(false)); + + /// + /// Attached property for 's to get its parent. + /// + internal static readonly DependencyProperty NavigationParentProperty = DependencyProperty.RegisterAttached( + nameof(NavigationParent), typeof(INavigation), typeof(NavigationBase), + new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits)); + + /// + public ObservableCollection Items + { + get => GetValue(ItemsProperty) as ObservableCollection; + set => SetValue(ItemsProperty, value); + } + + /// + public ObservableCollection Footer + { + get => GetValue(FooterProperty) as ObservableCollection; + set => SetValue(FooterProperty, value); + } + + /// + [Obsolete("Work in progress.")] + public Orientation Orientation + { + get => (Orientation)GetValue(OrientationProperty); + set => SetValue(OrientationProperty, value); + } + + /// + public int TransitionDuration + { + get => (int)GetValue(TransitionDurationProperty); + set => SetValue(TransitionDurationProperty, value); + } + + /// + public Animations.TransitionType TransitionType + { + get => (Animations.TransitionType)GetValue(TransitionTypeProperty); + set => SetValue(TransitionTypeProperty, value); + } + + /// + public Frame? Frame + { + get => GetValue(FrameProperty) as Frame; + set => SetValue(FrameProperty, value); + } + + /// + public int SelectedPageIndex + { + get => (int)GetValue(SelectedPageIndexProperty); + set => SetValue(SelectedPageIndexProperty, value); + } + + /// + public bool Precache + { + get => (bool)GetValue(PrecacheProperty); + set => SetValue(PrecacheProperty, value); + } + + internal INavigation NavigationParent + { + get => (INavigation)GetValue(NavigationParentProperty); + private set => SetValue(NavigationParentProperty, value); + } + + #region Events + + /// + /// Event triggered when navigate to page. + /// + public static readonly RoutedEvent NavigatedEvent = EventManager.RegisterRoutedEvent(nameof(Navigated), + RoutingStrategy.Bubble, typeof(RoutedNavigationEvent), typeof(NavigationBase)); + + /// + public event RoutedNavigationEvent Navigated + { + add => AddHandler(NavigatedEvent, value); + remove => RemoveHandler(NavigatedEvent, value); + } + + /// + /// Event triggered when navigate to the next page. + /// + public static readonly RoutedEvent NavigatedForwardEvent = + EventManager.RegisterRoutedEvent(nameof(NavigatedForward), RoutingStrategy.Bubble, + typeof(RoutedNavigationEvent), typeof(NavigationBase)); + + /// + public event RoutedNavigationEvent NavigatedForward + { + add => AddHandler(NavigatedForwardEvent, value); + remove => RemoveHandler(NavigatedForwardEvent, value); + } + + /// + /// Event triggered when navigate to the previous page. + /// + public static readonly RoutedEvent NavigatedBackwardEvent = + EventManager.RegisterRoutedEvent(nameof(NavigatedBackward), RoutingStrategy.Bubble, + typeof(RoutedNavigationEvent), typeof(NavigationBase)); + + /// + public event RoutedNavigationEvent NavigatedBackward + { + add => AddHandler(NavigatedBackwardEvent, value); + remove => RemoveHandler(NavigatedBackwardEvent, value); + } + + #endregion + + /// + public IPageService? PageService + { + get => _navigationService?.GetService(); + set => _navigationService?.SetService(value); + } + + /// + public int PreviousPageIndex => _navigationService?.GetPreviousId() ?? 0; + + /// + public bool CanGoBack => _navigationService is not null && _navigationService.CanGoBack; + + /// + public INavigationItem? Current { get; internal set; } + + /// + /// Static constructor overriding default properties. + /// + static NavigationBase() + { + KeyboardNavigation.DirectionalNavigationProperty.OverrideMetadata( + typeof(NavigationBase), + new FrameworkPropertyMetadata(KeyboardNavigationMode.Contained)); + + KeyboardNavigation.TabNavigationProperty.OverrideMetadata( + typeof(NavigationBase), + new FrameworkPropertyMetadata(KeyboardNavigationMode.Once)); + } + + /// + /// Prepares base navigation properties. + /// + protected NavigationBase() + { + Current = (INavigationItem)null; + + // Prepare individual collections for this navigation + Items ??= new ObservableCollection(); + Footer ??= new ObservableCollection(); + + _navigationService = new Services.Internal.NavigationService(); + _navigationService.TransitionDuration = TransitionDuration; + _navigationService.TransitionType = TransitionType; + + if (Frame != null) + _navigationService.SetFrame(Frame); + + // Let the NavigationItem children be able to get me. + NavigationParent = this; + + // Loaded does not have override + Loaded += OnLoaded; + } + + public bool NavigateBack() + { + if (_navigationService is null) return false; + + if (!_navigationService.NavigateBack()) + return false; + + NavigateInternal(0, true); + + return true; + } + + /// + public bool Navigate(Type pageType) + { + return Navigate(pageType, null); + } + + /// + public bool Navigate(Type pageType, object? dataContext) + { + if (!_navigationService.Navigate(pageType, dataContext)) + return false; + + NavigateInternal(0, true); + + return true; + } + + /// + public bool Navigate(string pageTag) + { + return Navigate(pageTag, null); + } + + /// + public bool Navigate(string pageTag, object? dataContext) + { + if (!_navigationService.Navigate(pageTag, dataContext)) + return false; + + NavigateInternal(0, true); + + return true; + } + + + /// + public bool Navigate(int pageId) + { + return Navigate(pageId, null); + } + + /// + public bool Navigate(int pageId, object? dataContext) + { + if (_navigationService != null) + if (!_navigationService.Navigate(pageId, dataContext)) + return false; + + NavigateInternal(-1, true); + + return true; + } + + /// + public bool NavigateExternal(object frameworkElement) + { + return NavigateExternal(frameworkElement, null); + } + + /// + public bool NavigateExternal(object frameworkElement, object? dataContext) + { + if (_navigationService != null) + if (!_navigationService.NavigateExternal(frameworkElement, dataContext)) + return false; + + NavigateInternal(-1, true); + + return true; + } + + /// + public bool NavigateExternal(Uri absolutePageUri) + { + return NavigateExternal(absolutePageUri, null); + } + + /// + public bool NavigateExternal(Uri absolutePageUri, object? dataContext) + { + if (_navigationService != null) + if (!_navigationService.NavigateExternal(absolutePageUri, dataContext)) + return false; + + NavigateInternal(-1, false); + + return true; + } + + /// + public void SetCurrentContext(object dataContext) + { + if (Frame?.Content is not FrameworkElement) + return; + + ((FrameworkElement)Frame.Content).DataContext = dataContext; + + if (dataContext is IViewModel) + ((IViewModel)dataContext).OnMounted(((FrameworkElement)Frame.Content)); + } + + /// + public bool SetContext(string pageTag, object dataContext) + { + if (_navigationService == null) + return false; + + return _navigationService.SetContext(pageTag, dataContext); + } + + /// + public bool SetContext(int pageId, object dataContext) + { + if (_navigationService == null) + return false; + + return _navigationService.SetContext(pageId, dataContext); + } + + /// + public void Flush() + { + Items.Clear(); + Footer.Clear(); + + Current = (INavigationItem)null; + } + + /// + public void ClearCache() + { + if (_navigationService == null) + return; + + _navigationService.ClearCache(); + } + + /// + /// Updates property and modifies Active attribute of navigation items. + /// + private void UpdateItems() + { + var currentTag = _navigationService?.GetCurrentTag() ?? string.Empty; + + foreach (var singleNavigationControl in Items) + { + if (singleNavigationControl is not INavigationItem) + continue; + + if (((INavigationItem)singleNavigationControl).PageTag == currentTag) + { + ((INavigationItem)singleNavigationControl).IsActive = true; + Current = (INavigationItem)singleNavigationControl; + } + else + { + ((INavigationItem)singleNavigationControl).IsActive = false; + } + } + + foreach (var singleNavigationControl in Footer) + { + if (singleNavigationControl is not INavigationItem) + continue; + + if (((INavigationItem)singleNavigationControl).PageTag == currentTag) + { + ((INavigationItem)singleNavigationControl).IsActive = true; + Current = (INavigationItem)singleNavigationControl; + } + else + { + ((INavigationItem)singleNavigationControl).IsActive = false; + } + } + } + + /// + /// This virtual method is called when is loaded. + /// + protected virtual void OnLoaded(object sender, RoutedEventArgs e) + { + UpdateServiceItems(); + + if (PageService == null && Frame != null && SelectedPageIndex > -1) + Navigate(SelectedPageIndex); + + // If we are using the MVVM model, do not use the cache. + if (Precache) + { + if (PageService != null) + throw new InvalidOperationException("The cache cannot be used if you are using IPageService."); + + // TODO: Precache + //await PrecacheInstances(); + } + } + + /// + protected override void OnKeyDown(KeyEventArgs e) + { + // We handle Left/Up/Right/Down keys for keyboard navigation only, + // so no modifiers are needed. + if (Keyboard.Modifiers is not ModifierKeys.None) + return; + + // For most cases, this method do nothing because it does not receive focus by default. + // But if someone set focus to it, the key handling can move the focus to its navigation children. + switch (e.Key) + { + // We use Direction Left/Up/Right/Down instead of Previous/Next to make sure + // that the KeyboardNavigation.DirectionalNavigation property works correctly. + case Key.Left: + MoveFocus(this, FocusNavigationDirection.Left); + e.Handled = true; + break; + + case Key.Up: + MoveFocus(this, FocusNavigationDirection.Up); + e.Handled = true; + break; + + case Key.Right: + MoveFocus(this, FocusNavigationDirection.Right); + e.Handled = true; + break; + + case Key.Down: + MoveFocus(this, FocusNavigationDirection.Down); + e.Handled = true; + break; + } + + if (!e.Handled) + base.OnKeyDown(e); + + static void MoveFocus(FrameworkElement element, FocusNavigationDirection direction) + { + var request = new TraversalRequest(direction); + element.MoveFocus(request); + } + } + + /// + /// This virtual method is called during any navigation and it raises the . + /// + protected virtual void OnNavigated() + { + var newEvent = new RoutedNavigationEventArgs(NavigatedEvent, this, Current); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called during forward navigation and it raises the . + /// + protected virtual void OnNavigatedForward() + { + var newEvent = new RoutedNavigationEventArgs(NavigatedForwardEvent, this, Current); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called during backward navigation and it raises the . + /// + protected virtual void OnNavigatedBackward() + { + var newEvent = new RoutedNavigationEventArgs(NavigatedBackwardEvent, this, Current); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called when one of the navigation items is clicked. + /// + protected virtual void OnNavigationItemClicked(object sender, RoutedEventArgs e) + { + if (sender is not INavigationItem navigationItem) + return; + + if (navigationItem.AbsolutePageSource == null && navigationItem.PageType == null) + return; + + if (PageService == null) + { + Navigate(navigationItem.PageTag); + + return; + } + + if (navigationItem.PageType == null) + throw new InvalidOperationException("When navigating through the IPageService, the navigated page type must be defined the INavigationItem.PageType."); + + Navigate(navigationItem.PageType); + } + + /// + /// This virtual method is called when something is added, deleted or changed in or . + /// + protected virtual void OnNavigationCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + if (IsLoaded) + UpdateServiceItems(); + + if (e.NewItems != null) + foreach (var addedItem in e.NewItems) + if (addedItem is INavigationItem) + { + ((INavigationItem)addedItem).Click -= OnNavigationItemClicked; // Unsafe - Remove duplicates + ((INavigationItem)addedItem).Click += OnNavigationItemClicked; + } + + if (e.OldItems == null) + return; + + foreach (var deletedItem in e.OldItems) + ((INavigationItem)deletedItem).Click -= OnNavigationItemClicked; + } + + /// + /// Triggered when is changed. + /// + private static void OnItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NavigationBase navigationBase) + return; + + navigationBase.InitializeServiceItems(); + + if (e.NewValue is not ObservableCollection itemsCollection) + return; + + itemsCollection.CollectionChanged += navigationBase.OnNavigationCollectionChanged; + } + + /// + /// Triggered when is changed. + /// + private static void OnFooterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NavigationBase navigationBase) + return; + + navigationBase.InitializeServiceItems(); + + if (e.NewValue is not ObservableCollection itemsCollection) + return; + + itemsCollection.CollectionChanged += navigationBase.OnNavigationCollectionChanged; + } + + /// + /// This virtual method is called when one of the navigation items is clicked. + /// + protected virtual void OnFrameChanged(Frame frame) + { + _navigationService?.SetFrame(frame); + } + + /// + /// Triggered when is changed. + /// + private static void OnFrameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NavigationBase navigationBase || e.NewValue is not Frame frame) + return; + + navigationBase.OnFrameChanged(frame); + } + + private static void OnTransitionDurationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NavigationBase navigation) + return; + + if (navigation._navigationService == null) + return; + + navigation._navigationService.TransitionDuration = (int)e.NewValue; + } + + private static void OnTransitionTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NavigationBase navigation) + return; + + if (navigation._navigationService == null) + return; + + navigation._navigationService.TransitionType = (Animations.TransitionType)e.NewValue; + } + + /// + /// Gets the parent view for its children. + /// + /// + /// + internal static NavigationBase? GetNavigationParent(T navigationItem) + where T : DependencyObject, INavigationItem + { + return (NavigationBase?)navigationItem.GetValue(NavigationParentProperty); + } + + private void InitializeServiceItems() + { + var navigationItems = GetValue(ItemsProperty) as ObservableCollection ?? new ObservableCollection { }; + var navigationFooter = GetValue(FooterProperty) as ObservableCollection ?? new ObservableCollection { }; + + foreach (var addedItem in navigationItems) + if (addedItem is INavigationItem) + { + ((INavigationItem)addedItem).Click -= OnNavigationItemClicked; // Unsafe - Remove duplicates + ((INavigationItem)addedItem).Click += OnNavigationItemClicked; + } + + foreach (var addedItem in navigationFooter) + if (addedItem is INavigationItem) + { + ((INavigationItem)addedItem).Click -= OnNavigationItemClicked; // Unsafe - Remove duplicates + ((INavigationItem)addedItem).Click += OnNavigationItemClicked; + } + + UpdateServiceItems(); + } + + private void UpdateServiceItems() + { + var navigationItems = GetValue(ItemsProperty) as ObservableCollection ?? new ObservableCollection { }; + var navigationFooter = GetValue(FooterProperty) as ObservableCollection ?? new ObservableCollection { }; + + if (_navigationService != null) + _navigationService.UpdateItems(navigationItems, navigationFooter); + } + + private void NavigateInternal(int arg, bool updateItems) + { + SelectedPageIndex = _navigationService?.GetCurrentId() ?? +arg; + + if (updateItems) + UpdateItems(); + + OnNavigated(); + + if (SelectedPageIndex > (_navigationService?.GetPreviousId() ?? +arg)) + OnNavigatedForward(); + else + OnNavigatedBackward(); + } +} diff --git a/RevitLookup.UI/Controls/Navigation/NavigationHeader.bmp b/RevitLookup.UI/Controls/Navigation/NavigationHeader.bmp new file mode 100644 index 0000000000000000000000000000000000000000..82af3f66e100bb32948f54da0708ac4c647b16db GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSy;&^OY76VZTlvq3r_#>4f( zxmd%EZ1rfK0Gfl + /// Property for . + /// + public static readonly DependencyProperty TextProperty = DependencyProperty.Register(nameof(Text), + typeof(string), typeof(NavigationHeader), + new PropertyMetadata(string.Empty)); + + /// + /// Property for . + /// + public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), + typeof(Common.SymbolRegular), typeof(NavigationHeader), + new PropertyMetadata(Common.SymbolRegular.Empty)); + + /// + /// Property for . + /// + public static readonly DependencyProperty IconFilledProperty = DependencyProperty.Register(nameof(IconFilled), + typeof(bool), typeof(NavigationHeader), new PropertyMetadata(false)); + + /// + /// Property for . + /// + public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.Register(nameof(IconForeground), + typeof(Brush), typeof(NavigationHeader), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, + FrameworkPropertyMetadataOptions.Inherits)); + + /// + /// Property for . + /// + public static readonly DependencyProperty IconSizeProperty = DependencyProperty.Register(nameof(IconSize), + typeof(double), typeof(NavigationHeader), new FrameworkPropertyMetadata(13d)); + + /// + /// Text presented in the header element. + /// + [Bindable(true)] + public string Text + { + get => (string)GetValue(TextProperty); + set => SetValue(TextProperty, value); + } + + /// + [Bindable(true), Category("Appearance")] + public Common.SymbolRegular Icon + { + get => (Common.SymbolRegular)GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + /// + [Bindable(true), Category("Appearance")] + public bool IconFilled + { + get => (bool)GetValue(IconFilledProperty); + set => SetValue(IconFilledProperty, value); + } + + /// + /// Foreground of the . + /// + [Bindable(true), Category("Appearance")] + public Brush IconForeground + { + get => (Brush)GetValue(IconForegroundProperty); + set => SetValue(IconForegroundProperty, value); + } + + /// + /// Font size of the . + /// + [Bindable(true), Category("Appearance")] + public double IconSize + { + get => (double)GetValue(IconSizeProperty); + set => SetValue(IconSizeProperty, value); + } +} diff --git a/RevitLookup.UI/Controls/Navigation/NavigationSeparator.bmp b/RevitLookup.UI/Controls/Navigation/NavigationSeparator.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a2d86c5142c01ea5374254a6fbaf71dad05ccd7a GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSygs2Bp@NC!?t1Jcd@Mn$g; IOQRSV01Imj_W%F@ literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/Navigation/NavigationSeparator.cs b/RevitLookup.UI/Controls/Navigation/NavigationSeparator.cs new file mode 100644 index 000000000..87250d845 --- /dev/null +++ b/RevitLookup.UI/Controls/Navigation/NavigationSeparator.cs @@ -0,0 +1,16 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.ComponentModel; +using System.Drawing; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Controls.Navigation; + +[ToolboxItem(true)] +[ToolboxBitmap(typeof(NavigationSeparator), "NavigationSeparator.bmp")] +public class NavigationSeparator : System.Windows.Controls.Separator, INavigationControl +{ +} diff --git a/RevitLookup.UI/Controls/NavigationCompact.bmp b/RevitLookup.UI/Controls/NavigationCompact.bmp new file mode 100644 index 0000000000000000000000000000000000000000..930c735ad4874d8c525cdccac8ecfceef3be6ce0 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSy;&^OY76VZTlv%irVIAmBs SwDX -/// Modern navigation styled similar to the Task Manager in Windows 11. +/// Modern navigation styled similar to the Task Manager in Windows 11. /// -public class NavigationCompact : Navigation +[ToolboxItem(true)] +[ToolboxBitmap(typeof(NavigationCompact), "NavigationCompact.bmp")] +public class NavigationCompact : Navigation.NavigationBase { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register( nameof(IsExpanded), @@ -23,33 +26,31 @@ public class NavigationCompact : Navigation new PropertyMetadata(false)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TemplateButtonCommandProperty = DependencyProperty.Register(nameof(TemplateButtonCommand), - typeof(IRelayCommand), typeof(NavigationCompact), new PropertyMetadata(null)); + typeof(Common.IRelayCommand), typeof(NavigationCompact), new PropertyMetadata(null)); /// - /// Creates new instance and sets default . + /// Gets or sets a value indicating whether the menu is expanded. /// - public NavigationCompact() + public bool IsExpanded { - SetValue(TemplateButtonCommandProperty, new RelayCommand(o => Button_OnClick(this, o))); + get => (bool)GetValue(IsExpandedProperty); + set => SetValue(IsExpandedProperty, value); } /// - /// Gets or sets a value indicating whether the menu is expanded. + /// Command triggered after clicking the button. /// - public bool IsExpanded - { - get => (bool) GetValue(IsExpandedProperty); - set => SetValue(IsExpandedProperty, value); - } + public Common.IRelayCommand TemplateButtonCommand => (Common.IRelayCommand)GetValue(TemplateButtonCommandProperty); /// - /// Command triggered after clicking the button. + /// Creates new instance and sets default . /// - public IRelayCommand TemplateButtonCommand => (IRelayCommand) GetValue(TemplateButtonCommandProperty); + public NavigationCompact() : base() => + SetValue(TemplateButtonCommandProperty, new Common.RelayCommand(o => Button_OnClick(this, o))); private void Button_OnClick(object sender, object parameter) { @@ -58,10 +59,7 @@ private void Button_OnClick(object sender, object parameter) var param = parameter as string ?? string.Empty; -#if DEBUG - Debug.WriteLine($"INFO: {typeof(NavigationCompact)} button clicked with param: {param}", "RevitLookup.UI.NavigationCompact"); -#endif if (param == "hamburger") IsExpanded = !IsExpanded; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/NavigationFluent.bmp b/RevitLookup.UI/Controls/NavigationFluent.bmp new file mode 100644 index 0000000000000000000000000000000000000000..930c735ad4874d8c525cdccac8ecfceef3be6ce0 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSy;&^OY76VZTlv%irVIAmBs SwDX -/// Modern navigation styled according to the principles of Fluent Design for Windows 11. +/// Modern navigation styled according to the principles of Fluent Design for Windows 11. /// -public class NavigationFluent : Navigation +[ToolboxItem(true)] +[ToolboxBitmap(typeof(NavigationFluent), "NavigationFluent.bmp")] +public class NavigationFluent : Navigation.NavigationBase { // XAML -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/NavigationItem.bmp b/RevitLookup.UI/Controls/NavigationItem.bmp new file mode 100644 index 0000000000000000000000000000000000000000..930c735ad4874d8c525cdccac8ecfceef3be6ce0 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSy;&^OY76VZTlv%irVIAmBs SwDX -/// Navigation element. +/// Navigation element. /// -public class NavigationItem : ButtonBase, INavigationItem, IIconControl +[ToolboxItem(true)] +[ToolboxBitmap(typeof(NavigationItem), "NavigationItem.bmp")] +public class NavigationItem : System.Windows.Controls.Primitives.ButtonBase, IUriContext, INavigationItem, INavigationControl, IIconControl { /// - /// Property for . + /// Property for . + /// + public static readonly DependencyProperty PageTagProperty = DependencyProperty.Register(nameof(PageTag), + typeof(string), typeof(NavigationItem), new PropertyMetadata(string.Empty)); + + /// + /// Property for . + /// + public static readonly DependencyProperty PageSourceProperty = DependencyProperty.Register(nameof(PageSource), + typeof(Uri), typeof(NavigationItem), new PropertyMetadata((Uri)null, OnPageSourceChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty PageTypeProperty = DependencyProperty.Register(nameof(PageType), + typeof(Type), typeof(NavigationItem), new PropertyMetadata((Type)null, OnPageTypeChanged)); + + /// + /// Property for . /// public static readonly DependencyProperty IsActiveProperty = DependencyProperty.Register(nameof(IsActive), typeof(bool), typeof(NavigationItem), new PropertyMetadata(false)); /// - /// Property for . + /// Property for . + /// + public static readonly DependencyProperty CacheProperty = DependencyProperty.Register(nameof(Cache), + typeof(bool), typeof(NavigationItem), new PropertyMetadata(true)); + + /// + /// Property for . /// public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(SymbolRegular), typeof(NavigationItem), new PropertyMetadata(SymbolRegular.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconSizeProperty = DependencyProperty.Register(nameof(IconSize), typeof(double), typeof(NavigationItem), new PropertyMetadata(18d)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconFilledProperty = DependencyProperty.Register(nameof(IconFilled), typeof(bool), typeof(NavigationItem), new PropertyMetadata(false)); /// - /// Property for . - /// - public static readonly DependencyProperty PageProperty = DependencyProperty.Register(nameof(Page), - typeof(object), typeof(NavigationItem), new PropertyMetadata(null)); - - /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.Register(nameof(IconForeground), typeof(Brush), typeof(NavigationItem), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, FrameworkPropertyMetadataOptions.Inherits)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ImageProperty = DependencyProperty.Register(nameof(Image), typeof(BitmapSource), typeof(NavigationItem), new PropertyMetadata(null)); /// - /// Routed event for . + /// Routed event for . /// public static readonly RoutedEvent ActivatedEvent = EventManager.RegisterRoutedEvent( nameof(Activated), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NavigationItem)); /// - /// Routed event for . + /// Routed event for . /// public static readonly RoutedEvent DeactivatedEvent = EventManager.RegisterRoutedEvent( nameof(Deactivated), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NavigationItem)); + /// + public string PageTag + { + get => (string)GetValue(PageTagProperty); + set => SetValue(PageTagProperty, value); + } + + /// + public Uri PageSource + { + get => (Uri)GetValue(PageSourceProperty); + set => SetValue(PageSourceProperty, value); + + } + + /// + public Type PageType + { + get => (Type)GetValue(PageTypeProperty); + set => SetValue(PageTypeProperty, value); + } + + /// + public bool IsActive + { + get => (bool)GetValue(IsActiveProperty); + set + { + if (value == IsActive) + return; + + RaiseEvent(value + ? new RoutedEventArgs(ActivatedEvent, this) + : new RoutedEventArgs(DeactivatedEvent, this)); + + SetValue(IsActiveProperty, value); + } + } + + /// + public bool Cache + { + get => (bool)GetValue(CacheProperty); + set => SetValue(CacheProperty, value); + } + + /// + [Bindable(true), Category("Appearance")] + [Localizability(LocalizationCategory.None)] + public SymbolRegular Icon + { + get => (SymbolRegular)GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + /// + [Bindable(true), Category("Appearance")] + [Localizability(LocalizationCategory.None)] + public bool IconFilled + { + get => (bool)GetValue(IconFilledProperty); + set => SetValue(IconFilledProperty, value); + } + /// - /// Size of the . + /// Size of the . /// [TypeConverter(typeof(FontSizeConverter))] - [Bindable(true)] - [Category("Appearance")] + [Bindable(true), Category("Appearance")] [Localizability(LocalizationCategory.None)] public double IconSize { - get => (double) GetValue(IconSizeProperty); + get => (double)GetValue(IconSizeProperty); set => SetValue(IconSizeProperty, value); } /// - /// Foreground of the . + /// Foreground of the . /// - [Bindable(true)] - [Category("Appearance")] + [Bindable(true), Category("Appearance")] public Brush IconForeground { - get => (Brush) GetValue(IconForegroundProperty); + get => (Brush)GetValue(IconForegroundProperty); set => SetValue(IconForegroundProperty, value); } /// - /// Gets or sets image displayed next to the card name instead of the icon. + /// Gets or sets image displayed next to the card name instead of the icon. /// + [Bindable(true), Category("Appearance")] public BitmapSource Image { get => GetValue(ImageProperty) as BitmapSource; set => SetValue(ImageProperty, value); } - /// - [Bindable(true)] - [Category("Appearance")] - [Localizability(LocalizationCategory.None)] - public SymbolRegular Icon + /// + /// Occurs when is activated via . + /// + public event RoutedEventHandler Activated { - get => (SymbolRegular) GetValue(IconProperty); - set => SetValue(IconProperty, value); + add => AddHandler(ActivatedEvent, value); + remove => RemoveHandler(ActivatedEvent, value); + } + + /// + /// Occurs when is deactivated via . + /// + public event RoutedEventHandler Deactivated + { + add => AddHandler(DeactivatedEvent, value); + remove => RemoveHandler(DeactivatedEvent, value); } /// - [Bindable(true)] - [Category("Appearance")] - [Localizability(LocalizationCategory.None)] - public bool IconFilled + [Bindable(false)] + public Uri AbsolutePageSource { get; internal set; } + + /// + Uri IUriContext.BaseUri { - get => (bool) GetValue(IconFilledProperty); - set => SetValue(IconFilledProperty, value); + get => BaseUri; + set => BaseUri = value; + } + + /// + /// Implementation for BaseUri. + /// + protected virtual Uri BaseUri + { + get => (Uri)GetValue(BaseUriHelper.BaseUriProperty); + set => SetValue(BaseUriHelper.BaseUriProperty, value); } /// - public bool IsActive + protected override void OnContentChanged(object oldContent, object newContent) { - get => (bool) GetValue(IsActiveProperty); - set + base.OnContentChanged(oldContent, newContent); + + if (newContent is string && string.IsNullOrEmpty(PageTag)) + PageTag = newContent?.ToString()?.ToLower()?.Trim() ?? string.Empty; + } + + /// + protected override void OnKeyDown(KeyEventArgs e) + { + if (Keyboard.Modifiers is not ModifierKeys.None) { - if (value == IsActive) - return; + // We handle Left/Up/Right/Down keys for keyboard navigation only, + // so no modifiers are needed. + return; + } - RaiseEvent(value - ? new RoutedEventArgs(ActivatedEvent, this) - : new RoutedEventArgs(DeactivatedEvent, this)); + switch (e.Key) + { + // We use Direction Left/Up/Right/Down instead of Previous/Next to make sure + // that the KeyboardNavigation.DirectionalNavigation property works correctly. + case Key.Left: + MoveFocus(this, FocusNavigationDirection.Left); + e.Handled = true; + break; - SetValue(IsActiveProperty, value); + case Key.Up: + MoveFocus(this, FocusNavigationDirection.Up); + e.Handled = true; + break; + + case Key.Right: + MoveFocus(this, FocusNavigationDirection.Right); + e.Handled = true; + break; + + case Key.Down: + MoveFocus(this, FocusNavigationDirection.Down); + e.Handled = true; + break; + + case Key.Space: + case Key.Enter: + + // Item doesn't define a page, skip navigation. + if (PageSource == null && PageType == null) + break; + + if (NavigationBase.GetNavigationParent(this) is { } navigation + && PageTag is { } pageTag + && !string.IsNullOrEmpty(pageTag)) + { + e.Handled = true; + + navigation.Navigate(pageTag); + } + break; + } + + // If it is simply treated as a button, pass the information about the click on. + if (!e.Handled) + base.OnKeyDown(e); + + static void MoveFocus(FrameworkElement element, FocusNavigationDirection direction) + { + var request = new TraversalRequest(direction); + element.MoveFocus(request); } } - /// - public object Page + /// + /// This virtual method is called when of the selected page is changed. + /// + protected virtual void OnPageSourceChanged(Uri pageUri) { - get => GetValue(PageProperty); - set => SetValue(PageProperty, value); + if (!pageUri.OriginalString.EndsWith(".xaml")) + throw new ArgumentException($"URI in {typeof(NavigationItem)} must point to the XAML Page."); + + AbsolutePageSource = ResolvePageUri(pageUri); } - /// - public bool IsValid => Page != null; + private static void OnPageSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NavigationItem navigationItem) + return; + + navigationItem.OnPageSourceChanged(e.NewValue as Uri); + } /// - /// Occurs when is activated via . + /// This virtual method is called when of the selected page is changed. /// - public event RoutedEventHandler Activated + protected virtual void OnPageTypeChanged(Type pageType) { - add => AddHandler(ActivatedEvent, value); - remove => RemoveHandler(ActivatedEvent, value); + if (pageType == null) + return; + + if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) + throw new ArgumentException($"{pageType} is not inherited from {typeof(FrameworkElement)}."); + } + + private static void OnPageTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NavigationItem navigationItem) + return; + + navigationItem.OnPageTypeChanged(e.NewValue as Type); } /// - /// Occurs when is deactivated via . + /// Tries to resolve absolute path to the Page template. /// - public event RoutedEventHandler Deactivated + private Uri ResolvePageUri(Uri pageUri) { - add => AddHandler(DeactivatedEvent, value); - remove => RemoveHandler(DeactivatedEvent, value); + if (pageUri == null || pageUri.IsAbsoluteUri) + return pageUri; + + if (!pageUri.EndsWith(".xaml")) + throw new ArgumentException("PageSource must point to the .xaml file."); + + var baseUri = BaseUri; + + if (baseUri == null) + { + // TODO: Force extracting BaseUri for Designer + // This is a hackery solution that needs to be refined. + + if (!DesignerHelper.IsInDesignMode) + throw new UriFormatException("Unable to resolve absolute URI for selected page"); + + // The navigation simply prints a blank page during the design process. + PageType = typeof(System.Windows.Controls.Page); + + return null; + } + + if (!baseUri.IsAbsoluteUri) + throw new ApplicationException("Unable to resolve base URI for selected page"); + + if (baseUri.EndsWith(".xaml")) + baseUri = baseUri.TrimLastSegment(); + + return baseUri.Append(pageUri); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/NavigationStore.bmp b/RevitLookup.UI/Controls/NavigationStore.bmp new file mode 100644 index 0000000000000000000000000000000000000000..930c735ad4874d8c525cdccac8ecfceef3be6ce0 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSy;&^OY76VZTlv%irVIAmBs SwDX -/// Modern navigation styled according to the principles of Fluent Design for Windows 11. +/// Modern navigation styled according to the principles of Fluent Design for Windows 11. /// -public class NavigationStore : Navigation +[ToolboxItem(true)] +[ToolboxBitmap(typeof(NavigationStore), "NavigationStore.bmp")] +public class NavigationStore : Navigation.NavigationBase { // XAML -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/NavigationView.cs b/RevitLookup.UI/Controls/NavigationView.cs new file mode 100644 index 000000000..df9f66bb3 --- /dev/null +++ b/RevitLookup.UI/Controls/NavigationView.cs @@ -0,0 +1,70 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows; +using System.Windows.Controls; +using RevitLookup.UI.Common; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Controls; + +/// +/// Ready navigation that includes a control, and . +/// +[TemplatePart(Name = "PART_Navigation", Type = typeof(Navigation.NavigationBase))] +[TemplatePart(Name = "PART_Breadcrumb", Type = typeof(Breadcrumb))] +[TemplatePart(Name = "PART_Frame", Type = typeof(Frame))] +public class NavigationView : Control +{ + /// + /// Template element represented by the PART_Popup name. + /// + private const string ElementNavigation = "PART_Navigation"; + + /// + /// Template element represented by the PART_Popup name. + /// + private const string ElementBreadcrumb = "PART_Breadcrumb"; + + /// + /// Template element represented by the PART_Popup name. + /// + private const string ElementFrame = "PART_Frame"; + + public static readonly DependencyProperty TypeProperty = DependencyProperty.Register(nameof(Type), + typeof(NavigationType), typeof(NavigationView), + new PropertyMetadata(NavigationType.Compact)); + + /// + /// Navigation control. + /// + public INavigation Navigation { get; protected set; } + + /// + /// Navigation breadcrumb. + /// + public Breadcrumb Breadcrumb { get; protected set; } + + /// + /// Navigation frame + /// + public Frame Frame { get; protected set; } + + public NavigationType Type + { + get => (NavigationType)GetValue(TypeProperty); + set => SetValue(TypeProperty, value); + } + + /// + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + Navigation = GetTemplateChild(ElementNavigation) as INavigation; + Breadcrumb = GetTemplateChild(ElementBreadcrumb) as Breadcrumb; + Frame = GetTemplateChild(ElementFrame) as Frame; + } +} diff --git a/RevitLookup.UI/Controls/NotifyIcon.bmp b/RevitLookup.UI/Controls/NotifyIcon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..96ff0f9f3b96dec012677a2d411636cb6131687a GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTMZ`i2`|8VFSDgc|^5k+tAg z3^4{-3q(DTgae=&I2*`-aN$ +/// Represents the implementation of icon in the tray menu as . +/// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(NotifyIcon), "NotifyIcon.bmp")] +public class NotifyIcon : FrameworkElement +{ + private readonly NotifyIconService _notifyIconService; + + /// + /// Whether the control is disposed. + /// + protected bool Disposed = false; + + #region Public variables + + /// + public int Id => _notifyIconService.Id; + + /// + /// Whether the icon is registered in the tray menu. + /// + public bool IsRegistered => _notifyIconService.IsRegistered; + + /// + public HwndSource HookWindow { get; set; } + + /// + public IntPtr ParentHandle { get; set; } + + #endregion + + #region Properties + + /// + /// Property for . + /// + public static readonly DependencyProperty TooltipTextProperty = DependencyProperty.Register(nameof(TooltipText), + typeof(string), typeof(NotifyIcon), + new PropertyMetadata(string.Empty, OnTooltipTextChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty FocusOnLeftClickProperty = DependencyProperty.Register( + nameof(FocusOnLeftClick), + typeof(bool), typeof(NotifyIcon), + new PropertyMetadata(true, OnFocusOnLeftClickChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty MenuOnRightClickProperty = DependencyProperty.Register( + nameof(MenuOnRightClick), + typeof(bool), typeof(NotifyIcon), + new PropertyMetadata(true, OnMenuOnRightClickChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), + typeof(ImageSource), typeof(NotifyIcon), + new PropertyMetadata((ImageSource)null!, OnIconChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty MenuProperty = DependencyProperty.Register(nameof(Menu), + typeof(ContextMenu), typeof(NotifyIcon), + new PropertyMetadata(null, OnMenuChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty MenuFontSizeProperty = DependencyProperty.Register( + nameof(MenuFontSize), + typeof(double), typeof(NotifyIcon), + new PropertyMetadata(14d)); + + /// + public string TooltipText + { + get => (string)GetValue(TooltipTextProperty); + set => SetValue(TooltipTextProperty, value); + } + + /// + /// Gets or sets the value indicating whether to show the on single right click. + /// + public bool MenuOnRightClick + { + get => (bool)GetValue(MenuOnRightClickProperty); + set => SetValue(MenuOnRightClickProperty, value); + } + + /// + /// Gets or sets the value indicating whether to focus the on single left click. + /// + public bool FocusOnLeftClick + { + get => (bool)GetValue(FocusOnLeftClickProperty); + set => SetValue(FocusOnLeftClickProperty, value); + } + + /// + public ImageSource Icon + { + get => (ImageSource)GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + /// + /// Context menu. + /// + public ContextMenu Menu + { + get => (ContextMenu)GetValue(MenuProperty); + set => SetValue(MenuProperty, value); + } + + public double MenuFontSize + { + get => (double)GetValue(MenuFontSizeProperty); + set => SetValue(MenuFontSizeProperty, value); + } + + #endregion + + #region Events + + /// + /// Registration for . + /// + public static readonly RoutedEvent LeftClickEvent = + EventManager.RegisterRoutedEvent(nameof(LeftClick), RoutingStrategy.Bubble, + typeof(RoutedNotifyIconEvent), typeof(NotifyIcon)); + + /// + /// Registration for . + /// + public static readonly RoutedEvent LeftDoubleClickEvent = + EventManager.RegisterRoutedEvent(nameof(LeftDoubleClick), RoutingStrategy.Bubble, + typeof(RoutedNotifyIconEvent), typeof(NotifyIcon)); + + /// + /// Registration for . + /// + public static readonly RoutedEvent RightClickEvent = + EventManager.RegisterRoutedEvent(nameof(RightClick), RoutingStrategy.Bubble, + typeof(RoutedNotifyIconEvent), typeof(NotifyIcon)); + + /// + /// Registration for . + /// + public static readonly RoutedEvent RightDoubleClickEvent = + EventManager.RegisterRoutedEvent(nameof(RightDoubleClick), RoutingStrategy.Bubble, + typeof(RoutedNotifyIconEvent), typeof(NotifyIcon)); + + /// + /// Registration for . + /// + public static readonly RoutedEvent MiddleClickEvent = + EventManager.RegisterRoutedEvent(nameof(MiddleClick), RoutingStrategy.Bubble, + typeof(RoutedNotifyIconEvent), typeof(NotifyIcon)); + + /// + /// Registration for . + /// + public static readonly RoutedEvent MiddleDoubleClickEvent = + EventManager.RegisterRoutedEvent(nameof(MiddleDoubleClick), RoutingStrategy.Bubble, + typeof(RoutedNotifyIconEvent), typeof(NotifyIcon)); + + /// + /// Triggered when the user left-clicks on the . + /// + public event RoutedNotifyIconEvent LeftClick + { + add => AddHandler(LeftClickEvent, value); + remove => RemoveHandler(LeftClickEvent, value); + } + + /// + /// Triggered when the user double-clicks the with the left mouse button. + /// + public event RoutedNotifyIconEvent LeftDoubleClick + { + add => AddHandler(LeftDoubleClickEvent, value); + remove => RemoveHandler(LeftDoubleClickEvent, value); + } + + /// + /// Triggered when the user right-clicks on the . + /// + public event RoutedNotifyIconEvent RightClick + { + add => AddHandler(RightClickEvent, value); + remove => RemoveHandler(RightClickEvent, value); + } + + /// + /// Triggered when the user double-clicks the with the right mouse button. + /// + public event RoutedNotifyIconEvent RightDoubleClick + { + add => AddHandler(RightDoubleClickEvent, value); + remove => RemoveHandler(RightDoubleClickEvent, value); + } + + /// + /// Triggered when the user middle-clicks on the . + /// + public event RoutedNotifyIconEvent MiddleClick + { + add => AddHandler(MiddleClickEvent, value); + remove => RemoveHandler(MiddleClickEvent, value); + } + + /// + /// Triggered when the user double-clicks the with the middle mouse button. + /// + public event RoutedNotifyIconEvent MiddleDoubleClick + { + add => AddHandler(MiddleDoubleClickEvent, value); + remove => RemoveHandler(MiddleDoubleClickEvent, value); + } + + #endregion + + #region General methods + + public NotifyIcon() + { + _notifyIconService = new NotifyIconService(); + + RegisterHandlers(); + } + + /// + /// Control finalizer. + /// + ~NotifyIcon() + => Dispose(false); + + + /// + /// Tries to register the in the shell. + /// + public void Register() + => _notifyIconService.Register(); + + + /// + /// Tries to unregister the from the shell. + /// + public void Unregister() + => _notifyIconService.Unregister(); + + /// + public void Dispose() + { + Dispose(true); + + GC.SuppressFinalize(this); + } + + #endregion + + #region Protected methods + + /// + protected override void OnRender(DrawingContext drawingContext) + { + base.OnRender(drawingContext); + + if (_notifyIconService.IsRegistered) + return; + + InitializeIcon(); + + Register(); + } + + /// + /// This virtual method is called when is left-clicked and it raises the . + /// + protected virtual void OnLeftClick() + { + var newEvent = new RoutedEventArgs(LeftClickEvent, this); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called when is left-clicked and it raises the . + /// + protected virtual void OnLeftDoubleClick() + { + var newEvent = new RoutedEventArgs(LeftDoubleClickEvent, this); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called when is left-clicked and it raises the . + /// + protected virtual void OnRightClick() + { + var newEvent = new RoutedEventArgs(RightClickEvent, this); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called when is left-clicked and it raises the . + /// + protected virtual void OnRightDoubleClick() + { + var newEvent = new RoutedEventArgs(RightDoubleClickEvent, this); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called when is left-clicked and it raises the . + /// + protected virtual void OnMiddleClick() + { + var newEvent = new RoutedEventArgs(MiddleClickEvent, this); + RaiseEvent(newEvent); + } + + /// + /// This virtual method is called when is left-clicked and it raises the . + /// + protected virtual void OnMiddleDoubleClick() + { + var newEvent = new RoutedEventArgs(MiddleDoubleClickEvent, this); + RaiseEvent(newEvent); + } + + /// + /// If disposing equals , the method has been called directly or indirectly + /// by a user's code. Managed and unmanaged resources can be disposed. If disposing equals , + /// the method has been called by the runtime from inside the finalizer and you should not + /// reference other objects. + /// Only unmanaged resources can be disposed. + /// + /// If disposing equals , dispose all managed and unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (Disposed) + return; + + Disposed = true; + + if (!disposing) + return; + + Unregister(); + + _notifyIconService.Dispose(); + } + + #endregion + + /// + /// This virtual method is called when of is changed. + /// + /// New context menu object. + protected virtual void OnMenuChanged(ContextMenu contextMenu) + { + _notifyIconService.ContextMenu = contextMenu; + _notifyIconService.ContextMenu.FontSize = MenuFontSize; + } + + private static void OnTooltipTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NotifyIcon notifyIcon) + return; + + notifyIcon.TooltipText = e.NewValue as string ?? string.Empty; + } + + private static void OnIconChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NotifyIcon notifyIcon) + return; + + notifyIcon.Icon = e.NewValue as ImageSource; + } + + private static void OnFocusOnLeftClickChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NotifyIcon notifyIcon) + return; + + if (e.NewValue is not bool newValue) + { + notifyIcon.FocusOnLeftClick = false; + + return; + } + + notifyIcon.FocusOnLeftClick = newValue; + } + + private static void OnMenuOnRightClickChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NotifyIcon notifyIcon) + return; + + if (e.NewValue is not bool newValue) + { + notifyIcon.MenuOnRightClick = false; + + return; + } + + notifyIcon.MenuOnRightClick = newValue; + } + + private static void OnMenuChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NotifyIcon notifyIcon) + return; + + if (e.NewValue is not ContextMenu contextMenu) + return; + + notifyIcon.OnMenuChanged(contextMenu); + } + + private void InitializeIcon() + { + _notifyIconService.TooltipText = TooltipText; + _notifyIconService.Icon = Icon; + _notifyIconService.MenuOnRightClick = MenuOnRightClick; + _notifyIconService.FocusOnLeftClick = FocusOnLeftClick; + } + + private void RegisterHandlers() + { + _notifyIconService.LeftClick += OnLeftClick; + _notifyIconService.LeftDoubleClick += OnLeftDoubleClick; + _notifyIconService.RightClick += OnRightClick; + _notifyIconService.RightDoubleClick += OnRightDoubleClick; + _notifyIconService.MiddleClick += OnMiddleClick; + _notifyIconService.MiddleDoubleClick += OnMiddleDoubleClick; + } +} diff --git a/RevitLookup.UI/Controls/NumberBox.bmp b/RevitLookup.UI/Controls/NumberBox.bmp new file mode 100644 index 0000000000000000000000000000000000000000..79c0141e7e4c303be3b7973beb44fb979aa50183 GIT binary patch literal 824 zcmcgnF%Ez*2t*xSjFV6B1;)9%|Nn_=y%ck4pzTl-i4c0+9TKi{k`xE(j$GaxWJ~yn z`8sPR03}N7`|f&pLvTYqFwG@xvfAX5FMMj*H2lFa!JB~d1oXtw=+lEmK4>Ny|HF}K ebZOCFnZ9CaHy=XCy(f{}Jl|q2<&&Hr8j%M;0lKgN literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/NumberBox.cs b/RevitLookup.UI/Controls/NumberBox.cs index 0505aec03..63fd0aed8 100644 --- a/RevitLookup.UI/Controls/NumberBox.cs +++ b/RevitLookup.UI/Controls/NumberBox.cs @@ -3,210 +3,236 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; +using System.ComponentModel; +using System.Drawing; using System.Globalization; using System.Text.RegularExpressions; using System.Windows; using System.Windows.Controls; using System.Windows.Input; -using RevitLookup.UI.Common; namespace RevitLookup.UI.Controls; -// TODO: Refactor -// This control is in a very early stage of development. Validations, increments, pasting and especially masks that are not implemented at all should be refined. +// TODO: Handle backspace +// TODO: Handle editing +// TODO: Implement mask /// -/// Text field for entering numbers with the possibility of specifying pattern. +/// Text field for entering numbers with the possibility of specifying a pattern. /// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(NumberBox), "NumberBox.bmp")] public class NumberBox : TextBox { + // In both expressions, we allow the lonely characters '-', '.' and ',' so the numbers can be typed in real-time. + + /// + /// Accepts a string of digits separated by a comma or period. Allows for a leading minus sign. + /// + private readonly string _decimalExpression = /* language=regex */ @"^\-?(\d+(?:[\.\,]|[\.\,]\d+)?)?$"; + + /// + /// Accepts a string of digits only. Allows for a leading minus sign. + /// + private readonly string _integerExpression = /* language=regex */ @"^\-?(\d+)*$"; + /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(nameof(Value), - typeof(double), typeof(NumberBox), new PropertyMetadata(0.0, Value_PropertyChanged)); + typeof(double), typeof(NumberBox), new PropertyMetadata(0.0d)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty StepProperty = DependencyProperty.Register(nameof(Step), - typeof(double), typeof(NumberBox), new PropertyMetadata(1.0)); + typeof(double), typeof(NumberBox), new PropertyMetadata(1.0d)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty MaxProperty = DependencyProperty.Register(nameof(Max), typeof(double), typeof(NumberBox), new PropertyMetadata(double.MaxValue)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty MinProperty = DependencyProperty.Register(nameof(Min), typeof(double), typeof(NumberBox), new PropertyMetadata(double.MinValue)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty DecimalPlacesProperty = DependencyProperty.Register(nameof(DecimalPlaces), - typeof(int), typeof(NumberBox), new PropertyMetadata(2, DecimalPlaces_PropertyChanged)); + typeof(int), typeof(NumberBox), new PropertyMetadata(2, OnDecimalPlacesChanged)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty MaskProperty = DependencyProperty.Register(nameof(Mask), typeof(string), typeof(NumberBox), new PropertyMetadata(string.Empty)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty ControlsVisibleProperty = DependencyProperty.Register(nameof(ControlsVisible), + public static readonly DependencyProperty SpinButtonsEnabledProperty = DependencyProperty.Register(nameof(SpinButtonsEnabled), typeof(bool), typeof(NumberBox), new PropertyMetadata(true)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IntegersOnlyProperty = DependencyProperty.Register(nameof(IntegersOnly), - typeof(bool), typeof(NumberBox), new PropertyMetadata(false, IntegersOnly_PropertyChanged)); + typeof(bool), typeof(NumberBox), new PropertyMetadata(false)); /// - /// Property for . + /// Routed event for . /// - public static readonly DependencyProperty ButtonCommandProperty = - DependencyProperty.Register(nameof(NumberBox), - typeof(IRelayCommand), typeof(TitleBar), new PropertyMetadata(null)); + public static readonly RoutedEvent IncrementedEvent = EventManager.RegisterRoutedEvent( + nameof(Incremented), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NumberBox)); - internal Regex PatternRegex; + /// + /// Routed event for . + /// + public static readonly RoutedEvent DecrementedEvent = EventManager.RegisterRoutedEvent( + nameof(Decremented), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NumberBox)); /// - /// Creates new instance of and defines default events for validating provided numbers. + /// does no accept returns. /// - public NumberBox() + public new bool AcceptsReturn { - SetValue(ButtonCommandProperty, new RelayCommand(o => Button_Click(this, o))); - - PatternRegex = IntegersOnly ? new Regex("[^0-9]+") : new Regex("[^0-9.,]+"); + get => false; + set => throw new NotImplementedException($"{typeof(NumberBox)} does not accept returns."); + } - PreviewTextInput += NumberBox_PreviewTextInput; - TextChanged += NumberBox_TextChanged; - KeyUp += NumberBox_KeyUp; + /// + /// does not accept changes to the number of lines. + /// + public new int MaxLines + { + get => 1; + set => throw new NotImplementedException($"{typeof(NumberBox)} does not accept changes to the number of lines."); + } - DataObject.AddPastingHandler(this, PastingHandler); + /// + /// does not accept changes to the number of lines. + /// + public new int MinLines + { + get => 1; + set => throw new NotImplementedException($"{typeof(NumberBox)} does not accept changes to the number of lines."); } /// - /// Current numeric value. + /// Gets or sets current numeric value. /// public double Value { - get => (double) GetValue(ValueProperty); + get => (double)GetValue(ValueProperty); set => SetValue(ValueProperty, value); } /// - /// Gets or sets value by which the given number will be increased or decreased after pressing the button. + /// Gets or sets value by which the given number will be increased or decreased after pressing the button. /// public double Step { - get => (double) GetValue(StepProperty); + get => (double)GetValue(StepProperty); set => SetValue(StepProperty, value); } /// - /// Maximum allowable value. + /// Maximum allowable value. /// public double Max { - get => (double) GetValue(MaxProperty); + get => (double)GetValue(MaxProperty); set => SetValue(MaxProperty, value); } /// - /// Minimum allowable value. + /// Minimum allowable value. /// public double Min { - get => (double) GetValue(MinProperty); + get => (double)GetValue(MinProperty); set => SetValue(MinProperty, value); } /// - /// Number of decimal places. + /// Number of decimal places. /// public int DecimalPlaces { - get => (int) GetValue(DecimalPlacesProperty); + get => (int)GetValue(DecimalPlacesProperty); set => SetValue(DecimalPlacesProperty, value); } /// - /// Gets or sets numbers pattern. + /// Gets or sets numbers pattern. /// public string Mask { - get => (string) GetValue(MaskProperty); + get => (string)GetValue(MaskProperty); set => SetValue(MaskProperty, value); } /// - /// Gets or sets value determining whether to display the button controls. + /// Gets or sets value determining whether to display the button controls. /// - public bool ControlsVisible + public bool SpinButtonsEnabled { - get => (bool) GetValue(ControlsVisibleProperty); - set => SetValue(ControlsVisibleProperty, value); + get => (bool)GetValue(SpinButtonsEnabledProperty); + set => SetValue(SpinButtonsEnabledProperty, value); } /// - /// Gets or sets value which determines whether only integers can be entered. + /// Gets or sets value which determines whether only integers can be entered. /// public bool IntegersOnly { - get => (bool) GetValue(IntegersOnlyProperty); + get => (bool)GetValue(IntegersOnlyProperty); set => SetValue(IntegersOnlyProperty, value); } /// - /// Command triggered after clicking the control button. + /// Event occurs when a value is incremented by button or arrow key. /// - public IRelayCommand ButtonCommand => (IRelayCommand) GetValue(ButtonCommandProperty); - - private static void DecimalPlaces_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + public event RoutedEventHandler Incremented { - if (d is not NumberBox control) - return; - - if (control.DecimalPlaces < 0) - control.DecimalPlaces = 0; - - if (control.DecimalPlaces > 4) - control.DecimalPlaces = 4; + add => AddHandler(IncrementedEvent, value); + remove => RemoveHandler(IncrementedEvent, value); } - private static void Value_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + /// + /// Event occurs when a value is decremented by button or arrow key. + /// + public event RoutedEventHandler Decremented { - if (d is not NumberBox control) - return; - - if (!string.IsNullOrEmpty(control.Text)) - return; - - if (control.Value % 1 != 0 && !control.IntegersOnly) - control.Text = control.Value.ToString("F" + control.DecimalPlaces, CultureInfo.InvariantCulture); - else - control.Text = control.Value.ToString("F0", CultureInfo.InvariantCulture); + add => AddHandler(DecrementedEvent, value); + remove => RemoveHandler(DecrementedEvent, value); } - private static void IntegersOnly_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + /// + /// Creates new instance of . + /// + public NumberBox() { - if (d is not NumberBox control) - return; + DataObject.AddPastingHandler(this, OnClipboardPaste); - control.PatternRegex = control.IntegersOnly ? new Regex("[^0-9]+") : new Regex("[^0-9.,]+"); + Loaded += OnLoaded; } - private void Button_Click(object sender, object parameter) + /// + protected override void OnTemplateButtonClick(object sender, object parameter) { - var command = parameter as string; + base.OnTemplateButtonClick(sender, parameter); + + if (sender is not NumberBox) + return; + + var command = parameter?.ToString() ?? string.Empty; switch (command) { @@ -220,112 +246,249 @@ private void Button_Click(object sender, object parameter) } } - private void NumberBox_PreviewTextInput(object sender, TextCompositionEventArgs e) + /// + /// Updates and . + /// + private void UpdateValue(double value, bool updateText) { - e.Handled = Validate(e.Text); + Value = value; + + if (!updateText) + return; + + var newText = FormatDoubleToString(value); + + Text = newText; + CaretIndex = newText.Length; } - private void NumberBox_TextChanged(object sender, TextChangedEventArgs e) + /// + /// Updates and . + /// + private void UpdateValue(double value, string updateText) { - if (sender is not NumberBox control) + Value = value; + + Text = updateText; + CaretIndex = updateText.Length; + } + + /// + /// Increments current . + /// + private void IncrementValue() + { + var currentText = Text; + var parsedNumber = ParseStringToDouble(currentText) + Step; + + if (string.IsNullOrWhiteSpace(currentText) || parsedNumber > Max) + { + UpdateValue(Max, true); + return; + } - if (PlaceholderVisible && control.Text.Length > 0) - PlaceholderVisible = false; + UpdateValue(parsedNumber, true); - if (!PlaceholderVisible && control.Text.Length < 1) - PlaceholderVisible = true; + OnIncremented(); + } + + /// + /// Decrements current . + /// + private void DecrementValue() + { + var currentText = Text; + var parsedNumber = ParseStringToDouble(currentText) - Step; - double.TryParse(control.Text, out var number); + if (string.IsNullOrWhiteSpace(currentText) || parsedNumber < Min) + { + UpdateValue(Min, true); - Value = number; + return; + } + + UpdateValue(parsedNumber, true); + + OnDecremented(); } - private void NumberBox_KeyUp(object sender, KeyEventArgs e) + /// + /// Formats double number according to configuration. + /// + private string FormatDoubleToString(double number) { - if (e.Key == Key.Up) - IncrementValue(); + if (IntegersOnly || DecimalPlaces < 1) + return number.ToString("F0", CultureInfo.InvariantCulture); - if (e.Key == Key.Down) - DecrementValue(); + if (DecimalPlaces < 5) + return number.ToString($"F{DecimalPlaces}", CultureInfo.InvariantCulture); + + return number.ToString(CultureInfo.InvariantCulture); } - private void PastingHandler(object sender, DataObjectPastingEventArgs e) + /// + /// Tests provided text with regular expression according to configuration. + /// + private bool IsNumberTextValid(string inputText) { - if (sender is not NumberBox control) - return; + // If the mask is used this method will not work - var clipboardText = (string) e.DataObject.GetData(typeof(string)); + var decimalPlaces = DecimalPlaces; + var integerRegex = new Regex(_integerExpression); + var decimalRegex = new Regex(_decimalExpression); - if (Validate(clipboardText)) - e.CancelCommand(); + if (IntegersOnly || decimalPlaces < 1) + return integerRegex.IsMatch(inputText); + + if (!decimalRegex.IsMatch(inputText)) + return false; + + if (inputText.Contains(",") && inputText.Substring(inputText.IndexOf(",")).Length > decimalPlaces) + return false; + + if (inputText.Contains(".") && inputText.Substring(inputText.IndexOf(".")).Length > decimalPlaces) + return false; + + return true; } - private void IncrementValue() + /// + /// Tries to format provided string according to the mask. + /// + private string FormatWithMask(string currentInput, string newInput) { - var currentText = Text; + // TODO: Format text according to MaskProperty + + return currentInput; + } + + /// + /// Tries to parse provided string to double with invariant culture. + /// + private double ParseStringToDouble(string inputText) + { + double.TryParse(inputText, NumberStyles.Any, CultureInfo.InvariantCulture, out var number); + + return number; + } + + /// + /// Occurs when controls is loaded. + /// + private void OnLoaded(object sender, RoutedEventArgs e) + { + Text = FormatDoubleToString(Value); + } - if (string.IsNullOrEmpty(currentText)) + /// + protected override void OnKeyUp(KeyEventArgs e) + { + if (e.Key == Key.Up) { - Text = Step.ToString("F0"); + IncrementValue(); - return; + e.Handled = true; } - double.TryParse(currentText, out var number); + if (e.Key == Key.Down) + { + DecrementValue(); - if (number + Step > Max) - return; + e.Handled = true; + } - if ((currentText.Contains(".") || currentText.Contains(",")) && !IntegersOnly) - Text = (number + Step).ToString("F" + DecimalPlaces, CultureInfo.InvariantCulture); - else - Text = (number + Step).ToString("F0", CultureInfo.InvariantCulture); + base.OnKeyUp(e); } - private void DecrementValue() + /// + protected override void OnTextChanged(TextChangedEventArgs e) { + base.OnTextChanged(e); + var currentText = Text; + var parsedNumber = ParseStringToDouble(currentText); - if (string.IsNullOrEmpty(currentText)) + PlaceholderEnabled = currentText.Length < 1; + + // TODO: Meh + if (parsedNumber > Max) { - Text = "-" + Step.ToString("F0"); + UpdateValue(Max, true); return; } - double.TryParse(currentText, out var number); + if (parsedNumber < Min) + { + UpdateValue(Min, true); - if (number - Step < Min) return; + } - if ((currentText.Contains(".") || currentText.Contains(",")) && !IntegersOnly) - Text = (number - Step).ToString("F" + DecimalPlaces, CultureInfo.InvariantCulture); - else - Text = (number - Step).ToString("F0", CultureInfo.InvariantCulture); + UpdateValue(parsedNumber, true); } - private bool Validate(string input) + /// + protected override void OnPreviewTextInput(TextCompositionEventArgs e) { - if (string.IsNullOrEmpty(input)) - return true; + var newText = Text + (e.Text ?? string.Empty); - if (input.StartsWith(".") || input.EndsWith(".")) - return false; + if (!string.IsNullOrEmpty(newText)) + e.Handled = !IsNumberTextValid(newText); - if (input.StartsWith(",") || input.EndsWith(",")) - return false; + // Do not allow a leading minus sign if the min value is greater than zero. + if (Min >= 0 && newText.StartsWith("-")) + e.Handled = true; - if (!PatternRegex.IsMatch(input)) - return false; - return true; + base.OnPreviewTextInput(e); } - private string Format(string currentInput, string newInput) + /// + /// This virtual method is called after incrementing a value using button or arrow key. + /// + protected virtual void OnIncremented() { - // TODO: Format text according to MaskProperty + RaiseEvent(new RoutedEventArgs(IncrementedEvent, this)); + } - return currentInput; + /// + /// This virtual method is called after decrementing a value using button or arrow key. + /// + protected virtual void OnDecremented() + { + RaiseEvent(new RoutedEventArgs(DecrementedEvent, this)); + } + + /// + /// This virtual method is called after is changed. + /// + protected virtual void OnDecimalPlacesChanged(int decimalPlaces) + { + if (decimalPlaces < 0) + DecimalPlaces = 0; + } + + private static void OnDecimalPlacesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NumberBox control) + return; + + if (e.NewValue is not int newValue) + return; + + control.OnDecimalPlacesChanged(newValue); + } + + private void OnClipboardPaste(object sender, DataObjectPastingEventArgs e) + { + if (sender is not NumberBox control) + return; + + var clipboardText = (string)e.DataObject.GetData(typeof(string)); + + if (!IsNumberTextValid(clipboardText)) + e.CancelCommand(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/PasswordBox.cs b/RevitLookup.UI/Controls/PasswordBox.cs index 53e978faf..de306fbdd 100644 --- a/RevitLookup.UI/Controls/PasswordBox.cs +++ b/RevitLookup.UI/Controls/PasswordBox.cs @@ -3,102 +3,118 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics; +using System; using System.Windows; using System.Windows.Controls; -using RevitLookup.UI.Common; namespace RevitLookup.UI.Controls; // TODO: This is an initial implementation and requires the necessary corrections, tests and adjustments. +/** + * TextProperty contains asterisks OR raw password if IsPasswordRevealed is set to true + * PasswordProperty always contains raw password + */ + /// -/// The modified password control. +/// The modified password control. /// public sealed class PasswordBox : TextBox { /// - /// Property for . + /// Blocks triggering overwrite when forced text editing. + /// + private bool _takenControl = false; + + /// + /// Property for . /// public static readonly DependencyProperty PasswordProperty = DependencyProperty.Register(nameof(Password), typeof(string), typeof(PasswordBox), new PropertyMetadata(string.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty PasswordCharProperty = DependencyProperty.Register(nameof(PasswordChar), typeof(char), typeof(PasswordBox), new PropertyMetadata('*', OnPasswordCharChanged)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty PasswordRevealModeProperty = DependencyProperty.Register(nameof(PasswordRevealMode), - typeof(RevealMode), typeof(PasswordBox), new PropertyMetadata(RevealMode.Hidden, OnPasswordRevealModeChanged)); + public static readonly DependencyProperty IsPasswordRevealedProperty = DependencyProperty.Register(nameof(IsPasswordRevealed), + typeof(bool), typeof(PasswordBox), new PropertyMetadata(false, OnPasswordRevealModeChanged)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty ShowRevealButtonProperty = DependencyProperty.Register(nameof(ShowRevealButton), + public static readonly DependencyProperty RevealButtonEnabledProperty = DependencyProperty.Register(nameof(RevealButtonEnabled), typeof(bool), typeof(PasswordBox), new PropertyMetadata(true)); /// - /// Property for . + /// does no accept returns. /// - public static readonly DependencyProperty TemplateButtonCommandProperty = - DependencyProperty.Register(nameof(TemplateButtonCommand), - typeof(IRelayCommand), typeof(PasswordBox), new PropertyMetadata(null)); + public new bool AcceptsReturn + { + get => false; + set => throw new NotImplementedException($"{typeof(PasswordBox)} does not accept returns."); + } /// - /// Blocks triggering overwrite when forced text editing. + /// does not accept changes to the number of lines. /// - private bool _takenControl; + public new int MaxLines + { + get => 1; + set => throw new NotImplementedException($"{typeof(PasswordBox)} does not accept changes to the number of lines."); + } /// - /// Creates new instance and sets default . + /// does not accept changes to the number of lines. /// - public PasswordBox() + public new int MinLines { - SetValue(TemplateButtonCommandProperty, new RelayCommand(o => Button_OnClick(this, o))); + get => 1; + set => throw new NotImplementedException($"{typeof(PasswordBox)} does not accept changes to the number of lines."); } /// - /// Gets or sets currently typed text represented by asterisks. + /// Gets or sets currently typed text represented by asterisks. /// public string Password { - get => (string) GetValue(PasswordProperty); + get => (string)GetValue(PasswordProperty); internal set => SetValue(PasswordProperty, value); } /// - /// Gets or sets character used to mask the password. + /// Gets or sets character used to mask the password. /// public char PasswordChar { - get => (char) GetValue(PasswordCharProperty); + get => (char)GetValue(PasswordCharProperty); set => SetValue(PasswordCharProperty, value); } /// - /// Gets or sets a value deciding whether the password should be visible as plain text. + /// Gets a value indicating whether the password is revealed. /// - public RevealMode PasswordRevealMode + public bool IsPasswordRevealed { - get => (RevealMode) GetValue(PasswordRevealModeProperty); - set => SetValue(PasswordRevealModeProperty, value); + get => (bool)GetValue(IsPasswordRevealedProperty); + private set => SetValue(IsPasswordRevealedProperty, value); } /// - /// Gets or sets a value deciding whether to display the reveal password button. + /// Gets or sets a value deciding whether to display the reveal password button. /// - public bool ShowRevealButton + public bool RevealButtonEnabled { - get => (bool) GetValue(ShowRevealButtonProperty); - set => SetValue(ShowRevealButtonProperty, value); + get => (bool)GetValue(RevealButtonEnabledProperty); + set => SetValue(RevealButtonEnabledProperty, value); } /// - /// Contents of the TextBox. Returns asterisks, if you want a valid password use . + /// Contents of the TextBox. Returns asterisks, if you want a valid password use . /// public new string Text { @@ -111,13 +127,8 @@ public bool ShowRevealButton } /// - /// Command triggered after clicking the button. - /// - public IRelayCommand TemplateButtonCommand => (IRelayCommand) GetValue(TemplateButtonCommandProperty); - - /// - /// Called when content changes. - /// Partially inspired by Leonardo T. implementation of SecureWpfLogOn. + /// Called when content changes. + /// Partially inspired by Leonardo T. implementation of SecureWpfLogOn. /// /// protected override void OnTextChanged(TextChangedEventArgs e) @@ -125,7 +136,7 @@ protected override void OnTextChanged(TextChangedEventArgs e) if (_takenControl) return; - if (PasswordRevealMode == RevealMode.Visible) + if (IsPasswordRevealed) { base.OnTextChanged(e); Password = base.Text; @@ -178,58 +189,56 @@ protected override void OnTextChanged(TextChangedEventArgs e) } /// - /// Updates the content of the displayed password if the character is changed. + /// Updates the content of the displayed password if the character is changed. /// private void UpdatePasswordWithNewChar(char newChar) { - if (PasswordRevealMode == RevealMode.Visible) + // If password is currently revealed, do not replace text with asterisks + if (IsPasswordRevealed) return; + base.Text = new string(newChar, base.Text.Length); } /// - /// Change the display of the password if rules are supported. + /// Change the display of the password. /// - private void UpdateRevealIfPossible(RevealMode revealMode) + private void UpdateReveal(bool isPasswordRevealed) { - // TODO: I don't know if it's a good method, but somehow works - - if (revealMode == RevealMode.Visible && Password.Length > 0) - { - PasswordRevealMode = RevealMode.Hidden; - return; - } - SetValue(TextProperty, - revealMode == RevealMode.Visible ? Password : new string(PasswordChar, Password.Length)); + isPasswordRevealed ? Password : new string(PasswordChar, Password.Length)); } - private void Button_OnClick(object sender, object parameter) + /// + /// Triggered by clicking a button in the control template. + /// + /// Sender of the click event. + /// Additional parameters. + protected override void OnTemplateButtonClick(object sender, object parameter) { + base.OnTemplateButtonClick(sender, parameter); + if (parameter == null) return; var param = parameter as string ?? string.Empty; -#if DEBUG - Debug.WriteLine($"INFO: {typeof(PasswordBox)} button clicked with param: {param}", "RevitLookup.UI.PasswordBox"); -#endif - switch (param) { case "reveal": - PasswordRevealMode = PasswordRevealMode == RevealMode.Visible - ? RevealMode.Hidden - : RevealMode.Visible; + IsPasswordRevealed = !IsPasswordRevealed; + + Focus(); + CaretIndex = Text.Length; break; } } /// - /// Static method that is called if the character is changed in the during the run. + /// Static method that is called if the character is changed in the during the run. /// - /// Instance of the + /// Instance of the /// Various property events. private static void OnPasswordCharChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -239,14 +248,15 @@ private static void OnPasswordCharChanged(DependencyObject d, DependencyProperty } /// - /// Static method that is called if the reveal mode is changed in the during the run. + /// Static method that is called if the reveal mode is changed in the during the run. /// - /// Instance of the + /// Instance of the /// Various property events. private static void OnPasswordRevealModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not PasswordBox control) return; - control.UpdateRevealIfPossible(control.PasswordRevealMode); + + control.UpdateReveal(control.IsPasswordRevealed); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/ProgressRing.bmp b/RevitLookup.UI/Controls/ProgressRing.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a1976554ca48ba401dc5cf8de42701b37ac3ff79 GIT binary patch literal 824 zcmcgoK?;CC2(&tOiB3JC7ewd1_y1>9FW81P22rRWYEjW~MrG47H&Wh&IKsQrD;Wx2 zqu;mc1whD>-`l=!wA*Q5Ci74}k?4HYJ(1{4?s5`W+5=SL2q+ywN#sX_WF)a0kuUi8 iIxMo2c}#5SNs1$ -/// Rotating loading ring. +/// Rotating loading ring. /// -public class ProgressRing : Control +[ToolboxItem(true)] +[ToolboxBitmap(typeof(ProgressRing), "ProgressRing.bmp")] +public class ProgressRing : System.Windows.Controls.Control { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ProgressProperty = DependencyProperty.Register(nameof(Progress), typeof(double), typeof(ProgressRing), new PropertyMetadata(50d, PropertyChangedCallback)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IsIndeterminateProperty = DependencyProperty.Register( nameof(IsIndeterminate), @@ -32,14 +36,14 @@ public class ProgressRing : Control new PropertyMetadata(false)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty EngAngleProperty = DependencyProperty.Register(nameof(EngAngle), typeof(double), typeof(ProgressRing), new PropertyMetadata(180.0d)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IndeterminateAngleProperty = DependencyProperty.Register( nameof(IndeterminateAngle), @@ -47,7 +51,7 @@ public class ProgressRing : Control new PropertyMetadata(180.0d)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty CoverRingStrokeProperty = DependencyProperty.RegisterAttached( @@ -61,7 +65,7 @@ public class ProgressRing : Control FrameworkPropertyMetadataOptions.Inherits)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty CoverRingVisibilityProperty = DependencyProperty.Register( nameof(CoverRingVisibility), @@ -69,62 +73,62 @@ public class ProgressRing : Control new PropertyMetadata(Visibility.Visible)); /// - /// Gets or sets the progress. + /// Gets or sets the progress. /// public double Progress { - get => (double) GetValue(ProgressProperty); + get => (double)GetValue(ProgressProperty); set => SetValue(ProgressProperty, value); } /// - /// Determines if shows actual values () - /// or generic, continuous progress feedback (). + /// Determines if shows actual values () + /// or generic, continuous progress feedback (). /// public bool IsIndeterminate { - get => (bool) GetValue(IsIndeterminateProperty); + get => (bool)GetValue(IsIndeterminateProperty); set => SetValue(IsIndeterminateProperty, value); } /// - /// Gets or sets the . + /// Gets or sets the . /// public double EngAngle { - get => (double) GetValue(EngAngleProperty); + get => (double)GetValue(EngAngleProperty); set => SetValue(EngAngleProperty, value); } /// - /// Gets the when is . + /// Gets the when is . /// public double IndeterminateAngle { - get => (double) GetValue(IndeterminateAngleProperty); + get => (double)GetValue(IndeterminateAngleProperty); internal set => SetValue(IndeterminateAngleProperty, value); } /// - /// Background ring fill. + /// Background ring fill. /// public Brush CoverRingStroke { - get => (Brush) GetValue(CoverRingStrokeProperty); + get => (Brush)GetValue(CoverRingStrokeProperty); internal set => SetValue(CoverRingStrokeProperty, value); } /// - /// Background ring visibility. + /// Background ring visibility. /// public Visibility CoverRingVisibility { - get => (Visibility) GetValue(CoverRingVisibilityProperty); + get => (Visibility)GetValue(CoverRingVisibilityProperty); internal set => SetValue(CoverRingVisibilityProperty, value); } /// - /// Re-draws depending on . + /// Re-draws depending on . /// protected void UpdateProgressAngle() { @@ -146,7 +150,7 @@ protected void UpdateProgressAngle() } /// - /// Validates the entered and redraws the . + /// Validates the entered and redraws the . /// protected static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -155,4 +159,4 @@ protected static void PropertyChangedCallback(DependencyObject d, DependencyProp control.UpdateProgressAngle(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/QrCode.cs b/RevitLookup.UI/Controls/QrCode.cs index c16a27c0b..8883432a5 100644 --- a/RevitLookup.UI/Controls/QrCode.cs +++ b/RevitLookup.UI/Controls/QrCode.cs @@ -1,5 +1,6 @@ -using System.Windows; -using System.Windows.Controls; +using System; +using System.Collections.Generic; +using System.Windows; namespace RevitLookup.UI.Controls; @@ -8,22 +9,22 @@ namespace RevitLookup.UI.Controls; public enum QrCodeQuality { /// - /// Recovers 7% of data + /// Recovers 7% of data /// L, /// - /// Recovers 15% of data + /// Recovers 15% of data /// M, /// - /// Recovers 25% of data + /// Recovers 25% of data /// Q, /// - /// Recovers 30% of data + /// Recovers 30% of data /// H } @@ -31,27 +32,27 @@ public enum QrCodeQuality public enum QrCodeEncoding { /// - /// Chooses automatically. + /// Chooses automatically. /// Auto, /// - /// 7089 characters + /// 7089 characters /// Numeric, /// - /// 4296 characters + /// 4296 characters /// Alphanumeric, /// - /// 2953 characters + /// 2953 characters /// Byte, /// - /// 1817 characters + /// 1817 characters /// Kanji } @@ -63,59 +64,60 @@ public enum QrCodeType } /// -/// https://www.qrcode.com/en/about/standards.html +/// https://www.qrcode.com/en/about/standards.html /// [Obsolete] -internal class QrCode : Control +internal class QrCode : System.Windows.Controls.Control { + // ISO 8859-1 | ISO 8859-2 | UTF-8 + + private string _rawData = string.Empty; + /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty QualityProperty = DependencyProperty.Register(nameof(Quality), typeof(QrCodeQuality), typeof(QrCode), new PropertyMetadata(QrCodeQuality.M)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty EncodingProperty = DependencyProperty.Register(nameof(Encoding), typeof(QrCodeEncoding), typeof(QrCode), new PropertyMetadata(QrCodeEncoding.Auto)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TypeProperty = DependencyProperty.Register(nameof(Type), typeof(QrCodeType), typeof(QrCode), new PropertyMetadata(QrCodeType.Bitmap)); - // ISO 8859-1 | ISO 8859-2 | UTF-8 - - private string _rawData = string.Empty; /// - /// Gets or sets the QR Code error correction level. + /// Gets or sets the QR Code error correction level. /// public QrCodeQuality Quality { - get => (QrCodeQuality) GetValue(QualityProperty); + get => (QrCodeQuality)GetValue(QualityProperty); set => SetValue(QualityProperty, value); } /// - /// Gets or sets the QR Code encoding. + /// Gets or sets the QR Code encoding. /// public QrCodeEncoding Encoding { - get => (QrCodeEncoding) GetValue(EncodingProperty); + get => (QrCodeEncoding)GetValue(EncodingProperty); set => SetValue(EncodingProperty, value); } /// - /// Gets or sets the QR Code generation type. + /// Gets or sets the QR Code generation type. /// public QrCodeType Type { - get => (QrCodeType) GetValue(TypeProperty); + get => (QrCodeType)GetValue(TypeProperty); set => SetValue(TypeProperty, value); } @@ -135,7 +137,7 @@ private static byte[] Generate() { var bytes = new List(); - bytes.AddRange(new byte[] {0x51, 0x52, 0x52, 0x00}); + bytes.AddRange(new byte[] { 0x51, 0x52, 0x52, 0x00 }); return bytes.ToArray(); } @@ -146,4 +148,4 @@ private static byte[] Encode(string data, QrCodeEncoding encoding) return bytes.ToArray(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/Rating.bmp b/RevitLookup.UI/Controls/Rating.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e1392ec5a82c2fb9ea911908f0d383ed6ec575a2 GIT binary patch literal 824 zcma)&F%p6>5JjVwHjb4?@C1%^D8RxQhk~9)FCxsa?ZlUXgU8BE#&p1#z#*jOkO^Ge!eju D`;rUC literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/Rating.cs b/RevitLookup.UI/Controls/Rating.cs index 333d5f02f..84b8ff8d7 100644 --- a/RevitLookup.UI/Controls/Rating.cs +++ b/RevitLookup.UI/Controls/Rating.cs @@ -3,45 +3,47 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.ComponentModel; +using System.Drawing; using System.Windows; -using System.Windows.Controls; -using RevitLookup.UI.Common; namespace RevitLookup.UI.Controls; /// -/// Displays the rating scale with interactions. +/// Displays the rating scale with interactions. /// -public class Rating : ContentControl +[ToolboxItem(true)] +[ToolboxBitmap(typeof(Rating), "Rating.bmp")] +public class Rating : System.Windows.Controls.ContentControl { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(nameof(Value), typeof(double), typeof(Rating), new PropertyMetadata(3.0)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), - typeof(SymbolRegular), typeof(Rating), - new PropertyMetadata(SymbolRegular.Star28)); + typeof(Common.SymbolRegular), typeof(Rating), + new PropertyMetadata(Common.SymbolRegular.Star28)); /// - /// User rating. + /// User rating. /// public double Value { - get => (double) GetValue(ValueProperty); + get => (double)GetValue(ValueProperty); set => SetValue(ValueProperty, value); } /// - /// Gets or sets displayed . + /// Gets or sets displayed . /// - public SymbolRegular Icon + public Common.SymbolRegular Icon { - get => (SymbolRegular) GetValue(IconProperty); + get => (Common.SymbolRegular)GetValue(IconProperty); set => SetValue(IconProperty, value); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/SearchBox.cs b/RevitLookup.UI/Controls/SearchBox.cs deleted file mode 100644 index 1e4069502..000000000 --- a/RevitLookup.UI/Controls/SearchBox.cs +++ /dev/null @@ -1,31 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -using System.Windows; -using RevitLookup.UI.Common; - -namespace RevitLookup.UI.Controls; - -/// -/// Lets look for things and other stuff. -/// -public class SearchBox : TextBox -{ - /// - /// Property override for . - /// - // Static constructor. - static SearchBox() - { - FrameworkPropertyMetadata newIconMetadata = new( - SymbolRegular.Search24); - - IconProperty.OverrideMetadata( - typeof(SearchBox), - newIconMetadata); - } - - // TODO: Well, could use some ListBox search logic or something similar -} \ No newline at end of file diff --git a/RevitLookup.UI/Controls/Snackbar.bmp b/RevitLookup.UI/Controls/Snackbar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..21ce384ea68081e7271099558692b87d3e415ece GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZSy)(Kk{6(5FDig@)9d(qSbxdZ{+JwOJLU`VF~@*K~=002ja6=whd literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/Snackbar.cs b/RevitLookup.UI/Controls/Snackbar.cs index 1ffa6681f..9eed9ecb1 100644 --- a/RevitLookup.UI/Controls/Snackbar.cs +++ b/RevitLookup.UI/Controls/Snackbar.cs @@ -3,325 +3,378 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; using System.ComponentModel; +using System.Drawing; +using System.Threading.Tasks; using System.Windows; -using System.Windows.Controls; using System.Windows.Media; using RevitLookup.UI.Common; using RevitLookup.UI.Controls.Interfaces; +using Brush = System.Windows.Media.Brush; +using SystemColors = System.Windows.SystemColors; namespace RevitLookup.UI.Controls; /// -/// Small card with buttons displayed at the bottom for a short time. +/// Snackbar inform user of a process that an app has performed or will perform. It appears temporarily, towards the bottom of the window. /// -public class Snackbar : ContentControl, IIconControl, IAppearanceControl +[ToolboxItem(true)] +[ToolboxBitmap(typeof(Snackbar), "Snackbar.bmp")] +public class Snackbar : System.Windows.Controls.ContentControl, ISnackbarControl, IIconControl, IAppearanceControl { + private readonly EventIdentifier _eventIdentifier; + /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IsShownProperty = DependencyProperty.Register(nameof(IsShown), typeof(bool), typeof(Snackbar), new PropertyMetadata(false)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TimeoutProperty = DependencyProperty.Register(nameof(Timeout), typeof(int), typeof(Snackbar), new PropertyMetadata(2000)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(SymbolRegular), typeof(Snackbar), new PropertyMetadata(SymbolRegular.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconFilledProperty = DependencyProperty.Register(nameof(IconFilled), typeof(bool), typeof(Snackbar), new PropertyMetadata(false)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.Register(nameof(IconForeground), + public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.Register( + nameof(IconForeground), typeof(Brush), typeof(Snackbar), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, FrameworkPropertyMetadataOptions.Inherits)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(Snackbar), new PropertyMetadata(string.Empty)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty MessageProperty = DependencyProperty.Register(nameof(Message), typeof(string), typeof(Snackbar), new PropertyMetadata(string.Empty)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty MessageForegroundProperty = DependencyProperty.Register(nameof(MessageForeground), + public static readonly DependencyProperty MessageForegroundProperty = DependencyProperty.Register( + nameof(MessageForeground), typeof(Brush), typeof(Snackbar), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, FrameworkPropertyMetadataOptions.Inherits)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty AppearanceProperty = DependencyProperty.Register(nameof(Appearance), - typeof(Common.Appearance), typeof(Snackbar), - new PropertyMetadata(Common.Appearance.Secondary)); + typeof(ControlAppearance), typeof(Snackbar), + new PropertyMetadata(ControlAppearance.Secondary)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty ShowCloseButtonProperty = DependencyProperty.Register(nameof(ShowCloseButton), + public static readonly DependencyProperty CloseButtonEnabledProperty = DependencyProperty.Register( + nameof(CloseButtonEnabled), typeof(bool), typeof(Snackbar), new PropertyMetadata(true)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty SlideTransformProperty = DependencyProperty.Register(nameof(SlideTransform), + public static readonly DependencyProperty SlideTransformProperty = DependencyProperty.Register( + nameof(SlideTransform), typeof(TranslateTransform), typeof(Snackbar), new PropertyMetadata(new TranslateTransform())); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty ButtonCloseCommandProperty = - DependencyProperty.Register(nameof(ButtonCloseCommand), + public static readonly DependencyProperty TemplateButtonCommandProperty = + DependencyProperty.Register(nameof(TemplateButtonCommand), typeof(IRelayCommand), typeof(Snackbar), new PropertyMetadata(null)); - /// - /// Event triggered when opens. - /// - public static readonly RoutedEvent OpenedEvent = EventManager.RegisterRoutedEvent(nameof(Opened), RoutingStrategy.Bubble, typeof(RoutedSnackbarEvent), typeof(Snackbar)); - - /// - /// Event triggered when opens. - /// - public static readonly RoutedEvent ClosedEvent = EventManager.RegisterRoutedEvent(nameof(Closed), RoutingStrategy.Bubble, typeof(RoutedSnackbarEvent), typeof(Snackbar)); - - private readonly EventIdentifier _identifier = new(); + /// + public bool IsShown + { + get => (bool)GetValue(IsShownProperty); + protected set => SetValue(IsShownProperty, value); + } - /// - /// Creates new instance and sets default . - /// - public Snackbar() + /// + public int Timeout { - SetValue(ButtonCloseCommandProperty, new RelayCommand(o => HideComponentAsync(0).GetAwaiter())); + get => (int)GetValue(TimeoutProperty); + set => SetValue(TimeoutProperty, value); } - /// - /// Gets or sets information whether the snackbar should be displayed. - /// - public bool IsShown + /// + [Bindable(true), Category("Appearance")] + public SymbolRegular Icon { - get => (bool) GetValue(IsShownProperty); - set => SetValue(IsShownProperty, value); + get => (SymbolRegular)GetValue(IconProperty); + set => SetValue(IconProperty, value); } - /// - /// Time for which the snackbar is to be displayed. - /// - public int Timeout + /// + [Bindable(true), Category("Appearance")] + public bool IconFilled { - get => (int) GetValue(TimeoutProperty); - set => SetValue(TimeoutProperty, value); + get => (bool)GetValue(IconFilledProperty); + set => SetValue(IconFilledProperty, value); } /// - /// Foreground of the . + /// Foreground of the . /// - [Bindable(true)] - [Category("Appearance")] + [Bindable(true), Category("Appearance")] public Brush IconForeground { - get => (Brush) GetValue(IconForegroundProperty); + get => (Brush)GetValue(IconForegroundProperty); set => SetValue(IconForegroundProperty, value); } - /// - /// Gets or sets the text displayed on the top of the snackbar. - /// + /// public string Title { - get => (string) GetValue(TitleProperty); + get => (string)GetValue(TitleProperty); set => SetValue(TitleProperty, value); } - /// - /// Gets or sets the text displayed on the bottom of the snackbar. - /// + /// public string Message { - get => (string) GetValue(MessageProperty); + get => (string)GetValue(MessageProperty); set => SetValue(MessageProperty, value); } /// - /// Foreground of the . + /// Foreground of the . /// - [Bindable(true)] - [Category("Appearance")] + [Bindable(true), Category("Appearance")] public Brush MessageForeground { - get => (Brush) GetValue(MessageForegroundProperty); + get => (Brush)GetValue(MessageForegroundProperty); set => SetValue(MessageForegroundProperty, value); } - /// - /// Gets or sets a value indicating whether the close button should be visible. - /// - public bool ShowCloseButton + /// + [Bindable(true), Category("Appearance")] + public ControlAppearance Appearance + { + get => (ControlAppearance)GetValue(AppearanceProperty); + set => SetValue(AppearanceProperty, value); + } + + /// + public bool CloseButtonEnabled { - get => (bool) GetValue(ShowCloseButtonProperty); - set => SetValue(ShowCloseButtonProperty, value); + get => (bool)GetValue(CloseButtonEnabledProperty); + set => SetValue(CloseButtonEnabledProperty, value); } /// - /// Gets or sets the transform. + /// Gets or sets the transform. /// public TranslateTransform SlideTransform { - get => (TranslateTransform) GetValue(SlideTransformProperty); + get => (TranslateTransform)GetValue(SlideTransformProperty); set => SetValue(SlideTransformProperty, value); } /// - /// Gets the triggered after clicking close button. + /// Event triggered when opens. /// - public IRelayCommand ButtonCloseCommand => (IRelayCommand) GetValue(ButtonCloseCommandProperty); + public static readonly RoutedEvent OpenedEvent = EventManager.RegisterRoutedEvent(nameof(Opened), + RoutingStrategy.Bubble, typeof(RoutedSnackbarEvent), typeof(Snackbar)); /// - [Bindable(true)] - [Category("Appearance")] - public Common.Appearance Appearance + public event RoutedSnackbarEvent Opened { - get => (Common.Appearance) GetValue(AppearanceProperty); - set => SetValue(AppearanceProperty, value); + add => AddHandler(OpenedEvent, value); + remove => RemoveHandler(OpenedEvent, value); } + /// + /// Event triggered when opens. + /// + public static readonly RoutedEvent ClosedEvent = EventManager.RegisterRoutedEvent(nameof(Closed), + RoutingStrategy.Bubble, typeof(RoutedSnackbarEvent), typeof(Snackbar)); + /// - [Bindable(true)] - [Category("Appearance")] - public SymbolRegular Icon + public event RoutedSnackbarEvent Closed { - get => (SymbolRegular) GetValue(IconProperty); - set => SetValue(IconProperty, value); + add => AddHandler(ClosedEvent, value); + remove => RemoveHandler(ClosedEvent, value); } + /// + /// Gets the triggered after clicking close button. + /// + public IRelayCommand TemplateButtonCommand => (IRelayCommand)GetValue(TemplateButtonCommandProperty); + + /// - [Bindable(true)] - [Category("Appearance")] - public bool IconFilled + public Snackbar() { - get => (bool) GetValue(IconFilledProperty); - set => SetValue(IconFilledProperty, value); + _eventIdentifier = new EventIdentifier(); + + SetValue(TemplateButtonCommandProperty, new RelayCommand(o => OnTemplateButtonClick(this, o))); } - /// - /// Add / Remove handler. - /// - public event RoutedSnackbarEvent Opened + /// + public bool Show() { - add => AddHandler(OpenedEvent, value); - remove => RemoveHandler(OpenedEvent, value); +#pragma warning disable CS4014 + ShowComponentAsync(); +#pragma warning restore CS4014 + + return true; } - /// - /// Add / Remove handler. - /// - public event RoutedSnackbarEvent Closed + /// + public bool Show(string title) { - add => AddHandler(ClosedEvent, value); - remove => RemoveHandler(ClosedEvent, value); +#pragma warning disable CS4014 + ShowComponentAsync(title); +#pragma warning restore CS4014 + + return true; } - /// - /// Shows the for the amount of time specified in . - /// - public void Show() + /// + public bool Show(string title, string message) { - ShowComponentAsync(string.Empty, string.Empty).GetAwaiter(); +#pragma warning disable CS4014 + ShowComponentAsync(title, message); +#pragma warning restore CS4014 + + return true; } - /// - /// Sets and , then shows the for the amount of time specified in . - /// - public void Show(string title, string message) + /// + public bool Show(string title, string message, SymbolRegular icon) { - ShowComponentAsync(title, message).GetAwaiter(); +#pragma warning disable CS4014 + ShowComponentAsync(title, message, icon); +#pragma warning restore CS4014 + + return true; } - /// - /// Asynchronously shows the for the amount of time specified in . - /// + /// public async Task ShowAsync() + => await ShowComponentAsync(); + + /// + public async Task ShowAsync(string title) + => await ShowComponentAsync(title); + + /// + public async Task ShowAsync(string title, string message) + => await ShowComponentAsync(title, message); + + /// + public async Task ShowAsync(string title, string message, SymbolRegular icon) + => await ShowComponentAsync(title, message, icon); + + /// + public bool Hide() { - return await ShowComponentAsync(string.Empty, string.Empty); +#pragma warning disable CS4014 + HideComponentAsync(0); +#pragma warning restore CS4014 + + return true; } - /// - /// Asynchronously sets and , then shows the for the amount of time specified in . - /// - public async Task ShowAsync(string title, string message) + /// + public async Task HideAsync() { - return await ShowComponentAsync(title, message); + return await HideComponentAsync(0); } /// - /// Hides . + /// Triggered by clicking a button in the control template. /// - public void Hide() + /// Sender of the click event. + /// Additional parameters. + protected virtual async void OnTemplateButtonClick(object sender, object parameter) { - HideComponentAsync(0).GetAwaiter(); + if (parameter is not string parameterString) + return; + + if (parameterString == "close") + await HideAsync(); } /// - /// Hides after provided timeout. + /// This virtual method is called when is opening and it raises the . /// - public void Hide(int timeout) + protected virtual void OnOpened() { - HideComponentAsync(timeout).GetAwaiter(); + RaiseEvent(new RoutedEventArgs( + OpenedEvent, + this)); } /// - /// Asynchronously hides . + /// This virtual method is called when is closing and it raises the . /// - public async Task HideAsync() + protected virtual void OnClosed() { - return await HideComponentAsync(0); + RaiseEvent(new RoutedEventArgs( + ClosedEvent, + this)); } - /// - /// Asynchronously ides after provided timeout. - /// - public async Task HideAsync(int timeout) + private async Task ShowComponentAsync() { - return await HideComponentAsync(timeout); + await HideIfVisible(); + + IsShown = true; + + OnOpened(); + + if (Timeout > 0) + await HideComponentAsync(Timeout); + + return true; } - /// - /// This virtual method is called by or to reveal the . - /// - protected virtual async Task ShowComponentAsync(string title, string message) + private async Task ShowComponentAsync(string title) { - if (IsShown) - { - await HideComponentAsync(0); + await HideIfVisible(); - await Task.Delay(300); - } + Title = title; + IsShown = true; + + OnOpened(); + + if (Timeout > 0) + await HideComponentAsync(Timeout); - if (!string.IsNullOrWhiteSpace(title)) - Title = title; + return true; + } - if (!string.IsNullOrWhiteSpace(message)) - Message = message; + private async Task ShowComponentAsync(string title, string message) + { + await HideIfVisible(); + Title = title; + Message = message; IsShown = true; OnOpened(); @@ -332,10 +385,25 @@ protected virtual async Task ShowComponentAsync(string title, string messa return true; } - /// - /// This virtual method is called by or to collapse the . - /// - protected virtual async Task HideComponentAsync(int timeout) + private async Task ShowComponentAsync(string title, string message, SymbolRegular icon) + { + await HideIfVisible(); + + Title = title; + Message = message; + Icon = icon; + + IsShown = true; + + OnOpened(); + + if (Timeout > 0) + await HideComponentAsync(Timeout); + + return true; + } + + private async Task HideComponentAsync(int timeout) { if (!IsShown) return false; @@ -343,14 +411,14 @@ protected virtual async Task HideComponentAsync(int timeout) if (timeout < 1) IsShown = false; - var currentEvent = _identifier.GetNext(); + var currentEvent = _eventIdentifier.GetNext(); await Task.Delay(timeout); if (Application.Current == null) return false; - if (!_identifier.IsEqual(currentEvent)) + if (!_eventIdentifier.IsEqual(currentEvent)) return false; IsShown = false; @@ -360,21 +428,13 @@ protected virtual async Task HideComponentAsync(int timeout) return true; } - /// - /// This virtual method is called when is opening and it raises the . - /// - protected virtual void OnOpened() + private async Task HideIfVisible() { - var newEvent = new RoutedEventArgs(OpenedEvent, this); - RaiseEvent(newEvent); - } + if (!IsShown) + return; - /// - /// This virtual method is called when is closing and it raises the . - /// - protected virtual void OnClosed() - { - var newEvent = new RoutedEventArgs(ClosedEvent, this); - RaiseEvent(newEvent); + await HideComponentAsync(0); + + await Task.Delay(300); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/SplitButton.cs b/RevitLookup.UI/Controls/SplitButton.cs new file mode 100644 index 000000000..a95e0d0a2 --- /dev/null +++ b/RevitLookup.UI/Controls/SplitButton.cs @@ -0,0 +1,13 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Controls; + +/// +/// The is a , but with an addition execution hit target. +/// +public class SplitButton : DropDownButton +{ +} diff --git a/RevitLookup.UI/Controls/States/ThumbRateState.cs b/RevitLookup.UI/Controls/States/ThumbRateState.cs new file mode 100644 index 000000000..2eafdf81c --- /dev/null +++ b/RevitLookup.UI/Controls/States/ThumbRateState.cs @@ -0,0 +1,27 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Controls.States; + +/// +/// States of the control. +/// +public enum ThumbRateState +{ + /// + /// No thumb has been clicked. + /// + None, + + /// + /// The thumb up has been clicked. + /// + Liked, + + /// + /// The thumb down has been clicked. + /// + Disliked +} diff --git a/RevitLookup.UI/Controls/SymbolIcon.bmp b/RevitLookup.UI/Controls/SymbolIcon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4fe46c317b076b931c584ed319707350f5ecd9e3 GIT binary patch literal 824 zcma))ziI+O5QkS&+K5#i!6yjT_I820>Y4+EdxN`5TW#(MVxv!?No)_2JVR8_Ks-zu zTm9Gx!)Ow4*j;`z^X=~JpLVBpvemUPm)Aj05D*T^Jyh%nm)}Rg+bto1^`oD*L-_<9rXM6-VnH&`jaO+ z8V={P84aN@!tz?rdbN(CNHE05W-Hp(W6!&MUj{)ymWIF;-k#UqC)w#_0*Q?u#=5xP lr#|kL? -/// Represents a text element containing an icon glyph. +/// Represents a text element containing an icon glyph. /// -/// https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.symbolicon?view=winrt-22000 -public class SymbolIcon : Label +///https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.symbolicon?view=winrt-22000 +[ToolboxItem(true)] +[ToolboxBitmap(typeof(SymbolIcon), "SymbolIcon.bmp")] +public class SymbolIcon : System.Windows.Controls.Control { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty SymbolProperty = DependencyProperty.Register(nameof(Symbol), - typeof(SymbolRegular), typeof(SymbolIcon), - new PropertyMetadata(SymbolRegular.Empty, OnGlyphChanged)); + typeof(Common.SymbolRegular), typeof(SymbolIcon), + new PropertyMetadata(Common.SymbolRegular.Empty, OnGlyphChanged)); /// - /// property for . + /// Property for . /// public static readonly DependencyProperty RawSymbolProperty = DependencyProperty.Register(nameof(RawSymbol), typeof(string), typeof(SymbolIcon), new PropertyMetadata("\uEA01")); /// - /// property for . + /// Property for . /// public static readonly DependencyProperty FilledProperty = DependencyProperty.Register(nameof(Filled), typeof(bool), typeof(SymbolIcon), new PropertyMetadata(false, OnGlyphChanged)); /// - /// Gets or sets displayed . + /// Gets or sets displayed . /// - public SymbolRegular Symbol + public Common.SymbolRegular Symbol { - get => (SymbolRegular) GetValue(SymbolProperty); + get => (Common.SymbolRegular)GetValue(SymbolProperty); set => SetValue(SymbolProperty, value); } /// - /// Gets or sets displayed as . + /// Gets or sets displayed as . /// - public string RawSymbol => (string) GetValue(RawSymbolProperty); + public string RawSymbol + { + get => (string)GetValue(RawSymbolProperty); + } /// - /// Defines whether or not we should use the . + /// Defines whether or not we should use the . /// public bool Filled { - get => (bool) GetValue(FilledProperty); + get => (bool)GetValue(FilledProperty); set => SetValue(FilledProperty, value); } @@ -62,9 +68,9 @@ private static void OnGlyphChanged(DependencyObject dependency, DependencyProper if (dependency is not SymbolIcon control) return; - if ((bool) control.GetValue(FilledProperty)) + if ((bool)control.GetValue(FilledProperty)) control.SetValue(RawSymbolProperty, control.Symbol.Swap().GetString()); else control.SetValue(RawSymbolProperty, control.Symbol.GetString()); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/TextBox.cs b/RevitLookup.UI/Controls/TextBox.cs index 02fe923cf..3a8d83717 100644 --- a/RevitLookup.UI/Controls/TextBox.cs +++ b/RevitLookup.UI/Controls/TextBox.cs @@ -3,44 +3,45 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; using System.Windows; using System.Windows.Controls; -using System.Windows.Media; -using RevitLookup.UI.Common; using RevitLookup.UI.Controls.Interfaces; +using Brush = System.Windows.Media.Brush; +using SystemColors = System.Windows.SystemColors; -// TODO: Add optional X icon to clear stuff in input +// TODO: Fix clear button namespace RevitLookup.UI.Controls; /// -/// Extended with additional parameters like . +/// Extended with additional parameters like . /// public class TextBox : System.Windows.Controls.TextBox, IIconControl { /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), - typeof(SymbolRegular), typeof(TextBox), - new PropertyMetadata(SymbolRegular.Empty)); + typeof(Common.SymbolRegular), typeof(TextBox), + new PropertyMetadata(Common.SymbolRegular.Empty)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty IconPositionProperty = DependencyProperty.Register( - nameof(IconPosition), - typeof(ElementPosition), typeof(TextBox), - new PropertyMetadata(ElementPosition.Left)); + public static readonly DependencyProperty IconPlacementProperty = DependencyProperty.Register( + nameof(IconPlacement), + typeof(Common.ElementPlacement), typeof(TextBox), + new PropertyMetadata(Common.ElementPlacement.Left)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconFilledProperty = DependencyProperty.Register(nameof(IconFilled), typeof(bool), typeof(TextBox), new PropertyMetadata(false)); /// - /// DependencyProperty for property. + /// DependencyProperty for property. /// public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.RegisterAttached( @@ -48,91 +49,183 @@ public class TextBox : System.Windows.Controls.TextBox, IIconControl typeof(Brush), typeof(TextBox), new FrameworkPropertyMetadata( - Brushes.Black, - FrameworkPropertyMetadataOptions.AffectsRender | - FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender | + SystemColors.ControlTextBrush, FrameworkPropertyMetadataOptions.Inherits)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty PlaceholderProperty = DependencyProperty.Register(nameof(Placeholder), + public static readonly DependencyProperty PlaceholderTextProperty = DependencyProperty.Register(nameof(PlaceholderText), typeof(string), typeof(TextBox), new PropertyMetadata(string.Empty)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty PlaceholderVisibleProperty = DependencyProperty.Register( - nameof(PlaceholderVisible), + public static readonly DependencyProperty PlaceholderEnabledProperty = DependencyProperty.Register( + nameof(PlaceholderEnabled), typeof(bool), typeof(TextBox), new PropertyMetadata(true)); /// - /// Creates a new instance and assigns default events. + /// Property for . /// - public TextBox() + public static readonly DependencyProperty ClearButtonEnabledProperty = DependencyProperty.Register(nameof(ClearButtonEnabled), + typeof(bool), typeof(TextBox), new PropertyMetadata(true)); + + /// + /// Property for . + /// + public static readonly DependencyProperty ShowClearButtonProperty = DependencyProperty.Register(nameof(ShowClearButton), + typeof(bool), typeof(TextBox), new PropertyMetadata(false)); + + /// + /// Property for . + /// + public static readonly DependencyProperty TemplateButtonCommandProperty = + DependencyProperty.Register(nameof(TemplateButtonCommand), + typeof(Common.IRelayCommand), typeof(TextBox), new PropertyMetadata(null)); + + /// + public Common.SymbolRegular Icon { - TextChanged += TextBox_TextChanged; + get => (Common.SymbolRegular)GetValue(IconProperty); + set => SetValue(IconProperty, value); } /// - /// Defines which side the icon should be placed on. + /// Defines which side the icon should be placed on. /// - public ElementPosition IconPosition + public Common.ElementPlacement IconPlacement { - get => (ElementPosition) GetValue(IconPositionProperty); - set => SetValue(IconPositionProperty, value); + get => (Common.ElementPlacement)GetValue(IconPlacementProperty); + set => SetValue(IconPlacementProperty, value); + } + + /// + public bool IconFilled + { + get => (bool)GetValue(IconFilledProperty); + set => SetValue(IconFilledProperty, value); } /// - /// The Foreground property specifies the foreground brush of an element's . + /// The Foreground property specifies the foreground brush of an element's . /// public Brush IconForeground { - get => (Brush) GetValue(IconForegroundProperty); + get => (Brush)GetValue(IconForegroundProperty); set => SetValue(IconForegroundProperty, value); } /// - /// Gets or sets numbers pattern. + /// Gets or sets numbers pattern. + /// + public string PlaceholderText + { + get => (string)GetValue(PlaceholderTextProperty); + set => SetValue(PlaceholderTextProperty, value); + } + + /// + /// Gets or sets a value determining whether to display the placeholder. + /// + public bool PlaceholderEnabled + { + get => (bool)GetValue(PlaceholderEnabledProperty); + set => SetValue(PlaceholderEnabledProperty, value); + } + + /// + /// Gets or sets a value determining whether to enable the clear button. + /// + public bool ClearButtonEnabled + { + get => (bool)GetValue(ClearButtonEnabledProperty); + set => SetValue(ClearButtonEnabledProperty, value); + } + + /// + /// Gets or sets a value determining whether to show the clear button when is focused. /// - public string Placeholder + public bool ShowClearButton { - get => (string) GetValue(PlaceholderProperty); - set => SetValue(PlaceholderProperty, value); + get => (bool)GetValue(ShowClearButtonProperty); + protected set => SetValue(ShowClearButtonProperty, value); } /// - /// Gets or sets value determining whether to display the placeholder. + /// Command triggered after clicking the button. /// - public bool PlaceholderVisible + public Common.IRelayCommand TemplateButtonCommand => (Common.IRelayCommand)GetValue(TemplateButtonCommandProperty); + + /// + /// Creates a new instance and assigns default events. + /// + public TextBox() { - get => (bool) GetValue(PlaceholderVisibleProperty); - set => SetValue(PlaceholderVisibleProperty, value); + SetValue(TemplateButtonCommandProperty, new Common.RelayCommand(o => OnTemplateButtonClick(this, o))); } /// - public SymbolRegular Icon + protected override void OnTextChanged(TextChangedEventArgs e) { - get => (SymbolRegular) GetValue(IconProperty); - set => SetValue(IconProperty, value); + base.OnTextChanged(e); + + if (PlaceholderEnabled && Text.Length > 0) + PlaceholderEnabled = false; + + if (!PlaceholderEnabled && Text.Length < 1) + PlaceholderEnabled = true; + + RevealClearButton(); } /// - public bool IconFilled + protected override void OnGotFocus(RoutedEventArgs e) { - get => (bool) GetValue(IconFilledProperty); - set => SetValue(IconFilledProperty, value); + base.OnGotFocus(e); + + RevealClearButton(); } - private void TextBox_TextChanged(object sender, TextChangedEventArgs e) + /// + protected override void OnLostFocus(RoutedEventArgs e) + { + base.OnLostFocus(e); + + HideClearButton(); + } + + /// + /// Triggered by clicking a button in the control template. + /// + /// Sender of the click event. + /// Additional parameters. + protected virtual void OnTemplateButtonClick(object sender, object parameter) { - if (sender is not TextBox control) + if (parameter == null) return; - if (PlaceholderVisible && control.Text.Length > 0) - PlaceholderVisible = false; + var param = parameter as string ?? string.Empty; - if (!PlaceholderVisible && control.Text.Length < 1) - PlaceholderVisible = true; + switch (param) + { + case "clear": + if (Text.Length > 0) + Text = string.Empty; + + break; + } + } + + private void RevealClearButton() + { + if (ClearButtonEnabled && IsKeyboardFocusWithin) + ShowClearButton = Text.Length > 0; + } + + private void HideClearButton() + { + if (ClearButtonEnabled && !IsKeyboardFocusWithin && ShowClearButton) + ShowClearButton = false; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/ThumbRate.bmp b/RevitLookup.UI/Controls/ThumbRate.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a55dcd48892695cd298dfd550518f0fe293161b0 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTM!`uP3>9N{qyuEq%o00psX z0g5B3LSbTR!J`~2 bG%N5chG<0ALJRfCz97bYxT~-#W?%pS*W|Qf literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/ThumbRate.cs b/RevitLookup.UI/Controls/ThumbRate.cs new file mode 100644 index 000000000..7a9b86561 --- /dev/null +++ b/RevitLookup.UI/Controls/ThumbRate.cs @@ -0,0 +1,110 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.ComponentModel; +using System.Drawing; +using System.Windows; +using RevitLookup.UI.Controls.States; + +namespace RevitLookup.UI.Controls; + +/// +/// Allows to rate positively or negatively by clicking on one of the thumbs. +/// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(ThumbRate), "ThumbRate.bmp")] +public class ThumbRate : System.Windows.Controls.Control +{ + /// + /// Property for . + /// + public static readonly DependencyProperty StateProperty = DependencyProperty.Register(nameof(State), + typeof(ThumbRateState), typeof(ThumbRate), + new PropertyMetadata(ThumbRateState.None, OnStateChanged)); + + /// + /// Event property for . + /// + public static readonly RoutedEvent StateChangedEvent = EventManager.RegisterRoutedEvent(nameof(StateChanged), + RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ThumbRate)); + + /// + /// Occurs when is changed. + /// + public event RoutedEventHandler StateChanged + { + add => AddHandler(StateChangedEvent, value); + remove => RemoveHandler(StateChangedEvent, value); + } + + /// + /// Property for . + /// + public static readonly DependencyProperty TemplateButtonCommandProperty = + DependencyProperty.Register(nameof(TemplateButtonCommand), + typeof(Common.IRelayCommand), typeof(ThumbRate), new PropertyMetadata(null)); + + /// + /// Gets or sets the value determining the current state of the control. + /// + public ThumbRateState State + { + get => (ThumbRateState)GetValue(StateProperty); + set => SetValue(StateProperty, value); + } + + /// + /// Command triggered after clicking the button. + /// + public Common.IRelayCommand TemplateButtonCommand => (Common.IRelayCommand)GetValue(TemplateButtonCommandProperty); + + /// + /// Creates new instance and attaches . + /// + public ThumbRate() + { + SetValue(TemplateButtonCommandProperty, new Common.RelayCommand(o => OnButtonClick(this, o))); + } + + /// + /// Triggered by clicking a button in the control template. + /// + /// Sender of the click event. + /// Additional parameters. + protected virtual void OnButtonClick(object sender, object parameter) + { + if (parameter is not string) + return; + + var param = parameter as string; + + switch (param) + { + case "up": + State = State == ThumbRateState.Liked ? ThumbRateState.None : ThumbRateState.Liked; + break; + + case "down": + State = State == ThumbRateState.Disliked ? ThumbRateState.None : ThumbRateState.Disliked; + break; + } + } + + /// + /// This virtual method is called when is changed. + /// + protected virtual void OnStateChanged(ThumbRateState previousState, ThumbRateState currentState) + { + RaiseEvent(new RoutedEventArgs(StateChangedEvent, this)); + } + + private static void OnStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not ThumbRate thumbRate) + return; + + thumbRate.OnStateChanged((ThumbRateState)e.OldValue, (ThumbRateState)e.NewValue); + } +} diff --git a/RevitLookup.UI/Controls/TitleBar.cs b/RevitLookup.UI/Controls/TitleBar.cs index cfda5ca74..d95f7694e 100644 --- a/RevitLookup.UI/Controls/TitleBar.cs +++ b/RevitLookup.UI/Controls/TitleBar.cs @@ -3,137 +3,196 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; +using System.ComponentModel; using System.Windows; -using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; -using RevitLookup.UI.Common; -using RevitLookup.UI.Interop; +using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Dpi; +using RevitLookup.UI.TitleBar; namespace RevitLookup.UI.Controls; /// -/// Custom navigation buttons for the window. +/// Custom navigation buttons for the window. /// -public class TitleBar : UserControl +[TemplatePart(Name = "PART_MainGrid", Type = typeof(System.Windows.Controls.Grid))] +[TemplatePart(Name = "PART_MaximizeButton", Type = typeof(Button))] +[TemplatePart(Name = "PART_RestoreButton", Type = typeof(Button))] +public class TitleBar : System.Windows.Controls.Control, IThemeControl { + private const string ElementMainGrid = "PART_MainGrid"; + + private const string ElementMaximizeButton = "PART_MaximizeButton"; + + private const string ElementRestoreButton = "PART_RestoreButton"; + + private Window _parent; + + internal Interop.WinDef.POINT _doubleClickPoint; + + internal SnapLayout _snapLayout; + + /// + /// Property for . + /// + public static readonly DependencyProperty ThemeProperty = DependencyProperty.Register(nameof(Theme), + typeof(Appearance.ThemeType), typeof(TitleBar), new PropertyMetadata(Appearance.ThemeType.Unknown)); + /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(TitleBar), new PropertyMetadata(null)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(nameof(Header), typeof(object), typeof(TitleBar), new PropertyMetadata(null)); /// - /// Property for . + /// Property for . + /// + public static readonly DependencyProperty ButtonsForegroundProperty = DependencyProperty.Register( + nameof(ButtonsForeground), + typeof(Brush), typeof(TitleBar), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, + FrameworkPropertyMetadataOptions.Inherits)); + + /// + /// Property for . + /// + public static readonly DependencyProperty ButtonsBackgroundProperty = DependencyProperty.Register( + nameof(ButtonsBackground), + typeof(Brush), typeof(TitleBar), new FrameworkPropertyMetadata(SystemColors.ControlBrush, + FrameworkPropertyMetadataOptions.Inherits)); + + /// + /// Property for . + /// + public static readonly DependencyProperty MinimizeToTrayProperty = DependencyProperty.Register( + nameof(MinimizeToTray), + typeof(bool), typeof(TitleBar), new PropertyMetadata(false)); + + /// + /// Property for . /// public static readonly DependencyProperty UseSnapLayoutProperty = DependencyProperty.Register( nameof(UseSnapLayout), typeof(bool), typeof(TitleBar), new PropertyMetadata(false)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IsMaximizedProperty = DependencyProperty.Register(nameof(IsMaximized), typeof(bool), typeof(TitleBar), new PropertyMetadata(false)); /// - /// Property for . + /// Property for . + /// + public static readonly DependencyProperty ForceShutdownProperty = + DependencyProperty.Register(nameof(ForceShutdown), typeof(bool), typeof(TitleBar), + new PropertyMetadata(false)); + + /// + /// Property for . /// public static readonly DependencyProperty ShowMaximizeProperty = DependencyProperty.Register( nameof(ShowMaximize), typeof(bool), typeof(TitleBar), new PropertyMetadata(true)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty ShowMinimizeProperty = DependencyProperty.Register( nameof(ShowMinimize), typeof(bool), typeof(TitleBar), new PropertyMetadata(true)); /// - /// Property for + /// Property for /// public static readonly DependencyProperty ShowHelpProperty = DependencyProperty.Register( nameof(ShowHelp), typeof(bool), typeof(TitleBar), new PropertyMetadata(false)); /// - /// Property for + /// Property for . + /// + public static readonly DependencyProperty ShowCloseProperty = DependencyProperty.Register( + nameof(ShowClose), + typeof(bool), typeof(TitleBar), new PropertyMetadata(true)); + + /// + /// Property for /// public static readonly DependencyProperty CanMaximizeProperty = DependencyProperty.Register( nameof(CanMaximize), typeof(bool), typeof(TitleBar), new PropertyMetadata(true)); /// - /// Property for . + /// Property for . /// public static readonly DependencyProperty IconProperty = DependencyProperty.Register( nameof(Icon), typeof(ImageSource), typeof(TitleBar), new PropertyMetadata(null)); /// - /// Routed event for . + /// Property for . + /// + public static readonly DependencyProperty TrayProperty = DependencyProperty.Register( + nameof(Tray), + typeof(NotifyIcon), typeof(TitleBar), new PropertyMetadata(null)); + + /// + /// Routed event for . /// public static readonly RoutedEvent CloseClickedEvent = EventManager.RegisterRoutedEvent( nameof(CloseClicked), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TitleBar)); /// - /// Routed event for . + /// Routed event for . /// public static readonly RoutedEvent MaximizeClickedEvent = EventManager.RegisterRoutedEvent( nameof(MaximizeClicked), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TitleBar)); /// - /// Routed event for . + /// Routed event for . /// public static readonly RoutedEvent MinimizeClickedEvent = EventManager.RegisterRoutedEvent( nameof(MinimizeClicked), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TitleBar)); /// - /// Routed event for . + /// Routed event for . /// public static readonly RoutedEvent HelpClickedEvent = EventManager.RegisterRoutedEvent( nameof(HelpClicked), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TitleBar)); /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty ButtonCommandProperty = - DependencyProperty.Register(nameof(ButtonCommand), - typeof(IRelayCommand), typeof(TitleBar), new PropertyMetadata(null)); - - internal User32.POINT _doubleClickPoint; - private Window _parent; + public static readonly DependencyProperty TemplateButtonCommandProperty = + DependencyProperty.Register(nameof(TemplateButtonCommand), + typeof(Common.IRelayCommand), typeof(TitleBar), new PropertyMetadata(null)); - internal SnapLayout _snapLayout; - - /// - /// Creates a new instance of the class and sets the default event. - /// - public TitleBar() + /// + public Appearance.ThemeType Theme { - SetValue(ButtonCommandProperty, new RelayCommand(o => TemplateButton_OnClick(this, o))); - - Loaded += TitleBar_Loaded; + get => (Appearance.ThemeType)GetValue(ThemeProperty); + set => SetValue(ThemeProperty, value); } /// - /// Gets or sets title displayed on the left. + /// Gets or sets title displayed on the left. /// public string Title { - get => (string) GetValue(TitleProperty); + get => (string)GetValue(TitleProperty); set => SetValue(TitleProperty, value); } /// - /// Gets or sets the content displayed in the . + /// Gets or sets the content displayed in the . /// public object Header { @@ -142,90 +201,126 @@ public object Header } /// - /// Gets or sets information whether the use Windows 11 Snap Layout. + /// Foreground of the navigation buttons. + /// + [Bindable(true), Category("Appearance")] + public Brush ButtonsForeground + { + get => (Brush)GetValue(ButtonsForegroundProperty); + set => SetValue(ButtonsForegroundProperty, value); + } + + /// + /// Background of the navigation buttons when hovered. + /// + [Bindable(true), Category("Appearance")] + public Brush ButtonsBackground + { + get => (Brush)GetValue(ButtonsBackgroundProperty); + set => SetValue(ButtonsBackgroundProperty, value); + } + + /// + /// Gets or sets information whether to minimize the application to tray. + /// + public bool MinimizeToTray + { + get => (bool)GetValue(MinimizeToTrayProperty); + set => SetValue(MinimizeToTrayProperty, value); + } + + /// + /// Gets or sets information whether the use Windows 11 Snap Layout. /// public bool UseSnapLayout { - get => (bool) GetValue(UseSnapLayoutProperty); + get => (bool)GetValue(UseSnapLayoutProperty); set => SetValue(UseSnapLayoutProperty, value); } /// - /// Gets or sets information whether the current window is maximized. + /// Gets or sets information whether the current window is maximized. /// public bool IsMaximized { - get => (bool) GetValue(IsMaximizedProperty); + get => (bool)GetValue(IsMaximizedProperty); internal set => SetValue(IsMaximizedProperty, value); } /// - /// Gets or sets information whether to show maximize button. + /// Gets or sets information whether the controls affect main application window. + /// + public bool ForceShutdown + { + get => (bool)GetValue(ForceShutdownProperty); + set => SetValue(ForceShutdownProperty, value); + } + + /// + /// Gets or sets information whether to show maximize button. /// public bool ShowMaximize { - get => (bool) GetValue(ShowMaximizeProperty); + get => (bool)GetValue(ShowMaximizeProperty); set => SetValue(ShowMaximizeProperty, value); } /// - /// Gets or sets information whether to show minimize button. + /// Gets or sets information whether to show minimize button. /// public bool ShowMinimize { - get => (bool) GetValue(ShowMinimizeProperty); + get => (bool)GetValue(ShowMinimizeProperty); set => SetValue(ShowMinimizeProperty, value); } /// - /// Gets or sets information whether to show help button + /// Gets or sets information whether to show help button /// public bool ShowHelp { - get => (bool) GetValue(ShowHelpProperty); + get => (bool)GetValue(ShowHelpProperty); set => SetValue(ShowHelpProperty, value); } /// - /// Enables or disables the maximize functionality if disables the MaximizeActionOverride action won't be called + /// Gets or sets information whether to show close button. + /// + public bool ShowClose + { + get => (bool)GetValue(ShowCloseProperty); + set => SetValue(ShowCloseProperty, value); + } + + /// + /// Enables or disables the maximize functionality if disables the MaximizeActionOverride action won't be called /// public bool CanMaximize { - get => (bool) GetValue(CanMaximizeProperty); + get => (bool)GetValue(CanMaximizeProperty); set => SetValue(CanMaximizeProperty, value); } /// - /// Titlebar icon. + /// Titlebar icon. /// public ImageSource Icon { - get => (ImageSource) GetValue(IconProperty); + get => (ImageSource)GetValue(IconProperty); set => SetValue(IconProperty, value); } /// - /// Command triggered after clicking the titlebar button. + /// Tray icon. /// - public IRelayCommand ButtonCommand => (IRelayCommand) GetValue(ButtonCommandProperty); - - /// - /// Lets you override the behavior of the Maximize/Restore button with an . - /// - public Action MaximizeActionOverride { get; set; } = null; - - /// - /// Lets you override the behavior of the Minimize button with an . - /// - public Action MinimizeActionOverride { get; set; } = null; - - /// - /// Window containing the TitleBar. - /// - internal Window ParentWindow => _parent ??= Window.GetWindow(this); + public NotifyIcon Tray + { + get => (NotifyIcon)GetValue(TrayProperty); + set => SetValue(TrayProperty, value); + } /// - /// Event triggered after clicking close button. + /// Event triggered after clicking close button. /// public event RoutedEventHandler CloseClicked { @@ -234,7 +329,7 @@ public event RoutedEventHandler CloseClicked } /// - /// Event triggered after clicking maximize or restore button. + /// Event triggered after clicking maximize or restore button. /// public event RoutedEventHandler MaximizeClicked { @@ -243,7 +338,7 @@ public event RoutedEventHandler MaximizeClicked } /// - /// Event triggered after clicking minimize button. + /// Event triggered after clicking minimize button. /// public event RoutedEventHandler MinimizeClicked { @@ -252,7 +347,7 @@ public event RoutedEventHandler MinimizeClicked } /// - /// Event triggered after clicking help button + /// Event triggered after clicking help button /// public event RoutedEventHandler HelpClicked { @@ -260,13 +355,101 @@ public event RoutedEventHandler HelpClicked remove => RemoveHandler(HelpClickedEvent, value); } + /// + /// Command triggered after clicking the titlebar button. + /// + public Common.IRelayCommand TemplateButtonCommand => (Common.IRelayCommand)GetValue(TemplateButtonCommandProperty); + + /// + /// Lets you override the behavior of the Maximize/Restore button with an . + /// + public Action MaximizeActionOverride { get; set; } = null; + + /// + /// Lets you override the behavior of the Minimize button with an . + /// + public Action MinimizeActionOverride { get; set; } = null; + + /// + /// Window containing the TitleBar. + /// + internal Window ParentWindow => _parent ??= Window.GetWindow(this); + + /// + /// Creates a new instance of the class and sets the default event. + /// + public TitleBar() + { + SetValue(TemplateButtonCommandProperty, new Common.RelayCommand(o => OnTemplateButtonClick(this, o))); + + Loaded += OnLoaded; + } + + /// + protected override void OnInitialized(EventArgs e) + { + base.OnInitialized(e); + + Theme = Appearance.Theme.GetAppTheme(); + Appearance.Theme.Changed += OnThemeChanged; + } + + protected virtual void OnLoaded(object sender, RoutedEventArgs e) + { + if (ParentWindow != null) + ParentWindow.StateChanged += OnParentWindowStateChanged; + } + + /// + /// Invoked whenever application code or an internal process, + /// such as a rebuilding layout pass, calls the ApplyTemplate method. + /// + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + var mainGrid = GetTemplateChild(ElementMainGrid) as System.Windows.Controls.Grid; + var maximizeButton = GetTemplateChild(ElementMaximizeButton) as Button; + var restoreButton = GetTemplateChild(ElementRestoreButton) as Button; + + if (mainGrid != null) + { + mainGrid.MouseLeftButtonDown += OnMainGridMouseLeftButtonDown; + mainGrid.MouseMove += OnMainGridMouseMove; + } + + if (ShowMaximize && UseSnapLayout && maximizeButton != null && restoreButton != null) + InitializeSnapLayout(maximizeButton, restoreButton); + } + + /// + /// This virtual method is triggered when the app's theme changes. + /// + protected virtual void OnThemeChanged(Appearance.ThemeType currentTheme, Color systemAccent) + { + Theme = currentTheme; + + if (_snapLayout != null) + _snapLayout.Theme = currentTheme; + } + private void CloseWindow() { + if (ForceShutdown) + { + Application.Current.Close(); + + return; + } + ParentWindow.Close(); } private void MinimizeWindow() { + if (MinimizeToTray && Tray.IsRegistered && MinimizeWindowToTray()) + return; + if (MinimizeActionOverride != null) { MinimizeActionOverride(this, _parent); @@ -301,52 +484,84 @@ private void MaximizeWindow() } } - private void InitializeSnapLayout(Button maximizeButton) + private void RestoreWindow() { - if (!SnapLayout.IsSupported()) + if (!CanMaximize) return; - _snapLayout = new SnapLayout(); - _snapLayout.Register(maximizeButton); + if (MaximizeActionOverride != null) + { + MaximizeActionOverride(this, _parent); + + return; + } + + if (ParentWindow.WindowState == WindowState.Normal) + { + IsMaximized = true; + ParentWindow.WindowState = WindowState.Maximized; + } + else + { + IsMaximized = false; + ParentWindow.WindowState = WindowState.Normal; + } } - private void TitleBar_Loaded(object sender, RoutedEventArgs e) + private bool MinimizeWindowToTray() { - // It may look ugly, but at the moment it works surprisingly well - - var maximizeButton = (Button) Template.FindName("ButtonMaximize", this); + if (!Tray.IsRegistered) + return false; - if (maximizeButton != null && UseSnapLayout) - InitializeSnapLayout(maximizeButton); + ParentWindow.WindowState = WindowState.Minimized; + ParentWindow.Hide(); - var rootGrid = (Grid) Template.FindName("RootGrid", this); + return true; + } - if (rootGrid != null) - { - rootGrid.MouseLeftButtonDown += RootGrid_MouseLeftButtonDown; - rootGrid.MouseMove += RootGrid_MouseMove; - } + private void InitializeSnapLayout(Button maximizeButton, Button restoreButton) + { + if (!SnapLayout.IsSupported()) + return; - if (ParentWindow != null) - ParentWindow.StateChanged += ParentWindow_StateChanged; + _snapLayout = SnapLayout.Register(ParentWindow, maximizeButton, restoreButton); + + // Can be taken it from the Template, but honestly - a classic - TODO: + // ButtonsBackground, but + _snapLayout.HoverColorLight = new SolidColorBrush(Color.FromArgb( + (byte)0x1A, + (byte)0x00, + (byte)0x00, + (byte)0x00) + ); + _snapLayout.HoverColorDark = new SolidColorBrush(Color.FromArgb( + (byte)0x17, + (byte)0xFF, + (byte)0xFF, + (byte)0xFF) + ); + + _snapLayout.Theme = Theme; } - private void RootGrid_MouseMove(object sender, MouseEventArgs e) + private void OnMainGridMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton != MouseButtonState.Pressed || ParentWindow == null) return; // prevent firing from double clicking when the mouse never actually moved - User32.GetCursorPos(out var currentMousePos); + Interop.User32.GetCursorPos(out var currentMousePos); - if (currentMousePos.X == _doubleClickPoint.X && currentMousePos.Y == _doubleClickPoint.Y) + if (currentMousePos.x == _doubleClickPoint.x && currentMousePos.y == _doubleClickPoint.y) return; if (IsMaximized) { var screenPoint = PointToScreen(e.MouseDevice.GetPosition(this)); - screenPoint.X /= Dpi.SystemDpiXScale(); - screenPoint.Y /= Dpi.SystemDpiYScale(); + var systemDpi = DpiHelper.GetSystemDpi(); + + screenPoint.X /= systemDpi.DpiScaleX; + screenPoint.Y /= systemDpi.DpiScaleY; // TODO: refine the Left value to be more accurate // - This calculation is good enough using the center @@ -354,7 +569,7 @@ private void RootGrid_MouseMove(object sender, MouseEventArgs e) // how the OS operates. // - It should be set as a % (e.g. screen X / maximized width), // then offset from the left to line up more naturally. - ParentWindow.Left = screenPoint.X - ParentWindow.RestoreBounds.Width * 0.5; + ParentWindow.Left = screenPoint.X - (ParentWindow.RestoreBounds.Width * 0.5); ParentWindow.Top = screenPoint.Y; // style has to be quickly swapped to avoid restore animation delay @@ -370,7 +585,7 @@ private void RootGrid_MouseMove(object sender, MouseEventArgs e) ParentWindow.DragMove(); } - private void ParentWindow_StateChanged(object sender, EventArgs e) + private void OnParentWindowStateChanged(object sender, EventArgs e) { if (ParentWindow == null) return; @@ -379,22 +594,32 @@ private void ParentWindow_StateChanged(object sender, EventArgs e) IsMaximized = ParentWindow.WindowState == WindowState.Maximized; } - private void RootGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + private void OnMainGridMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ClickCount != 2) return; - User32.GetCursorPos(out _doubleClickPoint); + Interop.User32.GetCursorPos(out _doubleClickPoint); MaximizeWindow(); } - private void TemplateButton_OnClick(TitleBar sender, object parameter) + private void OnTemplateButtonClick(TitleBar sender, object parameter) { var command = parameter as string; switch (command) { + case "maximize": + RaiseEvent(new RoutedEventArgs(MaximizeClickedEvent, this)); + MaximizeWindow(); + break; + + case "restore": + RaiseEvent(new RoutedEventArgs(MaximizeClickedEvent, this)); + RestoreWindow(); + break; + case "close": RaiseEvent(new RoutedEventArgs(CloseClickedEvent, this)); CloseWindow(); @@ -405,13 +630,9 @@ private void TemplateButton_OnClick(TitleBar sender, object parameter) MinimizeWindow(); break; - case "maximize": - RaiseEvent(new RoutedEventArgs(MaximizeClickedEvent, this)); - MaximizeWindow(); - break; case "help": RaiseEvent(new RoutedEventArgs(HelpClickedEvent, this)); break; } } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/ToggleSwitch.bmp b/RevitLookup.UI/Controls/ToggleSwitch.bmp new file mode 100644 index 0000000000000000000000000000000000000000..20dc148117625bb9373dfd76eef3f070d5f82477 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTNR^o?i$bO})Hl`B_#eSMwq zf{2I+pfZTTK*b&&9(a|5B!OBW>ItfZE5NTFXz$(IcYugU_4n`I`}qC?5CItwE%?nR oRXxy5h(0m340P1?5N&o-= literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/ToggleSwitch.cs b/RevitLookup.UI/Controls/ToggleSwitch.cs index 870c11b9d..df91dd478 100644 --- a/RevitLookup.UI/Controls/ToggleSwitch.cs +++ b/RevitLookup.UI/Controls/ToggleSwitch.cs @@ -3,11 +3,16 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Windows.Controls.Primitives; +using System.ComponentModel; +using System.Drawing; namespace RevitLookup.UI.Controls; -/// -public class ToggleSwitch : ToggleButton +/// +/// Use to present users with two mutally exclusive options (like on/off). +/// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(ToggleSwitch), "ToggleSwitch.bmp")] +public class ToggleSwitch : System.Windows.Controls.Primitives.ToggleButton { -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/TreeGrid.cs b/RevitLookup.UI/Controls/TreeGrid.cs new file mode 100644 index 000000000..23ea1237e --- /dev/null +++ b/RevitLookup.UI/Controls/TreeGrid.cs @@ -0,0 +1,107 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Windows; + +namespace RevitLookup.UI.Controls; + +/// +/// Work in progress. +/// +public class TreeGrid : System.Windows.Controls.Primitives.Selector +{ + /// + /// Property for . + /// + public static readonly DependencyProperty HeadersProperty = DependencyProperty.Register(nameof(Headers), + typeof(ObservableCollection), typeof(TreeGrid), + new PropertyMetadata(new ObservableCollection { }, OnHeadersChanged)); + + ///// + ///// Property for . + ///// + //public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), + // typeof(object), typeof(TreeGrid), new PropertyMetadata(null, OnContentChanged)); + + /// + /// Content is the data used to generate the child elements of this control. + /// + [Bindable(true)] + public ObservableCollection Headers + { + get => GetValue(HeadersProperty) as ObservableCollection; + set => SetValue(HeadersProperty, value); + } + + ///// + ///// Content is the data used to generate the child elements of this control. + ///// + //[Bindable(true)] + //public object Content + //{ + // get => GetValue(ContentProperty); + // set => SetValue(ContentProperty, value); + //} + + public TreeGrid() + { + var x = new System.Windows.Controls.ContentControl(); + var y = new System.Windows.Controls.ItemsControl(); + var z = new System.Windows.Controls.ListBox(); + } + + ///// + ///// Add an object child to this control + ///// + //void IAddChild.AddChild(object value) + //{ + // AddChild(value); + //} + + //public void AddText(string text) + //{ + // throw new NotImplementedException(); + //} + + ///// + ///// Add an object child to this control + ///// + //protected virtual void AddChild(object value) + //{ + // // if conent is the first child or being cleared, set directly + // if (Content == null || value == null) + // Content = value; + // else + // throw new InvalidOperationException($"{typeof(TreeGrid)} cannot have multiple content"); + //} + + protected virtual void OnHeadersChanged() + { + // Headers changed + } + + protected virtual void OnContentChanged() + { + // Content changed + } + + private static void OnHeadersChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not TreeGrid treeGrid) + return; + + treeGrid.OnHeadersChanged(); + } + + private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not TreeGrid treeGrid) + return; + + treeGrid.OnContentChanged(); + } +} diff --git a/RevitLookup.UI/Controls/TreeGridHeader.cs b/RevitLookup.UI/Controls/TreeGridHeader.cs new file mode 100644 index 000000000..44f60f3a1 --- /dev/null +++ b/RevitLookup.UI/Controls/TreeGridHeader.cs @@ -0,0 +1,69 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.ComponentModel; +using System.Windows; + +namespace RevitLookup.UI.Controls; + +/// +/// Work in progress. +/// +public class TreeGridHeader : FrameworkElement +{ + /// + /// Property for . + /// + public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), + typeof(string), typeof(TreeGridHeader), new PropertyMetadata(string.Empty, OnTitleChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty GroupProperty = DependencyProperty.Register(nameof(Group), + typeof(string), typeof(TreeGridHeader), new PropertyMetadata(string.Empty)); + + /// + /// Gets or sets the title that will be displayed. + /// + public string Title + { + get => (string)GetValue(NameProperty); + set => SetValue(NameProperty, value); + } + + /// + /// Gets or sets the column group name. + /// + [Localizability(LocalizationCategory.NeverLocalize)] + [MergableProperty(false)] + public string Group + { + get => (string)GetValue(GroupProperty); + set => SetValue(GroupProperty, value); + } + + /// + /// This virtual method is called when is changed. + /// + protected virtual void OnTitleChanged() + { + var title = Title; + + if (!string.IsNullOrEmpty(Group) || string.IsNullOrEmpty(title)) + return; + + Group = title.ToLower().Trim(); + } + + private static void OnTitleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not TreeGridHeader header) + return; + + header.OnTitleChanged(); + } +} diff --git a/RevitLookup.UI/Controls/TreeGridItem.cs b/RevitLookup.UI/Controls/TreeGridItem.cs new file mode 100644 index 000000000..109748838 --- /dev/null +++ b/RevitLookup.UI/Controls/TreeGridItem.cs @@ -0,0 +1,14 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Controls; + +/// +/// Work in progress. +/// +public class TreeGridItem : System.Windows.Controls.Control +{ + +} diff --git a/RevitLookup.UI/Controls/TreeViewItem.cs b/RevitLookup.UI/Controls/TreeViewItem.cs new file mode 100644 index 000000000..66e09ce89 --- /dev/null +++ b/RevitLookup.UI/Controls/TreeViewItem.cs @@ -0,0 +1,69 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.ComponentModel; +using System.Windows; +using System.Windows.Media; +using RevitLookup.UI.Common; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Controls; + +/// +/// Extended with properties. +/// +public class TreeViewItem : System.Windows.Controls.TreeViewItem, IIconControl +{ + /// + /// Property for . + /// + public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), + typeof(Common.SymbolRegular), typeof(TreeViewItem), + new PropertyMetadata(Common.SymbolRegular.Empty)); + + /// + /// Property for . + /// + public static readonly DependencyProperty IconFilledProperty = DependencyProperty.Register(nameof(IconFilled), + typeof(bool), typeof(TreeViewItem), new PropertyMetadata(false)); + + /// + /// Property for . + /// + public static readonly DependencyProperty IconForegroundProperty = DependencyProperty.Register(nameof(IconForeground), + typeof(Brush), typeof(TreeViewItem), new FrameworkPropertyMetadata(SystemColors.ControlTextBrush, + FrameworkPropertyMetadataOptions.Inherits)); + + /// + /// Gets or sets displayed . + /// + [Bindable(true), Category("Appearance")] + public Common.SymbolRegular Icon + { + get => (Common.SymbolRegular)GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + /// + /// Defines whether or not we should use the . + /// + [Bindable(true), Category("Appearance")] + public bool IconFilled + { + get => (bool)GetValue(IconFilledProperty); + set => SetValue(IconFilledProperty, value); + } + + ///// + ///// Foreground of the . + ///// + [Bindable(true), Category("Appearance")] + public Brush IconForeground + { + get => (Brush)GetValue(IconForegroundProperty); + set => SetValue(IconForegroundProperty, value); + } +} + diff --git a/RevitLookup.UI/Controls/UiPage.bmp b/RevitLookup.UI/Controls/UiPage.bmp new file mode 100644 index 0000000000000000000000000000000000000000..75010468c26f61d0a090eeed57f7e00ab4f9f297 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTMN`bG)>nhaF#L>vIBgscDf i{sVplG;&luo*)|J;X_P{fX6S8K_nn4B|{W5FaQ7vQ&Ix} literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/UiPage.cs b/RevitLookup.UI/Controls/UiPage.cs new file mode 100644 index 000000000..1b833001d --- /dev/null +++ b/RevitLookup.UI/Controls/UiPage.cs @@ -0,0 +1,95 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows; +using System.Windows.Controls; + +namespace RevitLookup.UI.Controls; + +/// +/// Extended with WPF UI features. +/// +[TemplatePart(Name = "PART_ScrollViewer", Type = typeof(DynamicScrollViewer))] +[ToolboxItem(true)] +[ToolboxBitmap(typeof(UiPage), "UiPage.bmp")] +public class UiPage : Page +{ + /// + /// Template element represented by the PART_Popup name. + /// + private const string ElementScrollViewer = "PART_ScrollViewer"; + + /// + /// Property for . + /// + public static readonly DependencyProperty ScrollableProperty = DependencyProperty.Register(nameof(Scrollable), + typeof(bool), typeof(UiPage), new PropertyMetadata(false)); + + /// + /// Property for . + /// + public static readonly DependencyProperty ScrollHostProperty = DependencyProperty.Register(nameof(ScrollHost), + typeof(ScrollViewer), typeof(UiPage), new PropertyMetadata((ScrollViewer)null)); + + /// + /// Gets or sets a value determining whether the content should be scrollable. + /// If set, will be added to the + /// + [Bindable(true), Category("Appearance")] + public bool Scrollable + { + get => (bool)GetValue(ScrollableProperty); + set => SetValue(ScrollableProperty, value); + } + + /// + /// If the page is , gets a that container the . + /// + [Bindable(false)] + public ScrollViewer ScrollHost + { + get + { + if (!Scrollable) + throw new InvalidOperationException($"{nameof(ScrollHost)} can only be taken from a page that has {nameof(Scrollable)} set to true."); + + return (ScrollViewer)GetValue(ScrollHostProperty); + } + private set => SetValue(ScrollHostProperty, value); + } + + public UiPage() + { + // Define default context... by default. + DataContext = this; + + SetResourceReference(StyleProperty, typeof(UiPage)); + } + + static UiPage() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(UiPage), new FrameworkPropertyMetadata(typeof(UiPage))); + } + + /// + /// Invoked whenever application code or an internal process, + /// such as a rebuilding layout pass, calls the ApplyTemplate method. + /// + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + if (!Scrollable) + return; + + var scrollHost = GetTemplateChild(ElementScrollViewer); + + if (scrollHost is ScrollViewer) + ScrollHost = scrollHost as ScrollViewer; + } +} diff --git a/RevitLookup.UI/Controls/UiWindow.bmp b/RevitLookup.UI/Controls/UiWindow.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6355f5dcf346e007c884351542fe6e599c714de3 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTMN`bG)>nhaF#L>vIBgscDf g{sVplG;$=XCniJ(bNGh($ literal 0 HcmV?d00001 diff --git a/RevitLookup.UI/Controls/UiWindow.cs b/RevitLookup.UI/Controls/UiWindow.cs new file mode 100644 index 000000000..e14cb2cdb --- /dev/null +++ b/RevitLookup.UI/Controls/UiWindow.cs @@ -0,0 +1,267 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows; +using System.Windows.Interop; +using System.Windows.Shell; +using RevitLookup.UI.Appearance; +using RevitLookup.UI.Interop; + +namespace RevitLookup.UI.Controls; + +/// +/// Extended with WPF UI features. +/// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(UiWindow), "UiWindow.bmp")] +public class UiWindow : Window +{ + #region Private properties + + private WindowInteropHelper _interopHelper = null; + + private HwndSource _hwndSource = null; + + #endregion Private properties + + #region Protected properties + + /// + /// Contains helper for accessing this window handle. + /// + protected WindowInteropHelper InteropHelper + { + get => _interopHelper ??= new WindowInteropHelper(this); + } + + /// + /// Container WPF presenter handle. + /// + protected HwndSource HwndSource + { + get => _hwndSource ??= HwndSource.FromHwnd(InteropHelper.Handle); + } + + #endregion Protected properties + + #region Public properties + + /// + /// Property for . + /// + public static readonly DependencyProperty ExtendsContentIntoTitleBarProperty = DependencyProperty.Register( + nameof(ExtendsContentIntoTitleBar), + typeof(bool), typeof(UiWindow), new PropertyMetadata(false, OnExtendsContentIntoTitleBarChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty WindowCornerPreferenceProperty = DependencyProperty.Register( + nameof(WindowCornerPreference), + typeof(WindowCornerPreference), typeof(UiWindow), + new PropertyMetadata(WindowCornerPreference.Round, OnCornerPreferenceChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty WindowBackdropTypeProperty = DependencyProperty.Register( + nameof(WindowBackdropType), + typeof(BackgroundType), typeof(UiWindow), new PropertyMetadata(BackgroundType.None, OnBackdropTypeChanged)); + + /// + /// Gets or sets a value determining whether the content should be extended into title bar. + /// + public bool ExtendsContentIntoTitleBar + { + get => (bool)GetValue(ExtendsContentIntoTitleBarProperty); + set => SetValue(ExtendsContentIntoTitleBarProperty, value); + } + + /// + /// Gets or sets a value determining corner preference for current . + /// + public WindowCornerPreference WindowCornerPreference + { + get => (WindowCornerPreference)GetValue(WindowCornerPreferenceProperty); + set => SetValue(WindowCornerPreferenceProperty, value); + } + + /// + /// Gets or sets a value determining preferred backdrop type for current . + /// + public BackgroundType WindowBackdropType + { + get => (BackgroundType)GetValue(WindowBackdropTypeProperty); + set => SetValue(WindowBackdropTypeProperty, value); + } + + #endregion Public properties + + #region Constructors + + /// + /// Creates new instance and sets default style. + /// + public UiWindow() + { + SetResourceReference(StyleProperty, typeof(UiWindow)); + } + + /// + /// Overrides default properties. + /// + static UiWindow() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(UiWindow), new FrameworkPropertyMetadata(typeof(UiWindow))); + HeightProperty.OverrideMetadata(typeof(UiWindow), new FrameworkPropertyMetadata(600d)); + WidthProperty.OverrideMetadata(typeof(UiWindow), new FrameworkPropertyMetadata(1100d)); + MinHeightProperty.OverrideMetadata(typeof(UiWindow), new FrameworkPropertyMetadata(320d)); + MinWidthProperty.OverrideMetadata(typeof(UiWindow), new FrameworkPropertyMetadata(460d)); + //WindowStyleProperty.OverrideMetadata(typeof(UiWindow), new FrameworkPropertyMetadata(WindowStyle.SingleBorderWindow)); + //AllowsTransparencyProperty.OverrideMetadata(typeof(UiWindow), new FrameworkPropertyMetadata(false)); + } + + #endregion Constructors + + #region Protected methods + + /// + protected override void OnSourceInitialized(EventArgs e) + { + base.OnSourceInitialized(e); + + ApplyWindowCornerPreferenceInternal(WindowCornerPreference); + ApplyWindowBackdropInternal(WindowBackdropType); + ExtendsContentIntoTitleBarInternal(ExtendsContentIntoTitleBar); + } + + /// + /// This virtual method is called when is changed. + /// + protected virtual void OnExtendsContentIntoTitleBarChanged(bool oldValue, bool newValue) + { + if (oldValue == newValue) + return; + + ExtendsContentIntoTitleBarInternal(newValue); + } + + /// + /// Private property callback. + /// + private static void OnExtendsContentIntoTitleBarChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not UiWindow window) + return; + + window.OnExtendsContentIntoTitleBarChanged((bool)e.OldValue, (bool)e.NewValue); + } + + /// + /// This virtual method is called when is changed. + /// + protected virtual void OnCornerPreferenceChanged(WindowCornerPreference oldValue, WindowCornerPreference newValue) + { + if (oldValue == newValue) + return; + + ApplyWindowCornerPreferenceInternal(newValue); + } + + /// + /// Private property callback. + /// + private static void OnCornerPreferenceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not UiWindow window) + return; + + window.OnCornerPreferenceChanged((WindowCornerPreference)e.OldValue, (WindowCornerPreference)e.NewValue); + } + + /// + /// This virtual method is called when is changed. + /// + protected virtual void OnBackdropTypeChanged(BackgroundType oldValue, BackgroundType newValue) + { + if (oldValue == newValue) + return; + + ApplyWindowBackdropInternal(newValue); + } + + /// + /// Private property callback. + /// + private static void OnBackdropTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not UiWindow window) + return; + + window.OnBackdropTypeChanged((BackgroundType)e.OldValue, (BackgroundType)e.NewValue); + } + + #endregion Protected methods + + #region Private methods + + private void ApplyWindowCornerPreferenceInternal(WindowCornerPreference cornerPreference) + { + if (InteropHelper.Handle == IntPtr.Zero) + return; + + UnsafeNativeMethods.ApplyWindowCornerPreference(InteropHelper.Handle, cornerPreference); + } + + private void ApplyWindowBackdropInternal(BackgroundType backdropType) + { + if (backdropType == BackgroundType.Unknown || backdropType == BackgroundType.None) + { + // Removes backdrop and tries to restore default background + Appearance.Background.Remove(this); + + return; + } + + if (!ExtendsContentIntoTitleBar) + throw new InvalidOperationException($"Cannot apply backdrop effect if {nameof(ExtendsContentIntoTitleBar)} is false."); + + if (backdropType == BackgroundType.Acrylic && !Win32.Utilities.IsOSWindows11Insider1OrNewer && + !AllowsTransparency) + throw new InvalidOperationException("In the Windows system below 22523 build, the Acrylic effect cannot be applied if the Window does not have AllowsTransparency set to True."); + + // Set backdrop effect and remove background from window and it's composition area + Appearance.Background.Apply(this, WindowBackdropType); + } + + private void ExtendsContentIntoTitleBarInternal(bool extendContent) + { + if (!extendContent) + { + WindowChrome.SetWindowChrome(this, null); + + return; + } + + UnsafeNativeMethods.RemoveWindowTitlebar(this); + + // TODO: Rewrite custom window chrome + + WindowChrome.SetWindowChrome(this, + new WindowChrome + { + CaptionHeight = 1, + CornerRadius = new CornerRadius(4), + GlassFrameThickness = new Thickness(-1), + ResizeBorderThickness = new Thickness(4), + UseAeroCaptionButtons = false + }); + } + + #endregion Private methods +} diff --git a/RevitLookup.UI/Controls/VirtualizingGridView.cs b/RevitLookup.UI/Controls/VirtualizingGridView.cs new file mode 100644 index 000000000..fbc085be1 --- /dev/null +++ b/RevitLookup.UI/Controls/VirtualizingGridView.cs @@ -0,0 +1,103 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Based on VirtualizingWrapPanel created by S. Bäumlisberger licensed under MIT license. +// https://github.com/sbaeumlisberger/VirtualizingWrapPanel +// Copyright (C) S. Bäumlisberger, Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using RevitLookup.UI.Common; + +namespace RevitLookup.UI.Controls; + +/// +/// Simple control that displays a gird of items. Depending on the orientation, the items are either stacked horizontally or vertically +/// until the items are wrapped to the next row or column. The control is using virtualization to support large amount of items. +/// In order to work properly all items must have the same size. +/// Based on . +/// +public class VirtualizingGridView : ListView +{ + /// + /// Property for . + /// + public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register(nameof(Orientation), + typeof(Orientation), typeof(VirtualizingGridView), + new PropertyMetadata(Orientation.Vertical)); + + /// + /// Property for . + /// + public static readonly DependencyProperty SpacingModeProperty = DependencyProperty.Register(nameof(SpacingMode), + typeof(SpacingMode), typeof(VirtualizingGridView), + new PropertyMetadata(SpacingMode.Uniform)); + + /// + /// Property for . + /// + public static readonly DependencyProperty StretchItemsProperty = DependencyProperty.Register(nameof(StretchItems), + typeof(bool), typeof(VirtualizingGridView), + new PropertyMetadata(false)); + + /// + /// Gets or sets a value that specifies the orientation in which items are arranged. The default value is . + /// + public Orientation Orientation + { + get => (Orientation)GetValue(OrientationProperty); + set => SetValue(OrientationProperty, value); + } + + /// + /// Gets or sets the spacing mode used when arranging the items. The default value is . + /// + public SpacingMode SpacingMode + { + get => (SpacingMode)GetValue(SpacingModeProperty); + set => SetValue(SpacingModeProperty, value); + } + + /// + /// Gets or sets a value that specifies if the items get stretched to fill up remaining space. The default value is false. + /// + /// + /// The MaxWidth and MaxHeight properties of the ItemContainerStyle can be used to limit the stretching. + /// In this case the use of the remaining space will be determined by the SpacingMode property. + /// + public bool StretchItems + { + get => (bool)GetValue(StretchItemsProperty); + set => SetValue(StretchItemsProperty, value); + } + + /// + /// Constructor initializing the . + /// + public VirtualizingGridView() + { + InitializeItemsPanel(); + + VirtualizingPanel.SetCacheLengthUnit(this, VirtualizationCacheLengthUnit.Page); + VirtualizingPanel.SetCacheLength(this, new VirtualizationCacheLength(1)); + VirtualizingPanel.SetIsVirtualizingWhenGrouping(this, true); + } + + /// + /// Initializes the with . + /// + protected virtual void InitializeItemsPanel() + { + var factory = new FrameworkElementFactory(typeof(VirtualizingWrapPanel)); + + factory.SetBinding(VirtualizingWrapPanel.OrientationProperty, + new Binding { Source = this, Path = new PropertyPath(nameof(Orientation)), Mode = BindingMode.OneWay }); + factory.SetBinding(VirtualizingWrapPanel.SpacingModeProperty, + new Binding { Source = this, Path = new PropertyPath(nameof(SpacingMode)), Mode = BindingMode.OneWay }); + factory.SetBinding(VirtualizingWrapPanel.StretchItemsProperty, + new Binding { Source = this, Path = new PropertyPath(nameof(StretchItems)), Mode = BindingMode.OneWay }); + + ItemsPanel = new ItemsPanelTemplate(factory); + } +} diff --git a/RevitLookup.UI/Controls/VirtualizingItemsControl.bmp b/RevitLookup.UI/Controls/VirtualizingItemsControl.bmp new file mode 100644 index 0000000000000000000000000000000000000000..39c6c18f8ed7a748bf3b314473d00e00df1c2045 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTNN^zr=%pp6icpw&QSPEJm6 zlAwBs$q+5XD2AxP?--ygF$iuQ#I-;--~q@s5@R@p>hZV)B1MV$aE}i~1_J{Cf +/// Virtualized . +/// Based on . +/// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(VirtualizingItemsControl), "VirtualizingItemsControl.bmp")] +public class VirtualizingItemsControl : ItemsControl +{ + /// + /// Property for . + /// + public static readonly DependencyProperty CacheLengthUnitProperty = + DependencyProperty.Register(nameof(CacheLengthUnit), typeof(VirtualizationCacheLengthUnit), typeof(VirtualizingItemsControl), + new FrameworkPropertyMetadata(VirtualizationCacheLengthUnit.Page)); + + /// + /// Gets or sets the cache length unit. + /// + public VirtualizationCacheLengthUnit CacheLengthUnit + { + get => VirtualizingPanel.GetCacheLengthUnit(this); + set + { + SetValue(CacheLengthUnitProperty, value); + VirtualizingPanel.SetCacheLengthUnit(this, value); + } + } + + /// + /// Constructor that initialize the . + /// + public VirtualizingItemsControl() + { + VirtualizingPanel.SetCacheLengthUnit(this, CacheLengthUnit); + VirtualizingPanel.SetCacheLength(this, new VirtualizationCacheLength(1)); + VirtualizingPanel.SetIsVirtualizingWhenGrouping(this, true); + } +} + diff --git a/RevitLookup.UI/Controls/VirtualizingPanelBase.cs b/RevitLookup.UI/Controls/VirtualizingPanelBase.cs new file mode 100644 index 000000000..9fcc98a34 --- /dev/null +++ b/RevitLookup.UI/Controls/VirtualizingPanelBase.cs @@ -0,0 +1,709 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Based on VirtualizingWrapPanel created by S. Bäumlisberger licensed under MIT license. +// https://github.com/sbaeumlisberger/VirtualizingWrapPanel +// Copyright (C) S. Bäumlisberger, Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +#nullable enable + +using System; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.Reflection; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Media; +using RevitLookup.UI.Common; + +namespace RevitLookup.UI.Controls; + +/// +/// Base abstract class for creating virtualized panels. +/// Based on . +/// +public abstract class VirtualizingPanelBase : VirtualizingPanel, IScrollInfo +{ + #region Private properties + + /// + /// Owner of the displayed items. + /// + private DependencyObject? _itemsOwner; + + /// + /// Items generator. + /// + private IRecyclingItemContainerGenerator? _itemContainerGenerator; + + /// + /// Previously set visibility of the vertical scroll bar. + /// + private Visibility _previousVerticalScrollBarVisibility = Visibility.Collapsed; + + /// + /// Previously set visibility of the horizontal scroll bar. + /// + private Visibility _previousHorizontalScrollBarVisibility = Visibility.Collapsed; + + #endregion Private properties + + #region Protected properties + + /// + protected override bool CanHierarchicallyScrollAndVirtualizeCore => true; + + /// + /// Gets the scroll unit. + /// + protected ScrollUnit ScrollUnit => GetScrollUnit(ItemsControl); + + /// + /// The direction in which the panel scrolls when user turns the mouse wheel. + /// + protected ScrollDirection MouseWheelScrollDirection { get; set; } = ScrollDirection.Vertical; + + /// + /// Gets a value that inidicates whether the virtualizing is enabled. + /// + protected bool IsVirtualizing => GetIsVirtualizing(ItemsControl); + + /// + /// Gets the virtualization mode. + /// + protected VirtualizationMode VirtualizationMode => GetVirtualizationMode(ItemsControl); + + /// + /// Returns true if the panel is in VirtualizationMode.Recycling, otherwise false. + /// + protected bool IsRecycling => VirtualizationMode == VirtualizationMode.Recycling; + + /// + /// The cache length before and after the viewport. + /// + protected VirtualizationCacheLength CacheLength { get; private set; } + + /// + /// The Unit of the cache length. Can be Pixel, Item or Page. + /// When the ItemsOwner is a group item it can only be pixel or item. + /// + protected VirtualizationCacheLengthUnit CacheLengthUnit { get; private set; } + + /// + /// The ItemsControl (e.g. ListView). + /// + protected ItemsControl ItemsControl => ItemsControl.GetItemsOwner(this); + + /// + /// The ItemsControl (e.g. ListView) or if the ItemsControl is grouping a GroupItem. + /// + protected DependencyObject ItemsOwner + { + get + { + if (_itemsOwner is not null) + return _itemsOwner; + + /* Use reflection to access internal method because the public + * GetItemsOwner method does always return the itmes control instead + * of the real items owner for example the group item when grouping */ + var getItemsOwnerInternalMethod = typeof(ItemsControl).GetMethod( + "GetItemsOwnerInternal", + BindingFlags.Static | BindingFlags.NonPublic, + null, + new Type[] { typeof(DependencyObject) }, + null + )!; + + _itemsOwner = (DependencyObject)getItemsOwnerInternalMethod.Invoke(null, new object[] { this })!; + + return _itemsOwner; + } + } + + /// + /// Items collection. + /// + protected ReadOnlyCollection Items => ((ItemContainerGenerator)ItemContainerGenerator).Items; + + /// + /// Gets the offset. + /// + protected Point Offset { get; private set; } = new(0, 0); + + /// + /// Items container. + /// + protected new IRecyclingItemContainerGenerator ItemContainerGenerator + { + get + { + if (_itemContainerGenerator is not null) + return _itemContainerGenerator; + + /* Because of a bug in the framework the ItemContainerGenerator + * is null until InternalChildren accessed at least one time. */ + var children = InternalChildren; + _itemContainerGenerator = (IRecyclingItemContainerGenerator)base.ItemContainerGenerator; + + return _itemContainerGenerator; + } + } + + /// + /// Gets or sets the range of items that a realized in or cache. + /// + protected ItemRange ItemRange { get; set; } + + /// + /// Gets the . + /// + protected Size Extent { get; private set; } = new Size(0, 0); + + /// + /// Gets the viewport. + /// + protected Size Viewport { get; private set; } = new Size(0, 0); + + #endregion Protected properties + + #region Public properties + + /// + /// Property for . + /// + public static readonly DependencyProperty ScrollLineDeltaProperty = + DependencyProperty.Register(nameof(ScrollLineDelta), typeof(double), typeof(VirtualizingPanelBase), + new FrameworkPropertyMetadata(16.0)); + + /// + /// Property for . + /// + public static readonly DependencyProperty MouseWheelDeltaProperty = + DependencyProperty.Register(nameof(MouseWheelDelta), typeof(double), typeof(VirtualizingPanelBase), + new FrameworkPropertyMetadata(48.0)); + + /// + /// Property for . + /// + public static readonly DependencyProperty ScrollLineDeltaItemProperty = + DependencyProperty.Register(nameof(ScrollLineDeltaItem), typeof(int), typeof(VirtualizingPanelBase), + new FrameworkPropertyMetadata(1)); + + /// + /// Property for . + /// + public static readonly DependencyProperty MouseWheelDeltaItemProperty = + DependencyProperty.Register(nameof(MouseWheelDeltaItem), typeof(int), typeof(VirtualizingPanelBase), + new FrameworkPropertyMetadata(3)); + + /// + /// Gets or sets the scroll owner. + /// + public ScrollViewer? ScrollOwner { get; set; } + + /// + /// Gets or sets a value that indicates whether the content can be vertically scrolled. + /// + public bool CanVerticallyScroll { get; set; } + + /// + /// Gets or sets a value that indicates whether the content can be horizontally scrolled. + /// + public bool CanHorizontallyScroll { get; set; } + + /// + /// Scroll line delta for pixel based scrolling. The default value is 16 dp. + /// + public double ScrollLineDelta + { + get => (double)GetValue(ScrollLineDeltaProperty); + set => SetValue(ScrollLineDeltaProperty, value); + } + + /// + /// Mouse wheel delta for pixel based scrolling. The default value is 48 dp. + /// + public double MouseWheelDelta + { + get => (double)GetValue(MouseWheelDeltaProperty); + set => SetValue(MouseWheelDeltaProperty, value); + } + + /// + /// Scroll line delta for item based scrolling. The default value is 1 item. + /// + public double ScrollLineDeltaItem + { + get => (int)GetValue(ScrollLineDeltaItemProperty); + set => SetValue(ScrollLineDeltaItemProperty, value); + } + + /// + /// Mouse wheel delta for item based scrolling. The default value is 3 items. + /// + public int MouseWheelDeltaItem + { + get => (int)GetValue(MouseWheelDeltaItemProperty); + set => SetValue(MouseWheelDeltaItemProperty, value); + } + + /// + /// Gets width of the . + /// + public double ExtentWidth => Extent.Width; + + /// + /// Gets height of the . + /// + public double ExtentHeight => Extent.Height; + + /// + /// Gets the horizontal offset. + /// + public double HorizontalOffset => Offset.X; + + /// + /// Gets the vertical offset. + /// + public double VerticalOffset => Offset.Y; + + /// + /// Gets the width. + /// + public double ViewportWidth => Viewport.Width; + + /// + /// Gets the height. + /// + public double ViewportHeight => Viewport.Height; + + #endregion Public properties + + #region Public methods + + /// + public virtual Rect MakeVisible(Visual visual, Rect rectangle) + { + var pos = visual.TransformToAncestor(this).Transform(Offset); + + var scrollAmountX = 0d; + var scrollAmountY = 0d; + + if (pos.X < Offset.X) + { + scrollAmountX = -(Offset.X - pos.X); + } + else if ((pos.X + rectangle.Width) > (Offset.X + Viewport.Width)) + { + var notVisibleX = (pos.X + rectangle.Width) - (Offset.X + Viewport.Width); + var maxScrollX = pos.X - Offset.X; // keep left of the visual visible + scrollAmountX = Math.Min(notVisibleX, maxScrollX); + } + + if (pos.Y < Offset.Y) + { + scrollAmountY = -(Offset.Y - pos.Y); + } + else if ((pos.Y + rectangle.Height) > (Offset.Y + Viewport.Height)) + { + var notVisibleY = (pos.Y + rectangle.Height) - (Offset.Y + Viewport.Height); + var maxScrollY = pos.Y - Offset.Y; // keep top of the visual visible + scrollAmountY = Math.Min(notVisibleY, maxScrollY); + } + + SetHorizontalOffset(Offset.X + scrollAmountX); + SetVerticalOffset(Offset.Y + scrollAmountY); + + var visibleRectWidth = Math.Min(rectangle.Width, Viewport.Width); + var visibleRectHeight = Math.Min(rectangle.Height, Viewport.Height); + + return new Rect(scrollAmountX, scrollAmountY, visibleRectWidth, visibleRectHeight); + } + + /// + /// Sets the vertical offset. + /// + public void SetVerticalOffset(double offset) + { + if (offset < 0 || Viewport.Height >= Extent.Height) + offset = 0; + else if (offset + Viewport.Height >= Extent.Height) + offset = Extent.Height - Viewport.Height; + + Offset = new Point(Offset.X, offset); + ScrollOwner?.InvalidateScrollInfo(); + + InvalidateMeasure(); + } + + /// + /// Sets the horizontal offset. + /// + public void SetHorizontalOffset(double offset) + { + if (offset < 0 || Viewport.Width >= Extent.Width) + offset = 0; + else if (offset + Viewport.Width >= Extent.Width) + offset = Extent.Width - Viewport.Width; + + Offset = new Point(offset, Offset.Y); + ScrollOwner?.InvalidateScrollInfo(); + InvalidateMeasure(); + } + + /// + public void LineUp() => + ScrollVertical(ScrollUnit == ScrollUnit.Pixel ? -ScrollLineDelta : GetLineUpScrollAmount()); + + /// + public void LineDown() => + ScrollVertical(ScrollUnit == ScrollUnit.Pixel ? ScrollLineDelta : GetLineDownScrollAmount()); + + /// + public void LineLeft() => + ScrollHorizontal(ScrollUnit == ScrollUnit.Pixel ? -ScrollLineDelta : GetLineLeftScrollAmount()); + + /// + public void LineRight() => + ScrollHorizontal(ScrollUnit == ScrollUnit.Pixel ? ScrollLineDelta : GetLineRightScrollAmount()); + + /// + public void MouseWheelUp() + { + if (MouseWheelScrollDirection == ScrollDirection.Vertical) + ScrollVertical(ScrollUnit == ScrollUnit.Pixel ? -MouseWheelDelta : GetMouseWheelUpScrollAmount()); + else + MouseWheelLeft(); + } + + /// + public void MouseWheelDown() + { + if (MouseWheelScrollDirection == ScrollDirection.Vertical) + ScrollVertical(ScrollUnit == ScrollUnit.Pixel ? MouseWheelDelta : GetMouseWheelDownScrollAmount()); + else + MouseWheelRight(); + } + + /// + public void MouseWheelLeft() => + ScrollHorizontal(ScrollUnit == ScrollUnit.Pixel ? -MouseWheelDelta : GetMouseWheelLeftScrollAmount()); + + /// + public void MouseWheelRight() => + ScrollHorizontal(ScrollUnit == ScrollUnit.Pixel ? MouseWheelDelta : GetMouseWheelRightScrollAmount()); + + /// + public void PageUp() => + ScrollVertical(ScrollUnit == ScrollUnit.Pixel ? -ViewportHeight : GetPageUpScrollAmount()); + + /// + public void PageDown() => + ScrollVertical(ScrollUnit == ScrollUnit.Pixel ? ViewportHeight : GetPageDownScrollAmount()); + + /// + public void PageLeft() => + ScrollHorizontal(ScrollUnit == ScrollUnit.Pixel ? -ViewportHeight : GetPageLeftScrollAmount()); + + /// + public void PageRight() => + ScrollHorizontal(ScrollUnit == ScrollUnit.Pixel ? ViewportHeight : GetPageRightScrollAmount()); + + #endregion Public methods + + #region Protected methods + + /// + protected override void OnItemsChanged(object sender, ItemsChangedEventArgs args) + { + switch (args.Action) + { + case NotifyCollectionChangedAction.Remove: + case NotifyCollectionChangedAction.Replace: + RemoveInternalChildRange(args.Position.Index, args.ItemUICount); + break; + case NotifyCollectionChangedAction.Move: + RemoveInternalChildRange(args.OldPosition.Index, args.ItemUICount); + break; + } + } + + /// + /// Updates scroll offset, extent and viewport. + /// + protected virtual void UpdateScrollInfo(Size availableSize, Size extent) + { + var invalidateScrollInfo = false; + + if (extent != Extent) + { + Extent = extent; + invalidateScrollInfo = true; + } + + if (availableSize != Viewport) + { + Viewport = availableSize; + invalidateScrollInfo = true; + } + + if (ViewportHeight != 0 && VerticalOffset != 0 && VerticalOffset + ViewportHeight + 1 >= ExtentHeight) + { + Offset = new Point(Offset.X, extent.Height - availableSize.Height); + invalidateScrollInfo = true; + } + + if (ViewportWidth != 0 && HorizontalOffset != 0 && HorizontalOffset + ViewportWidth + 1 >= ExtentWidth) + { + Offset = new Point(extent.Width - availableSize.Width, Offset.Y); + invalidateScrollInfo = true; + } + + if (invalidateScrollInfo) + ScrollOwner?.InvalidateScrollInfo(); + } + + /// + /// Gets item index from the generator. + /// + protected int GetItemIndexFromChildIndex(int childIndex) + { + var generatorPosition = GetGeneratorPositionFromChildIndex(childIndex); + return ItemContainerGenerator.IndexFromGeneratorPosition(generatorPosition); + } + + /// + /// Gets the position of children from the generator. + /// + protected virtual GeneratorPosition GetGeneratorPositionFromChildIndex(int childIndex) + { + return new GeneratorPosition(childIndex, 0); + } + + /// + protected override Size MeasureOverride(Size availableSize) + { + /* Sometimes when scrolling the scrollbar gets hidden without any reason. In this case the "IsMeasureValid" + * property of the ScrollOwner is false. To prevent a infinite circle the mesasure call is ignored. */ + if (ScrollOwner != null) + { + var verticalScrollBarGotHidden = ScrollOwner.VerticalScrollBarVisibility == ScrollBarVisibility.Auto + && ScrollOwner.ComputedVerticalScrollBarVisibility != + Visibility.Visible + && ScrollOwner.ComputedVerticalScrollBarVisibility != + _previousVerticalScrollBarVisibility; + + var horizontalScrollBarGotHidden = + ScrollOwner.HorizontalScrollBarVisibility == ScrollBarVisibility.Auto + && ScrollOwner.ComputedHorizontalScrollBarVisibility != Visibility.Visible + && ScrollOwner.ComputedHorizontalScrollBarVisibility != _previousHorizontalScrollBarVisibility; + + _previousVerticalScrollBarVisibility = ScrollOwner.ComputedVerticalScrollBarVisibility; + _previousHorizontalScrollBarVisibility = ScrollOwner.ComputedHorizontalScrollBarVisibility; + + if (!ScrollOwner.IsMeasureValid && verticalScrollBarGotHidden || horizontalScrollBarGotHidden) + return availableSize; + } + + var groupItem = ItemsOwner as IHierarchicalVirtualizationAndScrollInfo; + + Size extent; + Size desiredSize; + + if (groupItem != null) + { + /* If the ItemsOwner is a group item the availableSize is ifinity. + * Therfore the vieport size provided by the group item is used. */ + var viewportSize = groupItem.Constraints.Viewport.Size; + var headerSize = groupItem.HeaderDesiredSizes.PixelSize; + var availableWidth = Math.Max(viewportSize.Width - 5, 0); // left margin of 5 dp + var availableHeight = Math.Max(viewportSize.Height - headerSize.Height, 0); + availableSize = new Size(availableWidth, availableHeight); + + extent = CalculateExtent(availableSize); + + desiredSize = new Size(extent.Width, extent.Height); + + Extent = extent; + Offset = groupItem.Constraints.Viewport.Location; + Viewport = groupItem.Constraints.Viewport.Size; + CacheLength = groupItem.Constraints.CacheLength; + CacheLengthUnit = groupItem.Constraints.CacheLengthUnit; // can be Item or Pixel + } + else + { + extent = CalculateExtent(availableSize); + var desiredWidth = Math.Min(availableSize.Width, extent.Width); + var desiredHeight = Math.Min(availableSize.Height, extent.Height); + desiredSize = new Size(desiredWidth, desiredHeight); + + UpdateScrollInfo(desiredSize, extent); + CacheLength = GetCacheLength(ItemsOwner); + CacheLengthUnit = GetCacheLengthUnit(ItemsOwner); // can be Page, Item or Pixel + } + + ItemRange = UpdateItemRange(); + + RealizeItems(); + VirtualizeItems(); + + return desiredSize; + } + + /// + /// Realizes visible and cached items. + /// + protected virtual void RealizeItems() + { + var startPosition = ItemContainerGenerator.GeneratorPositionFromIndex(ItemRange.StartIndex); + var childIndex = startPosition.Offset == 0 ? startPosition.Index : startPosition.Index + 1; + + using var at = ItemContainerGenerator.StartAt(startPosition, GeneratorDirection.Forward, true); + + for (var i = ItemRange.StartIndex; i <= ItemRange.EndIndex; i++, childIndex++) + { + var child = (UIElement)ItemContainerGenerator.GenerateNext(out var isNewlyRealized); + + if (isNewlyRealized || /*recycled*/!InternalChildren.Contains(child)) + { + if (childIndex >= InternalChildren.Count) + AddInternalChild(child); + else + InsertInternalChild(childIndex, child); + + ItemContainerGenerator.PrepareItemContainer(child); + + child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + } + + if (child is not IHierarchicalVirtualizationAndScrollInfo groupItem) + continue; + + groupItem.Constraints = new HierarchicalVirtualizationConstraints( + new VirtualizationCacheLength(0), + VirtualizationCacheLengthUnit.Item, + new Rect(0, 0, ViewportWidth, ViewportHeight)); + + child.Measure(new Size(ViewportWidth, ViewportHeight)); + } + } + + /// + /// Virtualizes (cleanups) no longer visible or cached items. + /// + protected virtual void VirtualizeItems() + { + for (var childIndex = InternalChildren.Count - 1; childIndex >= 0; childIndex--) + { + var generatorPosition = GetGeneratorPositionFromChildIndex(childIndex); + + var itemIndex = ItemContainerGenerator.IndexFromGeneratorPosition(generatorPosition); + + if (itemIndex == -1 || ItemRange.Contains(itemIndex)) + continue; + + if (VirtualizationMode == VirtualizationMode.Recycling) + ItemContainerGenerator.Recycle(generatorPosition, 1); + else + ItemContainerGenerator.Remove(generatorPosition, 1); + + RemoveInternalChildRange(childIndex, 1); + } + } + + /// + /// Sets vertical scroll offset by given amount. + /// + /// The value by which the offset is to be increased. + protected void ScrollVertical(double amount) + { + SetVerticalOffset(VerticalOffset + amount); + } + + /// + /// Sets horizontal scroll offset by given amount. + /// + /// The value by which the offset is to be increased. + protected void ScrollHorizontal(double amount) + { + SetHorizontalOffset(HorizontalOffset + amount); + } + + #endregion Protected methods + + #region Protected abstract methods + + /// + /// Calculates the extent that would be needed to show all items. + /// + protected abstract Size CalculateExtent(Size availableSize); + + /// + /// Calculates the item range that is visible in the viewport or cached. + /// + protected abstract ItemRange UpdateItemRange(); + + /// + /// Gets line up scroll amount. + /// + protected abstract double GetLineUpScrollAmount(); + + /// + /// Gets line down scroll amount. + /// + protected abstract double GetLineDownScrollAmount(); + + /// + /// Gets line left scroll amount. + /// + protected abstract double GetLineLeftScrollAmount(); + + /// + /// Gets line right scroll amount. + /// + protected abstract double GetLineRightScrollAmount(); + + /// + /// Gets mouse wheel up scroll amount. + /// + protected abstract double GetMouseWheelUpScrollAmount(); + + /// + /// Gets mouse wheel down scroll amount. + /// + protected abstract double GetMouseWheelDownScrollAmount(); + + /// + /// Gets mouse wheel left scroll amount. + /// + protected abstract double GetMouseWheelLeftScrollAmount(); + + /// + /// Gets mouse wheel right scroll amount. + /// + protected abstract double GetMouseWheelRightScrollAmount(); + + /// + /// Gets page up scroll amount. + /// + protected abstract double GetPageUpScrollAmount(); + + /// + /// Gets page down scroll amount. + /// + protected abstract double GetPageDownScrollAmount(); + + /// + /// Gets page left scroll amount. + /// + protected abstract double GetPageLeftScrollAmount(); + + /// + /// Gets page right scroll amount. + /// + protected abstract double GetPageRightScrollAmount(); + + #endregion Protected abstract methods +} diff --git a/RevitLookup.UI/Controls/VirtualizingUniformGrid.cs b/RevitLookup.UI/Controls/VirtualizingUniformGrid.cs index 52938f6d7..54614641d 100644 --- a/RevitLookup.UI/Controls/VirtualizingUniformGrid.cs +++ b/RevitLookup.UI/Controls/VirtualizingUniformGrid.cs @@ -3,310 +3,14 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Collections; -using System.Windows; -using System.Windows.Controls; - -// TODO: For now, this is a rude implementation to try +using System; namespace RevitLookup.UI.Controls; /// -/// Tries to asynchronously create a large list of controls in the selected number of columns, and then virtualize it to speed up the UI performance. -/// -/// Work in progress. -/// +/// Work in progress. /// [Obsolete] -public class VirtualizingUniformGrid : Control +internal class VirtualizingUniformGrid : System.Windows.Controls.Control { - /// - /// Property for . - /// - public static readonly DependencyProperty IsVirtualizingProperty = DependencyProperty.Register( - nameof(IsVirtualizing), - typeof(bool), typeof(VirtualizingUniformGrid), new PropertyMetadata(true)); - - /// - /// Property for . - /// - public static readonly DependencyProperty VirtualizationModeProperty = DependencyProperty.Register( - nameof(VirtualizationMode), - typeof(VirtualizationMode), typeof(VirtualizingUniformGrid), - new PropertyMetadata(VirtualizationMode.Standard)); - - /// - /// Property for . - /// - public static readonly DependencyProperty CanScrollProperty = DependencyProperty.Register( - nameof(CanScroll), - typeof(bool), typeof(VirtualizingUniformGrid), new PropertyMetadata(true)); - - /// - /// Property for . - /// - public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register(nameof(Columns), - typeof(int), typeof(VirtualizingUniformGrid), new PropertyMetadata(1)); - - /// - /// Property for . - /// - public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(nameof(ItemsSource), - typeof(IEnumerable), typeof(VirtualizingUniformGrid), - new PropertyMetadata(null, OnItemsSourceChanged)); - - /// - /// Property for . - /// - public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), - typeof(object), typeof(VirtualizingUniformGrid), new PropertyMetadata(null)); - - /// - /// Property for . - /// - public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register( - nameof(ItemTemplate), - typeof(object), typeof(VirtualizingUniformGrid), new PropertyMetadata(null, - OnItemTemplateChanged)); - - /// - /// Property for . - /// - public static readonly DependencyProperty HorizontalScrollBarVisibilityProperty = DependencyProperty.Register( - nameof(HorizontalScrollBarVisibility), - typeof(ScrollBarVisibility), typeof(VirtualizingUniformGrid), - new PropertyMetadata(ScrollBarVisibility.Disabled)); - - /// - /// Property for . - /// - public static readonly DependencyProperty VerticalScrollBarVisibilityProperty = DependencyProperty.Register( - nameof(VerticalScrollBarVisibility), - typeof(ScrollBarVisibility), typeof(VirtualizingUniformGrid), - new PropertyMetadata(ScrollBarVisibility.Visible)); - - private bool _compiled; - - /// - /// Turns virtualization on or fff. - /// - public bool IsVirtualizing - { - get => (bool) GetValue(IsVirtualizingProperty); - set => SetValue(IsVirtualizingProperty, value); - } - - /// - /// Gets or sets the virtualization mode. - /// - public VirtualizationMode VirtualizationMode - { - get => (VirtualizationMode) GetValue(VirtualizationModeProperty); - set => SetValue(VirtualizationModeProperty, value); - } - - /// - /// Gets or sets a value indicating whether the content can be scrolled. - /// - public bool CanScroll - { - get => (bool) GetValue(CanScrollProperty); - set => SetValue(CanScrollProperty, value); - } - - /// - /// Gets or sets number of grid columns. - /// - public int Columns - { - get => (int) GetValue(ColumnsProperty); - set => SetValue(ColumnsProperty, value); - } - - /// - /// Gets or sets source of the presented items. - /// - public IEnumerable ItemsSource - { - set - { - if (value == null) - ClearValue(ItemsSourceProperty); - else - SetValue(ItemsSourceProperty, value); - } - - internal get => (IEnumerable) GetValue(ItemsSourceProperty); - } - - /// - /// Gets or sets template of the displayed items. - /// - public DataTemplate ItemTemplate - { - get => (DataTemplate) GetValue(ItemTemplateProperty); - set => SetValue(ItemTemplateProperty, value); - } - - /// - /// Gets the displayed content. - /// - public object Content - { - get => GetValue(ContentProperty); - internal set => SetValue(ContentProperty, value); - } - - /// - /// Gets the displayed content. - /// - public ScrollBarVisibility HorizontalScrollBarVisibility - { - get => (ScrollBarVisibility) GetValue(HorizontalScrollBarVisibilityProperty); - set => SetValue(HorizontalScrollBarVisibilityProperty, value); - } - - /// - /// Gets the displayed content. - /// - public ScrollBarVisibility VerticalScrollBarVisibility - { - get => (ScrollBarVisibility) GetValue(VerticalScrollBarVisibilityProperty); - set => SetValue(VerticalScrollBarVisibilityProperty, value); - } - - /// - /// This virtual method is invoked when is changed. - /// - protected virtual async Task OnItemsSourceChanged() - { - _compiled = false; - - await Compile(); - } - - /// - /// This virtual method is invoked when is changed. - /// - protected virtual Task OnItemTemplateChanged() - { - return Task.CompletedTask; - } - - /// - /// Compiles all items on the code side, puts into then adds - /// to the . - /// - // Version 5 - Single, virtualized stack panel with grid groups - private async Task Compile() - { - if (_compiled) - return; - - var itemsSource = ItemsSource; - var template = ItemTemplate; - var columns = Columns; - - if (itemsSource == null) - { - Content = null; - - return; - } - - // It's a mess, please don't judge me - // This control was written quickly to display 5000 icons in one window. - - var scrollViewer = new ScrollViewer - { - HorizontalScrollBarVisibility = - CanScroll ? HorizontalScrollBarVisibility : ScrollBarVisibility.Disabled, - VerticalScrollBarVisibility = CanScroll ? VerticalScrollBarVisibility : ScrollBarVisibility.Disabled - }; - var panelPresenter = new VirtualizingStackPanel {ScrollOwner = scrollViewer}; - - panelPresenter.SetValue(VirtualizingStackPanel.IsVirtualizingProperty, IsVirtualizing); - panelPresenter.SetValue(VirtualizingStackPanel.VirtualizationModeProperty, VirtualizationMode); - - scrollViewer.Content = panelPresenter; - Content = scrollViewer; - - await Task.Delay(15); - - var grid = new Grid(); - - await Task.Run(async () => - { - var itemsCount = 0; - var panelIndex = 0; - - foreach (var singleItem in itemsSource) - { - await panelPresenter.Dispatcher.InvokeAsync(() => - { - if (panelIndex == 0) - grid = CreateGrid(columns); - - var contentPresenter = new ContentPresenter - { - Content = singleItem - }; - - if (template != null) - contentPresenter.ContentTemplate = template; - - contentPresenter.SetValue(Grid.ColumnProperty, panelIndex); - grid.Children.Add(contentPresenter); - - panelIndex++; - - if (panelIndex != columns) - return; - - // Adding controls in groups greatly speeds up the process. - panelPresenter.Children.Add(grid); - panelIndex = 0; - }); - - // Giving a UI thread a moment to rest is some method, but it blocks it anyway - // However, it does give a minimal UI response to Messages from WinApi so at least the user doesn't see one big hang - if (itemsCount++ % 200 == 0) - await Task.Delay(50); - } - - // If, after iteration, there will be a few elements - await scrollViewer.Dispatcher.InvokeAsync(() => - { - if (grid.Children.Count > 0) - panelPresenter.Children.Add(grid); - }); - }); - - _compiled = true; - } - - private Grid CreateGrid(int columns) - { - var grid = new Grid(); - for (var i = 0; i < columns; i++) - grid.ColumnDefinitions.Add(new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)}); - - return grid; - } - - private static async void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not VirtualizingUniformGrid virtualizingUniformGrid) - return; - - await virtualizingUniformGrid.OnItemsSourceChanged(); - } - - private static async void OnItemTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not VirtualizingUniformGrid virtualizingUniformGrid) - return; - - await virtualizingUniformGrid.OnItemTemplateChanged(); - } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Controls/VirtualizingWrapPanel.bmp b/RevitLookup.UI/Controls/VirtualizingWrapPanel.bmp new file mode 100644 index 0000000000000000000000000000000000000000..39c6c18f8ed7a748bf3b314473d00e00df1c2045 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;XZTNN^zr=%pp6icpw&QSPEJm6 zlAwBs$q+5XD2AxP?--ygF$iuQ#I-;--~q@s5@R@p>hZV)B1MV$aE}i~1_J{Cf +/// Extended base class for . +/// Based on . +/// +[ToolboxItem(true)] +[ToolboxBitmap(typeof(VirtualizingWrapPanel), "VirtualizingWrapPanel.bmp")] +public class VirtualizingWrapPanel : VirtualizingPanelBase +{ + /// + /// Size of the single child element. + /// + protected Size ChildSize; + + /// + /// Amount of the displayed rows. + /// + protected int RowCount; + + /// + /// Amount of displayed items per row. + /// + protected int ItemsPerRowCount; + + /// + /// Property for . + /// + public static readonly DependencyProperty SpacingModeProperty = DependencyProperty.Register(nameof(SpacingMode), + typeof(SpacingMode), typeof(VirtualizingWrapPanel), + new FrameworkPropertyMetadata(SpacingMode.Uniform, FrameworkPropertyMetadataOptions.AffectsMeasure)); + + /// + /// Property for . + /// + public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register(nameof(Orientation), + typeof(Orientation), typeof(VirtualizingWrapPanel), + new FrameworkPropertyMetadata(Orientation.Vertical, FrameworkPropertyMetadataOptions.AffectsMeasure, + OnOrientationChanged)); + + /// + /// Property for . + /// + public static readonly DependencyProperty ItemSizeProperty = DependencyProperty.Register(nameof(ItemSize), + typeof(Size), typeof(VirtualizingWrapPanel), + new FrameworkPropertyMetadata(Size.Empty, FrameworkPropertyMetadataOptions.AffectsMeasure)); + + /// + /// Property for . + /// + public static readonly DependencyProperty StretchItemsProperty = DependencyProperty.Register(nameof(StretchItems), + typeof(bool), typeof(VirtualizingWrapPanel), + new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsArrange)); + + /// + /// Gets or sets the spacing mode used when arranging the items. The default value is . + /// + public SpacingMode SpacingMode + { + get => (SpacingMode)GetValue(SpacingModeProperty); + set => SetValue(SpacingModeProperty, value); + } + + /// + /// Gets or sets a value that specifies the orientation in which items are arranged. The default value is . + /// + public Orientation Orientation + { + get => (Orientation)GetValue(OrientationProperty); + set => SetValue(OrientationProperty, value); + } + + /// + /// Gets or sets a value that specifies the size of the items. The default value is . + /// If the value is the size of the items gots measured by the first realized item. + /// + public Size ItemSize + { + get => (Size)GetValue(ItemSizeProperty); + set => SetValue(ItemSizeProperty, value); + } + + /// + /// Gets or sets a value that specifies if the items get stretched to fill up remaining space. The default value is false. + /// + /// + /// The MaxWidth and MaxHeight properties of the ItemContainerStyle can be used to limit the stretching. + /// In this case the use of the remaining space will be determined by the SpacingMode property. + /// + public bool StretchItems + { + get => (bool)GetValue(StretchItemsProperty); + set => SetValue(StretchItemsProperty, value); + } + + /// + /// This virtual method is called when is changed. + /// + protected virtual void OnOrientationChanged() + { + MouseWheelScrollDirection = + Orientation == Orientation.Vertical ? ScrollDirection.Vertical : ScrollDirection.Horizontal; + } + + /// + /// Private callback for . + /// + private static void OnOrientationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not VirtualizingWrapPanel panel) + return; + + panel.OnOrientationChanged(); + } + + /// + protected override Size MeasureOverride(Size availableSize) + { + UpdateChildSize(availableSize); + + return base.MeasureOverride(availableSize); + } + + /// + /// Updates child size of . + /// + private void UpdateChildSize(Size availableSize) + { + if (ItemsOwner is IHierarchicalVirtualizationAndScrollInfo groupItem + && GetIsVirtualizingWhenGrouping(ItemsControl)) + { + if (Orientation == Orientation.Vertical) + { + availableSize.Width = groupItem.Constraints.Viewport.Size.Width; + availableSize.Width = Math.Max(availableSize.Width - (Margin.Left + Margin.Right), 0); + } + else + { + availableSize.Height = groupItem.Constraints.Viewport.Size.Height; + availableSize.Height = Math.Max(availableSize.Height - (Margin.Top + Margin.Bottom), 0); + } + } + + if (ItemSize != Size.Empty) + ChildSize = ItemSize; + else if (InternalChildren.Count != 0) + ChildSize = InternalChildren[0].DesiredSize; + else + ChildSize = CalculateChildSize(availableSize); + + ItemsPerRowCount + = double.IsInfinity(GetWidth(availableSize)) + ? Items.Count + : Math.Max(1, (int)Math.Floor(GetWidth(availableSize) / GetWidth(ChildSize))); + + RowCount = (int)Math.Ceiling((double)Items.Count / ItemsPerRowCount); + } + + /// + /// Calculates child size. + /// + private Size CalculateChildSize(Size availableSize) + { + if (Items.Count == 0) + return new Size(0, 0); + + var startPosition = ItemContainerGenerator.GeneratorPositionFromIndex(0); + + using var at = ItemContainerGenerator.StartAt(startPosition, GeneratorDirection.Forward, true); + + var child = (UIElement)ItemContainerGenerator.GenerateNext(); + AddInternalChild(child); + ItemContainerGenerator.PrepareItemContainer(child); + child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + + return child.DesiredSize; + } + + /// + protected override Size CalculateExtent(Size availableSize) + { + var extentWidth = SpacingMode != SpacingMode.None && !double.IsInfinity(GetWidth(availableSize)) + ? GetWidth(availableSize) + : GetWidth(ChildSize) * ItemsPerRowCount; + + if (ItemsOwner is IHierarchicalVirtualizationAndScrollInfo groupItem) + extentWidth = Orientation == Orientation.Vertical + ? Math.Max(extentWidth - (Margin.Left + Margin.Right), 0) + : Math.Max(extentWidth - (Margin.Top + Margin.Bottom), 0); + + var extentHeight = GetHeight(ChildSize) * RowCount; + + return CreateSize(extentWidth, extentHeight); + } + + /// + /// Calculates desired spacing between items. + /// + protected void CalculateSpacing(Size finalSize, out double innerSpacing, out double outerSpacing) + { + var childSize = CalculateChildArrangeSize(finalSize); + + var finalWidth = GetWidth(finalSize); + + var totalItemsWidth = Math.Min(GetWidth(childSize) * ItemsPerRowCount, finalWidth); + var unusedWidth = finalWidth - totalItemsWidth; + + var spacingMode = SpacingMode; + + switch (spacingMode) + { + case SpacingMode.Uniform: + innerSpacing = outerSpacing = unusedWidth / (ItemsPerRowCount + 1); + break; + + case SpacingMode.BetweenItemsOnly: + innerSpacing = unusedWidth / Math.Max(ItemsPerRowCount - 1, 1); + outerSpacing = 0; + break; + + case SpacingMode.StartAndEndOnly: + innerSpacing = 0; + outerSpacing = unusedWidth / 2; + break; + + case SpacingMode.None: + default: + innerSpacing = 0; + outerSpacing = 0; + break; + } + } + + /// + protected override Size ArrangeOverride(Size finalSize) + { + var offsetX = GetX(Offset); + var offsetY = GetY(Offset); + + /* When the items owner is a group item offset is handled by the parent panel. */ + if (ItemsOwner is IHierarchicalVirtualizationAndScrollInfo groupItem) + offsetY = 0; + + var childSize = CalculateChildArrangeSize(finalSize); + + CalculateSpacing(finalSize, out var innerSpacing, out var outerSpacing); + + for (var childIndex = 0; childIndex < InternalChildren.Count; childIndex++) + { + var child = InternalChildren[childIndex]; + + var itemIndex = GetItemIndexFromChildIndex(childIndex); + + var columnIndex = itemIndex % ItemsPerRowCount; + var rowIndex = itemIndex / ItemsPerRowCount; + + var x = outerSpacing + columnIndex * (GetWidth(childSize) + innerSpacing); + var y = rowIndex * GetHeight(childSize); + + if (GetHeight(finalSize) == 0.0) + { + /* When the parent panel is grouping and a cached group item is not + * in the viewport it has no valid arrangement. That means that the + * height/width is 0. Therefore the items should not be visible so + * that they are not falsely displayed. */ + child.Arrange(new Rect(0, 0, 0, 0)); + } + else + { + child.Arrange(CreateRect(x - offsetX, y - offsetY, childSize.Width, childSize.Height)); + } + } + + return finalSize; + } + + /// + /// Calculates desired child arrange size. + /// + protected Size CalculateChildArrangeSize(Size finalSize) + { + if (!StretchItems) + return ChildSize; + + if (Orientation == Orientation.Vertical) + { + var childMaxWidth = ReadItemContainerStyle(MaxWidthProperty, double.PositiveInfinity); + var maxPossibleChildWith = finalSize.Width / ItemsPerRowCount; + var childWidth = Math.Min(maxPossibleChildWith, childMaxWidth); + + return new Size(childWidth, ChildSize.Height); + } + + var childMaxHeight = ReadItemContainerStyle(MaxHeightProperty, double.PositiveInfinity); + var maxPossibleChildHeight = finalSize.Height / ItemsPerRowCount; + var childHeight = Math.Min(maxPossibleChildHeight, childMaxHeight); + + return new Size(ChildSize.Width, childHeight); + } + + /// + /// Gets container style of the . + /// + /// + /// + /// + /// + private T ReadItemContainerStyle(DependencyProperty property, T fallbackValue) where T : notnull + { + var value = ItemsControl.ItemContainerStyle?.Setters.OfType() + .FirstOrDefault(setter => setter.Property == property)?.Value; + return (T)(value ?? fallbackValue); + } + + /// + protected override ItemRange UpdateItemRange() + { + if (!IsVirtualizing) + return new ItemRange(0, Items.Count - 1); + + int startIndex; + int endIndex; + + if (ItemsOwner is IHierarchicalVirtualizationAndScrollInfo groupItem) + { + if (!GetIsVirtualizingWhenGrouping(ItemsControl)) + return new ItemRange(0, Items.Count - 1); + + var offset = new Point(Offset.X, groupItem.Constraints.Viewport.Location.Y); + + int offsetRowIndex; + double offsetInPixel; + + int rowCountInViewport; + + if (ScrollUnit == ScrollUnit.Item) + { + offsetRowIndex = GetY(offset) >= 1 ? (int)GetY(offset) - 1 : 0; // ignore header + offsetInPixel = offsetRowIndex * GetHeight(ChildSize); + } + else + { + offsetInPixel = Math.Min(Math.Max(GetY(offset) - GetHeight(groupItem.HeaderDesiredSizes.PixelSize), 0), + GetHeight(Extent)); + offsetRowIndex = GetRowIndex(offsetInPixel); + } + + var viewportHeight = Math.Min(GetHeight(Viewport), Math.Max(GetHeight(Extent) - offsetInPixel, 0)); + + rowCountInViewport = (int)Math.Ceiling((offsetInPixel + viewportHeight) / GetHeight(ChildSize)) - + (int)Math.Floor(offsetInPixel / GetHeight(ChildSize)); + + startIndex = offsetRowIndex * ItemsPerRowCount; + endIndex = Math.Min(((offsetRowIndex + rowCountInViewport) * ItemsPerRowCount) - 1, Items.Count - 1); + + if (CacheLengthUnit == VirtualizationCacheLengthUnit.Pixel) + { + var cacheBeforeInPixel = Math.Min( + CacheLength.CacheBeforeViewport, + offsetInPixel); + var cacheAfterInPixel = Math.Min( + CacheLength.CacheAfterViewport, + GetHeight(Extent) - viewportHeight - offsetInPixel); + + var rowCountInCacheBefore = (int)(cacheBeforeInPixel / GetHeight(ChildSize)); + var rowCountInCacheAfter = + ((int)Math.Ceiling((offsetInPixel + viewportHeight + cacheAfterInPixel) / GetHeight(ChildSize))) - + (int)Math.Ceiling((offsetInPixel + viewportHeight) / GetHeight(ChildSize)); + + startIndex = Math.Max(startIndex - rowCountInCacheBefore * ItemsPerRowCount, 0); + endIndex = Math.Min(endIndex + rowCountInCacheAfter * ItemsPerRowCount, Items.Count - 1); + } + else if (CacheLengthUnit == VirtualizationCacheLengthUnit.Item) + { + startIndex = Math.Max(startIndex - (int)CacheLength.CacheBeforeViewport, 0); + endIndex = Math.Min(endIndex + (int)CacheLength.CacheAfterViewport, Items.Count - 1); + } + } + else + { + var viewportSartPos = GetY(Offset); + var viewportEndPos = GetY(Offset) + GetHeight(Viewport); + + if (CacheLengthUnit == VirtualizationCacheLengthUnit.Pixel) + { + viewportSartPos = Math.Max(viewportSartPos - CacheLength.CacheBeforeViewport, 0); + viewportEndPos = Math.Min(viewportEndPos + CacheLength.CacheAfterViewport, GetHeight(Extent)); + } + + var startRowIndex = GetRowIndex(viewportSartPos); + startIndex = startRowIndex * ItemsPerRowCount; + + var endRowIndex = GetRowIndex(viewportEndPos); + endIndex = Math.Min(endRowIndex * ItemsPerRowCount + (ItemsPerRowCount - 1), Items.Count - 1); + + if (CacheLengthUnit == VirtualizationCacheLengthUnit.Page) + { + var itemsPerPage = endIndex - startIndex + 1; + startIndex = Math.Max(startIndex - (int)CacheLength.CacheBeforeViewport * itemsPerPage, 0); + endIndex = Math.Min(endIndex + (int)CacheLength.CacheAfterViewport * itemsPerPage, Items.Count - 1); + } + else if (CacheLengthUnit == VirtualizationCacheLengthUnit.Item) + { + startIndex = Math.Max(startIndex - (int)CacheLength.CacheBeforeViewport, 0); + endIndex = Math.Min(endIndex + (int)CacheLength.CacheAfterViewport, Items.Count - 1); + } + } + + return new ItemRange(startIndex, endIndex); + } + + /// + /// Gets item row index. + /// + private int GetRowIndex(double location) + { + var calculatedRowIndex = (int)Math.Floor(location / GetHeight(ChildSize)); + var maxRowIndex = (int)Math.Ceiling((double)Items.Count / (double)ItemsPerRowCount); + + return Math.Max(Math.Min(calculatedRowIndex, maxRowIndex), 0); + } + + /// + protected override void BringIndexIntoView(int index) + { + if (index < 0 || index >= Items.Count) + throw new ArgumentOutOfRangeException(nameof(index), + $"The argument {nameof(index)} must be >= 0 and < the number of items."); + + if (ItemsPerRowCount == 0) + throw new InvalidOperationException(); + + var offset = (index / ItemsPerRowCount) * GetHeight(ChildSize); + + if (Orientation == Orientation.Horizontal) + SetHorizontalOffset(offset); + else + SetVerticalOffset(offset); + } + + /// + protected override double GetLineUpScrollAmount() + => -Math.Min(ChildSize.Height * ScrollLineDeltaItem, Viewport.Height); + + /// + protected override double GetLineDownScrollAmount() + => Math.Min(ChildSize.Height * ScrollLineDeltaItem, Viewport.Height); + + /// + protected override double GetLineLeftScrollAmount() + => -Math.Min(ChildSize.Width * ScrollLineDeltaItem, Viewport.Width); + + /// + protected override double GetLineRightScrollAmount() + => Math.Min(ChildSize.Width * ScrollLineDeltaItem, Viewport.Width); + + /// + protected override double GetMouseWheelUpScrollAmount() + => -Math.Min(ChildSize.Height * MouseWheelDeltaItem, Viewport.Height); + + /// + protected override double GetMouseWheelDownScrollAmount() + => Math.Min(ChildSize.Height * MouseWheelDeltaItem, Viewport.Height); + + /// + protected override double GetMouseWheelLeftScrollAmount() + => -Math.Min(ChildSize.Width * MouseWheelDeltaItem, Viewport.Width); + + /// + protected override double GetMouseWheelRightScrollAmount() + => Math.Min(ChildSize.Width * MouseWheelDeltaItem, Viewport.Width); + + /// + protected override double GetPageUpScrollAmount() + => -Viewport.Height; + + /// + protected override double GetPageDownScrollAmount() + => Viewport.Height; + + /// + protected override double GetPageLeftScrollAmount() + => -Viewport.Width; + + /// + protected override double GetPageRightScrollAmount() + => Viewport.Width; + + /* orientation aware helper methods */ + + /// + /// Gets X panel orientation. + /// + protected double GetX(Point point) + => Orientation == Orientation.Vertical ? point.X : point.Y; + + /// + /// Gets Y panel orientation. + /// + protected double GetY(Point point) + => Orientation == Orientation.Vertical ? point.Y : point.X; + + /// + /// Gets panel width. + /// + protected double GetWidth(Size size) + => Orientation == Orientation.Vertical ? size.Width : size.Height; + + /// + /// Gets panel height. + /// + protected double GetHeight(Size size) + => Orientation == Orientation.Vertical ? size.Height : size.Width; + + /// + /// Defines panel size. + /// + protected Size CreateSize(double width, double height) => + Orientation == Orientation.Vertical ? new Size(width, height) : new Size(height, width); + + /// + /// Defines panel coordinates and size. + /// + protected Rect CreateRect(double x, double y, double width, double height) + => Orientation == Orientation.Vertical + ? new Rect(x, y, width, height) + : new Rect(y, x, width, height); +} diff --git a/RevitLookup.UI/Converters/BrushToColorConverter.cs b/RevitLookup.UI/Converters/BrushToColorConverter.cs index 00d1f9e86..c51b6691a 100644 --- a/RevitLookup.UI/Converters/BrushToColorConverter.cs +++ b/RevitLookup.UI/Converters/BrushToColorConverter.cs @@ -3,21 +3,21 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Globalization; +using System; using System.Windows.Data; using System.Windows.Media; namespace RevitLookup.UI.Converters; /// -/// Converts to . +/// Converts to . /// internal class BrushToColorConverter : IValueConverter { /// - /// Converts to . + /// Converts to . /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value is SolidColorBrush brush) return brush.Color; @@ -26,15 +26,15 @@ public object Convert(object value, Type targetType, object parameter, CultureIn return value; // We draw red to visibly see an invalid bind in the UI. - return new Color {A = 255, R = 255, G = 0, B = 0}; + return new Color { A = 255, R = 255, G = 0, B = 0 }; } /// - /// Not Implemented. + /// Not Implemented. /// /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Converters/FallbackBrushConverter.cs b/RevitLookup.UI/Converters/FallbackBrushConverter.cs new file mode 100644 index 000000000..4124bcf34 --- /dev/null +++ b/RevitLookup.UI/Converters/FallbackBrushConverter.cs @@ -0,0 +1,40 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows.Data; +using System.Windows.Media; + +namespace RevitLookup.UI.Converters; + +/// +/// Converts to . +/// +internal class FallbackBrushConverter : IValueConverter +{ + /// + /// Converts to . + /// + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if (value is SolidColorBrush brush) + return brush; + + if (value is Color) + return new SolidColorBrush((Color)value); + + // We draw red to visibly see an invalid bind in the UI. + return new SolidColorBrush(new Color { A = 255, R = 255, G = 0, B = 0 }); + } + + /// + /// Not Implemented. + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/RevitLookup.UI/Converters/IconNotEmptyConverter.cs b/RevitLookup.UI/Converters/IconNotEmptyConverter.cs index 1913773b3..3e1265370 100644 --- a/RevitLookup.UI/Converters/IconNotEmptyConverter.cs +++ b/RevitLookup.UI/Converters/IconNotEmptyConverter.cs @@ -3,35 +3,34 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Globalization; +using System; using System.Windows.Data; -using RevitLookup.UI.Common; namespace RevitLookup.UI.Converters; /// -/// Checks if the is valid and not empty. +/// Checks if the is valid and not empty. /// internal class IconNotEmptyConverter : IValueConverter { /// - /// Checks if the is valid and not empty. + /// Checks if the is valid and not empty. /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - if (value is SymbolRegular icon) - return icon != SymbolRegular.Empty; + if (value is Common.SymbolRegular icon) + return icon != Common.SymbolRegular.Empty; return false; } /// - /// Not Implemented. + /// Not Implemented. /// /// public object ConvertBack(object value, Type targetType, object parameter, - CultureInfo culture) + System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Converters/IconToStringConverter.cs b/RevitLookup.UI/Converters/IconToStringConverter.cs index 90a7c2186..a53cc39a7 100644 --- a/RevitLookup.UI/Converters/IconToStringConverter.cs +++ b/RevitLookup.UI/Converters/IconToStringConverter.cs @@ -3,23 +3,24 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Globalization; +using System; using System.Windows.Data; using RevitLookup.UI.Common; +using RevitLookup.UI.Extensions; namespace RevitLookup.UI.Converters; /// -/// Converts using or to . +/// Converts using or to . /// internal class IconToStringConverter : IValueConverter { /// - /// Converts or to . - /// If the given value is or it will simply be returned as a . + /// Converts or to . + /// If the given value is or it will simply be returned as a . /// - /// representing or . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + /// representing or . + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) return null; @@ -40,11 +41,11 @@ public object Convert(object value, Type targetType, object parameter, CultureIn } /// - /// Not Implemented. + /// Not Implemented. /// /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Converters/ObjectToSymbolConverter.cs b/RevitLookup.UI/Converters/ObjectToSymbolConverter.cs new file mode 100644 index 000000000..49bc3066f --- /dev/null +++ b/RevitLookup.UI/Converters/ObjectToSymbolConverter.cs @@ -0,0 +1,43 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows.Data; +using RevitLookup.UI.Common; +using RevitLookup.UI.Extensions; + +namespace RevitLookup.UI.Converters; + +/// +/// Tries to convert to . +/// +internal class ObjectToSymbolConverter : IValueConverter +{ + /// + /// Converts to . + /// If the given value is or it will simply be returned as a . + /// + /// Valid or if failed. + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if (value is SymbolRegular symbol) + return symbol; + + if (value is SymbolFilled symbolFilled) + return symbolFilled.Swap(); + + return SymbolRegular.Empty; + } + + /// + /// Not Implemented. + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } +} + diff --git a/RevitLookup.UI/Converters/ProgressThicknessConverter.cs b/RevitLookup.UI/Converters/ProgressThicknessConverter.cs index 8fd07591b..89a541746 100644 --- a/RevitLookup.UI/Converters/ProgressThicknessConverter.cs +++ b/RevitLookup.UI/Converters/ProgressThicknessConverter.cs @@ -3,20 +3,20 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Globalization; +using System; using System.Windows.Data; namespace RevitLookup.UI.Converters; /// -/// Converts Height to Thickness. +/// Converts Height to Thickness. /// -internal class ProgressThicknessConverter : IValueConverter +class ProgressThicknessConverter : IValueConverter { /// - /// Checks if the is valid and not empty. + /// Checks if the is valid and not empty. /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // TODO: It's too hardcoded, we should define better formula. @@ -27,12 +27,12 @@ public object Convert(object value, Type targetType, object parameter, CultureIn } /// - /// Not Implemented. + /// Not Implemented. /// /// public object ConvertBack(object value, Type targetType, object parameter, - CultureInfo culture) + System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Converters/TextToAsteriskConverter.cs b/RevitLookup.UI/Converters/TextToAsteriskConverter.cs index 4c848dfdc..2535eae2f 100644 --- a/RevitLookup.UI/Converters/TextToAsteriskConverter.cs +++ b/RevitLookup.UI/Converters/TextToAsteriskConverter.cs @@ -3,7 +3,7 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Globalization; +using System; using System.Windows.Data; namespace RevitLookup.UI.Converters; @@ -11,19 +11,19 @@ namespace RevitLookup.UI.Converters; internal class TextToAsteriskConverter : IValueConverter { /// - /// Converts to . + /// Converts to . /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return new string('*', value?.ToString()?.Length ?? 0); } /// - /// Not Implemented. + /// Not Implemented. /// /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Dpi/Dpi.cs b/RevitLookup.UI/Dpi/Dpi.cs new file mode 100644 index 000000000..1eaba4182 --- /dev/null +++ b/RevitLookup.UI/Dpi/Dpi.cs @@ -0,0 +1,63 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; + +namespace RevitLookup.UI.Dpi; + +/// +/// Stores DPI information from which a System.Windows.Media.Visual or System.Windows.UIElement +/// is rendered. +/// +public struct Dpi +{ + /// + /// Initializes a new instance of the System.Windows.DpiScale structure. + /// + /// The DPI scale on the X axis. + /// The DPI scale on the Y axis. + public Dpi(double dpiScaleX, double dpiScaleY) + { + DpiScaleX = dpiScaleX; + DpiScaleY = dpiScaleY; + + DpiX = (int)Math.Round(DpiHelper.DefaultDpi * dpiScaleX, MidpointRounding.AwayFromZero); + DpiY = (int)Math.Round(DpiHelper.DefaultDpi * dpiScaleY, MidpointRounding.AwayFromZero); + } + + /// + /// Initializes a new instance of the System.Windows.DpiScale structure. + /// + /// The DPI on the X axis. + /// The DPI on the Y axis. + public Dpi(int dpiX, int dpiY) + { + DpiX = dpiX; + DpiY = dpiY; + + DpiScaleX = dpiX / (double)DpiHelper.DefaultDpi; + DpiScaleY = dpiY / (double)DpiHelper.DefaultDpi; + } + + /// + /// Gets the DPI on the X axis. + /// + public int DpiX { get; } + + /// + /// Gets the DPI on the Y axis. + /// + public int DpiY { get; } + + /// + /// Gets the DPI scale on the X axis. + /// + public double DpiScaleX { get; } + + /// + /// Gets the DPI scale on the Y axis. + /// + public double DpiScaleY { get; } +} + diff --git a/RevitLookup.UI/Dpi/DpiChangedEventArgs.cs b/RevitLookup.UI/Dpi/DpiChangedEventArgs.cs new file mode 100644 index 000000000..4c3ce986c --- /dev/null +++ b/RevitLookup.UI/Dpi/DpiChangedEventArgs.cs @@ -0,0 +1,20 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Windows; + +namespace RevitLookup.UI.Dpi; + +public sealed class DpiChangedEventArgs : RoutedEventArgs +{ + /// + /// Gets the scale information after a DPI change. + /// + public Dpi NewDpi { get; } + + /// + /// Gets the DPI scale information before a DPI change. + /// + public Dpi OldDpi { get; } +} diff --git a/RevitLookup.UI/Dpi/DpiHelper.cs b/RevitLookup.UI/Dpi/DpiHelper.cs new file mode 100644 index 000000000..a3ab7ee8c --- /dev/null +++ b/RevitLookup.UI/Dpi/DpiHelper.cs @@ -0,0 +1,162 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows; +using System.Windows.Interop; +using System.Windows.Media; +using RevitLookup.UI.Interop; + +namespace RevitLookup.UI.Dpi; + +/// +/// Provides access to various DPI-related methods. +/// +internal static class DpiHelper +{ + [ThreadStatic] + private static Matrix _transformToDevice; + + [ThreadStatic] + private static Matrix _transformToDip; + + /// + /// Default DPI value. + /// + internal const int DefaultDpi = 96; + + /// + /// Occurs when application DPI is changed. + /// + //public static event EventHandler DpiChanged; + + /// + /// Gets DPI of the selected . + /// + /// The window that you want to get information about. + public static Dpi GetWindowDpi(Window window) + { + if (window == null) + return new Dpi(DefaultDpi, DefaultDpi); + + return GetWindowDpi(new WindowInteropHelper(window).Handle); + } + + /// + /// Gets DPI of the selected based on it's handle. + /// + /// Handle of the window that you want to get information about. + public static Dpi GetWindowDpi(IntPtr windowHandle) + { + if (windowHandle == IntPtr.Zero || !UnsafeNativeMethods.IsValidWindow(windowHandle)) + return new Dpi(DefaultDpi, DefaultDpi); + + var windowDpi = (int)User32.GetDpiForWindow(windowHandle); + + return new Dpi(windowDpi, windowDpi); + } + + // TODO: Look into utilizing preprocessor symbols for more functionality + // ---- + // There is an opportunity to check against NET46 if we can use + // VisualTreeHelper in this class. We are currently not utilizing + // it because it is not available in .NET Framework 4.6 (available + // starting 4.6.2). For now, there is no need to overcomplicate this + // solution for some infrequent DPI calculations. However, if this + // becomes more central to various implementations, we may want to + // look into fleshing it out a bit further. + // ---- + // Reference: https://docs.microsoft.com/en-us/dotnet/standard/frameworks + + /// + /// Gets the DPI values from . + /// + /// The DPI values from . If the property cannot be accessed, the default value is returned. + public static Dpi GetSystemDpi() + { + var dpiXProperty = typeof(SystemParameters).GetProperty("DpiX", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); + + if (dpiXProperty == null) + return new Dpi(DefaultDpi, DefaultDpi); + + var dpiYProperty = typeof(SystemParameters).GetProperty("Dpi", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); + + if (dpiYProperty == null) + return new Dpi(DefaultDpi, DefaultDpi); + + return new Dpi( + (int)dpiXProperty.GetValue(null, null)!, + (int)dpiYProperty.GetValue(null, null)!); + } + + /// + /// Convert a point in device independent pixels (1/96") to a point in the system coordinates. + /// + /// A point in the logical coordinate system. + /// Horizontal DPI scale. + /// Vertical DPI scale. + /// Returns the parameter converted to the system's coordinates. + public static Point LogicalPixelsToDevice(Point logicalPoint, double dpiScaleX, double dpiScaleY) + { + _transformToDevice = Matrix.Identity; + _transformToDevice.Scale(dpiScaleX, dpiScaleY); + + return _transformToDevice.Transform(logicalPoint); + } + + /// + /// Convert a point in system coordinates to a point in device independent pixels (1/96"). + /// + /// Returns the parameter converted to the device independent coordinate system. + public static Point DevicePixelsToLogical(Point devicePoint, double dpiScaleX, double dpiScaleY) + { + _transformToDip = Matrix.Identity; + _transformToDip.Scale(1d / dpiScaleX, 1d / dpiScaleY); + + return _transformToDip.Transform(devicePoint); + } + + public static Rect LogicalRectToDevice(Rect logicalRectangle, double dpiScaleX, double dpiScaleY) + { + var topLeft = LogicalPixelsToDevice(new Point(logicalRectangle.Left, logicalRectangle.Top), dpiScaleX, dpiScaleY); + var bottomRight = LogicalPixelsToDevice(new Point(logicalRectangle.Right, logicalRectangle.Bottom), dpiScaleX, dpiScaleY); + + return new Rect(topLeft, bottomRight); + } + + public static Rect DeviceRectToLogical(Rect deviceRectangle, double dpiScaleX, double dpiScaleY) + { + var topLeft = DevicePixelsToLogical(new Point(deviceRectangle.Left, deviceRectangle.Top), dpiScaleX, dpiScaleY); + var bottomRight = DevicePixelsToLogical(new Point(deviceRectangle.Right, deviceRectangle.Bottom), dpiScaleX, dpiScaleY); + + return new Rect(topLeft, bottomRight); + } + + public static Size LogicalSizeToDevice(Size logicalSize, double dpiScaleX, double dpiScaleY) + { + var pt = LogicalPixelsToDevice(new Point(logicalSize.Width, logicalSize.Height), dpiScaleX, dpiScaleY); + + return new Size { Width = pt.X, Height = pt.Y }; + } + + public static Size DeviceSizeToLogical(Size deviceSize, double dpiScaleX, double dpiScaleY) + { + var pt = DevicePixelsToLogical(new Point(deviceSize.Width, deviceSize.Height), dpiScaleX, dpiScaleY); + + return new Size(pt.X, pt.Y); + } + + public static Thickness LogicalThicknessToDevice(Thickness logicalThickness, double dpiScaleX, double dpiScaleY) + { + var topLeft = LogicalPixelsToDevice(new Point(logicalThickness.Left, logicalThickness.Top), dpiScaleX, dpiScaleY); + var bottomRight = LogicalPixelsToDevice(new Point(logicalThickness.Right, logicalThickness.Bottom), dpiScaleX, dpiScaleY); + + return new Thickness(topLeft.X, topLeft.Y, bottomRight.X, bottomRight.Y); + } +} + diff --git a/RevitLookup.UI/Extensions/ColorExtensions.cs b/RevitLookup.UI/Extensions/ColorExtensions.cs index d62abdeac..9aac8324d 100644 --- a/RevitLookup.UI/Extensions/ColorExtensions.cs +++ b/RevitLookup.UI/Extensions/ColorExtensions.cs @@ -3,22 +3,23 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; using System.Windows.Media; namespace RevitLookup.UI.Extensions; /// -/// Adds an extension for that allows manipulation with HSL and HSV color spaces. +/// Adds an extension for that allows manipulation with HSL and HSV color spaces. /// public static class ColorExtensions { /// - /// Maximum size with the current precision. + /// Maximum size with the current precision. /// - private static readonly float ByteMax = byte.MaxValue; + private static float ByteMax = (float)byte.MaxValue; /// - /// Creates a from a . + /// Creates a from a . /// /// Input color. /// @@ -28,66 +29,66 @@ public static SolidColorBrush ToBrush(this Color color) } /// - /// Creates a from a with defined brush opacity. + /// Creates a from a with defined brush opacity. /// /// Input color. /// Degree of opacity. /// public static SolidColorBrush ToBrush(this Color color, double opacity) { - return new SolidColorBrush {Color = color, Opacity = opacity}; + return new SolidColorBrush { Color = color, Opacity = opacity }; } /// - /// Gets luminance based on HSL space. + /// Gets luminance based on HSL space. /// /// Input color. public static double GetLuminance(this Color color) { var (hue, saturation, luminance) = color.ToHsl(); - return luminance; + return (double)luminance; } /// - /// Gets brightness based on HSV space. + /// Gets brightness based on HSV space. /// /// Input color. public static double GetBrightness(this Color color) { var (hue, saturation, brightness) = color.ToHsv(); - return brightness; + return (double)brightness; } /// - /// Gets hue based on HSV space. + /// Gets hue based on HSV space. /// /// Input color. public static double GetHue(this Color color) { var (hue, saturation, brightness) = color.ToHsv(); - return hue; + return (double)hue; } /// - /// Gets saturation based on HSV space. + /// Gets saturation based on HSV space. /// /// Input color. public static double GetSaturation(this Color color) { var (hue, saturation, brightness) = color.ToHsv(); - return saturation; + return (double)saturation; } /// - /// Allows to change the luminance by a factor based on the HSL color space. + /// Allows to change the luminance by a factor based on the HSL color space. /// /// Input color. - /// The value of the luminance change factor from to . - /// Updated . + /// The value of the luminance change factor from to . + /// Updated . public static Color UpdateLuminance(this Color color, float factor) { if (factor > 100f || factor < -100f) @@ -109,11 +110,11 @@ public static Color UpdateLuminance(this Color color, float factor) } /// - /// Allows to change the saturation by a factor based on the HSL color space. + /// Allows to change the saturation by a factor based on the HSL color space. /// /// Input color. - /// The value of the saturation change factor from to . - /// Updated . + /// The value of the saturation change factor from to . + /// Updated . public static Color UpdateSaturation(this Color color, float factor) { if (factor > 100f || factor < -100f) @@ -136,11 +137,11 @@ public static Color UpdateSaturation(this Color color, float factor) } /// - /// Allows to change the brightness by a factor based on the HSV color space. + /// Allows to change the brightness by a factor based on the HSV color space. /// /// Input color. - /// The value of the brightness change factor from to . - /// Updated . + /// The value of the brightness change factor from to . + /// Updated . public static Color UpdateBrightness(this Color color, float factor) { if (factor > 100f || factor < -100f) @@ -163,13 +164,13 @@ public static Color UpdateBrightness(this Color color, float factor) } /// - /// Allows to change the brightness, saturation and luminance by a factors based on the HSL and HSV color space. + /// Allows to change the brightness, saturation and luminance by a factors based on the HSL and HSV color space. /// /// - /// The value of the brightness change factor from to . - /// The value of the saturation change factor from to . - /// The value of the luminance change factor from to . - /// Updated . + /// The value of the brightness change factor from to . + /// The value of the saturation change factor from to . + /// The value of the luminance change factor from to . + /// Updated . public static Color Update(this Color color, float brightnessFactor, float saturationFactor = 0, float luminanceFactor = 0) { @@ -213,10 +214,10 @@ public static Color Update(this Color color, float brightnessFactor, float satur } /// - /// HSL representation models the way different paints mix together to create colour in the real world, - /// with the lightness dimension resembling the varying amounts of black or white paint in the mixture. + /// HSL representation models the way different paints mix together to create colour in the real world, + /// with the lightness dimension resembling the varying amounts of black or white paint in the mixture. /// - /// hue, saturation, lightness + /// hue, saturation, lightness public static (float, float, float) ToHsl(this Color color) { int red = color.R; @@ -234,7 +235,7 @@ public static (float, float, float) ToHsl(this Color color) return (0f, 0f, 0f); saturation = 0.0f; - lightness = (max + min) / ByteMax / 2.0f; + lightness = ((max + min) / ByteMax) / 2.0f; if (fDelta <= 0.0) return (0f, saturation * 100f, lightness * 100f); @@ -242,11 +243,11 @@ public static (float, float, float) ToHsl(this Color color) saturation = fDelta / (max / ByteMax); if (max == red) - hue = (green - blue) / ByteMax / fDelta; + hue = ((green - blue) / ByteMax) / fDelta; else if (max == green) - hue = 2f + (blue - red) / ByteMax / fDelta; + hue = 2f + (((blue - red) / ByteMax) / fDelta); else - hue = 4f + (red - green) / ByteMax / fDelta; + hue = 4f + (((red - green) / ByteMax) / fDelta); if (hue < 0) hue += 360; @@ -255,9 +256,9 @@ public static (float, float, float) ToHsl(this Color color) } /// - /// HSV representation models how colors appear under light. + /// HSV representation models how colors appear under light. /// - /// hue, saturation, brightness + /// hue, saturation, brightness public static (float, float, float) ToHsv(this Color color) { int red = color.R; @@ -281,11 +282,11 @@ public static (float, float, float) ToHsv(this Color color) return (0f, saturation * 100f, value * 100f); if (max == red) - hue = (green - blue) / ByteMax / fDelta; + hue = ((green - blue) / ByteMax) / fDelta; else if (max == green) - hue = 2f + (blue - red) / ByteMax / fDelta; + hue = 2f + (((blue - red) / ByteMax) / fDelta); else - hue = 4f + (red - green) / ByteMax / fDelta; + hue = 4f + (((red - green) / ByteMax) / fDelta); if (hue < 0) hue += 360; @@ -294,13 +295,13 @@ public static (float, float, float) ToHsv(this Color color) } /// - /// Converts the color values stored as HSL to RGB. + /// Converts the color values stored as HSL to RGB. /// public static (int, int, int) FromHslToRgb(float hue, float saturation, float lightness) { if (AlmostEquals(saturation, 0, 0.01f)) { - var color = (int) (lightness * ByteMax); + var color = (int)(lightness * ByteMax); return (color, color, color); } @@ -318,7 +319,7 @@ public static (int, int, int) FromHslToRgb(float hue, float saturation, float li } /// - /// Converts the color values stored as HSV (HSB) to RGB. + /// Converts the color values stored as HSV (HSB) to RGB. /// public static (int, int, int) FromHsvToRgb(float hue, float saturation, float brightness) { @@ -326,7 +327,7 @@ public static (int, int, int) FromHsvToRgb(float hue, float saturation, float br if (AlmostEquals(saturation, 0, 0.01f)) { - red = green = blue = (int) (brightness / 100f * ByteMax + 0.5f); + red = green = blue = (int)(((brightness / 100f) * ByteMax) + 0.5f); return (red, green, blue); } @@ -335,49 +336,49 @@ public static (int, int, int) FromHsvToRgb(float hue, float saturation, float br brightness /= 100f; saturation /= 100f; - var hueAngle = (hue - (float) Math.Floor(hue)) * 6.0f; - var f = hueAngle - (float) Math.Floor(hueAngle); + var hueAngle = (hue - (float)Math.Floor(hue)) * 6.0f; + var f = hueAngle - (float)Math.Floor(hueAngle); var p = brightness * (1.0f - saturation); var q = brightness * (1.0f - saturation * f); - var t = brightness * (1.0f - saturation * (1.0f - f)); + var t = brightness * (1.0f - (saturation * (1.0f - f))); - switch ((int) hueAngle) + switch ((int)hueAngle) { case 0: - red = (int) (brightness * 255.0f + 0.5f); - green = (int) (t * 255.0f + 0.5f); - blue = (int) (p * 255.0f + 0.5f); + red = (int)(brightness * 255.0f + 0.5f); + green = (int)(t * 255.0f + 0.5f); + blue = (int)(p * 255.0f + 0.5f); break; case 1: - red = (int) (q * 255.0f + 0.5f); - green = (int) (brightness * 255.0f + 0.5f); - blue = (int) (p * 255.0f + 0.5f); + red = (int)(q * 255.0f + 0.5f); + green = (int)(brightness * 255.0f + 0.5f); + blue = (int)(p * 255.0f + 0.5f); break; case 2: - red = (int) (p * 255.0f + 0.5f); - green = (int) (brightness * 255.0f + 0.5f); - blue = (int) (t * 255.0f + 0.5f); + red = (int)(p * 255.0f + 0.5f); + green = (int)(brightness * 255.0f + 0.5f); + blue = (int)(t * 255.0f + 0.5f); break; case 3: - red = (int) (p * 255.0f + 0.5f); - green = (int) (q * 255.0f + 0.5f); - blue = (int) (brightness * 255.0f + 0.5f); + red = (int)(p * 255.0f + 0.5f); + green = (int)(q * 255.0f + 0.5f); + blue = (int)(brightness * 255.0f + 0.5f); break; case 4: - red = (int) (t * 255.0f + 0.5f); - green = (int) (p * 255.0f + 0.5f); - blue = (int) (brightness * 255.0f + 0.5f); + red = (int)(t * 255.0f + 0.5f); + green = (int)(p * 255.0f + 0.5f); + blue = (int)(brightness * 255.0f + 0.5f); break; case 5: - red = (int) (brightness * 255.0f + 0.5f); - green = (int) (p * 255.0f + 0.5f); - blue = (int) (q * 255.0f + 0.5f); + red = (int)(brightness * 255.0f + 0.5f); + green = (int)(p * 255.0f + 0.5f); + blue = (int)(q * 255.0f + 0.5f); break; } @@ -386,7 +387,7 @@ public static (int, int, int) FromHsvToRgb(float hue, float saturation, float br } /// - /// Calculates the color component for HSL. + /// Calculates the color component for HSL. /// private static int CalcHslChannel(float color, float saturation, float lightness) { @@ -406,30 +407,30 @@ private static int CalcHslChannel(float color, float saturation, float lightness num2 = 2f * lightness - num1; if (color * 6f < 1) - return (int) ((num2 + (num1 - num2) * 6f * color) * ByteMax); + return (int)((num2 + (num1 - num2) * 6f * color) * ByteMax); if (color * 2f < 1) - return (int) (num1 * ByteMax); + return (int)(num1 * ByteMax); if (color * 3f < 2) - return (int) ((num2 + (num1 - num2) * (0.666666666f - color) * 6f) * ByteMax); + return (int)((num2 + (num1 - num2) * (0.666666666f - color) * 6f) * ByteMax); - return (int) (num2 * ByteMax); + return (int)(num2 * ByteMax); } /// - /// Whether the floating point number is about the same. + /// Whether the floating point number is about the same. /// private static bool AlmostEquals(float numberOne, float numberTwo, float precision = 0) { if (precision <= 0) precision = float.Epsilon; - return numberOne >= numberTwo - precision && numberOne <= numberTwo + precision; + return numberOne >= (numberTwo - precision) && numberOne <= (numberTwo + precision); } /// - /// Absolute percentage. + /// Absolute percentage. /// private static float ToPercentage(float value) { @@ -442,7 +443,7 @@ private static float ToPercentage(float value) } /// - /// Absolute byte. + /// Absolute byte. /// private static byte ToColorByte(int value) { @@ -454,4 +455,4 @@ private static byte ToColorByte(int value) return Convert.ToByte(value); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Extensions/ContextMenuExtensions.cs b/RevitLookup.UI/Extensions/ContextMenuExtensions.cs index c0c959fbd..bf651ccdf 100644 --- a/RevitLookup.UI/Extensions/ContextMenuExtensions.cs +++ b/RevitLookup.UI/Extensions/ContextMenuExtensions.cs @@ -1,17 +1,23 @@ -using System.Windows; +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows; using System.Windows.Controls; using System.Windows.Interop; using RevitLookup.UI.Appearance; +using RevitLookup.UI.Interop; namespace RevitLookup.UI.Extensions; /// -/// Extensions for the . +/// Extensions for the . /// internal static class ContextMenuExtensions { /// - /// Tries to apply Mica effect to the . + /// Tries to apply Mica effect to the . /// public static void ApplyMica(this ContextMenu contextMenu) { @@ -28,12 +34,12 @@ private static void ContextMenuOnOpened(object sender, RoutedEventArgs e) if (source == null) return; - if (Theme.IsMatchedDark()) - Background.ApplyDarkMode(source.Handle); + if (Theme.GetAppTheme() == ThemeType.Dark) + UnsafeNativeMethods.ApplyWindowDarkMode(source.Handle); // Needs more work with the Popup service //if (Background.Apply(source.Handle, BackgroundType.Mica)) // contextMenu.Background = Brushes.Transparent; } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Extensions/DateTimeExtensions.cs b/RevitLookup.UI/Extensions/DateTimeExtensions.cs new file mode 100644 index 000000000..7e1872349 --- /dev/null +++ b/RevitLookup.UI/Extensions/DateTimeExtensions.cs @@ -0,0 +1,40 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; + +namespace RevitLookup.UI.Extensions; + +/// +/// A collection of several extensions to the class. +/// +public static class DateTimeExtensions +{ + /// + /// Gets the number of seconds that have elapsed since the Unix epoch, excluding leap seconds. The Unix epoch is 00:00:00 UTC on 1 January 1970. + /// + public static long GetTimestamp(this DateTime dateTime) + { + return (long)dateTime.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; + } + + /// + /// Gets the number of milliseconds that have elapsed since the Unix epoch, excluding leap seconds. The Unix epoch is 00:00:00 UTC on 1 January 1970. + /// + public static long GetMillisTimestamp(this DateTime dateTime) + { + // Should be 10^-3 + return (long)dateTime.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds; + } + + /// + /// Gets the number of microseconds that have elapsed since the Unix epoch, excluding leap seconds. The Unix epoch is 00:00:00 UTC on 1 January 1970. + /// + public static long GetMicroTimestamp(this DateTime dateTime) + { + // Should be 10^-6 + return (long)dateTime.Subtract(new DateTime(1970, 1, 1)).Ticks / (TimeSpan.TicksPerMillisecond / 1000); + } +} diff --git a/RevitLookup.UI/Extensions/FrameExtensions.cs b/RevitLookup.UI/Extensions/FrameExtensions.cs new file mode 100644 index 000000000..db91c1ad7 --- /dev/null +++ b/RevitLookup.UI/Extensions/FrameExtensions.cs @@ -0,0 +1,35 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows; +using System.Windows.Controls; + +namespace RevitLookup.UI.Extensions; + +/// +/// Set of extensions for . +/// +public static class FrameExtensions +{ + /// + /// Gets from . + /// + /// Selected frame. + /// DataContext of currently active element, otherwise . + public static object GetDataContext(this Frame frame) + { + return frame.Content is not FrameworkElement element ? null : element.DataContext; + } + + /// + /// Cleans journal. + /// + /// Selected frame. + public static void CleanNavigation(this Frame frame) + { + while (frame.CanGoBack) + frame.RemoveBackEntry(); + } +} diff --git a/RevitLookup.UI/Extensions/SymbolExtensions.cs b/RevitLookup.UI/Extensions/SymbolExtensions.cs new file mode 100644 index 000000000..0adc482b3 --- /dev/null +++ b/RevitLookup.UI/Extensions/SymbolExtensions.cs @@ -0,0 +1,81 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using RevitLookup.UI.Common; + +namespace RevitLookup.UI.Extensions; + +/// +/// Set of extensions for the enumeration of icons to facilitate their management and replacement. +/// +public static class SymbolExtensions +{ + /// + /// Replaces with . + /// + public static SymbolFilled Swap(this SymbolRegular icon) + { + // It is possible that the alternative icon does not exist + return Glyph.ParseFilled(icon.ToString()); + } + + /// + /// Replaces with . + /// + public static SymbolRegular Swap(this SymbolFilled icon) + { + // It is possible that the alternative icon does not exist + return Glyph.Parse(icon.ToString()); + } + + /// + /// Converts to based on the ID. + /// + public static char GetGlyph(this SymbolRegular icon) + { + return ToChar(icon); + } + + /// + /// Converts to based on the ID. + /// + public static char GetGlyph(this SymbolFilled icon) + { + return ToChar(icon); + } + + /// + /// Converts to based on the ID. + /// + public static string GetString(this SymbolRegular icon) + { + return icon.GetGlyph().ToString(); + } + + /// + /// Converts to based on the ID. + /// + public static string GetString(this SymbolFilled icon) + { + return icon.GetGlyph().ToString(); + } + + /// + /// Converts to . + /// + private static char ToChar(SymbolRegular icon) + { + return Convert.ToChar(icon); + } + + /// + /// Converts to . + /// + private static char ToChar(SymbolFilled icon) + { + return Convert.ToChar(icon); + } +} diff --git a/RevitLookup.UI/Extensions/UriExtensions.cs b/RevitLookup.UI/Extensions/UriExtensions.cs new file mode 100644 index 000000000..cd732cf26 --- /dev/null +++ b/RevitLookup.UI/Extensions/UriExtensions.cs @@ -0,0 +1,63 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Linq; + +namespace RevitLookup.UI.Extensions; + +/// +/// Extensions for class. +/// +public static class UriExtensions +{ + /// + /// Removes last segment of the . + /// + public static Uri TrimLastSegment(this Uri uri) + { + if (uri.Segments.Length < 2) + return uri; + +#if NET5_0_OR_GREATER + var uriLastSegmentLength = uri.Segments[^1].Length; +#else + var uriLastSegmentLength = uri.Segments[uri.Segments.Length - 1].Length; +#endif + var uriOriginalString = uri.ToString(); + + return new Uri(uriOriginalString.Substring(0, uriOriginalString.Length - uriLastSegmentLength), UriKind.RelativeOrAbsolute); + } + + /// + /// Determines whether the end of is equal to provided value. + /// + public static bool EndsWith(this Uri uri, string value) + { + var uriString = uri.ToString(); + + return uri.ToString().EndsWith(value); + } + + /// + /// Append provided segments to the . + /// + public static Uri Append(this Uri uri, params string[] segments) + { + if (!uri.IsAbsoluteUri) + return uri; // or throw? + + return new Uri(segments.Aggregate(uri.AbsoluteUri, (current, path) => string.Format("{0}/{1}", current.TrimEnd('/').TrimEnd('\\'), path.TrimStart('/').TrimStart('\\')))); + } + + /// + /// Append new to the . + /// + public static Uri Append(this Uri uri, Uri value) + { + return new Uri(string.Format("{0}/{1}", uri.ToString().TrimEnd('/').TrimEnd('\\'), value.ToString().TrimStart('/').TrimStart('\\')), UriKind.RelativeOrAbsolute); + } +} + diff --git a/RevitLookup.UI/Extensions/WindowExtensions.cs b/RevitLookup.UI/Extensions/WindowExtensions.cs index 481aa9185..d05dc5401 100644 --- a/RevitLookup.UI/Extensions/WindowExtensions.cs +++ b/RevitLookup.UI/Extensions/WindowExtensions.cs @@ -1,12 +1,140 @@ -using System.Windows; +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. -namespace RevitLookup.UI.Extensions; +using System.Windows; +using System.Windows.Interop; +using System.Windows.Media; +using RevitLookup.UI.Appearance; +using RevitLookup.UI.Interop; -// TODO: +namespace RevitLookup.UI.Extensions; -internal static class WindowExtensions +/// +/// Set of extensions for . +/// +public static class WindowExtensions { - public static void ApplyMica(this Window window) + #region Styles + + //public static Window GandalfDoMagic(this Window window) + //{ + // window.Loaded += (sender, args) => + // { + // var windowHandle = new WindowInteropHelper(window).Handle; + + // var styles = (long)(Interop.User32.WS.CAPTION); + // //var styles = (long)(User32.WINDOW_STYLE.WS_BORDER | User32.WINDOW_STYLE.WS_SIZEFRAME); + // var exStyles = (long)(Interop.User32.WS_EX.CLIENTEDGE | Interop.User32.WS_EX.LAYERED | Interop.User32.WS_EX.TRANSPARENT); + + // //User32.SetWindowLong(windowHandle, User32.WINDOWLONGFLAG.GWL_STYLE, styles); + // Interop.User32.SetWindowLong(windowHandle, Interop.User32.GWL.GWL_EXSTYLE, exStyles); + // }; + + // return window; + //} + + /// + /// Tries to aplly backdrop effect to selected . + /// + /// + /// + /// + public static Window ApplyBackdrop(this Window window, BackgroundType backgroundType) + { + Background.Apply(window, backgroundType); + + return window; + } + + public static Window RemoveAllStyles(this Window window) { + if (window.IsLoaded) + RemoveWindowStyles(window); + else + window.Loaded += WindowRemoveStylesOnLoaded; + + return window; } -} \ No newline at end of file + + private static void WindowRemoveStylesOnLoaded(object sender, RoutedEventArgs e) + { + RemoveWindowStyles(sender as Window); + } + + private static void RemoveWindowStyles(Window window) + { + var windowHandle = new WindowInteropHelper(window).Handle; + + // Default WPF window style NONE is WS_CAPTION + User32.SetWindowLong(windowHandle, User32.GWL.GWL_STYLE, (long)User32.WS.BORDER); + } + + #endregion + + #region Titlebar + + /// + /// Tries to remove the default titlebar. + /// + /// Selected window. + public static Window RemoveTitlebar(this Window window) + { + if (window.IsLoaded) + UnsafeNativeMethods.RemoveWindowTitlebar(window); + else + window.Loaded += (sender, args) => UnsafeNativeMethods.RemoveWindowTitlebar(window); + + return window; + } + + #endregion + + #region Background + + /// + /// Tries to set the default window background color for the selected theme. + /// + /// Selected window. + public static Window ApplyDefaultBackground(this Window window) + { + var applicationBackgroundRaw = Application.Current.Resources["ApplicationBackgroundColor"]; + + if (applicationBackgroundRaw is not Color backgroundColor) + return window; + + window.Background = new SolidColorBrush { Color = backgroundColor }; + + return window; + } + + #endregion + + #region Mica + + public static void ApplyBackgroundEffect(this Window window) + { + } + + #endregion + + #region Corners + + /// + /// Tries to round the corners. + /// + /// Selected window. + /// Window corner preference. + public static Window ApplyCorners(this Window window, WindowCornerPreference cornerPreference) + { + if (window.IsLoaded) + UnsafeNativeMethods.ApplyWindowCornerPreference(window, cornerPreference); + else + window.Loaded += (sender, args) => UnsafeNativeMethods.ApplyWindowCornerPreference(window, cornerPreference); + + return window; + } + + #endregion +} diff --git a/RevitLookup.UI/Fonts/FluentSystemIcons-Filled.ttf b/RevitLookup.UI/Fonts/FluentSystemIcons-Filled.ttf index 78a88eeccd4eafa50f6dc9b116c9782cafe48111..9f2f697af5516ccd90996a5c1b03e1dd31318387 100644 GIT binary patch delta 301443 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 D4Fy|p delta 219912 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⋘kg@i&*;_ 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¥i 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 >18aV z{80|MFGXNw^J10~(ce=KXQh12VsIP%W?hM2e>kh+yB4!Je|0fS0w&c&LHL{SH|TI{ zu!~KDd);;2Y#ag$-|uEKsGy-s*c4CYFt@8Fk-)kw8(QXaSB$IVmn~t<7D{W&pIyTI zB7FMZTf%0E`g^=%DVtPZDgfF*FMU9;>gh%gl<*Czy)x4bFzWVXQQt=xx*BLA30gar zg0BJaH~(=d>$D1F!{#HGvC)Ikg3OjzK&Y6^uUN(!&9;vb(QNPGV2{jZhjf#3+y~VO zg8^_T?tXX?Tu3iCoSn?A%h?d@jl-9-eM0YJ!h>KpN?=+d?^xub4S?Z+%MSK@3W0uC zNh%GiHHT}uR}8C5m#SgWJKg2bRttA9woDTt3$D_i!?) zHm%bfmCjjSDXboGgc_E-vz!iXo$v=$JxY_}&Kc`8kJ8$zc(iphoN+1t>=A6cfMjW( zuf*V8aTJU3Gl1g2A3O>o%js*Go&WwxrXqCC!mnM+68z04Sv*%zJHBf)GGm~16&p&S zsKs{jKOV`FeEP55avX%Pzs=sVX~V;|Lk8MhPl?8SWx#kv!g*^~e;;@>Tf@Xmb$=f` zM#;u}6*9m%I_>sCB?z%D2}udYAn+Y!K!`N~W}%(Uu4EH+u~eOE&2&vlxMc~#=jtoC z{*mV6h*ELzYgRHQF|Uo^y^_`Qw^y>G%_cAW6+_t5TIR@K`YSfulA^K9n3~(dcn)r6 z7c4qw1RWKj|I|W$$k8kpDh%w;8^!+4%JaL9X7jAIVA{N8XaSP1BSTo1a6lV8O@s#r z&5fp#{Mh3e5_>!iTQC91kOSWnC$g*=0`S#|tkOau06cjTtISV4iM=B9hKc?ZXVI zv*C8dn7YdtGiPu9j#F4bGQ0Tc4Xn=SVtxyftK~hXvn5i;gIKgBSRsSEASg5>4qh#7 z!nzR$trCikzUNHl0x+ZzZQB%7(8f3v^*KWPCwH@E{@1fuh1j`=3um*A{D`yJ3fNlt z4d=2~;>5+Lk&6w?9vOHE)~8E=yEJT~^dLWv%^>5}X2GvnyjGjX8WMyh2E&~H{yf$$ z2n+bm&uz7BR1Rsm6^Im6Oi%`lb)gjSil!wBj3V)gFvu5j1ac#>);$|prPZ(~QJ|Rg z9{3930v2>vERTdWzXlZ_^D|y?0qbob;luPoCp{3N^RwyH^8S3bl-#zM;?~cQ;ntsj z+3~n@1#lH^mogoNrg2(X9u(hcK=mihg&UG~hl)+m_kiZQt`5`MV~ zh9GJgRcBhsk<_*zKjLDRVdOhOH8c1%>=c(@%q9bEx4vvXwQoMPiGO-A8|BQFrW(*X zG&jhHZeit07ntsoz_~oOl_e4;KTs@%IOu-%k8l_H^;_7XIu+KCGCPjCsGB>svI!a$ zSz1;sJnZ7#TUkB!W^-r$8jMI4^w!JyRa;ruio&ovKCqQ7v{DfQ4{l=k)7T7_^*2}xm}1H$tcm}?SzE;(!G(<)07Hh#6s$iKrfm*I zIFh1-`>s$N2f*neyfJ^+WvoF2HcJH}_qJTY0KGx*$gTX4d*BxR@D;3Ds?T}&XIHRx zDRg)vuey>|^B=FmT0iqjHc|8?`MxXJ>Os#70-t>q8*4muPmJP|I5{^C#V6}_~(+hl^=2q3)cG$2m(4BEPwYD9J!0$GZa+=Y#DypH7q9qGlBo< z8kV+@*Bk%f8Wt@#IE3w5oFpvsnOh5d5vZ(T(}LIC1$Hs6l5Y>Vvw*P0n+W!^ZffYnJsM;h{45gO`sBk_7YytHQWo34dqE%KMH1viZmyoRT)V-qdLlv{lr zEWTT>V@)ETaU;8oufK_1mgm1^eFBsld43CfN|x>tcJlW|JF{&=D&rr@VQ>1gRml2 zQ4xEQ4qpo%_ltDxMJNtUR{I_!Itjs0h9ZR0QS)UpEWshe%fknty2qislh*73I#7ZQ z!MIiqLRPqlUx;Zpi`&i5zmrw0fC58s(&K&Kgfm?TJ#`_Or3MeFGmxPp-1jvdg`DQ> z``Wk)Z>|18dJTg_PEpWm8dV|@7KTND&qIzgZ9QaZK`8aelcmbg6r*W~ANHCpL$=AK zu?k^}fwdekn!eO-L4qCg2A`)QCR4K5WP>>;C{CSTH+E1D5N0?Lw}IEeGd;r_|KiRD zyQp8vy@5jGS6f|3@-1A)uYZzxx%P%?3z~hj!DU@t=(m6uedZvJ%g<+?<+hg|)K*ds z0T#h%EB|pg3-gs<*}@u3ZwLIbiUnP&Z#@!!C;66F<%D`7S?JdL)UE{;G5-qw{QugL zyk-Y;W~m9I|L-RB9wjDv;dx&z{D*c7U{W0~Az^8Ygg=`irB}fBL9whTOn{#?ZUFGg zjnt-i#*Tlo9a;+n)EA}(`GHV+TQ1$hz6RWD7COuC?_mj{l}GMnW5lZ6eCfSxnAqLL zuez7z_@D1(f3M3?`YqZf{g6C^6dnl=No+X^B&!_o`>?kId;_Wxj96OXfBgfi3=96Y z;SnVmWd4xv=unw(y*HY0$TyUQ*6_$qmWY>yj`jy#4w!~rxpYOm4bTHGMZFyzvYmy> zUgn4Hgm(SpovcFWEb0Y~>0k!R(tC<3!m$zG!w`HoBX#>3nPRp^|@eA2{zy7(I%@6?F_H20x zE=W^`&~xi9Rs-0Y7k9CpBDS4P_p|rSw=uP0gq zQQK^CZVa0I?QV88@CfmraIZmG{AgMXOm`)uI4ZWds7%4wbaqnw?ad1QT0w+^Qd-Vs zfUeSR{KL!BXA{}`hz@;yZihWNscQXIReL}4I+XVU2#C}#uX<#B)iEkgcN#RZ!?+s= z{kewu7hLdh)BQ@{r-J-$)6R37XQy4rDpydt-D=GPWo8UC`cfZf|{V-sa68wcjf^ z`o49%-G1-p_IdT1+k>t$`-`RlgPNk$G0`C^NQ;!lq99MJeRQk%J}|c|pP^0Uve*sL+a)P&Mot{$?Lwdzy{dLu~nm z2{hf>+?K8w#M7=AKX6zv0}9rh_A(s00kF=>i8S z#21IS3B!nDq=q|%X4@Gq>(Rv>*p~?_1AA0Pw^k1iEj~`ORu3x`b{b2le@9=n%IZ2T zoatLKuoaFC4X?K98`qZ(tF{uOQkZ#vL$ed0+A{|?njE+d$!LIiKp$ivkz!B{4hAMG zaxzE6R*;X};S2$((_~^)CwR;P8*`GKfy@Z!)@3A{l&Q1GQnw^66Rc;Hl}U;$;fT19 zLFXou*J(p~%M{_8g3I&k6|rM;l7!4TZ-` z4LLM4*MNo|E=flS){6jLW=SNhQ1)2jaSJlTTL*nB%-7{MuQm_gDpF)V`jIH?pMiMh%!+QQB zoLCWX%((5mo}Lo(#fH^KMs7|WR6l?1UX~Pk%OQ}Ns4SEywfVo{jS;9BTz|mJ`Ok=C z*Mxh{T4NkwjjRdx^qjR8P-JUys1bJJuy*a*^HIZa4T5aetXV@Jz(1p}Yl|BYl&$&k zkF$RXQF7WdFw}nD0ajvz3%bSAo@AgBCYahl7x1f}WUb`NP8e&(W&XyK&^Xq=%a-z^ z7g{3u6ZXM=Cx$b8&r__^L);EviixISrcs^|&YouBR7KLyK4<GV0Pr-x})Ga zfeI33J8SvPIbkO1w{~qbclV!#6L%zTzIi!3zjw|72Wb53dmRj-cK5bzi8*s_&}IXC zIzRqp_PkU9*h|n$!bKblKVNtS4LEJ3TagD7uQT{s-nk#+V(z@VCOD0YDF zXKX0AMqra|BP0O+q2nOBcSn5n8@8t?)NT8QdS9e_LxQF1y1Tn^aWCZ2qM!=2{lfCKBA|7yxPiEY8&`B{0jLO9WWt#hZ?C{# zwlpKGVu2~R0*+wClz`SnKjOC)D@s?0nJ{;Mz)DwU%(>Ls+=_{X6`VHPXS~~(R-_Xe zCIrodJHj**vk*(EXDn2GY;4bVBeY<9!k{W$m|nEbdJ>b2)iSBaP-w2iF!PH)V8JPa zI+0kn{!T13&>$ja7b@u9nIV13>O2|G@~fxlA)&hQxLoeILIV2!blZ?T@P@QK`CUU}9X%0wX#QMH4uqH85 zMecz(Y`k}(@nX0n3?3XHwVED}h3?eN7SoGQ?jIbu3yON^(BpDZ4AN1n`Q0C411ZUW z^daa)@4y5%$?G8Mf}ufM2z`=>8p;IG^`~xs>w?C|v_x}HoP{arSSKe|WrV^nT?msJJN zRxm2{k9Yj~k- zr$q|T=`G*0Y8e2e_~U!NXEm3csRg8=K&Ey@v?fG)8^!VwKfus#V;Zw@T>u)!)*l!m zAyhm5c!LeAs$0+^`G5St?iZ2_9;0FSFA@7X%t-ykx0o))48*JkXr=#n;4jS;&H#Q-QE{}hhEe1oLLy}$%sKWC08>DVTa zFL)j1J-RmsVNuD7+95M_QU5o#WC*NMr>2AEuSVx1J(>_=8Mq5H94OF|Dls zfuN>M27P?hsb%x$YuX~qe_Nl+{@|%G5>F@pFKWhT`n5?1@s?GTU%D~>l3)8&7z*?_ z>?+ivpwYdp!m&NuD=N14L@S=cKLPAgPuK71+jeYaJ;ou4uiN>zL2X@!!5{@q4y_D@zcUu(nVuS(9JXj`7L2B z<|Ix{V6>t3@MptX*s;=N2^K(Ynv7}Tyc*GV84;FGM70S9SB%Bl_d5z0a@+HXnD(IH z8JN+;I~M10GKMLf=sB-Iu(5(rXpi|II7D8RK(;UB*(}W;nb2-V#%mI}3R4n_x`BxZ zxI&tPV8czmvcDt>AU7t(p(!n87IkS#J4Y-X2CtDZ@F|~;ZG90~C_oM&vKk}68_Mv~ zdF7hcOM5*DvpJKemGHH|ZnP7VolEB_V>PRbR;ZK|xe9^)Rg}&crt&&Q8L6u*mT5he zHj8!0XFY*RTks!fYH@cmIg^`LQt!S-i40T>Z2x0bD4GAgTnh)A!NnNjXx~Ph&<01O zu!ILP+Q*_)p0{MR*DSrH0XJc(377+sYEZ3FTpPuY7bASkl$iA0Xec=g7)fS@^B`1b zBG(zmW&SeT)#WXoAg&zlOWB0$;p7y+7jX22Tj<8Fptq&`YFpBaFJhsru?UCoUysm6xG6D>0WCsK#r*jZT89IfzHN2|)*>4Z zb!tN^;WZGn+3lK>@R=QUn}fLk!$SMAX{jJ@p)}lOX7STHwdqzkVS4V1{vXK)BWNxH3U$O?kdQ9MV zjnP8)g=z^Ll~! z5q#Zbty*dw-kQI5vbNoVv@evms)K?-3`8T|JwqF9CWO0XhSn(o_$L413~j$G+TYLb zou^$dBq>pBJvcEVZ>k|y(#}o}RKRs1_@i?dXv>AY{G$chL|TKUV>;-_=Uu#Wp*F@- z&=!;0l;XO^l+5Pa7HYL=Y=|@wkm>;QLN0@B_iJF$$1w==Fm{yDS?LACu z9|ZB;#pOj>EnmD?dk2L?jY24lktE`x{g5=*L4H`bHda{3ukY4|40`?s{!X`6onO9G zyI+BxC*GrF__!V|DF$e%vEY9g+WTr8e2Z=N_Z|UP1UcMbU9(ot83i()xDT+`lFlvq(hN zU2>)Dk%hy_9mjpVakQdL9!XS3R+XXXr0D^75Mc!t%h`G$7t=G;I@-t48mNA zZHOeoiKbLI6b@*g4ADZ`+2g!%A5UMXT_S=Dz5hb(9;p@>lE-Y)=Gsj*pU_O7*`zJP zfY)r+4znS;57}H&S$^?mZF2svo3&QxLAiRdHkYsYtvkd|xmcUTpM1@!@fR-EI{Cus zikCNT1<@L@MN6TOC0n#>1;?dZwMO2sRqHUXRPr^<8s&Fwg|jOCmgJq=zz~1T(ePuo zX*0z9S6n+(Du9yCx>B1=prlt{sf`CH=|8U2tWK2k(aqXZ06g7w3o2m!oi-X`-^Aa6 z^N#S~ty&lVglob4F}G?nBxy8KY<1rWPWQF#sF->$-sihr%ZY(B@4Q_bD>?NBe(vpB zJpbFM}uFQn-ATi)j9j`!{R!657ua}8zY#5;S5>S zN+>tPdf-=HRB~m3Xcp7Tv^JYcMYG}tR4kQGl{DZ1^DYxZf3cbQO+4?M0d6lT%*(hg6#5zLMl++Gv~;(yRk7O;yl=50oQ9W;6we&HipshCUg zhn~~|+`13Si1(k=00QjhKRgM+6e^9>J}u@z9~6d&pZ2I0qs@r-?9*OpG{=UR4%(TE zGZmXpVJOTo8mO4ekA6z47TqiPRZnR{vp?zIrRK!Hk+#bOw#$T!tx+$@fBTd+LF7+F z6epkjtaemTsDXZ`7RWEP_>3$JXTsOhA^-TZTD=I?BLp++WZw6@7P9$+Y4VqbbLp41 z0B?RlJ4O^H^TS@$5)RsZt7KilMBDd*w#`DY^-EsSMu;xZ<5#rV`7d74VCZ=yjf~%^ zS1}W1KI>InzUfu%eT$#c-BZfZp`>?hC$Hrc5cF<%Lz`h_p)tu0|LzT~%R+P{Kk`i| zEqZT5%2?uNC|xnRq>JRp9v9$H-PV%JK)fpwK+1Jt6p5{?HAPgeIYldT6_UmXawsGV z4kiPcO|U*dKDcz~dzj9IA$05mDq7)Oc+g7s;t^!F`R&_UqSy2;AjAo?D%jTx@}-fe z(WnbrRIEzcZ>q@9zLqTJ60seo2kbN&C~!9>1GA83?t4Uc`!-@7*@TmD-nW|E8;ci( zJ8>`iapF5#GQaX2?E)*(edI`0-|mIZ<;VB6a>*KzdF}(PQo@4db3V{ApalG+541Z( zX%esar*@dv2aF1G42~1e@{j+ijggVYPPf>2^M~5lUK7#d zHQ^-ql|}$@Q3q9;p)E%{6xdPFCaXyv;Y|SV5PT=Cw4qaKZ-$SEF&IHOL-adFfQ=@$ z8pbOkgb4gM7;N&75$-ew;8J4%enm(AzaMHig@%{c|YcD(Z=ZK(d1 zunE4!_*Iv7Srftx{=`?{OWyok(|O}3 zS{*O@Li6xrKG76-icp1Ui>|@+Muoh_4y2^YsH=mR}Uh!uB{I}ZZ876_aO}HBCC5ZJxw2DX*kvOtK z4x$Y?qU}YNLCHc`Hz}GyM7m8P#J>pYrRw4WHN^{zm0hyr0#H|Wp-m-+dg&ArehRV0o< z))F?EJIw*}qsL^!>;@%^L<$>2zlZH@!sRewHGtYc^+16zalYn&_G>#ZRM2#&_4$DV zT7?s0SWBC5lg$CTRsWq9CWxu2-)R*Ju^RB^=BIt9y)KOBhkmcM^KIX2!|8_Szt@_R zbVCnS!gL3REwkX;`-s3nux9fMzSH7-&+QYoVLHr0&I4^UpWBDs6R*0qPa6TQ<)^R8f83`jVxCL-cKFSIl^;RC=s5maN(hhW|W17r)h zb=c#{MbP+~O=r{XxDDet)~lbzAM@(fbr`NXPY3{?l8w2Tr^)6XW3?dK7Li(|r7@co zkPd>yu|43B6it(O!l$pLR9{jeDD)uY%M8onTWYJw#Cuq3ytszaf;T$b*o6K)P*X4;dyS}uX^mYJ`en{sZ zF&(EH;F9Qe6c^7U*ySQdMdAGprjvGYBdU6Y;n7VVFs6iUWCJL!=tAwbkD}I8D?;Xr=7+k#3r!Xd}uNqxWG9I9#za-7(ASHhR-k zxZEbFx1l?0DTdSNO#Weo9_C+W^|Ym`qoayPb9$YT^mGQ2+wyaA`fL+)J)VCfr(>g! zU=JO5vdVlYQmMy{hdL|uG+$DwUpDwYu}ZJXP~jQ$*+Az%LdnA`D-kv>HCZf3t%yvk z^nCurDt(@%mp1Dmn3^gGF>^}xcocw7UOs`D5u}w1GOssv^*2UY%vpqd86xz;hjWMv+l~Ts@K;F z3Sq1+MgE1i8uT$HUkUiI!D0#jqD?R7-HrON02OE`qCP7qq^fN0z8Cmi?dbR?8uhfD ziuaSO&cAKcWAM%JHR;0y_h@KcXCoECvXWnwoWLJ$)sZ}}SK;~>nohcqS>R{tJk z@z}gDUOz#^2|szF{-@q_KW!t$22B?t+@{OG9=seLkN&Lr?NmGxVh<$m6p!bnMA~ z{_zZKaQGZGQ%CAh{8!Yj{sVlk6Kbj9{Pc%mw+DUajeiycyq1p zX+|zY_%(AZa=vD+4jA`UOLe;k(Xr&U0Cgr-Ix;=!3STo16Wvs2BDa%ZL3qw4e#1Py zOe`zocP+)zdVijNK7*?r6u4mIv+eMOLI&*ldSaCE7*cxSvCn|cXjfhbij=ay|5Vs{ zaKZZt9ulaDT?W!3&iNbj^^I!=m74-ei~?T()2$ggk2LvZ(>F*^ZH4m8H-^ey`)P3} zg`iwD+kj6$99-6>u`%g>wa|`tIe%72L7wQRHu{nJ6LOqf^xawO8=8(%B1q-#k59hm4-aL@_UJGEhFR!Ay~*{WxOQ;Pmz4 znZhm0^h?GC4Rr(bWIh#oZg3C<++^e23uAOarZ*Y7PGPpw=foeByT3NE4Ux5ZGT*;U z5Bt>8Xh=-}Fr2ki){UyeUu8?)cDPXJ##qID_dg@|j0ejY8 z=Zjj?_KHkzq`Ed2_m$>9K0+TWi0)_dO-Jbgi-`Q@lUL~*8+HoM8F47phBPqU$o6wQ zQf*&I@Hd$NB~Ko(E+VF%yPGXx9&SdKX&hX=z_X>zq@~TU-xjfznv2u{{7DvHC=mwm ziea$q|AoHf`X9zVN@j9`+a#q=OP3&YTSaBItje<;mVjgYcty8X7P@$)3aIODI~;S9T+PG=bZ9L2MN zYYrQdLO5)3Cp-s@`&W*&2$peHO_eOehFS%eCXX-4XOGrT7MAW49yYW_K-M(Cx{kq6 zAbZIG1~9@Lfuf|;2?kzLe>5>m@#C$JHK;%^n2x`*3q=bb}HzfLGVM2nnKpcr?d zuF&887AunIiTz?RWCi-2wbUxwT+57gy3{!C7NWjde_V|EYXgbr;%(zIvQu-b7AG=( zx#V`m0q+J|`5`L~ZGA&rZ#=OCF9DpPQ*?>8QirVu)0&R1yJ7k#M8LykWjLR?0mhb> zj@7q{_DbHfUcWjYJ3)V0I5dx53&H9%3wdT&f!Q%SiRe3pJ}I)Fg7wiyq(x@})W)C% zltqT5xK^k-V1*)s7=$FuR7YlZQeGhYXrZ=%h z3WO5jKJ-x%A`hv@PA@qF3%$@!h_qtJEeItsP?zK&xhSB!_+L)YD>N?!VPVTe{2Vj@ z=`25bt)n8{*y=xEbcwIkZ&xHyl#x%yVgc-Pcf0D4s{CUldV&8%UU(w8dWwhSnAmjAq*V1GG>!@Z{Z zIXYOeJJkTP<#6)7nK$C9UiwxO?=R?i;YiSOl-v#{N5fnMY5?O@oj4fxzC6|#dl~=e z!(S2CHmId4{*a95fN`~>F{Z^UQmiyu%91t7g0^a(upA`GPh~?`FdJMAR+H#DHMpu! zM^tpES*-(xThNGVv(kLW8Tztbqq__-mV{KWx(LA}0oEr2W$VB87WA#?XsX4}%20}B z0DSB}^i-jv_-$wED~FN#yCgH%hL=M>L9vPz4?v422erh&KE}hvw&V{zOK*c}sf=$s zM_-`=rzk*VDR8tN4C;B?x%xybgDjtQzWy62fs}RsJYTP}4>#iRu>)y*0upk2kBU#ccu78EIqt07~t^>^ovDLg5Pz4 zezxdUc-w{g3Du?<O&?d;1 z4d|Na#d>8$NI#$O*C!=cl5y#Li`+w^TtSOUmsTbx`N4z1HABzvCEIj4&o9=yrM&(d zJ!H>6f1|$CEx@F8d=6NFcFP|ofX!P48NmYDT4|_Gleuz>p&aIcj#4!nM?$ZP567r$u9t)!uMrsk3~M# zDsQ;zSR7HWH9Pc7`45Rek3Vs2;VyhUM?YGRy#@a^Y>+KIR=Fg9?+$&wtO63+a1Wh< z!Gk3^yi1>MPLAUsCl3zHD-?3Xi&pI7V z>*gH~>Ik&s7d)uX5W#uwe^4LA92;y7z=ncRGCuM(59!09!Y#J401QDbY~vgD=$&F) zGk5SX!#^2uwf86eNPo$+ZlMcdj4x1hg=4^<^ z_wp5g)SKX>>h|QX{G)CW-EHs|m|_@RepPZD-~Nc6@ezm->`;ad3>!JPNq|)T9ltnD zS1zZazR9Yl|F5J-J^P2Ro_El3IBzS zhM5Y=5aVzabB!Ji7=HejNA;n6>ti~ynEqK$h`@Or^Jl%TPLWF;)=c2i zK*s7QCC%ybOWgs<*Y_`<6nLb|?LaD^m)&-c!#xJg^YZKetWOS@eG)A6Ns>~axRet9 zBb5tKiBV5O_&j}&uJX})(eW6bqxWLv>HLbldZRHqHva5heX`dW9a7LhRToFDIP_({ z;W2$8sF$Cg@}zzQ5u$gV)DJ5>G-{t7wI5q@3UEL-m2iIKKK(fU+CKek0K6@IN?(JI zXP?qb^Z$HG-z~V8m#ir{5mf4elK&~WmhX5*pUi)FM!%H&YZcC))sLsNaqKz0gTMJa z6k6TS>33SiQaR6F)^C%L+mtlzhS<VA{+rkJS?&cb z#5mExjz#p%>-t>M7t+|rP!|45^7G%&Uy#&lu-;2bj-cEpV3PQZHJV=?zcVJ>~& zNe7_Ns@iT%bwEj6U}zo@w!#B|e1^vG)qYQupZlR+?HiW~UlPuw51o>9g%YLX?16y& zR?dzB`e8QUN%MUtOWu6xM>@jE@jO5MQ#~MoUFMg5st*mA&t{iR^97{RjQKEfH~r&N zJrkNmu%u%XBbL-;!WZ@ovpHRRT)@tHlBYk@S4(g;;@dvc&vpVh-%&+AR(3g`{9M0X z$i~g7FsSM9VZ$qd(EvcI@vG)QvXc=-^`)N5 z6nkNFf(*PPO6$RZt7@XP)8TYDTP(7Jl#2W}U+Pa#AjgugbXd%De9Kq5pCCm{s{jR3 zF?ey*^LxM2>!6Z-_bWXGbgJqgSH9LW{!n#_ZZ6zyf@enfF+*KGKI?19_A+1lH7Ftc zsW18(DmtKO-utzFaem*wbXk6m{evmUXKW;{J*-c1iq@`+~=Hg&pmg`y*J;SbMMW*k%VkO z5+E#rgs_MtNKio`Wf9aOf`AH$$m$LVSe1_|E{I}TtYVQ7p+%|%e$@i{Z0mv>qS8l2 zid!u;y#Jh=fV|iD`@zjw=FEIE^Uch+e;_QCgRw%-?$GzU=TtWSK%^@r$+YB&5umHMRp3PajKzGo*~;RGMmK2FK%U8jZ9L`MkrX=0E|$BqZ)u zVoVM?G+d5x=qN&drwro$ajFHr%)uYs{EUAcr@rVBACJ?Ktd1q^N#omMiF|Tnm@4qOvt|biQs>N6 zf&b?@;CDoQ}|p7_+5KPy={p6~L%w}$l4 zZQ#CP7Ln`BQzdVj-aD`XTl@%ItcqWzsw+&i6X$={{tWSDE!^~e zhH%*_8ZXhzOs1|h$fG*KtzBuTC#|}Wcym`8Xi;IciY_d_=}N47p!H9FfMfLje!*-$ zP)((AaEaBm+Am<|mgFMb3ru^UhH5>Lobm_{t)YuDB4s(sA0){myoBv31IvFTtOO_V z)*2e1Y)~Pv;BRZ_Vz8z@i*WW1=}z?)NG3PQ%YEHx&7xmH$(;&^L#Sw!Jyu+Rmsh$1 zf%6w|DA7k!IHcrsU9^^Uo;33@9O!L-@CA%V!){n^4Z#f5CLUHlv$b?f_qH9gBGB<` znTHTyJ8Y+p_xn1*2}S(?=Js9kHEr)ASISs|4aD#w33EQ;I+qxVM*t?Mb(|#KAdXQM zTGg?4pMqffX#c|)IV`-|UJ-k7#uEAs~e*FzbtOj4kchLKi# z*3b?B5S92<0HBV;6akr-P@+a<^Q6~`p4ifoWXA;q@M*MD06>K7P}|NB?9$B*UL=D| z4JmpAA~49n)Q|SE-ydmvH<&<)ke$Hp8fyF6rAnR&_@*m(ruzcwNM=theURH1G{rWNLR_d>ZvB*3?SnxMjbjiAe@T#=|isvxlP`fGC$=GURF=}s+A#px}JKq zH+9obT8Z&r8z={%Cfh4{UE7MtD}7Ok5~|&tvLNM74iBIit_JP)0W{YG;dvozjdZH5dSu03D&50-Dbbq}Pm+LggDoEikgHY^W^D0F<0Hm^SIa{{4e#h8F=l!+`+j z55v}&c^#P8+lEl7;SUGoGec-PEKO>AvNMbZg69o#>oDqNMe|^4ifYylqbuCkr-o6z ziPs1RfA%8k#9z%IFOP4cR4bBS;ZsFtHqn(GMJsvJ3_@Jo3(DIaMP*YnJ)wyV*#0%a z1*jGF%{M`?o&qS&4yOhaEO<#V54waJ0+ur0T9rn5-T3}XsLqpKQwaN^OQ<%rTV7eE zX?R0#B5O((Cq_^|PdL{!c+3c@@0x8|=>`h4HcjRup3 zls);6BQPi@M^J)&Ep%ni+-{vpi!!`n=#ML_$|^JR|85x3uvZIvGm1(Jt8&XL;PoFg z3kxzU@;c>@FX)w;Muk0iT?<{_!_2mI9XZ=0p15wLXP92>30}V$@p^==J6T>|LJ#^4 z9cf`R$S_Vqer;GeTt1R6mGehZmM34pnW_wsHp28fMJ-1hiyfLcl}4kG_OTFwF zO-tnMqiI@l22YKla(4!E#!}I_85}y6db-oHXe^bvueXk+LcC7S+S_BPw&QgccW$MK zTc%Gdb+RDlQZp+jx6(_Rg*=H!y)cs(j>j52JD6a9Iu7dvsMMLY@l?+r1F86tD=5IT z#?x*+5|Lde5JH0~?5dkY1KZJI%mh%>&rG6o=)kW`q7iPX=wxbin;$iqdY{9V2PV@# zk2Mjj)vYOa^Ta7MkwdD{FQ(AwWb;>FM;9lXfBQQ63N15QE|XtPrR#LJ;xW@{q+9W` z(`k_DBKMjZbc6eD#tiDi*-aGWtv8U*EwyI`b>Yu$fSX+e>mW5H<)?**cN7_P4np5d zs@HXIiM;qmYSgF-NDbj9CWY)XH_U=}%gT zogvsDyKgt@**ZG|Ag8GQEXHSr8CHe%ga4;s%wd3{ia$`*9>F z5FD@PDgmDbqY#(2s0PJ!3ytw6#icxO9%@MnCHu+^^XRC~RdXoEe?jRAzGDuh@yXjL z-&=P@9sY6p0?PBi%FN_`3#e;Jg?d=mODUTIzEwUmLlF%bCNAA4PkTHWX4qpgFTj?) zdjW0JD$^lyQqeJn0ktNkOjCQn1@Ky+o?NB}VE5oPi)fx1E2$`nF)gM!LF8hMmBb6G zstV@vs>L+11avCK{SEC;*qI4-R?27KN|#ez2##EFkuGu08B3^|hcBT^lOpV=mk_M; zQ~AG^&_KT;3?eRdkh_%1J?_;dOR1l{Zz&x!;4nXeZ@!C)_2P1V?oKM>{dZA;0qY$8 z@-AxBVcArDHxlRZ-gn3raP$17c(e8*^x*ix`}rkpHEIX zgDpN!ogVG91Aqmj%HGmFNZPwldo1}~CD*T}#L$3HwG6c3R2&w*C^Sf+a{!0k;c$O4 zQ#Pmrq^SM4uGV0RqCWg(2N1kfykgIRbn-z z@`bt`I!Kj_7|PzHX{buDU07VwGX}+R9RB!FvYqQf7sQ6L5S03=`zUkKPqG!~h8-L& zup=J;!cOVJoNW;wRN-lcFW*kJv-@tv+g$%?5%PE=QI9{8*IJx`$r{qo5=}J?n1=?# zCD%{w9159fVZ#hZx-MRv%wX&$FfJ2e0Vc3kQH{QyR#4ZX5vSBbZUi-46o+YPq?^x6 zhygZ6q+3xRWZ~g_e@4K_$kEc%x&D`w4lPi-;N=hS0;$51Y=Zgu(g&ysMq39Tpv#Pk z`-gGSgETVO&^_LECONF~jtA)xO)rkf{58~O3{?V~|KJ6iG^*>T<#zgwR|uhsCi>#0I}iXU80H3*uMWVMwd7i?@kwD-V0tB^lhkKL@gnyn|P zi>*}`zEN21q{pMLg#y$KNru{{a+fPCIIcWN9!;E&+mokzYTZbRym$k3QkkjcGaD#o z7=Ux$z} zHa)lE9#i+UJ7C{_fyZ?_`}eK(4RAyyYq?mFO|aaLC;JPp@AeL>fJ=ae7d(Si)E@>F zMaoA?$xUJq*Wh3GqWrY{2MepK3!A-$w>28q0(K};-D&r$n$aJ@B+Qx`3$cojM$PPR zn*F^X@@lk!;nMJ3X$Vgp2^J;N?h3bsv~Tc#2S##tr|MX0C?4J3WQV+!7|Z=0qh7_L z=w4H7rRhsNh)+@PL1mViX4T|}QBS-$7(vi$)KmI>TPTGqenmf|pPRaNNq)W?4M)vg z|4r0e&E33BG)N>{6j9Y;vES&72KnG7>hX-ZnKTnwY*NN@U<>s@n3zFZ=rUdG{l9S=bwRt4X8kUC!V0_7?3)8ZGX*Z@YzO)t zPRj^t6VcCV#CuFAhtPCKt0`Q;kM02B=jH1qP0*3C;dMzl08Jj3g!S8#qdTce4{F@F zlSZc|r{O~cJcy_C=8Ze42GL2n=so#^om6I7!Va6J#le@UVi9b7!nS}&xBX!M6myr3 zGpXSxvj>E4Ul*=4u^5)gC9bDO+)`;$@EU0lTwxVjahHcxP_9C{b4WW;Zd6cXbmZxJwm2&s-#eyt+Yn z<*F*tg5*;*VzvBDcTsEduC;hI5zm-Zm>w#6qZ@U&~Q7{X_o1bC}f5#om7 z!jiL_#XE)zGvCxAdhm5~U`qFo7V$Yfv>aD?SBqy2KK^sjiQmsb6)UCy#CcQ142|c< za6fJ;D$1QI7Vwu2h9-Qyh{$)RiqjsqB0e=k^y6L2P;mJy;g=806hCD zc?MHBZ4-Vj*(Bscr|`vzX90Te&Ef-pvS;^g2LP9E7q{?&22AKbw~OEE{K&fi?eUj{ zBPYHjmSe_-;LDahA|S8bC4Q&zx~U!aPybdN(|P$G5tDuPikT6vP+)y@SiH-(9}zLm zdrO$|%QwZ_LHXkc;yr`YkBVwOaa82UT}QR(#N~pM0xZ|o%P^i(|AB{({zLqW`OS~0dmxwhz?WB!vk&v%@5T`4POw`&{Q3+$d}6X)%E71z%9E4r)ggYp5D&-AvN!P9 z8|@~}yx9)PLpR#TJ@TEo_Gv6M1w&*$U^sfKeYFOaHSWK<%|0qmEU+InIQxCTbasL5 zm9H$ZE4)c8x9_ogn_PYfMd#jUzsloI<7)9L8;s>j`=aEM@vgEr@vevL5dW~sPL-dn zvVR{}Vx$k-PJNN|~xs_II!MBMWb}Bc2g8k#e zAAtk$9rklT?R|D}a`{y4w`;kg95B4L-;T0?)uy__bUJ9L>jB%ASqJRH5gvO6a7};5 zc4W7A>=s>af6wlxVX22?k0bUJonQLUzM0RgL`ADV!kmoz$ll|T{g2sWbv{~$g*5XE zd^+w6`y%MXj@#Mt%yB#4OXCo7Z*RjyjFo z6E}CQ^my5r(12X)rU1;#(e*%LZ`lo$Td^~O-8pmxnc}=NvOp{laJ3EoTw#F&oKYWS~ykFyl<l(;J+BY5c|y`0R!Oj>QKX9iLp?=-iH~w*Zb`4}t=QpXv>fK+9mql&M3U zak^YK)FB`5YH^0~@?lPhM~rmR=YT7RThpkD#%(_4vv0WAROV0HrT@Ve!Z7ol0)L4*2oJi>S8G2FK9lnWvq# zg3s8fCvO)9uVp7tXUWUX$#c(u+`FBG&L|n>X?yUKxzR~iSB>0Sg=P+INBhscf__e_ z#CkY?d-`5X)Zy)pC;9fY4TO8*sbpbWzO~1xv$%S{)67ec;JcOsnC!X(&JL4Dod$Lk z9driqT?d^y{!MwGyeDYfMxlcPO7xu zbe`6eGqvz-%#?WBDKI$rh6wI>$HA`hn`J`CQSUh~`T2%cbo}vS81)s$oTYxQIO%-r s_DT-@3Z~EU)*qdVJv?r8`v+loIJ08k7(u4j_twL3cMI0@5la${Y?Q zC0!ElfBD?^-us>3p2IoA%v#Up;|JH>IivM~@7qtzpDH`C(Idu$ag4FHZ+B_e{nTG` z=QGwyX2Odz-|gJ5!_|6fekR=Cz{13uj_upM)2#JZ=kdL1sL~N%kS=6jjq45YM8_^Y z`}VE=_$*%U5@Rj0ckcFfyY!o_DluX9mw2ALOS`_^v!&T>{CakLfBvrRy5wnp>&cB( zSuFKrOgz=S+lM`?uPi&4#cER~)#){9L&56t4kqB6!OK2#dK>qdTg()0;wx-m;Uz=< zzmFe0ek9x#?&5iZiU0k?e?JrNn4DMWmXw8?!bGOvOZ9}-_?}mVdXv8tN*3CZW_KU| z_iClZ0{FTAeuls1|NeuoEWaXT%fI}gus~S8wvMOZ>VUBPgJMI)$&ZA(%db>CBH>HN zl>fgvC{I5Abm!&QOZ+0?`*-q(|9)tfi0^1XPbWVV22S2pf9vGD&)CbyHkc%RDps1D zyGc-@+*9<<%T{92e^;eYgE4$vE}Ou6s>`b5Q+WTBpWMGm&BWcuk00}`m|U!BZSnEr z$xEBQnG#styvy=6%-1mg>-ih!pOgPk{woDuELf>v&4RTHb}!h!;F3c93k`mv`V*ZC ze^I1vk#$A>Dw@A&m7=c~yHLDt@eRedm&{)BUbX> z3t7anvFt1d%gJ)F+$;|(#GYV0+!5E6d8U%Iry2l|9X#W6$F)zrbE( zFR_=|E9_PF8hf49U^OR~8k!^3gf(T&Saa5bwPdYWYu1LfW$oBo>}~cAYtK5ccUec) ziM_|(XPsFW)|Gw8db2*PFYCt!vB50GhOnV*1RKdlvC-@!HjYhTpRiBaboLqhg3V@g z*mvxE_5+*C=CS!~0b9rxu_bINTgH~N6>KG2m13*eTDFd@$M|k!o7on&m2G1`vhD0A zwuAl5cCuY;H~WR{Vf)zuc98wXerJc-F?O8&!A`J0*3( zn_XZR*(G+FU19&QtLz%P&Te7o@36b<9=p%}We?axK@dbCB?+>i2%3-(LLnBi3Au$l zLS7-CkY6Yu6ch>xg@qzQQK6VnLMSPe63Pf=g>phAp|Vg#cv7e;R1<0ob%druGohu> zPG~Q55IPC(3GWM?g|0$(;X|RfFiaRNOb|X1CJK{;3}Ke=x$uQBTlhhkD=ZWi35zq- zzF}p1F9!Oc@VjtWI4T^=Xxlf;le#2a5v~c>g&VkS{uLewk3=Slq9n?qCMHB(G(}%b zilG>Zv6xNFFBTLFiBE`y#bRO!v65I>d|j*|))wCo-xTYL^~CyO1F?}#hzj>vA5Vq>?`&Y`-=m_f#MKxs5ndDY=p-C8bD; zrEF4mDTkC($}Q!Q@=E!n{89m_pj1eDLMkj3lZs0vq>|GHgry6;CcQ4zkZMY`q}oy) z=?$r_R8OieHIN!gjikm>6RD}xETi>+ut1G2Qdg;))I<7E>M8Y-dP{wzzEVG_zcfG^ zBn_5Q(hzB=G)x*LeI$*SCP<%1xV@#R(sXHt^o8`TG*_A@&6k!)OQmHQ&cHBRYKQc* zv{Tw8?UwdPd!>ESe(8X8P&zCfk&a5oq~p>b(h2D=>77@_ zsl2H)R2nHwGTNrX9635GU6ig$59LFpr_x*Lqx4mVDI=7T%10SnQenP|)0A1t=gK$A zx5^L7JY~MJKv}3PQWh&ql%>itWrea*S*5I2)+lS0b;^2WgR)uKl2K|%_QfoHhlaVN8fwjq+C#&_4LYiw)UIkbb*MT_9j=a0N2;UMG3v+aSaqB_UY($R zqE1w&s8iMH>J0U3^&54L`mH)&U7#*h7paTYCF)XjnYvtEqpnrgs~gl!>K1idMx|ll zYb7tKSJd0;9rdnyUwxo4P1Iyf)if=k>6)e4nxnazrv+N5MH#;h3yWqesg>6%Xce_e zT4k+@R!w_Kds=%|doH8G@bINJ9kou{d)oV2XRWK&P3x|Gp!LvtX#=z&+E8tTHc}g< zjn+QWKGw!+23H?*7D zE$y~;SG%X(*Z$QWYLB$X36>BNVnRu%2`!OG=m{fXC!Bz#6RQ$y5^EFd66+Hi6Pps76I&8n6WbC$CblPjO8lJImG~vGC$TrN zKXD*&F!5{Rx5V#>BZ*^)KN5c?P9`!FrxIC-(}^>QbBVtb7ZaBg|0J#^t|hJ~9wi>@ zEMwlNFkh2UkMvm2rf1i4>v{CNdOkhBUO+FX7t){5i|Zxyl6o1vtX@tpuUF73>Xr1$ zdKLXi{VDxv{TcmP{dv8*{(}CZ{*wN({)+yp{+j-}UQ>TlZ<+Dd=&*E+UV2}>zdlqS zrjOD`>tpnf^pEwi`Z#@p{)s+OpQdN%pXsyo&-E|#+4`6I*ZMd59Q|AUJNC)F0`O4Q2?2Xh=rV zh>dJUb|Z(8(ZGKw0-jN(QKqoh&FsA4>2Je@M0F`hG?H>w*i7%v(x87~{J7_S0@upGNsAn`V8XAp^#zqsPsnN`6ZnQ938f}es##_eQ#yds_qm$9q z=x%&q^e{d&dK$fq-bNpzpV8kKU<@<{8H0@>#!zFJG29qwj50je~hcfwUlw)xMAEj?ideD!4yr|R87rHn7V10rs_UV7_m5HoKS~n0?H?W`A>lnKFl%!_5)q zNOP1q+8kqkWPWUpHOHBsn3K%O=2SDooMFy1XPKXyv(4|!AIy2?d~>O}%v^4+G*_9c z%?;*8bCbE*{K?#H?lbqB2h4-!A@f)BH}iM%n0eg%!#rVTnpx&)^Gp%*Z}WnA(Y$P4 zF>ji;%*Ph91WU9eOSTkCwKOYX>6VePWn5SwmES606|@RjPgsSmB34nWm{r`WWL37F zw5nQ9Sx;NfTF+U}Th*UVWT3!TQ9orduDU?Xq@TzgT;$eb#>KfOXJ1Wc_L#&S*LzEMD=7 z^^bMcx@O(B1zWTwTecNjwKY3o>$YK=wuS%Nwqv`tXZvCyRqHWZezE#+u7~y4)%NY`*vr$i`~us!0u`HvU}To?0$BCd!Rko9%2u*huOpJ zk@m;-ID5Q3!T!XaXiu^~wP)Bf?a%C4_UHB&_H6qb`&;`v`+Iw?JaxUdCsZs zyx_d(yyU#>yyCp-yym>_)NpD#wVc{c9p_D_u2avc?=*56J58LXPBW*u)6!|>yyd*@ zyyLWYIymn-9i2|jd(Qh#7w1E#m($zntSUHaR;o zs(*@qUOevn<(zcVPNtLPoOk|qE;tvROU`BIit~?i-MQi1a&9|!oO{l{&O_(1%Ur<~ zUCEVQ#Z_I+O}M&iyRPfGzMFI-H=CQ?&F$uK^Sb%m{B8lagj>=r<(78Kx#isoZbi3> zTh*=RKIJ~`KI1;?R(D@Wxi7gdyRW*hxv#r5+?sAJx3*iyt>-py8@i3%CT>%=ncLiL z;kI;JxvkwcZd4S3GOHEME6s7ru&&Y%l*>*%AMoRbr-u!+~iVsnY-Lw;jVO7xvSkZ?pk+U zM!_jzp>~JeKiogvO!t(V<(_dbyI0(Q+^g<2_quz-z3mB}=t-XJsb0b}Jj=5^$8){B zUOq3sSHLUi74n|&3VX%8;$9iAtXJNv;8pS}dsVzAy{cX{?*w|N26%(K!CuN6;tlnNdBeTY-Z*c( zH^KYFo0zeCYWPaEmEJ0EwYSDw?``n5cw4>g-cQ~RZ>P7*+wJ}0?e+F~2fahyuikIo z@7`hWhv{*@y=!po)#8xAN$M~eA!q0gztE(GPX|(%hxLIm-I{fW&E;!IlsJL z!LR67@t^do`!Dz}`Y-t}`>*(~`gQy_{5So&em%dw-@tF|H}zZit^78ATfd$Emfzm* z;J@p4^gCq?%Lof)tjq|XkY@UyWu!AOcnkf-{t|zwzsz6muku&>Yy7qTI)A;t!Qbd_ z^0)X~{cZk_{x1I)f1khKKj0tofAxR!fAI9&@UJe3=9SZgM(BsJQxv-4n7V(38n;7gK0rVFg=(N z;PcN2qxK7eg~6g=aj+y<8Y~Nz2Wx_L!G>T{usQfK*dF{8>^7(7Y}Nik!| z%&<^0TQYkxM>1D3cQQ{hZ!%vpf3iTvrI}$hrF!y(PwCVnk7CizkFYgClYb>oCez7Nsbp62eDd$)h2+KL zrQ|=!tI2E0>&Y9*o5@?ryUBaW`^kTk50Vd)k3$wpp&Tlq7A8VHG(t19LOXOqH}pb3 z48mj>h1tU#Va_mDm^&;KJ`olUi-bkPVqx*HL|8H`6_yPvgq6Z-;Zxz$;WOd0;d9|@ zVbRya8ez?_R#-cHGprld3+sms!iHg^uyNQVY#O!+JB9Cs?}wc;#(W;;k%omMGM0TF zmd^KO_*M9II4Ar*{2`nh&I{*<3xqECyOeI>qHuAzWOCcyIZ_+LP2uKnOSm=M7XB3O z40ngWgnPq%;r{SIcrg4eJQ5xakA=s>Kf=GlQ{lPrQg}JM68;lj4{wCG!#m;K@LqU7 z{5O0Q36UHrks4`HBGMxxG9xQ;A}<%pqRJULXJas$Ma`oY8Sl*wi>LZTeWSrqDjFIMi$+8vqtVgWXk0Wt znh<>wO^hZ*pGH%nX;DTrJ(>~Cj6REIMW07sL|;Z*RuJ-Qj)j_ySFqWjUm(WB^b z%wi!HV=0znC01iCPQ*rR##U^{PVC0XIE-_}x#K)>iMV83DlQ$Diz~zx<4SSmxJvwF z+$?S$r&`3V;?{ASxNY1nek<+}zZZWP_l$eRz2iP{-?)D~Fdif=i3i6+;-T@dcz8S_ z9vP2{N5^C0kK&KxvGKTgd^{okB%T;gji<#K@$~q!cvk#HJUjj>{yP39{yzR8o*U1L z=f?};h4G?zalABM7O#&t#2e#H@#a*#CH_&;B}=j;N6ICAC4DV@Bh68oD=n0kN;jpu z@_~|4hA2bTnd)cib*+R})+l3?HOd*~t&gmat@oJ5 z#mwSnNwbvwq2oJ&v%#(8Rt{cEo=%=go=u)(1K2>Zx!6LyBwm)ftNqmeiJpl?iN%Q} ziKU6#i93nAiF=9r`T%{PK1d&|r}QC4ZX=IT*eGJ`Gxi(58;6Y}#vkSibG_Z&neA+L zwlsFOI@_Edo$c6j~3oRwfDS$S50Rb-V|6;_Qs z#hzi$vYxCL8^(sSG3;a3oqfQ1u*GaF8_)K#ee4kXl}%)m*km?^O=Z*A3^tQ}&c0$_ zvv1h9>;}8Z9izc4@;C=3z? z3n^iUFjN>Wj1Wc&ql7WSN5aR#Sm9G)vM@z>Lzphi5M~OW3H61qgs+8fgx$g~!X9Ct zuwOVN{3`q=G&mw07yb}V2>%FIh1Fy5YLN$ixEaA=mAG15Bd!&< zi)X}hQYaOXib^j_&83&5SEN^^<{V`;23 zPMVmKCQDPKX;OwXQ~FGrEqy7kmN!e^N#9F9NDHKe(jsZGyhYk9ZIQN0+ohkRU!+6Q zuhMVQ?^0SiC1pvcr8Cl5>6~<4`dhjnU6KBgu1eRW>(UMBru0ZwWlc`Vmh8&D9Llkr zL(V1Vm&?lK8NtlNVC>G5N>!zr@`CcB@~Toxsjbve-caf)^_2Qb1EsOjRB5JkQr=VESNbXal>y2? zWsovh8Lo^{Mk^mHW0fzI*~*v7SIXDQ9OXOZdu6$@QQ4$yRW2x(m50hBRa7NaRuxrK z6RNHns-wDUtY%XSs72LcYH_t}O0A>5p}wisRqLtsmFh|_wY}OweOG-?eP8XYc2T>l zAE-Ul57nM(FSWPYNA0T)PzS1m)Ra0z9i@y>C#j#RlhyCk@6{jFx#~P+oHAG0rkqkY zs+-lV>W}Jn^(W=Da#neuUQjQpm(_pNYw8X4rg~5PSAD2HQd5sLL6bB^Gc;dIYNfQ& zS{bdJ`np<6ds3^aJ)=FZRo7n7UesRFUe;dGx@aG2!?fYr7`3)KSp7(yrA^c(X`gD7 zwJF+EZJIVy`%Igq&DQ2=3$?}S=js>gY;CEwQd_I7)7GnBYWuYP+Hviqmew-0Q`+C! zg(})b?UHs`yQ2N0UDd8>*R?y^gM^fj6K29nqaI6K50W6BiPf5?2y85;qgK68|P1Bp&L% z9_UFuhn`c81;?z#=AyG<2~bjqpy)NMi^s^kBo7~C&naWvN7HG z()iZ+&iLL~U@SD28f%QT#yVrYu~Bbo95s#^$Bi?_-^K;wrg6)-Z~SXKG#(j`P0O@R z$Mns>%wy&?^QFu}W)ZWjSY;V46b~HPg@0nfAZf1A0hxwt|)9hvT*8Az3^>b!FbD%lM z9Bd9XhneHe3FbueQ*(+r&75w2W`1FQX?|ssrie!$J}ckHjkJ`%|Fe*%#&u?JY}9W&za|q z&&*5aKju~Qnt9#4Vcs_Hn0L*4=6&;D^MU!$d}NuHWz0728uv_QN>-kfmDkE=eruJm zN?N6?(pEXEj8(;|X4SN6TXn1^R#U5))!b@fwX|AUt*!U1&Q=$zt5w!2Z;iA@S);8n z)~D8FYl=11nr2n7Dq7E2FIb;hv#igpFRZVuCDtlywYA>bU~RNES=+50*3Z^XYp?a2 z^}BV%I%-|EQa7zz){E9_)*b7S_1I=s4Xc**rd8K!WCwQA4(-^^VKuhe*|p6h_8WFX zyOG_*Ze};PTi7k_R(5OqZTlVjUAv>*$?jqIwFlUP?36vi9&L}YKe8v=Q|zhsG&{qd zZhvWiWq)n|V0E*X*h}qY_9}a|y~gUEviI0~?S1xs`+$AWK5QSckJ`uW`}QM8a70IP zRL5~#Yp_$?DdCiKN;zena!z@tlJk`FwDXMftn<9{hSR`l=(Kj)IBlJFPFJU!)7|;N z>EZNr`a1)iLCz3os58tN?u>9oI-{+j&KTz-=VNEQli|#8K6g@IIIEns&N^qk^Ru(l z+2!nZesT6VN1bEN3Fl91m^Icp?VNGWI_IqM)gGJ)6L};af`ae+~RH-x2*e|`@H+2`-=O9`=(pht?xE+JGk$<9o_fb z_fu|Xw~O1=?d$e)`@6&3;qC}`v^&QA$Q|d7$A2feliexqRCk)2;ZApFxL>%l-LKvG z?gDqAyU1GSu6H-M8{Pfx0r#ML$oDsLG3#IJf%VYyy}(P_Z`ob# zQTAASj#t7f>6P+Id*!@}-qYT*-t%5{?*;EA?`5y8*Uo#(>*&4bb@94--Mk)NZ?BKN z-TuiN=#B73dZWBC-bdcY-dJyvx58WNt@Ac|o4n25wv_jy_p`mj+vDx`4tPhsW8QJ^ z5AQGgXM3l;%RA|%y-e?%ci#KkyWm~)9(WJEN51GwzUphfZtwOD-}EitwtunzwI4W| z)50(67xOFmmHn!IHUC-vIsbY8HUD+Lq0`x!;5YJ{_|5$0eoN;QzqK>bf7?&J<9y}6 z=X~dU@2C7B{!o9IKinVTkMu|RGyGZp5B^+#p1;W7?EK{X;hb^{x`o^)+`|4&f49HK z-|HXrkGY@wC*5z{Z{6?w3;relvVX<>-u=Oy=im14`1k$C?%(bOPYLP-Zv<}!b%T0A zgP>v12>)iTdGJ=yITdsXx(3~X?m_RMPtZ5$9}EeG2E&4p!Kh$N@KG=}7#EBWCIk~b z-7`Hem=t^(Ob%uSv%JuYyf|19tPEBKtAn+{`e0+QCD{NAOp0GDruR!KolCIPImfdD*=jUQRDpa3Q!DTnip2SyD>MUT!as zSI?`TjJ;FIoXLV-mS4($-|y^qNj{%^$zS2G^tbyzCF>>MPj*XoPxemsP4-JpP0mQp zN`9XFBKb{nPV!rShyQc(yX5!DRms)Cv%$;BwaN9#4aqIRE6KgdeaZdF1Ib@g$={NH zBu|(}l9|cN$t%g*$veqMp%99}tHJl78irw>FmISI%pVpA3kE*~bHmbMnP6TpKRG)2 zW%8>q4zooS!*XHyuwqy_tP(yMRt=vItA{UyFNQCLFNd#$uZDHPH=@bW)Ua9DJZurR z3|ob*!?t0&@U8IeF!fH@KI{;_8+Hu4gk8gKVfScGbR)VIrotiN&~SJ-GMp8D9)1zd z4!;S%4ZjN)Mt9?W;g8|=a7XxaxGUTfPZ7Qi4~4&mzlVpz6XBoX$uJ#eh3CV+h3|y< z;f3&Gcs0Bh-VASr55kAxP1JKN=7Xj0QzRqT$h~XiW4`^l>yh`ab$0nj6iF zmPZ?+AEWKjPth;YuhH@7ujq7iCOQ}W9bJenMwg_|r9b6@(Ld4E=vwq3s`xP0V=wmO zAdccV&K75nbHq90ym7ube_S9g7#E74hzrL>;-Yb}xOiM9E*qE6h`$QUrQ*7Ay|{kd zAZ{2piW|pG;-*p+>B+cd{C50K+&+F+UMjDPJI0;j_v6lSm$+-(E$$wF5ch}&#Hn~v z{AoNno)OQCKaanR=fvN}-^EMf1WQN?#pMlh zmhhDDwD63OQJ_zlv*O!AAEB@OxA0hWMNbUGTw-o9kC<1?Cl(M(iY>+VVrQ|7*j4N% z4iX28DaHg9N3rHj-qN&L%Hjv8g0^_Xf8rB#a4yZC;6PjYe{jHxrE%1Z!%-`imIw}A zv9wJ1F|afauyHtu#nLLlkt~+xKMy#Z#nSxe`BAZKsE#+2#*5&@7EALN0G!=oX_Md- z7fa(UayZY$(l)`#E|zu(&Umr3OK{qYrTK3TIQPZUKEVkvmJSHcg0XaxuvAf8@OKC} zAjZ=C9RiMuv2;vWX_UWP!09oT=5Lmt4=juFHw!pX#?t)F0?wAPG=H;zQ)Vp9-z?y~ z8B6mw3pjbk(s>z6@dq42W9fVZ$I)0iKf%E?mM%bWM2)2j5*$`zY5qw8$JSVye^S5! zHkRg}6mXP{rTHfX9BN}}{y_o9+gO@^P{2XA6iXM!6Tq1_mM%e9O|&FowNSnqz-ps> zHGtJY`Dy@r1Ldm$>`j!f2H-d#OP43C9$JC0`e;QC`_CHSq7q>ZQNDb@8lhDPYmD-x z1l9!QO9?oh$I{gZ4(hS=Qv^r$Seh>};P4(xKSOYgkENd_IMBz^DZcc8vwbYhmmYA+ zkEN><))wVU4>86FFoKiAWQS52b>FJX}XD`S(gV&vvNT_Mz)47!=1ULkBmSa%=>f+hS(-0B z;GiT+wFUCtF#1EWsI9mL5lN+Lfip6P$ZxX+AH26R<4J=LK*UmZc{WoQh@X zNd)I(S(?ugu+(u}OeQ!q%hFQ_j?c36RDy%FEIp0jNG(fe5FD;$X+DI&()iyDf&;fK zJ(J+*Elcy^1RTO;=~)EFaasCvzW;c@$y}D^Qwunw%hIz6PV2Jtmjvf_S^6u26TB?_ zHNjb4mi~s|R4+@y%_kmk zIGCmR!~>2AvoxQ0;HTu%eBuE|hgq6WJm3&9OD`rkPR!DL`T+-vS(;Bj;D|9xWBSv} z_@F(&1)qLk4^ck-AP6X*eh@^IPd^9}%BLR$8C^pJ1zk%74P8fs1iGFGA-aJGF`C+l z2N1HMn~0Db-Asf$=oTX6MYj?mAG(bQ`OzPVPypRdgo5Z#L@0#rAVOjEXOa?%;9@5c zilV!SPz>Eogc9g4L@0^wAwns1FA>V1`-o5$-A{ya=m8>BLJtz5GJ1&b{~>((DtPiM z5uQYUBSKa5cOq0n4-=s_dV~md(4$0XiXJ0EGnC(5AhbmPAVNFz1QFU}|I>dGp#%CC z5jvqKiSQnpCc^t@CJ{QLr-;xM%_2f~l;2(;e2AVQLT~ge5r(1XAcY5EG%n5)VFLO$ z5%7md`T`Lqq8EuU3B5#w4D>P)W}#Pz@HzSq5pY|luM%N4dW{G_@cW^ep}rm0`90ZzwJO+f%4l91l&>S2meViVHGYO z5@9v^hzM)Y$3$4m_#bNj5!Rss5pY{&ibU9e;@0GZjVNwSPS}Lv*5riEs7iz_sFvan z_=T-#f(YACod`do1`)QSCJ}x@Eh6kdZ6f@PIz-rsx@}ABHy~IMC4mnjfi~f zo+2XOx~GZAw=VSz9zf(v`z#Upay~~yzMRh!kuPU;BJ$;Yfrxz7UL+!4sh5bz-~7u& zXACT)ala+9>};5Z^%guYvd`T9b%%(ON{Thw`5Ru|8Udhz(Hw^B}fC z`Okyc7Ue$=Vmq`R-+#P__!ge<7XYyX%3lD)j%Y(7zK1pz(g51PV*I1(4{5^)sDKQ)M>(N07hgYp#s@gwwoB7Tf^CgNDM3lYbm zU5Pjz?MB22C|^AgKjHU3Up^2gqCJQ>3FS)(;$)OBC5Tf{zLX$NMfp;KI1TMX#F;2x zNf19n`AUK~3*{>b;^!z|$pP4Z@e5q=r37&{I*5p0qJxR}70R~?#II4l+#r5~^5q6` z4$7As#BWi)+#r63^5q8cdz7y>h(DmC_={r6#knY7ZV>08e7QlKkMiXPaUsf=8^lE@ zUv3Z=qkOqRT!QlD25~9Mmm9=oD3+TOm!o{OK}@a01z&Cu*P)*haU;r?9>h&3UwRNX zqkQQ>+=B9@2XQN!LBwt7bRzzU&LHAXDBm6scc9pw6n_wZ#uL6jAnru@{(!g(<=X?| zZge&ge?j^7fVc&D5 z-zyORLit{ScoJPf#5Bsc4a7`z6%kLNtBII}t|8)SbS)9jqI{b{yn?3I;{n8f&<#Yq zit_yj@fynaAH?e@-+vHqpnU&9yovJt2k{ol_aDUDDBph&@1Wa>co*ff04ebvF8DBj zcpv?li2tH|7C?M}@>u}!AN3P(BMFsVJWXkTjIf0!Rsz&jLsW%4Y#26Xml2l8f?L0Ler7EP#|m`7D4G zrEtNA0i+n^vj9>yl+OZ4*-<_VAmu<$5-BIjX91+#D4zw8@}PVcK+20|5h)+aX91-A z=ov`iK`MZYvqUP0o+DBr^gNNCK>sFEVe|r#ilG;YR2;oTq!Q?5B9%n>uz^$><+BD- z8GirsVFRfw%7+c4aws1*kjkTc*g&d)@?it1BFcviq)I3sHjpZ#eAqy$g7RSl=}DB& z8c0=9K5O@}|57zv@L>b#DU=TzNKd1D*g$#)<--QjvnU@nke*`O`uIV(>Vr4vN9!q&HBD zNOe)0NcB*MNcB++Cnu#E;KCzPL)0fyBQzjVV>C&mCTK{crf5W@W@t>LmS{F2wL-HK zsWqB|NNrFIaEd=jZSf=*k=miTiS!nlhe&Uud5QE6nvY2B(fmZ}fEFOqyJ$fobwmph zsS}D}=A`$q|EDm`ob*0ggh*Y`qD1P779&zO6jRPgJy1+JCw+*PBvMbb6p?zNn0QX= zjbh?CsSk>QKUEg{FZIO*CZ3b}p_q71>W^aLIcWfjiRYw2C?=kh2BVmGPU5qKiRYvt zC?=khhN75wP8x<{;5lg&n!?1N0_h_Z6VFNGQA|81O+Yd6ob(CGCmy6p=<`JS6s=CA zsVJX#kfx)2;z62$zC@%i(3eR{`W6?j5NR&@Dv{=)uMufJ`Z|%8pf!lJ6s<|5WoRuT ztw8x50@6yf4v|)&ZxCrU`X=B1H}Oqt@T4x0)}r-@v<|ILr1fY6B5gn$5@{pah)A2z z#zfkIHX+i_Xj3BXM4J(57vHnyMB0tEAkrSRC6V@`t%$S_ZB3;8Xd5COK-&`OAli;d zhtao)bOhyh5lBZ-eix2M1(qCvNBArCvBT^>H?;?;c zqMeC!3GG6p%V<|3-QxFuH#`C9Hrky?chC=rbQkSGqyxen#YH&{;%&7X6&a&!Jxs`FV6Uk@+7&UlRER^eZCc51>_x~I`0l6mnEs<-X-x0Ys`aO{wp+6A0F*=vXP0)EnZi>z)ax-)Rk(;9niQEQV z#HH{Xx5dR`BDX`A5cw^1DUshnml3%Gx}3=GqAQ5p16@hv57AXb=6A_zBKJbq5Sia4 zskL|jxevOI$bHfEMDB-fATr+Usf|P)f^H)6P;@hq`J`_lGN1IVL>_@|BQhWKA4y6c zg^TS(9*zD)WIpLTh|DMbXCm`S-$`UX>AQ%`Cw(`O`K13sWIpM8h|C9lFOm76@8kQw z51*b-`hFtwNk2ejKIsRE%qRU2k@=+mN@PCizY&>F`tL;MlYW@UGteVM=7WBe$e-~g zJw{|c>Bou8C;bm1^GQEJ6t{HgPtNXAM`9p;X&q; zewxVNqi2ZBr}!+9`4pccGN0n}MCMccH<9@eUm!9c;)_J)gL{d{d{{3N8N-@7bp=mA z=F|EQkui{`t`eCK+%+QeVY*IaK1?@=%!lbFk@+m$A~K(u+eGFwbBD-$X72t6fBy5K zxkqF^H1~X?C(us@}%rc0KmC7=SjFrl=h>R7< zvWc9+l4LnV#*$>YM8=9_c|^vFWcftKiev>u#)@PmiHsG=3WBz zMijmx*|GopLE%f1gD6;yteiyQE0T*Sd_{5-g|A2+qVN^TOBB8$`G~?-BtKF3iWDFU zUy*`Dv2g!q6~Yrx_>w$96uu&biNaT;2vPWo6eS8@kzz#QD^i>&d=*L%g@5vrM8OBm zDn%6jVM}w^e}#YAGDN9}mL*Chv>Z_?qveTG1+74or%?VgpgfK8p8@3=l>ZDU&!YTi zKzR;*k|@uksj7GY#*3xo0s%3m0i*HHe#puCRq7Y3yU%3m0inkau^P~JqV z6Qv>g0#O>FFOrnf1Q+}_2c;Fte{)b;qx?4qr49NjQQD&Xjeyb)Qg&{{-kkJcti2eb~~|2p`lck$#6qI5+0I|rpRT9+tY(0WAaiq3P+G9BeB z2FeVy6H#WO?-AuQ^nLQ*>+n?tWfs5x`LcrYIm(w6lyA^(MEMr&PLv5)WhvT^D9h0PL|K6jAj(Q~AW>GK zgNU*k9ZZxpDBoI8)}lj*vJM?el=bK^{!Q3-Wdk~#D4S8f|DbF^`Tm3QBRYyG+tJZP z`3W6ElpQFa5m0_cKPJjfbSzPJq2q{>+Kmf7NTB?J@<9S+56TA#l)We)BvAIDe2_rd zkMcnRPehH- z9YoEJ@+k*32g;`$)SM`va!_-je8@q~js8N^Jm?<2|Cn?&FP`uz2Q?qcrySJ$D4%jr z3!;3=K`n&xDF^illutRRg;74`pcX;-l!ICVCIPwgB}d^fFOj zMz0X{6_np0puUP;CF*PFHKNu)uM@QU=amQ5WF;KV1M%KwXFyB18nZT*L(TYU<1+7HXJ!oa3?nP5o@Br#Q6n`ji>VC8;Q4gTih{P%qm77q2m61zF;VZLO^A9QZA#P!XfvWQv^mj4v<1;* zv?bA0v=!0t1E*UPErGTnnvS-G6dp7S7ww2g2Ye;-dk%ZYX-S}wE;(Q>0*iIxZLMzp+WccSG(KOkCuv#Sf1(vf2N10!I*@3%9ZwG; zS_O14(fBRNw;Z%e=n(#72%c0%hZ3y{I*e%5(BVXT3LQbTr_qr_dlnrkBIg<`Z3W`HE=POX#Ca~N3>e#c%s!tClHO_8J`gC4Rj*W_?`Xn@njm&8lf3P<9Eh%qVYRp2GRJPF_UP`(9ek09Gyk97U<_h zYl(hAv{vYBqP6Dt|Ce|IS{w8$qP0c8CR#i68=~<$V-C^yo$)Qv-a)@38ox8XCt3&e z2cmUE=Mt?GI*;Rnz;B27M0+1yKs0_gEF>Dg0~QgD-vNt>#_xb7MB{hBQljxYU>VVR zq05QJhjj(fFn6c<`LENU4MkTGjStysqVXYHLo_~QYl+5(Y#q_~V67(_AFK^T<8!r< zXnd|V5slB)W|GqQU~M59AFQoJ<9of0XnY@kBpTnx?L@=2o&JeveCu`)?Q8UBqVcWU zNi@E7yNJfOZa3fm-T3r;?|vZ~-@83T<9oN4XngPX5sh!xexmX1IzTkOMF)w-x8)Gg z_*VQ%G`4(iN=>UlW2TtPZ5nTZ5Gk^(w-(7U)nQ7<4b#%Xjs+L=ZMBv z_B_$}YW__$tWN6m1v~+bFV97y@#VQhG`>2QiN;sw3eouL{6jRpI#-FtSLYhh_=;R7 z8efqcMB^)R^FR3WpD)QRqVZ37n`rzK-XR+Qgm;O?KjA&1@lSQ1X#B`r3!V{)h8H;_5e+YLMkX45{)|Er{54dP z;IE;P1b+?uBA4LbtCK{Ef3ran{F_aZ;NNVK1pj86B>49_B*DMtk_7*nM-u#NK1uMe z1th`0mLv)OwGjKy9}*Fs{7)jr_5UQY;rf3P*>U|pi5$58pF~bv|4$+hu5*z@UNkpJ zOBN=Q@w{^9;){cEK2nrf|aP=o2Spo${fsV!76k<3x?47Em(~%V8QBi zK?~NP3t6xxUD$%P=pq)ZO?7bu>(Iq4SeNz}=LNxfbO{UAr%PI}0bR<14e8PrY($r_ zU}L(h1)I?2EZCGTZ^34C1q(K(D_TF;f&(oFf-R|51Ho2QtASu^x~c`+Q>_ew9jI0Y z!H!fbgJ5T>l|irz)yg2)jcR2O>`wKc|MOA^_TWTIgJ4gpr9rS4)yg0kO0_Zw_NH1H z1p82}41#^BRtCX-R4apEf2x&1Z~)cHAUKfy|6WUj;2^4{L2xkD${;v|YGn`{O0_Zw z4x?Hb1c%dYEI5L0Yr&CpI}47YT0I0uQ>|W~m*5x2+p8dRRm}1`PZ@{7*4gU2+pEfRs?5LEh~a^sFoGM zc~r}a-~y^;MKFRMXu*Y4tBT+vs#QgB8P%#D!u|)Bb1=+;E2x$j!Ie}?jNmG&B}Q;H z)e_>yXG5qwRxwFthUH(T&6)z;pk{r-*v?Ja`usrDAZ4^(@L;76*x zMKFfmX~8&pmj&bLC<}h3cUv%l-ebW;s<}Y$FYVvQ3xfaX{T3Fe1_oh?YG4qS=|dJ) zsAdOYm1=en)~IF&VV!Dr5C-&d3%S7enj`eXhyx80!UlcH!X|y%!kB815Vq*E7Pjeg z7AEw03%m3M3v>FSg+2O`g;UX&wf`^kp;L46iiOkDS1p`@zGmT!RKtdFCaPgWI5U0I z!da*W581tUa0#lR?eh{Y$-x&EE=9kza9R45h09S*Gs5NRHx{lyzqN2B zs$oXBGSx66T!oIda8;_oMmR*z{{SZlSEHJ8gsan^EL?+*v2aZ~*21-@rXS%tbkM>L z>39pbqd!}?1D#;uj&$M_{X)1C2a_z^nNGHF7y65ZyV74R+>QQb;qLTz3-_RZShy$s z)55*zUltCfe_OaW{YU%%4|lK+{nx^M>3feT6h30S$H5VTX+zy zSa>k4T6hSpS$HU|Ti8E>gTTV0XlUUHG_vqS+OY6c+O+UA8e4ceZCQ8*ZCiLIO)MNv zQwz_c9rj-@;W?aS7M@GH7M@3Q3ooWU3ooHlS$H|+@s;ojI*o-_(rGQcicV+Y)pU9b zui^P0Jp(5QucI?scs-rT!W-z!7T!o_vG683tA#hy*(|(;&TiqYbPfw|r*m3(2c1jU z|L{%@=C<%II*)~;=)4x*L+7*bK03dJ_tOO|e1I-!;e&J`3m>8jTlg?t#KK2te^Fi# zK1vs}@G;6C3ke^mOIY{>UDCoQ=~5OxO_#Rt8M=&x&(dWre2y+>;q!EP>xVCJu!4mz z(iJUyiLPYf%XDQ6U!kj5_$po1!q?~!3ty+JS@DCthOt-P{ce<^Gf6(pF=Oz4;gY7N+i|%0I-*iU{ z|Diis_%Ger!vE+l78U5O78U7k7M1Ak7M1B97V*gUNAJlAB0bxCSu_3$Z?M)$X9E_#4PbJGJY(i3*j6#YUpF9!!(q(|%!i}Z*Mvq)2as71@t z!z|K7A8yg|^azVI#7A1R5d=rNP~NdMH<{wE$VA>PqRpqd%8uM+%qiF|+8rHKc z(y*Rwk%sjgi!`j~TBKn;&ms-$`PzS8B2DWB7HvaESfpva&>{wP^hFkF5HGe!gLsKW zyUvvIpcnuj|q(mdR0k>=qp zi!=|TEYb|zZINc6e-AH+Gz0fqq`kh+BJK747HNMUut@v+pheo#hb+=|J#3M->k*5z zU5{F%?Rw1mk@o0ui?l~iSfp)v(jslkQx<7kp0-HK|BOXi{%0-H@;_&hmj8K+w6ZT) zq?LV9`~M<$ucdv-A}#I97HJ7zu}Dk!szqAD*DTViy>5|K?G1~xYHwPkReQ@Kt=iib zJ;eTxe#auM!n+pf&fl|0cmBRby7Lb#(w%>3k?#B>i*)B7TckVx#3J4KrxtP3qd!BR zmq>U1xkbA3|5>Cv|H2}D<1a1J7yim3ec`Vy(ii^5B7Na+Ez)OyXOTYpdyDw&{^-%1 zAkv5bV39t2z#@J4j~3~}f3ip)KE@(__*jeddE+e7=M7q<&l_)%e(&cg`1`M4oM4fD zaiT@~#YqGyuKNWb^HMSA}ai}e1V7X3~C(*FNdC^U*x{{W2= z{l^*=`mZ%=^gnCV3k7a&ibg>BeQAW0-%6jgVE?weJ~nRQGGBPQ`4q3rlGMlrll=wOhxv0Jr8uLkZtG;MQ5|d+Eh1z#yV6tF$eqKSeJu2t+5`} z9ig#4o!c54(0Qz}A=RCtu@Rlm8XMF3t+5H!3ZStW)e4}oIbFyaThRW(yr8iqUBnvO z&_%7WEnUnS+tJ0Xu_M(|qOluY(i(fvrL3_JUD_J^Qmrr=`_W~s-#Cba<*acy)zYJJ z1l7``aTL|kqj5CV(xbuZ{h*~s<9Mp2N8=>Asx?lgL#%NMUCkP&($%&9tMdz|ak7Rr zPN!>H;|!`jMB_}VJw#(T)gGd87S$G_aW2&sqH#Xe7NRkNY75c0h-wSbxI}lLJw)R& zsy#$wB-I|GaRuGf8dp;7CmL5%?I#*HQSB!hw@_^-8n@A{tZ_Tt+8XyzZF8TO#=RV9 zpV7FFYM;?~fNpP%2k8#hc!=(3jmPOu)_8*MY>g-BF4lO8?rMz}sOANYSM~hw&IuZC zQVkCpZ_z!i@iyJd8t>4d)_9lhZH@QnKGt}jYS_^DfNI##_=N6njZf(TQ}hds&p0^H z8lTgHtnoEH*c#u`L#*)~9cGR1>7my6ksfA^pQwfzjWJZijK(;6q%{WVQQH5bcw;iv zWTWv5J;oaU(POPypvPIWNcFpDmZ+v5%`!c~niYDYHLLU_Yu4z=*6i0gIK`R)J=K~a z)l-3HL{GP7OwX`pi=JuCHXUxwgq~&1l%8$P4n4=389i6~&r7q*$$8ey>G{^|(F?3O z6&+#Csp*B*oQ7Ux&1vby)|`%BV$JF4rPiF8US>`G=f6LUE+g(jb35R*{L2o zH0PjKS#wT$wKeCW*I09IdaX6*q1Rb+aeBQqm!LO@_HQW;ZnWmo^d@UAOK-O3a`YB! zu0U_K=8E(-Ypz7~jH9_Sy~CPA=$+PFjoxL=)oFheFKDho@3!Vz^d4(&K<~BY#`HdG zZbI+3=BD%kYi>sMw*t)_=|k4si9T%2UFaj$Z|=&$qt@JwK4#6`>EqVigFa!+J*ob< zpt%=)%9=yz)7IRZK4Z;;=(E;5m_BFCL+JC`|L6IjVVt~R%|q#n);x^9WX;3r%ho)C zzG6*1&#zkZDEgW;kEX9%Q;+i-);yNJY0WJf6O7&6DUm);yWMYf}d2J&rMD zZr7y!FQuQL&r9<%4nDQ!Ncx#Iucn_{^BVd;Yigpu zu;%sjOKaXhzp|zV`fF=ypue%E2KrlT-lFIKJ5JElM1OBhP4sAMYNCIzrY3s8nwsbz zt*MFr$(juF4`ZyUAs%Z@4e>Z@-bV+g=ogyzb1>eTn&O|WsR5c`O%2dQYifWdSyMAJ z*_xV%U#zKl_|=-4hu^HJdHCI$nt?yG|9^1znt?y9sTugonwo*Xt*IIK$C{dff32y# z{?D3hCkr%1lPw)6T9YjuC|Q#&9VlB<|M|~A#hUEtK-HS;=|Ihz?CC(=n(XO7U`_UP zAhafXIuKct?Hp)WlPw)+T9Yjuh^@(%4z$>Ry)^mC18r-vrvr&K+0%j4n(XO7$C~Wv zKxR$$aiD8Wws9c0CfhjBvnJa(FqJjgmVv1)F7o^jOv4FcEzh(TYk8)#SgSL=#af*i zEY|AGXt7pjCX2N?Gh3|HnZ;tQ&a4(|b!HRxKi2ZhZc~ou;25!%YEFw;rGdFD)=JH7 zu~upxi?veoTC7!=&tl#A{1)rZ7qD12+h33u#JbysEY{sFY_aZk5sP)Vi(0I^UCd(L z?cx^eZkMoFce|v;y4$5J*3B+${aAOqjK#X!Wi8g-E@!dsc6p0+w<}nzyIs*@-R(*i z>uy)JSa-XM#k$#5E!NEr(f$wN?sd1TS**KV-D2JC8W!tr*R)u7yOzbe+qEs$-L7M? z?si>^b+_wTteaim;$_+YfekFy-EL^H?sg-Kb+;Q^th?RBV%_bg7VB;|vsib#xy8EM zEiC3n2e!0WH@g-3yu`ZOtu5BwZey|Tc3X>ex7%5)yWQSm-R%w*>uz_nSa-OS#k#4T zE!Iu#Vlg+>AJ~->#Ja29EY@A^Zn3`o9v15x?`g3vw3o%Y&`^tYp}j5EXY6CKK4V{t z_5OZS^b4_mV1JAC0|!{FA2`rr{j-BCRu8s#7(K+|L#fUYA4YYK_;9Lo#79z{BR-1i z-~S#sf|FyY-b8#H)tiWqr$<|S0@cqUK9L@4@kvy_gZLDx&qRDC)$b!di|Y3gpH21q zi2LVopbtQNE<>V^6KTEX&h@Ycc0mSdpTP%K$YBdnQPqi9|KcHF-#Gg>D2I9|X zU(12`b9$G>|D#$B#9z?6E&h_;WARt?UW>n`S~0}mP^}o^Z>d%c@ptq=i@&E2Sw9}l z!NV5+K((xh2dI`6@sCu?iufn0Wko!OYFQDFrCL_RuC7XL$Ev-m&yy0y4|Vc-pG zRp^`6s?xWt70|b>71DRC6;bU!S`DiGN2^J-|7gWj`;S&aKeSdxKSH0ER+od1t(8*^ z30gh+skNq}8W^;urkWSDrlFb_w5Fw+7qq6MUs`K=s(C?c2C8{MYeqf)8W^-@q8b>q zW~Le#v}U0i7_?@knisTYqna1AW~Z7LwC13i7qsT2nisU@qM8@9=BApLv8;b<0S+`U zXe~$wt+gl}Z>`1X&(>OkYIx9El4^F)T8d7x*3wk7gVr+i7i+CZH9KgnO!e>o4gAK* zDpbRR)~fUmYYm})T5C1>m$g=>e_Lw}ssTf5P5Q63)}sGeYwbdT1(~9?4lP=%zb*$Q zYpqAi)>@xdthFJnT5BU(v)0D6ZmmsdV6Dw*XssYiM$mb!bs?S4S{Kp&{Jfxb zFqfey^;@@au#~lK zrAu4uHoAkhh{weFsjj^y1upE zr5jl5J-VT_-luv5(fWXHY^@LJCf53hZfdPh>1NjYf^KfDFXD9jrBu?r5z+x|6lW>-pcA6SOAMU92^U?rN=H z=x)~fmF{k>-{>CJ`h)7ZM(Z!Sm$m+(L#_26-P_s)y3Z8-Lc7SpzSb_${j6Q4`&+w0 z53qKX9%$_vJ;>U1da$(vdWf|{I?UQJJ=EHKiysfu{vTE-v=e%`wNrY8wKJ+e7HH@6 zC~HqekGA&I^cZVTPmi_s4D>i_&q#GGv}dBnTf09q2Pas27J8z!=cOlEdp>%ywdbd& zSbG6_sNQqfc6!)&B7*YadUa*8V@u-Jih8GuGC0KWlAG_jA_PDpLUbVLV`#*nt&Dt8E*R8GLc*EM7jW?~W8F4(|7dNk_)k;t_g_ms#@br)vDVg-kF&N`XVBWZ+ws=c9sX=>efbI2)|a1X zZGHJk*47uEY;Aq^FWUcKxO;v0uh!Ow|7LA{`0v)%hyP)1efXc&)`$OPZGFbymK5nf zmXzqfmXzs#mh>xy0xK~^QltEmBmw1@B#9`$BuSI%caX%iYDtUg_mQ+|-I5upJ`2fA zG_+)9%IEg=lFY(M!;)F4E`nq>s*50*o$4Y;=AgO=lDTPO$viZ*WI@`oWFeYavIy;3 zvMA60PdO(@7NkvBOSYz3VkFzpMJ?HuE@sJgRI81C zvONb{ZX`QUEjN-Ksg@hbu2jp7WH+kiMzTBAawFM;E@#P}R7;O!C|$vledvmo>`PbD z{;$Lj9mvVbmK;P^vE&e{eM2&g4zc7=x|$_NQ0*s@BdN9%$x&3>iR5Ui?L=}c)pjD$ zzyJA@_7jPYwVz0ir`k^>Cs6Gtk`t-+6Uj+b`-$WQ0+MT~W&z1{RI`BOda7AKas%DVk{hY! zLjU{U$xR&WZOP44LxSWMsv$vgE8WkM+vxt5+)fX$gj<5Yu(-pDYBND`W$sbgcjpR?N$wu-Q)np_2k7}}!7N`arX_0EMkyfY%8)=pH zHQ7i5s>w#$qMB?>88l5c(l))*(uCe+DOdYxl%*Ydx1|}q$I>pn*V3HcXZ^It!Tpv_ zMIW$qYWkq1)6j=3ot8dq>2&lFOQ)xgS~>%L%+eX@zHaGa^bJdwq;Fcf6n)FmmFe4-u0r3jbXEGUr9JkEFj^dKCT5(xd6` zmL5a@u=H5^r=`cyzbrkC{%z^$^dC$6XK?VZrDxLrEFE4baPw27XVIdiXVa3U=g_jH z=hBL$=h3RA=hK>{7tp$;BWS?>>m|LAlhD$OXk_Wdv|;Hbv}x(3G`4gkZCQFbZCiRJ zO)R~Nrj}k!JCRon9=_7P@OCP0kSo#>9)6&Q3 zT$VmT`*ZVx^hr98rBBm&Eq#X0XX&$aeoLRD3t0LJUC`3k=t7phNf);CExL%MZ_`Ds zpT5h%VwS!~7q|3%x`d@4&?PPXkS=BEM|5dRKc>rA`YB!3($DB}mVQo`xAcE>1?~R| z-2E4vtZ3<1bR|o_rYl?e4PC|3Z|SO*@`q>45KF(Ot64glu5RfMbPY=f=$e-5e;zw# zElYXc#;k4Wc)E_IKht$Boj}*KbRu2f(n)j!ODEF}E&YXVWa;m8V@vsaF=i9=c}f4` zU{g!~rkh#%58d3-f9V$1DbOvgQ>0s2r$o25PML0FoeJI7I#s%zb!vM4x90?%I^DrK z0o~C$A>GM3`n#~RbsBUR>*(*ouGZ1th25;9zYDutr%m^;PD1ybqF?Bw9PDKsZf(p^ z>tu9q>vZWp*2(F<*6GpxtTPqe-#Sy%1FSO*JCei+vDTT59%r4|slFUK zbI{|hGbcU4I&;wztur@0$vX4UldYq_Bd1trK6tg{e3 z(>e>&;nrD%o@Jdy>Dks*}u+B2{LhCF` zFS5>Z^kVBQPcN~~D)dt8tV%Dl&Ja4%I&0C(t+O`0LbSZ=aB!t{)}>cjXFYngbvB{b zSZ51*t#$MmUT2-H==Ijwn%-cYZRw5H*^b_19iF-|{hN6~M~~hu*4dHXY8^d#w^?Ur zdb@RYrFU3IkK3Kr(c^ZPb@aH6vd*6LZtLtt@3DSoC#5`;rJu#11=Scdfb@T*0W*t2Nk8A%Q=kE0cJYgL@0Z&?o?HTiwbu`^i zTSwFVjCB~`G0$2@!}^?cG#aTIXV2;3ey5m|nJyhUpdSXqaBLjt1y8 z>u6?Pw~l7!4eMM@-?WZq<}K@JX5O}rX67CAdFg0q-nEW~<~{3ZXx_JuhUNq7Xx~4y zj`sZ{>uBFUwvP7w6YFT-Kedkb{WI&Z?fo&IbApcc{eRZcK7L^x?cJBwVXMY`WgTtN z*VfS%ePbOh|F_oB@_%O?E&un{(aMgVg1`S-+8?Z=r5&)2mi9;MXlZ}4j+S$bb+l4r zt)rD1XC1B7pmlVEO>*zxNS%(X8?I}83Xl&6seE8Us zb@=eHW$W^dWW2^dW&|`r*(rer{}JnSQomnSQounSM65 zOh4PQOh4PUOh21g7W4d%O*uiPAMRMDAI>b(4|gro&*qltXM2|EXQ#4EKRdN$`q^nL z)BDp}ruU~4_CM1POmCU~;S84PpUr5Q{@F~H>7UJPnf}=Oz*O3tKE@hdzv}NitmZ{5HrY@)bUyi%S*ySx#SFlW7(K2-<%T}iUFI$D<|Cg=G z@&C(K<9LW=t5cmLTZ8Hx*_!PCSp5TJYtc0=Tbt?}**a9`$kwGgN46f-IkNSs&XH|E zb&hO9s&ix;QJo{(gzCJ{OSUNo8(X#+)tksRr+N?B7F6#c+mh-%WLr_ahiq%A_mFKv z^&YZqsoq1j9o2itw%7BoH<9f?^(L|%DQ`-)6V-djcBXm{*)CM?A={PeJ!HF4y@zaf zs`rrXLG>Q8J*nQ?o&C@D;y`aA8%p&ivc0L^L$)u~d&u^qdJozDbRWwOqWU>x2UGnV zvO}nT4%skzfMti$1GWDL^2Xs*AAsyAst-VRG}Q+nJBI25kR40)0mzP{hgqi2(`O+& zo*rS@3G_(IPNcd9GX39w8LNvRJDKVt$WEcU2(nYDE`scIs*4~ygX$v4&ZN2svf)%0 zL3S3^HISW6bq!?aP_EI}OLi_Nx(KrK=xLUnPjx|L7f@Xg*$Ao&BD;|4g2*nWx*)Pk zs4j@?QmP9g8%cFNWS8st*9DPXO?5$J*HK*%*)3ETM0P9H1(DrGFS6`*s*5ALgX-eQ z?xeanvb*SImW`tNA|thocXM#LW%tl4EW4LpY1w`BD$DMt`m)F#px0RTFum5YN2zWC z*%S17%buh+SoRd{-^dHHXXs6qJxg!4>^Z6xK=wS<3LtxdY6XzJNVNjUUZPq7WG_># z0J2x8Rsh+nR4agf_8JFT0c5XJtpKujs8#^kyHqQH>;tM5K=vWk3LyK4K4{s;^dZYW zp;{SapVCJx`yYK&`_EEkUvTo6Wna?AE&GaU`H+1>wS36FrCL5@1N3RjexzDSWIs`@ zB(gD7D~W6@)k-28-{(L}iR@>pr9?J?YAKOTq*_X3lc<&w*<`AvMD`2SN+SE6Y9*2V zLEo_KPx_{1f6=$l=Oz1_gSRdFhid7O{YSO*=oaXE)-BWbty`hm5_GFnTY_$#YD>@! zsI~;%kZMcNjr9C$Pta}9&#c>|pIbMk+ADNhR9l5^n|^8CglenMP3hOx?NDtSx*65B zp_|k1rsx;CQ*-dWb*G`DtvfCK!Mf8??K8U5Q|&Xlvr+9cy0g}y4(Lb!)U!H?Mt-Au%V4%Aq)m)&vCe>V^yB7V|x@%L-2)gSO3f$xr-F0cvy6e%B zbvLBUj&wJo%uZh~-Hkb6c%-`ttyyOWLsRRFz@rBz+zy zweD$@p_T6Gw9nLzL-!2I)JpeE%G64CIGxM7XHlkBx@XgQta}b+Xr+5DozJ@G(fO@= zK3%}N7tjT*-yOlhLe{;IE^OV4=pxp=m@aDFOXy9ds2d?nhU( z;{J4q6%Szl$E{}FyXflH9Yxo$?%i}v>)u1xvhKZfZR_4g*Rk&XbY1H{K-aVGgLHlC zK14S_pO@~#9BgRaN9ab@eUxr&-N)!A)_t6AYTYO3X4ZX@Zf@PD=oZ#}nr>;`XXsYe zeOAx^)|{aG0^P>CFVk(U`zqbey06jgt@{Su!MbnK9j*Ho-O0Ld)19sR4&BAN@6%nU z;P3xO9PDP@kLm8#{e`zw`*p`$Z0p zw7f!(vb;)JJd|fF5UgNOd#FBYM2$4SIs*O?sl`EqapnpO-x0tp*L8*D!tM2A@nB8SEDyu zzB;|d@-^tKmaj=~vwSUjyX9-sJ1k#^-f8`OT@LQDd_6kK^7ZN6mTy4sv3x^%ujL!j z`z+s>-f#IP^a0B^r4L%Z8GXp|&FRD1|A)EztvPwb@@?p&mTyZRvwRo&xaGUjCoJEM zK56;x^eM~tpif)ACw<29z38)+4`u(yJ!kpe^m)top)XjzFMZMS{pd@U?@wR0Tz@-W zvHU>#s^$9I@tWla)7LH6-;OuX=OrJ;!JC#JO5d_ve=y#*Tz@d$v0TsmyO!$)-n0A! z`o85S(hn>@nSN;bDfA=DPt)`NF(=4}(@!ivi+*bP+4M8Z&!L}NelGo=<>%2aEI*%q zY54{8E6XpWUt6w6@|!98h5Ql@zP0>P`km!^B)_+OBpq$}<@5*3^+*m_u1E4m%det8 zS+2)$jOEwTv6f#)r~Jtr$K7Ag$)M#o((#txM1QvYb~?fGJLp8q@1&C~zl%<`d=&k~ z^1JD;mfu5vv%G&V2ftf>KmEh<2k4)c>+$)^@`vc(mOo7Yv0P8jzn1Ii`Ok8m9`0+3 zoF`_mX!(=0#Qy6ge~Oc`Gmh&_WMwat5 z3^pw12^efz{szzgV9W{fH)+dqo`Au&*wY25WFm%NeG@xh!Xx2Isb% z`5BzYa^`1nUdx%E!TBs_P6p?U!?CpWG#txVPqVSC^)wsHSx>XEy!Ev2D_Bqa zzM}QCT`O5n+qJUwv|X!MZ{9u!t6ERXGsJpYp4F_U)mhzoT7@;Nr#oNMdb;zqtfxC) z+j_e5b*!g5U)Orv^x%5v^U~XzgY~Vq4c)+c+tLlKw>{m+dOOgKt+ylH#Cki?O|7>x z-OPHs(9Ny42i?MYd+Yh%k`wd}p<7vR7}b|T?@+2Qh2CLQUkbg$>2}sTg6a#RcNEnZ zMDG}?FNof;R9_I~yQ#k5&g_5hI1cm;(L0{*YP}QaZq_@I?ry!4sO|#2lj)w;JB99L zy;JE>>zziqQ|X;f_p#m?bYJcNzPxcJ-OqZ%>HgL`iymOTv+04>JBJ=*y>sco);o`C zCDFTxY9-OTm}(`_yM$^b(d%EzftC`z%c+(Uy({RE*1L*oS<$!_9( zz3Zt~6}_9OZW6s)s8$%gTPZ8t*Gumw(y9kiZ5yhZldG-D^#-r8s1HX~YuYMaq-vOj~`XEfQLLG3e|+Jd_*{+W)l*4^~~rOR@x zJx976)t)0=p5AAj73uxfS&2Siot5c>+W!anU%&W+lZULQA9&b$yf^rW_4NLu*3~rvp6^^3MT3LIhVMAH}?0KtcXkM_I zF7Tq&bcZilO*ine)pP@|SWP$Zs@3#+uc6ON?H3MSw|bAhVf7#An-=P4-m>sl`nE+o z(swM1V?O$^HRh+ESj=Cw!B4G~($B2b zp`TkzTk$_@FHXO(_7e0<>#Rw?nu7oQ_d5>0w(NWQjb)?hx0Y!o^m8a2P4#mq97FYU zC~ZUab0}>~2dp%f{%ECf^d~DHNXKaZ$FK!QQvD!mngjhHf?;&f0zD1mEzr~Ovjun4 z2^QQ#Ct9Fwnq9^@9j?m-<13x=Z~WLjJxF>gNz1NB^== zH}bcI$J2i-nx6h^(G2uIi{>a4xR*j-FVUQw6fI)l#+NL5in&*FfgA=r#qD^Z(O=D~Ec#dybi$`&M+gd!D;}dH= zPZ>yQFGU$hNpxeGC3DfPB`eZgShn%gs#?7>^4?{XH)rTQno6c(KI&?Nm*QK*tx*pXYqM@zOouV;{ z>Q2#MFvs(ZOZRI!k9B#9#_M|6qWe7u^I3N^o!|29=mM5+PZzX&2fC2uJJN+M--#|_ z`OYH_`*h9X0VAIL^yWSnoxoB{feTJxrKP|%C$Q2|;P)o5(o$d*C$Q2|U==5@(o$d* zC$Q2|Sdy~JQdowv%2HUCvdU6ep0dh)y%bj9WM(T2qpY$N4yCNL6i%e9v=mOFth5wP zr>wFR&ZMle6b_`UvJ?)Ytg;jirn+eqMls+Mbk`^hr@Ctt&Zexi6yBh$v=n&yCa}^{ zc$c!$Qh1ND(o#5&YQ<1EpK8TW7(umSC|pRjVvF}Vxrl=$tZ*^a@}Y1UEY zuB2L46t1OORurzI%UR)iswGC@MyeG?VG>=@3X^GnC0z$abX_YlkP~={q?pq6t=OR(SW(-u zp%pct8(DE0y0I0frJGn$1GNEDXqJDNC^m!@jhxfJOL3BSW9!&SQ;xKxE6%VBcTJcD#-$C&x zs^3BJXnKehkD>Z~6py9)eH4$=^M4p8C~74Rx8m{i2rHgIbrBTx-0LDJo=kNS6i=bL z2#TjtT?EC`DHoCA8C2Im@l2{~9MAq2hjXBdpm+g2(TXFeE{NiVR2M{1!>0?Pcq!Ed zQM`yp|5vH{uHvucK#K@p^i;6pw&JJs5-Wa2b$2L!PIY%Ej;Fdi6o00= zI~0GVS6J~kdZiVAr&n2VQ+l-(b+gxK|9L6uZnYdJ{zJ7IDC%2kHBc(j8?02NH(IGi zZ?aNEZ?>Xt>J}?C>8)0Z>1|fhf5GU4+c`mzFEZf{E9ydbT2UW(mzAcbqpUOyz1vFD z(tE5lC%xB7bJ6>(sEgij#b4+H!v2@$;ow0l%}*b)(gO5hEB-+rvErZfQ7bJ-AG6ZJ z^l>XKLZ7hGqV!2CEk>WR(vr0QG%qMEMW3A7lvbyja+KDfZ(C_iswqcl z9jYluXp^b;#>Pd~NN4)hBv?MlD2(r)xCEA2_Y zw$f1gjg|JH-&*Nl`kj>)V*e+6Z>6p1Xe(_^f3T8mRM8z5dBcdVh?S^!`{Y z>HTq5())u}PN^Pc{eLjZ8ah48C|y7&Sm_cv(Mp%nNmjayPPWp6RMU*oL-bcGJxqVI z(j)YDD`|fIuo5@kpP*?*Nq75~mAmwBE9-I6-vpHBqW@Z1Gx495w<#3(o>P>Wn~D6b zkTSC}v1DatWn$UN_tDA}{X+RU4ysn(kk+lthffTwqF)THyf2Ncd<<<^MIYF-%Iq|@ z${e(1<&$XJ$|uu={hyfdO;4fhiIh*H9V?$sGb^7-Ss5u0r@58SqCG30N2jv#2s*Wu zFQn60`C>Y)mHX`R#ObU&l1^{s%jpbOzM9Tx*1{(&wp?09JOMhaP7Y{hn?b z6@ITj@pw*9(J!8075(CgR?#n>WR(f@WUFTM6szX+RIA)VPqWIc^mMD-M$fRyee}#J z`i08F91OS0lk_aByg<*k%3JgttGrFmHT}Ej6VEgKyXX_oH~qWl6E86RyXX@~Smg_P zp;f-37ilRj;_knu7h6StST3>3XnLttexR3GWq^*f%1`uitBj#nSY<4|(kkQVRaW_# zUTu~BWDc&e$}jXF+v+DHpdaKSrZ?Ni&^hT@BL~pX{%=BifPDQmPsLn#QC8*9y z*^<6qsby51LRhOcVS#@dpxK)>-Pgr#os`)~7Rr-{$ z|J5}(c-pG#(r2u?9(~rT>(l3~x&eLOsvA)aDykdP7p=MpeaWhu(wD8e1%1V;Thacj zyr8-@ea)&v>FZYAo4#SyedwE3J(B9FKvmE5+g3fAzGGEA((hVTkMw(1J&wL_{pv{^ zd|=g6sU96vPop1M^-TJ)Rfp5hta=sw+^U-B|5;T7{e@LE&|g|r1O1g%HN;VEoH*L5+OD6hs*bU$9=Y*W{fGW+)qm*(tCiUQi4(0> zrjx8zp?Wk?tI}VrR;RyOEugn6sWGtqN!*3h znAk~tbE&RO8&*A(Hm$Zhjjgr^wl__z#=uTWt+p@iSZzO=P0=sZ4&V%S~go!|1eDJDg5uwIk^CR^#cIG=tTSp)<1olV;>Y zkEJtNP5*3Ws~u0-5~-a^XSM3-bT+GsW^IENc3kUOA z?N&O!)o!B;SoJKrpjGuV+H+K&r3+h?r)Sb4R(pajYPF~6Vpe;GE^f8w=n~q0UTV*C zvZU2spi5cxJG!)0N7H4j%Fs?))@nb|<*de|H)(mRjiW1AZ9HAkY7^*6R-450KS{%e z8jsqfRjkJ2Gig<;@yJXXVzqzhYF6V3nY6mq{-bMHy-3%zI#0!j-;Y zPdQlE>YB>+tgfwC-|E^5JyNJ^D>k&cmVYCw=|US@O`o@k)wPxtOQ>Lch-t6xa%s?E{c3uk)o-H*S^Z9Wu+>LVtpI9Q(qUH9f5GLXL#?I{ z(jO7j@1go5g8Bnge?(A!gdS=2N9j>ke~cb&wQJ}xR)3QoYxTFNRuc73sjjX63#;`n zIXK?xU(pk+{x#KJq5cikR-yhQJ=y9%(NnCh$M00DkEN$seH_)+qCQBqg{Y6$^M58M zsQ*ldTYUmO%jy&9*;fCJo@@2LsrDQ}nQG4wRH*hDL4#_a5j3f`8NqZ^+k7$mA571| zC04tZUTQTh?`0OuOGjETAJr_NrZ25oKrlbm-Xd6lUS)wES8XkVg{Za%!NT-fmVXi# z4Hlu-S+E$r-h##H4HhgxZ?s@ZdXoi9(VHz;n%-i;GW1ppmZi5@upGVJ0{sh)lkTu! z1*)k$A_fA*>c>TALh26{$cx8Pm+hSiUy zdJn;e^eqcMrf*yDDSgL+VN!58#B3%;W7TQHh_V8Hw^*eL_e}%EY(F24AM_5 zm_&6!1e57!7W_hWaRh(S|5@-i)fYkV5B<`@lbpsr~j zZ{gZh&pyI+=>!YcqZ2J$pK8TW*U)Lj5N=Pk8VHB!L;tn#F#4Z`hZhR`>=gA&Y0>Jh z(~{Mhfyw;klR7gnnZJAzu!@tb7IbON!jov-!jox$J}==Z9E290O(P4>r##CNUO<}` zj-auH7t)r67tywb`qGJomr?dy!jY6Mm+)Hlf3m(U!rN%i!n^5I7T!yzw(t$gTuAsP zWiBM-$(YPsNT`*V-op3j3>LmmXS9$fVDd~;^a~-=KY3;g8KlXxSgW9 zXSZNi$`DG(kWFR?C1k)RGlUY3p$wsf%-7_3EYz0jf5Cn7yu7g@ozKDz==>ILL>I7d z0$tF;iF6?gC((s1WN0QYV&TSgQ42Sri&?lSUECu5AGnyjghd*fB`wm>{2xo_9~j5* z{_*$S?fu%_} z@I=FRYi1|IcWcHC6nwX4Cb{|N#dnLQ!tmXq*~RdSu$u<(i}7xTpTm`gUy64(e76Sn zFnl*fdm6qwgOd&44QemLFX#Fn-kTlp-Kh34(lxlsNFR*%HGDS`H$C9HAp0BXL$I4F zNFR#bsR!Sk_W#E}j%|19!9M}J95u|p-@t}T0{%(Z1q1(N?1F(m4c8jJTQi3l{tSG$ z;m^cJ82%O5En4u~@R5dpEuLcd*Ws3{d4T9r$R&pN)?({Clul@!;Q!>ka=t z>_!KEH$L9*AHr^=;6IApK*67jPc&Nmr`d3$2LBoCMh*V6xY6*R!>1T&cNR`H{6+XQ z!~YmJ8U82ubi@A!pJDjl<1-Ea2i)xDznNsi?3`uz%kkNU|0h1j@c+Wo4F7L@uHpZK z&olgg@%cs&;^{_EfG;otxAHGEf+9DU|4-mnc&ibtg)cIKweiJ9unxY&2-e4L{vp^9 zUupzf;LD7l3}0>pTVl6HAlM4KHR8VDI@p?xD~(_RzRC!;#cuIHP>!!Qf*tTRMzAAx ziwXjFskR%zZrCj_2rBXQMzA|}YYl=u-1R?;9SHWsHyUZTx^FVlhvS=#^bxqj2oA!x z7(p%mpAopWw;I8bxYG#Ss=v($+(N(oKUx&Hm41g2xRvf!JOr%r;X93hl|6iy5x5n7 zw-K}A^mRJ>#a zZYo|j0yh=?M&PF66(ev{@v4ztiC;5(w+`kT{uKPW5!~;t|2Noyz@6qdjliAe0V8my z`7Oh5#BUq^Dfk`3ck{Zy2;7-^*9hF1dd~>lnR?#{++Y_vnE$|y_5&kuqy5kb+-N^C z0yo-4M&L&Hu@Sfteqsb}gr6FL8{wegyXpAM2;2ZaHv%`nmM?gLz>RRR5x5R~X#}nV zUm1bxz}H6L0uC903;2x@xOm?hfs5xBAp|bQ5+iWs-y1D~tMG#nxC%cSzFQMZjllUQ zBlrdXYy``&+lSy+?Diq}4ZD2^e#dSff)&{9L*UlOu$%v3c1GA)ZUlc|R}q3gv8xEd zU)a@yU=?=tAov@*dJz1BT|Ec`?CL=nVpk9RJFu$<{zwZO{~A8Q=)-@|R?8zs5W`U; zTnoE>2-n7*5w3&dM!-#IdBO-c!AT?B6sL@EJWfLkFX3iv_(oWU3yg4cTxf*b;*1e) zkF!R&H!d>5DqL)Y`{EKKJQU}QuojmZ;bC0=%k%6&csO3o2#>&{jIa)`ZiGkTHH>fy zUegFq#-oj}5xcVl;VIaiB?wQ&?kqvL1s?MsEef|}V_hS>6t8E5m*Mq|@NzuX2xsCA zjPQEAp%LDIH!{Lmc$^X5h&MLEo3NV_2)DwUwzwB|w#IHwAe@NZlt8!(cGCdit=RP( z!cOd_3c}m48w7;6V;300JF$xkVGo{QgiqpajIiY?HnugwXYqDM*oVuF@Hy<}9Kz@E z4o1jLY59&u_$qcChwwGLlM&9xI~(C!c#;t=#1(G-c?myY$Bh)ikMOQWxCl=+!k_S7 zMmUV!!h>)*-p2@CJGTfS+!OC>ge&oWM)(ij-w6NZ`d?nn4ivac?f@fni4HVE7yKY2 zbPa2a(6u|*2%Qfx3X1WeMnMU7D;^4Rm=*6R$YZzQ4`==hR%hc#BXmKg7~#?QD5JoQ zYO3LG$;(|C6u40xV-&cK9cvW04%Hh4t~19O1+D|f8wIWdEhq2-1xMfpqo59-XcV}P zon#caj=4(>3S6Q_qrfFP#VBy`PBjW#ywi*V7q7`EI0K(`p5bZi4SO3OB_M7=`2UgGS*NxZ5Z!!w(sSTjGa}!U_11 z|7cO+4s7%og*#$5KTzoIW{(+#JK@KT!b!N-DBKS}VH6&O-4sG$4R%uqg;TJbLMS{6 zKW!Ac%lR2M|IbixG=A17JQepDg{R@?jKU`Tyis^Me!(boSI<17uo=H-6rP7)G74Gb z%U?DM-9qm-3R_y)c*Q8Z2)}9+UW{Ke3f)SdZxp(f{<=}fDqsGFQRr6pn?~s3xWx&D ztn%e=Zy=xTSg5NU=Z^Q2!g}38{Mxi_99~g!1 z)P86ba#ojrWE8qH>lQN$u=4A=UK(MINSyq1xf ziPttVSKxJwOdB3!WLTst);0dyUXN|aumD%AZ)9%Z`d=}Y9mveW8yJ}zv71lG+=ShH zLWUK)!p$dSIkmf2M@UJX2Z=tWFEq0M&@C> zr4c@Zw=y!%;;oHLAD&=jp2OQ1nRoEEMrHxt&d9ur%ZlWN;M%FE| z(~ayTe1?&&z-Jm+x3HRxtXoWH8CkcM&Ni~{ESzIx-C3AsWZi(zHCnQ6BHo=I$99{M?ZsCc*{AU}M%KOmTXC(CeGa!9 z+2^qf0NEGt^+xt3e1nmF8P77Zui+bwf>-fPMs@(-Y-HcT9Y%Hmz6Dx%$u45!e@6CW ze5;ZD1a}(QPw{O=*4<2QHws+hJB)()c(zgSI=<7$eu3{YvWxNEM)pg0{dchg+3)Zi zBfA9OZ)Cs64;a}W@PkJ7N8D{>-R1X?k^LJ#Y-Inzj~GQ!++!5Q@T33115OicJZ2On z@#98O8oPOef;aFJMv;%7G>QWJlu;Doxkga|cJmAcZ{lZ+g1_*yMuF>epPT48#chRK%uv+ouKz)Hpy(p}nNf5x{@f_K1b<}|&A?w9MeaT^WE5S7zcGq#!QUE1 zop^~+GzYuI3`O_j9~|_i=m9oY8HU1}6D=PQ0P3f)~IG z%=-8@BQqBNZe%vV!$uL)yrN|}FHpqXu2^9dxj9{F6uCJaF^ZU~6@M5-?$rKiWNyQM z8AV^MQv=ng~$n_sZjC^IpC}QL*qec-UUl}tp%;ieY$Z$$m z#*GYTab?0NVjwG%MiIeRri>ywyfSSR(Semd^UsSi%*o2Y$hZ!LM%D!{FpBrZg+}py zIAav=kF!Q`H7+uW55UDn@j@!c$`su72en=ZsYo2xd}T^d^O(GD82@dH;UWw zW=7V{-R4HtP1hDi)}8(`qxd?!rBQr6-pVMx0dH*-{|`_24<2yGHM(*eBkSg6TO;eH zWjiCA$K^(GFW%lLegf}c6hDb~G>V_X6OH1h@lHnZvv_Bt_&Geu&Hp4u&wYJmg;D$> z-o+?>3GZqYzlwJ=ieJN(M)7>SyAk~e?_q?G<2{YyxAA17cmdwaD0UAxT)DSV{2t!N zDE<&v8O1KBTm4YH2=8YUa}QYQRzDPff~$?oq6|B9y?#sA`?jS}HwjFK2W)+q6Cy^(d7+i^zLU2ex4S$7srFtY9}G#DjrJ)P)i z;hm2g@kvIB>-EV-$$Hpb?~rw8;uNFET^XkuMXs*9-l53VZ8C~n-P4VdN%#z-WH)@K zQPhiDnt6dDx025?iu&={M$s$y9HYdIW|~pr5}#|7xDK3Wl(-I@Z?gFF4 zwY$)0DY=mi&Vr-l7Tju-bmEJQlH2gbM#=5?5~Jj9Ji{pI!j~E)_u$KnB6rnXZWOtz zW~NbcFTTRf{}m*@kDV)xk|*(1M#)pS%_!apUu_gu;%khOr}4E$$+NiKDCxu3871@Z z^+xgT*bN#=-f|pSJGjFrS%BS{fs*&}|BRA__*SFjQ|!(dlni2b#=!ks z(Mos5pu}BecNir<;n~o_OUch{+-a1oz;_uXE3rGpQ1TCUrx`pP{qS&2EDBc6R zGYQ4cbBtU9-*4n{_yHrgmb?BRWCwC<<8C9j4t~hUjlmBaxpna)M$TOwJw~xh^r%tn z5c=LI9T4W8%be;y6C#V;DU?eI%Rt{lH?<@$ zSB>1R_%$Q98=i0E+=6}G$highhLLM=bM~f@+ZPWQx&824M(GXsZKIS`yYeF=cNkt| z@!*MxsCO1tonM(OW(sZqKd z|77IcH2!SlTJbMN?jpR*$X$YeHFB5YVFwL!oou*Zkh=}9Fmku!l}7FkJYwYT#(x;O zd+?t|?q2+tk$VWQGD=;$zm5F4_#Y$pGH&^o7s&NX)ccRzt2kohSWF{PBgX<7i5WT8 z$%tp-*??|bUW4=c6MvnO!S!<{($(=eqttbNW24k1-NYz$$2Nr)UP|4;@kXgTxS3J9 z1>W2!EyHdfO1H#rA4<2vZXZgw#cm%;x5HZ-rR8{nQMx_e#wb06>wm;Gg3?2=YXqgW z*foOEv$1Ogk)QAmM%10H9gUcq--$--2t3IsJr`FPrRU*YjMDS*uK&RUE~c}wn^AfJ zt~5$p@$N?HC3p{`^fJ7sQ92V(HcGF+dl{uy;=PU1JMcb6>3z7$D4m1%b@RV3qr4yQ zXOupG_cux($JIt@A3ne+eHkBUl)6jzAfxmZTw|2Ji4QhP-^ZM8N9iZnooy&>;kG;C zPB)Ye;lqs5Z}8zp>37(jRw(@**BPZh;3JLFAMq5UbSXZ{h~0*#8nMst(T3+1`Y~?) zc`5yconwvCWw_ob{S_Z)l&-?Z8>N5a6O4QsHyHUWKGDb*;ggKKTOTJId9KBgMkAkh z*Z(Q(Kz=oRs*xXsPc!nX<0d1&20q=$yKDOlBfkzl)5yEatl7xBOZzM%??&tvGvwFD z=Qx=E{8%=o8Tk#cTeXmP*S1@=klzTqRSWrX*ezPfZ;UT6^6pZ-(8zO{y1y-Sc&3rBz*iV~ce!0@ z*nY#BeosB+sN19E+c;|zQ@Sd<9m(#arizXe*&Ikc#q=y z4euHJfRS&&4;uLsaW}N^l6RNJLq@(4KWyZ=Dn=eL@~7e+BYzrpNg(g8jK_@p>G*LY z@2-p|jJ#X8Pa1hQ;HQlIb?*9~%MRq-JU(sY-8{OUL*7lrvqs)cMW2y(r~El1?@sOW zM&6yZ7mU0+Yx9h}J8Lf*c{h-k{(}cxxE{Z3lJ`Fz83 zoqXMhxwY|zp*()mkUKtL$aUKN{x|ZLBzG3xHsnU~juD|~WPuS0@w-N(1ixoQHpcH8 zo;y1W4ex9Gff3mOe`rK@#2*H72LEJ4v-oEtTI{a>W$Zw7P5i479gTl8qHE#bjp*8V*odx!mmAS_ z@d_ilDPCzr>+pyXJr4h2MBP>Pr-RcOb(h&+M$}zqtBk0-%>Fi_7vO)4=!Mvg4x%kL z?{`^bt(G4CFFJ!wjpF~G)$(`cv-$UI54bmlT|l1;s)6moN*LlZ?^Zrm8UuZN`ZJZ^ z*gatBl+f1w{!?1P#mAD%6L&S%_^1JCby$;nqsK{Wk!Nkn*Y0N)*BO+?kYwFfX*~|E z$HDbUzCOpsa%_VfaBRa4X(Nu0O93Z+<8HonoMfBMmBufYHk&PN-Xm>6-7@yK9N`zVtcq6m8L#4FiC|Jr@i_ha5#VOdiQJTc@3XWHB zd>4-I%JJQDfGg{z-6u#aMeRYbJxMT`V|#IIZx0qo`*ccGB;A)|`!1IDYm@dbhast& zK_9SCI&emdbPx>=njzINnuF{3=JxThN;;ID*Upj-n<^d7u_LObx@ppp1fJ3_P0dP2 zli(PF9ZS&q5$Sm9oj{TXlAcJrlV(aMw@Zz*IfaC$Qm-lGYt1P?V?b(dA;8(5bPg4! zO_$EClg^{Ud4oKUVG++^s0Dg|L5Fl<74s$Nky>eYQ3c!fbBAEMqvOBm0?9C&zuZ*-@@BRx`22=zenM=5)BSbB^OJx-&?7fQWN(i7Bq zVzKljBY29kxnp6j^mK>x3_RN?^`&68^jtX%Nzb=RFN_B2&8vZ>(u;2XUzz~)^ko|L z)2P2odWFusLb6walV#snkU%;VsXRQ zyX}12dPb<6tH%kv^Raoj~G2IyKk< z9RG~%&)Q&6`g}Z0hXLt}(LjvF#9BO0`mzG%N?%n$xAZmTU$??CX^0#x-?T~JQsKKY zm?JG=BufbJ{W#$G5949B^drZAoX<0{Yk^MxR0AaV@A+uN_<4j!6i~jbgKu^v>8~XC ztqJh&jj)9OD^m}P`Kv!-EN8$gYMB2O3-}zP3TQk+L-#h}50d@SE&Vwj*#D~)Xs~K5 zOov6%-{XMoziI!^M4;Zkl`u~cjfW0J_>mNetWqS}qeyHbELOy8S0r8rOB6|T@-5=Y zUPV$16iE*$;#a^NMS@Y#uSnRaNCDgYElPxcK#yeD&X9oHZzMYthWU#71|V=T=HEIZ zd|)2Qd9Xy0()o(y=PI%q?MG3z2FKT+d=1LhtcDhnj~)vHimcV72>0d4+FgpQQv);} zQx3BgS$7#!@jCO-Lifl;xjYzgpk0Rry0>?M*P-K%f zMK+zG$oNq}S<7Y(ifqo#=FW2!*7A#R@t7;fgWb4_AOyKy0Aw{;K zY}?5&sK|CC*>15S<@G>)?(LE7mnpJC6AUY|<20ZX6N$T%V1^<)^H-daoo6aCDFlLX zzmHUODzeKMSft3VG~UgFd5Tn0Z}%ES_MmJJ0#6>T$X*i_*}FoKeW0pRk$tJNU!NlT z&sLt_~LesAISDWkb*WvP9*V(3luqNDiHkSX@DE4-#Ef^mzF4UDx9`RktR5u zHfPi*awhH198jd0?PfZA)q4_`HT5x{|S7fKgnAb zDss_iAmGJad})6UXgq_Ymsaxy{o@q5oCGu3zhXXL#$O42d=G!E+_%C<+UD?u@HIf- zYq}M=mhEbhrwP!xUmF$qZM-7C z6Lh!=dK6in1KKSo@d`S!lGxnlBO}D&oqyyH{)#X1CzbxBH-FK?zX-aj8iskAK&K-A z(20LK6!~|QqME>y1ZowHHYplwSJa!MXuMC+#6m@r!-}Q`6is(48ib05)Ct)ypiKdF z3zjLG;dr)8(W1$U7S}6UQm$xjR0}UOE?uB#p2n+9S9DaXqN~qRbd9Boj-CoMUW?=0 znxovBqwA1#4E5J-RFrqj(e-94x_+mkV`;NNyP_M;RCJ>zMaNb1fB-tY32ZtV7Ad;f zcttmFR7wnwj`dzC55JKktjqoVs(D7qh`+`mfEYU&*@4u%yyuuoCm=tgT6 zDtZX@4{hhSki$mvfUg{o;0S`(v0vArD0jZ-k+T$?f~T;56g~=b*NYxK28I+pW{#rA zvR|KqUPX^1+400WzF*M>>Yv!E=t68Jnia9*dP=i~G7bbLXLq8GZ}4k&t2ouU`dRdhzE=%rH?y^Ky=K3&n71ipe8 zS1eQX%6W>m(SfU*6uoA#qV3}qy{?U~$RAd87VU2=SM;VVEMxv}rUM_5`shqW z9~)7$m&8vrD*EI?Mdwy1`gD(?&l0zfPCQ4P=eho)^GNVwhoUd1fQ0?+ioQaHR|)hg z<*yAWI-i8E)4?|;D*7f#-dv#Q00G`=QuJ*CzmtO@MHloc`tA%x->Xsd{W3)thOk7@ z5Be1SkQ^TochP7VRP^Ic&gdt#ihh~}k_^sL^fUH99|HvYg8jwpe@Xe5lz&wZBZ_|A z2CEbuY6Jp(Qw4pBeoNx-*j_SG(eFnq`a=lAivCEQrTvQj)T8Lnbo!SzMVC?U*O2-D zjo`o0!{4be+@)H!7B>RV-Pd7~l35OOIB}r>@_}Qv?DExnaZ#ppZ(L za>cR)E245SWhHYI%S~6Tv|6z|4f7;eZJA=L3+5@d#!SW5453}I(W8L+YY}6u0mas? zS8N@&$9OQL*t&g+t=Fm8`ZE+8+ojkBEgaZzm15&kifuevu}w(0DS^gwd^3`4PLM6w zE}Ny;meUp6iv6vZDz**vwvuPMpZplu>%=6>FXVlr;}1b{37# zs)O0UXwDu71V4L$V&{wo%FgKqMmenlh&PRT=Mv-G>583KquBXuPag&RD{kz9`HEdg z2U@CtUbWKT;>n85Akn2Hy_||O`xLvfS+T3ifxvCE6uY_%Xm`yRpzIprTtnHlV_~Uc z?XJ0~c17meg6nm89 z+=OC}6Q`H5C-9T-)Dp$!E>rC3VFvsxf%-zlo*Sju^J9U7FU(VH9)5}amunR3C-E!g zK%-ZC6?={S`IU;jPTSWB_QoQ`-h=_l-zLsGbZSATV()Sm-WyQteYO|YDfR)eKBOHt zq1Yl~FXCGqVjs^}?2|#oK3%BT;E-aU5#;l^iha?f*y1s;Sg|i>DfU&ZVqfQgxuDOmB%lio%dTu5Wy#dw(xdHe$EWocVP+alT))3%tlCA2MBBriwX9BoT$VL)EK9J=ML zHVWE-c%vHRwTvRjs3r1N9}kT{rPY_pTZ6!Bka&$=7?!u@1egYMVMN~Oi7*}dfM9E} zzZUyzvA-7kYtx~%TYydbU!2)?>>ET#< zKekui1|d+sVI|Pfjo9Ca#)3wrpvpS1Q*YgcgbvdGv>;>biTaH7R$SQk-V9M z@~*&FE|qr`ZlmmK67d0}*Ip*?x{30xFPC>ijl5Zv@@}k>cN4xDI>s^ow@~oECV97x z0eaav7JB5}Ru4n+xC?rBkYqN&@8tMhGvwVpRbE$vyn6_K?*w`G(RNM>=)?o~ff0ER zE|b?yyNCMaJxpAF-}8EUR)K^%UpTOI_3R3OWtp_@_r}KFryhJ2zNej#R7RFc%&K#{s#g6m?Q5`I`AiL z{>nj{yj2bI{wC=^9RFun-oFbKSC`_ER>h-J6_1rG?u~*G#p45tC+4Uno}8h0io*0{ z#r<)xN^!mrDIU&Jyr53;!m%){c&1PB>}57jZ3k2DWvdudb--7b8cEz{sR(z{Y#kXdE0`<0OR(#tU#kZsF zcD;(1<8r(`-kw41Pzj8F#~NrM_)ekXJ69+^sao+0&crSR+Oq4YDt_>6#Sa-&yjF@IMlycI ziyyH-@w$bIPsu5MRF&c_Q>zs}njpuJ;8+qIOOX0*#g8M=@#A1f@e@ec!10qND1I{a z8yV#(GZjB|j^d}$=CoeLn<^DQo$WJ5D}H7OBZ@aKQT%M`^0q8~4jrCGoO5gBo;ndf zkItOm#QaasDn6Z^3;Gnla2`D(P|E_vFB+@(#Y2kEs8ak=5?oftlO=LM*~~V@ub8a( zm9>grHBIq0+FebIYkCyFcD~~6boP2Wal<&pXL0PNQHtL@OYsiMZW&hm)@H>!S1Eow zpZ~<~SgiP+1iPyfMijrhM)9r*irYI{C-D6we4t732TAZCo$T&X z{2|I7rryKOvlV}YdXG$3yr)X>N5?DvmsQ4>vzp_g4SBdx9pyIEO zSNx3`ioePJz;wmm3Kf5Qs^ahTD!!mW@psFBdM)n}bfKsC2cs1KaJ1qdG1^6Rh__|& zPv$EADcgh8;cZ#`^Hqv3PAUFn7US7jN;!C@VhR>mozK>eYxB-HR3-k zQ2fUZ#ku*!e`-_wXFB!EG{u)SD*o$a=Kr?}#re=EK1|~kJ&KRiDE{YI#s3;n{O=`- z|2tEONVyWxIZAK?NyO$W;nl+`CE}DNT9rsPE0JncBAtb9CHy)if)vbCBBYGZff9w2 zmB>&h+o?p+A|*;jDUqAZQzUZBlqj98M7~yu)o3&dR`--xBUEBd0*=lpu@+vtNr`oq zD6uZb*Q-`yeL69g;2V&HHztX31mCz#iA{Qy;9il~tWSw8#w$@qN4J`x!~{A&VVM%! zP|m03iERg!*sg`3+fkvsU5V|-D6xZJu@XBHbYiCxJ55(&XF4{C1{DO@r9uhbh$MEa zRHCvj95_{pgHq6=L=6oOCeXnHN*qF>LtB-oZBybf+8$2ZIs(--17&rK zlsJ-hM^1!BC8mr8>P%g##4)r#wqA+)awU$V&T)fkNgPjt6RMzJi3S=q%vIvV3DB*? zNi;rLFsMW$$4}{0;#3lyR;@(ScqL9J$mv5$oH0*{GrN>%rekN-DRDLl&dI`3C8iPg zT*}Uyuf+Mwl(>Lg7ZSUL{njDo|6&4NLc$oy%Mtse&a+~qQp(Jl(?CWba4C@I{iP&ZXFG@?Ode9 zZFJ!F7J}W*#vRp4%%kt&@2OSd(N-lM>s8`$I?_vwCpwgPvQvqtI5u}7XW{8? zC7z+uvs0Dmt5Aa90~60JQ{wprO1waWd9#&xah?({4J*+fD)9;(du5RluTE3qwJ}P} zuTtXmMkU^;QQ}Ru2fCGbt62#?luEo)slSPx`>R2T zRTGu?dkhRJ@lU4`|28YBRwW}dm5lZ)$uDuq_(UZW>?ao}nI5gAU!`O)LrFetP8Rek zS=gauhW%`}l0_UVUaVxvG9^pPl*~_4a?K%l^oqdz_oHfrFBR!hV3y+ zm0Xv`>yKA*Y?qQ7rj*=>&Wt1R# zL7-h}xLbpg+-Q=!Pf&7?EG$)W&t*zZ9#(R1Psx3#UqzsOCn~ug+xw?riIUaCJfL66 z1L2^#O4bZ2c`$7cr7oW#C2NUs7(f4$hfB%B33dd9byPaCS;;8`nbND|Q4LB?CFs#j zN^esXH^0T&&~qL&Y|+OP9@K+SMof9pGW7;pQGgTB}!h%ehZ0s z>z2HT?TfpVyktD|DLDf!?N{=$MkO!j*ySTi&Rn46m7$VXG3u+Se=XbXLrPu`vs&gU zc@sV9n6Bh4RK9gk$=e8UN3W81Rs)Uinhf)myt@*p-&L;UJ!MMrn@{rIrApq{spK5$ z-tPhJ9;jFH!3rh2$13>{$sVH957X`u^7PQbM~9SrY>twTH#3M{f;}->$tP+2B*~s4 z;L|jEhU3pRDB0Jf5=w+ht0=Lr2~r?gEm&OP%+K@gD6L)-wMeu<_9hB|olE@>5UA!FDA-n+QWnenCeT zj{^dJSqs$tstzdodYY2l7m`B+{-#yQZ%0F)lHbvp?-nY#qzWkeex{N?jDcPyf1I!6 z(qSckV*6*>|5DEU|1zTFG8+C$kl!kl{9Q0lNp2d+<&{dVNGZ9pT*(mv|1k;(@@F+H zQ1Y)iO0H^B^6xSw|LIXmW0i``r!|9Hl;S0qtr$)u34##Nxm_0S~ihVo7BTRr8cD_n-XOFSm@zd zC{)^Pu~M5iz%b81q2U$;-I6w2E>LPKf^FTZ)C7)iLy~Q)l-h2lQswF zmD)?tt<>Hm+ow{gDvnnzRcc>?^NuF9A7^j>dKgivdQhnY<|%bxms0#zlsbs*npzS#uK3=NNMRH~k{ zavYsFzCx)JCMeY~Ua1pFaw6?d_LOQYSL&3hN}bBcPa9C`bOEu>;0&Evqg3-4;9W@S ztX8GYrt#Sel{#mMQqu@V|YHL&KYC3SuJf6cs{B}Cl!n>E$^%UGt zsnjeF2zb+YrEaECN3&A5bn$!@lHE!GKAK5&()c#uO-t&IKBZ<8=&mtJ-QBKKSEo|< z3@UY>l$tY9srwt1dVu2(b}Q9AqSV7RNgmZ!Jwv0uQA$16s?-Zqev#h346l&nwQ{9i_mp}Q259?smr@JHDfR9`rQV;f)CV(^ z`e>|DACFOr_Z6wZI;FU$q(099XZMSKr4|$COMd@PeO05>*906Q+0d|3-w@>6UZuY4 zP-+Q@zbC*C)cKJFOR4u$g;GD`UnVHEjB?&&q<&kV)bFc!whD=thf1v|Q)*?MQX`E1 zk4B~btWxSP>aU_he`jGtseh}K7IT@7tWr8wqck7%q!aZ@CtHKdgFq%#LCR{G#R9>_rD+AgIJBkAFk*HL!l zOr@s`D?K$-`sfKtA2U_yV`*Q%RO#c(l|G?U=?2PAV*BJqr5o8lWr@!33fp@r-dXJRVjUm$1_&OD}8y5(p*mIt9q4gV>DNf z1KM0OOX+JXm2PMMx)dx`nhzb)vznE@kpwp_Q~KtaN_P;WV}a7QH1Zr3>fI_BR=Tr= z2DdFy`gTTqN4L_mNpfeE(svQ`?krG#4;{OAveNevbPl7re;iQvfpVCu^n;W=Nbqht z&(HhxL-Uk=xIyVhNb*RV(mk|)GzTPnY*6XPXDHoU21^*|lVg;Aa-q^s%~pDDjnYq( z^yvYmpP8xjv%O09EmoSJ{plA-GH<%lFM80U^h@Bwu1 zO3zP0x6-^PNWVeZn^JlJ-lERiAuQ$LFa6B_yA?{m$EkY1PU(d?Sg7;|?L6G2O6iZN zylAx2AG7@l^**gpdazOH&t@t8Ic>gJrSzATN`J+%uRD|;nyU0SWiX=jw{+yYZl#wH z>-%Lq%!Rf~#{i?|=YRU=8A|_B#r!YJDb2q`r+*{aZ;O@wokqhwN-qcg5jwrHU+Iy# zO8>$3pVO88i-fD%l>U2x(*K6?RSOH{M;c&6ezZe=tX;l0Q+|9Dbjwdv!l3+Qll&C* z({1wox$=XSdimj4ps;|3g_Gr;sp4mPR0o}~i07z`l3zmL(vb@C(fc|YLu z3x&UWqx?0d%IDKge{>d>%3o`~{Iw}tXR-WsX}eyH{IPUo!!G$7k#FNre#<5_+;l+x zX4B+v&cU)K`CHb?-)f@#t*N-pc=_Anau29ePQvYH$lrm0JJ87;8-USIq|HRk?-2e@ z#M!w{{-jFz6=m{wq5f{Tl8)@rEq^j~_NHv_Woq&F>5*T>!F?&*k6`-^%in*x{OVBt z0psK!I9dKd1h1jN!F1-3EKujrrSfYR$v*z2aIQUa2pE6JWQBCrvR?9z{ z?JlU6e<86i zoXe?ilHc0WFaM$mK%a^Uvgr~-k z@RnBj|EraMYZ(x*lfup+`M1%5+i86JGQR)5U;gZR`FDmeU;bSLzI(F#t}*iO;n=<9 z^6#4}e-1J37c7wfz-;*sQm?xLdgVVv*+X>V;R(>k{69jYo*a~+z|MOSLf1Lww%$NTr6$j?Xe~XH5r+`!TPLKQrZSvop zEdM&{2!a;^J#|v6FvQDnf#v#{7X3u$zRqk|5wU>9hUza z9r>L$!{g;I_kd(8y5+B&CV!+#KEJH^e{{(IljMIARTE)Q{@=uF`G*Am_9{@b zf=HEuXtjb^r2MLtU4kU?&eqw(}wd zlSoj}tzegSo|{90-6klg9H(G++U&lHXX6Yj;G@`JFOuy|`95_Ds+tt++n`{-=?eDm zP*A;4!2#4gh|hn58VU~P;2|RlYO53+HdnzBAuLr;N5vyaIHga)QFMU2S#UHBkD1S7 zZrT;p6Zp7t1;CrT(<&4+;WO$KG&6{^CM!6*Rl&5eK#Z1i z8x@>Og7Y|V-gF@0`6M}i7SMs|mCywwy?`JWQt!ec8gi_4v4V?7E4ZXq!3^qOI;i0C zl!BRb=!ymfSJJ_&7);wD1y_$KxOS9+_A&+6Rl^bm*Yo$E!3|>++&~X!O;vDXrGlGC za5JO1d00UQiEde-;D40g+M}Rzwu0McD!84xcT7+)I|tOclO%U_D7c#hcjK;!uvo!8 zbn0G`-MdP`eRCAdX;N^1xq=6>K+Ff5ng4DMbd&5Mdi)T6Bn2evsQ^aw*f<5eWeR#d zm=4PnJjwP`qZQ1hBTp0f84^E3;%Dj5vn1`qefT-*JU3gx^Z0rE0-i_wd7Rl72Nb;2 z(yQR*HU<53qJL1qD{~dRI#a=G^mKleg4ZW1cw?-BHyacTbSrp^M(;?$f(ixi67ant z1q&(vfMmQ|3O<^zU{M(iEBJVZf=@yPpVIELS_PkzFg#Jg za@wz;Y-PQI5z0rp75q^R%Xl8kECqj2=dZ;IR?XnqE7bj)pZ~!>6#Uz$P*n;eV--d{ z7*ZJPRp?Dq7;jUUpe$LYFcrd5h3Q2K{Q-qRx599?!h%+XylV=x)XxqoEUJJmg~cgo zf`tl8<|)h(v$RuTzFpyJ(-n^5{eQT6t->{`6s}pLa5RnA4xvxsI*kg)j8?cV!PaX~ zxc&@<+_VGeyApyHifmsIgEIREmL?n z$By7wU7f-sId;A0FMW@E9uBhYF9Q;_Lytm!hYQc(_?eRxHq(K#W-8>bTEb}^3eUyoQ~!dA3NKu$u(ea+MRfRL za$G`=OLGb@D_3}Vy~3H)zkUvVP;<^pbuWcaZ^|hqDf#>b(NP)dj-UQxSM9NO^ zeY*|q|7YC1Gn15ED@lR(qQHAm-o^cHX!$qXzc-JR_oDz9??HhN%1HS;g#Ud%DIXpn zWiPHDp(_B)zpzuE$NhJd~N-En&s)VZ? zBh`g;_gYdt+en3-P<@9<^#cl#s)AkvbOqQ=ssTE4MF*+YTvF}nqy}3_4YiOO9zbej zDXCEqW#Tz&9jURSq~?q#HC{<-!V5rX?iNz>R+5^(hE&)EwXg)hwFuWDT#FZxS~88) z(&41`C|bYwQ?D$@J`gKnWR=Xl3L>>wN?i9ky^Kr)cPf) zV(hCpK%(|7A+=uvsf`M7fYkm_wm-@@wE%c-2K@l=8n~0x!AnVPSxM@UHKY#ROzN<0 zqz>Or>WIChjzalX$muu z^%BrrI+fI4uLAayItyvDHjp|y3P7>hyGflh0N6z8Wq8TUkT7*hCq|RSS>Xn_S9u!)zm(;6vk$Uw~QWt{hq6Bb|)ZcC=^_pqGQBq-0)N4VzxDr?Z zAn&>ufS35)Hd24TmeeJSNWFd)sW*V{jR#1*Nd`KQcr!G-c|EEB1E#lt!7b2iIW%03 zf}$M&;}yvN!%R~D*b3nJRw#Nan6E_n+kyau-nO6A+d+T(W>W6}pF7r(x~c?#(A7|8 z^$Jq&Yyl3Cde=&PrF=MEaLrLt@5aMD4Zvq&j23|LF*qoBbOPTjDV)W^1v`Z$zHE+uv2TvDIF{gaUO z6!!nsP5ViG227uw2y~L#iGrOV>^w~Bb29-jcpimb2m&a$c^+_-)E9AmiGW3uX4R9cA7C|2H6W`w~)jl%V~0;4R;rO6prOu$R=G zcz$~qseeWR1fSHuOegiP8%f;_VX%to-^u{I(R?;&;1dQv}FMC#willox+ zse5GrJU(tG^^@JCemaHJ&+v?8o%$tS1WP&f02KYYV-~63pujgfN&R*asR!}=9f-f% zOzI(MdI;&?L+isJJ`6!WfaXXIsXxX5JRe<5>QBQ-?E)==QR+XAl195pgBPXo2GZnt zq`B6T=AK5Hr;#*o8EL*4u%9&lCek_r+elLmlBRh{(_2V0Kxm?XwTHAIh(ig|!X>0d zkQeDBEjj?eH3Q5tHj^ld;Q)9iyufr|8+B+f zqgp9j6C8U)?nI3qn9(eA#hqN*{psKFdh!+eTVHr1e`uS|hHFIRB;f2SNW;q%|R-X%TRc zwC1V6cG3p40}wWFI&he@L5oQnJd3mzD2Mf)He@GhLsyVC40OX2q>WGj(2tw~;5rJ| zQMk5(U+Z4dMx$&S%8l(L?PR2l>nOknYGC{#(oR`Q+Nod6FKO6x(iVf}x@DyOZV73>UqIRtD1QBP(r%ba+Kni;6wf!UBJJjF zq%A8T?G}_@j`)wZ0)_u@l(bvH;IAn_wFR^KAAK`ytN0Q z$h!TcJqX%|AZYzA(jGyXMTc4uf_59OuQdRu1sEIc^{J%25d*+?JJNQ{B@OPEwo@VP?J1=FIRSL+A?+Oy?>a!* zU%=$AyGYwTk+i?z{{0Q4eXxSG52um#Q7bvWB&6*F-KQw?*-_H=myq@a(!SV9+L!A{ z`wDaiK=*Yefc$U3_gh>KLil$`gH6#6wF3u9`yPA_N zt!pA_{|Ew`NvD~lvjl*9X&UJ~2J9zYUQfDfF6r)8(mg?7H|gFrr2D3m?jKKjpp0}y zAzhULq-!m}KGO9iq#KREe(KN>-PWyE;4ta-RA3wF!Af8c>7hlWhaoru<`Lva*O8tv zo%BrPXBChhi;|vAzy{KDW|1CWKzgDC0FPYIAgpaF>0=j>e)1~P$892g{5H~0LAldp(&3irr?-TGz<}y+}jQNMAdE^!spse~k18 z%1B@51$LAEry2mtJVd0gpGEq^yGVa@I_Vn@ll~Z(KL(n|hXYV1SqVVS#%ZKK5d_wg z{^WR|;~?ozZ677$Ze-4T~zku`?z-%)Zz1TwfOAVyITmtMN zeG6z`nMwMqH2{Qe^8yD*e+`0P-%dKb9DVyy(sv;5Eg9HJ`py-kzda4uLi(RU+wl&B z?J@ue`wQOgFPljJYb&se^mjq{E)?7iCH@AQzpWzuy-J{y^gU71KUhrq-;w{}M$-4r zB>kf$q<;({pX?+3Q_z0~p`RTf{c}9;hf*+9`j-s=WPN#*^shS6{s+M1>xra)1L5Bw z@!M^r9|Xa7(@8(nNc#5*0A+p%l70kqSPSY$_mke$O8P(6lfe`+q$y z!@GzK|8O#3d<=CP8Tv9Zj3}^y46_Y5K!&xH47;oYA1lZRf-ty}j8HonVFTzS0|6o< zx{8d9&17WmBqIxqV?g#|GIAP#ePqPJBmtp`-DKo~E)U4xNJharG75nrlrIKKpg<{< z>H+$mKpD`hos9AhgN%wcGAdV)(HojpO(W;meT-@-Q&S0al2Ho=b+gE*htLKu0AYO~ zr0)X!_z%kVJ3vMw%J**sc9GEp+U8a=27rEGjEq6JA3T$c78!sdLkfTmWWeqi9Yc4L zF$|gTUX0-=JYp#sBgd05$^h_&tw=j*JsG2M9dncn7$Bo<3mId}04R5II~n7k)HpC4 zKZT4_hLdq>4H>85+71OzUrfe?iDaAs{u6^_Oakqs{bWquPR5xVsKYpO9~o1iB^HRr z6cm^OVN>>!aTW@lwUdmqq5avL$vCGGfRL$c$vAff8Rsn_(R*aU*mpu0_{Hs+FZ7bjJY7XyoQV`$^bCG0_neL z1t4(VG&1HRef|M5uH1-f16>E0EWq`uAaIb3t9OyH5P6G`wg`E@g@9{tf2{$4*Wztt zT(_8v-?fnQYeUBG@ls1V+VOFijO#a$al=e9ZX8d>(l&B_g2=cD%x+#m#{VoKV;SCR z8R%|-GRxb^5MH2@j1^$=huviSaUU7CB7fy90N2~*0!PWXeI6NifY+*ZWUMX$Hj#1X z6yP8kcR`_!H7m)u8^rfO@I7F1?;A5M_* z$O%J#!d8i3FNXDAKu!jOXz0 z{}|6f=<_J>LK(1~jLmq17Z;Q9QVW0rFQf1l2z~`ZU)f24k8kg;PP8EjpC3T}#I9Rb>2a8QT9n zFnoUj8GBIpgX#E3{ios|?Vm`-UI_W9jEs*B{KOHkFG$W$8X2F0;b(iu_#D^$`^dn0 z&iD%S2Ud{r^-eOr84qkD7TuY|4h)f#=gCGcjINU~NWH^~o zAj1H5l9{=J%&duI#u8*^N6E}-Au~Rm%*0YMbC;2s2jtHpvtT@#g`h3kho3$IT`73= zK)IgaUDi%!uPJ0=>1LK={byD{aAggdy$i^!3X)mv00rSmYdD1*GM??7N zPBO>L!>>rSHIg}&05Cs!7MX}{o8!U!lvXlNMd8yx*nXJI31z@C;3%1AOvCRW)c{~R z3FRk&W-^4G3C3qG0zflmCa{;xv)X}eWFqQio(=kQDuI1uPF+dnxfuWEdC>H{Eo7cQ z7uZkcv?;(&GU1My7i=W+LI}Qa6`8*Z0#Il=0kZ%wft537fcB!{0GMA4+KWLuGYTvr z^AgZr0=}1k@1>x<6tuqv?XNq@oYjE#pS6z6*{uKs%|XJP4P;(cLgriuxO@wlu!811 zFPZbBWL`M{1!Q0wet>BWes^gqnOF;&S05&G;T|#%*$-JhK%xfWJ@kBDOTT15d z!29>ezaF$VAnnGTWZndRH?KtdFC#K<0i)$e6wAoOdeHm>2>)0>=B+{CAek%IlX)A` zZ&v^)b;klSS2d8i8u_as{LbxU-nEO&HK4r*H1|N*y&K6~J03WIA8lHR-)gD>p!fse z^T0kb*UcmIPX^lmPe;jo5DDv-k@-j^nUA8-1}OB{Vlp3JOJ)*+hSXd`no_`OKLZZcomK<3L!$%HX8Uugjj z;J2GPR*<>10RX|aon*cS2CpwB^9=}j1Bz`2vmGGbf%`Xc|5huRI}-qezrCK!KbHY( z$$Y1g%v~j9!i6*c8YA;v)ZXqOnSaCeJsE(o_xF>z=OCFM>>~3+B6BZjJ3g9D=Ep0^ z{A4$o`{t4PDGGlIO+RZR^K%eDq-2yTXLD55-rECaCqGkE|Wn}4l$-*9=Ww(3^73RjU;R0C`#s{}-)+sNvH z0zDzPtPD6xRxhNLuOzEt8d)%2R&N>TB&!N^)h%Sz#DKkI)vhP2ZUI^K1ITJ10Q3z| zs1Kg|tR<^&M*<(vuAf3y;}o)*f@C#!k~ILr1{MI@$r=R0!4TF0=0jTXV;!I!x|^(F zbIBSGn&F$t8ZnEkkx>Bmqo$J8Y5)*^5_pa#U>#XwP!=wnHP%bk$q4{FI>sSmJPMt% ziL6sm;548e%ub(9)&yvKMkQGj4PYNxlYq(F$U1W=SyOQ^dFS8-&K*G3dB~rJ z`wP~Rb>Vulezl9N8D0SVFIqs>#mJkvk*rH*l67eVfc;-<77ETr#+>nFT?S@zQD82# zyc|TA?}Dq)&g9wk^$sj4J8+DAZro${&p8x zaKWs_$h(fn`duekOO}vz!vL~woQw8finqN9xETWfXF6HSrjm6_3t7vD1Iqv?Bc=c- zxS{|6-3l=MLnE+?tUnUa3P9kkQD82B{FR_x2|+6lkagR50QtACA?ptCTm`H~-klxu z$hvD9S!?icHwxWbLe|>pWZkzBKX2kCYh5K-e`+J^!3AVJw4SW>+sS(PAX$&h0uGb) z=v)BT4Y)owg{;RR^zj2^B{z|^aS>Thw378C%02~wo2HWWbUT0-dS)G2&q7wmvtZh} zk*w!X;Q3CnUf4#~=AC4{2)qPFTNJWh0pY8|$=V7=SYTSOPbBM&X=H83^N!tQy#=8= zr<3*eUb5bSkX{ivc6nI)`1{?+zE`n#q&Yje+L{Y05*{IeG35E!>zzBvVPc3){$*w z{RkW#Pu5Sv$$~Ah{?S4tCl~zkJ4(ndfFQU_b`cm9ZzH<|j7ve(qn+%Y1;9SC%fO)5DzeL` zlU=c%?A{Pqh5YIovTMMj<{;U%C|kFf?0WENfFgaSk=?g}?0z!Yjg@5gpF(!i60(~& zkv(7o*#p6+V-Oe)E+e}oO7;*C4%tukP!J76+AuI0K9lSbK>&qDg88V4WVeFZNnWx? z<2nYdxl6^7gE=iCL zug3oMVX|j$Ap5cfWX~l4beBWH%c0m6pt)iv*}qv#_PhoFGUl%#`^r6JFK9&jUj+@X z-b?mE5G?|e->xP5nz>|OJAmxPU~(Ove~14xUvEi)PtC5aalZ|DUy=DX1cZ2?(4kX^YiR}9d$i9CO z*$+UGKdmGCq48utER+2R(jNu04XtE92BjWHUUC=N8)(h*&-V7NpLAjSFqW!llBOA*q`_%!!8nU+<0IF{* zh_>PS8U(+d0QQsp#s;#tFD84(6tdq0{aZm`57|4B{x$^vc>&q)Y$1CWu77DD`>&N` zzgtH3ZruNEIN9$_1)$9P;PL)0viIQoU-q80WPdP??7z2>{hF#7EO?9##6&XTKlV6#oMPmNIZ13!2BPATFIbg}IReC|U$6?EQP-RYk&XojHHyOl&{IS~7GqvNOV&C*Z1TO*Cao_=n+SsZCbAqR01a zKt@nCM`z0cuO#Pra*AaiL*-9%F|S7~_?~4KqCV1<@)}zWp}px8It#TAajYuN>gw@- zBrKl(o=uYD* zu?X6wnbp=nqa2paPys#B9ncx_gW;;W`BE0E$&&K=wDigAF-=ii#l23Na8j>gmlC+3 za%koJ@fmp;tf1K?*Vf9e=Da?6d3|09`p5Jw8(oIKzGM8s{L0FFZf0bNvyQUcS>y7b zSh=JzQSlS2mJ{{)T%3zLExRi2I?L6!uj{OMZJd&8eqv9v4xZ{yPo#7&MdkgUbVtw0 zE2^!}4>{`B&c!PY$Y%MCLmTs3&Qmpac8}rXhxf>KYwEd$H3er659Ned`59aqI8fqe zxX3Um}|R;IOB<2*Aj!>eW|*yAWLs@0=88fl)^ex4zm_vyp==y+|+ZR<)_ z*UPG9smy1D%}6Moqq&bOd_Q}hDyc6Gfx=Z0x2FhNd$Jk20+g+)55=V*x_!P!V|hiz zwfT7!tX#x?V#XOZ`e+UdYEbw{Nxt75Yeu87C@YIHRf#a>_wfmg6;u_lcFtvwkFls! zI(YObW~;ImWCKW^LvZ8=1ry!#|-;S}W z7&DA)x1pU=P+cIMtr_mov1nP}re-U{X0<%q4(Bih=GP9fS0e$#w)4v~CJq=dF(Ap_ z34_!~W?^2298m|I67O3U>AFv~BvWNsRz^ImgmqbVJGoTKtaOiZhG+;za}cbbc>g>j)ZxiQM}`wyO0uaxx2PyN&U+epRSY)EW)@|reWM(5Kvqp zm%1Z0d|y>eWFUdm9?} zq|@ol6LrpEk?PcFsKQ*-6GpWtzc@8Sj@z9&XUa(%8jThG+KUsqn*UE29M7l}8<_}ALrNi%xr%4#ulb!LD+jnTL zm+RhO4F(c>+o$>$dd>9be9Q=}#be>p;Xn(pG&ldkHq6hDH$%R@7spKkkwSa(owJlxXovebBp^=RjQbyl3xx)f8>x-_Nq(vy93 z=?+=QQK>?_AC%&vC@A$~32{zPs!Og2N~2s3hx6N|Y%!n!ibXP|435_kuDDbYNV7_D z63uZbFL`68R4&W?F;$AQ5>k=)Bu9#+i5pmMisari;}T;h;h0=jzQ(qI%zQOLms% zQ7zr8Oh;eAB+)dXuUVi`I!Ss%BnP%q42+AO?Cqle;`m5f;A*r0roy#W8S0fzJfylhdP8}qQ+ znptsC zO&xB-!C^e$k+1Ukl#-ID6br?}cbVGBPTFj@r!*eU!{~73tNK}rQJ7^7(nE4US0fQ- z8_`HG2M)yrN<19Mb9Hc!Co4np`TVlmtyasP0RD+a_6)B4DkfQ~n%^VgiiG3-u};#- zTnc4*0v^pL8A@(eVZa}^xE&4p+-Dgq;?5~4)h`Hy<4UgE%`znJSKUgr9Psc9jj|KW zc2=r>&Lt|0gfmbT#mC;XNQ22bR!McmVqjk>v!lM+Q!Y6!jK*9+wP1KRCm-H&J@tcWA45}UCVGe zIf%W$o)@EAjWC051Emr%@CnTpl~7R54^?w<)yC!|FJT(6kw zSTVz_buWY+9cmAR^-=>4e-Ax8x>VwD(>Uk5QqN%|hDP^r5}l9w)N?9lOe(R%`P>yU zO7(D>)G5jxCU?h*i?MDlW+kz%{Xegpw;m%5=@n^~4qw;5OI+xzL7-Cjmz2Lu^rVg!BOjC=?^SVd=-=oVVv$a#pS1Jx|lgbHpPLUq>IV|$za7|$3Q9G zF)O5(Iim1UAiG?0S?c3hN=UEmPLW;n|Id_PBUm6g70}fcD;{hj;K8KS=fr>EI~el* zE#uAqLi(R5KNMfyZ)9bsyWval(scTlZutM9LS{sa3L}#GDCV-vD`foFof0wXx>LA3 z{{+euQHuOn*@#h(V#gR9Da~g7?9$Tgu0z?SLmdj{Pkl}~PTkG717-d#<8A*!`kyF2 z@0J9qy(31~p>Bcy>tJ0d%R;msp7?ufG6FRGgQDddjJUn(C3MUfb$&tkDaPGDx zs(Ps8G1WjmblHSJQaIM6PQNH&}}~4^Q1bSs81x@&XaEC^?TT}q@*IR=V6NO?#k)e7<`>sI_(k`IbFLy%MFDiwODMK zm3COf?^3HOHhbM|Zg1-2JTv0+R^^}X^PCpVW0jif^+n9CC%yOwSsjY5EpG4gV#!@< zWf>M2UWBK;n<8d@z;wTy-&@i0qMd_f&na#*kZ(pxoC5jI$DhU5C}F32!2Rqtiln@= z!E}b0+^T1?NXpmI>eCeh&pp4ss78#v+8ye+MwX4CE_mWY4VSFB3T3%a_Ioo63p4(n zQCOJSbtG(j083-+F~U_YFY~yzxIE13GGwnGlqq7_7~;6{L)jl>zihzwHe8zQD&hfN zB>%23bELzpHKVY}VKdUeN0rwPPJaAbQ+~rMrwPH%DN17R1z4}87VpC@lupG0^$uK; z2QQS)ki^U1xI^N{nNp^>a)xwXz=>PC54iofCcm8_efu-P$-l^(c!_kIE1F*D-NfF& z_^qX}@Uoo1P=6*a8OCkN9lB)|kH{FnT#PL+f*!a@Slxug+SyXw*ea)nRLA0~sXKhQ zn?3I5&v2??ri?$oS3cu;w}-K}+r*>W^x)BQx3Ff9>SQ@ds;8yv%a#+LlV@Kh6}r7qDx@mBi}>Jo zW>nlgAJKx(mSDAf!D6W=7Q5D!(hN8DWkDpGHlXkKt_ftaL!#q)sfVb%PO494{Z?8R z5LwqF%JK2iW2M;-;=;vnvxt)8Zjumct%DUGk08!WEU)J*mm1&+J-A%DjAwRzB#MPJ zOEP{fRtk*oy+SJF%$M}vDt*YLx*GA-N~wr>MdUWATr}JwX~~mslYVl0S7RCB?Ba^- zPAl50`iM`t2rucr*=+%M>x&d0dtCK)eRL6O#&eSgf2f;_Se92wu3RJC$A&r4KuWif zSzP2S$ir35tgaj(TjoIrTjyPM>e{^x(y^uZa1Y^1$yv8l-uG=`j&85rkYw&`L z?~%@8Q4bcr)y!!!_i8pw_6B5($$*C~UyJxo##-qUY%ZN7q;=Ab`L!m3zzF}cW`qNr zb*}RS%Z~+cn637CuFWkMkFCSpvVWcQ7mv|B{j_6HRyc25`JNmRW49w{u)?MKT={dH zh5wvzmE;z*6# zlHH?WEJnL!%UzSmJ~bx}-(2i@Qo0s8PkTx#=|JSAZbiI$veR287lwktP~l|-G8X>L zGX7MbTyRd;`D?|u+!*lHbyo{*#%kUb>&$tE{(g|-5$={(KUEW9(H}w6?g+` zp-8lEk_ud@$dTySB*k6X6|q=_SiMQgbj2$BRK!H*Ch1zMhhveQ^)6!hHATf(0Xw6_ z78gD(>2j)>e)BX6r<>`vr+?8*N$i9iE8Qg3VBh$Sr=`4~>-vYMrC8muW*X#l<92jo zM^|}JJa%#{?r|T}cQt#|sg<-IX-=0Mfe!CIBl(8j>~k;dZux7fJuVAPh8DA2p6YAL zG9!`9vW0HnIUe7CY1D_Fk;ba7zBgCJGBRRS^IhJ{MblGKL=-$L*|4h(&q_ryS|Ti_ zJS*i6#EY-$ZqSSZkLg0^Mw`1`ru$ffrfd3U_5|j9Xx{Dez#&an`7_T-iQ;sdEgJ0N zn!DX4G3j(vgM08IH0lQc26L(<1?!Z82;g_O-UccbiB5QQsjeZ0cS`a6RO|g3(WJtr z5zPhlPS+dDWuIp(`mU!g)u746ol-)Q`nr?%KQDbJBeJ~eWh7u8cUt`5sp!sA z)0r)x2zWe6`BkZ(=M-lU8wi%dlKyPT98)T#d;=JL?8IP(awaWj?o!+f*Q=(2ogy~> z7t`6oo4qP#v)#_8XxJgWU$mKRh983OrLejpJrz$5WB9PN@WGI!>OqwJ%7B$UOT2*O-ePy!T+OfQ`rOf*#I|} z3tg_uIlqK^_!XF*3grOPf>}~bipG`9iRV1M`-INR_`(yr zZ`b$eyXe737XG69vQT&Tl~ixi-YIRDyp5ej$`hJvtB=;-Krjy<+fXE+pFP!zzeyx4Nju_JlXL;*v;@l z#=!G%9FVfsUTs+VxX(x0d2+J;eQAo+;fOGBb|5X}M6QwlE_KqRpGCDni805O7y~5? z*ZHyxVJRghP5N21{IgQ#KWT-^y72?)35MnMh!3S~sSrDbA4-ME>p#S3WUIxv`5#F?vdkoV3Ugy`oRLT!>F9Rkq#Q0>`=m-=!N74R4=&-k z3DIw#RO0VBsxD|&wT?e2TU@vghlfZk-X|qp#jtseqUBR55$JA=Cah1H83>8rekw(M zJ%;x{m##XsS}31OMHzT>`~B|fQ>z#1SvgsHZe?yfGgA-iV*jVd*{%IdO8CLfF~{YS zN9_De>g7){^0WWWDcSb9G*|LE<2j6TUgD~2^oaQ63u!h}#pExgNOIPfQk5jR#wOPu zkp3Wdr2DXAjhvHWPO(%#1gE1?W)kyPdbU8c#fb`KV`%(K4%~1|Z`iMI3T7R5>fyFJ zZoX%w$5(LNbxZm8S-~d1W36Vy?ByM4ug~SI17OUSJ0@fKKc(5R8E*fv!S*=2|Nph4oT(S?p+Ddb_mB& zQX2>1f^;+?36+a6_MKx+>A@Zer~k*njbiceA*oW$&B}>#{D!g|%810oXNRN`)gKI_ zfj!(6w@t6e`d-@TbAkg=%A=lQ-w#qjTPWW#(oToQn5=Z-0+=ZPgb6B@;W)ohP*YH< zSPK5wtBUuIN+)N$8-F0Jyu+(>-Ht<0HHhHg+zU*4vhA>RBje|@9b)ni*vvorgOn}1 z9Ale(M2aKUth>&3$>(4vR37=V%iDEpc8?zYdi2P#Gcyab9K)S{->vK%XqoGH+l6B6 z3%-!J`iPV@;J*m}kFQYJBmD}=_m4=sm?WPgo;WHsD#vBi*VKtlw;UFspQOm3Ur4## zr?9hs@rwUd3M}LFpQJZ&KJaWY;2%;y#i{d1`fcjP*B^L8XEZb0S)ZmH&*Lrd5tRI= zCK&&V7Wl}S9dEC6;uhoF_(LG0vg@N?C=CR(A^7QiaJnr=W&Y>)UJ+R)^ zFM3NxZm4{i`09|9|I03uTqf~RE_SxqPFk;=Rlq`x6ianp&e7{dr_Kk+PEQuH!3W7s!;6sy&rF_c@R3X^_K1f~ z{wEw+5tA)mk^H^Ij|RlHM=_Re%;7i_Cf4Wh-eOM6%PYpTshWWR^;N5ahmt3yh7thhPBukUyS@qdR` zs;sj@#u#-1LFE!2VDV3skbmu&!RqQFO|{=}A{}o;Evs_Spy-)SRM#yWhl2Gv(^j>j z>KafW;_*gw(4b1oicXp9EL2uFYZ31;<9I)N+3_)4SQ}xtqGv8I3^c(LVl&cC*MwZ2 z8_@pA>5?6%OWd2wmz{Jh-c}#3t2K`u?nrr2DeawY3yhwBiNG~8_20P(YI0E?f1eKy zqZ%9=g-8w@-1_wV>x517_c#vrs;(ED6(MVc`|Nk8PXBamhNtRg{Z~2pFJXof_Z0D2 zAsi~&=k<8JtGk|X>WK|?B5&f3LNxf0VqPpup5KX!dh!=tcd-XycN)rg%$2Hf(T-b> zt!YIy)j=^A4+_4%QKV`1^>8OCxw4F#5_eAdt}o}K-0{?T;3Uo;E=4_xn`?Lv4*kXR zHM~^D-fM&SriSP7l7`}BMlJtDlDq?j)WG{oUY;D-z{?pQLZ^vK`|tq~?1JPvQ7k8J z=?Mt$lf~$MJnR7%cn0-iX&)XGPc`s>SkjM|a6X-jC;IU^?30Uc`|-+9dOPY} z99ykG@nJYQeKvx#eH%Fr&ciD|tC7zr$f<7bi?eyEyH|c;rfu<1W{6vw72+A@Kpf~) z5rZEn4m9%S9*MeqPqZ@5+18Jsutfi@d|O-094DWMxH6gH1iNgRf}oO zyx1jS-v}8uy0gUkX0GC-Flsqn$u7pqIm#skWu9>kvqgy zB<>u*`!g;+7{E`Lxnit?Rq|&iCk^D8(nK5vLlC0YOhr+#nn36`6;s9665e*)3Wg(0 zkenOsIvUN(i|!tzMK%0|;&JvkG6G#k9jdoIyPaGnM{`43G#1t3JrOJwZw=;qHH(^@ zH4Y+#?vZ%ptswtcGK{XdS`_=;`TrDO%q^>yH#Ohw_-%IE3fwPKY&< zBjMmiT`f+qi;su!UMeOAzb~GjldtDvZpazRt92yh#IkxsBEiajxEE7~^7T@2B54id z4>KG$6fX|vgT#m{y^63$@Ec%M?;62-;<9}NuTHu~a)~9+Xytb?ao#BYUGk2T_)Vr{ z%uiOG$@};_*5XV-HVmZ`;0WQEF4oAYfE1R&_0ECT^mZ_UIv!_X=A5?Ach+=>{^4+V zPsaK%<#e2Qwh!7dSK#yjGaQQnzu4!QVJdSKv#Gk?gMTDD5b)H?E7?7ZY;%EGn2}M4 zi@nIFhMX@nEXsz#jb<WWFx;WoC$OR%tSuFC?&b?#(LXq0))LFL<&p;RRoBmyX(^c#obQ^{J zvRxjpT-cFuy6$7`a-VFEjo)YWxE^xi>{dp5`W)MWpsrovvrWIxTjU&KE5)f-_t1_mqV5Gh2Lan7loa7-=r8ctld*fC1b9zosX>UaD* z{n@SYpU<`NY|ZbQ|;tpswSVqGkDf zXN*X-hSL~z@l%dDk;%Vb$X{e?ztnNVYMe#F>M6NlI^T^$nPZYSU&61F%@Ae6_b8xJ z$1>o|9Tx?2c;2x!CfLYy67T3baVXLkbX{lT6{!E-&&}La5h0~ z?cmGe1_j}o<)Jd2AVoTy8ZvQGI=7tFnl3Sa0q=?9!;{1V3wV}0buQou@yY`JrtD}S z?zoCi!b-U7DjrY9uI2&e%Z2S8j-#>@MddkM5|rXd%ZJVT#1>7xHXh4l7U3 zw&LN1ykF5u=c_i(mvL(157)ST?ix4#>%L(%&e{AP*x3s$;u{#8)RE%BWxP0)UI5h; zd0_q1))pacAz#C*PVgW_<2AgZ^k>g^pfkLxFubstoZb+30?h_$xQGTgPUbZ{6iD>| ze96Qykn67D{Q_C#nVIEvy|S`;O%-2W13x^gSLz8L=j8P4+1Rt^PVx0aJeC}BEq~9= zPD&{##@xVjy>Q|4icynd_5bh;apMgs-z{Ag>tP9&n(XuRY-I2ZDZ zDn08a-g;t{K6(=$hAP22qTZ>O5+U8pi<2cc^SM66@>k!=izOzDS8nA!!|93WZLEVG zbKe_-OoOcvftCDJiCN<8l|1j*WVICm$qdlcis`q)JAY{ex}0X9lgHlM*ol zigM-gg9aD@_pag>N)flPSM!sd1;e?k`GsP~YV`LS@$G6pPIscmuft3F4rx)cScNzST4fk@JYni5a^7W^+=6?QM zJc=^`2u>AZJKQ<3jL8g#(<@T@e9qkK@GTJi9^jTI7>gChViQE}J#Zj?{Qx&T&U10> z5{Fw}@}UR#XRK!-27F(1)X6FPfq4ZnFZg7s=uFyY3&B#<)>lL27yiV@aU(k*q7U+c zlB$Ra52EiZc#v`!XJ>t`o06idR_pD4Z>{ z)oqVrz$G8$hna4`J~}(vsohFAnNL5)%Xns4miYWJp3O6RWeWe}5L5X$uV=amW9MwO zr->zpxVU<`CqtVVEXp=?rC0p!a6C}R_V7DT#uYn^w zhO#DL%&BP^6Gdy4B6%Hv zyX3)5yp+|J!hauxv&Z<#1;TErC5*E|MhK)oE2_g$f%N(=wbhYw#+|^q82b$GSCZDJ zKfBtoNPcW!;2RBjQU8JCkACRp@7gWaKf{X(kLj6O1?mBRiYS`veBtKjr<=slXLv6e zuCYJa>semK*fcSvlMi(}3j=pp40wfS$teY1?d1K$o3C(Nc4UaG=Xiw#&(wI8N2FZ1 zdCwux6>#)VeOCqDv1RcD=hM?8(!dTthado z1-=gF&#vFhv!m%{ixcyWVV>SXNs;C zU%!Fn%8(a%afu_*KutySx?lQOWjKq1bmciKg1C6{HD2h>?fL`uiA42wo-6je$p40O zcTN{@ygBjmOT53H7KyJPI~?)uPwwE=hEsLyp48hpD-gdp?PWMOxyfr^=5v^90#2_j z64EQY;lvu%Qwlpx?<~5o%(}p-W=E9x;dxA7cfG>RR9z>WH`tSw2YplRmRjhi8Xq+( zK7Iw~xR131#~X+quktLO2P@pX+?6XTi*dHPaVuBEqE~s(F$R2BINtx%z0u>+$0!lX z$JomMr;gsYdzppB)-U>ZX0q#5{v%_*5=XZ22Hk0Vgz}ER)WFwx-0QG(-d3Fd8ZS|t z-kNR@<`cKR#xuFomo~n}i}4B{yvB1pxv4c8CEc&{LRONMTFwl>Lir;5;#Z2QTYhl%_jO zZo0puhMM?#2mcH&SAyW3<0t%YuNI1ki#stR<-ElUy~kcf7o*<7(lj?W+Agkp3)9L2 zZ}EKv>B<`Uzj6~Bck=$-Y~tdloxH|jbL@pjyv+?p$@aJTC?-l?3aH|xt%0Cu{|k?} zFSTR3S}8vGGe2L9e214NXTO8CKNjB+bN<55NdayCUXxv zJJ5AqM#gF9o)%?q%G~wX8aN@6djqEUe&_bXAKC~>U0>uR5=}j;J6IJ?5Ov4TokeFH zD>mm)QTi)F`Kf?m>Ko5a=&UD$E9o3&%l8yP9r!rT7mk0!5qsfNu629rCQhGN=W#8b zmQE?Z$-^dlx}Ic>;Zx2#g>90#+b^%gvBSEFb@;>S!;bsXX``Z3f9CE!p4IDrr#0TN6PBm@Y7gakr}_>Qj=Gv#IyW4@q0_>5Y}ITwwO`vZZlCw6wN?9#bktIe^9>kTr*XzS~jT zRAWoj+icFzTWV#-);?*x+wFc)I{3KgEOEHvE6ruR z%D{s}829M?yIU5Ah&+^Sp{N=UDe0KU8C+S~ZY{0lrD?8m*w6xjbaXh;#L5BzMYCms zrS+taNGgiIET9C+{n1z?a%FpcJ*Y^haZ|`hPzhnP3!GyS_88PRaJ4r2f|l)2|M1Q* z`=S;SH>h04rjCNA5?*>O&%GZE)tZHRtj zgG4BlnsQsu3AUP+T5Eia-D(d$ePQ*u>i%c^_Sy<^kZ?CU&|7|g*A$aVTTB|Y`jlT) zl`<8e6v7t_#>2yDwY<|>*|;c@#FjlBb=ZST6-7-|SG#`r@@KuH-NjXpH{bZa_A8Z6zWh+D)Nmqk(ksWk=?Uhyeyr`K-^@!te9!I8 zpYspxd{uROr1xK1lzyuF7pXjz{G5Mj+m&z@X1jW9IeW2r2S23f)+9(%zV(?lN%gp8 z<>%UXYq-jDXiqknSS%0!TkCHftoX z*y+dD|KXOwhCYOmZ!Xznjy#|!&{FbgDh__Qg?u$hD#c)8zCv+9gG&lj@VpixFd`Ia z$_+y&5drCx%sX%=G#!}cL_m7Tx9yE`aC-q3pmrOTX^Mep_+;X+qSO ztTLD#8b#wj*e7P=3w=_Y62%@dc2d-PgZ*JPoPMXCL-6?U-UuW$;kPOlKWE8+=qCe` zu)6H{=dud=_T0fET^*B7fKq^Whe$iym=W$$F z#jdWh*=zxCM6uX|ZfJ#cM`%va#v%c?#TH}Gl*DWns7RSLbmhD3276D*j*^E<_LV$W z@&|db!pa>~d;^^6jF*RKS z*l(9DoWbA_u;b60-@+O264uCzb+*(~Par{tscLUFUJ-*05#e}=SXID?%||3;13B#m zsw+Ff$+THmyM;}2RGuz!5xd`xKVSY_3tJ6`3}f;5DKrfhu<1^S<0RSBvWV#;Z?-@m z+cEgP=%;W|ARdRth7q#B_%Wh9CI4z+k?_-gT#m;dPT+vh(q;4|7YDGEm6bc8;E8`= z-hfg4qm3n)wHKk>8%wsATp%rO21U&CE}NX}W^TE?)e@E$dmS!$vYSoh4mi5l<-=}v zvcFLKNaQo4U6JxggY5M=Y7v-Wu7mp^?gk9a>x`0x@&*eF`*Xzxgo_R6kQWJ7S9U=n z%WKEg@@z6$JaHh_x+aN#IMgH$lYbGcyj&T>>&I19jjQK}44y>HJNB9P=Vi0b%H;_j z_E5Po-@tR)DU`V|vml}&OrLhR@LFuEluNv<6#`#XVs)bG$)I~RY1eTu^y~5_FRKR6 z&+qfHsVYO97gUJ>R%4+kWket5@{w&DO22$^#j8s!^;ETdCwBqA~8lR?&!|2)VZ zRm`V<9%kc*o>n4kiK@Czlgndl8oY|-tufXFAETFItT!Ksvon-v0d9c!CUJ-^pbP}V z?YXvgxjVrseH85Ja2Ro(QAG_3=*`|qupXIA1tR(GB%7vWqJ}*iuvJYdDR>WhTv54%Z5wk!EYWQS4rtU~!sJveYPRt6W{pQqrAa zhl#O`i9};Uo|<7B;nr@G(bZKmx%5FO~%=<P8n=;o19n0+KVm!ZWUW!X!*xg%&&PzwtP*=cjUZMwvgJ*<)L+~!gD}tWgS~! zHWXf1e;(G*&+9;ECHYBX*vYJb{PkPqw=f;WU?+nYIR!pd3b$%RLbdk-ks_yeg!K+R zXS%8=&yc6-_p&Q9&bg5K^UTQ_9i=?^_p#@fb+EIUuc@ir=~RA3u{hsL@=`}5?#ScL zxz5bW?1ZxO$IjQzVg$F*)Rf=b#3m}*F(v&{ZDH-);Fq$ig&o4pFoN4!*gRnv5aROl z7SZQl;9XYS_`M1~aY)H=C07j&6{&6@Pqrfj#uk)-=or%< zrcHx61BiHGN5+&MIh;C{A9$0}9v=G(NT7yBvl0*n;GuXVh2DX4qFqObUM6P2i90}R zqa~JcctSX-h&q=FSQM5zVio3Xus*R!Dj95^8B98yPJ}V0TT`jlZaSpWK?)_Xm&duk z%xxp`tk4Zv!&e7jlXB&H!xrTU#j1s)5IIOrkWTqr3(NLb!l3WctD-vzQldjsVimDt z3MHfX`@@K;foUUDmej4Ni%pc#3%Em#*VG_%u4o3{U+BA2O3sAwB@~7w%G`V!N?hU> zZE&Z6WYI!)cj`Z5>W8`*i5s%?F6NYD)P19R86lL^%Q1)3fi4XufvO9d_1u4h@038(nAoAP z#&lMOJWVtp&Cv>k5yBq}9*xc4(yM{$n4)!1hwhA4C5DD-;Wj_7?~Ao1!`oauR7-$T z`NP`Sd#XI?7_4z?#Wa%YEl;~Gj2Jo3y~&d z?#bWU#ja!KEuM*((aR^W!^~19AR^SbWo#e&nc`Scaw3h6zZsrR^3m}q(l?Pcn*D18 z=?sd8hEK_$NN5-+3zD&J2+g5@JbEJQZ6s3g*nD=o&jvh93t#9<`S53)dvFmy8Ru&) zd;|S1_fKT4W#Be8f54BU#hc2eyu-ft;Vy9AeBC4#Q&rnF`Ds(wQJMo43kCgV z%N9ofWCjJDRo{+__+>jb7{Y@m^4;^;Gm5-$9Ig=?hj}9br==C5NGb$ByAl~# z&0bt%S|Q%V<^wSCVEnBx@=d|4C%Pg_jS~F1tG&8u)uC<*~a|{ZLJrr0kfaXagT2HrHi! z+#ZX0g6X9 zXfKv&)F0N#V*UFKfj5X2n8sFW0YyWRyjExd0UAPdBf-e5c}1Zu*ExNPKj!mY0607R z^#UdcCm*;%ABJ4hEr23)16JXqAYdJxUez)cF=0N7ec&UVPgizM=lXU2sNY{7^=F)Z zI&-G!2;9Sn*SpLX@jgX(3{QC@ww9-;Jx^^H%a)1!pH{O9MLASD*0Ke1_y6Agc9P^$v$XcB~w`iKUzdjDXo963RBQ zRW>JfJ<4Rb13~@0iOq1pu=*_cA^(j%>5;KRSVw;DA#AR$R<_BTj%1TFd^;h5T;#?- z3`_;$B=C1e@oOw5#TGW7(|23`;4LhNu!imVvyNsbsE7xikVIsC;5fEOg|F}C{AnTXkYB-p z(AQxsQt+XK3v0nswGP3N#KWuyG*IjpnZ z+$_Eewnlfhqm{GJ*P|Mv4-R7WxvW*5buQ}*D0>FqZ?U)wqxau)SvEi6Ja)ArufBl! z_~6K|J#eV=80z(EVSpzT2G~&Pg*sY>4X{goc_H)p%`G31_=p{4c46Tr#YWwj)|*Tn;FcOVX^w*7>wh67Gl(#x;QD!J{w-^;J4MfO}Voo_9g*?9CI}A+3Fn5fwurNGVr_5e<2{FI*ZMZ zQ(5$A3Q@Q@{Ux^25jpvGaN+cuL3F}#=CNEzU;+6VT*#cqQE?fo$zy_K=S0M-huG3(4O z-exX5M3)z6(-Thn=gZ_RZc#88LNWkAeUCMdEM?{Q*wadUQn7c6!%5b+;r#yf&k$SKu$xuL+~;hkv zNC-ygKv7m9$F?X0&M{EOO)Xg@Kf02|;1gom$(q$3Rd(-WQ7t_-ESK$MU24!Tuh_{d z2_va_d~-6{Tp}Oa$v)!~Ky(Y_Ly}cTX-f*F3%u_j)fnn=l4~H%$S);p3<7Bwe_ue0 z@*Msze8}-vv4#L*jPT>iq02bSpL!Mhx8gQ=!B9_~bqzarL{CZUeXJ(mcP;x^;oYPd zk?q&BM!UJANGh1N4D2}3p>OPMKPHan&Igx zcih4{owTBYXpb~LW{~E-pZn5bYjfPlaNlWhIC4!-d!>q`?jL0GN>0N z)fTybDT~QVzH(>!_qqa3XTTXIXknbK1!fjLV7{e~!nfxMU#@^>_nRV=9ihxAO*Vw9 zxLno~=+YcqTku!4KR{lh18%LlqIPn8e%JNmb%His$B(`DPgTpv5LZ>tSOJZV&xExjSuPib5vy~m#>FmD^ zAWsg%#shAJZAy!D-oe_0xtz-Bcd%OBTtV$}+a1`(eg6(NMK)wri~PqOY`LZM8SK)4 z^^{+BCwoebnc~=3vPTZCm{jPn_1Y=xp7RF!1Elys$N{8GxE0YT(&Q(#?T9rToE(f@ zIU?QGjrE#@&whYNz%CLCm4>)*a2s&Koy_L8!F74a?fTo6`vkVraC6f)`odu!>@N9# z>|!5%vpi_XrJmg^O0Z_NyIFS_>gC#R_OvDiM@!rjQSgX=2Z`{LrN-KOeyt)h$g-EUM@C7d#Z66EUUr>7AP?WmyhXVl+nLV9 zx9w!|FYRTM6xGjU;vp;}v!NX}Sm~;VSdIMaU4EZj9n+oi`wy}4Di6x!QI4?u_d{$E zTw6`?k>nave4I-NyrU)N!By~-hgkxePkD1(uab{EjF?K8&}c=B$qyf9F4_8LYrAhq zlpeV%E_?)#oKQjJ&w7OYM5!V#@5aHsP*GGa3ag}VB~4<7BG*2~YD0y|wrG(dE4ddf z0$$_5GxFxgSeeh9@rY}9)D)5szV*^$SV{i-7<(pUHt<#CJfRSmNuZ6xX!G#d<1kdb z{W-kM?wQ20;iV)yy6go}a@kT-g#58w_n@;nvJtXki)Pta5FM4tg~dg#o6MTZNA@5& z_G})-PTI`vo%ahkynVc$)yD>T$A%5m9G`RG*Cyw?FmQGaRyaIK4dt@|w1{z7*xLFW)uxcmMrlE7O;}!9 zC{1JK!^Sc~*s(1o`Ja7+X%))E;=!&XW=^XZs zP;05)AMw`uDjZR_=F3#omi5eY=uHUi_7O|(?((@7vF&?l-<$viK00)>n{asvhg}5U>=Xb0{;Rj(E-F!e9kG;rd zjV`0=C0rX>hP?PC*5rH=ctJ^c6|I1z)FG>$VM)oK!93Mp25;H&2x7OBXIk}@_m#qD z!DX!r*F@sFV_r{LZB@pnxucE>U#&N~iC1JCAq)Y>Pyi_^69I}}tJN=}x?+uv509In ztYfUT6@Wavr3EH+(b@`J2fd{QAURQa7v74+;5@vy?g3!^&}A!bH*Ya-Hz;;kN5j6p zW<<;3zyLC;kZYZYg~-0l%0_p=+LzgcQC*OK;AKeu$}G9{eb$V`MHJFcCO9Des1QA{ z8g{AQQ9WWG1PLz(nvT{!$6ija?1_oN*qAs7$6$_SyoFR(f4&@ymvHNK_mX98eou9Dr zqeo-OCkL{L+dp9|l*(>{Ny9Ow*YtJ4l47hgT7YA`nZgGE3Og(2vc5B!69?NRQx zrvpQyF&Gp!Y%FH@4lG}8`;^T<+>|*ov%MC=?ffo=MlXy^zUrTB4Dqpr7|_wYaOc0k zI7jiqzy0d~l9PR(v7czncbc5{Cz!5$pR?0z`Y2~jVI?KkkrvZqpd5~>hR{2b1eXqP z@VtLBj|;v)#|^bP4+=a=(Uu^m8i;PXY$^q)anFCC1qN}o$1CMU|6#L?aP_{*_R7QN zgfrpd5_=gf3WiQ}Sz%Rx)pm(9EEj$W@J)B>MR~=SY<3un0@+1(QqSxhJS)ln>r1v= zO_URiN6A`n51?`yxFZE71v|Rj{1r>Uz>9U(jQ~z8vRFn9vXk;F*3{yFm$b7qnMpZW zz*+5%VEwT>4n{yjc|}2Gs!Z{^ zgYL8~qA7OncBwW|V`B=38>!VRq8`7`9lvru&#EOQ_aD!@%sFr{?24Pec@Cr`fLyx1 zVIm~u29?%eL22Kt z+-}Gy^?t}GQR^@nC6HKippas7laP|+Vx*9=0Oi>P*-Q1M6A3-3hBoCkTN}NB;Ac(a zo*}}ZCuhPPd=>nBM$gC<0N)%vBcEY>_NYYw4tKo1FgTwn|0r={A5eyE$0pFPkr|6Z zqsf81(2s#o4!cj&#S8xD|L^0coOvYtO`U&nIbksab_1M@siDTfX?^_b$Ls)E@>|AC zdHV@RIP7@BVzE3={phq_KbHh=Is{Fba?$^rP-&9(lgg{;J#xT0$ml)!{3@*s>elr0 ztRe*oy90m=hKy}U*oMerNZUf`lAhIwOdXJ?JkKgqQ9HbmSwxRP4H>n@t(x8DwhKMN zK`+X$<*y}=DYwCGkX0reJmj)kk#>j+uGwNaX9PGl314K4FAAR>IC(i%LL(Fx{~eT)fYS6l!`Mm?m@G{1~NOKI-OcRV6FSJp5cR zBzcF2|D`l&fId#3R0f9eg{E=Gh^qg{%O{Sg`sZHWIIQZj-pBjW1RZIXQnYU$P)bPN z?&D)a$U;X6B#~ltnLB8=DJ@G5S<+&apZRztD{E?+EVF*z5wRNcVw{;|p#rsn+5;XN z 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

ENP{-`hO|kuUBb{eqKJ$YHh+# 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 Hto8o`$w&0k diff --git a/RevitLookup.UI/Hardware/HardwareAcceleration.cs b/RevitLookup.UI/Hardware/HardwareAcceleration.cs new file mode 100644 index 000000000..979813848 --- /dev/null +++ b/RevitLookup.UI/Hardware/HardwareAcceleration.cs @@ -0,0 +1,24 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows.Media; + +namespace RevitLookup.UI.Hardware; + +///

+/// Set of tools for hardware acceleration. +/// +public static class HardwareAcceleration +{ + /// + /// Determines whether the provided rendering tier is supported. + /// + /// Hardware acceleration rendering tier to check. + /// if tier is supported. + public static bool IsSupported(RenderingTier tier) + { + return RenderCapability.Tier >> 16 >= (int)tier; + } +} diff --git a/RevitLookup.UI/Hardware/RenderingTier.cs b/RevitLookup.UI/Hardware/RenderingTier.cs new file mode 100644 index 000000000..82b1374c1 --- /dev/null +++ b/RevitLookup.UI/Hardware/RenderingTier.cs @@ -0,0 +1,33 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Hardware; + +/// +/// An value whose high-order word corresponds to the rendering tier for the current thread. +/// Starting in the .NET Framework 4, rendering tier 1 has been redefined to only include graphics hardware that supports DirectX 9.0 or greater. Graphics hardware that supports DirectX 7 or 8 is now defined as rendering tier 0. +/// +public enum RenderingTier +{ + /// + /// No graphics hardware acceleration is available for the application on the device. + /// All graphics features use software acceleration. The DirectX version level is less than version 9.0. + /// + NoAcceleration = 0x0, + + /// + /// Most of the graphics features of WPF will use hardware acceleration + /// if the necessary system resources are available and have not been exhausted. + /// This corresponds to a DirectX version that is greater than or equal to 9.0. + /// + PartialAcceleration = 0x1, + + /// + /// Most of the graphics features of WPF will use hardware acceleration provided the + /// necessary system resources have not been exhausted. + /// This corresponds to a DirectX version that is greater than or equal to 9.0. + /// + FullAcceleration = 0x2 +} diff --git a/RevitLookup.UI/Interop/Dwmapi.cs b/RevitLookup.UI/Interop/Dwmapi.cs index 85ff89ba5..e51d7a3d7 100644 --- a/RevitLookup.UI/Interop/Dwmapi.cs +++ b/RevitLookup.UI/Interop/Dwmapi.cs @@ -1,19 +1,129 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// Copyright (C) Leszek Pomianowski. // All Rights Reserved. +// NOTE +// I split unmanaged code stuff into the NativeMethods library. +// If you have suggestions for the code below, please submit your changes there. +// https://github.com/lepoco/nativemethods + +using System; using System.Runtime.InteropServices; namespace RevitLookup.UI.Interop; +// Windows Kits\10\Include\10.0.22000.0\um\dwmapi.h + /// -/// Used by Desktop Window Manager (DWM) +/// Desktop Window Manager (DWM). /// +// ReSharper disable IdentifierTypo +// ReSharper disable InconsistentNaming internal static class Dwmapi { /// - /// Flags used by the DwmSetWindowAttribute function to specify the rounded corner preference for a window. + /// Cloaked flags describing why a window is cloaked. + /// + public enum DWM_CLOAKED + { + DWM_CLOAKED_APP = 0x00000001, + DWM_CLOAKED_SHELL = 0x00000002, + DWM_CLOAKED_INHERITED = 0x00000004 + } + + /// + /// GT_* + /// + public enum GESTURE_TYPE + { + GT_PEN_TAP = 0, + GT_PEN_DOUBLETAP = 1, + GT_PEN_RIGHTTAP = 2, + GT_PEN_PRESSANDHOLD = 3, + GT_PEN_PRESSANDHOLDABORT = 4, + GT_TOUCH_TAP = 5, + GT_TOUCH_DOUBLETAP = 6, + GT_TOUCH_RIGHTTAP = 7, + GT_TOUCH_PRESSANDHOLD = 8, + GT_TOUCH_PRESSANDHOLDABORT = 9, + GT_TOUCH_PRESSANDTAP = 10, + } + + /// + /// DWMTWR_* Tab window requirements. + /// + public enum DWM_TAB_WINDOW_REQUIREMENTS + { + /// + /// This result means the window meets all requirements requested. + /// + DWMTWR_NONE = 0x0000, + + /// + /// In some configurations, admin/user setting or mode of the system means that windows won't be tabbed + /// This requirement says that the system/mode must implement tabbing and if it does not + /// nothing can be done to change this. + /// + DWMTWR_IMPLEMENTED_BY_SYSTEM = 0x0001, + + /// + /// The window has an owner or parent so is ineligible for tabbing. + /// + DWMTWR_WINDOW_RELATIONSHIP = 0x0002, + + /// + /// The window has styles that make it ineligible for tabbing. + /// To be eligible windows must: + /// Have the WS_OVERLAPPEDWINDOW (WS_CAPTION, WS_THICKFRAME, etc.) styles set. + /// Not have WS_POPUP, WS_CHILD or WS_DLGFRAME set. + /// Not have WS_EX_TOPMOST or WS_EX_TOOLWINDOW set. + /// + DWMTWR_WINDOW_STYLES = 0x0004, + + // The window has a region (set using SetWindowRgn) making it ineligible. + DWMTWR_WINDOW_REGION = 0x0008, + + /// + /// The window is ineligible due to its Dwm configuration. + /// It must not extended its client area into the title bar using DwmExtendFrameIntoClientArea + /// It must not have DWMWA_NCRENDERING_POLICY set to DWMNCRP_ENABLED + /// + DWMTWR_WINDOW_DWM_ATTRIBUTES = 0x0010, + + /// + /// The window is ineligible due to it's margins, most likely due to custom handling in WM_NCCALCSIZE. + /// The window must use the default window margins for the non-client area. + /// + DWMTWR_WINDOW_MARGINS = 0x0020, + + /// + /// The window has been explicitly opted out by setting DWMWA_TABBING_ENABLED to FALSE. + /// + DWMTWR_TABBING_ENABLED = 0x0040, + + /// + /// The user has configured this application to not participate in tabbing. + /// + DWMTWR_USER_POLICY = 0x0080, + + /// + /// The group policy has configured this application to not participate in tabbing. + /// + DWMTWR_GROUP_POLICY = 0x0100, + + /// + /// This is set if app compat has blocked tabs for this window. Can be overridden per window by setting + /// DWMWA_TABBING_ENABLED to TRUE. That does not override any other tabbing requirements. + /// + DWMTWR_APP_COMPAT = 0x0200 + } + + /// + /// Flags used by the DwmSetWindowAttribute function to specify the rounded corner preference for a window. /// [Flags] public enum DWM_WINDOW_CORNER_PREFERENCE @@ -25,201 +135,498 @@ public enum DWM_WINDOW_CORNER_PREFERENCE } /// - /// Collection of backdrop types. + /// Backdrop types. /// [Flags] public enum DWMSBT : uint { /// - /// Automatically selects backdrop effect. + /// Automatically selects backdrop effect. /// DWMSBT_AUTO = 0, /// - /// Turns off the backdrop effect. + /// Turns off the backdrop effect. /// DWMSBT_DISABLE = 1, /// - /// Sets Mica effect with generated wallpaper tint. + /// Sets Mica effect with generated wallpaper tint. /// DWMSBT_MAINWINDOW = 2, /// - /// Sets acrlic effect. + /// Sets acrlic effect. /// DWMSBT_TRANSIENTWINDOW = 3, /// - /// Sets blurred wallpaper effect, like Mica without tint. + /// Sets blurred wallpaper effect, like Mica without tint. /// DWMSBT_TABBEDWINDOW = 4 } /// - /// DWMWINDOWATTRIBUTE enumeration. (dwmapi.h) - /// - /// - /// + /// Non-client rendering policy attribute values + /// + public enum DWMNCRENDERINGPOLICY + { + /// + /// Enable/disable non-client rendering based on window style + /// + DWMNCRP_USEWINDOWSTYLE, + + /// + /// Disabled non-client rendering; window style is ignored + /// + DWMNCRP_DISABLED, + + /// + /// Enabled non-client rendering; window style is ignored + /// + DWMNCRP_ENABLED, + + /// + /// Sentinel value. + /// + DWMNCRP_LAST + } + + /// + /// Values designating how Flip3D treats a given window. + /// + public enum DWMFLIP3DWINDOWPOLICY + { + /// + /// Hide or include the window in Flip3D based on window style and visibility. + /// + DWMFLIP3D_DEFAULT, + + /// + /// Display the window under Flip3D and disabled. + /// + DWMFLIP3D_EXCLUDEBELOW, + + /// + /// Display the window above Flip3D and enabled. + /// + DWMFLIP3D_EXCLUDEABOVE, + + /// + /// Sentinel value. + /// + DWMFLIP3D_LAST + } + + /// + /// Options used by the DwmGetWindowAttribute and DwmSetWindowAttribute functions. + /// /// [Flags] - public enum DWMWINDOWATTRIBUTE : uint + public enum DWMWINDOWATTRIBUTE { /// - /// Enables content rendered in the non-client area to be visible on the frame drawn by DWM. + /// Is non-client rendering enabled/disabled + /// + DWMWA_NCRENDERING_ENABLED = 1, + + /// + /// DWMNCRENDERINGPOLICY - Non-client rendering policy + /// + DWMWA_NCRENDERING_POLICY = 2, + + /// + /// Potentially enable/forcibly disable transitions + /// + DWMWA_TRANSITIONS_FORCEDISABLED = 3, + + /// + /// Enables content rendered in the non-client area to be visible on the frame drawn by DWM. /// DWMWA_ALLOW_NCPAINT = 4, /// - /// Retrieves the bounds of the caption button area in the window-relative space. + /// Retrieves the bounds of the caption button area in the window-relative space. /// DWMWA_CAPTION_BUTTON_BOUNDS = 5, /// - /// Forces the window to display an iconic thumbnail or peek representation (a static bitmap), even if a live or snapshot representation of the window is available. + /// Is non-client content RTL mirrored + /// + DWMWA_NONCLIENT_RTL_LAYOUT = 6, + + /// + /// Forces the window to display an iconic thumbnail or peek representation (a static bitmap), even if a live or snapshot representation of the window is available. /// DWMWA_FORCE_ICONIC_REPRESENTATION = 7, /// - /// Cloaks the window such that it is not visible to the user. + /// Designates how Flip3D will treat the window. + /// + DWMWA_FLIP3D_POLICY = 8, + + /// + /// Gets the extended frame bounds rectangle in screen space + /// + DWMWA_EXTENDED_FRAME_BOUNDS = 9, + + /// + /// Indicates an available bitmap when there is no better thumbnail representation. + /// + DWMWA_HAS_ICONIC_BITMAP = 10, + + /// + /// Don't invoke Peek on the window. + /// + DWMWA_DISALLOW_PEEK = 11, + + /// + /// LivePreview exclusion information + /// + DWMWA_EXCLUDED_FROM_PEEK = 12, + + /// + /// Cloaks the window such that it is not visible to the user. /// DWMWA_CLOAK = 13, /// - /// If the window is cloaked, provides one of the following values explaining why. + /// If the window is cloaked, provides one of the following values explaining why. /// DWMWA_CLOAKED = 14, /// - /// Freeze the window's thumbnail image with its current visuals. Do no further live updates on the thumbnail image to match the window's contents. + /// Freeze the window's thumbnail image with its current visuals. Do no further live updates on the thumbnail image to match the window's contents. /// DWMWA_FREEZE_REPRESENTATION = 15, /// - /// Allows a window to either use the accent color, or dark, according to the user Color Mode preferences. + /// BOOL, Updates the window only when desktop composition runs for other reasons + /// + DWMWA_PASSIVE_UPDATE_MODE = 16, + + /// + /// BOOL, Allows the use of host backdrop brushes for the window. + /// + DWMWA_USE_HOSTBACKDROPBRUSH = 17, + + /// + /// Allows a window to either use the accent color, or dark, according to the user Color Mode preferences. /// DMWA_USE_IMMERSIVE_DARK_MODE_OLD = 19, /// - /// Allows a window to either use the accent color, or dark, according to the user Color Mode preferences. + /// Allows a window to either use the accent color, or dark, according to the user Color Mode preferences. /// DWMWA_USE_IMMERSIVE_DARK_MODE = 20, /// - /// Controls the policy that rounds top-level window corners. - /// Windows 11 and above. + /// Controls the policy that rounds top-level window corners. + /// Windows 11 and above. /// DWMWA_WINDOW_CORNER_PREFERENCE = 33, /// - /// The color of the thin border around a top-level window. + /// The color of the thin border around a top-level window. /// DWMWA_BORDER_COLOR = 34, /// - /// The color of the caption. - /// Windows 11 and above. + /// The color of the caption. + /// Windows 11 and above. /// DWMWA_CAPTION_COLOR = 35, /// - /// The color of the caption text. - /// Windows 11 and above. + /// The color of the caption text. + /// Windows 11 and above. /// DWMWA_TEXT_COLOR = 36, /// - /// Width of the visible border around a thick frame window. - /// Windows 11 and above. + /// Width of the visible border around a thick frame window. + /// Windows 11 and above. /// DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37, /// - /// Allows to enter a value from 0 to 4 deciding on the imposed backdrop effect. + /// Allows to enter a value from 0 to 4 deciding on the imposed backdrop effect. /// DWMWA_SYSTEMBACKDROP_TYPE = 38, /// - /// Indicates whether the window should use the Mica effect. - /// Windows 11 and above. + /// Indicates whether the window should use the Mica effect. + /// Windows 11 and above. /// DWMWA_MICA_EFFECT = 1029 } /// - /// Abstraction of pointer to an object containing the attribute value to set. The type of the value set depends on the value of the dwAttribute parameter. - /// The DWMWINDOWATTRIBUTE enumeration topic indicates, in the row for each flag, what type of value you should pass a pointer to in the pvAttribute parameter. + /// Represents the current DWM color accent settings. /// - public enum PvAttribute + [StructLayout(LayoutKind.Sequential)] + public struct DWMCOLORIZATIONPARAMS { /// - /// Object containing the attribute value to set in dwmapi.h. + /// ColorizationColor /// - Disable = 0x00, + public uint clrColor; /// - /// Object containing the attribute value to set in dwmapi.h. + /// ColorizationAfterglow. /// - Enable = 0x01 - } + public uint clrAfterGlow; - /// - /// Sets the value of Desktop Window Manager (DWM) non-client rendering attributes for a window. - /// - /// The handle to the window for which the attribute value is to be set. - /// A flag describing which value to set, specified as a value of the DWMWINDOWATTRIBUTE enumeration. - /// A pointer to an object containing the attribute value to set. - /// The size, in bytes, of the attribute value being set via the pvAttribute parameter. - /// If the function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. - [DllImport(Libraries.Dwmapi)] - public static extern int DwmSetWindowAttribute(IntPtr hWnd, DWMWINDOWATTRIBUTE dwAttribute, ref int pvAttribute, - int cbAttribute); + /// + /// ColorizationColorBalance. + /// + public uint nIntensity; - /// - /// The feature is not included in the Microsoft documentation. Reads Desktop Window Manager (DWM) color information. - /// - /// A pointer to a reference value that will hold the color information. - [DllImport(Libraries.Dwmapi, EntryPoint = "#127", PreserveSig = false, CharSet = CharSet.Unicode)] - public static extern void DwmGetColorizationParameters(out DWMCOLORIZATIONPARAMS dwParameters); + /// + /// ColorizationAfterglowBalance. + /// + public uint clrAfterGlowBalance; + + /// + /// ColorizationBlurBalance. + /// + public uint clrBlurBalance; + + /// + /// ColorizationGlassReflectionIntensity. + /// + public uint clrGlassReflectionIntensity; + + /// + /// ColorizationOpaqueBlend. + /// + public bool fOpaque; + } /// - /// Represents the current DWM color accent settings. + /// Defines a data type used by the Desktop Window Manager (DWM) APIs. It represents a generic ratio and is used for different purposes and units even within a single API. /// - public struct DWMCOLORIZATIONPARAMS + [StructLayout(LayoutKind.Sequential)] + public struct UNSIGNED_RATIO { /// - /// ColorizationColor + /// The ratio numerator. /// - public uint clrColor; + public uint uiNumerator; /// - /// ColorizationAfterglow. + /// The ratio denominator. /// - public uint clrAfterGlow; + public uint uiDenominator; + } + + /// + /// Specifies the input operations for which visual feedback should be provided. This enumeration is used by the DwmShowContact function. + /// + public enum DWM_SHOWCONTACT + { + DWMSC_DOWN, + DWMSC_UP, + DWMSC_DRAG, + DWMSC_HOLD, + DWMSC_PENBARREL, + DWMSC_NONE, + DWMSC_ALL + } + /// + /// Flags used by the DwmSetPresentParameters function to specify the frame sampling type. + /// + public enum DWM_SOURCE_FRAME_SAMPLING + { /// - /// ColorizationColorBalance. + /// Use the first source frame that includes the first refresh of the output frame /// - public uint nIntensity; + DWM_SOURCE_FRAME_SAMPLING_POINT, /// - /// ColorizationAfterglowBalance. + /// Use the source frame that includes the most refreshes of out the output frame + /// in case of multiple source frames with the same coverage the last will be used /// - public uint clrAfterGlowBalance; + DWM_SOURCE_FRAME_SAMPLING_COVERAGE, /// - /// ColorizationBlurBalance. + /// Sentinel value. /// - public uint clrBlurBalance; + DWM_SOURCE_FRAME_SAMPLING_LAST + } + + /// + /// Specifies Desktop Window Manager (DWM) composition timing information. Used by the function. + /// + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct DWM_TIMING_INFO + { + public int cbSize; + public UNSIGNED_RATIO rateRefresh; + public ulong qpcRefreshPeriod; + public UNSIGNED_RATIO rateCompose; + public ulong qpcVBlank; + public ulong cRefresh; + public uint cDXRefresh; + public ulong qpcCompose; + public ulong cFrame; + public uint cDXPresent; + public ulong cRefreshFrame; + public ulong cFrameSubmitted; + public uint cDXPresentSubmitted; + public ulong cFrameConfirmed; + public uint cDXPresentConfirmed; + public ulong cRefreshConfirmed; + public uint cDXRefreshConfirmed; + public ulong cFramesLate; + public uint cFramesOutstanding; + public ulong cFrameDisplayed; + public ulong qpcFrameDisplayed; + public ulong cRefreshFrameDisplayed; + public ulong cFrameComplete; + public ulong qpcFrameComplete; + public ulong cFramePending; + public ulong qpcFramePending; + public ulong cFramesDisplayed; + public ulong cFramesComplete; + public ulong cFramesPending; + public ulong cFramesAvailable; + public ulong cFramesDropped; + public ulong cFramesMissed; + public ulong cRefreshNextDisplayed; + public ulong cRefreshNextPresented; + public ulong cRefreshesDisplayed; + public ulong cRefreshesPresented; + public ulong cRefreshStarted; + public ulong cPixelsReceived; + public ulong cPixelsDrawn; + public ulong cBuffersEmpty; + } + /// + /// SIT flags. + /// + public enum DWM_SIT + { /// - /// ColorizationGlassReflectionIntensity. + /// None. /// - public uint clrGlassReflectionIntensity; + NONE, /// - /// ColorizationOpaqueBlend. + /// Displays a frame around the provided bitmap. /// - public bool fOpaque; + DISPLAYFRAME = 1, } -} \ No newline at end of file + + /// + /// Obtains a value that indicates whether Desktop Window Manager (DWM) composition is enabled. + /// + /// A pointer to a value that, when this function returns successfully, receives TRUE if DWM composition is enabled; otherwise, FALSE. + /// If this function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + [DllImport(Libraries.Dwmapi, BestFitMapping = false)] + public static extern int DwmIsCompositionEnabled([Out] out int pfEnabled); + + /// + /// Extends the window frame into the client area. + /// + /// The handle to the window in which the frame will be extended into the client area. + /// A pointer to a MARGINS structure that describes the margins to use when extending the frame into the client area. + [DllImport(Libraries.Dwmapi, PreserveSig = false)] + public static extern void DwmExtendFrameIntoClientArea([In] IntPtr hWnd, [In] ref UxTheme.MARGINS pMarInset); + + /// + /// Retrieves the current composition timing information for a specified window. + /// + /// The handle to the window for which the composition timing information should be retrieved. + /// A pointer to a structure that, when this function returns successfully, receives the current composition timing information for the window. + [DllImport(Libraries.Dwmapi)] + public static extern void DwmGetCompositionTimingInfo([In] IntPtr hWnd, [In] ref DWM_TIMING_INFO pTimingInfo); + + /// + /// Called by an application to indicate that all previously provided iconic bitmaps from a window, both thumbnails and peek representations, should be refreshed. + /// + /// A handle to the window or tab whose bitmaps are being invalidated through this call. This window must belong to the calling process. + [DllImport(Libraries.Dwmapi, PreserveSig = false)] + public static extern void DwmInvalidateIconicBitmaps([In] IntPtr hWnd); + + /// + /// Sets a static, iconic bitmap on a window or tab to use as a thumbnail representation. The taskbar can use this bitmap as a thumbnail switch target for the window or tab. + /// + /// A handle to the window or tab. This window must belong to the calling process. + /// A handle to the bitmap to represent the window that hwnd specifies. + /// The display options for the thumbnail. + [DllImport(Libraries.Dwmapi, PreserveSig = false)] + public static extern void DwmSetIconicThumbnail([In] IntPtr hWnd, [In] IntPtr hbmp, [In] DWM_SIT dwSITFlags); + + /// + /// Sets a static, iconic bitmap to display a live preview (also known as a Peek preview) of a window or tab. The taskbar can use this bitmap to show a full-sized preview of a window or tab. + /// + /// A handle to the window. This window must belong to the calling process. + /// A handle to the bitmap to represent the window that hwnd specifies. + /// The offset of a tab window's client region (the content area inside the client window frame) from the host window's frame. This offset enables the tab window's contents to be drawn correctly in a live preview when it is drawn without its frame. + /// The display options for the live preview. + [DllImport(Libraries.Dwmapi, PreserveSig = false)] + public static extern int DwmSetIconicLivePreviewBitmap([In] IntPtr hWnd, [In] IntPtr hbmp, + [In, Optional] WinDef.POINT pptClient, [In] DWM_SIT dwSITFlags); + + /// + /// Sets the value of Desktop Window Manager (DWM) non-client rendering attributes for a window. + /// + /// The handle to the window for which the attribute value is to be set. + /// A flag describing which value to set, specified as a value of the DWMWINDOWATTRIBUTE enumeration. + /// A pointer to an object containing the attribute value to set. + /// The size, in bytes, of the attribute value being set via the pvAttribute parameter. + /// If the function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + [DllImport(Libraries.Dwmapi)] + public static extern int DwmSetWindowAttribute([In] IntPtr hWnd, [In] int dwAttribute, + [In] ref int pvAttribute, + [In] int cbAttribute); + + /// + /// Sets the value of Desktop Window Manager (DWM) non-client rendering attributes for a window. + /// + /// The handle to the window for which the attribute value is to be set. + /// A flag describing which value to set, specified as a value of the DWMWINDOWATTRIBUTE enumeration. + /// A pointer to an object containing the attribute value to set. + /// The size, in bytes, of the attribute value being set via the pvAttribute parameter. + /// If the function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + [DllImport(Libraries.Dwmapi)] + public static extern int DwmSetWindowAttribute([In] IntPtr hWnd, [In] DWMWINDOWATTRIBUTE dwAttribute, + [In] ref int pvAttribute, + [In] int cbAttribute); + + /// + /// Retrieves the current value of a specified Desktop Window Manager (DWM) attribute applied to a window. For programming guidance, and code examples, see Controlling non-client region rendering. + /// + /// The handle to the window from which the attribute value is to be retrieved. + /// A flag describing which value to retrieve, specified as a value of the enumeration. + /// A pointer to a value which, when this function returns successfully, receives the current value of the attribute. The type of the retrieved value depends on the value of the dwAttribute parameter. + /// The size, in bytes, of the attribute value being received via the pvAttribute parameter. + /// If the function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + [DllImport(Libraries.Dwmapi)] + public static extern int DwmGetWindowAttribute([In] IntPtr hWnd, [In] DWMWINDOWATTRIBUTE dwAttributeToGet, + [In] ref int pvAttributeValue, + [In] int cbAttribute); + + /// + /// Retrieves the current value of a specified Desktop Window Manager (DWM) attribute applied to a window. For programming guidance, and code examples, see Controlling non-client region rendering. + /// + /// The handle to the window from which the attribute value is to be retrieved. + /// A flag describing which value to retrieve, specified as a value of the enumeration. + /// A pointer to a value which, when this function returns successfully, receives the current value of the attribute. The type of the retrieved value depends on the value of the dwAttribute parameter. + /// The size, in bytes, of the attribute value being received via the pvAttribute parameter. + /// If the function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + [DllImport(Libraries.Dwmapi)] + public static extern int DwmGetWindowAttribute([In] IntPtr hWnd, [In] int dwAttributeToGet, + [In] ref int pvAttributeValue, + [In] int cbAttribute); + + /// + /// The feature is not included in the Microsoft documentation. Reads Desktop Window Manager (DWM) color information. + /// + /// A pointer to a reference value that will hold the color information. + [DllImport(Libraries.Dwmapi, EntryPoint = "#127", PreserveSig = false, CharSet = CharSet.Unicode)] + public static extern void DwmGetColorizationParameters([Out] out DWMCOLORIZATIONPARAMS dwParameters); +} diff --git a/RevitLookup.UI/Interop/Gdi32.cs b/RevitLookup.UI/Interop/Gdi32.cs deleted file mode 100644 index 5644ac506..000000000 --- a/RevitLookup.UI/Interop/Gdi32.cs +++ /dev/null @@ -1,19 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -using System.Runtime.InteropServices; - -namespace RevitLookup.UI.Interop; - -/// -/// The Microsoft Windows graphics device interface (GDI) enables applications to use graphics and formatted text on both the video display and the printer. -/// Windows-based applications do not access the graphics hardware directly. -/// -internal class Gdi32 -{ - [DllImport(Libraries.Gdi32, EntryPoint = "DeleteObject", CharSet = CharSet.Auto)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool DeleteObject([In] IntPtr hObject); -} \ No newline at end of file diff --git a/RevitLookup.UI/Interop/Gdip.cs b/RevitLookup.UI/Interop/Gdip.cs deleted file mode 100644 index 48affcd36..000000000 --- a/RevitLookup.UI/Interop/Gdip.cs +++ /dev/null @@ -1,17 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -using System.Runtime.InteropServices; - -namespace RevitLookup.UI.Interop; - -/// -/// Windows GDI+ exposes a flat API that consists of about 600 functions, which are implemented in Gdiplus.dll and declared in Gdiplusflat.h. -/// -internal class Gdip -{ - [DllImport(Libraries.Gdip, CharSet = CharSet.Auto)] - public static extern int GdipCreateHICONFromBitmap(HandleRef nativeBitmap, out IntPtr hicon); -} \ No newline at end of file diff --git a/RevitLookup.UI/Interop/HT.cs b/RevitLookup.UI/Interop/HT.cs deleted file mode 100644 index 9abd1d235..000000000 --- a/RevitLookup.UI/Interop/HT.cs +++ /dev/null @@ -1,82 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -namespace RevitLookup.UI.Interop; - -/// -/// The return value of the DefWindowProc function is one of the following values, indicating the position of the cursor hot spot. -/// -/// -/// -/// -internal enum HT -{ - /// - /// On the screen background or on a dividing line between windows. - /// - NOWHERE = 0, - - /// - /// In a client area. - /// - CLIENT = 1, - - /// - /// In a title bar. - /// - CAPTION = 2, - - /// - /// In a window menu or in a Close button in a child window. - /// - SYSMENU = 3, - - /// - /// In a size box (same as HTSIZE). - /// - GROWBOX = 4, - //SIZE = 4, - - /// - /// In a menu. - /// - MENU = 5, - - /// - /// In a horizontal scroll bar. - /// - HSCROLL = 6, - - /// - /// In the vertical scroll bar. - /// - VSCROLL = 7, - - /// - /// In a Minimize button. - /// - MINBUTTON = 8, - - /// - /// In a Maximize button. - /// - MAXBUTTON = 9, - // ZOOM = 9, - - /// - /// In the left border of a resizable window (the user can click the mouse to resize the window horizontally). - /// - LEFT = 10, - - /// - /// In the right border of a resizable window (the user can click the mouse to resize the window horizontally). - /// - RIGHT = 11, - - /// - /// In the upper-horizontal border of a window. - /// - TOP = 12 -} \ No newline at end of file diff --git a/RevitLookup.UI/Interop/Kernel32.cs b/RevitLookup.UI/Interop/Kernel32.cs index 2948fcf9e..b9f064480 100644 --- a/RevitLookup.UI/Interop/Kernel32.cs +++ b/RevitLookup.UI/Interop/Kernel32.cs @@ -1,20 +1,46 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// Copyright (C) Leszek Pomianowski. // All Rights Reserved. +// NOTE +// I split unmanaged code stuff into the NativeMethods library. +// If you have suggestions for the code below, please submit your changes there. +// https://github.com/lepoco/nativemethods + using System.Runtime.InteropServices; namespace RevitLookup.UI.Interop; /// -/// Windows kernel module. +/// Used by multiple technologies. /// +// ReSharper disable IdentifierTypo +// ReSharper disable InconsistentNaming internal class Kernel32 { /// - /// Copies a block of memory from one location to another. + /// Retrieves the calling thread's last-error code value. The last-error code is maintained on a per-thread basis. Multiple threads do not overwrite each other's last-error code. + /// + /// The return value is the calling thread's last-error code. + [DllImport(Libraries.Kernel32)] + public static extern int GetLastError(); + + /// + /// Sets the last-error code for the calling thread. + /// + /// The last-error code for the thread. + [DllImport(Libraries.Kernel32, ExactSpelling = true, CharSet = CharSet.Auto)] + public static extern void SetLastError([In] int dwErrorCode); + + /// + /// Determines whether the calling process is being debugged by a user-mode debugger. /// - [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false, CharSet = CharSet.Auto)] - public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); -} \ No newline at end of file + /// If the current process is running in the context of a debugger, the return value is nonzero. + [DllImport(Libraries.Kernel32, ExactSpelling = true, CharSet = CharSet.Auto)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool IsDebuggerPresent(); +} diff --git a/RevitLookup.UI/Interop/Libraries.cs b/RevitLookup.UI/Interop/Libraries.cs index 856e0e88f..d49586af1 100644 --- a/RevitLookup.UI/Interop/Libraries.cs +++ b/RevitLookup.UI/Interop/Libraries.cs @@ -5,38 +5,39 @@ namespace RevitLookup.UI.Interop; /// -/// Windows kernel module. +/// Windows kernel module. /// internal static class Libraries { - internal const string Advapi32 = "advapi32.dll"; - internal const string BCrypt = "BCrypt.dll"; - internal const string CoreComm_L1_1_1 = "api-ms-win-core-comm-l1-1-1.dll"; - internal const string Crypt32 = "crypt32.dll"; + //internal const string Advapi32 = "advapi32.dll"; + //internal const string BCrypt = "BCrypt.dll"; + //internal const string CoreComm_L1_1_1 = "api-ms-win-core-comm-l1-1-1.dll"; + //internal const string Crypt32 = "crypt32.dll"; internal const string Dwmapi = "dwmapi.dll"; - internal const string Error_L1 = "api-ms-win-core-winrt-error-l1-1-0.dll"; - internal const string HttpApi = "httpapi.dll"; - internal const string IpHlpApi = "iphlpapi.dll"; + //internal const string Error_L1 = "api-ms-win-core-winrt-error-l1-1-0.dll"; + //internal const string HttpApi = "httpapi.dll"; + //internal const string IpHlpApi = "iphlpapi.dll"; internal const string Kernel32 = "kernel32.dll"; - internal const string Memory_L1_3 = "api-ms-win-core-memory-l1-1-3.dll"; - internal const string Mswsock = "mswsock.dll"; - internal const string NCrypt = "ncrypt.dll"; - internal const string NtDll = "ntdll.dll"; - internal const string Odbc32 = "odbc32.dll"; - internal const string OleAut32 = "oleaut32.dll"; - internal const string PerfCounter = "perfcounter.dll"; - internal const string RoBuffer = "api-ms-win-core-winrt-robuffer-l1-1-0.dll"; - internal const string Secur32 = "secur32.dll"; + //internal const string Memory_L1_3 = "api-ms-win-core-memory-l1-1-3.dll"; + //internal const string Mswsock = "mswsock.dll"; + //internal const string NCrypt = "ncrypt.dll"; + //internal const string NtDll = "ntdll.dll"; + //internal const string Odbc32 = "odbc32.dll"; + //internal const string OleAut32 = "oleaut32.dll"; + //internal const string PerfCounter = "perfcounter.dll"; + //internal const string RoBuffer = "api-ms-win-core-winrt-robuffer-l1-1-0.dll"; + //internal const string Secur32 = "secur32.dll"; internal const string Shell32 = "shell32.dll"; - internal const string SspiCli = "sspicli.dll"; + //internal const string SspiCli = "sspicli.dll"; internal const string User32 = "user32.dll"; - internal const string Gdi32 = "gdi32.dll"; - internal const string Gdip = "gdiplus.dll"; + internal const string UxTheme = "uxtheme.dll"; + //internal const string Gdi32 = "gdi32.dll"; + //internal const string Gdip = "gdiplus.dll"; internal const string Version = "version.dll"; - internal const string WebSocket = "websocket.dll"; - internal const string WinHttp = "winhttp.dll"; - internal const string WinMM = "winmm.dll"; - internal const string Ws2_32 = "ws2_32.dll"; - internal const string Wtsapi32 = "wtsapi32.dll"; - internal const string CompressionNative = "System.IO.Compression.Native.dll"; -} \ No newline at end of file + //internal const string WebSocket = "websocket.dll"; + //internal const string WinHttp = "winhttp.dll"; + //internal const string WinMM = "winmm.dll"; + //internal const string Ws2_32 = "ws2_32.dll"; + //internal const string Wtsapi32 = "wtsapi32.dll"; + //internal const string CompressionNative = "System.IO.Compression.Native.dll"; +} diff --git a/RevitLookup.UI/Interop/ShObjIdl.cs b/RevitLookup.UI/Interop/ShObjIdl.cs new file mode 100644 index 000000000..bf4afdf4e --- /dev/null +++ b/RevitLookup.UI/Interop/ShObjIdl.cs @@ -0,0 +1,231 @@ +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski. +// All Rights Reserved. + +// NOTE +// I split unmanaged code stuff into the NativeMethods library. +// If you have suggestions for the code below, please submit your changes there. +// https://github.com/lepoco/nativemethods + +using System; +using System.Runtime.InteropServices; + +namespace RevitLookup.UI.Interop; + +/// +/// Exposes methods that enumerate the contents of a view and receive notification from callback upon enumeration completion. +/// +// ReSharper disable IdentifierTypo +// ReSharper disable InconsistentNaming +internal static class ShObjIdl +{ + /// + /// THUMBBUTTON flags. THBF_* + /// + [Flags] + public enum THUMBBUTTONFLAGS + { + THBF_ENABLED = 0, + THBF_DISABLED = 0x1, + THBF_DISMISSONCLICK = 0x2, + THBF_NOBACKGROUND = 0x4, + THBF_HIDDEN = 0x8, + THBF_NONINTERACTIVE = 0x10 + } + + /// + /// THUMBBUTTON mask. THB_* + /// + [Flags] + public enum THUMBBUTTONMASK + { + THB_BITMAP = 0x1, + THB_ICON = 0x2, + THB_TOOLTIP = 0x4, + THB_FLAGS = 0x8 + } + + /// + /// TBPF_* + /// + [Flags] + public enum TBPFLAG + { + TBPF_NOPROGRESS = 0, + TBPF_INDETERMINATE = 0x1, + TBPF_NORMAL = 0x2, + TBPF_ERROR = 0x4, + TBPF_PAUSED = 0x8 + } + + /// + /// STPF_* + /// + [Flags] + public enum STPFLAG + { + STPF_NONE = 0, + STPF_USEAPPTHUMBNAILALWAYS = 0x1, + STPF_USEAPPTHUMBNAILWHENACTIVE = 0x2, + STPF_USEAPPPEEKALWAYS = 0x4, + STPF_USEAPPPEEKWHENACTIVE = 0x8 + } + + /// + /// EBO_* + /// + public enum EXPLORER_BROWSER_OPTIONS + { + EBO_NONE = 0, + EBO_NAVIGATEONCE = 0x1, + EBO_SHOWFRAMES = 0x2, + EBO_ALWAYSNAVIGATE = 0x4, + EBO_NOTRAVELLOG = 0x8, + EBO_NOWRAPPERWINDOW = 0x10, + EBO_HTMLSHAREPOINTVIEW = 0x20, + EBO_NOBORDER = 0x40, + EBO_NOPERSISTVIEWSTATE = 0x80 + } + + /// + /// EBF_* + /// + public enum EXPLORER_BROWSER_FILL_FLAGS + { + EBF_NONE = 0, + EBF_SELECTFROMDATAOBJECT = 0x100, + EBF_NODROPTARGET = 0x200 + } + + /// + /// THUMBBUTTON + /// + [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Unicode)] + public struct THUMBBUTTON + { + /// + /// WPARAM value for a THUMBBUTTON being clicked. + /// + public const int THBN_CLICKED = 0x1800; + + public THUMBBUTTONMASK dwMask; + public uint iId; + public uint iBitmap; + public IntPtr hIcon; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string szTip; + + public THUMBBUTTONFLAGS dwFlags; + } + + /// + /// Class DECLSPEC_UUID("56FDF344-FD6D-11d0-958A-006097C9A090") + /// + [Guid("56FDF344-FD6D-11d0-958A-006097C9A090")] + [ClassInterface(ClassInterfaceType.None)] + [ComImport] + public class CTaskbarList + { + } + + /// + /// Class DECLSPEC_UUID("9ac9fbe1-e0a2-4ad6-b4ee-e212013ea917") + /// + [Guid("9ac9fbe1-e0a2-4ad6-b4ee-e212013ea917")] + [ClassInterface(ClassInterfaceType.None)] + [ComImport] + public class ShellItem + { + } + + /// + /// MIDL_INTERFACE("c43dc798-95d1-4bea-9030-bb99e2983a1a") + /// ITaskbarList4 : public ITaskbarList3 + /// + [ComImport] + [Guid("c43dc798-95d1-4bea-9030-bb99e2983a1a")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface ITaskbarList4 + { + // ITaskbarList + [PreserveSig] + void HrInit(); + [PreserveSig] + void AddTab(IntPtr hwnd); + [PreserveSig] + void DeleteTab(IntPtr hwnd); + [PreserveSig] + void ActivateTab(IntPtr hwnd); + [PreserveSig] + void SetActiveAlt(IntPtr hwnd); + + // ITaskbarList2 + [PreserveSig] + void MarkFullscreenWindow( + IntPtr hwnd, + [MarshalAs(UnmanagedType.Bool)] bool fFullscreen); + + // ITaskbarList3 + [PreserveSig] + void SetProgressValue(IntPtr hwnd, ulong ullCompleted, ulong ullTotal); + [PreserveSig] + void SetProgressState(IntPtr hwnd, TBPFLAG tbpFlags); + [PreserveSig] + void RegisterTab(IntPtr hwndTab, IntPtr hwndMDI); + [PreserveSig] + void UnregisterTab(IntPtr hwndTab); + [PreserveSig] + void SetTabOrder(IntPtr hwndTab, IntPtr hwndInsertBefore); + [PreserveSig] + void SetTabActive(IntPtr hwndTab, IntPtr hwndInsertBefore, uint dwReserved); + + /// + /// + /// + /// + /// + /// + /// HRESULT + [PreserveSig] + int ThumbBarAddButtons( + IntPtr hwnd, + uint cButtons, + [MarshalAs(UnmanagedType.LPArray)] THUMBBUTTON[] pButtons); + + /// + /// + /// + /// + /// + /// + /// HRESULT + [PreserveSig] + int ThumbBarUpdateButtons( + IntPtr hwnd, + uint cButtons, + [MarshalAs(UnmanagedType.LPArray)] THUMBBUTTON[] pButtons); + [PreserveSig] + void ThumbBarSetImageList(IntPtr hWnd, IntPtr himl); + [PreserveSig] + void SetOverlayIcon( + IntPtr hwnd, + IntPtr hIcon, + [MarshalAs(UnmanagedType.LPWStr)] string pszDescription); + [PreserveSig] + void SetThumbnailTooltip( + IntPtr hwnd, + [MarshalAs(UnmanagedType.LPWStr)] string pszTip); + [PreserveSig] + void SetThumbnailClip( + IntPtr hwnd, + IntPtr prcClip); + + // ITaskbarList4 + void SetTabProperties(IntPtr hwndTab, STPFLAG stpFlags); + } +} diff --git a/RevitLookup.UI/Interop/Shell32.cs b/RevitLookup.UI/Interop/Shell32.cs index beecc8d77..e7ac28cfe 100644 --- a/RevitLookup.UI/Interop/Shell32.cs +++ b/RevitLookup.UI/Interop/Shell32.cs @@ -1,183 +1,173 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// Copyright (C) Leszek Pomianowski. // All Rights Reserved. +// NOTE +// I split unmanaged code stuff into the NativeMethods library. +// If you have suggestions for the code below, please submit your changes there. +// https://github.com/lepoco/nativemethods + +using System; using System.Runtime.InteropServices; -using System.Security; +using System.Runtime.InteropServices.ComTypes; namespace RevitLookup.UI.Interop; /// -/// Shell32 Namespace +/// The Windows UI provides users with access to a wide variety of objects necessary to run applications and manage the operating system. /// +// ReSharper disable IdentifierTypo +// ReSharper disable InconsistentNaming internal static class Shell32 { - [Flags] /// - /// A value that specifies the action to be taken by this function. NIM_* + /// DATAOBJ_GET_ITEM_FLAGS. DOGIF_*. /// - public enum NIM : uint + public enum DOGIF { - /// - /// Adds an icon to the status area.The icon is given an identifier in the NOTIFYICONDATA structure pointed to by lpdata—either through its uID or guidItem member.This identifier - /// is used in subsequent calls to Shell_NotifyIcon to perform later actions on the icon. - /// - ADD = 0x00000000, - - /// - /// Modifies an icon in the status area.NOTIFYICONDATA structure pointed to by lpdata uses the ID originally assigned to the icon when it was added to the notification - /// area(NIM_ADD) to identify the icon to be modified. - /// - MODIFY = 0x00000001, - - /// - /// Deletes an icon from the status area.NOTIFYICONDATA structure pointed to by lpdata uses the ID originally assigned to the icon when it was added to the notification - /// area(NIM_ADD) to identify the icon to be deleted. - /// - DELETE = 0x00000002, - - /// - /// Shell32.dll version 5.0 and later only.Returns focus to the taskbar notification area.Notification area icons should use this message when they have completed their UI - /// operation. For example, if the icon displays a shortcut menu, but the user presses ESC to cancel it, use NIM_SETFOCUS to return focus to the notification area. - /// - SETFOCUS = 0x00000003, - - /// - /// Shell32.dll version 5.0 and later only. Instructs the notification area to behave according to the version number specified in the uVersion member of the structure pointed to - /// by lpdata. The version number specifies which members are recognized. - /// - /// NIM_SETVERSION must be called every time a notification area icon is added (NIM_ADD). It does not need to be called with NIM_MODIFY. The version setting is not persisted - /// once a user logs off. - /// - /// - SETVERSION = 0x00000004 + DEFAULT = 0x0000, + TRAVERSE_LINK = 0x0001, // if the item is a link get the target + NO_HDROP = 0x0002, // don't fallback and use CF_HDROP clipboard format + NO_URL = 0x0004, // don't fallback and use URL clipboard format + ONLY_IF_ONE = 0x0008, // only return the item if there is one item in the array } /// - /// Flags for SetTabProperties. STPF_* + /// Shell_NotifyIcon messages. NIM_* /// - /// The native enum was called STPFLAG. - [Flags] - public enum STPF + public enum NIM : uint { - NONE = 0x00000000, - USEAPPTHUMBNAILALWAYS = 0x00000001, - USEAPPTHUMBNAILWHENACTIVE = 0x00000002, - USEAPPPEEKALWAYS = 0x00000004, - USEAPPPEEKWHENACTIVE = 0x00000008 + ADD = 0, + MODIFY = 1, + DELETE = 2, + SETFOCUS = 3, + SETVERSION = 4, } /// - /// THUMBBUTTON mask. THB_* + /// Shell_NotifyIcon flags. NIF_* /// [Flags] - public enum THB : uint + public enum NIF : uint { - BITMAP = 0x0001, + MESSAGE = 0x0001, ICON = 0x0002, - TOOLTIP = 0x0004, - FLAGS = 0x0008 - } - - /// - /// THUMBBUTTON flags. THBF_* - /// - [Flags] - public enum THBF : uint - { - ENABLED = 0x0000, - DISABLED = 0x0001, - DISMISSONCLICK = 0x0002, - NOBACKGROUND = 0x0004, - HIDDEN = 0x0008, - - // Added post-beta - NONINTERACTIVE = 0x0010 - } - - /// - /// Sends a message to the taskbar's status area. - /// - [SecurityCritical] - [DllImport(Libraries.Shell32, CharSet = CharSet.Auto)] - public static extern int Shell_NotifyIcon(NIM message, NOTIFYICONDATA pnid); + TIP = 0x0004, + STATE = 0x0008, + INFO = 0x0010, + GUID = 0x0020, - [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Unicode)] - internal struct THUMBBUTTON - { /// - /// WPARAM value for a THUMBBUTTON being clicked. + /// Vista only. /// - public const int THBN_CLICKED = 0x1800; - - public THB dwMask; - public uint iId; - public uint iBitmap; - public IntPtr hIcon; + REALTIME = 0x0040, - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] - public string szTip; + /// + /// Vista only. + /// + SHOWTIP = 0x0080, - public THBF dwFlags; + XP_MASK = MESSAGE | ICON | STATE | INFO | GUID, + VISTA_MASK = XP_MASK | REALTIME | SHOWTIP, } - /// - /// Contains information that the system needs to display notifications in the notification area. Used by . - /// - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + [StructLayout(LayoutKind.Sequential)] public class NOTIFYICONDATA { /// - /// The size of this structure, in bytes. + /// The size of this structure, in bytes. /// public int cbSize = Marshal.SizeOf(typeof(NOTIFYICONDATA)); - public int dwInfoFlags; - - public int dwState; - - public int dwStateMask; + /// + /// A handle to the window that receives notifications associated with an icon in the notification area. + /// + public IntPtr hWnd; /// - /// 0x00000002. The hIcon member is valid. + /// The application-defined identifier of the taskbar icon. The Shell uses either (hWnd plus uID) or guidItem to identify which icon to operate on when Shell_NotifyIcon is invoked. + /// You can have multiple icons associated with a single hWnd by assigning each a different uID. If guidItem is specified, uID is ignored. /// - public IntPtr hIcon; + public int uID; /// - /// A handle to the window that receives notifications associated with an icon in the notification area. + /// Flags that either indicate which of the other members of the structure contain valid data or provide additional information to the tooltip as to how it should display. /// - public IntPtr hWnd; + public NIF uFlags; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x100)] // 256 - public string szInfo; + /// + /// 0x00000001. The uCallbackMessage member is valid. + /// + public int uCallbackMessage; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x40)] // 64 - public string szInfoTitle; + /// + /// 0x00000002. The hIcon member is valid. + /// + public IntPtr hIcon; /// - /// 0x00000004. The szTip member is valid. + /// 0x00000004. The szTip member is valid. /// [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x80)] // 128 public string szTip; /// - /// 0x00000001. The uCallbackMessage member is valid. + /// The state of the icon. There are two flags that can be set independently. + /// NIS_HIDDEN = 1. The icon is hidden. + /// NIS_SHAREDICON = 2. The icon is shared. /// - public int uCallbackMessage; + public uint dwState; - /// - /// Flags that either indicate which of the other members of the structure contain valid data or provide additional information to the tooltip as to how it should display. - /// - public UFlags uFlags; + public uint dwStateMask; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x100)] // 256 + public string szInfo; /// - /// The application-defined identifier of the taskbar icon. The Shell uses either (hWnd plus uID) or guidItem to identify which icon to operate on when Shell_NotifyIcon is - /// invoked. - /// You can have multiple icons associated with a single hWnd by assigning each a different uID. If guidItem is specified, uID is ignored. + /// Prior to Vista this was a union of uTimeout and uVersion. As of Vista, uTimeout has been deprecated. /// - public int uID; + public uint uVersion; // Used with Shell_NotifyIcon flag NIM_SETVERSION. + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x40)] // 64 + public string szInfoTitle; + + public uint dwInfoFlags; + + public Guid guidItem; - public int uTimeoutOrVersion; + // Vista only + IntPtr hBalloonIcon; } -} \ No newline at end of file + + [DllImport(Libraries.Shell32, PreserveSig = false)] + public static extern void SHGetItemFromDataObject(IDataObject pdtobj, DOGIF dwFlags, [In] ref Guid riid, + [Out, MarshalAs(UnmanagedType.Interface)] + out object ppv); + + [DllImport(Libraries.Shell32)] + public static extern int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IBindCtx pbc, + [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out object ppv); + + [DllImport(Libraries.Shell32)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool Shell_NotifyIcon([In] NIM dwMessage, [In] NOTIFYICONDATA lpdata); + + /// + /// Sets the User Model AppID for the current process, enabling Windows to retrieve this ID + /// + /// + [DllImport(Libraries.Shell32, PreserveSig = false)] + public static extern void SetCurrentProcessExplicitAppUserModelID([MarshalAs(UnmanagedType.LPWStr)] string AppID); + + /// + /// Retrieves the User Model AppID that has been explicitly set for the current process via SetCurrentProcessExplicitAppUserModelID + /// + /// + [DllImport(Libraries.Shell32)] + public static extern int GetCurrentProcessExplicitAppUserModelID( + [Out, MarshalAs(UnmanagedType.LPWStr)] out string AppID); +} diff --git a/RevitLookup.UI/Interop/ShobjidlCore.cs b/RevitLookup.UI/Interop/ShobjidlCore.cs deleted file mode 100644 index 4f100dcb9..000000000 --- a/RevitLookup.UI/Interop/ShobjidlCore.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System.Runtime.InteropServices; -using RevitLookup.UI.Taskbar; -using RevitLookup.UI.Win32; - -namespace RevitLookup.UI.Interop; - -/// -/// This header is used by multiple technologies. -/// -internal class ShobjidlCore -{ - [Guid("56FDF344-FD6D-11d0-958A-006097C9A090")] - [ClassInterface(ClassInterfaceType.None)] - [ComImport] - public class CTaskbarList - { - } - - [ComImport] - [Guid("c43dc798-95d1-4bea-9030-bb99e2983a1a")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - public interface ITaskbarList - { - // ITaskbarList - [PreserveSig] - void HrInit(); - - [PreserveSig] - void AddTab(IntPtr hwnd); - - [PreserveSig] - void DeleteTab(IntPtr hwnd); - - [PreserveSig] - void ActivateTab(IntPtr hwnd); - - [PreserveSig] - void SetActiveAlt(IntPtr hwnd); - - // ITaskbarList2 - [PreserveSig] - void MarkFullscreenWindow( - IntPtr hwnd, - [MarshalAs(UnmanagedType.Bool)] bool fFullscreen); - - // ITaskbarList3 - [PreserveSig] - void SetProgressValue(IntPtr hwnd, ulong ullCompleted, ulong ullTotal); - - [PreserveSig] - void SetProgressState(IntPtr hwnd, ProgressState tbpFlags); - - [PreserveSig] - void RegisterTab(IntPtr hwndTab, IntPtr hwndMDI); - - [PreserveSig] - void UnregisterTab(IntPtr hwndTab); - - [PreserveSig] - void SetTabOrder(IntPtr hwndTab, IntPtr hwndInsertBefore); - - [PreserveSig] - void SetTabActive(IntPtr hwndTab, IntPtr hwndInsertBefore, uint dwReserved); - - [PreserveSig] - HRESULT ThumbBarAddButtons( - IntPtr hwnd, - uint cButtons, - [MarshalAs(UnmanagedType.LPArray)] Shell32.THUMBBUTTON[] pButtons); - - [PreserveSig] - HRESULT ThumbBarUpdateButtons( - IntPtr hwnd, - uint cButtons, - [MarshalAs(UnmanagedType.LPArray)] Shell32.THUMBBUTTON[] pButtons); - - [PreserveSig] - void ThumbBarSetImageList(IntPtr hwnd, IntPtr himl); - - [PreserveSig] - void SetOverlayIcon( - IntPtr hwnd, - IntPtr hIcon, - [MarshalAs(UnmanagedType.LPWStr)] string pszDescription); - - [PreserveSig] - void SetThumbnailTooltip( - IntPtr hwnd, - [MarshalAs(UnmanagedType.LPWStr)] string pszTip); - - [PreserveSig] - void SetThumbnailClip( - IntPtr hwnd, - IntPtr prcClip); - - // ITaskbarList4 - void SetTabProperties(IntPtr hwndTab, Shell32.STPF stpFlags); - } -} \ No newline at end of file diff --git a/RevitLookup.UI/Interop/UFlags.cs b/RevitLookup.UI/Interop/UFlags.cs deleted file mode 100644 index ecbd7f469..000000000 --- a/RevitLookup.UI/Interop/UFlags.cs +++ /dev/null @@ -1,36 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -namespace RevitLookup.UI.Interop; - -[Flags] -internal enum UFlags -{ - /// - /// The hIcon member is valid. - /// - Icon = 2, - - /// - /// The uCallbackMessage member is valid. - /// - Message = 1, - - /// - /// The szTip member is valid. - /// - ToolTip = 4, - - /// - /// The dwState and dwStateMask members are valid. - /// - State = 8, - - /// - /// Use a balloon ToolTip instead of a standard ToolTip. The szInfo, uTimeout, szInfoTitle, and dwInfoFlags members are - /// valid. - /// - Balloon = 0x10 -} \ No newline at end of file diff --git a/RevitLookup.UI/Interop/UnsafeNativeMethods.cs b/RevitLookup.UI/Interop/UnsafeNativeMethods.cs new file mode 100644 index 000000000..67c582168 --- /dev/null +++ b/RevitLookup.UI/Interop/UnsafeNativeMethods.cs @@ -0,0 +1,609 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Interop; +using System.Windows.Media; +using RevitLookup.UI.Appearance; + +namespace RevitLookup.UI.Interop; + +/// +/// A set of dangerous methods to modify the appearance. +/// +[Obsolete("This class is not depracted, but is dangerous to use.")] +public static class UnsafeNativeMethods +{ + #region Window Corners + + /// + /// Tries to set the corner preference. + /// + /// Selected window. + /// Window corner preference. + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowCornerPreference(Window window, WindowCornerPreference cornerPreference) + => GetHandle(window, out var windowHandle) && ApplyWindowCornerPreference(windowHandle, cornerPreference); + + /// + /// Tries to set the corner preference of the selected window. + /// + /// Selected window handle. + /// Window corner preference. + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowCornerPreference(IntPtr handle, WindowCornerPreference cornerPreference) + { + if (handle == IntPtr.Zero) + return false; + + if (!User32.IsWindow(handle)) + return false; + + var pvAttribute = (int)UnsafeReflection.Cast(cornerPreference); + + // TODO: Validate HRESULT + Dwmapi.DwmSetWindowAttribute( + handle, + Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_WINDOW_CORNER_PREFERENCE, + ref pvAttribute, + Marshal.SizeOf(typeof(int))); + + return true; + } + + #endregion + + #region Window Immersive Dark Mode + + /// + /// Tries to remove ImmersiveDarkMode effect from the . + /// + /// The window to which the effect is to be applied. + /// if invocation of native Windows function succeeds. + public static bool RemoveWindowDarkMode(Window window) + => GetHandle(window, out var windowHandle) && RemoveWindowDarkMode(windowHandle); + + /// + /// Tries to remove ImmersiveDarkMode effect from the window handle. + /// + /// Window handle. + /// if invocation of native Windows function succeeds. + public static bool RemoveWindowDarkMode(IntPtr handle) + { + if (handle == IntPtr.Zero) + return false; + + if (!User32.IsWindow(handle)) + return false; + + var pvAttribute = 0x0; // Disable + var dwAttribute = Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE; + + if (!Win32.Utilities.IsOSWindows11Insider1OrNewer) + dwAttribute = Dwmapi.DWMWINDOWATTRIBUTE.DMWA_USE_IMMERSIVE_DARK_MODE_OLD; + + // TODO: Validate HRESULT + Dwmapi.DwmSetWindowAttribute( + handle, + dwAttribute, + ref pvAttribute, + Marshal.SizeOf(typeof(int))); + + return true; + } + + /// + /// Tries to apply ImmersiveDarkMode effect for the . + /// + /// The window to which the effect is to be applied. + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowDarkMode(Window window) + => GetHandle(window, out var windowHandle) && ApplyWindowDarkMode(windowHandle); + + /// + /// Tries to apply ImmersiveDarkMode effect for the window handle. + /// + /// Window handle. + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowDarkMode(IntPtr handle) + { + if (handle == IntPtr.Zero) + return false; + + if (!User32.IsWindow(handle)) + return false; + + var pvAttribute = 0x1; // Enable + var dwAttribute = Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE; + + if (!Win32.Utilities.IsOSWindows11Insider1OrNewer) + dwAttribute = Dwmapi.DWMWINDOWATTRIBUTE.DMWA_USE_IMMERSIVE_DARK_MODE_OLD; + + // TODO: Validate HRESULT + Dwmapi.DwmSetWindowAttribute( + handle, + dwAttribute, + ref pvAttribute, + Marshal.SizeOf(typeof(int))); + + return true; + } + + #endregion + + #region Window Titlebar + + /// + /// Tries to remove titlebar from selected . + /// + /// The window to which the effect is to be applied. + /// if invocation of native Windows function succeeds. + public static bool RemoveWindowTitlebar(Window window) + { + if (window == null) + return false; + + if (window.IsLoaded) + return GetHandle(window, out var windowHandle) && RemoveWindowTitlebar(windowHandle); + + window.Loaded += (sender, _) => + { + GetHandle(sender as Window, out var windowHandle); + RemoveWindowTitlebar(windowHandle); + }; + + return true; + } + + /// + /// Tries to remove titlebar from selected window handle. + /// + /// Window handle. + /// if invocation of native Windows function succeeds. + public static bool RemoveWindowTitlebar(IntPtr handle) + { + if (handle == IntPtr.Zero) + return false; + + if (!User32.IsWindow(handle)) + return false; + + var windowStyleLong = User32.GetWindowLong(handle, User32.GWL.GWL_STYLE); + windowStyleLong &= ~(int)User32.WS.SYSMENU; + + var result = User32.SetWindowLong(handle, User32.GWL.GWL_STYLE, windowStyleLong); + + return result > 0x0; + } + + #endregion + + #region Window Backdrop Effect + + /// + /// Tries to apply selected backdrop type for + /// + /// Selected window. + /// Backdrop type. + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowBackdrop(Window window, BackgroundType backgroundType) + => GetHandle(window, out var windowHandle) && ApplyWindowBackdrop(windowHandle, backgroundType); + + /// + /// Tries to apply selected backdrop type for window handle. + /// + /// Selected window handle. + /// Backdrop type. + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowBackdrop(IntPtr handle, BackgroundType backgroundType) + { + if (handle == IntPtr.Zero) + return false; + + if (!User32.IsWindow(handle)) + return false; + + var backdropPvAttribute = (int)UnsafeReflection.Cast(backgroundType); + + if (backdropPvAttribute == (int)Dwmapi.DWMSBT.DWMSBT_DISABLE) + return false; + + // TODO: Validate HRESULT + Dwmapi.DwmSetWindowAttribute( + handle, + Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, + ref backdropPvAttribute, + Marshal.SizeOf(typeof(int))); + + return true; + } + + /// + /// Tries to remove backdrop effect from the . + /// + /// Selected Window. + /// if invocation of native Windows function succeeds. + public static bool RemoveWindowBackdrop(Window window) + => GetHandle(window, out var windowHandle) && RemoveWindowBackdrop(windowHandle); + + /// + /// Tries to remove backdrop effect from the window handle. + /// + /// Window handle. + /// if invocation of native Windows function succeeds. + public static bool RemoveWindowBackdrop(IntPtr handle) + { + if (handle == IntPtr.Zero) + return false; + + if (!User32.IsWindow(handle)) + return false; + + var pvAttribute = 0x0; // Disable + var backdropPvAttribute = (int)Dwmapi.DWMSBT.DWMSBT_DISABLE; + + Dwmapi.DwmSetWindowAttribute( + handle, + Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_MICA_EFFECT, + ref pvAttribute, + Marshal.SizeOf(typeof(int))); + + Dwmapi.DwmSetWindowAttribute( + handle, + Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, + ref backdropPvAttribute, + Marshal.SizeOf(typeof(int))); + + return true; + } + + /// + /// Tries to determine whether the provided has applied legacy backdrop effect. + /// + /// Window to check. + /// Background backdrop type. + public static bool IsWindowHasBackdrop(Window window, BackgroundType backdropType) + => GetHandle(window, out var windowHandle) && IsWindowHasBackdrop(windowHandle, backdropType); + + /// + /// Tries to determine whether the provided has applied legacy backdrop effect. + /// + /// Window handle. + /// Background backdrop type. + public static bool IsWindowHasBackdrop(IntPtr handle, BackgroundType backdropType) + { + if (!User32.IsWindow(handle)) + return false; + + var pvAttribute = 0x0; + + Dwmapi.DwmGetWindowAttribute(handle, Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, ref pvAttribute, + Marshal.SizeOf(typeof(int))); + + return pvAttribute == (int)UnsafeReflection.Cast(backdropType); + } + + #endregion Window Backdrop Effect + + #region Initial Windows 11 Mica + + /// + /// Tries to determine whether the provided has applied legacy Mica effect. + /// + /// Window to check. + public static bool IsWindowHasLegacyMica(Window window) + => GetHandle(window, out var windowHandle) && IsWindowHasLegacyMica(windowHandle); + + /// + /// Tries to determine whether the provided handle has applied legacy Mica effect. + /// + /// Window handle. + public static bool IsWindowHasLegacyMica(IntPtr handle) + { + if (!User32.IsWindow(handle)) + return false; + + var pvAttribute = 0x0; + + Dwmapi.DwmGetWindowAttribute(handle, Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_MICA_EFFECT, ref pvAttribute, + Marshal.SizeOf(typeof(int))); + + return pvAttribute == 0x1; + } + + /// + /// Tries to apply legacy Mica effect for the selected . + /// + /// The window to which the effect is to be applied. + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowLegacyMicaEffect(Window window) + => GetHandle(window, out var windowHandle) && ApplyWindowLegacyMicaEffect(windowHandle); + + /// + /// Tries to apply legacy Mica effect for the selected . + /// + /// Window handle. + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowLegacyMicaEffect(IntPtr handle) + { + var backdropPvAttribute = 0x1; //Enable + + // TODO: Validate HRESULT + Dwmapi.DwmSetWindowAttribute( + handle, + Dwmapi.DWMWINDOWATTRIBUTE.DWMWA_MICA_EFFECT, + ref backdropPvAttribute, + Marshal.SizeOf(typeof(int))); + + return true; + } + + #endregion + + #region Window Legacy Acrylic + + /// + /// Tries to apply legacy Acrylic effect for the selected . + /// + /// The window to which the effect is to be applied. + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowLegacyAcrylicEffect(Window window) + => GetHandle(window, out var windowHandle) && ApplyWindowLegacyAcrylicEffect(windowHandle); + + /// + /// Tries to apply legacy Acrylic effect for the selected . + /// + /// Window handle + /// if invocation of native Windows function succeeds. + public static bool ApplyWindowLegacyAcrylicEffect(IntPtr handle) + { + var accentPolicy = new User32.ACCENT_POLICY + { + nAccentState = User32.ACCENT_STATE.ACCENT_ENABLE_ACRYLICBLURBEHIND, + nColor = 0x990000 & 0xFFFFFF + }; + + var accentStructSize = Marshal.SizeOf(accentPolicy); + var accentPtr = Marshal.AllocHGlobal(accentStructSize); + + Marshal.StructureToPtr(accentPolicy, accentPtr, false); + + var data = new User32.WINCOMPATTRDATA + { + Attribute = User32.WCA.WCA_ACCENT_POLICY, + SizeOfData = accentStructSize, + Data = accentPtr + }; + + User32.SetWindowCompositionAttribute(handle, ref data); + + Marshal.FreeHGlobal(accentPtr); + + return true; + } + + #endregion + + #region DMWA Colorization + + /// + /// Tries to get currently selected Window accent color. + /// + public static Color GetDwmColor() + { + Dwmapi.DwmGetColorizationParameters(out var dwmParams); + + var values = BitConverter.GetBytes(dwmParams.clrColor); + + return Color.FromArgb( + 255, + values[2], + values[1], + values[0] + ); + } + + #endregion + + #region Taskbar + + /// + /// Tries to set taskbar state for the selected window handle. + /// + /// Window handle. + /// Taskbar flag. + internal static bool SetTaskbarState(IntPtr hWnd, ShObjIdl.TBPFLAG taskbarFlag) + { + if (hWnd == IntPtr.Zero) + return false; + + if (!User32.IsWindow(hWnd)) + return false; + + var taskbarList = new ShObjIdl.CTaskbarList() as ShObjIdl.ITaskbarList4; + + if (taskbarList == null) + return false; + + taskbarList.HrInit(); + taskbarList.SetProgressState(hWnd, taskbarFlag); + + return true; + } + + /// + /// Tries to set taskbar value for the selected window handle. + /// + /// Window handle. + /// Current value. + /// Total value to divide. + internal static bool SetTaskbarValue(IntPtr hWnd, ShObjIdl.TBPFLAG taskbarFlag, int current, int total) + { + if (hWnd == IntPtr.Zero) + return false; + + if (!User32.IsWindow(hWnd)) + return false; + + // TODO: Get existing taskbar class + + var taskbarList = new ShObjIdl.CTaskbarList() as ShObjIdl.ITaskbarList4; + + if (taskbarList == null) + return false; + + taskbarList.HrInit(); + taskbarList.SetProgressState(hWnd, taskbarFlag); + + if (taskbarFlag != ShObjIdl.TBPFLAG.TBPF_INDETERMINATE && taskbarFlag != ShObjIdl.TBPFLAG.TBPF_NOPROGRESS) + taskbarList.SetProgressValue( + hWnd, + Convert.ToUInt64(current), + Convert.ToUInt64(total)); + + return true; + } + + #endregion + + #region Client area and Title Bar + + public static bool RemoveWindowCaption(Window window) + { + if (window == null) + return false; + + var windowHandle = new WindowInteropHelper(window).Handle; + + return RemoveWindowCaption(windowHandle); + } + + public static bool RemoveWindowCaption(IntPtr hWnd) + { + if (hWnd == IntPtr.Zero) + return false; + + if (!User32.IsWindow(hWnd)) + return false; + + var wtaOptions = new UxTheme.WTA_OPTIONS() + { + dwFlags = UxTheme.WTNCA.NODRAWCAPTION, + dwMask = UxTheme.WTNCA.VALIDBITS + }; + + UxTheme.SetWindowThemeAttribute( + hWnd, + UxTheme.WINDOWTHEMEATTRIBUTETYPE.WTA_NONCLIENT, + ref wtaOptions, + (uint)Marshal.SizeOf(typeof(UxTheme.WTA_OPTIONS))); + + return true; + } + + public static bool ExtendClientAreaIntoTitleBar(Window window) + { + if (window == null) + return false; + + var windowHandle = new WindowInteropHelper(window).Handle; + + return ExtendClientAreaIntoTitleBar(windowHandle); + } + + public static bool ExtendClientAreaIntoTitleBar(IntPtr hWnd) + { + // !! EXPERIMENTAl + + // NOTE: + // WinRt has ExtendContentIntoTitlebar, but it needs some digging + + if (hWnd == IntPtr.Zero) + return false; + + if (!User32.IsWindow(hWnd)) + return false; + + // #1 Remove titlebar elements + var wtaOptions = new UxTheme.WTA_OPTIONS() + { + dwFlags = (UxTheme.WTNCA.NODRAWCAPTION | UxTheme.WTNCA.NODRAWICON | UxTheme.WTNCA.NOSYSMENU), + dwMask = UxTheme.WTNCA.VALIDBITS + }; + + UxTheme.SetWindowThemeAttribute( + hWnd, + UxTheme.WINDOWTHEMEATTRIBUTETYPE.WTA_NONCLIENT, + ref wtaOptions, + (uint)Marshal.SizeOf(typeof(UxTheme.WTA_OPTIONS))); + + var windowDpi = Dpi.DpiHelper.GetWindowDpi(hWnd); + + // #2 Extend glass frame + var deviceGlassThickness = Dpi.DpiHelper.LogicalThicknessToDevice( + new Thickness(-1, -1, -1, -1), + windowDpi.DpiScaleX, + windowDpi.DpiScaleY); + + var dwmMargin = new UxTheme.MARGINS + { + // err on the side of pushing in glass an extra pixel. + cxLeftWidth = (int)Math.Ceiling(deviceGlassThickness.Left), + cxRightWidth = (int)Math.Ceiling(deviceGlassThickness.Right), + cyTopHeight = (int)Math.Ceiling(deviceGlassThickness.Top), + cyBottomHeight = (int)Math.Ceiling(deviceGlassThickness.Bottom), + }; + + // #3 Extend client area + Dwmapi.DwmExtendFrameIntoClientArea(hWnd, ref dwmMargin); + + // #4 Clear rounding region + User32.SetWindowRgn(hWnd, IntPtr.Zero, + User32.IsWindowVisible(hWnd)); + + return true; + } + + public static void RestoreDefaultClientArea(Window window) + { + // + } + + #endregion Client area and Title bar + + /// + /// Checks whether the DWM composition is enabled. + /// + /// + public static bool IsCompositionEnabled() + { + Dwmapi.DwmIsCompositionEnabled(out var isEnabled); + + return isEnabled == 0x1; + } + + /// + /// Checks if provided pointer represents existing window. + /// + public static bool IsValidWindow(IntPtr hWnd) + { + return User32.IsWindow(hWnd); + } + + /// + /// Tries to get the pointer to the window handle. + /// + /// + /// + /// if the handle is not . + private static bool GetHandle(Window window, out IntPtr windowHandle) + { + windowHandle = new WindowInteropHelper(window).Handle; + + return windowHandle != IntPtr.Zero; + } +} diff --git a/RevitLookup.UI/Interop/UnsafeReflection.cs b/RevitLookup.UI/Interop/UnsafeReflection.cs new file mode 100644 index 000000000..5ff5eb851 --- /dev/null +++ b/RevitLookup.UI/Interop/UnsafeReflection.cs @@ -0,0 +1,103 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using RevitLookup.UI.Appearance; +using RevitLookup.UI.TaskBar; + +namespace RevitLookup.UI.Interop; + +/// +/// A set of dangerous methods to modify the appearance. +/// +internal static class UnsafeReflection +{ + /// + /// Casts to . + /// + public static Dwmapi.DWMSBT Cast(BackgroundType backgroundType) + { + return backgroundType switch + { + BackgroundType.Auto => Dwmapi.DWMSBT.DWMSBT_AUTO, + BackgroundType.Mica => Dwmapi.DWMSBT.DWMSBT_MAINWINDOW, + BackgroundType.Acrylic => Dwmapi.DWMSBT.DWMSBT_TRANSIENTWINDOW, + BackgroundType.Tabbed => Dwmapi.DWMSBT.DWMSBT_TABBEDWINDOW, + _ => Dwmapi.DWMSBT.DWMSBT_DISABLE + }; + } + + /// + /// Casts to . + /// + public static BackgroundType Cast(Dwmapi.DWMSBT backgroundType) + { + return backgroundType switch + { + Dwmapi.DWMSBT.DWMSBT_AUTO => BackgroundType.Auto, + Dwmapi.DWMSBT.DWMSBT_MAINWINDOW => BackgroundType.Mica, + Dwmapi.DWMSBT.DWMSBT_TRANSIENTWINDOW => BackgroundType.Acrylic, + Dwmapi.DWMSBT.DWMSBT_TABBEDWINDOW => BackgroundType.Tabbed, + _ => BackgroundType.Unknown + }; + } + + /// + /// Casts to . + /// + public static Dwmapi.DWM_WINDOW_CORNER_PREFERENCE Cast(WindowCornerPreference cornerPreference) + { + return cornerPreference switch + { + WindowCornerPreference.Round => Dwmapi.DWM_WINDOW_CORNER_PREFERENCE.ROUND, + WindowCornerPreference.RoundSmall => Dwmapi.DWM_WINDOW_CORNER_PREFERENCE.ROUNDSMALL, + WindowCornerPreference.DoNotRound => Dwmapi.DWM_WINDOW_CORNER_PREFERENCE.DONOTROUND, + _ => Dwmapi.DWM_WINDOW_CORNER_PREFERENCE.DEFAULT + }; + } + + /// + /// Casts to . + /// + public static WindowCornerPreference Cast(Dwmapi.DWM_WINDOW_CORNER_PREFERENCE cornerPreference) + { + return cornerPreference switch + { + Dwmapi.DWM_WINDOW_CORNER_PREFERENCE.ROUND => WindowCornerPreference.Round, + Dwmapi.DWM_WINDOW_CORNER_PREFERENCE.ROUNDSMALL => WindowCornerPreference.RoundSmall, + Dwmapi.DWM_WINDOW_CORNER_PREFERENCE.DONOTROUND => WindowCornerPreference.DoNotRound, + _ => WindowCornerPreference.Default + }; + } + + /// + /// Casts to . + /// + public static ShObjIdl.TBPFLAG Cast(TaskBarProgressState taskBarProgressState) + { + return taskBarProgressState switch + { + TaskBarProgressState.Indeterminate => ShObjIdl.TBPFLAG.TBPF_INDETERMINATE, + TaskBarProgressState.Error => ShObjIdl.TBPFLAG.TBPF_ERROR, + TaskBarProgressState.Paused => ShObjIdl.TBPFLAG.TBPF_PAUSED, + TaskBarProgressState.Normal => ShObjIdl.TBPFLAG.TBPF_NORMAL, + _ => ShObjIdl.TBPFLAG.TBPF_NOPROGRESS + }; + } + + /// + /// Casts to . + /// + public static TaskBarProgressState Cast(ShObjIdl.TBPFLAG progressState) + { + return progressState switch + { + ShObjIdl.TBPFLAG.TBPF_INDETERMINATE => TaskBarProgressState.Indeterminate, + ShObjIdl.TBPFLAG.TBPF_ERROR => TaskBarProgressState.Error, + ShObjIdl.TBPFLAG.TBPF_PAUSED => TaskBarProgressState.Paused, + ShObjIdl.TBPFLAG.TBPF_NORMAL => TaskBarProgressState.Normal, + _ => TaskBarProgressState.None + }; + } +} diff --git a/RevitLookup.UI/Interop/User32.cs b/RevitLookup.UI/Interop/User32.cs index 522947250..25f6cd0ce 100644 --- a/RevitLookup.UI/Interop/User32.cs +++ b/RevitLookup.UI/Interop/User32.cs @@ -1,36 +1,266 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// Copyright (C) Leszek Pomianowski. // All Rights Reserved. +// NOTE +// I split unmanaged code stuff into the NativeMethods library. +// If you have suggestions for the code below, please submit your changes there. +// https://github.com/lepoco/nativemethods + +using System; +using System.ComponentModel; using System.Runtime.InteropServices; +using System.Windows; // ReSharper disable InconsistentNaming namespace RevitLookup.UI.Interop; /// -/// This header is used by multiple technologies. +/// USER procedure declarations, constant definitions and macros. /// +// ReSharper disable IdentifierTypo +// ReSharper disable InconsistentNaming internal static class User32 { /// - /// DWM window accent state. + /// SetWindowPos options /// - public enum ACCENT_STATE + [Flags] + public enum SWP { - ACCENT_DISABLED = 0, - ACCENT_ENABLE_GRADIENT = 1, - ACCENT_ENABLE_TRANSPARENTGRADIENT = 2, - ACCENT_ENABLE_BLURBEHIND = 3, - ACCENT_ENABLE_ACRYLICBLURBEHIND = 4, - ACCENT_INVALID_STATE = 5 + ASYNCWINDOWPOS = 0x4000, + DEFERERASE = 0x2000, + DRAWFRAME = 0x0020, + FRAMECHANGED = 0x0020, + HIDEWINDOW = 0x0080, + NOACTIVATE = 0x0010, + NOCOPYBITS = 0x0100, + NOMOVE = 0x0002, + NOOWNERZORDER = 0x0200, + NOREDRAW = 0x0008, + NOREPOSITION = 0x0200, + NOSENDCHANGING = 0x0400, + NOSIZE = 0x0001, + NOZORDER = 0x0004, + SHOWWINDOW = 0x0040, + } + + /// + /// EnableMenuItem uEnable values, MF_* + /// + [Flags] + public enum MF : uint + { + /// + /// Possible return value for EnableMenuItem + /// + DOES_NOT_EXIST = unchecked((uint)-1), + ENABLED = 0, + BYCOMMAND = 0, + GRAYED = 1, + DISABLED = 2, + } + + /// + /// Menu item element. + /// + public enum SC + { + SIZE = 0xF000, + MOVE = 0xF010, + MINIMIZE = 0xF020, + MAXIMIZE = 0xF030, + NEXTWINDOW = 0xF040, + PREVWINDOW = 0xF050, + CLOSE = 0xF060, + VSCROLL = 0xF070, + HSCROLL = 0xF080, + MOUSEMENU = 0xF090, + KEYMENU = 0xF100, + ARRANGE = 0xF110, + RESTORE = 0xF120, + TASKLIST = 0xF130, + SCREENSAVE = 0xF140, + HOTKEY = 0xF150, + DEFAULT = 0xF160, + MONITORPOWER = 0xF170, + CONTEXTHELP = 0xF180, + SEPARATOR = 0xF00F, + /// + /// SCF_ISSECURE + /// + F_ISSECURE = 0x00000001, + ICON = MINIMIZE, + ZOOM = MAXIMIZE, } /// - /// DWM window attributes. + /// WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes /// - public enum WINCOMPATTR + public enum WM_NCHITTEST + { + /// + /// Hit test returned error. + /// + HTERROR = unchecked(-2), + + /// + /// Hit test returned transparent. + /// + HTTRANSPARENT = unchecked(-1), + + /// + /// On the screen background or on a dividing line between windows. + /// + HTNOWHERE = 0, + + /// + /// In a client area. + /// + HTCLIENT = 1, + + /// + /// In a title bar. + /// + HTCAPTION = 2, + + /// + /// In a window menu or in a Close button in a child window. + /// + HTSYSMENU = 3, + + /// + /// In a size box (same as HTSIZE). + /// + HTGROWBOX = 4, + HTSIZE = HTGROWBOX, + + /// + /// In a menu. + /// + HTMENU = 5, + + /// + /// In a horizontal scroll bar. + /// + HTHSCROLL = 6, + + /// + /// In the vertical scroll bar. + /// + HTVSCROLL = 7, + + /// + /// In a Minimize button. + /// + HTMINBUTTON = 8, + + /// + /// In a Maximize button. + /// + HTMAXBUTTON = 9, + // ZOOM = 9, + + /// + /// In the left border of a resizable window (the user can click the mouse to resize the window horizontally). + /// + HTLEFT = 10, + + /// + /// In the right border of a resizable window (the user can click the mouse to resize the window horizontally). + /// + HTRIGHT = 11, + + /// + /// In the upper-horizontal border of a window. + /// + HTTOP = 12, + + // From 10.0.22000.0\um\WinUser.h + HTTOPLEFT = 13, + HTTOPRIGHT = 14, + HTBOTTOM = 15, + HTBOTTOMLEFT = 16, + HTBOTTOMRIGHT = 17, + HTBORDER = 18, + HTREDUCE = HTMINBUTTON, + HTZOOM = HTMAXBUTTON, + HTSIZEFIRST = HTLEFT, + HTSIZELAST = HTBOTTOMRIGHT, + HTOBJECT = 19, + HTCLOSE = 20, + HTHELP = 21 + } + + /// + /// Window long flags. + /// + /// + [Flags] + public enum GWL + { + /// + /// Sets a new extended window style. + /// + GWL_EXSTYLE = -20, + + /// + /// Sets a new application instance handle. + /// + GWLP_HINSTANCE = -6, + + /// + /// Sets a new hWnd parent. + /// + GWLP_HWNDPARENT = -8, + + /// + /// Sets a new identifier of the child window. The window cannot be a top-level window. + /// + GWL_ID = -12, + + /// + /// Sets a new window style. + /// + GWL_STYLE = -16, + + /// + /// Sets the user data associated with the window. + /// This data is intended for use by the application that created the window. Its value is initially zero. + /// + GWL_USERDATA = -21, + + /// + /// Sets a new address for the window procedure. + /// You cannot change this attribute if the window does not belong to the same process as the calling thread. + /// + GWL_WNDPROC = -4, + + /// + /// Sets new extra information that is private to the application, such as handles or pointers. + /// + DWLP_USER = 0x8, + + /// + /// Sets the return value of a message processed in the dialog box procedure. + /// + DWLP_MSGRESULT = 0x0, + + /// + /// Sets the new address of the dialog box procedure. + /// + DWLP_DLGPROC = 0x4 + } + + /// + /// Window composition attributes. + /// + public enum WCA { WCA_UNDEFINED = 0, WCA_NCRENDERING_ENABLED = 1, @@ -65,15 +295,123 @@ public enum WINCOMPATTR WCA_LAST = 30 } + [Flags] + public enum ACCENT_FLAGS + { + DrawLeftBorder = 0x20, + DrawTopBorder = 0x40, + DrawRightBorder = 0x80, + DrawBottomBorder = 0x100, + DrawAllBorders = DrawLeftBorder | DrawTopBorder | DrawRightBorder | DrawBottomBorder + } + + /// + /// DWM window accent state. + /// + public enum ACCENT_STATE + { + ACCENT_DISABLED = 0, + ACCENT_ENABLE_GRADIENT = 1, + ACCENT_ENABLE_TRANSPARENTGRADIENT = 2, + ACCENT_ENABLE_BLURBEHIND = 3, + ACCENT_ENABLE_ACRYLICBLURBEHIND = 4, + ACCENT_INVALID_STATE = 5 + } + + /// + /// WCA window accent policy. + /// + [StructLayout(LayoutKind.Sequential)] + public struct ACCENT_POLICY + { + public ACCENT_STATE nAccentState; + public uint nFlags; + public uint nColor; + public uint nAnimationId; + } + + [StructLayout(LayoutKind.Sequential)] + public struct WINCOMPATTRDATA + { + public WCA Attribute; + public IntPtr Data; + public int SizeOfData; + } + /// - /// Window message values, WM_* - /// - /// https://wiki.winehq.org/List_Of_Windows_Messages - /// + /// CS_* + /// + [Flags] + public enum CS : uint + { + VREDRAW = 0x0001, + HREDRAW = 0x0002, + DBLCLKS = 0x0008, + OWNDC = 0x0020, + CLASSDC = 0x0040, + PARENTDC = 0x0080, + NOCLOSE = 0x0200, + SAVEBITS = 0x0800, + BYTEALIGNCLIENT = 0x1000, + BYTEALIGNWINDOW = 0x2000, + GLOBALCLASS = 0x4000, + IME = 0x00010000, + DROPSHADOW = 0x00020000 + } + + /// + /// MSGFLT_*. New in Vista. Realiased in Windows 7. + /// + public enum MSGFLT + { + // Win7 versions of this enum: + + /// + /// Resets the window message filter for hWnd to the default. Any message allowed globally or process-wide will get through, but any message not included in those two categories, and which comes from a lower privileged process, will be blocked. + /// + RESET = 0, + + /// + /// Allows the message through the filter. This enables the message to be received by hWnd, regardless of the source of the message, even it comes from a lower privileged process. + /// + ALLOW = 1, + + /// + /// Blocks the message to be delivered to hWnd if it comes from a lower privileged process, unless the message is allowed process-wide by using the ChangeWindowMessageFilter function or globally. + /// + DISALLOW = 2, + + // Vista versions of this enum: + // ADD = 1, + // REMOVE = 2, + } + + /// + /// MSGFLTINFO. + /// + public enum MSGFLTINFO + { + NONE = 0, + ALREADYALLOWED_FORWND = 1, + ALREADYDISALLOWED_FORWND = 2, + ALLOWED_HIGHER = 3, + } + + /// + /// Win7 only. + /// + [StructLayout(LayoutKind.Sequential)] + public struct CHANGEFILTERSTRUCT + { + public uint cbSize; + public MSGFLTINFO ExtStatus; + } + + /// + /// Window message values, WM_* /// public enum WM { -#pragma warning disable CS1591 NULL = 0x0000, CREATE = 0x0001, DESTROY = 0x0002, @@ -105,8 +443,6 @@ public enum WM QUEUESYNC = 0x0023, GETMINMAXINFO = 0x0024, - MEASUREITEM = 0x002C, - WINDOWPOSCHANGING = 0x0046, WINDOWPOSCHANGED = 0x0047, @@ -178,8 +514,6 @@ public enum WM NCMOUSELEAVE = 0x02A2, - MOUSELEAVE = 0x02A3, - TABLET_DEFBASE = 0x02C0, //WM_TABLET_MAXOFFSET = 0x20, @@ -228,143 +562,981 @@ public enum WM USER = 0x0400, - // This is the hard-coded message value used by Microsoft for Shell_NotifyIcon. - // It's relatively safe to reuse. + /// + /// This is the hard-coded message value used by WinForms for Shell_NotifyIcon. + /// It's relatively safe to reuse. + /// TRAYMOUSEMESSAGE = 0x800, //WM_USER + 1024 - APP = 0x8000 -#pragma warning restore CS1591 + APP = 0x8000, + } + + /// + /// WindowStyle values, WS_* + /// + [Flags] + public enum WS : long + { + OVERLAPPED = 0x00000000, + POPUP = 0x80000000, + CHILD = 0x40000000, + MINIMIZE = 0x20000000, + VISIBLE = 0x10000000, + DISABLED = 0x08000000, + CLIPSIBLINGS = 0x04000000, + CLIPCHILDREN = 0x02000000, + MAXIMIZE = 0x01000000, + BORDER = 0x00800000, + DLGFRAME = 0x00400000, + VSCROLL = 0x00200000, + HSCROLL = 0x00100000, + SYSMENU = 0x00080000, + THICKFRAME = 0x00040000, + GROUP = 0x00020000, + TABSTOP = 0x00010000, + + MINIMIZEBOX = 0x00020000, + MAXIMIZEBOX = 0x00010000, + + CAPTION = BORDER | DLGFRAME, + TILED = OVERLAPPED, + ICONIC = MINIMIZE, + SIZEBOX = THICKFRAME, + TILEDWINDOW = OVERLAPPEDWINDOW, + + OVERLAPPEDWINDOW = OVERLAPPED | CAPTION | SYSMENU | THICKFRAME | MINIMIZEBOX | MAXIMIZEBOX, + POPUPWINDOW = POPUP | BORDER | SYSMENU, + CHILDWINDOW = CHILD, + } + + /// + /// Window style extended values, WS_EX_* + /// + [Flags] + public enum WS_EX : long + { + NONE = 0, + DLGMODALFRAME = 0x00000001, + NOPARENTNOTIFY = 0x00000004, + TOPMOST = 0x00000008, + ACCEPTFILES = 0x00000010, + TRANSPARENT = 0x00000020, + MDICHILD = 0x00000040, + TOOLWINDOW = 0x00000080, + WINDOWEDGE = 0x00000100, + CLIENTEDGE = 0x00000200, + CONTEXTHELP = 0x00000400, + RIGHT = 0x00001000, + LEFT = 0x00000000, + RTLREADING = 0x00002000, + LTRREADING = 0x00000000, + LEFTSCROLLBAR = 0x00004000, + RIGHTSCROLLBAR = 0x00000000, + CONTROLPARENT = 0x00010000, + STATICEDGE = 0x00020000, + APPWINDOW = 0x00040000, + LAYERED = 0x00080000, + NOINHERITLAYOUT = 0x00100000, // Disable inheritence of mirroring by children + LAYOUTRTL = 0x00400000, // Right to left mirroring + COMPOSITED = 0x02000000, + NOACTIVATE = 0x08000000, + OVERLAPPEDWINDOW = (WINDOWEDGE | CLIENTEDGE), + PALETTEWINDOW = (WINDOWEDGE | TOOLWINDOW | TOPMOST), + } + + /// + /// SystemMetrics. SM_* + /// + public enum SM + { + CXSCREEN = 0, + CYSCREEN = 1, + CXVSCROLL = 2, + CYHSCROLL = 3, + CYCAPTION = 4, + CXBORDER = 5, + CYBORDER = 6, + CXFIXEDFRAME = 7, + CYFIXEDFRAME = 8, + CYVTHUMB = 9, + CXHTHUMB = 10, + CXICON = 11, + CYICON = 12, + CXCURSOR = 13, + CYCURSOR = 14, + CYMENU = 15, + CXFULLSCREEN = 16, + CYFULLSCREEN = 17, + CYKANJIWINDOW = 18, + MOUSEPRESENT = 19, + CYVSCROLL = 20, + CXHSCROLL = 21, + DEBUG = 22, + SWAPBUTTON = 23, + CXMIN = 28, + CYMIN = 29, + CXSIZE = 30, + CYSIZE = 31, + CXFRAME = 32, + CXSIZEFRAME = CXFRAME, + CYFRAME = 33, + CYSIZEFRAME = CYFRAME, + CXMINTRACK = 34, + CYMINTRACK = 35, + CXDOUBLECLK = 36, + CYDOUBLECLK = 37, + CXICONSPACING = 38, + CYICONSPACING = 39, + MENUDROPALIGNMENT = 40, + PENWINDOWS = 41, + DBCSENABLED = 42, + CMOUSEBUTTONS = 43, + SECURE = 44, + CXEDGE = 45, + CYEDGE = 46, + CXMINSPACING = 47, + CYMINSPACING = 48, + CXSMICON = 49, + CYSMICON = 50, + CYSMCAPTION = 51, + CXSMSIZE = 52, + CYSMSIZE = 53, + CXMENUSIZE = 54, + CYMENUSIZE = 55, + ARRANGE = 56, + CXMINIMIZED = 57, + CYMINIMIZED = 58, + CXMAXTRACK = 59, + CYMAXTRACK = 60, + CXMAXIMIZED = 61, + CYMAXIMIZED = 62, + NETWORK = 63, + CLEANBOOT = 67, + CXDRAG = 68, + CYDRAG = 69, + SHOWSOUNDS = 70, + CXMENUCHECK = 71, + CYMENUCHECK = 72, + SLOWMACHINE = 73, + MIDEASTENABLED = 74, + MOUSEWHEELPRESENT = 75, + XVIRTUALSCREEN = 76, + YVIRTUALSCREEN = 77, + CXVIRTUALSCREEN = 78, + CYVIRTUALSCREEN = 79, + CMONITORS = 80, + SAMEDISPLAYFORMAT = 81, + IMMENABLED = 82, + CXFOCUSBORDER = 83, + CYFOCUSBORDER = 84, + TABLETPC = 86, + MEDIACENTER = 87, + CXPADDEDBORDER = 92, + REMOTESESSION = 0x1000, + REMOTECONTROL = 0x2001, + } + + /// + /// ShowWindow options + /// + public enum SW + { + HIDE = 0, + SHOWNORMAL = 1, + NORMAL = 1, + SHOWMINIMIZED = 2, + SHOWMAXIMIZED = 3, + MAXIMIZE = 3, + SHOWNOACTIVATE = 4, + SHOW = 5, + MINIMIZE = 6, + SHOWMINNOACTIVE = 7, + SHOWNA = 8, + RESTORE = 9, + SHOWDEFAULT = 10, + FORCEMINIMIZE = 11, + } + + [StructLayout(LayoutKind.Sequential)] + public class WINDOWPLACEMENT + { + public int length = Marshal.SizeOf(typeof(WINDOWPLACEMENT)); + public int flags; + public SW showCmd; + public WinDef.POINT ptMinPosition; + public WinDef.POINT ptMaxPosition; + public WinDef.RECT rcNormalPosition; } /// - /// The following are the window styles. After the window has been created, these styles cannot be modified, except as noted. + /// Contains window class information. It is used with the and GetClassInfoEx functions. /// - public enum WS + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct WNDCLASSEX { /// - /// The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified. + /// The size, in bytes, of this structure. Set this member to sizeof(WNDCLASSEX). Be sure to set this member before calling the GetClassInfoEx function. + /// + public int cbSize; + + /// + /// The class style(s). This member can be any combination of the Class Styles. + /// + public CS style; + + /// + /// A pointer to the window procedure. You must use the CallWindowProc function to call the window procedure. For more information, see WindowProc. + /// + public WndProc lpfnWndProc; + + /// + /// The number of extra bytes to allocate following the window-class structure. The system initializes the bytes to zero. + /// + public int cbClsExtra; + + /// + /// The number of extra bytes to allocate following the window instance. The system initializes the bytes to zero. If an application uses WNDCLASSEX to register a dialog box created by using the CLASS directive in the resource file, it must set this member to DLGWINDOWEXTRA. + /// + public int cbWndExtra; + + /// + /// A handle to the instance that contains the window procedure for the class. + /// + public IntPtr hInstance; + + /// + /// A handle to the class icon. This member must be a handle to an icon resource. If this member is NULL, the system provides a default icon. + /// + public IntPtr hIcon; + + /// + /// A handle to the class cursor. This member must be a handle to a cursor resource. If this member is NULL, an application must explicitly set the cursor shape whenever the mouse moves into the application's window. + /// + public IntPtr hCursor; + + /// + /// A handle to the class background brush. This member can be a handle to the brush to be used for painting the background, or it can be a color value. /// - MAXIMIZEBOX = 0x10000, + public IntPtr hbrBackground; /// - /// The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified. + /// Pointer to a null-terminated character string that specifies the resource name of the class menu, as the name appears in the resource file. If you use an integer to identify the menu, use the MAKEINTRESOURCE macro. If this member is NULL, windows belonging to this class have no default menu. /// - MINIMIZEBOX = 0x20000, + [MarshalAs(UnmanagedType.LPWStr)] public string lpszMenuName; /// - /// The window is an overlapped window. Same as the WS_TILEDWINDOW style. + /// A pointer to a null-terminated string or is an atom. If this parameter is an atom, it must be a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in the low-order word of lpszClassName; the high-order word must be zero. /// - SIZEBOX = 0x40000, + [MarshalAs(UnmanagedType.LPWStr)] public string lpszClassName; /// - /// The window has a window menu on its title bar. The WS_CAPTION style must also be specified. + /// A handle to a small icon that is associated with the window class. If this member is NULL, the system searches the icon resource specified by the hIcon member for an icon of the appropriate size to use as the small icon. /// - SYSMENU = 0x80000 + public IntPtr hIconSm; } /// - /// Retrieves the position of the mouse cursor, in screen coordinates. + /// Delegate declaration that matches native WndProc signatures. /// - /// A structure that receives the screen coordinates of the cursor. - /// + public delegate IntPtr WndProc(IntPtr hWnd, WM uMsg, IntPtr wParam, IntPtr lParam); + + /// + /// Delegate declaration that matches native WndProc signatures. + /// + public delegate IntPtr WndProcHook(IntPtr hWnd, WM uMsg, IntPtr wParam, IntPtr lParam, ref bool handled); + + /// + /// Delegate declaration that matches managed WndProc signatures. + /// + public delegate IntPtr MessageHandler(WM uMsg, IntPtr wParam, IntPtr lParam, out bool handled); + + /// + /// The ReleaseDC function releases a device context (DC), freeing it for use by other applications. + /// The effect of the ReleaseDC function depends on the type of DC. It frees only common and window DCs. It has no effect on class or private DCs. + /// + /// A handle to the window whose DC is to be released. + /// A handle to the DC to be released. + /// The return value indicates whether the DC was released. If the DC was released, the return value is 1. If the DC was not released, the return value is zero. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern int ReleaseDC([In] IntPtr hWnd, [In] IntPtr hDC); + + /// + /// Calculates the required size of the window rectangle, based on the desired size of the client rectangle. + /// The window rectangle can then be passed to the CreateWindowEx function to create a window whose client area is the desired size. + /// + /// A pointer to a RECT structure that contains the coordinates of the top-left and bottom-right corners of the desired client area. + /// The window style of the window whose required size is to be calculated. Note that you cannot specify the WS_OVERLAPPED style. + /// Indicates whether the window has a menu. + /// The extended window style of the window whose required size is to be calculated. + /// If the function succeeds, the return value is nonzero. + [DllImport(Libraries.User32, CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool AdjustWindowRectEx([In] ref Rect lpRect, [In] WS dwStyle, + [In][MarshalAs(UnmanagedType.Bool)] bool bMenu, [In] WS_EX dwExStyle); + + /// + /// [Using the ChangeWindowMessageFilter function is not recommended, as it has process-wide scope. Instead, use the ChangeWindowMessageFilterEx function to control access to specific windows as needed. ChangeWindowMessageFilter may not be supported in future versions of Windows. + /// Adds or removes a message from the User Interface Privilege Isolation(UIPI) message filter. + /// + /// The message to add to or remove from the filter. + /// The action to be performed. One of the following values. + /// if successful; otherwise, . To get extended error information, call . + [DllImport(Libraries.User32, CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool ChangeWindowMessageFilter([In] WM message, [In] MSGFLT dwFlag); + + /// + /// Modifies the User Interface Privilege Isolation (UIPI) message filter for a specified window. + /// + /// A handle to the window whose UIPI message filter is to be modified. + /// The message that the message filter allows through or blocks. + /// The action to be performed. + /// Optional pointer to a structure. + /// If the function succeeds, it returns ; otherwise, it returns . To get extended error information, call . + [DllImport(Libraries.User32, CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool ChangeWindowMessageFilterEx([In] IntPtr hWnd, [In] WM message, [In] MSGFLT action, + [In, Out, Optional] ref CHANGEFILTERSTRUCT pChangeFilterStruct); + + /// + /// Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message. + /// Unicode declaration for + /// + /// A handle to the window whose window procedure is to receive the message. + /// The message to be posted. + /// Additional message-specific information. + /// Additional message-specific information. + /// If the function succeeds, the return value is nonzero. + [DllImport(Libraries.User32, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool PostMessageW([In, Optional] IntPtr hWnd, [In] WM Msg, [In] IntPtr wParam, + [In] IntPtr lParam); + + /// + /// Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message. + /// ANSI declaration for + /// + /// A handle to the window whose window procedure is to receive the message. + /// The message to be posted. + /// Additional message-specific information. + /// Additional message-specific information. + /// If the function succeeds, the return value is nonzero. [DllImport(Libraries.User32, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool GetCursorPos(out POINT lpPoint); + public static extern bool PostMessageA([In, Optional] IntPtr hWnd, [In] WM Msg, [In] IntPtr wParam, + [In] IntPtr lParam); /// - /// Sets various information regarding DWM window attributes. + /// Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message. /// + /// A handle to the window whose window procedure is to receive the message. + /// The message to be posted. + /// Additional message-specific information. + /// Additional message-specific information. + /// If the function succeeds, the return value is nonzero. + [DllImport(Libraries.User32, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool PostMessage([In, Optional] IntPtr hWnd, [In] WM Msg, [In] IntPtr wParam, + [In] IntPtr lParam); + + /// + /// Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message. + /// + /// A handle to the window whose window procedure will receive the message. + /// The message to be sent. + /// Additional message-specific information. + /// Additional message-specific information. + /// The return value specifies the result of the message processing; it depends on the message sent. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] - public static extern int SetWindowCompositionAttribute(IntPtr hWnd, ref WINCOMPATTRDATA data); + public static extern int SendMessage([In] IntPtr hWnd, [In] WM wMsg, [In] IntPtr wParam, [In] IntPtr lParam); /// - /// Brings the thread that created the specified window into the foreground and activates the window. - /// Keyboard input is directed to the window, and various visual cues are changed for the user. + /// Creates an overlapped, pop-up, or child window with an extended window style; otherwise, + /// this function is identical to the CreateWindow function. For more information about + /// creating a window and for full descriptions of the other parameters of CreateWindowEx, see CreateWindow. /// + /// The extended window style of the window being created. + /// A null-terminated string or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. + /// The window name. If the window style specifies a title bar, the window title pointed to by lpWindowName is displayed in the title bar. + /// The style of the window being created. This parameter can be a combination of the window style values, plus the control styles indicated in the Remarks section. + /// The initial horizontal position of the window. For an overlapped or pop-up window, the x parameter is the initial x-coordinate of the window's upper-left corner, in screen coordinates. + /// The initial vertical position of the window. For an overlapped or pop-up window, the y parameter is the initial y-coordinate of the window's upper-left corner, in screen coordinates. + /// The width, in device units, of the window. For overlapped windows, nWidth is the window's width, in screen coordinates, or CW_USEDEFAULT. + /// The height, in device units, of the window. For overlapped windows, nHeight is the window's height, in screen coordinates. If the nWidth parameter is set to CW_USEDEFAULT, the system ignores nHeight. + /// A handle to the parent or owner window of the window being created. To create a child window or an owned window, supply a valid window handle. This parameter is optional for pop-up windows. + /// A handle to a menu, or specifies a child-window identifier, depending on the window style. For an overlapped or pop-up window, hMenu identifies the menu to be used with the window; it can be NULL if the class menu is to be used. + /// A handle to the instance of the module to be associated with the window. + /// Pointer to a value to be passed to the window through the CREATESTRUCT structure (lpCreateParams member) pointed to by the lParam param of the WM_CREATE message. This message is sent to the created window by this function before it returns. + /// If the function succeeds, the return value is a handle to the new window. + [DllImport(Libraries.User32, SetLastError = true, CharSet = CharSet.Unicode)] + public static extern IntPtr CreateWindowExW( + [In] WS_EX dwExStyle, + [In, Optional] [MarshalAs(UnmanagedType.LPWStr)] + string lpClassName, + [In, Optional] [MarshalAs(UnmanagedType.LPWStr)] + string lpWindowName, + [In] WS dwStyle, + [In] int x, + [In] int y, + [In] int nWidth, + [In] int nHeight, + [In, Optional] IntPtr hWndParent, + [In, Optional] IntPtr hMenu, + [In, Optional] IntPtr hInstance, + [In, Optional] IntPtr lpParam); + + /// + /// Creates an overlapped, pop-up, or child window with an extended window style; otherwise, + /// this function is identical to the CreateWindow function. For more information about + /// creating a window and for full descriptions of the other parameters of CreateWindowEx, see CreateWindow. + /// + /// The extended window style of the window being created. + /// A null-terminated string or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. + /// The window name. If the window style specifies a title bar, the window title pointed to by lpWindowName is displayed in the title bar. + /// The style of the window being created. This parameter can be a combination of the window style values, plus the control styles indicated in the Remarks section. + /// The initial horizontal position of the window. For an overlapped or pop-up window, the x parameter is the initial x-coordinate of the window's upper-left corner, in screen coordinates. + /// The initial vertical position of the window. For an overlapped or pop-up window, the y parameter is the initial y-coordinate of the window's upper-left corner, in screen coordinates. + /// The width, in device units, of the window. For overlapped windows, nWidth is the window's width, in screen coordinates, or CW_USEDEFAULT. + /// The height, in device units, of the window. For overlapped windows, nHeight is the window's height, in screen coordinates. If the nWidth parameter is set to CW_USEDEFAULT, the system ignores nHeight. + /// A handle to the parent or owner window of the window being created. To create a child window or an owned window, supply a valid window handle. This parameter is optional for pop-up windows. + /// A handle to a menu, or specifies a child-window identifier, depending on the window style. For an overlapped or pop-up window, hMenu identifies the menu to be used with the window; it can be NULL if the class menu is to be used. + /// A handle to the instance of the module to be associated with the window. + /// Pointer to a value to be passed to the window through the CREATESTRUCT structure (lpCreateParams member) pointed to by the lParam param of the WM_CREATE message. This message is sent to the created window by this function before it returns. + /// If the function succeeds, the return value is a handle to the new window. + public static IntPtr CreateWindowEx( + [In] WS_EX dwExStyle, + [In] string lpClassName, + [In] string lpWindowName, + [In] WS dwStyle, + [In] int x, + [In] int y, + [In] int nWidth, + [In] int nHeight, + [In, Optional] IntPtr hWndParent, + [In, Optional] IntPtr hMenu, + [In, Optional] IntPtr hInstance, + [In, Optional] IntPtr lpParam) + { + var ret = CreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, + hMenu, hInstance, lpParam); + if (IntPtr.Zero == ret) + { + throw new Exception("Unable to create a window"); + // HRESULT.ThrowLastError(); + } + + return ret; + } + + /// + /// Registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function. + /// Unicode declaration for + /// + /// A pointer to a structure. You must fill the structure with the appropriate class attributes before passing it to the function. + /// If the function succeeds, the return value is a class atom that uniquely identifies the class being registered. + [DllImport(Libraries.User32, SetLastError = true, CharSet = CharSet.Unicode)] + public static extern short RegisterClassExW([In] ref WNDCLASSEX lpwcx); + + /// + /// Registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function. + /// ANSI declaration for + /// + /// A pointer to a structure. You must fill the structure with the appropriate class attributes before passing it to the function. + /// If the function succeeds, the return value is a class atom that uniquely identifies the class being registered. + [DllImport(Libraries.User32, SetLastError = true)] + public static extern short RegisterClassExA([In] ref WNDCLASSEX lpwcx); + + /// + /// Registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function. + /// + /// A pointer to a structure. You must fill the structure with the appropriate class attributes before passing it to the function. + /// If the function succeeds, the return value is a class atom that uniquely identifies the class being registered. + [DllImport(Libraries.User32, SetLastError = true)] + public static extern short RegisterClassEx([In] ref WNDCLASSEX lpwcx); + + /// + /// Calls the default window procedure to provide default processing for any window messages that an application does not process. + /// This function ensures that every message is processed. DefWindowProc is called with the same parameters received by the window procedure. + /// Unicode declaration for + /// + /// A handle to the window procedure that received the message. + /// The message. + /// Additional message information. The content of this parameter depends on the value of the Msg parameter. + /// Additional message information. The content of this parameter depends on the value of the Msg parameter. + /// The return value is the result of the message processing and depends on the message. + [DllImport(Libraries.User32, CharSet = CharSet.Unicode)] + public static extern IntPtr DefWindowProcW([In] IntPtr hWnd, [In] WM Msg, [In] IntPtr wParam, [In] IntPtr lParam); + + /// + /// Calls the default window procedure to provide default processing for any window messages that an application does not process. + /// This function ensures that every message is processed. DefWindowProc is called with the same parameters received by the window procedure. + /// ANSI declaration for + /// + /// A handle to the window procedure that received the message. + /// The message. + /// Additional message information. The content of this parameter depends on the value of the Msg parameter. + /// Additional message information. The content of this parameter depends on the value of the Msg parameter. + /// The return value is the result of the message processing and depends on the message. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern IntPtr DefWindowProcA([In] IntPtr hWnd, [In] WM Msg, [In] IntPtr wParam, [In] IntPtr lParam); + + /// + /// Calls the default window procedure to provide default processing for any window messages that an application does not process. + /// This function ensures that every message is processed. DefWindowProc is called with the same parameters received by the window procedure. + /// + /// A handle to the window procedure that received the message. + /// The message. + /// Additional message information. The content of this parameter depends on the value of the Msg parameter. + /// Additional message information. The content of this parameter depends on the value of the Msg parameter. + /// The return value is the result of the message processing and depends on the message. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern IntPtr DefWindowProc([In] IntPtr hWnd, [In] WM Msg, [In] IntPtr wParam, [In] IntPtr lParam); + + /// + /// Retrieves information about the specified window. The function also retrieves the 32-bit (DWORD) value at the specified offset into the extra window memory. + /// If you are retrieving a pointer or a handle, this function has been superseded by the function. + /// Unicode declaration for + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be retrieved. + /// If the function succeeds, the return value is the requested value. + [DllImport(Libraries.User32, CharSet = CharSet.Unicode)] + public static extern long GetWindowLongW([In] IntPtr hWnd, [In] int nIndex); + + /// + /// Retrieves information about the specified window. The function also retrieves the 32-bit (DWORD) value at the specified offset into the extra window memory. + /// If you are retrieving a pointer or a handle, this function has been superseded by the function. + /// ANSI declaration for + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be retrieved. + /// If the function succeeds, the return value is the requested value. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern long GetWindowLongA([In] IntPtr hWnd, [In] int nIndex); + + /// + /// Retrieves information about the specified window. The function also retrieves the 32-bit (DWORD) value at the specified offset into the extra window memory. + /// If you are retrieving a pointer or a handle, this function has been superseded by the function. + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be retrieved. + /// If the function succeeds, the return value is the requested value. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern long GetWindowLong([In] IntPtr hWnd, [In] int nIndex); + + /// + /// Retrieves information about the specified window. The function also retrieves the 32-bit (DWORD) value at the specified offset into the extra window memory. + /// If you are retrieving a pointer or a handle, this function has been superseded by the function. + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be retrieved. + /// If the function succeeds, the return value is the requested value. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] - public static extern bool SetForegroundWindow(HandleRef hWnd); + public static extern long GetWindowLong([In] IntPtr hWnd, [In] GWL nIndex); /// - /// Retrieves the specified system metric or system configuration setting. - /// Note that all dimensions retrieved by GetSystemMetrics are in pixels. + /// Retrieves information about the specified window. The function also retrieves the value at a specified offset into the extra window memory. + /// Unicode declaration for /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be retrieved. + /// If the function succeeds, the return value is the requested value. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] - public static extern int GetSystemMetrics(int nIndex); + public static extern IntPtr GetWindowLongPtrW([In] IntPtr hWnd, [In] int nIndex); /// - /// Retrieves information about the specified window. - /// The function also retrieves the 32-bit (DWORD) value at the specified offset into the extra window memory. + /// Retrieves information about the specified window. The function also retrieves the value at a specified offset into the extra window memory. + /// ANSI declaration for /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be retrieved. + /// If the function succeeds, the return value is the requested value. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] - public static extern int GetWindowLong(IntPtr hWnd, int nIndex); + public static extern IntPtr GetWindowLongPtrA([In] IntPtr hWnd, [In] int nIndex); /// - /// Changes an attribute of the specified window. - /// The function also sets the 32-bit (long) value at the specified offset into the extra window memory. + /// Retrieves information about the specified window. The function also retrieves the value at a specified offset into the extra window memory. /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be retrieved. + /// If the function succeeds, the return value is the requested value. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] - public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); + public static extern IntPtr GetWindowLongPtr([In] IntPtr hWnd, [In] int nIndex); /// - /// Sends the specified message to a window or windows. - /// The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message. + /// Changes an attribute of the specified window. The function also sets the 32-bit (long) value at the specified offset into the extra window memory. + /// Note: This function has been superseded by the function. To write code that is compatible with both 32-bit and 64-bit versions of Windows, use the SetWindowLongPtr function. + /// Unicode declaration for /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer. + /// The replacement value. + /// If the function succeeds, the return value is the previous value of the specified 32-bit integer. + [DllImport(Libraries.User32, CharSet = CharSet.Unicode)] + public static extern long SetWindowLongW([In] IntPtr hWnd, [In] int nIndex, [In] long dwNewLong); + + /// + /// Changes an attribute of the specified window. The function also sets the 32-bit (long) value at the specified offset into the extra window memory. + /// Note: This function has been superseded by the function. To write code that is compatible with both 32-bit and 64-bit versions of Windows, use the SetWindowLongPtr function. + /// ANSI declaration for + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer. + /// The replacement value. + /// If the function succeeds, the return value is the previous value of the specified 32-bit integer. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern long SetWindowLongA([In] IntPtr hWnd, [In] int nIndex, [In] long dwNewLong); + + /// + /// Changes an attribute of the specified window. The function also sets the 32-bit (long) value at the specified offset into the extra window memory. + /// Note: This function has been superseded by the function. To write code that is compatible with both 32-bit and 64-bit versions of Windows, use the SetWindowLongPtr function. + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer. + /// The replacement value. + /// If the function succeeds, the return value is the previous value of the specified 32-bit integer. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] - public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); + public static extern long SetWindowLong([In] IntPtr hWnd, [In] int nIndex, [In] long dwNewLong); /// - /// Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message. + /// Changes an attribute of the specified window. The function also sets the 32-bit (long) value at the specified offset into the extra window memory. + /// Note: This function has been superseded by the function. To write code that is compatible with both 32-bit and 64-bit versions of Windows, use the SetWindowLongPtr function. + /// ANSI declaration for /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer. + /// The replacement value. + /// If the function succeeds, the return value is the previous value of the specified 32-bit integer. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] - public static extern bool PostMessage(HandleRef hWnd, WM msg, IntPtr wParam, IntPtr lParam); + public static extern long SetWindowLong([In] IntPtr hWnd, [In] GWL nIndex, [In] long dwNewLong); + + /// + /// Changes an attribute of the specified window. The function also sets the 32-bit (long) value at the specified offset into the extra window memory. + /// Note: This function has been superseded by the function. To write code that is compatible with both 32-bit and 64-bit versions of Windows, use the SetWindowLongPtr function. + /// ANSI declaration for + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer. + /// New window style. + /// If the function succeeds, the return value is the previous value of the specified 32-bit integer. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern long SetWindowLong([In] IntPtr hWnd, [In] GWL nIndex, [In] WS dwNewLong); + + /// + /// Changes an attribute of the specified window. The function also sets a value at the specified offset in the extra window memory. + /// Unicode declaration for + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be set. + /// The replacement value. + /// If the function succeeds, the return value is the previous value of the specified offset. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern IntPtr SetWindowLongPtrW([In] IntPtr hWnd, [In] int nIndex, [In] IntPtr dwNewLong); + + /// + /// Changes an attribute of the specified window. The function also sets a value at the specified offset in the extra window memory. + /// ANSI declaration for + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be set. + /// The replacement value. + /// If the function succeeds, the return value is the previous value of the specified offset. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern IntPtr SetWindowLongPtrA([In] IntPtr hWnd, [In] int nIndex, [In] IntPtr dwNewLong); + + /// + /// Changes an attribute of the specified window. The function also sets a value at the specified offset in the extra window memory. + /// + /// A handle to the window and, indirectly, the class to which the window belongs. + /// The zero-based offset to the value to be set. + /// The replacement value. + /// If the function succeeds, the return value is the previous value of the specified offset. + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern IntPtr SetWindowLongPtr([In] IntPtr hWnd, [In] int nIndex, [In] IntPtr dwNewLong); + + /// + /// Destroys an icon and frees any memory the icon occupied. + /// + /// A handle to the icon to be destroyed. The icon must not be in use. + /// If the function succeeds, the return value is nonzero. + [DllImport(Libraries.User32)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool DestroyIcon([In] IntPtr handle); /// - /// Calls the default window procedure to provide default processing for any window messages that an application does not process. - /// This function ensures that every message is processed. + /// Determines whether the specified window handle identifies an existing window. /// + /// A handle to the window to be tested. + /// If the window handle identifies an existing window, the return value is nonzero. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] - public static extern IntPtr DefWindowProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool IsWindow([In] IntPtr hWnd); + + /// + /// Destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages to the window to deactivate it and remove the keyboard focus from it. + /// + /// A handle to the window to be destroyed. + /// If the function succeeds, the return value is nonzero. + [DllImport(Libraries.User32, CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool DestroyWindow([In] IntPtr hWnd); + + /// + /// Retrieves the show state and the restored, minimized, and maximized positions of the specified window. + /// + /// A handle to the window. + /// A pointer to the structure that receives the show state and position information. Before calling GetWindowPlacement, set the length member to sizeof(WINDOWPLACEMENT). GetWindowPlacement fails if lpwndpl-> length is not set correctly. + /// If the function succeeds, the return value is nonzero. + [DllImport(Libraries.User32, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool GetWindowPlacement([In] IntPtr hWnd, [In] WINDOWPLACEMENT lpwndpl); + + /// + /// Retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. + /// + /// A handle to the window. + /// A pointer to a RECT structure that receives the screen coordinates of the upper-left and lower-right corners of the window. + /// If the function succeeds, the return value is nonzero. + [DllImport(Libraries.User32, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool GetWindowRect([In] IntPtr hWnd, [Out] out Rect lpRect); + + /// + /// Determines the visibility state of the specified window. + /// + /// A handle to the window to be tested. + /// If the specified window, its parent window, its parent's parent window, and so forth, have the WS_VISIBLE style, the return value is nonzero. Otherwise, the return value is zero. + [DllImport(Libraries.User32)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool IsWindowVisible([In] IntPtr hWnd); + + /// + /// Determines whether the specified window is enabled for mouse and keyboard input. + /// + /// A handle to the window to be tested. + /// If the window is enabled, the return value is nonzero. + [DllImport(Libraries.User32, ExactSpelling = true)] + internal static extern bool IsWindowEnabled(IntPtr hWnd); + + /// + /// The MonitorFromWindow function retrieves a handle to the display monitor that has the largest area of intersection with the bounding rectangle of a specified window. + /// + /// A handle to the window of interest. + /// Determines the function's return value if the window does not intersect any display monitor. + /// If the window intersects one or more display monitor rectangles, the return value is an HMONITOR handle to the display monitor that has the largest area of intersection with the window. + [DllImport(Libraries.User32)] + public static extern IntPtr MonitorFromWindow(IntPtr hWnd, uint dwFlags); + + /// + /// Retrieves the specified system metric or system configuration setting. + /// Note that all dimensions retrieved by GetSystemMetrics are in pixels. + /// + /// The system metric or configuration setting to be retrieved. This parameter can be one of the values. + /// Note that all SM_CX* values are widths and all SM_CY* values are heights. Also note that all settings designed to return Boolean data represent as any nonzero value, and as a zero value. + /// If the function succeeds, the return value is the requested system metric or configuration setting. + [DllImport(Libraries.User32)] + public static extern int GetSystemMetrics([In] SM nIndex); /// - /// Defines a new window message that is guaranteed to be unique throughout the system. The message value can be used when sending or posting messages. + /// Defines a new window message that is guaranteed to be unique throughout the system. The message value can be used when sending or posting messages. + /// Unicode declaration for /// /// The message to be registered. + /// If the message is successfully registered, the return value is a message identifier in the range 0xC000 through 0xFFFF. + [DllImport(Libraries.User32, SetLastError = true, CharSet = CharSet.Unicode)] + public static extern uint RegisterWindowMessageW([MarshalAs(UnmanagedType.LPWStr)] string lpString); + + /// + /// Defines a new window message that is guaranteed to be unique throughout the system. The message value can be used when sending or posting messages. + /// ANSI declaration for + /// + /// The message to be registered. + /// If the message is successfully registered, the return value is a message identifier in the range 0xC000 through 0xFFFF. + [DllImport(Libraries.User32, SetLastError = true, CharSet = CharSet.Auto)] + public static extern uint RegisterWindowMessageA([MarshalAs(UnmanagedType.LPWStr)] string lpString); + + /// + /// Defines a new window message that is guaranteed to be unique throughout the system. The message value can be used when sending or posting messages. + /// + /// The message to be registered. + /// If the message is successfully registered, the return value is a message identifier in the range 0xC000 through 0xFFFF. + [DllImport(Libraries.User32, SetLastError = true, CharSet = CharSet.Auto)] + public static extern uint RegisterWindowMessage([MarshalAs(UnmanagedType.LPWStr)] string lpString); + + /// + /// Activates a window. The window must be attached to the calling thread's message queue. + /// + /// A handle to the top-level window to be activated. + /// If the function succeeds, the return value is the handle to the window that was previously active. + [DllImport(Libraries.User32, SetLastError = true)] + public static extern IntPtr SetActiveWindow(IntPtr hWnd); + + /// + /// Brings the thread that created the specified window into the foreground and activates the window. + /// Keyboard input is directed to the window, and various visual cues are changed for the user. + /// The system assigns a slightly higher priority to the thread that created the foreground window than it does to other threads. + /// + /// A handle to the window that should be activated and brought to the foreground. + /// If the window was brought to the foreground, the return value is nonzero. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] - public static extern int RegisterWindowMessage(string lpString); + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool SetForegroundWindow(IntPtr hWnd); /// - /// DWM window accent policy. + /// Retrieves the position of the mouse cursor, in screen coordinates. /// - [StructLayout(LayoutKind.Sequential)] - public struct ACCENT_POLICY + /// A pointer to a structure that receives the screen coordinates of the cursor. + /// Returns nonzero if successful or zero otherwise. To get extended error information, call . + [DllImport(Libraries.User32, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool GetCursorPos([Out] out WinDef.POINT lpPoint); + + /// + /// + /// + /// + /// + /// + /// + [DllImport(Libraries.User32)] + public static extern bool UnionRect(out WinDef.RECT rcDst, ref WinDef.RECT rc1, ref WinDef.RECT rc2); + + /// + /// + /// + /// + /// + /// + /// + [DllImport(Libraries.User32, SetLastError = true)] + public static extern bool IntersectRect(ref WinDef.RECT rcDest, ref WinDef.RECT rc1, ref WinDef.RECT rc2); + + /// + /// + /// + /// + [DllImport(Libraries.User32)] + public static extern IntPtr GetShellWindow(); + + /// + /// + /// + /// + /// + /// + [DllImport(Libraries.User32, CharSet = CharSet.Unicode)] + public static extern int MapVirtualKey(int nVirtKey, int nMapType); + + /// + /// + /// + /// + /// + [DllImport(Libraries.User32)] + public static extern int GetSysColor(int nIndex); + + /// + /// + /// + /// + /// + /// + [DllImport(Libraries.User32)] + public static extern IntPtr GetSystemMenu([In] IntPtr hWnd, [In][MarshalAs(UnmanagedType.Bool)] bool bRevert); + + [DllImport(Libraries.User32, EntryPoint = "EnableMenuItem")] + private static extern int _EnableMenuItem([In] IntPtr hMenu, [In] SC uIDEnableItem, [In] MF uEnable); + + /// + /// Enables, disables, or grays the specified menu item. + /// + /// A handle to the menu. + /// The menu item to be enabled, disabled, or grayed, as determined by the uEnable parameter. + /// Controls the interpretation of the uIDEnableItem parameter and indicate whether the menu item is enabled, disabled, or grayed. + /// The return value specifies the previous state of the menu item (it is either MF_DISABLED, MF_ENABLED, or MF_GRAYED). If the menu item does not exist, the return value is -1 (). + public static MF EnableMenuItem([In] IntPtr hMenu, [In] SC uIDEnableItem, [In] MF uEnable) { - public ACCENT_STATE AccentState; - public uint AccentFlags; - public uint GradientColor; - public uint AnimationId; + // Returns the previous state of the menu item, or -1 if the menu item does not exist. + var iRet = _EnableMenuItem(hMenu, uIDEnableItem, uEnable); + return (MF)iRet; } - [StructLayout(LayoutKind.Sequential)] - public struct WINCOMPATTRDATA + [DllImport(Libraries.User32, EntryPoint = "SetWindowRgn", SetLastError = true)] + private static extern int _SetWindowRgn([In] IntPtr hWnd, [In] IntPtr hRgn, [In][MarshalAs(UnmanagedType.Bool)] bool bRedraw); + + /// + /// The SetWindowRgn function sets the window region of a window. The window region determines the area within the window where the system permits drawing. The system does not display any portion of a window that lies outside of the window region. + /// + /// A handle to the window whose window region is to be set. + /// A handle to a region. The function sets the window region of the window to this region. + /// Specifies whether the system redraws the window after setting the window region. If bRedraw is , the system does so; otherwise, it does not. + /// Native method returned HRESULT. + public static void SetWindowRgn([In] IntPtr hWnd, [In] IntPtr hRgn, [In] bool bRedraw) { - public WINCOMPATTR Attribute; - public IntPtr Data; - public int SizeOfData; + var err = _SetWindowRgn(hWnd, hRgn, bRedraw); + + if (0 == err) + { + throw new Win32Exception(); + } } + [DllImport(Libraries.User32, EntryPoint = "SetWindowPos", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool _SetWindowPos([In] IntPtr hWnd, [In, Optional] IntPtr hWndInsertAfter, [In] int x, [In] int y, [In] int cx, [In] int cy, [In] SWP uFlags); + /// - /// The POINT structure defines the x- and y-coordinates of a point. + /// Changes the size, position, and Z order of a child, pop-up, or top-level window. These windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order. /// - [StructLayout(LayoutKind.Sequential)] - public struct POINT + /// A handle to the window. + /// A handle to the window to precede the positioned window in the Z order. + /// The new position of the left side of the window, in client coordinates. + /// The new position of the top of the window, in client coordinates. + /// The new width of the window, in pixels. + /// The new height of the window, in pixels. + /// The window sizing and positioning flags. + /// If the function succeeds, the return value is nonzero. + public static bool SetWindowPos([In] IntPtr hWnd, [In, Optional] IntPtr hWndInsertAfter, [In] int x, [In] int y, [In] int cx, [In] int cy, [In] SWP uFlags) { - /// - /// Specifies the x-coordinate of the point. - /// - public int X; + if (!_SetWindowPos(hWnd, hWndInsertAfter, x, y, cx, cy, uFlags)) + { + // If this fails it's never worth taking down the process. Let the caller deal with the error if they want. + return false; + } - /// - /// Specifies the y-coordinate of the point. - /// - public int Y; + return true; } -} \ No newline at end of file + + /// + /// Sets the process-default DPI awareness to system-DPI awareness. This is equivalent to calling SetProcessDpiAwarenessContext with a DPI_AWARENESS_CONTEXT value of DPI_AWARENESS_CONTEXT_SYSTEM_AWARE. + /// + [DllImport(Libraries.User32)] + public static extern void SetProcessDPIAware(); + + /// + /// Sets various information regarding DWM window attributes. + /// + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern int SetWindowCompositionAttribute([In] IntPtr hWnd, [In, Out] ref WINCOMPATTRDATA data); + + /// + /// Sets various information regarding DWM window attributes. + /// + [DllImport(Libraries.User32, CharSet = CharSet.Auto)] + public static extern int GetWindowCompositionAttribute([In] IntPtr hWnd, [In, Out] ref WINCOMPATTRDATA data); + + /// + /// Returns the dots per inch (dpi) value for the specified window. + /// + /// The window that you want to get information about. + /// The DPI for the window, which depends on the DPI_AWARENESS of the window. + [DllImport(Libraries.User32, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)] + public static extern uint GetDpiForWindow([In] IntPtr hWnd); + + /// + /// Returns the dots per inch (dpi) value for the specified window. + /// + /// The window that you want to get information about. + /// The DPI for the window, which depends on the DPI_AWARENESS of the window. + [DllImport(Libraries.User32, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)] + public static extern uint GetDpiForWindow([In] HandleRef hwnd); +} diff --git a/RevitLookup.UI/Interop/UxTheme.cs b/RevitLookup.UI/Interop/UxTheme.cs new file mode 100644 index 000000000..6640eadf5 --- /dev/null +++ b/RevitLookup.UI/Interop/UxTheme.cs @@ -0,0 +1,166 @@ +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski. +// All Rights Reserved. + +// NOTE +// I split unmanaged code stuff into the NativeMethods library. +// If you have suggestions for the code below, please submit your changes there. +// https://github.com/lepoco/nativemethods + +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace RevitLookup.UI.Interop; + +// ReSharper disable IdentifierTypo +// ReSharper disable InconsistentNaming +internal static class UxTheme +{ + /// + /// Returned by the GetThemeMargins function to define the margins of windows that have visual styles applied. + /// + public struct MARGINS + { + /// + /// Width of left border that retains its size. + /// + public int cxLeftWidth; + + /// + /// Width of right border that retains its size. + /// + public int cxRightWidth; + + /// + /// Height of top border that retains its size. + /// + public int cyTopHeight; + + /// + /// Height of bottom border that retains its size. + /// + public int cyBottomHeight; + } + + /// + /// Specifies the type of visual style attribute to set on a window. + /// + public enum WINDOWTHEMEATTRIBUTETYPE : uint + { + /// + /// Non-client area window attributes will be set. + /// + WTA_NONCLIENT = 1, + } + + /// + /// WindowThemeNonClientAttributes + /// + [Flags] + public enum WTNCA : uint + { + /// + /// Prevents the window caption from being drawn. + /// + NODRAWCAPTION = 0x00000001, + + /// + /// Prevents the system icon from being drawn. + /// + NODRAWICON = 0x00000002, + + /// + /// Prevents the system icon menu from appearing. + /// + NOSYSMENU = 0x00000004, + + /// + /// Prevents mirroring of the question mark, even in right-to-left (RTL) layout. + /// + NOMIRRORHELP = 0x00000008, + + /// + /// A mask that contains all the valid bits. + /// + VALIDBITS = NODRAWCAPTION | NODRAWICON | NOMIRRORHELP | NOSYSMENU, + } + + /// + /// Defines options that are used to set window visual style attributes. + /// + [StructLayout(LayoutKind.Explicit)] + public struct WTA_OPTIONS + { + // public static readonly uint Size = (uint)Marshal.SizeOf(typeof(WTA_OPTIONS)); + public const uint Size = 8; + + /// + /// A combination of flags that modify window visual style attributes. + /// Can be a combination of the WTNCA constants. + /// + [FieldOffset(0)] + public WTNCA dwFlags; + + /// + /// A bitmask that describes how the values specified in dwFlags should be applied. + /// If the bit corresponding to a value in dwFlags is 0, that flag will be removed. + /// If the bit is 1, the flag will be added. + /// + [FieldOffset(4)] + public WTNCA dwMask; + } + + /// + /// Sets attributes to control how visual styles are applied to a specified window. + /// + /// + /// Handle to a window to apply changes to. + /// + /// + /// Value of type WINDOWTHEMEATTRIBUTETYPE that specifies the type of attribute to set. + /// The value of this parameter determines the type of data that should be passed in the pvAttribute parameter. + /// Can be the following value: + /// WTA_NONCLIENT (Specifies non-client related attributes). + /// pvAttribute must be a pointer of type WTA_OPTIONS. + /// + /// + /// A pointer that specifies attributes to set. Type is determined by the value of the eAttribute value. + /// + /// + /// Specifies the size, in bytes, of the data pointed to by pvAttribute. + /// + [DllImport(Libraries.UxTheme, PreserveSig = false)] + public static extern void SetWindowThemeAttribute([In] IntPtr hWnd, [In] WINDOWTHEMEATTRIBUTETYPE eAttribute, [In] ref WTA_OPTIONS pvAttribute, [In] uint cbAttribute); + + /// + /// Tests if a visual style for the current application is active. + /// + /// if a visual style is enabled, and windows with visual styles applied should call OpenThemeData to start using theme drawing services. + [DllImport(Libraries.UxTheme)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool IsThemeActive(); + + /// + /// Retrieves the name of the current visual style, and optionally retrieves the color scheme name and size name. + /// + /// Pointer to a string that receives the theme path and file name. + /// Value of type int that contains the maximum number of characters allowed in the theme file name. + /// Pointer to a string that receives the color scheme name. This parameter may be set to NULL. + /// Value of type int that contains the maximum number of characters allowed in the color scheme name. + /// Pointer to a string that receives the size name. This parameter may be set to NULL. + /// Value of type int that contains the maximum number of characters allowed in the size name. + /// HRESULT + [DllImport(Libraries.UxTheme, CharSet = CharSet.Unicode)] + public static extern int GetCurrentThemeName( + [Out] StringBuilder pszThemeFileName, + [In] int dwMaxNameChars, + [Out] StringBuilder pszColorBuff, + [In] int cchMaxColorChars, + [Out] StringBuilder pszSizeBuff, + [In] int cchMaxSizeChars); +} diff --git a/RevitLookup.UI/Interop/WinDef/POINT.cs b/RevitLookup.UI/Interop/WinDef/POINT.cs new file mode 100644 index 000000000..bd7c40799 --- /dev/null +++ b/RevitLookup.UI/Interop/WinDef/POINT.cs @@ -0,0 +1,29 @@ +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski. +// All Rights Reserved. + +using System.Runtime.InteropServices; + +namespace RevitLookup.UI.Interop.WinDef; + +/// +/// The POINT structure defines the x- and y-coordinates of a point. +/// +[StructLayout(LayoutKind.Sequential)] +// ReSharper disable InconsistentNaming +public struct POINT +{ + /// + /// Specifies the x-coordinate of the point. + /// + public int x; + + /// + /// Specifies the y-coordinate of the point. + /// + public int y; +} diff --git a/RevitLookup.UI/Interop/WinDef/POINTL.cs b/RevitLookup.UI/Interop/WinDef/POINTL.cs new file mode 100644 index 000000000..ebbdce823 --- /dev/null +++ b/RevitLookup.UI/Interop/WinDef/POINTL.cs @@ -0,0 +1,29 @@ +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski. +// All Rights Reserved. + +using System.Runtime.InteropServices; + +namespace RevitLookup.UI.Interop.WinDef; + +/// +/// The structure defines the x- and y-coordinates of a point. +/// +[StructLayout(LayoutKind.Sequential)] +// ReSharper disable InconsistentNaming +public struct POINTL +{ + /// + /// Specifies the x-coordinate of the point. + /// + public long x; + + /// + /// Specifies the y-coordinate of the point. + /// + public long y; +} diff --git a/RevitLookup.UI/Interop/WinDef/POINTS.cs b/RevitLookup.UI/Interop/WinDef/POINTS.cs new file mode 100644 index 000000000..0c671a1fc --- /dev/null +++ b/RevitLookup.UI/Interop/WinDef/POINTS.cs @@ -0,0 +1,29 @@ +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski. +// All Rights Reserved. + +using System.Runtime.InteropServices; + +namespace RevitLookup.UI.Interop.WinDef; + +/// +/// The POINTL structure defines the x- and y-coordinates of a point. +/// +[StructLayout(LayoutKind.Sequential)] +// ReSharper disable InconsistentNaming +public struct POINTS +{ + /// + /// Specifies the x-coordinate of the point. + /// + public short x; + + /// + /// Specifies the y-coordinate of the point. + /// + public short y; +} diff --git a/RevitLookup.UI/Interop/WinDef/RECT.cs b/RevitLookup.UI/Interop/WinDef/RECT.cs new file mode 100644 index 000000000..48fbbd349 --- /dev/null +++ b/RevitLookup.UI/Interop/WinDef/RECT.cs @@ -0,0 +1,145 @@ +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski. +// All Rights Reserved. + +using System; +using System.Runtime.InteropServices; + +namespace RevitLookup.UI.Interop.WinDef; + +/// +/// The RECT structure defines a rectangle by the coordinates of its upper-left and lower-right corners. +/// +[StructLayout(LayoutKind.Sequential)] +// ReSharper disable InconsistentNaming +public struct RECT +{ + private int _left; + private int _top; + private int _right; + private int _bottom; + + /// + /// Specifies the x-coordinate of the upper-left corner of the rectangle. + /// + public int Left + { + get { return _left; } + set { _left = value; } + } + + /// + /// Specifies the x-coordinate of the lower-right corner of the rectangle. + /// + public int Right + { + get { return _right; } + set { _right = value; } + } + + /// + /// Specifies the y-coordinate of the upper-left corner of the rectangle. + /// + public int Top + { + get { return _top; } + set { _top = value; } + } + + /// + /// Specifies the y-coordinate of the lower-right corner of the rectangle. + /// + public int Bottom + { + get { return _bottom; } + set { _bottom = value; } + } + + /// + /// Specifies the width of the rectangle. + /// + public int Width + { + get { return _right - _left; } + } + + /// + /// Specifies the height of the rectangle. + /// + public int Height + { + get { return _bottom - _top; } + } + + /// + /// Specifies the position of the rectangle. + /// + public POINT Position + { + get { return new POINT { x = _left, y = _top }; } + } + + /// + /// Specifies the size of the rectangle. + /// + public SIZE Size + { + get { return new SIZE { cx = Width, cy = Height }; } + } + + /// + /// Sets offset of the rectangle. + /// + public void Offset(int dx, int dy) + { + _left += dx; + _top += dy; + _right += dx; + _bottom += dy; + } + + /// + /// Combines two RECTs. + /// + public static RECT Union(RECT rect1, RECT rect2) + { + return new RECT + { + Left = Math.Min(rect1.Left, rect2.Left), + Top = Math.Min(rect1.Top, rect2.Top), + Right = Math.Max(rect1.Right, rect2.Right), + Bottom = Math.Max(rect1.Bottom, rect2.Bottom), + }; + } + + /// + public override bool Equals(object obj) + { + if (obj is not RECT) + return false; + + try + { + var rc = (RECT)obj; + + return rc._bottom == _bottom + && rc._left == _left + && rc._right == _right + && rc._top == _top; + } + catch (InvalidCastException) + { + return false; + } + } + + /// + public override int GetHashCode() + { + return _top.GetHashCode() ^ _bottom.GetHashCode() ^ _left.GetHashCode() ^ _right.GetHashCode(); + } +} diff --git a/RevitLookup.UI/Interop/WinDef/RECTL.cs b/RevitLookup.UI/Interop/WinDef/RECTL.cs new file mode 100644 index 000000000..5ea90d654 --- /dev/null +++ b/RevitLookup.UI/Interop/WinDef/RECTL.cs @@ -0,0 +1,144 @@ +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski. +// All Rights Reserved. + +using System; +using System.Runtime.InteropServices; + +namespace RevitLookup.UI.Interop.WinDef; + +/// +/// The RECTL structure defines a rectangle by the coordinates of its upper-left and lower-right corners. +/// +[StructLayout(LayoutKind.Sequential)] +// ReSharper disable InconsistentNaming +public struct RECTL +{ + private long _left; + private long _top; + private long _right; + private long _bottom; + + /// + /// Specifies the x-coordinate of the upper-left corner of the rectangle. + /// + public long Left + { + get { return _left; } + set { _left = value; } + } + + /// + /// Specifies the x-coordinate of the lower-right corner of the rectangle. + /// + public long Right + { + get { return _right; } + set { _right = value; } + } + + /// + /// Specifies the y-coordinate of the upper-left corner of the rectangle. + /// + public long Top + { + get { return _top; } + set { _top = value; } + } + + /// + /// Specifies the y-coordinate of the lower-right corner of the rectangle. + /// + public long Bottom + { + get { return _bottom; } + set { _bottom = value; } + } + + /// + /// Specifies the width of the rectangle. + /// + public long Width + { + get { return _right - _left; } + } + + /// + /// Specifies the height of the rectangle. + /// + public long Height + { + get { return _bottom - _top; } + } + + /// + /// Specifies the position of the rectangle. + /// + public POINTL Position + { + get { return new POINTL { x = _left, y = _top }; } + } + + /// + /// Specifies the size of the rectangle. + /// + public SIZE Size + { + get { return new SIZE { cx = Width, cy = Height }; } + } + + /// + /// Sets offset of the rectangle. + /// + public void Offset(int dx, int dy) + { + _left += dx; + _top += dy; + _right += dx; + _bottom += dy; + } + + /// + /// Combines two RECTLs + /// + public static RECTL Union(RECTL rect1, RECTL rect2) + { + return new RECTL + { + Left = Math.Min(rect1.Left, rect2.Left), + Top = Math.Min(rect1.Top, rect2.Top), + Right = Math.Max(rect1.Right, rect2.Right), + Bottom = Math.Max(rect1.Bottom, rect2.Bottom), + }; + } + + /// + public override bool Equals(object obj) + { + if (obj is not RECTL) + return false; + + try + { + var rc = (RECTL)obj; + return rc._bottom == _bottom + && rc._left == _left + && rc._right == _right + && rc._top == _top; + } + catch (InvalidCastException) + { + return false; + } + } + + /// + public override int GetHashCode() + { + return _top.GetHashCode() ^ _bottom.GetHashCode() ^ _left.GetHashCode() ^ _right.GetHashCode(); + } +} diff --git a/RevitLookup.UI/Interop/WinDef/RefPOINT.cs b/RevitLookup.UI/Interop/WinDef/RefPOINT.cs new file mode 100644 index 000000000..6d9350bd5 --- /dev/null +++ b/RevitLookup.UI/Interop/WinDef/RefPOINT.cs @@ -0,0 +1,29 @@ +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski. +// All Rights Reserved. + +using System.Runtime.InteropServices; + +namespace RevitLookup.UI.Interop.WinDef; + +/// +/// structure by reference. +/// +[StructLayout(LayoutKind.Sequential)] +// ReSharper disable InconsistentNaming +public class RefPOINT +{ + /// + /// Specifies the x-coordinate of the point. + /// + public int x; + + /// + /// Specifies the y-coordinate of the point. + /// + public int y; +} diff --git a/RevitLookup.UI/Interop/WinDef/SIZE.cs b/RevitLookup.UI/Interop/WinDef/SIZE.cs new file mode 100644 index 000000000..4bfd534d2 --- /dev/null +++ b/RevitLookup.UI/Interop/WinDef/SIZE.cs @@ -0,0 +1,29 @@ +// This Source Code is partially based on reverse engineering of the Windows Operating System, +// and is intended for use on Windows systems only. +// This Source Code is partially based on the source code provided by the .NET Foundation. +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski. +// All Rights Reserved. + +using System.Runtime.InteropServices; + +namespace RevitLookup.UI.Interop.WinDef; + +/// +/// The SIZE structure defines the width and height of a rectangle. +/// +[StructLayout(LayoutKind.Sequential)] +// ReSharper disable InconsistentNaming +public struct SIZE +{ + /// + /// Specifies the rectangle's width. The units depend on which function uses this structure. + /// + public long cx; + + /// + /// Specifies the rectangle's height. The units depend on which function uses this structure. + /// + public long cy; +} diff --git a/RevitLookup.UI/Markup/ControlsDictionary.cs b/RevitLookup.UI/Markup/ControlsDictionary.cs new file mode 100644 index 000000000..5c222d233 --- /dev/null +++ b/RevitLookup.UI/Markup/ControlsDictionary.cs @@ -0,0 +1,26 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows; +using System.Windows.Markup; +using RevitLookup.UI.Appearance; + +namespace RevitLookup.UI.Markup; + +/// +/// Provides a dictionary implementation that contains WPF UI controls resources used by components and other elements of a WPF application. +/// +[Localizability(LocalizationCategory.Ignore)] +[Ambient] +[UsableDuringInitialization(true)] +public class ControlsDictionary : ResourceDictionary +{ + /// + /// Default constructor defining of the WPF UI controls dictionary. + /// + public ControlsDictionary() + => Source = new Uri($"{AppearanceData.LibraryDictionariesUri}{AppearanceData.LibraryMainDictionary}.xaml", UriKind.Absolute); +} diff --git a/RevitLookup.UI/Markup/ThemeResource.cs b/RevitLookup.UI/Markup/ThemeResource.cs new file mode 100644 index 000000000..398b10a58 --- /dev/null +++ b/RevitLookup.UI/Markup/ThemeResource.cs @@ -0,0 +1,262 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows.Media; + +namespace RevitLookup.UI.Markup; + +/// +/// Collection of theme resources. +/// +#pragma warning disable CS1591 +public enum ThemeResource +{ + /// + /// Unspecified theme resource. + /// + Unknown, + + // Accents + SystemAccentColor, + SystemAccentColorPrimary, + SystemAccentColorSecondary, + SystemAccentColorTertiary, + SystemAccentColorPrimaryBrush, + SystemAccentColorSecondaryBrush, + SystemAccentColorTertiaryBrush, + + // Background + ApplicationBackgroundColor, + ApplicationBackgroundBrush, + + // Focus + KeyboardFocusBorderColor, + KeyboardFocusBorderColorBrush, + + // Text + TextFillColorPrimary, + TextFillColorSecondary, + TextFillColorTertiary, + TextFillColorDisabled, + TextPlaceholderColor, + TextFillColorInverse, + + AccentTextFillColorDisabled, + TextOnAccentFillColorSelectedText, + TextOnAccentFillColorPrimary, + TextOnAccentFillColorSecondary, + TextOnAccentFillColorDisabled, + + ControlFillColorDefault, + ControlFillColorSecondary, + ControlFillColorTertiary, + ControlFillColorDisabled, + ControlFillColorTransparent, + ControlFillColorInputActive, + + ControlStrongFillColorDefault, + ControlStrongFillColorDisabled, + + ControlSolidFillColorDefault, + + SubtleFillColorTransparent, + SubtleFillColorSecondary, + SubtleFillColorTertiary, + SubtleFillColorDisabled, + + ControlAltFillColorTransparent, + ControlAltFillColorSecondary, + ControlAltFillColorTertiary, + ControlAltFillColorQuarternary, + ControlAltFillColorDisabled, + + ControlOnImageFillColorDefault, + ControlOnImageFillColorSecondary, + ControlOnImageFillColorTertiary, + ControlOnImageFillColorDisabled, + + AccentFillColorDisabled, + + ControlStrokeColorDefault, + ControlStrokeColorSecondary, + ControlStrokeColorTertiary, + ControlStrokeColorOnAccentDefault, + ControlStrokeColorOnAccentSecondary, + ControlStrokeColorOnAccentTertiary, + ControlStrokeColorOnAccentDisabled, + + ControlStrokeColorForStrongFillWhenOnImage, + + CardStrokeColorDefault, + CardStrokeColorDefaultSolid, + + ControlStrongStrokeColorDefault, + ControlStrongStrokeColorDisabled, + + SurfaceStrokeColorDefault, + SurfaceStrokeColorFlyout, + SurfaceStrokeColorInverse, + + DividerStrokeColorDefault, + + FocusStrokeColorOuter, + FocusStrokeColorInner, + + CardBackgroundFillColorDefault, + CardBackgroundFillColorSecondary, + + SmokeFillColorDefault, + + LayerFillColorDefault, + LayerFillColorAlt, + LayerOnAcrylicFillColorDefault, + LayerOnAccentAcrylicFillColorDefault, + + LayerOnMicaBaseAltFillColorDefault, + LayerOnMicaBaseAltFillColorSecondary, + LayerOnMicaBaseAltFillColorTertiary, + LayerOnMicaBaseAltFillColorTransparent, + + SolidBackgroundFillColorBase, + SolidBackgroundFillColorSecondary, + SolidBackgroundFillColorTertiary, + SolidBackgroundFillColorQuarternary, + SolidBackgroundFillColorTransparent, + SolidBackgroundFillColorBaseAlt, + + SystemFillColorSuccess, + SystemFillColorCaution, + SystemFillColorCritical, + SystemFillColorNeutral, + SystemFillColorSolidNeutral, + SystemFillColorAttentionBackground, + SystemFillColorSuccessBackground, + SystemFillColorCautionBackground, + SystemFillColorCriticalBackground, + SystemFillColorNeutralBackground, + SystemFillColorSolidAttentionBackground, + SystemFillColorSolidNeutralBackground, + + // Brushes + TextFillColorPrimaryBrush, + TextFillColorSecondaryBrush, + TextFillColorTertiaryBrush, + TextFillColorDisabledBrush, + TextPlaceholderColorBrush, + TextFillColorInverseBrush, + + AccentTextFillColorDisabledBrush, + + TextOnAccentFillColorSelectedTextBrush, + + TextOnAccentFillColorPrimaryBrush, + TextOnAccentFillColorSecondaryBrush, + TextOnAccentFillColorDisabledBrush, + + ControlFillColorDefaultBrush, + ControlFillColorSecondaryBrush, + ControlFillColorTertiaryBrush, + ControlFillColorDisabledBrush, + ControlFillColorTransparentBrush, + ControlFillColorInputActiveBrush, + + ControlStrongFillColorDefaultBrush, + ControlStrongFillColorDisabledBrush, + + ControlSolidFillColorDefaultBrush, + + SubtleFillColorTransparentBrush, + SubtleFillColorSecondaryBrush, + SubtleFillColorTertiaryBrush, + SubtleFillColorDisabledBrush, + + ControlAltFillColorTransparentBrush, + ControlAltFillColorSecondaryBrush, + ControlAltFillColorTertiaryBrush, + ControlAltFillColorQuarternaryBrush, + ControlAltFillColorDisabledBrush, + + ControlOnImageFillColorDefaultBrush, + ControlOnImageFillColorSecondaryBrush, + ControlOnImageFillColorTertiaryBrush, + ControlOnImageFillColorDisabledBrush, + + AccentFillColorDisabledBrush, + + ControlStrokeColorDefaultBrush, + ControlStrokeColorSecondaryBrush, + ControlStrokeColorTertiaryBrush, + ControlStrokeColorOnAccentDefaultBrush, + ControlStrokeColorOnAccentSecondaryBrush, + ControlStrokeColorOnAccentTertiaryBrush, + ControlStrokeColorOnAccentDisabledBrush, + + ControlStrokeColorForStrongFillWhenOnImageBrush, + + CardStrokeColorDefaultBrush, + CardStrokeColorDefaultSolidBrush, + + ControlStrongStrokeColorDefaultBrush, + ControlStrongStrokeColorDisabledBrush, + + SurfaceStrokeColorDefaultBrush, + SurfaceStrokeColorFlyoutBrush, + SurfaceStrokeColorInverseBrush, + + DividerStrokeColorDefaultBrush, + + FocusStrokeColorOuterBrush, + FocusStrokeColorInnerBrush, + + CardBackgroundFillColorDefaultBrush, + CardBackgroundFillColorSecondaryBrush, + + SmokeFillColorDefaultBrush, + + LayerFillColorDefaultBrush, + LayerFillColorAltBrush, + LayerOnAcrylicFillColorDefaultBrush, + LayerOnAccentAcrylicFillColorDefaultBrush, + + LayerOnMicaBaseAltFillColorDefaultBrush, + LayerOnMicaBaseAltFillColorSecondaryBrush, + LayerOnMicaBaseAltFillColorTertiaryBrush, + LayerOnMicaBaseAltFillColorTransparentBrush, + + SolidBackgroundFillColorBaseBrush, + SolidBackgroundFillColorSecondaryBrush, + SolidBackgroundFillColorTertiaryBrush, + SolidBackgroundFillColorQuarternaryBrush, + SolidBackgroundFillColorBaseAltBrush, + + SystemFillColorSuccessBrush, + SystemFillColorCautionBrush, + SystemFillColorCriticalBrush, + SystemFillColorNeutralBrush, + SystemFillColorSolidNeutralBrush, + SystemFillColorAttentionBackgroundBrush, + SystemFillColorSuccessBackgroundBrush, + SystemFillColorCautionBackgroundBrush, + SystemFillColorCriticalBackgroundBrush, + SystemFillColorNeutralBackgroundBrush, + SystemFillColorSolidAttentionBackgroundBrush, + SystemFillColorSolidNeutralBackgroundBrush, + + /// + /// Gradient . + /// + ControlElevationBorderBrush, + + /// + /// Gradient . + /// + CircleElevationBorderBrush, + + /// + /// Gradient . + /// + AccentControlElevationBorderBrush +} + diff --git a/RevitLookup.UI/Markup/ThemeResourceExtension.cs b/RevitLookup.UI/Markup/ThemeResourceExtension.cs new file mode 100644 index 000000000..db8f23919 --- /dev/null +++ b/RevitLookup.UI/Markup/ThemeResourceExtension.cs @@ -0,0 +1,38 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.ComponentModel; +using System.Windows; +using System.Windows.Markup; + +namespace RevitLookup.UI.Markup; + +/// +/// Class for Xaml markup extension for static resource references. +/// +[TypeConverter(typeof(DynamicResourceExtensionConverter))] +[MarkupExtensionReturnType(typeof(object))] +public class ThemeResourceExtension : DynamicResourceExtension +{ + /// + /// Constructor that takes no parameters + /// + public ThemeResourceExtension() + { + ResourceKey = ThemeResource.ApplicationBackgroundBrush.ToString(); + } + + /// + /// Constructor that takes the resource key that this is a static reference to. + /// + public ThemeResourceExtension(ThemeResource resourceKey) + { + if (resourceKey == ThemeResource.Unknown) + throw new ArgumentNullException(nameof(resourceKey)); + + ResourceKey = resourceKey.ToString(); + } +} diff --git a/RevitLookup.UI/Markup/ThemesDictionary.cs b/RevitLookup.UI/Markup/ThemesDictionary.cs new file mode 100644 index 000000000..15af8a27b --- /dev/null +++ b/RevitLookup.UI/Markup/ThemesDictionary.cs @@ -0,0 +1,39 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows; +using System.Windows.Markup; +using RevitLookup.UI.Appearance; + +namespace RevitLookup.UI.Markup; + +/// +/// Provides a dictionary implementation that contains WPF UI theme resources used by components and other elements of a WPF application. +/// +[Localizability(LocalizationCategory.Ignore)] +[Ambient] +[UsableDuringInitialization(true)] +public class ThemesDictionary : ResourceDictionary +{ + /// + /// Sets the default application theme. + /// + public ThemeType Theme + { + set + { + var themeName = value switch + { + ThemeType.Dark => "Dark", + ThemeType.HighContrast => "HighContrast", + _ => "Light" + }; + + Source = new Uri($"{AppearanceData.LibraryThemeDictionariesUri}{themeName}.xaml", UriKind.Absolute); + } + } +} + diff --git a/RevitLookup.UI/Mvvm/Contracts/IDialogService.cs b/RevitLookup.UI/Mvvm/Contracts/IDialogService.cs new file mode 100644 index 000000000..252bef892 --- /dev/null +++ b/RevitLookup.UI/Mvvm/Contracts/IDialogService.cs @@ -0,0 +1,26 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Mvvm.Contracts; + +/// +/// Represents a contract with the service that provides global . +/// +public interface IDialogService +{ + /// + /// Sets the + /// + /// + void SetDialogControl(IDialogControl dialog); + + /// + /// Provides direct access to the + /// + /// Instance of the control. + IDialogControl GetDialogControl(); +} diff --git a/RevitLookup.UI/Mvvm/Contracts/INavigationService.cs b/RevitLookup.UI/Mvvm/Contracts/INavigationService.cs new file mode 100644 index 000000000..1ac034d59 --- /dev/null +++ b/RevitLookup.UI/Mvvm/Contracts/INavigationService.cs @@ -0,0 +1,65 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows.Controls; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Mvvm.Contracts; + +/// +/// Represents a contract with a that contains . +/// Through defined service allows you to use the Dependency Injection pattern in WPF UI navigation. +/// +public interface INavigationService +{ + /// + /// Provides direct access to the used in navigation. + /// + /// Instance of the control. + Frame GetFrame(); + + /// + /// Sets the used by . + /// + /// Frame to set. + void SetFrame(Frame frame); + + /// + /// Provides direct access to the control responsible for navigation. + /// + /// Instance of the control. + INavigation GetNavigationControl(); + + /// + /// Lets you attach the control that represents the . + /// + /// Instance of the . + void SetNavigationControl(INavigation navigation); + + /// + /// Lets you attach the service that delivers page instances to . + /// + /// Instance of the with attached service provider. + void SetPageService(IPageService pageService); + + /// + /// Lets you navigate to the selected page based on it's type. Should be used with . + /// + /// of the page. + bool Navigate(Type pageType); + + /// + /// Lets you navigate to the selected page based on it's id. Should be used with . + /// + /// Id of the page. + bool Navigate(int pageId); + + /// + /// Lets you navigate to the selected page based on it's tag. Should be used with . + /// + /// Tag of the page. + bool Navigate(string pageTag); +} diff --git a/RevitLookup.UI/Mvvm/Contracts/INavigationWindow.cs b/RevitLookup.UI/Mvvm/Contracts/INavigationWindow.cs new file mode 100644 index 000000000..31bbef6bd --- /dev/null +++ b/RevitLookup.UI/Mvvm/Contracts/INavigationWindow.cs @@ -0,0 +1,51 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows.Controls; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Mvvm.Contracts; + +/// +/// Represents a contract with a that contains . +/// Through defined service allows you to use the MVVM model in WPF UI navigation. +/// +public interface INavigationWindow +{ + /// + /// Provides direct access to the used in navigation. + /// + /// Instance of the control. + Frame GetFrame(); + + /// + /// Provides direct access to the control responsible for navigation. + /// + /// Instance of the control. + INavigation GetNavigation(); + + /// + /// Lets you navigate to the selected page based on it's type. Should be used with . + /// + /// of the page. + bool Navigate(Type pageType); + + /// + /// Lets you attach the service that delivers page instances to . + /// + /// Instance of the with attached service provider. + void SetPageService(IPageService pageService); + + /// + /// Triggers the command to open a window. + /// + void ShowWindow(); + + /// + /// Triggers the command to close a window. + /// + void CloseWindow(); +} diff --git a/RevitLookup.UI/Mvvm/Contracts/INotifyIconService.cs b/RevitLookup.UI/Mvvm/Contracts/INotifyIconService.cs new file mode 100644 index 000000000..5b3be8459 --- /dev/null +++ b/RevitLookup.UI/Mvvm/Contracts/INotifyIconService.cs @@ -0,0 +1,57 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; + +namespace RevitLookup.UI.Mvvm.Contracts; + +/// +/// Represents a contract with a service that provides methods for displaying the icon and menu in the tray area. +/// +public interface INotifyIconService +{ + /// + /// Whether the notify icon is registered in the tray. + /// + public int Id { get; } + + /// + /// Whether the notify icon is registered in the tray. + /// + public bool IsRegistered { get; } + + /// + /// Gets or sets the ToolTip text displayed when the mouse pointer rests on a notification area icon. + /// + public string TooltipText { get; set; } + + /// + /// Context menu displayed after clicking the icon. + /// + ContextMenu ContextMenu { get; set; } + + /// + /// Gets or sets the of the tray icon. + /// + public ImageSource Icon { get; set; } + + /// + /// Tries to register the Notify Icon in the shell. + /// + public bool Register(); + + /// + /// Tries to unregister the Notify Icon from the shell. + /// + public bool Unregister(); + + /// + /// Sets parent window of the tray icon. + /// + public void SetParentWindow(Window window); +} + diff --git a/RevitLookup.UI/Mvvm/Contracts/IPageService.cs b/RevitLookup.UI/Mvvm/Contracts/IPageService.cs new file mode 100644 index 000000000..c4c9d9e37 --- /dev/null +++ b/RevitLookup.UI/Mvvm/Contracts/IPageService.cs @@ -0,0 +1,32 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +#nullable enable + +using System; +using System.Windows; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Mvvm.Contracts; + +/// +/// Represents a contract with the service that provides the pages for . +/// +public interface IPageService +{ + /// + /// Takes a page of the given type. + /// + /// Page type. + /// Instance of the registered page. + public T? GetPage() where T : class; + + /// + /// Takes a page of the given type. + /// + /// Page type. + /// Instance of the registered page. + public FrameworkElement? GetPage(Type pageType); +} diff --git a/RevitLookup.UI/Mvvm/Contracts/ISnackbarService.cs b/RevitLookup.UI/Mvvm/Contracts/ISnackbarService.cs new file mode 100644 index 000000000..3aa395681 --- /dev/null +++ b/RevitLookup.UI/Mvvm/Contracts/ISnackbarService.cs @@ -0,0 +1,108 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Threading.Tasks; +using RevitLookup.UI.Common; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Mvvm.Contracts; + +/// +/// Represents a contract with the service that provides global . +/// +public interface ISnackbarService +{ + /// + /// Gets the information whether the is visible. + /// + bool IsShown { get; } + + /// + /// Gets or sets a time for which the should be visible. + /// + int Timeout { get; set; } + + /// + /// Sets the used in the service. Typically this control is defined in the main window. + /// + void SetSnackbarControl(ISnackbarControl snackbar); + + /// + /// Gets the used in the service. + /// + ISnackbarControl GetSnackbarControl(); + + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// if invocation of method succeeded, Exception otherwise. + bool Show(); + + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// if invocation of method succeeded, Exception otherwise. + bool Show(string title); + + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// if invocation of method succeeded, Exception otherwise. + bool Show(string title, string message); + + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// Icon on the left. + /// if invocation of method succeeded, Exception otherwise. + bool Show(string title, string message, SymbolRegular icon); + + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// if the operation was successful. + Task ShowAsync(); + + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// if the operation was successful. + Task ShowAsync(string title); + + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// if the operation was successful. + Task ShowAsync(string title, string message); + + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// on the left. + /// if the operation was successful. + Task ShowAsync(string title, string message, SymbolRegular icon); + + /// + /// Hides the snackbar based on the selected animation, if control is visible. + /// + /// if invocation of method succeeded, Exception otherwise. + bool Hide(); + + /// + /// Asynchronously hides the snackbar based on the selected animation, if control is visible. + /// + /// if the operation was successful. + Task HideAsync(); +} diff --git a/RevitLookup.UI/Mvvm/Contracts/ITaskbarService.cs b/RevitLookup.UI/Mvvm/Contracts/ITaskbarService.cs new file mode 100644 index 000000000..306489e23 --- /dev/null +++ b/RevitLookup.UI/Mvvm/Contracts/ITaskbarService.cs @@ -0,0 +1,90 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows; +using RevitLookup.UI.TaskBar; + +namespace RevitLookup.UI.Mvvm.Contracts; + +/// +/// Represents a contract with a service that provides methods for manipulating the taskbar. +/// +public interface ITaskBarService +{ + /// + /// Gets taskbar state of the selected window handle. + /// + /// Window handle. + TaskBarProgressState GetState(IntPtr hWnd); + + /// + /// Gets taskbar state of the selected window. + /// + /// Selected window. + TaskBarProgressState GetState(Window window); + + /// + /// Sets taskbar state of the application main window. + /// + /// Progress sate to set. + //bool SetState(ProgressState progressState); + + /// + /// Sets taskbar value of the application main window. + /// + /// Current value to display. + /// Maximum number for division. + //bool SetValue(int current, int max); + + /// + /// Sets taskbar state of the selected window handle. + /// + /// Window handle to modify. + /// Progress sate to set. + bool SetState(IntPtr hWnd, TaskBarProgressState taskBarProgressState); + + /// + /// Sets taskbar value of the selected window handle. + /// + /// Window handle to modify. + /// Progress sate to set. + /// Current value to display. + /// Maximum number for division. + bool SetValue(IntPtr hWnd, TaskBarProgressState taskBarProgressState, int current, int total); + + /// + /// Sets taskbar value of the selected window handle. + /// + /// Window handle to modify. + /// Current value to display. + /// Maximum number for division. + bool SetValue(IntPtr hWnd, int current, int max); + + /// + /// Sets taskbar state of the selected window. + /// + /// Window to modify. + /// Progress sate to set. + bool SetState(Window window, TaskBarProgressState taskBarProgressState); + + /// + /// Sets taskbar value of the selected window. + /// + /// Window to modify. + /// Progress sate to set. + /// Current value to display. + /// Maximum number for division. + bool SetValue(Window window, TaskBarProgressState taskBarProgressState, int current, int total); + + /// + /// Sets taskbar value of the selected window. + /// + /// Window to modify. + /// Current value to display. + /// Maximum number for division. + bool SetValue(Window window, int current, int total); +} + diff --git a/RevitLookup.UI/Mvvm/Contracts/IThemeService.cs b/RevitLookup.UI/Mvvm/Contracts/IThemeService.cs new file mode 100644 index 000000000..65ba0032e --- /dev/null +++ b/RevitLookup.UI/Mvvm/Contracts/IThemeService.cs @@ -0,0 +1,52 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows.Media; +using RevitLookup.UI.Appearance; + +namespace RevitLookup.UI.Mvvm.Contracts; + +/// +/// Represents a contract with a service that provides tools for manipulating the theme. +/// +public interface IThemeService +{ + /// + /// Gets current application theme. + /// + ThemeType GetTheme(); + + /// + /// Gets current system theme. + /// + ThemeType GetSystemTheme(); + + /// + /// Gets current system theme. + /// + SystemThemeType GetNativeSystemTheme(); + + /// + /// Sets current application theme. + /// + /// Theme type to set. + bool SetTheme(ThemeType themeType); + + /// + /// Sets currently used Windows OS accent. + /// + bool SetSystemAccent(); + + /// + /// Sets current application accent. + /// + bool SetAccent(Color accentColor); + + /// + /// Sets current application accent. + /// + bool SetAccent(SolidColorBrush accentSolidBrush); +} + diff --git a/RevitLookup.UI/Mvvm/Interfaces/IViewModel.cs b/RevitLookup.UI/Mvvm/Interfaces/IViewModel.cs new file mode 100644 index 000000000..7c3e3a2cc --- /dev/null +++ b/RevitLookup.UI/Mvvm/Interfaces/IViewModel.cs @@ -0,0 +1,21 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Mvvm.Interfaces; + +/// +/// Represents a model used in views. +/// +public interface IViewModel +{ + /// + /// Triggered when the model is mounted to the view using the . + /// + /// + public void OnMounted(FrameworkElement parentElement); +} diff --git a/RevitLookup.UI/Mvvm/Services/DialogService.cs b/RevitLookup.UI/Mvvm/Services/DialogService.cs new file mode 100644 index 000000000..08e6080a4 --- /dev/null +++ b/RevitLookup.UI/Mvvm/Services/DialogService.cs @@ -0,0 +1,36 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +#nullable enable + +using System; +using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Mvvm.Contracts; + +namespace RevitLookup.UI.Mvvm.Services; + +/// +/// A service that provides methods related to displaying the . +/// +public class DialogService : IDialogService +{ + private IDialogControl? _dialogControl; + + /// + public void SetDialogControl(IDialogControl dialog) + { + _dialogControl = dialog; + } + + /// + public IDialogControl GetDialogControl() + { + if (_dialogControl is null) + throw new InvalidOperationException( + $"The ${typeof(DialogService)} cannot be used unless previously defined with {typeof(IDialogControl)}.{nameof(SetDialogControl)}()."); + + return _dialogControl; + } +} diff --git a/RevitLookup.UI/Mvvm/Services/NavigationService.cs b/RevitLookup.UI/Mvvm/Services/NavigationService.cs new file mode 100644 index 000000000..feb542b3c --- /dev/null +++ b/RevitLookup.UI/Mvvm/Services/NavigationService.cs @@ -0,0 +1,97 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows.Controls; +using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Mvvm.Contracts; + +namespace RevitLookup.UI.Mvvm.Services; + +/// +/// A service that provides methods related to navigation. +/// +public partial class NavigationService : INavigationService +{ + /// + /// Locally attached page service. + /// + private IPageService _pageService; + + /// + /// Control representing navigation. + /// + protected INavigation NavigationControl; + + /// + public Frame GetFrame() + { + return NavigationControl?.Frame; + } + + /// + public void SetFrame(Frame frame) + { + if (NavigationControl == null) + return; + + NavigationControl.Frame = frame; + } + + /// + public INavigation GetNavigationControl() + { + return NavigationControl; + } + + /// + public void SetNavigationControl(INavigation navigation) + { + NavigationControl = navigation; + + if (_pageService != null) + NavigationControl.PageService = _pageService; + } + + /// + public void SetPageService(IPageService pageService) + { + if (NavigationControl == null) + { + _pageService = pageService; + + return; + } + + NavigationControl.PageService = pageService; + } + + /// + public bool Navigate(Type pageType) + { + if (NavigationControl == null) + return false; + + return NavigationControl.Navigate(pageType); + } + + /// + public bool Navigate(int pageId) + { + if (NavigationControl == null) + return false; + + return NavigationControl.Navigate(pageId); + } + + /// + public bool Navigate(string pageTag) + { + if (NavigationControl == null) + return false; + + return NavigationControl.Navigate(pageTag); + } +} diff --git a/RevitLookup.UI/Mvvm/Services/NotifyIconService.cs b/RevitLookup.UI/Mvvm/Services/NotifyIconService.cs new file mode 100644 index 000000000..cffcb4d4b --- /dev/null +++ b/RevitLookup.UI/Mvvm/Services/NotifyIconService.cs @@ -0,0 +1,132 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.ComponentModel; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using RevitLookup.UI.Mvvm.Contracts; + +namespace RevitLookup.UI.Mvvm.Services; + +/// +/// Base implementation of the notify icon service. +/// +public class NotifyIconService : INotifyIconService +{ + private readonly UI.Services.Internal.NotifyIconService _notifyIconService; + + public Window ParentWindow { get; internal set; } = (Window)null!; + + public int Id => _notifyIconService.Id; + + public bool IsRegistered => _notifyIconService.IsRegistered; + + public string TooltipText + { + get => _notifyIconService.TooltipText; + set => _notifyIconService.TooltipText = value; + } + + public ContextMenu ContextMenu + { + get => _notifyIconService.ContextMenu; + set => _notifyIconService.ContextMenu = value; + } + + public ImageSource Icon + { + get => _notifyIconService.Icon; + set => _notifyIconService.Icon = value; + } + + public NotifyIconService() + { + _notifyIconService = new UI.Services.Internal.NotifyIconService(); + + RegisterHandlers(); + } + + public bool Register() + { + if (ParentWindow != null) + return _notifyIconService.Register(ParentWindow); + + return _notifyIconService.Register(); + } + + public bool Unregister() + { + return _notifyIconService.Unregister(); + } + + /// + public void SetParentWindow(Window parentWindow) + { + if (ParentWindow != null) + ParentWindow.Closing -= OnParentWindowClosing; + + ParentWindow = parentWindow; + ParentWindow.Closing += OnParentWindowClosing; + } + + /// + /// This virtual method is called when the user clicks the left mouse button on the tray icon. + /// + protected virtual void OnLeftClick() + { + } + + /// + /// This virtual method is called when the user double-clicks the left mouse button on the tray icon. + /// + protected virtual void OnLeftDoubleClick() + { + } + + /// + /// This virtual method is called when the user clicks the right mouse button on the tray icon. + /// + protected virtual void OnRightClick() + { + } + + /// + /// This virtual method is called when the user double-clicks the right mouse button on the tray icon. + /// + protected virtual void OnRightDoubleClick() + { + } + + /// + /// This virtual method is called when the user clicks the middle mouse button on the tray icon. + /// + protected virtual void OnMiddleClick() + { + } + + /// + /// This virtual method is called when the user double-clicks the middle mouse button on the tray icon. + /// + protected virtual void OnMiddleDoubleClick() + { + } + + private void OnParentWindowClosing(object sender, CancelEventArgs e) + { + _notifyIconService.Dispose(); + } + + private void RegisterHandlers() + { + _notifyIconService.LeftClick += OnLeftClick; + _notifyIconService.LeftDoubleClick += OnLeftDoubleClick; + _notifyIconService.RightClick += OnRightClick; + _notifyIconService.RightDoubleClick += OnRightDoubleClick; + _notifyIconService.MiddleClick += OnMiddleClick; + _notifyIconService.MiddleDoubleClick += OnMiddleDoubleClick; + } +} + diff --git a/RevitLookup.UI/Mvvm/Services/SnackbarService.cs b/RevitLookup.UI/Mvvm/Services/SnackbarService.cs new file mode 100644 index 000000000..17cba3ebc --- /dev/null +++ b/RevitLookup.UI/Mvvm/Services/SnackbarService.cs @@ -0,0 +1,165 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +#nullable enable + +using System; +using System.Threading.Tasks; +using RevitLookup.UI.Common; +using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Mvvm.Contracts; + +namespace RevitLookup.UI.Mvvm.Services; + +/// +/// A service that provides methods related to displaying the . +/// +public class SnackbarService : ISnackbarService +{ + private ISnackbarControl? _snackbar; + + /// + public bool IsShown + { + get + { + if (_snackbar == null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return _snackbar.IsShown; + } + } + + /// + public int Timeout + { + get => _snackbar?.Timeout ?? 0; + set + { + if (_snackbar == null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + _snackbar.Timeout = value; + } + } + + /// + public void SetSnackbarControl(ISnackbarControl snackbar) + { + _snackbar = snackbar; + } + + /// + public ISnackbarControl GetSnackbarControl() + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return _snackbar; + } + + /// + public bool Show() + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return _snackbar.Show(); + } + + /// + public bool Show(string title) + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return _snackbar.Show(title); + } + + /// + public bool Show(string title, string message) + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return _snackbar.Show(title, message); + } + + /// + public bool Show(string title, string message, SymbolRegular icon) + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return _snackbar.Show(title, message, icon); + } + + /// + public async Task ShowAsync() + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return await _snackbar.ShowAsync(); + } + + /// + public async Task ShowAsync(string title) + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return await _snackbar.ShowAsync(title); + } + + /// + public async Task ShowAsync(string title, string message) + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return await _snackbar.ShowAsync(title, message); + } + + /// + public async Task ShowAsync(string title, string message, SymbolRegular icon) + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return await _snackbar.ShowAsync(title, message, icon); + } + + /// + public bool Hide() + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return _snackbar.Hide(); + } + + /// + public async Task HideAsync() + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return await _snackbar.HideAsync(); + } +} diff --git a/RevitLookup.UI/Mvvm/Services/TaskbarService.cs b/RevitLookup.UI/Mvvm/Services/TaskbarService.cs new file mode 100644 index 000000000..1ccf620c4 --- /dev/null +++ b/RevitLookup.UI/Mvvm/Services/TaskbarService.cs @@ -0,0 +1,104 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Interop; +using RevitLookup.UI.Mvvm.Contracts; +using RevitLookup.UI.TaskBar; + +namespace RevitLookup.UI.Mvvm.Services; + +/// +/// Allows you to manage the animations of the window icon in the taskbar. +/// +public partial class TaskBarService : ITaskBarService +{ + private volatile Dictionary _progressStates; + + /// + /// Creates new instance and defines dictionary for progress states. + /// + public TaskBarService() + { + _progressStates = new Dictionary(); + } + + /// + public virtual TaskBarProgressState GetState(IntPtr hWnd) + { + if (!_progressStates.TryGetValue(hWnd, out var progressState)) + return TaskBarProgressState.None; + + return progressState; + } + + /// + public virtual TaskBarProgressState GetState(Window window) + { + if (window == null) + return TaskBarProgressState.None; + + var windowHandle = new WindowInteropHelper(window).Handle; + + if (!_progressStates.TryGetValue(windowHandle, out var progressState)) + return TaskBarProgressState.None; + + return progressState; + } + + /// + public virtual bool SetState(Window window, TaskBarProgressState taskBarProgressState) + { + if (window == null) + return false; + + return TaskBarProgress.SetState(window, taskBarProgressState); + } + + /// + public virtual bool SetValue(Window window, TaskBarProgressState taskBarProgressState, int current, int total) + { + if (window == null) + return false; + + return TaskBarProgress.SetValue(window, taskBarProgressState, current, total); + } + + /// + public virtual bool SetValue(Window window, int current, int total) + { + if (window == null) + return false; + + var windowHandle = new WindowInteropHelper(window).Handle; + + if (!_progressStates.TryGetValue(windowHandle, out var progressState)) + return TaskBarProgress.SetValue(window, TaskBarProgressState.Normal, current, total); + + return TaskBarProgress.SetValue(window, progressState, current, total); + } + + /// + public virtual bool SetState(IntPtr hWnd, TaskBarProgressState taskBarProgressState) + { + return TaskBarProgress.SetState(hWnd, taskBarProgressState); + } + + public virtual bool SetValue(IntPtr hWnd, TaskBarProgressState taskBarProgressState, int current, int total) + { + return TaskBarProgress.SetValue(hWnd, taskBarProgressState, current, total); + } + + /// + public virtual bool SetValue(IntPtr hWnd, int current, int total) + { + if (!_progressStates.TryGetValue(hWnd, out var progressState)) + return TaskBarProgress.SetValue(hWnd, TaskBarProgressState.Normal, current, total); + + return TaskBarProgress.SetValue(hWnd, progressState, current, total); + } +} diff --git a/RevitLookup.UI/Mvvm/Services/ThemeService.cs b/RevitLookup.UI/Mvvm/Services/ThemeService.cs new file mode 100644 index 000000000..c4418ecdd --- /dev/null +++ b/RevitLookup.UI/Mvvm/Services/ThemeService.cs @@ -0,0 +1,73 @@ +using System; +using System.Windows.Media; +using RevitLookup.UI.Appearance; +using RevitLookup.UI.Mvvm.Contracts; + +namespace RevitLookup.UI.Mvvm.Services; + +/// +/// Lets you set the app theme. +/// +public partial class ThemeService : IThemeService +{ + /// + public virtual ThemeType GetTheme() => Theme.GetAppTheme(); + + /// + public virtual SystemThemeType GetNativeSystemTheme() => Theme.GetSystemTheme(); + + /// + public virtual ThemeType GetSystemTheme() + { + var systemTheme = Theme.GetSystemTheme(); + + return systemTheme switch + { + SystemThemeType.Light => ThemeType.Light, + SystemThemeType.Dark => ThemeType.Dark, + SystemThemeType.Glow => ThemeType.Dark, + SystemThemeType.CapturedMotion => ThemeType.Dark, + SystemThemeType.Sunrise => ThemeType.Light, + SystemThemeType.Flow => ThemeType.Light, + _ => ThemeType.Unknown + }; + } + + /// + public virtual bool SetTheme(ThemeType themeType) + { + if (Theme.GetAppTheme() == themeType) + return false; + + Theme.Apply(themeType); + + return true; + } + + /// + public bool SetSystemAccent() + { + Accent.ApplySystemAccent(); + + return true; + } + + /// + public bool SetAccent(Color accentColor) + { + Accent.Apply(accentColor); + + return true; + } + + /// + public bool SetAccent(SolidColorBrush accentSolidBrush) + { + var color = accentSolidBrush.Color; + color.A = (byte)Math.Round(accentSolidBrush.Opacity * byte.MaxValue); + + Accent.Apply(color); + + return true; + } +} diff --git a/RevitLookup.UI/Notifications/Toast.cs b/RevitLookup.UI/Notifications/Toast.cs index 55876a1fa..4a390d80e 100644 --- a/RevitLookup.UI/Notifications/Toast.cs +++ b/RevitLookup.UI/Notifications/Toast.cs @@ -8,4 +8,4 @@ namespace RevitLookup.UI.Notifications; internal class Toast { // TODO: Implement native Toast without external libraries -} \ No newline at end of file +} diff --git a/RevitLookup.UI/RevitLookup.UI.csproj b/RevitLookup.UI/RevitLookup.UI.csproj index 2327e50c8..4219ad88a 100644 --- a/RevitLookup.UI/RevitLookup.UI.csproj +++ b/RevitLookup.UI/RevitLookup.UI.csproj @@ -1,34 +1,74 @@ - - - true - 0.0.1 - latest - x64 - true - net48 - Debug;Release - - - true - full - $(DefineConstants);DEBUG - - - true - none - $(DefineConstants);RELEASE - - - true - false - + + + true + 0.0.1 + latest + x64 + true + net48 + true + Debug;Release + true + + + true + full + $(DefineConstants);DEBUG + + + true + none + $(DefineConstants);RELEASE + + + true + false + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RevitLookup.UI/Services/Internal/NavigationService.cs b/RevitLookup.UI/Services/Internal/NavigationService.cs new file mode 100644 index 000000000..9a7e5f37c --- /dev/null +++ b/RevitLookup.UI/Services/Internal/NavigationService.cs @@ -0,0 +1,839 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Navigation; +using RevitLookup.UI.Animations; +using RevitLookup.UI.Common; +using RevitLookup.UI.Common.Interfaces; +using RevitLookup.UI.Controls.Interfaces; +using RevitLookup.UI.Mvvm.Contracts; +using RevitLookup.UI.Mvvm.Interfaces; + +namespace RevitLookup.UI.Services.Internal; + +// NOTE: +// This class is taped combining many weird tricks +// and workarounds. Please don't judge me, +// I'm just a student with a bit of free time + +/// +/// Internal navigation service. +/// +internal sealed class NavigationService : IDisposable +{ + #region Private properties + + /// + /// Whether the current class is disposed. + /// + private bool _disposed = false; + + /// + /// Currently navigated page index. + /// + private int _currentPageIndex = -1; + + /// + /// Previously navigated page index. + /// + private int _previousPageIndex = -1; + + /// + /// Current frame. + /// + private Frame? _frame; + + /// + /// MVVM page service. + /// + private IPageService? _pageService; + + /// + /// Current . + /// + private long _currentActionIdentifier { get; set; } + + /// + /// Identifies current Frame process. + /// + private readonly EventIdentifier _eventIdentifier; + + /// + /// 's mirror with cached page contents. + /// + private NavigationServiceItem[] _navigationServiceItems; + + /// + /// + /// + private readonly List _history; + + private bool _isBackNavigated; + + #endregion Private properties + + #region Public properties + + /// + /// Whether to precache instances after rebuilding. + /// + public bool Precache { get; set; } = false; + + /// + /// Transition duration. + /// + public int TransitionDuration { get; set; } + + /// + /// Transition type. + /// + public TransitionType TransitionType { get; set; } + + /// + /// Indicates the possibility of navigation back + /// + public bool CanGoBack => _history.Count > 1; + + #endregion Public properties + + #region Constructors + + /// + /// Creates new instance and prepares internal properties. + /// + public NavigationService() + { + _eventIdentifier = new EventIdentifier(); + _navigationServiceItems = new NavigationServiceItem[] { }; + _history = new List(); + } + + /// + /// Control finalizer. + /// + ~NavigationService() + { + Dispose(false); + } + + #endregion Constructors + + #region Public methods + + public bool NavigateBack() + { + if (_history.Count <= 1) + return false; + + _isBackNavigated = true; + + return NavigateInternal(_history[_history.Count - 2], null!); + } + + /// + /// Navigates the based on provided item Id. + /// + /// Id of the selected page. + /// Additional . + /// + public bool Navigate(int pageId, object dataContext) + { + return NavigateInternal(pageId, dataContext); + } + + /// + /// Navigates the based on provided item . + /// + /// of the selected page. + /// Additional . + /// + public bool Navigate(Type pageType, object dataContext) + { + var selectedIndex = -1; + + for (var i = 0; i < _navigationServiceItems.Length; i++) + { + if (_navigationServiceItems[i].Type != pageType) + continue; + + selectedIndex = i; + + break; + } + + if (selectedIndex >= 0) + return NavigateInternal(selectedIndex, dataContext); + + if (_pageService == null) + return false; + + var servicePageInstance = _pageService.GetPage(pageType); + + if (servicePageInstance == null) + throw new InvalidOperationException($"The {pageType} has not been registered in the {typeof(IPageService)} service."); + + _previousPageIndex = _currentPageIndex; + _currentPageIndex = -1; + + _currentActionIdentifier = _eventIdentifier.GetNext(); + + _frame?.Navigate(servicePageInstance); + + return true; + } + + /// + /// Navigates the based on provided item tag. + /// + /// Tag of the page. + /// Additional . + /// + public bool Navigate(string pageTag, object dataContext) + { + var selectedIndex = -1; + + for (var i = 0; i < _navigationServiceItems.Length; i++) + { + if (_navigationServiceItems[i].Tag != pageTag) + continue; + + selectedIndex = i; + + break; + } + + if (selectedIndex < 0) + return false; + + return NavigateInternal(selectedIndex, dataContext); + } + + /// + /// Navigates statically outside of the current navigation scope. + /// + /// to navigate. + /// Additional . + public bool NavigateExternal(object frameworkElement, object dataContext) + { + if (_frame == null) + return false; + + if (frameworkElement is not FrameworkElement) + throw new InvalidOperationException($"Only class derived {typeof(FrameworkElement)} can be used for navigation."); + + _previousPageIndex = _currentPageIndex; + _currentPageIndex = -1; + + _currentActionIdentifier = _eventIdentifier.GetNext(); + + _frame.Navigate( + frameworkElement, + new NavigationServiceExtraData + { + PageId = -1, + Cache = false, + DataContext = dataContext + }); + + return true; + } + + /// + /// Navigates statically outside of the current navigation scope. + /// + /// Uri of the to navigate. + /// Additional . + public bool NavigateExternal(Uri frameworkElementUri, object dataContext) + { + if (_frame == null) + return false; + + if (!frameworkElementUri.IsAbsoluteUri) + throw new InvalidOperationException($"Navigation Uri must be absolute Uri pointing to an element derived from {typeof(FrameworkElement)}."); + + _previousPageIndex = _currentPageIndex; + _currentPageIndex = -1; + + _currentActionIdentifier = _eventIdentifier.GetNext(); + + _frame.Navigate( + frameworkElementUri, + new NavigationServiceExtraData + { + PageId = -1, + Cache = false, + DataContext = dataContext + }); + + return true; + } + + /// + /// Sets DataContext for the selected instance. + /// + /// Tag of the page. + /// Context to set. + public bool SetContext(string pageTag, object dataContext) + { + for (var i = 0; i < _navigationServiceItems.Length; i++) + { + if (_navigationServiceItems[i].Tag != pageTag) + continue; + + if (_navigationServiceItems[i].Instance is not FrameworkElement) + return false; + + ((FrameworkElement)_navigationServiceItems[i].Instance).DataContext = dataContext; + + return true; + } + + return false; + } + + /// + /// Sets DataContext for the selected instance. + /// + /// Selected page Id. + /// Context to set. + public bool SetContext(int serviceItemId, object dataContext) + { + if (_navigationServiceItems.Length - 1 < serviceItemId) + return false; + + if (_navigationServiceItems[serviceItemId].Instance is not FrameworkElement) + return false; + + ((FrameworkElement)_navigationServiceItems[serviceItemId].Instance).DataContext = dataContext; + + return true; + } + + /// + /// Creates mirror of based on provided collection of 's. + /// + public void UpdateItems(IEnumerable? mainItems, IEnumerable? additionalItems) + { + var serviceItemCollection = new List { }; + + if (mainItems != null) + foreach (var singleNavigationControl in mainItems) + { + if (singleNavigationControl is not INavigationItem navigationItem) + continue; + + serviceItemCollection.Add(NavigationServiceItem.Create(navigationItem)); + } + + if (additionalItems != null) + foreach (var singleNavigationControl in additionalItems) + { + if (singleNavigationControl is not INavigationItem navigationItem) + continue; + + serviceItemCollection.Add(NavigationServiceItem.Create(navigationItem)); + } + + _navigationServiceItems = serviceItemCollection.ToArray(); + + // Should we precache here? It can be intensive cause the update can be fired multiple times during initialization + //if (Precache) + //{ + //} + } + + /// + /// Clears cache stored inside service items. + /// + public void ClearCache() + { + foreach (var singleServiceItem in _navigationServiceItems) + singleServiceItem.Instance = null; + } + + /// + /// Sets currently used . + /// + /// Frame to set. + public void SetFrame(Frame frame) + { + if (frame == null) + return; + + _frame = frame; + + _frame.NavigationUIVisibility = NavigationUIVisibility.Hidden; + + _frame.Navigating -= OnFrameNavigating; // Unsafe, but doubling can be catastrophic + _frame.Navigating += OnFrameNavigating; + + _frame.Navigated -= OnFrameNavigated; // Unsafe, but doubling can be catastrophic + _frame.Navigated += OnFrameNavigated; + } + + /// + /// Sets currently used . + /// + /// Service to set. + public void SetService(IPageService pageService) + { + _pageService = pageService; + } + + /// + /// Gets currently used . + /// + public IPageService? GetService() + { + return _pageService ?? null; + } + + /// + /// Gets currently displayed item tag. + /// + public string GetCurrentTag() + { + if (_currentPageIndex < 0) + return "__external__"; + + if (_navigationServiceItems.Length == 0) + return string.Empty; + + if (_navigationServiceItems.Length - 1 < _currentPageIndex) + return string.Empty; + + return _navigationServiceItems[_currentPageIndex].Tag; + } + + /// + /// Currently displayed page Id. + /// + public int GetCurrentId() + { + return _currentPageIndex; + } + + /// + /// Previously displayed page Id. + /// + public int GetPreviousId() + { + return _previousPageIndex; + } + + #endregion Public methods + + #region Disposing + + /// + public void Dispose() + { + Dispose(true); + + GC.SuppressFinalize(this); + } + + /// + /// If disposing equals , the method has been called directly or indirectly + /// by a user's code. Managed and unmanaged resources can be disposed. If disposing equals , + /// the method has been called by the runtime from inside the finalizer and you should not + /// reference other objects. + /// Only unmanaged resources can be disposed. + /// + /// If disposing equals , dispose all managed and unmanaged resources. + private void Dispose(bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (!disposing) + return; + + _navigationServiceItems = null; + } + + #endregion Disposing + + #region Internal navigation + + /// + /// Navigates internally depending on current state of the service. + /// + /// Id of the item to navigate. + /// Additional . + /// + private bool NavigateInternal(int serviceItemId, object dataContext) + { + if (!_navigationServiceItems.Any()) + return false; + + _currentActionIdentifier = _eventIdentifier.GetNext(); + + if (_navigationServiceItems.Length - 1 < serviceItemId) + return false; + + // The navigation item is the same, skip the navigation + if (_currentPageIndex == serviceItemId) + return false; + + // An empty navigation item may be just a button, but as navigation fails, so return false. + if (_navigationServiceItems[serviceItemId].Type == null && + _navigationServiceItems[serviceItemId].Source == null) + return false; + + _previousPageIndex = _currentPageIndex; + _currentPageIndex = serviceItemId; + + if (_pageService != null) + return NavigateInternalByService(serviceItemId); + + + if (!_navigationServiceItems[serviceItemId].Cache) + return NavigateInternalByItemWithoutCache(serviceItemId, dataContext); + + return NavigateInternalByItemWithCache(serviceItemId, dataContext); + } + + /// + /// Navigates internally without service and with enabled cache. + /// + private bool NavigateInternalByItemWithCache(int serviceItemId, object dataContext) + { + if (_frame == null) + return false; + + if (_navigationServiceItems.Length - 1 < serviceItemId) + return false; + + // Navigate internally, with cache enabled, instance does exist so reuse it + if (_navigationServiceItems[serviceItemId].Instance != null) + { + // Sometimes a user may want to update the context of a page that is already in the cache. + if (dataContext != null && _navigationServiceItems[serviceItemId].Instance is FrameworkElement) + ((FrameworkElement)_navigationServiceItems[serviceItemId].Instance).DataContext = dataContext; + + _frame.Navigate( + _navigationServiceItems[serviceItemId].Instance, + new NavigationServiceExtraData + { + PageId = serviceItemId, + Cache = true, + DataContext = dataContext + }); + + AddToHistory(serviceItemId); + return true; + } + + // Navigate internally, with cache enabled, instance does not exist so create it using type + if (_navigationServiceItems[serviceItemId].Type != null) + { + _navigationServiceItems[serviceItemId].Instance = CreateFrameworkElementInstance(_navigationServiceItems[serviceItemId].Type, dataContext); + + _frame.Navigate( + _navigationServiceItems[serviceItemId].Instance, + new NavigationServiceExtraData + { + PageId = serviceItemId, + Cache = true, + DataContext = null // DataContext used + }); + + AddToHistory(serviceItemId); + return true; + } + + // Navigate internally, with cache enabled, instance does not exist so create it using source + if (_navigationServiceItems[serviceItemId].Source != null) + { + _frame.Navigate( + _navigationServiceItems[serviceItemId].Source, + new NavigationServiceExtraData + { + PageId = serviceItemId, + Cache = true, + DataContext = dataContext + }); + + AddToHistory(serviceItemId); + return true; + } + + return false; + } + + /// + /// Navigates internally without service and with cache disabled. + /// + private bool NavigateInternalByItemWithoutCache(int serviceItemId, object dataContext) + { + if (_frame == null) + return false; + + if (_navigationServiceItems.Length - 1 < serviceItemId) + return false; + + // Navigate internally, without cache, based on type + if (_navigationServiceItems[serviceItemId].Type != null) + { + _frame.Navigate( + CreateFrameworkElementInstance + ( + _navigationServiceItems[serviceItemId].Type, + dataContext + ), + new NavigationServiceExtraData + { + PageId = serviceItemId, + Cache = false, + DataContext = null // DataContext set above by activator + }); + AddToHistory(serviceItemId); + return true; + } + + if (_navigationServiceItems[serviceItemId].Source != null) + { + _frame.Navigate( + _navigationServiceItems[serviceItemId].Source, + new NavigationServiceExtraData + { + PageId = serviceItemId, + Cache = false, + DataContext = dataContext + }); + + AddToHistory(serviceItemId); + return true; + } + + // Wait... this should not happen... + return false; + } + + private bool NavigateInternalByService(int serviceItemId) + { + if (_frame == null) + return false; + + if (_navigationServiceItems.Length - 1 < serviceItemId) + return false; + + var servicePageInstance = _pageService.GetPage(_navigationServiceItems[serviceItemId].Type); + + if (servicePageInstance == null) + throw new InvalidOperationException($"The {_navigationServiceItems[serviceItemId].Type} has not been registered in the {typeof(IPageService)} service."); + + _frame.Navigate(servicePageInstance); + AddToHistory(serviceItemId); + + return true; + } + + private void AddToHistory(int serviceItemId) + { + if (_isBackNavigated) + { + _isBackNavigated = false; + _history.RemoveAt(_history.LastIndexOf(_history[_history.Count - 2])); + _history.RemoveAt(_history.LastIndexOf(_history[_history.Count - 1])); + } + + _history.Add(serviceItemId); + } + + #endregion Internal navigation + + #region Instance management + + /// + /// Tries to create an instance from the selected page type. + /// + private FrameworkElement CreateFrameworkElementInstance(Type pageType, object dataContext) + { + return NavigationServiceActivator.CreateInstance(pageType, dataContext); + } + + #endregion Instance management + + #region Frame events + + /// + /// Event triggered when the frame has already loaded the view, if the page uses the Cache, Content of the Frame should be saved. + /// + private void OnFrameNavigated(object sender, NavigationEventArgs e) + { + if (_frame == null) + return; + + if (_frame.CanGoBack) + _frame.RemoveBackEntry(); + + if (_frame.NavigationService.CanGoBack) + _frame.NavigationService?.RemoveBackEntry(); + + if (TransitionDuration > 0 && e.Content != null) + Transitions.ApplyTransition(e.Content, TransitionType, TransitionDuration); + + // If we are using the MVVM model, + // do not perform internal operations on DataContext and Instances. + if (_pageService != null) + { + // Instance and datacontext determined by the service, notify and leave + NotifyFrameContentAboutEnter(); + + return; + } + + if (e.ExtraData is not NavigationServiceExtraData extraData) + { + // Instance determined by the frame, context not provided, notify and leave + NotifyFrameContentAboutEnter(); + + return; + } + + if (!_currentActionIdentifier.Equals(_currentActionIdentifier)) + { + // Only god knows what's broken, but notify anyway and then leave. + NotifyFrameContentAboutEnter(); + + return; + } + + // DataContext provided by the frame extra data, set. + if (extraData.DataContext != null && _frame.Content is FrameworkElement) + { + ((FrameworkElement)_frame.Content).DataContext = extraData.DataContext; + + if (extraData.DataContext is IViewModel) + ((IViewModel)extraData.DataContext).OnMounted((FrameworkElement)_frame.Content); + } + + if (!extraData.Cache) + { + // Instance determined by the frame, context set from extra data, but without cache, notify and leave + NotifyFrameContentAboutEnter(); + + return; + } + + // We make sure that pageId exists, if it is wrong, the fault lies earlier. + if (_navigationServiceItems.Length - 1 < extraData.PageId || extraData.PageId < 0) + { + // Only god knows what's broken, but notify anyway and then leave. + NotifyFrameContentAboutEnter(); + + return; + } + + // If an instance already exists, do not overwrite it. + if (_navigationServiceItems[extraData.PageId].Instance != null) + { + // Instance determined by the frame, context set from extra data, with cache, but instance cached, notify and leave + NotifyFrameContentAboutEnter(); + + return; + } + + // Finally, the navigation took place internally, + // the context was set from extra data, the cache has to be saved, + // so we save it, notify it and this is the end of the method + _navigationServiceItems[extraData.PageId].Instance = _frame.Content; + + NotifyFrameContentAboutEnter(); + } + + /// + /// Event fired when Frame received a request to navigate. + /// + private void OnFrameNavigating(object sender, NavigatingCancelEventArgs e) + { + if (_frame == null) + return; + + NotifyFrameContentAboutLeave(); + + switch (e.NavigationMode) + { + case NavigationMode.Back: + e.Cancel = true; + + if (_currentPageIndex > 0) + Navigate(_currentPageIndex - 1, null); + break; + + case NavigationMode.Forward: + e.Cancel = true; + + if (_currentPageIndex < _navigationServiceItems.Length - 1) + Navigate(_currentPageIndex + 1, null); + break; + } + } + + /// + /// Notifies content about being navigated. + /// + private void NotifyFrameContentAboutEnter() + { + if (_frame == null) + return; + + if (_frame.Content is INavigationAware) + ((INavigationAware)_frame.Content).OnNavigatedTo(); + + if (_frame.Content is INavigableView navigableView && navigableView.ViewModel is INavigationAware) + ((INavigationAware)navigableView.ViewModel).OnNavigatedTo(); + + if (_frame.Content is FrameworkElement && ((FrameworkElement)_frame.Content).DataContext is INavigationAware) + ((INavigationAware)((FrameworkElement)_frame.Content).DataContext).OnNavigatedTo(); + } + + /// + /// Notifies content about leaving the navigation context. + /// + private void NotifyFrameContentAboutLeave() + { + if (_frame == null) + return; + + if (_frame.Content is INavigationAware) + ((INavigationAware)_frame.Content).OnNavigatedFrom(); + + if (_frame.Content is INavigableView navigableView && navigableView.ViewModel is INavigationAware) + ((INavigationAware)navigableView.ViewModel).OnNavigatedFrom(); + + if (_frame.Content is FrameworkElement && ((FrameworkElement)_frame.Content).DataContext is INavigationAware) + ((INavigationAware)((FrameworkElement)_frame.Content).DataContext).OnNavigatedFrom(); + } + + #endregion Frame events + + #region Preache + + /// + /// Precaches instances of the navigation items. + /// + private void PrecacheItems() + { + if (DesignerHelper.IsInDesignMode) + return; + + if (_pageService != null) + return; + } + + #endregion +} diff --git a/RevitLookup.UI/Services/Internal/NavigationServiceActivator.cs b/RevitLookup.UI/Services/Internal/NavigationServiceActivator.cs new file mode 100644 index 000000000..29e417901 --- /dev/null +++ b/RevitLookup.UI/Services/Internal/NavigationServiceActivator.cs @@ -0,0 +1,162 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Reflection; +using RevitLookup.UI.Common; +using RevitLookup.UI.Controls; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Services.Internal; + +/// +/// Internal activator for navigation purposes. +/// +internal static class NavigationServiceActivator +{ + /// + /// Creates new instance of type derived from . + /// + /// to instantiate. + /// Instance of the object or . + public static FrameworkElement CreateInstance(Type pageType) + { + return CreateInstance(pageType, null); + } + + /// + /// Creates new instance of type derived from . + /// + /// to instantiate. + /// Additional context to set. + /// Instance of the object or . + public static FrameworkElement CreateInstance(Type pageType, object dataContext) + { + if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) + throw new InvalidCastException( + $"PageType of the ${typeof(INavigationItem)} must be derived from {typeof(FrameworkElement)}. {pageType} is not."); + + if (DesignerHelper.IsInDesignMode) + return new Page { Content = new TextBlock { Text = "Pages are not rendered while using the Designer. Edit the page template directly." } }; + + FrameworkElement instance; + + if (ControlsServices.ControlsServiceProvider != null) + { + var pageConstructors = pageType.GetConstructors(); + var parameterlessCount = pageConstructors.Count(ctor => ctor.GetParameters().Length == 0); + var parameterfullCount = pageConstructors.Length - parameterlessCount; + + if (parameterlessCount == 1) + { + instance = InvokeParameterlessConstructor(pageType); + } + else if (parameterlessCount == 0 && parameterfullCount > 0) + { + var selectedCtor = FitBestConstructor(pageConstructors, dataContext); + if (selectedCtor == null) + throw new InvalidOperationException($"The {pageType} page does not have a parameterless constructor or the required services have not been configured for dependency injection. Use the static {nameof(ControlsServices)} class to initialize the GUI library with your service provider. If you are using {typeof(Mvvm.Contracts.IPageService)} do not navigate initially and don't use Cache or Precache."); + + instance = InvokeElementConstructor(selectedCtor, dataContext); + SetDataContext(instance, dataContext); + return instance; + } + } + else if (dataContext != null) + { + instance = InvokeElementConstructor(pageType, dataContext); + if (instance != null) + return instance; + } + + var emptyConstructor = FindParameterlessConstructor(pageType); + if (emptyConstructor == null) + throw new InvalidOperationException($"The {pageType} page does not have a parameterless constructor. If you are using {typeof(Mvvm.Contracts.IPageService)} do not navigate initially and don't use Cache or Precache."); + + instance = emptyConstructor.Invoke(null) as FrameworkElement; + SetDataContext(instance, dataContext); + return instance; + } + +#if NET48_OR_GREATER || NETCOREAPP3_0_OR_GREATER + private static object ResolveConstructorParameter(Type tParam, object dataContext) + { + if (dataContext != null && dataContext.GetType() == tParam) + { + return dataContext; + } + + return ControlsServices.ControlsServiceProvider.GetService(tParam); + } + + /// + /// Picks a constructor which has the most satisfiable arguments count. + /// + /// + /// + /// + private static ConstructorInfo FitBestConstructor(ConstructorInfo[] parameterfullCtors, object dataContext) + { + return parameterfullCtors.Select(ctor => + { + var parameters = ctor.GetParameters(); + var argumentResolution = parameters.Select(prm => + { + var resolved = ResolveConstructorParameter(prm.ParameterType, dataContext); + return resolved != null; + }); + var fullyResolved = argumentResolution.All(resolved => resolved == true); + var score = fullyResolved ? parameters.Length : 0; + + return score == 0 ? null : new + { + Constructor = ctor, + Score = score + }; + }) + .Where(cs => cs != null) + .OrderBy(cs => cs.Score) + .FirstOrDefault()?.Constructor; + } + + private static FrameworkElement InvokeElementConstructor(ConstructorInfo ctor, object dataContext) + { + var args = ctor + .GetParameters() + .Select(prm => + ResolveConstructorParameter(prm.ParameterType, dataContext)); + + return ctor.Invoke(args.ToArray()) as FrameworkElement; + } +#endif + + private static FrameworkElement InvokeElementConstructor(Type tPage, object dataContext) + { + var ctor = tPage.GetConstructor(new[] { dataContext.GetType() }); + if (ctor != null) + return ctor.Invoke(new[] { dataContext }) as FrameworkElement; + + return null; + } + + private static ConstructorInfo FindParameterlessConstructor(Type tPage) + { + return tPage.GetConstructor(Type.EmptyTypes); + } + + private static FrameworkElement InvokeParameterlessConstructor(Type tPage) + { + return FindParameterlessConstructor(tPage)?.Invoke(null) as FrameworkElement; + } + + private static void SetDataContext(FrameworkElement element, object dataContext) + { + if (dataContext != null) + element.DataContext = dataContext; + } +} diff --git a/RevitLookup.UI/Services/Internal/NavigationServiceExtraData.cs b/RevitLookup.UI/Services/Internal/NavigationServiceExtraData.cs new file mode 100644 index 000000000..41d9b17cf --- /dev/null +++ b/RevitLookup.UI/Services/Internal/NavigationServiceExtraData.cs @@ -0,0 +1,27 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace RevitLookup.UI.Services.Internal; + +/// +/// Additional data passed through the method. +/// +internal struct NavigationServiceExtraData +{ + /// + /// Current page id. + /// + public int PageId { get; set; } + + /// + /// Whether we should use the cache. + /// + public bool Cache { get; set; } + + /// + /// Additional . + /// + public object DataContext { get; set; } +} diff --git a/RevitLookup.UI/Services/Internal/NavigationServiceItem.cs b/RevitLookup.UI/Services/Internal/NavigationServiceItem.cs new file mode 100644 index 000000000..ef6109460 --- /dev/null +++ b/RevitLookup.UI/Services/Internal/NavigationServiceItem.cs @@ -0,0 +1,71 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows; +using RevitLookup.UI.Controls.Interfaces; + +namespace RevitLookup.UI.Services.Internal; + +/// +/// Represents in internal methods. +/// +internal class NavigationServiceItem +{ + /// + /// Tags of the presented page. + /// + public string Tag { get; set; } = string.Empty; + + /// + /// Whether the cache is active. + /// + public bool Cache { get; set; } = false; + + /// + /// Type of the . + /// + public Type Type { get; set; } = null; + + /// + /// Source of the . + /// + public Uri Source { get; set; } = null; + + /// + /// Instantiated page content. + /// + public object Instance { get; set; } = null; + + /// + /// Sets DataContext of the . + /// + public bool SetContext(object dataContext) + { + if (!Cache) + return false; + + if (Instance is not FrameworkElement) + return false; + + ((FrameworkElement)Instance).DataContext = dataContext; + + return true; + } + + /// + /// Creates from . + /// + public static NavigationServiceItem Create(INavigationItem navigationItem) + { + return new NavigationServiceItem + { + Tag = navigationItem.PageTag, + Type = navigationItem.PageType, + Source = navigationItem.AbsolutePageSource, + Cache = navigationItem.Cache + }; + } +} diff --git a/RevitLookup.UI/Services/Internal/NotifyIconService.cs b/RevitLookup.UI/Services/Internal/NotifyIconService.cs new file mode 100644 index 000000000..a0ea03f4a --- /dev/null +++ b/RevitLookup.UI/Services/Internal/NotifyIconService.cs @@ -0,0 +1,310 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Interop; +using System.Windows.Media; +using RevitLookup.UI.Appearance; +using RevitLookup.UI.Tray; +using RevitLookup.UI.Extensions; + +namespace RevitLookup.UI.Services.Internal; + +/// +/// Internal service for Notify Icon management. +/// +internal class NotifyIconService : IDisposable, INotifyIcon +{ + /// + /// Whether the control is disposed. + /// + protected bool Disposed = false; + + /// + public int Id { get; set; } = -1; + + /// + public bool IsRegistered { get; set; } = false; + + /// + public string TooltipText { get; set; } = string.Empty; + + /// + public ImageSource Icon { get; set; } = null!; + + /// + public HwndSource HookWindow { get; set; } = null!; + + /// + public ContextMenu ContextMenu { get; set; } = null!; + + /// + public bool FocusOnLeftClick { get; set; } = true; + + /// + public bool MenuOnRightClick { get; set; } = true; + + #region Events + + public event NotifyIconEventHandler LeftClick; + + public event NotifyIconEventHandler LeftDoubleClick; + + public event NotifyIconEventHandler RightClick; + + public event NotifyIconEventHandler RightDoubleClick; + + public event NotifyIconEventHandler MiddleClick; + + public event NotifyIconEventHandler MiddleDoubleClick; + + #endregion Events + + /// + /// Provides a set of information for Shell32 to manipulate the icon. + /// + public Interop.Shell32.NOTIFYICONDATA ShellIconData { get; set; } + + public NotifyIconService() + { + Theme.Changed += OnThemeChanged; + } + + /// + /// Default finalizer which call the method. + /// + ~NotifyIconService() + { + Dispose(false); + } + + /// + public void Dispose() + { + Dispose(true); + + GC.SuppressFinalize(this); + } + + /// + public virtual bool Register() + { + IsRegistered = TrayManager.Register(this); + + return IsRegistered; + } + + /// + public virtual bool Register(Window parentWindow) + { + IsRegistered = TrayManager.Register(this, parentWindow); + + return IsRegistered; + } + + /// + public virtual bool Unregister() + { + return TrayManager.Unregister(this); + } + + /// + /// Occurs when the application theme is changing. + /// + protected virtual void OnThemeChanged(ThemeType currentTheme, Color systemAccent) + { + ContextMenu?.UpdateDefaultStyle(); + ContextMenu?.UpdateLayout(); + } + + /// + /// Focus the application main window. + /// + protected virtual void FocusApp() + { + var mainWindow = Application.Current; + + if (mainWindow == null) + return; + + if (mainWindow.WindowState == WindowState.Minimized) + mainWindow.WindowState = WindowState.Normal; + + mainWindow.Show(); + + if (mainWindow.Topmost) + { + mainWindow.Topmost = false; + mainWindow.Topmost = true; + } + else + { + mainWindow.Topmost = true; + mainWindow.Topmost = false; + } + + mainWindow.Focus(); + } + + /// + /// Shows the menu if it has been added. + /// + protected virtual void OpenMenu() + { + if (ContextMenu == null) + return; + + // Without setting the handler window at the front, menu may appear behind the taskbar + Interop.User32.SetForegroundWindow(HookWindow.Handle); + ContextMenuService.SetPlacement(ContextMenu, PlacementMode.MousePoint); + + ContextMenu.ApplyMica(); + ContextMenu.IsOpen = true; + } + + /// + /// This virtual method is called when tray icon is left-clicked and it raises the left click . + /// + protected virtual void OnLeftClick() + { + LeftClick?.Invoke(); + } + + /// + /// This virtual method is called when tray icon is left-clicked and it raises the left double click . + /// + protected virtual void OnLeftDoubleClick() + { + LeftDoubleClick?.Invoke(); + } + + /// + /// This virtual method is called when tray icon is left-clicked and it raises the right click . + /// + protected virtual void OnRightClick() + { + RightClick?.Invoke(); + } + + /// + /// This virtual method is called when tray icon is left-clicked and it raises the right double click . + /// + protected virtual void OnRightDoubleClick() + { + RightDoubleClick?.Invoke(); + } + + /// + /// This virtual method is called when tray icon is left-clicked and it raises the middle click . + /// + protected virtual void OnMiddleClick() + { + MiddleClick?.Invoke(); + } + + /// + /// This virtual method is called when tray icon is left-clicked and it raises the middle double click . + /// + protected virtual void OnMiddleDoubleClick() + { + MiddleDoubleClick?.Invoke(); + } + + /// + /// If disposing equals , the method has been called directly or indirectly + /// by a user's code. Managed and unmanaged resources can be disposed. If disposing equals , + /// the method has been called by the runtime from inside the finalizer and you should not + /// reference other objects. + /// Only unmanaged resources can be disposed. + /// + /// If disposing equals , dispose all managed and unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (Disposed) + return; + + Disposed = true; + + if (!disposing) + return; + + Unregister(); + } + + /// + public IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + var uMsg = (Interop.User32.WM)msg; + + switch (uMsg) + { + case Interop.User32.WM.DESTROY: + Dispose(); + + handled = true; + + return IntPtr.Zero; + + case Interop.User32.WM.NCDESTROY: + handled = false; + + return IntPtr.Zero; + + case Interop.User32.WM.CLOSE: + handled = true; + + return IntPtr.Zero; + } + + if (uMsg != Interop.User32.WM.TRAYMOUSEMESSAGE) + { + handled = false; + + return IntPtr.Zero; + } + + var lMsg = (Interop.User32.WM)lParam; + + switch (lMsg) + { + case Interop.User32.WM.LBUTTONDOWN: + OnLeftClick(); + + if (FocusOnLeftClick) + FocusApp(); + break; + + case Interop.User32.WM.LBUTTONDBLCLK: + OnLeftDoubleClick(); + break; + + case Interop.User32.WM.RBUTTONDOWN: + OnRightClick(); + + if (MenuOnRightClick) + OpenMenu(); + break; + + case Interop.User32.WM.RBUTTONDBLCLK: + OnRightDoubleClick(); + break; + + case Interop.User32.WM.MBUTTONDOWN: + OnMiddleClick(); + break; + + case Interop.User32.WM.MBUTTONDBLCLK: + OnMiddleDoubleClick(); + break; + } + + handled = true; + + return IntPtr.Zero; + } +} diff --git a/RevitLookup.UI/Styles/Assets/Accent.xaml b/RevitLookup.UI/Styles/Assets/Accent.xaml index 4372cc9fb..ab23f24d8 100644 --- a/RevitLookup.UI/Styles/Assets/Accent.xaml +++ b/RevitLookup.UI/Styles/Assets/Accent.xaml @@ -5,28 +5,43 @@ All Rights Reserved. --> - + - - #3379d9 - + #3379d9 - - #559ce4 - - - #80b9ee - - - #add8ff - - - \ No newline at end of file + + + #559ce4 + + #80b9ee + + #add8ff + + + + + + + + + + + + + + + + + + + + + diff --git a/RevitLookup.UI/Styles/Assets/Brushes.xaml b/RevitLookup.UI/Styles/Assets/Brushes.xaml deleted file mode 100644 index 110f954c9..000000000 --- a/RevitLookup.UI/Styles/Assets/Brushes.xaml +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/RevitLookup.UI/Styles/Assets/Fonts.xaml b/RevitLookup.UI/Styles/Assets/Fonts.xaml index 5a2cc48c9..e5d144851 100644 --- a/RevitLookup.UI/Styles/Assets/Fonts.xaml +++ b/RevitLookup.UI/Styles/Assets/Fonts.xaml @@ -3,38 +3,23 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> + - + Segoe Ui - - Segoe Ui - - - - Segoe Fluent Icons - + Segoe Fluent Icons - - pack://application:,,,/RevitLookup.UI;component/Fonts/#FluentSystemIcons-Regular - + pack://application:,,,/RevitLookup.UI;component/Fonts/#FluentSystemIcons-Regular - - pack://application:,,,/RevitLookup.UI;component/Fonts/#FluentSystemIcons-Filled - + pack://application:,,,/RevitLookup.UI;component/Fonts/#FluentSystemIcons-Filled - - pack://application:,,,/RevitLookup.UI;component/Fonts/#Fira Code - + pack://application:,,,/RevitLookup.UI;component/Fonts/#Fira Code - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Assets/Icons.xaml b/RevitLookup.UI/Styles/Assets/Icons.xaml deleted file mode 100644 index abf603f3b..000000000 --- a/RevitLookup.UI/Styles/Assets/Icons.xaml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/RevitLookup.UI/Styles/Assets/Palette.xaml b/RevitLookup.UI/Styles/Assets/Palette.xaml index 1912de2d5..9df8ed270 100644 --- a/RevitLookup.UI/Styles/Assets/Palette.xaml +++ b/RevitLookup.UI/Styles/Assets/Palette.xaml @@ -5,155 +5,53 @@ All Rights Reserved. --> - + - - #333333 - - - #F44336 - - - #E91E63 - - - #9C27B0 - - - #673AB7 - - - #3F51B5 - - - #2196F3 - - - #03A9F4 - - - #00BCD4 - - - #009688 - - - #4CAF50 - - - #8BC34A - - - #CDDC39 - - - #FFEB3B - - - #FFC107 - - - #FF9800 - - - #FF5722 - - - #795548 - - - #9E9E9E - - - #607D8B - + #333333 + #F44336 + #E91E63 + #9C27B0 + #673AB7 + #3F51B5 + #2196F3 + #03A9F4 + #00BCD4 + #009688 + #4CAF50 + #8BC34A + #CDDC39 + #FFEB3B + #FFC107 + #FF9800 + #FF5722 + #795548 + #9E9E9E + #607D8B - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RevitLookup.UI/Styles/Assets/StaticColors.xaml b/RevitLookup.UI/Styles/Assets/StaticColors.xaml index 04cac9794..d46bf1e65 100644 --- a/RevitLookup.UI/Styles/Assets/StaticColors.xaml +++ b/RevitLookup.UI/Styles/Assets/StaticColors.xaml @@ -5,114 +5,42 @@ All Rights Reserved. --> - + - - #FFFFFF - - - #C5FFFFFF - - - #87FFFFFF - - - #5DFFFFFF - - - #E4000000 - + #FFFFFF + #C5FFFFFF + #87FFFFFF + #5DFFFFFF + #E4000000 - - - - - + + + + + - - #E4000000 - - - #BE000000 - - - #A2000000 - - - #5C000000 - - - #FFFFFF - + #E4000000 + #BE000000 + #A2000000 + #5C000000 + #FFFFFF - - - - - + + + + + - - #FFFAFAFA - - + #FFFAFAFA + - - #FF202020 - - + #FF202020 + - - #B3FFFFFF - - + #B3FFFFFF + - - #72000000 - - + #72000000 + - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Assets/Variables.xaml b/RevitLookup.UI/Styles/Assets/Variables.xaml new file mode 100644 index 000000000..bc3e99b29 --- /dev/null +++ b/RevitLookup.UI/Styles/Assets/Variables.xaml @@ -0,0 +1,57 @@ + + + + 16 + + 14 + 4,4,4,4 + 4,4,4,4 + 8,8,8,8 + + + + + + 1 + 2 + 10,8,10,7 + + 14 + 24 + 0 + 32 + 24 + 24 + 0 + 0 + + 0,1,0,2 + 0,1,0,2 + 9,0,0,1 + 10,0,30,0 + + 24 + 12,1,0,3 + 32 + + + \ No newline at end of file diff --git a/RevitLookup.UI/Styles/Common/ContextMenu.xaml b/RevitLookup.UI/Styles/Common/ContextMenu.xaml new file mode 100644 index 000000000..b7cbb0c07 --- /dev/null +++ b/RevitLookup.UI/Styles/Common/ContextMenu.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/RevitLookup.UI/Styles/Common/FocusVisualStyle.xaml b/RevitLookup.UI/Styles/Common/FocusVisualStyle.xaml new file mode 100644 index 000000000..6366427e6 --- /dev/null +++ b/RevitLookup.UI/Styles/Common/FocusVisualStyle.xaml @@ -0,0 +1,27 @@ + + + + + + + - \ No newline at end of file + + + + + - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/Breadcrumb.xaml b/RevitLookup.UI/Styles/Controls/Breadcrumb.xaml index c12555f9a..d4329225d 100644 --- a/RevitLookup.UI/Styles/Controls/Breadcrumb.xaml +++ b/RevitLookup.UI/Styles/Controls/Breadcrumb.xaml @@ -10,52 +10,30 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:RevitLookup.UI.Controls"> - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/Button.xaml b/RevitLookup.UI/Styles/Controls/Button.xaml index b3cee0c18..3e686d6ee 100644 --- a/RevitLookup.UI/Styles/Controls/Button.xaml +++ b/RevitLookup.UI/Styles/Controls/Button.xaml @@ -3,6 +3,9 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> - - - - \ No newline at end of file + - - - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/CardAction.xaml b/RevitLookup.UI/Styles/Controls/CardAction.xaml index 632bdcbca..bc2703498 100644 --- a/RevitLookup.UI/Styles/Controls/CardAction.xaml +++ b/RevitLookup.UI/Styles/Controls/CardAction.xaml @@ -3,126 +3,133 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> + xmlns:controls="clr-namespace:RevitLookup.UI.Controls" + xmlns:system="clr-namespace:System;assembly=System.Runtime"> - - \ No newline at end of file + - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/CardControl.xaml b/RevitLookup.UI/Styles/Controls/CardControl.xaml index b1e7b7d3c..97b9f27eb 100644 --- a/RevitLookup.UI/Styles/Controls/CardControl.xaml +++ b/RevitLookup.UI/Styles/Controls/CardControl.xaml @@ -3,151 +3,135 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> + xmlns:controls="clr-namespace:RevitLookup.UI.Controls" + xmlns:system="clr-namespace:System;assembly=System.Runtime"> - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -155,4 +139,6 @@ - \ No newline at end of file + + - @@ -103,4 +85,4 @@ - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/ComboBox.xaml b/RevitLookup.UI/Styles/Controls/ComboBox.xaml index 35c0e04f7..5f706da75 100644 --- a/RevitLookup.UI/Styles/Controls/ComboBox.xaml +++ b/RevitLookup.UI/Styles/Controls/ComboBox.xaml @@ -3,198 +3,163 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> + + + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:controls="clr-namespace:RevitLookup.UI.Controls" + xmlns:converters="clr-namespace:RevitLookup.UI.Converters" + xmlns:system="clr-namespace:System;assembly=System.Runtime"> + + 10,8,10,8 + 1,1,1,1 + 0,0,0,2 + 8,0,10,0 + 3,2,3,0 + 10,8,8,8 + 11.0 + 32.0 - + + - - - - - - + + + + + + + + + - + - - - - - - - - - - - - - - - + + + + + @@ -402,4 +416,7 @@ - \ No newline at end of file + - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - \ No newline at end of file + - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/Hyperlink.xaml b/RevitLookup.UI/Styles/Controls/Hyperlink.xaml index ee9779da0..88b37b315 100644 --- a/RevitLookup.UI/Styles/Controls/Hyperlink.xaml +++ b/RevitLookup.UI/Styles/Controls/Hyperlink.xaml @@ -3,6 +3,9 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> - - \ No newline at end of file + ---> - \ No newline at end of file + --> + diff --git a/RevitLookup.UI/Styles/Controls/Label.xaml b/RevitLookup.UI/Styles/Controls/Label.xaml index 353d146a1..ab9ab4c96 100644 --- a/RevitLookup.UI/Styles/Controls/Label.xaml +++ b/RevitLookup.UI/Styles/Controls/Label.xaml @@ -5,25 +5,17 @@ All Rights Reserved. --> - + - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/ListBox.xaml b/RevitLookup.UI/Styles/Controls/ListBox.xaml index b9885cc2f..047928f96 100644 --- a/RevitLookup.UI/Styles/Controls/ListBox.xaml +++ b/RevitLookup.UI/Styles/Controls/ListBox.xaml @@ -10,35 +10,29 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:converters="clr-namespace:RevitLookup.UI.Converters"> - + - - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/ListView.xaml b/RevitLookup.UI/Styles/Controls/ListView.xaml index b81fec498..d8f0016e6 100644 --- a/RevitLookup.UI/Styles/Controls/ListView.xaml +++ b/RevitLookup.UI/Styles/Controls/ListView.xaml @@ -7,42 +7,69 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:converters="clr-namespace:RevitLookup.UI.Converters"> - + + + - - + + + + + + + + + + + + + + + @@ -50,30 +77,61 @@ - - --> - \ No newline at end of file + - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/Menu.xaml b/RevitLookup.UI/Styles/Controls/Menu.xaml index f395e5c09..354c1c55a 100644 --- a/RevitLookup.UI/Styles/Controls/Menu.xaml +++ b/RevitLookup.UI/Styles/Controls/Menu.xaml @@ -9,45 +9,20 @@ x:Class="RevitLookup.UI.Styles.Controls.Menu" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:converters="clr-namespace:RevitLookup.UI.Converters" xmlns:controls="clr-namespace:RevitLookup.UI.Controls"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + x:Key="{x:Type Menu}" + BasedOn="{StaticResource UiMenu}" + TargetType="{x:Type Menu}" /> - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/Menu.xaml.cs b/RevitLookup.UI/Styles/Controls/Menu.xaml.cs index 8e2881557..5c1492d36 100644 --- a/RevitLookup.UI/Styles/Controls/Menu.xaml.cs +++ b/RevitLookup.UI/Styles/Controls/Menu.xaml.cs @@ -6,27 +6,26 @@ using System.Reflection; using System.Windows; -namespace RevitLookup.UI.Styles.Controls; - -/// -/// Extension to the menu. -/// -partial class Menu : ResourceDictionary +namespace RevitLookup.UI.Styles.Controls { /// - /// Sets menu alignment on initialization. + /// Extension to the menu. /// - public Menu() + partial class Menu : ResourceDictionary { - Initialize(); - } + /// + /// Sets menu alignment on initialization. + /// + public Menu() => Initialize(); - private void Initialize() - { - if (!SystemParameters.MenuDropAlignment) - return; + private void Initialize() + { + if (!SystemParameters.MenuDropAlignment) + return; + + var fieldInfo = typeof(SystemParameters).GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static); + fieldInfo?.SetValue(null, false); + } - var fieldInfo = typeof(SystemParameters).GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static); - fieldInfo?.SetValue(null, false); } -} \ No newline at end of file +} diff --git a/RevitLookup.UI/Styles/Controls/MenuItem.xaml b/RevitLookup.UI/Styles/Controls/MenuItem.xaml new file mode 100644 index 000000000..b5e32f6be --- /dev/null +++ b/RevitLookup.UI/Styles/Controls/MenuItem.xaml @@ -0,0 +1,878 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/Navigation.xaml b/RevitLookup.UI/Styles/Controls/Navigation.xaml index 3821f5ca1..19161ffe3 100644 --- a/RevitLookup.UI/Styles/Controls/Navigation.xaml +++ b/RevitLookup.UI/Styles/Controls/Navigation.xaml @@ -5,9 +5,7 @@ All Rights Reserved. --> - + - - + + - - + + - - + + - + - - + + - + - + - + - + @@ -293,46 +303,33 @@ - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/NavigationFluent.xaml b/RevitLookup.UI/Styles/Controls/NavigationFluent.xaml index ea699ad07..a2307a99d 100644 --- a/RevitLookup.UI/Styles/Controls/NavigationFluent.xaml +++ b/RevitLookup.UI/Styles/Controls/NavigationFluent.xaml @@ -8,64 +8,40 @@ - - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/NavigationHeader.xaml b/RevitLookup.UI/Styles/Controls/NavigationHeader.xaml new file mode 100644 index 000000000..3d6ba4a4f --- /dev/null +++ b/RevitLookup.UI/Styles/Controls/NavigationHeader.xaml @@ -0,0 +1,70 @@ + + + + + + + diff --git a/RevitLookup.UI/Styles/Controls/NavigationSeparator.xaml b/RevitLookup.UI/Styles/Controls/NavigationSeparator.xaml new file mode 100644 index 000000000..e9a5fc45b --- /dev/null +++ b/RevitLookup.UI/Styles/Controls/NavigationSeparator.xaml @@ -0,0 +1,35 @@ + + + + + + + diff --git a/RevitLookup.UI/Styles/Controls/NavigationStore.xaml b/RevitLookup.UI/Styles/Controls/NavigationStore.xaml index a58ba6a5d..b83e8bb43 100644 --- a/RevitLookup.UI/Styles/Controls/NavigationStore.xaml +++ b/RevitLookup.UI/Styles/Controls/NavigationStore.xaml @@ -8,75 +8,104 @@ + xmlns:common="clr-namespace:RevitLookup.UI.Common" + xmlns:controls="clr-namespace:RevitLookup.UI.Controls" + xmlns:navigation="clr-namespace:RevitLookup.UI.Controls.Navigation"> - + + - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/NavigationView.xaml b/RevitLookup.UI/Styles/Controls/NavigationView.xaml new file mode 100644 index 000000000..de374f3a4 --- /dev/null +++ b/RevitLookup.UI/Styles/Controls/NavigationView.xaml @@ -0,0 +1,91 @@ + + + + + + + \ No newline at end of file diff --git a/RevitLookup.UI/Styles/Controls/NumberBox.xaml b/RevitLookup.UI/Styles/Controls/NumberBox.xaml index 53cf963e0..e583fbdbb 100644 --- a/RevitLookup.UI/Styles/Controls/NumberBox.xaml +++ b/RevitLookup.UI/Styles/Controls/NumberBox.xaml @@ -3,266 +3,291 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> + xmlns:controls="clr-namespace:RevitLookup.UI.Controls" + xmlns:system="clr-namespace:System;assembly=mscorlib"> - + 1,1,1,0 + 0,0,0,1 + 10,8,0,0 + 0,8,10,0 + 0,5,4,0 + 0,0,0,0 + 24 + 14 - - - - - - - - \ No newline at end of file + - \ No newline at end of file + + - - \ No newline at end of file + - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/RadioButton.xaml b/RevitLookup.UI/Styles/Controls/RadioButton.xaml index b8c22f12f..3547d94a7 100644 --- a/RevitLookup.UI/Styles/Controls/RadioButton.xaml +++ b/RevitLookup.UI/Styles/Controls/RadioButton.xaml @@ -3,121 +3,214 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:system="clr-namespace:System;assembly=System.Runtime"> - - \ No newline at end of file + - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/Scroll.xaml b/RevitLookup.UI/Styles/Controls/Scroll.xaml deleted file mode 100644 index 52ac76332..000000000 --- a/RevitLookup.UI/Styles/Controls/Scroll.xaml +++ /dev/null @@ -1,570 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - \ No newline at end of file diff --git a/RevitLookup.UI/Styles/Controls/Separator.xaml b/RevitLookup.UI/Styles/Controls/Separator.xaml index fd5e2e507..36ca666c3 100644 --- a/RevitLookup.UI/Styles/Controls/Separator.xaml +++ b/RevitLookup.UI/Styles/Controls/Separator.xaml @@ -5,35 +5,19 @@ All Rights Reserved. --> - + - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/Slider.xaml b/RevitLookup.UI/Styles/Controls/Slider.xaml index 8e997a058..a83df8cdb 100644 --- a/RevitLookup.UI/Styles/Controls/Slider.xaml +++ b/RevitLookup.UI/Styles/Controls/Slider.xaml @@ -5,64 +5,35 @@ All Rights Reserved. --> - + - - - + - - - + + + - + - + - + - + - + - - + + - - + + - - - + + + - - + + - + - + - + @@ -189,18 +119,12 @@ - + - - - + + + - + - + - + - + - + - + - - + + - - + + - - - + + + - - + + - + - + - + - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/Snackbar.xaml b/RevitLookup.UI/Styles/Controls/Snackbar.xaml index 07de8014a..846635fcc 100644 --- a/RevitLookup.UI/Styles/Controls/Snackbar.xaml +++ b/RevitLookup.UI/Styles/Controls/Snackbar.xaml @@ -10,62 +10,39 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:RevitLookup.UI.Controls"> - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/SplitButton.xaml b/RevitLookup.UI/Styles/Controls/SplitButton.xaml new file mode 100644 index 000000000..8a8a39f53 --- /dev/null +++ b/RevitLookup.UI/Styles/Controls/SplitButton.xaml @@ -0,0 +1,91 @@ + + + + + 11,5,11,6 + 1 + 0,0,8,0 + + + + - \ No newline at end of file diff --git a/RevitLookup.UI/Styles/Controls/SymbolIcon.xaml b/RevitLookup.UI/Styles/Controls/SymbolIcon.xaml index 95fe56cc1..5fd67e22e 100644 --- a/RevitLookup.UI/Styles/Controls/SymbolIcon.xaml +++ b/RevitLookup.UI/Styles/Controls/SymbolIcon.xaml @@ -10,60 +10,43 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:RevitLookup.UI.Controls"> - + - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/TextBlock.xaml b/RevitLookup.UI/Styles/Controls/TextBlock.xaml index d74642958..c6c6c0563 100644 --- a/RevitLookup.UI/Styles/Controls/TextBlock.xaml +++ b/RevitLookup.UI/Styles/Controls/TextBlock.xaml @@ -5,12 +5,9 @@ All Rights Reserved. --> - + - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/TextBox.xaml b/RevitLookup.UI/Styles/Controls/TextBox.xaml index 2f0181e5b..17472424e 100644 --- a/RevitLookup.UI/Styles/Controls/TextBox.xaml +++ b/RevitLookup.UI/Styles/Controls/TextBox.xaml @@ -3,309 +3,385 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> + xmlns:controls="clr-namespace:RevitLookup.UI.Controls" + xmlns:system="clr-namespace:System;assembly=System.Runtime"> - + 1,1,1,0 + 0,0,0,1 + 10,8,0,0 + 0,8,10,0 + 0,5,4,0 + 0,0,0,0 + 24 + 14 - - - - - - - + + - - - + + + + - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/ToggleButton.xaml b/RevitLookup.UI/Styles/Controls/ToggleButton.xaml index 0589f6ef2..8a7a51657 100644 --- a/RevitLookup.UI/Styles/Controls/ToggleButton.xaml +++ b/RevitLookup.UI/Styles/Controls/ToggleButton.xaml @@ -3,144 +3,151 @@ If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. Copyright (C) Leszek Pomianowski and WPF UI Contributors. All Rights Reserved. + + Based on Microsoft XAML for Win UI + Copyright (c) Microsoft Corporation. All Rights Reserved. --> - + - + 11,5,11,6 + 1 + 0,0,8,0 - - \ No newline at end of file + - \ No newline at end of file + - - - - - \ No newline at end of file + diff --git a/RevitLookup.UI/Styles/Controls/ToolTip.xaml b/RevitLookup.UI/Styles/Controls/ToolTip.xaml index f087ca777..77c79f016 100644 --- a/RevitLookup.UI/Styles/Controls/ToolTip.xaml +++ b/RevitLookup.UI/Styles/Controls/ToolTip.xaml @@ -5,70 +5,39 @@ All Rights Reserved. --> - + - @@ -107,8 +73,6 @@ - + + + + diff --git a/RevitLookup.UI/Styles/Controls/TreeView.xaml b/RevitLookup.UI/Styles/Controls/TreeView.xaml index 7032f67e7..ac03a3adc 100644 --- a/RevitLookup.UI/Styles/Controls/TreeView.xaml +++ b/RevitLookup.UI/Styles/Controls/TreeView.xaml @@ -10,47 +10,25 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:RevitLookup.UI.Controls"> - - - - - + + + + + + + + + + + + + + diff --git a/RevitLookup.UI/Styles/Controls/VirtualizingItemsControl.xaml b/RevitLookup.UI/Styles/Controls/VirtualizingItemsControl.xaml new file mode 100644 index 000000000..c45c84fcd --- /dev/null +++ b/RevitLookup.UI/Styles/Controls/VirtualizingItemsControl.xaml @@ -0,0 +1,50 @@ + + + + + + + diff --git a/RevitLookup.UI/Styles/Controls/VirtualizingUniformGrid.xaml b/RevitLookup.UI/Styles/Controls/VirtualizingUniformGrid.xaml deleted file mode 100644 index af4e430f4..000000000 --- a/RevitLookup.UI/Styles/Controls/VirtualizingUniformGrid.xaml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - \ No newline at end of file diff --git a/RevitLookup.UI/Styles/Controls/VirtualizingWrapPanel.xaml b/RevitLookup.UI/Styles/Controls/VirtualizingWrapPanel.xaml new file mode 100644 index 000000000..090389280 --- /dev/null +++ b/RevitLookup.UI/Styles/Controls/VirtualizingWrapPanel.xaml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/RevitLookup.UI/Styles/Controls/Window.xaml b/RevitLookup.UI/Styles/Controls/Window.xaml index a57835dad..6007eee3f 100644 --- a/RevitLookup.UI/Styles/Controls/Window.xaml +++ b/RevitLookup.UI/Styles/Controls/Window.xaml @@ -15,86 +15,41 @@ By default, the navigation buttons will be hidden by the background. If we use Mica, we hide them manually. --> - @@ -197,11 +134,10 @@ This version is only if you want rounded corners on Windows 10. --> - \ No newline at end of file + +