From 7da8689bf28e5b25725d0141bf25f358820a08e4 Mon Sep 17 00:00:00 2001 From: Divyansh Srivastava Date: Mon, 20 Apr 2020 19:53:20 -0700 Subject: [PATCH] Somil55/merge custom ui into launcher (#2271) * Remove Autosuggest box (#2192) * Update Settings.Designer.cs * Revert "Update Settings.Designer.cs" This reverts commit a1bc0dda564733f079235ed48e33b6bde768b24f. * Updated LauncherControl XAML to add textbox and listview * List View displayed * Hooking up execution on the selected index, removing two way binding on selection, and experimenting with popup that doesn't work * Updated MainViewModel to Remove context menu and history * Added Resultist XAML Island project * Updated SelectedItem and SelectedList Binding. Issues : List box doesn't open when query is written for first time but opens in subsequent queries. * 1. Mouse Click working 2. List View is can't be focused 3. Fixed width of Launcher * Removed two way QueryText box binding * Removed SelectedItem two way binding and replaced with a callback * [Cleaning] Remove redundant UWP project * [Cleaning] Updated files to keep only atomic changes against dev/powerLauncher * Thmbnail fixed for NEW UI * Removed PreviewMouseDown function required by older WOX code Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> * Added the auto-complete feature * Removing ContextMenuPluginInfo, and ContextMenuTopMost as these commands are not used int the new design. * Fixed merge conflicts * Set only when index is 0 * One way binding * Removed unnecessary binding * Deleting unused (commented out code) that was legacy from wox project. * Binding Buttons to appropriate context menu commands. 1. Buttons are dynamically loaded in a listview based on the actions supported be each plugin. This change also deletes unused commands. Note: Most button events don't seem to be getting routed to the Selected Item. Currently using 'PointerEntered' to validate the behavior. The actions should be trigged by the button command property in the future. * manually handling tab in mainwindow * Loading context buttons on Selecting a suggestion list item * Allowing hover event to load content menu items and display them as well. * Adding context buttons to Indexer plugin. This allows for the following: 1. [Files] Open Containing folder 2. [Folders/Files] Copy Path * Remove White background of list (#2218) * Remove white background of list * Removed comments * Changed to ContainerContentChanging event * add const variables instead of numbers * Added comment before the updatelistSize function * Search box UI (#2224) * Added backdrop and rounded corner * Fix for two alt+space press to bring searchbox issue * Fixed merge conflict * Clean Mainwindow.xaml code * Fix for textbox focus on first visible * Allowing users to tab between the context buttons for the selected resut. Also allowing users to press 'enter' to action on the selected items. * Renaming SelectedIndex to ContextMenuSelectedIndex * Enabling key accelerators on context buttons. 1. Add new object ContextMenuResult instead instead of reusing Result for both query results and context menu results. 2. Binding KeyboardAccelerator keys to contextmenuitemviewmodel 3. Enabling and disabling contextmenu items when selecting or deselecting each row. Because we are manually maintaining selectionwe can't use ScopeOwners as the textbox is really the only item ever in focus. * Launching explorer instead of the UWP application when selecting 'open file location'. * Added fix for border showing up when result count is zero * Updated fix for border on no result * Adding visibility after clearing result in MainViewmodel * Launcher Light/Dark mode (#2235) * Fixed issue with list view background not updating with Windows theme change * Added theme change for WPF * updated ShadowDepth for dropshadow * Updated border thicknes of searchbox and listview * Diff issue with ResultList.xaml * Removed change in result delay * Added code to pull colors from UWP * Updated border resource to use system based SystemControlHighlightAccentBrush * Updated corner radius in dark mode * Updated Launcher description text Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> Co-authored-by: Alekhya Reddy --- PowerToys.sln | 338 +++++++++++++++++- .../ContextMenuLoader.cs | 104 ++++++ .../Plugins/Microsoft.Plugin.Indexer/Main.cs | 14 +- .../Wox.Plugin.Folder/ContextMenuLoader.cs | 99 +---- .../Plugins/Wox.Plugin.Folder/Main.cs | 2 +- .../Plugins/Wox.Plugin.Program/Main.cs | 19 +- .../Wox.Plugin.Program/Programs/IProgram.cs | 2 +- .../Wox.Plugin.Program/Programs/UWP.cs | 20 +- .../Wox.Plugin.Program/Programs/Win32.cs | 40 +-- .../launcher/Plugins/Wox.Plugin.Shell/Main.cs | 23 +- .../launcher/PowerLauncher.UI/App.xaml | 2 + .../PowerLauncher.UI/LauncherControl.xaml | 161 ++------- .../PowerLauncher.UI/LauncherControl.xaml.cs | 60 +++- .../PowerLauncher.UI/PowerLauncher.UI.csproj | 7 + .../launcher/PowerLauncher.UI/ResultList.xaml | 101 ++++++ .../PowerLauncher.UI/ResultList.xaml.cs | 18 + .../launcher/PowerLauncher/App.xaml.cs | 2 +- .../launcher/PowerLauncher/MainWindow.xaml | 32 +- .../launcher/PowerLauncher/MainWindow.xaml.cs | 337 ++++++++++------- .../PowerLauncher/PowerLauncher.csproj | 1 + .../launcher/PowerLauncher/ResultListBox.xaml | 1 - .../launcher/Wox.Core/Plugin/JsonRPCPlugin.cs | 10 +- .../launcher/Wox.Core/Plugin/PluginManager.cs | 12 +- .../launcher/Wox.Plugin/ContextMenuResult.cs | 32 ++ src/modules/launcher/Wox.Plugin/Feature.cs | 2 +- src/modules/launcher/Wox.Plugin/Result.cs | 4 + .../Wox/ViewModel/ContextMenuItemViewModel.cs | 17 + .../launcher/Wox/ViewModel/MainViewModel.cs | 156 +++----- .../launcher/Wox/ViewModel/ResultViewModel.cs | 255 +++++++++---- .../Wox/ViewModel/ResultsViewModel.cs | 52 ++- 30 files changed, 1285 insertions(+), 638 deletions(-) create mode 100644 src/modules/launcher/Plugins/Microsoft.Plugin.Indexer/ContextMenuLoader.cs create mode 100644 src/modules/launcher/PowerLauncher.UI/ResultList.xaml create mode 100644 src/modules/launcher/PowerLauncher.UI/ResultList.xaml.cs create mode 100644 src/modules/launcher/Wox.Plugin/ContextMenuResult.cs create mode 100644 src/modules/launcher/Wox/ViewModel/ContextMenuItemViewModel.cs diff --git a/PowerToys.sln b/PowerToys.sln index 00ac10b6dc..2f26e8eac5 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -224,208 +224,538 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "powerpreviewTest", "src\mod EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|ARM.ActiveCfg = Debug|x64 + {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|ARM64.ActiveCfg = Debug|x64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|x64.ActiveCfg = Debug|x64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|x64.Build.0 = Debug|x64 + {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|x86.ActiveCfg = Debug|x64 + {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|ARM.ActiveCfg = Release|x64 + {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|ARM64.ActiveCfg = Release|x64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|x64.ActiveCfg = Release|x64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|x64.Build.0 = Release|x64 + {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|x86.ActiveCfg = Release|x64 + {74485049-C722-400F-ABE5-86AC52D929B3}.Debug|ARM.ActiveCfg = Debug|x64 + {74485049-C722-400F-ABE5-86AC52D929B3}.Debug|ARM64.ActiveCfg = Debug|x64 {74485049-C722-400F-ABE5-86AC52D929B3}.Debug|x64.ActiveCfg = Debug|x64 {74485049-C722-400F-ABE5-86AC52D929B3}.Debug|x64.Build.0 = Debug|x64 + {74485049-C722-400F-ABE5-86AC52D929B3}.Debug|x86.ActiveCfg = Debug|x64 + {74485049-C722-400F-ABE5-86AC52D929B3}.Release|ARM.ActiveCfg = Release|x64 + {74485049-C722-400F-ABE5-86AC52D929B3}.Release|ARM64.ActiveCfg = Release|x64 {74485049-C722-400F-ABE5-86AC52D929B3}.Release|x64.ActiveCfg = Release|x64 {74485049-C722-400F-ABE5-86AC52D929B3}.Release|x64.Build.0 = Release|x64 + {74485049-C722-400F-ABE5-86AC52D929B3}.Release|x86.ActiveCfg = Release|x64 + {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Debug|ARM.ActiveCfg = Debug|x64 + {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Debug|ARM64.ActiveCfg = Debug|x64 {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Debug|x64.ActiveCfg = Debug|x64 {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Debug|x64.Build.0 = Debug|x64 + {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Debug|x86.ActiveCfg = Debug|x64 + {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Release|ARM.ActiveCfg = Release|x64 + {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Release|ARM64.ActiveCfg = Release|x64 {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Release|x64.ActiveCfg = Release|x64 {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Release|x64.Build.0 = Release|x64 + {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Release|x86.ActiveCfg = Release|x64 + {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Debug|ARM.ActiveCfg = Debug|x64 + {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Debug|ARM64.ActiveCfg = Debug|x64 {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Debug|x64.ActiveCfg = Debug|x64 {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Debug|x64.Build.0 = Debug|x64 + {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Debug|x86.ActiveCfg = Debug|x64 + {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Release|ARM.ActiveCfg = Release|x64 + {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Release|ARM64.ActiveCfg = Release|x64 {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Release|x64.ActiveCfg = Release|x64 {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Release|x64.Build.0 = Release|x64 + {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Release|x86.ActiveCfg = Release|x64 + {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Debug|ARM.ActiveCfg = Debug|x64 + {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Debug|ARM64.ActiveCfg = Debug|x64 {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Debug|x64.ActiveCfg = Debug|x64 {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Debug|x64.Build.0 = Debug|x64 + {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Debug|x86.ActiveCfg = Debug|x64 + {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Release|ARM.ActiveCfg = Release|x64 + {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Release|ARM64.ActiveCfg = Release|x64 {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Release|x64.ActiveCfg = Release|x64 {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Release|x64.Build.0 = Release|x64 + {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Release|x86.ActiveCfg = Release|x64 + {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|ARM.ActiveCfg = Debug|x64 + {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|ARM64.ActiveCfg = Debug|x64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|x64.ActiveCfg = Debug|x64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|x64.Build.0 = Debug|x64 + {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|x86.ActiveCfg = Debug|x64 + {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|ARM.ActiveCfg = Release|x64 + {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|ARM64.ActiveCfg = Release|x64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|x64.ActiveCfg = Release|x64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|x64.Build.0 = Release|x64 + {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|x86.ActiveCfg = Release|x64 + {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|ARM.ActiveCfg = Debug|x64 + {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|ARM64.ActiveCfg = Debug|x64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|x64.ActiveCfg = Debug|x64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|x64.Build.0 = Debug|x64 + {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|x86.ActiveCfg = Debug|x64 + {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|ARM.ActiveCfg = Release|x64 + {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|ARM64.ActiveCfg = Release|x64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|x64.ActiveCfg = Release|x64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|x64.Build.0 = Release|x64 + {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|x86.ActiveCfg = Release|x64 + {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|ARM.ActiveCfg = Debug|x64 + {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|ARM64.ActiveCfg = Debug|x64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|x64.ActiveCfg = Debug|x64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|x64.Build.0 = Debug|x64 + {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|x86.ActiveCfg = Debug|x64 + {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|ARM.ActiveCfg = Release|x64 + {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|ARM64.ActiveCfg = Release|x64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x64.ActiveCfg = Release|x64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x64.Build.0 = Release|x64 + {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x86.ActiveCfg = Release|x64 + {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|ARM.ActiveCfg = Debug|x64 + {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|ARM64.ActiveCfg = Debug|x64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x64.ActiveCfg = Debug|x64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x64.Build.0 = Debug|x64 + {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x86.ActiveCfg = Debug|x64 + {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|ARM.ActiveCfg = Release|x64 + {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|ARM64.ActiveCfg = Release|x64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|x64.ActiveCfg = Release|x64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|x64.Build.0 = Release|x64 + {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|x86.ActiveCfg = Release|x64 + {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|ARM.ActiveCfg = Debug|x64 + {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|ARM64.ActiveCfg = Debug|x64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|x64.ActiveCfg = Debug|x64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|x64.Build.0 = Debug|x64 + {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|x86.ActiveCfg = Debug|x64 + {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|ARM.ActiveCfg = Release|x64 + {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|ARM64.ActiveCfg = Release|x64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|x64.ActiveCfg = Release|x64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|x64.Build.0 = Release|x64 + {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|x86.ActiveCfg = Release|x64 + {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|ARM.ActiveCfg = Debug|Win32 + {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|ARM64.ActiveCfg = Debug|Win32 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|x64.ActiveCfg = Debug|x64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|x64.Build.0 = Debug|x64 + {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|x86.ActiveCfg = Debug|Win32 + {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|x86.Build.0 = Debug|Win32 + {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|ARM.ActiveCfg = Release|Win32 + {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|ARM64.ActiveCfg = Release|Win32 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|x64.ActiveCfg = Release|x64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|x64.Build.0 = Release|x64 + {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|x86.ActiveCfg = Release|Win32 + {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|x86.Build.0 = Release|Win32 + {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|ARM.ActiveCfg = Debug|Win32 + {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|ARM64.ActiveCfg = Debug|Win32 {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|x64.ActiveCfg = Debug|x64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|x64.Build.0 = Debug|x64 + {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|x86.ActiveCfg = Debug|Win32 + {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|x86.Build.0 = Debug|Win32 + {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|ARM.ActiveCfg = Release|Win32 + {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|ARM64.ActiveCfg = Release|Win32 {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|x64.ActiveCfg = Release|x64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|x64.Build.0 = Release|x64 + {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|x86.ActiveCfg = Release|Win32 + {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|x86.Build.0 = Release|Win32 + {0E072714-D127-460B-AFAD-B4C40B412798}.Debug|ARM.ActiveCfg = Debug|x64 + {0E072714-D127-460B-AFAD-B4C40B412798}.Debug|ARM64.ActiveCfg = Debug|x64 {0E072714-D127-460B-AFAD-B4C40B412798}.Debug|x64.ActiveCfg = Debug|x64 {0E072714-D127-460B-AFAD-B4C40B412798}.Debug|x64.Build.0 = Debug|x64 + {0E072714-D127-460B-AFAD-B4C40B412798}.Debug|x86.ActiveCfg = Debug|x64 + {0E072714-D127-460B-AFAD-B4C40B412798}.Release|ARM.ActiveCfg = Release|x64 + {0E072714-D127-460B-AFAD-B4C40B412798}.Release|ARM64.ActiveCfg = Release|x64 {0E072714-D127-460B-AFAD-B4C40B412798}.Release|x64.ActiveCfg = Release|x64 {0E072714-D127-460B-AFAD-B4C40B412798}.Release|x64.Build.0 = Release|x64 + {0E072714-D127-460B-AFAD-B4C40B412798}.Release|x86.ActiveCfg = Release|x64 + {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|ARM.ActiveCfg = Debug|Win32 + {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|ARM64.ActiveCfg = Debug|Win32 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|x64.ActiveCfg = Debug|x64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|x64.Build.0 = Debug|x64 + {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|x86.ActiveCfg = Debug|Win32 + {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|x86.Build.0 = Debug|Win32 + {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|ARM.ActiveCfg = Release|Win32 + {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|ARM64.ActiveCfg = Release|Win32 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|x64.ActiveCfg = Release|x64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|x64.Build.0 = Release|x64 + {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|x86.ActiveCfg = Release|Win32 + {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|x86.Build.0 = Release|Win32 + {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|ARM.ActiveCfg = Debug|Win32 + {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|ARM64.ActiveCfg = Debug|Win32 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|x64.ActiveCfg = Debug|x64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|x64.Build.0 = Debug|x64 + {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|x86.ActiveCfg = Debug|Win32 + {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|x86.Build.0 = Debug|Win32 + {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|ARM.ActiveCfg = Release|Win32 + {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|ARM64.ActiveCfg = Release|Win32 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|x64.ActiveCfg = Release|x64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|x64.Build.0 = Release|x64 + {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|x86.ActiveCfg = Release|Win32 + {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|x86.Build.0 = Release|Win32 + {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|ARM.ActiveCfg = Debug|x64 + {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|ARM64.ActiveCfg = Debug|x64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|x64.ActiveCfg = Debug|x64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|x64.Build.0 = Debug|x64 + {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|x86.ActiveCfg = Debug|x64 + {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|ARM.ActiveCfg = Release|x64 + {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|ARM64.ActiveCfg = Release|x64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|x64.ActiveCfg = Release|x64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|x64.Build.0 = Release|x64 + {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|x86.ActiveCfg = Release|x64 + {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Debug|ARM.ActiveCfg = Debug|x64 + {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Debug|ARM64.ActiveCfg = Debug|x64 {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Debug|x64.ActiveCfg = Debug|x64 {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Debug|x64.Build.0 = Debug|x64 + {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Debug|x86.ActiveCfg = Debug|x64 + {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Release|ARM.ActiveCfg = Release|x64 + {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Release|ARM64.ActiveCfg = Release|x64 {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Release|x64.ActiveCfg = Release|x64 {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Release|x64.Build.0 = Release|x64 + {0485F45C-EA7A-4BB5-804B-3E8D14699387}.Release|x86.ActiveCfg = Release|x64 + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|ARM.ActiveCfg = Debug|ARM + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|ARM.Build.0 = Debug|ARM + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|ARM64.ActiveCfg = Debug|Win32 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|x64.ActiveCfg = Debug|x64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|x64.Build.0 = Debug|x64 + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|x86.ActiveCfg = Debug|Win32 + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|x86.Build.0 = Debug|Win32 + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|ARM.ActiveCfg = Release|ARM + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|ARM.Build.0 = Release|ARM + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|ARM64.ActiveCfg = Release|Win32 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|x64.ActiveCfg = Release|x64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|x64.Build.0 = Release|x64 + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|x86.ActiveCfg = Release|Win32 + {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|x86.Build.0 = Release|Win32 + {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|ARM.ActiveCfg = Debug|Win32 + {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|ARM64.ActiveCfg = Debug|Win32 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|x64.ActiveCfg = Debug|x64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|x64.Build.0 = Debug|x64 + {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|x86.ActiveCfg = Debug|Win32 + {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|x86.Build.0 = Debug|Win32 + {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|ARM.ActiveCfg = Release|Win32 + {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|ARM64.ActiveCfg = Release|Win32 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|x64.ActiveCfg = Release|x64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|x64.Build.0 = Release|x64 + {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|x86.ActiveCfg = Release|Win32 + {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|x86.Build.0 = Release|Win32 + {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Debug|ARM.ActiveCfg = Debug|x64 + {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Debug|ARM64.ActiveCfg = Debug|x64 {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Debug|x64.ActiveCfg = Debug|x64 {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Debug|x64.Build.0 = Debug|x64 + {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Debug|x86.ActiveCfg = Debug|x64 + {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Release|ARM.ActiveCfg = Release|x64 + {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Release|ARM64.ActiveCfg = Release|x64 {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Release|x64.ActiveCfg = Release|x64 {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Release|x64.Build.0 = Release|x64 + {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB}.Release|x86.ActiveCfg = Release|x64 + {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Debug|ARM.ActiveCfg = Debug|x64 + {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Debug|ARM64.ActiveCfg = Debug|x64 {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Debug|x64.ActiveCfg = Debug|x64 {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Debug|x64.Build.0 = Debug|x64 + {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Debug|x86.ActiveCfg = Debug|x64 + {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Release|ARM.ActiveCfg = Release|x64 + {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Release|ARM64.ActiveCfg = Release|x64 {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Release|x64.ActiveCfg = Release|x64 {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Release|x64.Build.0 = Release|x64 + {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6}.Release|x86.ActiveCfg = Release|x64 + {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|ARM.ActiveCfg = Debug|x64 + {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|ARM64.ActiveCfg = Debug|x64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|x64.ActiveCfg = Debug|x64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|x64.Build.0 = Debug|x64 + {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|x86.ActiveCfg = Debug|x64 + {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|ARM.ActiveCfg = Release|x64 + {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|ARM64.ActiveCfg = Release|x64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|x64.ActiveCfg = Release|x64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|x64.Build.0 = Release|x64 + {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|x86.ActiveCfg = Release|x64 + {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|ARM.ActiveCfg = Debug|Win32 + {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|ARM64.ActiveCfg = Debug|Win32 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|x64.ActiveCfg = Debug|x64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|x64.Build.0 = Debug|x64 + {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|x86.ActiveCfg = Debug|Win32 + {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|x86.Build.0 = Debug|Win32 + {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|ARM.ActiveCfg = Release|Win32 + {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|ARM64.ActiveCfg = Release|Win32 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|x64.ActiveCfg = Release|x64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|x64.Build.0 = Release|x64 + {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|x86.ActiveCfg = Release|Win32 + {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|x86.Build.0 = Release|Win32 + {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|ARM.ActiveCfg = Debug|x64 + {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|ARM64.ActiveCfg = Debug|x64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|x64.ActiveCfg = Debug|x64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|x64.Build.0 = Debug|x64 + {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|x86.ActiveCfg = Debug|x64 + {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|ARM.ActiveCfg = Release|x64 + {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|ARM64.ActiveCfg = Release|x64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|x64.ActiveCfg = Release|x64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|x64.Build.0 = Release|x64 + {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|x86.ActiveCfg = Release|x64 + {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|ARM.ActiveCfg = Debug|Win32 + {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|ARM64.ActiveCfg = Debug|Win32 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|x64.ActiveCfg = Debug|x64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|x64.Build.0 = Debug|x64 + {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|x86.ActiveCfg = Debug|Win32 + {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|x86.Build.0 = Debug|Win32 + {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|ARM.ActiveCfg = Release|Win32 + {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|ARM64.ActiveCfg = Release|Win32 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|x64.ActiveCfg = Release|x64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|x64.Build.0 = Release|x64 + {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|x86.ActiveCfg = Release|Win32 + {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|x86.Build.0 = Release|Win32 + {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|ARM.ActiveCfg = Debug|Win32 + {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|ARM64.ActiveCfg = Debug|Win32 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x64.ActiveCfg = Debug|x64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x64.Build.0 = Debug|x64 + {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x86.ActiveCfg = Debug|Win32 + {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x86.Build.0 = Debug|Win32 + {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|ARM.ActiveCfg = Release|Win32 + {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|ARM64.ActiveCfg = Release|Win32 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x64.ActiveCfg = Release|x64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x64.Build.0 = Release|x64 + {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x86.ActiveCfg = Release|Win32 + {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x86.Build.0 = Release|Win32 + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|ARM.ActiveCfg = Debug|x64 + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|ARM64.ActiveCfg = Debug|x64 {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|x64.ActiveCfg = Debug|x64 {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|x64.Build.0 = Debug|x64 + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|x86.ActiveCfg = Debug|x64 + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|ARM.ActiveCfg = Release|x64 + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|ARM64.ActiveCfg = Release|x64 {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|x64.ActiveCfg = Release|x64 {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|x64.Build.0 = Release|x64 + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|x86.ActiveCfg = Release|x64 + {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Debug|ARM.ActiveCfg = Debug|x64 + {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Debug|ARM64.ActiveCfg = Debug|x64 {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Debug|x64.ActiveCfg = Debug|x64 {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Debug|x64.Build.0 = Debug|x64 + {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Debug|x86.ActiveCfg = Debug|x64 + {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Release|ARM.ActiveCfg = Release|x64 + {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Release|ARM64.ActiveCfg = Release|x64 {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Release|x64.ActiveCfg = Release|x64 {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Release|x64.Build.0 = Release|x64 + {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Release|x86.ActiveCfg = Release|x64 + {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|ARM.ActiveCfg = Debug|x64 + {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|ARM64.ActiveCfg = Debug|x64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|x64.ActiveCfg = Debug|x64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|x64.Build.0 = Debug|x64 + {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|x86.ActiveCfg = Debug|x64 + {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|ARM.ActiveCfg = Release|x64 + {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|ARM64.ActiveCfg = Release|x64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|x64.ActiveCfg = Release|x64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|x64.Build.0 = Release|x64 + {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|x86.ActiveCfg = Release|x64 + {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|ARM.ActiveCfg = Debug|x64 + {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|ARM64.ActiveCfg = Debug|x64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|x64.ActiveCfg = Debug|x64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|x64.Build.0 = Debug|x64 + {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|x86.ActiveCfg = Debug|x64 + {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|ARM.ActiveCfg = Release|x64 + {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|ARM64.ActiveCfg = Release|x64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|x64.ActiveCfg = Release|x64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|x64.Build.0 = Release|x64 + {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|x86.ActiveCfg = Release|x64 + {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|ARM.ActiveCfg = Debug|x64 + {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|ARM64.ActiveCfg = Debug|x64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x64.ActiveCfg = Debug|x64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x64.Build.0 = Debug|x64 + {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x86.ActiveCfg = Debug|x64 + {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|ARM.ActiveCfg = Release|x64 + {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|ARM64.ActiveCfg = Release|x64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|x64.ActiveCfg = Release|x64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|x64.Build.0 = Release|x64 - {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x64.ActiveCfg = Debug|x64 - {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x64.Build.0 = Debug|x64 - {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x64.ActiveCfg = Release|x64 - {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x64.Build.0 = Release|x64 + {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|x86.ActiveCfg = Release|x64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x64.ActiveCfg = Debug|x64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x64.Build.0 = Debug|x64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x64.ActiveCfg = Release|x64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x64.Build.0 = Release|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|ARM.ActiveCfg = Debug|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|ARM64.ActiveCfg = Debug|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x64.ActiveCfg = Debug|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x64.Build.0 = Debug|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x86.ActiveCfg = Debug|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|ARM.ActiveCfg = Release|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|ARM64.ActiveCfg = Release|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x64.ActiveCfg = Release|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x64.Build.0 = Release|x64 + {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x86.ActiveCfg = Release|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|ARM.ActiveCfg = Debug|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|ARM64.ActiveCfg = Debug|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x64.ActiveCfg = Debug|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x64.Build.0 = Debug|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x86.ActiveCfg = Debug|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|ARM.ActiveCfg = Release|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|ARM64.ActiveCfg = Release|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x64.ActiveCfg = Release|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x64.Build.0 = Release|x64 + {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x86.ActiveCfg = Release|x64 + {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|ARM.ActiveCfg = Debug|x64 + {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|ARM64.ActiveCfg = Debug|x64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|x64.ActiveCfg = Debug|x64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|x64.Build.0 = Debug|x64 + {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|x86.ActiveCfg = Debug|x64 + {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|ARM.ActiveCfg = Release|x64 + {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|ARM64.ActiveCfg = Release|x64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|x64.ActiveCfg = Release|x64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|x64.Build.0 = Release|x64 + {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|x86.ActiveCfg = Release|x64 + {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|ARM.ActiveCfg = Debug|x64 + {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|ARM64.ActiveCfg = Debug|x64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|x64.ActiveCfg = Debug|x64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|x64.Build.0 = Debug|x64 + {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|x86.ActiveCfg = Debug|x64 + {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|ARM.ActiveCfg = Release|x64 + {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|ARM64.ActiveCfg = Release|x64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|x64.ActiveCfg = Release|x64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|x64.Build.0 = Release|x64 + {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|x86.ActiveCfg = Release|x64 + {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|ARM.ActiveCfg = Debug|x64 + {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|ARM64.ActiveCfg = Debug|x64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|x64.ActiveCfg = Debug|x64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|x64.Build.0 = Debug|x64 + {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|x86.ActiveCfg = Debug|x64 + {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|ARM.ActiveCfg = Release|x64 + {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|ARM64.ActiveCfg = Release|x64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|x64.ActiveCfg = Release|x64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|x64.Build.0 = Release|x64 + {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|x86.ActiveCfg = Release|x64 + {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|ARM.ActiveCfg = Debug|x64 + {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|ARM64.ActiveCfg = Debug|x64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|x64.ActiveCfg = Debug|x64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|x64.Build.0 = Debug|x64 + {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|x86.ActiveCfg = Debug|x64 + {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|ARM.ActiveCfg = Release|x64 + {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|ARM64.ActiveCfg = Release|x64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|x64.ActiveCfg = Release|x64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|x64.Build.0 = Release|x64 + {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|x86.ActiveCfg = Release|x64 + {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|ARM.ActiveCfg = Debug|x64 + {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|ARM64.ActiveCfg = Debug|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|x64.ActiveCfg = Debug|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|x64.Build.0 = Debug|x64 + {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|x86.ActiveCfg = Debug|x64 + {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|ARM.ActiveCfg = Release|x64 + {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|ARM64.ActiveCfg = Release|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.ActiveCfg = Release|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.Build.0 = Release|x64 + {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x86.ActiveCfg = Release|x64 + {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|ARM.ActiveCfg = Debug|x64 + {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|ARM64.ActiveCfg = Debug|x64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|x64.ActiveCfg = Debug|x64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|x64.Build.0 = Debug|x64 + {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|x86.ActiveCfg = Debug|x64 + {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|ARM.ActiveCfg = Release|x64 + {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|ARM64.ActiveCfg = Release|x64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|x64.ActiveCfg = Release|x64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|x64.Build.0 = Release|x64 + {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|x86.ActiveCfg = Release|x64 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Debug|ARM.ActiveCfg = Debug|Win32 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Debug|ARM64.ActiveCfg = Debug|Win32 {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Debug|x64.ActiveCfg = Debug|x64 {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Debug|x64.Build.0 = Debug|x64 {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Debug|x64.Deploy.0 = Debug|x64 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Debug|x86.ActiveCfg = Debug|Win32 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Debug|x86.Build.0 = Debug|Win32 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Debug|x86.Deploy.0 = Debug|Win32 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Release|ARM.ActiveCfg = Release|Win32 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Release|ARM64.ActiveCfg = Release|Win32 {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Release|x64.ActiveCfg = Release|x64 {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Release|x64.Build.0 = Release|x64 {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Release|x64.Deploy.0 = Release|x64 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Release|x86.ActiveCfg = Release|Win32 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Release|x86.Build.0 = Release|Win32 + {4A3DE70C-684C-410D-B851-C23B6DAEDF16}.Release|x86.Deploy.0 = Release|Win32 + {880ED251-9E16-4713-9A70-D35FE0C01669}.Debug|ARM.ActiveCfg = Debug|x64 + {880ED251-9E16-4713-9A70-D35FE0C01669}.Debug|ARM64.ActiveCfg = Debug|x64 {880ED251-9E16-4713-9A70-D35FE0C01669}.Debug|x64.ActiveCfg = Debug|x64 {880ED251-9E16-4713-9A70-D35FE0C01669}.Debug|x64.Build.0 = Debug|x64 + {880ED251-9E16-4713-9A70-D35FE0C01669}.Debug|x86.ActiveCfg = Debug|x64 + {880ED251-9E16-4713-9A70-D35FE0C01669}.Release|ARM.ActiveCfg = Release|x64 + {880ED251-9E16-4713-9A70-D35FE0C01669}.Release|ARM64.ActiveCfg = Release|x64 {880ED251-9E16-4713-9A70-D35FE0C01669}.Release|x64.ActiveCfg = Release|x64 {880ED251-9E16-4713-9A70-D35FE0C01669}.Release|x64.Build.0 = Release|x64 + {880ED251-9E16-4713-9A70-D35FE0C01669}.Release|x86.ActiveCfg = Release|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|ARM.ActiveCfg = Debug|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|ARM64.ActiveCfg = Debug|x64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x64.ActiveCfg = Debug|x64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x64.Build.0 = Debug|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x86.ActiveCfg = Debug|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|ARM.ActiveCfg = Release|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|ARM64.ActiveCfg = Release|x64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x64.ActiveCfg = Release|x64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x64.Build.0 = Release|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x86.ActiveCfg = Release|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|ARM.ActiveCfg = Debug|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|ARM64.ActiveCfg = Debug|x64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x64.ActiveCfg = Debug|x64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x64.Build.0 = Debug|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x86.ActiveCfg = Debug|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|ARM.ActiveCfg = Release|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|ARM64.ActiveCfg = Release|x64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x64.ActiveCfg = Release|x64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x64.Build.0 = Release|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x86.ActiveCfg = Release|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|ARM.ActiveCfg = Debug|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|ARM64.ActiveCfg = Debug|x64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x64.ActiveCfg = Debug|x64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x64.Build.0 = Debug|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x86.ActiveCfg = Debug|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|ARM.ActiveCfg = Release|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|ARM64.ActiveCfg = Release|x64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x64.ActiveCfg = Release|x64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x64.Build.0 = Release|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x86.ActiveCfg = Release|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|ARM.ActiveCfg = Debug|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|ARM64.ActiveCfg = Debug|x64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x64.ActiveCfg = Debug|x64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x64.Build.0 = Debug|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x86.ActiveCfg = Debug|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|ARM.ActiveCfg = Release|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|ARM64.ActiveCfg = Release|x64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x64.ActiveCfg = Release|x64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x64.Build.0 = Release|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x86.ActiveCfg = Release|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|ARM.ActiveCfg = Debug|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|ARM64.ActiveCfg = Debug|x64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x64.ActiveCfg = Debug|x64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x64.Build.0 = Debug|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x86.ActiveCfg = Debug|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|ARM.ActiveCfg = Release|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|ARM64.ActiveCfg = Release|x64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x64.ActiveCfg = Release|x64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x64.Build.0 = Release|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x86.ActiveCfg = Release|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|ARM.ActiveCfg = Debug|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|ARM64.ActiveCfg = Debug|x64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x64.ActiveCfg = Debug|x64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x64.Build.0 = Debug|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x86.ActiveCfg = Debug|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|ARM.ActiveCfg = Release|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|ARM64.ActiveCfg = Release|x64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x64.ActiveCfg = Release|x64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x64.Build.0 = Release|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x86.ActiveCfg = Release|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|ARM.ActiveCfg = Debug|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|ARM64.ActiveCfg = Debug|x64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x64.ActiveCfg = Debug|x64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x64.Build.0 = Debug|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x86.ActiveCfg = Debug|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|ARM.ActiveCfg = Release|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|ARM64.ActiveCfg = Release|x64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x64.ActiveCfg = Release|x64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x64.Build.0 = Release|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x86.ActiveCfg = Release|x64 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|ARM.ActiveCfg = Debug|Win32 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|ARM64.ActiveCfg = Debug|Win32 {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|x64.ActiveCfg = Debug|x64 {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|x64.Build.0 = Debug|x64 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|x86.ActiveCfg = Debug|Win32 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|x86.Build.0 = Debug|Win32 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|ARM.ActiveCfg = Release|Win32 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|ARM64.ActiveCfg = Release|Win32 {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|x64.ActiveCfg = Release|x64 {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|x64.Build.0 = Release|x64 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|x86.ActiveCfg = Release|Win32 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Indexer/ContextMenuLoader.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Indexer/ContextMenuLoader.cs new file mode 100644 index 0000000000..9f054cdd91 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Indexer/ContextMenuLoader.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Windows; +using Wox.Infrastructure.Logger; +using Wox.Plugin; +using Microsoft.Plugin.Indexer.SearchHelper; + +namespace Microsoft.Plugin.Indexer +{ + internal class ContextMenuLoader : IContextMenu + { + private readonly PluginInitContext _context; + + public enum ResultType + { + Folder, + File + } + + public ContextMenuLoader(PluginInitContext context) + { + _context = context; + } + + public List LoadContextMenus(Result selectedResult) + { + var contextMenus = new List(); + if (selectedResult.ContextData is SearchResult record) + { + ResultType type = Path.HasExtension(record.Path) ? ResultType.File : ResultType.Folder; + + if (type == ResultType.File) + { + contextMenus.Add(CreateOpenContainingFolderResult(record)); + } + + var fileOrFolder = (type == ResultType.File) ? "file" : "folder"; + contextMenus.Add(new ContextMenuResult + { + Title = "Copy path", + Glyph = "\xE8C8", + FontFamily = "Segoe MDL2 Assets", + SubTitle = $"Copy the current {fileOrFolder} path to clipboard", + AcceleratorKey = "C", + AcceleratorModifiers = "Control", + + Action = (context) => + { + try + { + Clipboard.SetText(record.Path); + return true; + } + catch (Exception e) + { + var message = "Fail to set text in clipboard"; + LogException(message, e); + _context.API.ShowMsg(message); + return false; + } + } + }); + } + + return contextMenus; + } + + private ContextMenuResult CreateOpenContainingFolderResult(SearchResult record) + { + return new ContextMenuResult + { + Title = "Open containing folder", + Glyph = "\xE838", + FontFamily = "Segoe MDL2 Assets", + AcceleratorKey = "E", + AcceleratorModifiers = "Control,Shift", + Action = _ => + { + try + { + Process.Start("explorer.exe", $" /select,\"{record.Path}\""); + } + catch(Exception e) + { + var message = $"Fail to open file at {record.Path}"; + LogException(message, e); + _context.API.ShowMsg(message); + return false; + } + + return true; + }, + }; + } + + public void LogException(string message, Exception e) + { + Log.Exception($"|Wox.Plugin.Folder.ContextMenu|{message}", e); + } + } + +} \ No newline at end of file diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Indexer/Main.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Indexer/Main.cs index 06f6cdac78..ffefd5953b 100644 --- a/src/modules/launcher/Plugins/Microsoft.Plugin.Indexer/Main.cs +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Indexer/Main.cs @@ -13,7 +13,7 @@ using Microsoft.Search.Interop; namespace Microsoft.Plugin.Indexer { - class Main : IPlugin, ISavable, IPluginI18n + class Main : IPlugin, ISavable, IPluginI18n, IContextMenu { // This variable contains metadata about the Plugin @@ -26,7 +26,9 @@ namespace Microsoft.Plugin.Indexer private PluginJsonStorage _storage; // To access Windows Search functionalities - private readonly WindowsSearchAPI _api = new WindowsSearchAPI(); + private readonly WindowsSearchAPI _api = new WindowsSearchAPI(); + + private IContextMenu _contextMenuLoader; // To save the configurations of plugins public void Save() @@ -109,6 +111,7 @@ namespace Microsoft.Plugin.Indexer { // initialize the context of the plugin _context = context; + _contextMenuLoader = new ContextMenuLoader(context); _storage = new PluginJsonStorage(); _settings = _storage.Load(); } @@ -125,8 +128,11 @@ namespace Microsoft.Plugin.Indexer public string GetTranslatedPluginDescription() { return "Returns files and folders"; + } + + public List LoadContextMenus(Result selectedResult) + { + return _contextMenuLoader.LoadContextMenus(selectedResult); } - - } } diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Folder/ContextMenuLoader.cs b/src/modules/launcher/Plugins/Wox.Plugin.Folder/ContextMenuLoader.cs index 130fd7007e..f6e83b1787 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Folder/ContextMenuLoader.cs +++ b/src/modules/launcher/Plugins/Wox.Plugin.Folder/ContextMenuLoader.cs @@ -19,23 +19,26 @@ namespace Wox.Plugin.Folder _context = context; } - public List LoadContextMenus(Result selectedResult) + public List LoadContextMenus(Result selectedResult) { - var contextMenus = new List(); + var contextMenus = new List(); if (selectedResult.ContextData is SearchResult record) { if (record.Type == ResultType.File) { - contextMenus.Add(CreateOpenWithEditorResult(record)); contextMenus.Add(CreateOpenContainingFolderResult(record)); } var icoPath = (record.Type == ResultType.File) ? Main.FileImagePath : Main.FolderImagePath; var fileOrFolder = (record.Type == ResultType.File) ? "file" : "folder"; - contextMenus.Add(new Result + contextMenus.Add(new ContextMenuResult { Title = "Copy path", - SubTitle = $"Copy the current {fileOrFolder} path to clipboard", + Glyph = "\xE8C8", + FontFamily = "Segoe MDL2 Assets", + SubTitle = $"Copy the current {fileOrFolder} path to clipboard", + AcceleratorKey = "C", + AcceleratorModifiers = "Control", Action = (context) => { try @@ -50,91 +53,22 @@ namespace Wox.Plugin.Folder _context.API.ShowMsg(message); return false; } - }, - IcoPath = Main.CopyImagePath + } }); - - contextMenus.Add(new Result - { - Title = $"Copy {fileOrFolder}", - SubTitle = $"Copy the {fileOrFolder} to clipboard", - Action = (context) => - { - try - { - Clipboard.SetFileDropList(new System.Collections.Specialized.StringCollection { record.FullPath }); - return true; - } - catch (Exception e) - { - var message = $"Fail to set {fileOrFolder} in clipboard"; - LogException(message, e); - _context.API.ShowMsg(message); - return false; - } - - }, - IcoPath = icoPath - }); - - if (record.Type == ResultType.File || record.Type == ResultType.Folder) - contextMenus.Add(new Result - { - Title = $"Delete {fileOrFolder}", - SubTitle = $"Delete the selected {fileOrFolder}", - Action = (context) => - { - try - { - if (record.Type == ResultType.File) - File.Delete(record.FullPath); - else - Directory.Delete(record.FullPath); - } - catch(Exception e) - { - var message = $"Fail to delete {fileOrFolder} at {record.FullPath}"; - LogException(message, e); - _context.API.ShowMsg(message); - return false; - } - - return true; - }, - IcoPath = Main.DeleteFileFolderImagePath - }); - - if (record.Type == ResultType.File && CanRunAsDifferentUser(record.FullPath)) - contextMenus.Add(new Result - { - Title = "Run as different user", - Action = (context) => - { - try - { - Task.Run(()=> ShellCommand.RunAsDifferentUser(record.FullPath.SetProcessStartInfo())); - } - catch (FileNotFoundException e) - { - var name = "Plugin: Folder"; - var message = $"File not found: {e.Message}"; - _context.API.ShowMsg(name, message); - } - - return true; - }, - IcoPath = "Images/user.png" - }); } return contextMenus; } - private Result CreateOpenContainingFolderResult(SearchResult record) + private ContextMenuResult CreateOpenContainingFolderResult(SearchResult record) { - return new Result + return new ContextMenuResult { Title = "Open containing folder", + Glyph = "\xE838", + FontFamily = "Segoe MDL2 Assets", + AcceleratorKey = "E", + AcceleratorModifiers = "Control,Shift", Action = _ => { try @@ -150,8 +84,7 @@ namespace Wox.Plugin.Folder } return true; - }, - IcoPath = Main.FolderImagePath + } }; } diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Folder/Main.cs b/src/modules/launcher/Plugins/Wox.Plugin.Folder/Main.cs index 5e20aeda4c..0f78fce971 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Folder/Main.cs +++ b/src/modules/launcher/Plugins/Wox.Plugin.Folder/Main.cs @@ -302,7 +302,7 @@ namespace Wox.Plugin.Folder return _context.API.GetTranslation("wox_plugin_folder_plugin_description"); } - public List LoadContextMenus(Result selectedResult) + public List LoadContextMenus(Result selectedResult) { return _contextMenuLoader.LoadContextMenus(selectedResult); } diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Program/Main.cs b/src/modules/launcher/Plugins/Wox.Plugin.Program/Main.cs index e99298c788..cae579134e 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Program/Main.cs +++ b/src/modules/launcher/Plugins/Wox.Plugin.Program/Main.cs @@ -141,30 +141,15 @@ namespace Wox.Plugin.Program return _context.API.GetTranslation("wox_plugin_program_plugin_description"); } - public List LoadContextMenus(Result selectedResult) + public List LoadContextMenus(Result selectedResult) { - var menuOptions = new List(); + var menuOptions = new List(); var program = selectedResult.ContextData as IProgram; if (program != null) { menuOptions = program.ContextMenus(_context.API); } - menuOptions.Add( - new Result - { - Title = _context.API.GetTranslation("wox_plugin_program_disable_program"), - Action = c => - { - DisableProgram(program); - _context.API.ShowMsg(_context.API.GetTranslation("wox_plugin_program_disable_dlgtitle_success"), - _context.API.GetTranslation("wox_plugin_program_disable_dlgtitle_success_message")); - return false; - }, - IcoPath = "Images/disable.png" - } - ); - return menuOptions; } diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/IProgram.cs b/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/IProgram.cs index f51ab9610f..e183ecaad9 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/IProgram.cs +++ b/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/IProgram.cs @@ -4,7 +4,7 @@ namespace Wox.Plugin.Program.Programs { public interface IProgram { - List ContextMenus(IPublicAPI api); + List ContextMenus(IPublicAPI api); Result Result(string query, IPublicAPI api); string UniqueIdentifier { get; set; } string Name { get; } diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/UWP.cs b/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/UWP.cs index b41e5c838c..0c0100b405 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/UWP.cs +++ b/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/UWP.cs @@ -18,7 +18,8 @@ using IStream = AppxPackaing.IStream; using Rect = System.Windows.Rect; using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Media; - +using System.Windows.Controls; + namespace Wox.Plugin.Program.Programs { [Serializable] @@ -312,22 +313,23 @@ namespace Wox.Plugin.Program.Programs return result; } - public List ContextMenus(IPublicAPI api) + public List ContextMenus(IPublicAPI api) { - var contextMenus = new List + var contextMenus = new List { - new Result + new ContextMenuResult { Title = api.GetTranslation("wox_plugin_program_open_containing_folder"), - + Glyph = "\xE838", + FontFamily = "Segoe MDL2 Assets", + AcceleratorKey = "E", + AcceleratorModifiers = "Control,Shift", Action = _ => { - Main.StartProcess(Process.Start, new ProcessStartInfo(Package.Location)); + Main.StartProcess(Process.Start, new ProcessStartInfo("explorer", Package.Location)); return true; - }, - - IcoPath = "Images/folder.png" + } } }; return contextMenus; diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/Win32.cs b/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/Win32.cs index 214c1b70f7..82e156106b 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/Win32.cs +++ b/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/Win32.cs @@ -94,31 +94,17 @@ namespace Wox.Plugin.Program.Programs } - public List ContextMenus(IPublicAPI api) + public List ContextMenus(IPublicAPI api) { - var contextMenus = new List + var contextMenus = new List { - new Result - { - Title = api.GetTranslation("wox_plugin_program_run_as_different_user"), - Action = _ => - { - var info = new ProcessStartInfo - { - FileName = FullPath, - WorkingDirectory = ParentDirectory, - UseShellExecute = true - }; - - Task.Run(() => Main.StartProcess(ShellCommand.RunAsDifferentUser, info)); - - return true; - }, - IcoPath = "Images/user.png" - }, - new Result + new ContextMenuResult { Title = api.GetTranslation("wox_plugin_program_run_as_administrator"), + Glyph = "\xE7EF", + FontFamily = "Segoe MDL2 Assets", + AcceleratorKey = "Enter", + AcceleratorModifiers = "Control,Shift", Action = _ => { var info = new ProcessStartInfo @@ -132,12 +118,15 @@ namespace Wox.Plugin.Program.Programs Task.Run(() => Main.StartProcess(Process.Start, info)); return true; - }, - IcoPath = "Images/cmd.png" + } }, - new Result + new ContextMenuResult { Title = api.GetTranslation("wox_plugin_program_open_containing_folder"), + Glyph = "\xE838", + FontFamily = "Segoe MDL2 Assets", + AcceleratorKey = "E", + AcceleratorModifiers = "Control,Shift", Action = _ => { @@ -145,8 +134,7 @@ namespace Wox.Plugin.Program.Programs Main.StartProcess(Process.Start, new ProcessStartInfo("explorer", ParentDirectory)); return true; - }, - IcoPath = "Images/folder.png" + } } }; return contextMenus; diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Shell/Main.cs b/src/modules/launcher/Plugins/Wox.Plugin.Shell/Main.cs index 1a5174c4e4..6e61c15a8e 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Shell/Main.cs +++ b/src/modules/launcher/Plugins/Wox.Plugin.Shell/Main.cs @@ -320,29 +320,22 @@ namespace Wox.Plugin.Shell return _context.API.GetTranslation("wox_plugin_cmd_plugin_description"); } - public List LoadContextMenus(Result selectedResult) + public List LoadContextMenus(Result selectedResult) { - var resultlist = new List + var resultlist = new List { - new Result - { - Title = _context.API.GetTranslation("wox_plugin_cmd_run_as_different_user"), - Action = c => - { - Task.Run(() =>Execute(ShellCommand.RunAsDifferentUser, PrepareProcessStartInfo(selectedResult.Title))); - return true; - }, - IcoPath = "Images/user.png" - }, - new Result + new ContextMenuResult { Title = _context.API.GetTranslation("wox_plugin_cmd_run_as_administrator"), + Glyph = "\xE7EF", + FontFamily = "Segoe MDL2 Assets", + AcceleratorKey = "Enter", + AcceleratorModifiers = "Control,Shift", Action = c => { Execute(Process.Start, PrepareProcessStartInfo(selectedResult.Title, true)); return true; - }, - IcoPath = Image + } } }; diff --git a/src/modules/launcher/PowerLauncher.UI/App.xaml b/src/modules/launcher/PowerLauncher.UI/App.xaml index 484ef69542..14fbabb255 100644 --- a/src/modules/launcher/PowerLauncher.UI/App.xaml +++ b/src/modules/launcher/PowerLauncher.UI/App.xaml @@ -13,6 +13,7 @@ + @@ -22,6 +23,7 @@ + diff --git a/src/modules/launcher/PowerLauncher.UI/LauncherControl.xaml b/src/modules/launcher/PowerLauncher.UI/LauncherControl.xaml index 65c321493c..4b32a9fbbc 100644 --- a/src/modules/launcher/PowerLauncher.UI/LauncherControl.xaml +++ b/src/modules/launcher/PowerLauncher.UI/LauncherControl.xaml @@ -1,74 +1,19 @@ - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Height="72" + ScrollViewer.BringIntoViewOnFocusChange="False" + Canvas.ZIndex="0" + Margin="0" + VerticalAlignment="Center" + FontSize="24" + DesiredCandidateWindowAlignment="BottomEdge" /> \ No newline at end of file diff --git a/src/modules/launcher/PowerLauncher.UI/LauncherControl.xaml.cs b/src/modules/launcher/PowerLauncher.UI/LauncherControl.xaml.cs index 54fc9bfce5..d96c4b28f8 100644 --- a/src/modules/launcher/PowerLauncher.UI/LauncherControl.xaml.cs +++ b/src/modules/launcher/PowerLauncher.UI/LauncherControl.xaml.cs @@ -1,12 +1,50 @@ -using Windows.UI.Xaml.Controls; - -namespace PowerLauncher.UI -{ - public sealed partial class LauncherControl : UserControl - { - public LauncherControl() - { - InitializeComponent(); - } - } +using System.ComponentModel; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; + +namespace PowerLauncher.UI +{ + public sealed partial class LauncherControl : UserControl, INotifyPropertyChanged + { + private Brush _borderBrush; + + public LauncherControl() + { + InitializeComponent(); + } + + public Brush SolidBorderBrush + { + get { return _borderBrush; } + set { Set(ref _borderBrush, value); } + } + + private void Set(ref T storage, T value, [CallerMemberName]string propertyName = null) + { + if (Equals(storage, value)) + { + return; + } + + storage = value; + OnPropertyChanged(propertyName); + } + + private void UserControl_ActualThemeChanged(FrameworkElement sender, object args) + { + SolidBorderBrush = Application.Current.Resources["SystemControlHighlightAccentBrush"] as SolidColorBrush; + } + + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + SolidBorderBrush = Application.Current.Resources["SystemControlHighlightAccentBrush"] as SolidColorBrush; + } + + public event PropertyChangedEventHandler PropertyChanged; + + private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } } \ No newline at end of file diff --git a/src/modules/launcher/PowerLauncher.UI/PowerLauncher.UI.csproj b/src/modules/launcher/PowerLauncher.UI/PowerLauncher.UI.csproj index 4442153000..b8554f9f1d 100644 --- a/src/modules/launcher/PowerLauncher.UI/PowerLauncher.UI.csproj +++ b/src/modules/launcher/PowerLauncher.UI/PowerLauncher.UI.csproj @@ -53,6 +53,9 @@ LauncherControl.xaml + + ResultList.xaml + @@ -78,6 +81,10 @@ MSBuild:Compile Designer + + Designer + MSBuild:Compile + diff --git a/src/modules/launcher/PowerLauncher.UI/ResultList.xaml b/src/modules/launcher/PowerLauncher.UI/ResultList.xaml new file mode 100644 index 0000000000..2622b9a7ca --- /dev/null +++ b/src/modules/launcher/PowerLauncher.UI/ResultList.xaml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/launcher/PowerLauncher.UI/ResultList.xaml.cs b/src/modules/launcher/PowerLauncher.UI/ResultList.xaml.cs new file mode 100644 index 0000000000..72a87caa4c --- /dev/null +++ b/src/modules/launcher/PowerLauncher.UI/ResultList.xaml.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.UI.Xaml.Controls; + +namespace PowerLauncher.UI +{ + public sealed partial class ResultList : UserControl + { + public ResultList() + { + InitializeComponent(); + } + } +} diff --git a/src/modules/launcher/PowerLauncher/App.xaml.cs b/src/modules/launcher/PowerLauncher/App.xaml.cs index ae9f12a648..2c1c988fdd 100644 --- a/src/modules/launcher/PowerLauncher/App.xaml.cs +++ b/src/modules/launcher/PowerLauncher/App.xaml.cs @@ -88,7 +88,7 @@ namespace PowerLauncher RegisterExitEvents(); - _mainVM.MainWindowVisibility = Visibility.Hidden; + _mainVM.MainWindowVisibility = Visibility.Visible; Log.Info("|App.OnStartup|End Wox startup ---------------------------------------------------- "); diff --git a/src/modules/launcher/PowerLauncher/MainWindow.xaml b/src/modules/launcher/PowerLauncher/MainWindow.xaml index 170ab9398d..f2cbadc915 100644 --- a/src/modules/launcher/PowerLauncher/MainWindow.xaml +++ b/src/modules/launcher/PowerLauncher/MainWindow.xaml @@ -5,7 +5,7 @@ xmlns:vm="clr-namespace:Wox.ViewModel;assembly=Wox" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" + mc:Ignorable="d" xmlns:xaml="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost" Title="PowerLaunch" Topmost="True" @@ -23,17 +23,31 @@ Drop="OnDrop" LocationChanged="OnLocationChanged" Deactivated="OnDeactivated" - PreviewKeyDown="OnKeyDown" - Background="Transparent" + Background="Transparent" Visibility="{Binding MainWindowVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" d:DataContext="{d:DesignInstance vm:MainViewModel}"> - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/launcher/PowerLauncher/MainWindow.xaml.cs b/src/modules/launcher/PowerLauncher/MainWindow.xaml.cs index bf96da4dc0..876d2747dd 100644 --- a/src/modules/launcher/PowerLauncher/MainWindow.xaml.cs +++ b/src/modules/launcher/PowerLauncher/MainWindow.xaml.cs @@ -16,7 +16,12 @@ using KeyEventArgs = System.Windows.Input.KeyEventArgs; using MessageBox = System.Windows.MessageBox; using Microsoft.Toolkit.Wpf.UI.XamlHost; using Windows.UI.Xaml.Controls; - +using Windows.UI.Xaml.Input; +using Windows.System; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Core; +using System.Windows.Media; namespace PowerLauncher { @@ -29,6 +34,10 @@ namespace PowerLauncher private Settings _settings; private MainViewModel _viewModel; + const int ROW_COUNT = 4; + const int ROW_HEIGHT = 75; + const int MAX_LIST_HEIGHT = 300; + #endregion public MainWindow(Settings settings, MainViewModel mainVM) @@ -37,6 +46,7 @@ namespace PowerLauncher _viewModel = mainVM; _settings = settings; InitializeComponent(); + } public MainWindow() { @@ -52,35 +62,8 @@ namespace PowerLauncher { } - private void OnLoaded(object sender, RoutedEventArgs _) + private void OnLoaded(object sender, System.Windows.RoutedEventArgs _) { - // todo is there a way to set blur only once? - //ThemeManager.Instance.SetBlurForWindow(); - //WindowsInteropHelper.DisableControlBox(this); - //InitProgressbarAnimation(); - //InitializePosition(); - //// since the default main window visibility is visible - //// so we need set focus during startup - //QueryTextBox.Focus(); - - //_viewModel.PropertyChanged += (o, e) => - //{ - // if (e.PropertyName == nameof(MainViewModel.MainWindowVisibility)) - // { - // if (Visibility == Visibility.Visible) - // { - // Activate(); - // QueryTextBox.Focus(); - // UpdatePosition(); - // _settings.ActivateTimes++; - // if (!_viewModel.LastQuerySelected) - // { - // QueryTextBox.SelectAll(); - // _viewModel.LastQuerySelected = true; - // } - // } - // } - //}; InitializePosition(); } @@ -92,49 +75,11 @@ namespace PowerLauncher _settings.WindowLeft = Left; } - //private void InitProgressbarAnimation() - //{ - // var da = new DoubleAnimation(ProgressBar.X2, ActualWidth + 100, new Duration(new TimeSpan(0, 0, 0, 0, 1600))); - // var da1 = new DoubleAnimation(ProgressBar.X1, ActualWidth, new Duration(new TimeSpan(0, 0, 0, 0, 1600))); - // Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)")); - // Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)")); - // _progressBarStoryboard.Children.Add(da); - // _progressBarStoryboard.Children.Add(da1); - // _progressBarStoryboard.RepeatBehavior = RepeatBehavior.Forever; - // ProgressBar.BeginStoryboard(_progressBarStoryboard); - // _viewModel.ProgressBarVisibility = Visibility.Hidden; - //} - private void OnMouseDown(object sender, MouseButtonEventArgs e) { if (e.ChangedButton == MouseButton.Left) DragMove(); } - //private void OnPreviewMouseButtonDown(object sender, MouseButtonEventArgs e) - //{ - // if (sender != null && e.OriginalSource != null) - // { - // var r = (ResultListBox)sender; - // var d = (DependencyObject)e.OriginalSource; - // var item = ItemsControl.ContainerFromElement(r, d) as ListBoxItem; - // var result = (ResultViewModel)item?.DataContext; - // if (result != null) - // { - // if (e.ChangedButton == MouseButton.Left) - // { - // _viewModel.OpenResultCommand.Execute(null); - // } - // else if (e.ChangedButton == MouseButton.Right) - // { - // _viewModel.LoadContextMenuCommand.Execute(null); - // } - // } - // } - //} - - - - private void OnDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) @@ -158,10 +103,6 @@ namespace PowerLauncher e.Handled = true; } - private void OnContextMenusForSettingsClick(object sender, RoutedEventArgs e) - { - } - private void OnDeactivated(object sender, EventArgs e) { if (_settings.HideWhenDeactive) @@ -202,63 +143,19 @@ namespace PowerLauncher return left; } - //private double WindowTop() - //{ - // var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); - // var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y); - // var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height); - // var top = (dip2.Y - QueryTextBox.ActualHeight) / 4 + dip1.Y; - // return top; - //} - - /// - /// Register up and down key - /// todo: any way to put this in xaml ? - /// - private void OnKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Down) - { - _viewModel.SelectNextItemCommand.Execute(null); - e.Handled = true; - } - else if (e.Key == Key.Up) - { - _viewModel.SelectPrevItemCommand.Execute(null); - e.Handled = true; - } - else if (e.Key == Key.PageDown) - { - _viewModel.SelectNextPageCommand.Execute(null); - e.Handled = true; - } - else if (e.Key == Key.PageUp) - { - _viewModel.SelectPrevPageCommand.Execute(null); - e.Handled = true; - } - } - - //private void OnTextChanged(object sender, TextChangedEventArgs e) - //{ - // if (_viewModel.QueryTextCursorMovedToEnd) - // { - // QueryTextBox.CaretIndex = QueryTextBox.Text.Length; - // _viewModel.QueryTextCursorMovedToEnd = false; - // } - //} private PowerLauncher.UI.LauncherControl _launcher = null; - private void WindowsXamlHost_ChildChanged(object sender, EventArgs ev) + private void WindowsXamlHostTextBox_ChildChanged(object sender, EventArgs ev) { if (sender == null) return; var host = (WindowsXamlHost)sender; _launcher = (PowerLauncher.UI.LauncherControl)host.Child; _launcher.DataContext = _viewModel; - _launcher.SearchBox.TextChanged += QueryTextBox_TextChanged; - _launcher.SearchBox.QuerySubmitted += AutoSuggestBox_QuerySubmitted; - _launcher.SearchBox.Focus(Windows.UI.Xaml.FocusState.Programmatic); + _launcher.KeyDown += _launcher_KeyDown; + _launcher.TextBox.TextChanged += QueryTextBox_TextChanged; + _launcher.TextBox.Loaded += TextBox_Loaded; + _launcher.PropertyChanged += UserControl_PropertyChanged; _viewModel.PropertyChanged += (o, e) => { if (e.PropertyName == nameof(MainViewModel.MainWindowVisibility)) @@ -266,16 +163,141 @@ namespace PowerLauncher if (Visibility == System.Windows.Visibility.Visible) { Activate(); - _launcher.SearchBox.Focus(Windows.UI.Xaml.FocusState.Programmatic); UpdatePosition(); _settings.ActivateTimes++; if (!_viewModel.LastQuerySelected) { _viewModel.LastQuerySelected = true; - } + } } } - }; + }; + } + + private void UserControl_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == "SolidBorderBrush") + { + if (_launcher != null) + { + Windows.UI.Xaml.Media.SolidColorBrush uwpBrush = _launcher.SolidBorderBrush as Windows.UI.Xaml.Media.SolidColorBrush; + System.Windows.Media.Color borderColor = System.Windows.Media.Color.FromArgb(uwpBrush.Color.A, uwpBrush.Color.R, uwpBrush.Color.G, uwpBrush.Color.B); + this.SearchBoxBorder.BorderBrush = new SolidColorBrush(borderColor); + this.ListBoxBorder.BorderBrush = new SolidColorBrush(borderColor); + } + } + } + + private void TextBox_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) + { + TextBox tb = (TextBox)sender; + tb.Focus(FocusState.Programmatic); + _viewModel.MainWindowVisibility = System.Windows.Visibility.Collapsed; + } + + private UI.ResultList _resultList = null; + private void WindowsXamlHostListView_ChildChanged(object sender, EventArgs ev) + { + if (sender == null) return; + + var host = (WindowsXamlHost)sender; + _resultList = (UI.ResultList)host.Child; + _resultList.DataContext = _viewModel; + _resultList.Tapped += SuggestionsList_Tapped; + _resultList.SuggestionsList.SelectionChanged += SuggestionsList_SelectionChanged; + _resultList.SuggestionsList.ContainerContentChanging += SuggestionList_UpdateListSize; + } + + private bool IsKeyDown(VirtualKey key) + { + var keyState = CoreWindow.GetForCurrentThread().GetKeyState(key); + return (keyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down; + } + + private void _launcher_KeyDown(object sender, KeyRoutedEventArgs e) + { + if (e.Key == VirtualKey.Tab && IsKeyDown(VirtualKey.Shift)) + { + _viewModel.SelectPrevTabItemCommand.Execute(null); + e.Handled = true; + } + else if (e.Key == VirtualKey.Tab) + { + _viewModel.SelectNextTabItemCommand.Execute(null); + e.Handled = true; + } + else if (e.Key == VirtualKey.Down) + { + _viewModel.SelectNextItemCommand.Execute(null); + e.Handled = true; + } + else if (e.Key == VirtualKey.Up) + { + _viewModel.SelectPrevItemCommand.Execute(null); + e.Handled = true; + } + else if (e.Key == VirtualKey.PageDown) + { + _viewModel.SelectNextPageCommand.Execute(null); + e.Handled = true; + } + else if (e.Key == VirtualKey.PageUp) + { + _viewModel.SelectPrevPageCommand.Execute(null); + e.Handled = true; + } + } + + private void SuggestionsList_Tapped(object sender, TappedRoutedEventArgs e) + { + var result = ((Windows.UI.Xaml.FrameworkElement)e.OriginalSource).DataContext; + if (result != null) + { + var resultVM = result as ResultViewModel; + + //This may be null if the tapped item was one of the context buttons (run as admin etc). + if (resultVM != null) + { + _viewModel.Results.SelectedItem = resultVM; + _viewModel.OpenResultCommand.Execute(null); + } + } + } + + /* Note: This function has been added because a white-background was observed when the list resized, + * when the number of elements were lesser than the maximum capacity of the list (ie. 4). + * Binding Height/MaxHeight Properties did not solve this issue. + */ + private void SuggestionList_UpdateListSize(object sender, ContainerContentChangingEventArgs e) + { + int count = _viewModel?.Results?.Results.Count ?? 0; + int maxHeight = count < ROW_COUNT ? count * ROW_HEIGHT : MAX_LIST_HEIGHT; + _resultList.Height = maxHeight; + } + + private void SuggestionsList_SelectionChanged(object sender, Windows.UI.Xaml.Controls.SelectionChangedEventArgs e) + { + Windows.UI.Xaml.Controls.ListView listview = (Windows.UI.Xaml.Controls.ListView)sender; + _viewModel.Results.SelectedItem = (ResultViewModel) listview.SelectedItem; + if (e.AddedItems.Count > 0 && e.AddedItems[0] != null) + { + listview.ScrollIntoView(e.AddedItems[0]); + } + + // To populate the AutoCompleteTextBox as soon as the selection is changed or set. + // Setting it here instead of when the text is changed as there is a delay in executing the query and populating the result + _launcher.AutoCompleteTextBox.PlaceholderText = ListView_FirstItem(_viewModel.QueryText); + + } + + private void ResultsList_ItemClick(object sender, ItemClickEventArgs e) + { + ResultViewModel result = e?.ClickedItem as ResultViewModel; + if(result != null) + { + _viewModel.Results.SelectedItem = result; + _viewModel.OpenResultCommand.Execute(null); + } } private void AutoSuggestBox_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args) @@ -291,12 +313,75 @@ namespace PowerLauncher } } - private void QueryTextBox_TextChanged(Windows.UI.Xaml.Controls.AutoSuggestBox sender, Windows.UI.Xaml.Controls.AutoSuggestBoxTextChangedEventArgs args) + private const int millisecondsToWait = 200; + private static DateTime s_lastTimeOfTyping; + + private string ListView_FirstItem(String input) { - if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput) + string s = input; + if (s.Length > 0) { - _viewModel.QueryText = sender.Text; + String selectedItem = _viewModel.Results?.SelectedItem?.ToString(); + int selectedIndex = _viewModel.Results.SelectedIndex; + if (selectedItem != null && selectedIndex == 0) + { + if (selectedItem.IndexOf(input) == 0) + { + return selectedItem; + } + } } + + return String.Empty; + } + + + private void QueryTextBox_TextChanged(object sender, Windows.UI.Xaml.Controls.TextChangedEventArgs e) + { + var latestTimeOfTyping = DateTime.Now; + var text = ((Windows.UI.Xaml.Controls.TextBox)sender).Text; + Task.Run(() => DelayedCheck(latestTimeOfTyping, text)); + s_lastTimeOfTyping = latestTimeOfTyping; + + //To clear the auto-suggest immediately instead of waiting for selection changed + if(text == String.Empty) + { + _launcher.AutoCompleteTextBox.PlaceholderText = String.Empty; + } + } + + private async Task DelayedCheck(DateTime latestTimeOfTyping, string text) + { + await Task.Delay(millisecondsToWait); + if (latestTimeOfTyping.Equals(s_lastTimeOfTyping)) + { + await System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => + { + _viewModel.QueryText = text; + })); + } + } + + private void WindowsXamlHost_PreviewMouseDown(object sender, MouseButtonEventArgs e) + { + // if (sender != null && e.OriginalSource != null) + // { + // //var r = (ResultListBox)sender; + // //var d = (DependencyObject)e.OriginalSource; + // //var item = ItemsControl.ContainerFromElement(r, d) as ListBoxItem; + // //var result = (ResultViewModel)item?.DataContext; + // //if (result != null) + // //{ + // // if (e.ChangedButton == MouseButton.Left) + // // { + // // _viewModel.OpenResultCommand.Execute(null); + // // } + // // else if (e.ChangedButton == MouseButton.Right) + // // { + // // _viewModel.LoadContextMenuCommand.Execute(null); + // // } + // //} + // } } } } \ No newline at end of file diff --git a/src/modules/launcher/PowerLauncher/PowerLauncher.csproj b/src/modules/launcher/PowerLauncher/PowerLauncher.csproj index 511d9e1b16..0aeed52275 100644 --- a/src/modules/launcher/PowerLauncher/PowerLauncher.csproj +++ b/src/modules/launcher/PowerLauncher/PowerLauncher.csproj @@ -61,6 +61,7 @@ + diff --git a/src/modules/launcher/PowerLauncher/ResultListBox.xaml b/src/modules/launcher/PowerLauncher/ResultListBox.xaml index 30832c0eb8..31562e3dfc 100644 --- a/src/modules/launcher/PowerLauncher/ResultListBox.xaml +++ b/src/modules/launcher/PowerLauncher/ResultListBox.xaml @@ -7,7 +7,6 @@ xmlns:converter="clr-namespace:Wox.Converters;assembly=Wox" mc:Ignorable="d" d:DesignWidth="100" d:DesignHeight="100" d:DataContext="{d:DesignInstance vm:ResultsViewModel}" - MaxHeight="{Binding MaxHeight}" SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" SelectedItem="{Binding SelectedItem, Mode=OneWayToSource}" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Results}" diff --git a/src/modules/launcher/Wox.Core/Plugin/JsonRPCPlugin.cs b/src/modules/launcher/Wox.Core/Plugin/JsonRPCPlugin.cs index 5057ae472b..6b65dd09cb 100644 --- a/src/modules/launcher/Wox.Core/Plugin/JsonRPCPlugin.cs +++ b/src/modules/launcher/Wox.Core/Plugin/JsonRPCPlugin.cs @@ -45,16 +45,20 @@ namespace Wox.Core.Plugin } } - public List LoadContextMenus(Result selectedResult) + public List LoadContextMenus(Result selectedResult) { string output = ExecuteContextMenu(selectedResult); try { - return DeserializedResult(output); + //This should not hit. If it does it's because Wox shares the same interface for querying context menu items as well as search results. In this case please file a bug. + //To my knowledge we aren't supporting this JSonRPC commands in Launcher, and am not able to repro this, but I will leave this here for the time being in case I'm proven wrong. + //We should remove this, or identify and test officially supported use cases and Deserialize this properly. + //return DeserializedResult(output); + throw new NotImplementedException(); } catch (Exception e) { - Log.Exception($"|JsonRPCPlugin.LoadContextMenus|Exception on result <{selectedResult}>", e); + Log.Exception($"|JsonRPCPlugin.LoadContextMenus| THIS IS A BUG - Exception on result <{selectedResult}>", e); return null; } } diff --git a/src/modules/launcher/Wox.Core/Plugin/PluginManager.cs b/src/modules/launcher/Wox.Core/Plugin/PluginManager.cs index 5c477f44e0..0d007715eb 100644 --- a/src/modules/launcher/Wox.Core/Plugin/PluginManager.cs +++ b/src/modules/launcher/Wox.Core/Plugin/PluginManager.cs @@ -198,7 +198,7 @@ namespace Wox.Core.Plugin return AllPlugins.Where(p => p.Plugin is T); } - public static List GetContextMenusForPlugin(Result result) + public static List GetContextMenusForPlugin(Result result) { var pluginPair = _contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID); if (pluginPair != null) @@ -209,23 +209,17 @@ namespace Wox.Core.Plugin try { var results = plugin.LoadContextMenus(result); - foreach (var r in results) - { - r.PluginDirectory = metadata.PluginDirectory; - r.PluginID = metadata.ID; - r.OriginQuery = result.OriginQuery; - } return results; } catch (Exception e) { Log.Exception($"|PluginManager.GetContextMenusForPlugin|Can't load context menus for plugin <{metadata.Name}>", e); - return new List(); + return new List(); } } else { - return new List(); + return new List(); } } diff --git a/src/modules/launcher/Wox.Plugin/ContextMenuResult.cs b/src/modules/launcher/Wox.Plugin/ContextMenuResult.cs new file mode 100644 index 0000000000..f6d2e97c9c --- /dev/null +++ b/src/modules/launcher/Wox.Plugin/ContextMenuResult.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Windows.UI.Xaml.Media; + +namespace Wox.Plugin +{ + + public class ContextMenuResult + { + public string Title { get; set; } + public string SubTitle { get; set; } + + public string Glyph { get; set; } + + public string FontFamily { get; set; } + + public string AcceleratorKey { get; set; } + + public string AcceleratorModifiers { get; set; } + + /// + /// return true to hide wox after select result + /// + public Func Action { get; set; } + + public override string ToString() + { + return Title + SubTitle; + } + } +} \ No newline at end of file diff --git a/src/modules/launcher/Wox.Plugin/Feature.cs b/src/modules/launcher/Wox.Plugin/Feature.cs index 6d1aa37fd3..deaed0ccce 100644 --- a/src/modules/launcher/Wox.Plugin/Feature.cs +++ b/src/modules/launcher/Wox.Plugin/Feature.cs @@ -8,7 +8,7 @@ namespace Wox.Plugin public interface IContextMenu : IFeatures { - List LoadContextMenus(Result selectedResult); + List LoadContextMenus(Result selectedResult); } [Obsolete("If a plugin has a action keyword, then it is exclusive. This interface will be remove in v1.3.0")] diff --git a/src/modules/launcher/Wox.Plugin/Result.cs b/src/modules/launcher/Wox.Plugin/Result.cs index d33163d180..7631655015 100644 --- a/src/modules/launcher/Wox.Plugin/Result.cs +++ b/src/modules/launcher/Wox.Plugin/Result.cs @@ -14,6 +14,10 @@ namespace Wox.Plugin public string Title { get; set; } public string SubTitle { get; set; } + public string Glyph { get; set; } + + public string FontFamily { get; set; } + public string IcoPath { get { return _icoPath; } diff --git a/src/modules/launcher/Wox/ViewModel/ContextMenuItemViewModel.cs b/src/modules/launcher/Wox/ViewModel/ContextMenuItemViewModel.cs new file mode 100644 index 0000000000..ceb166c71a --- /dev/null +++ b/src/modules/launcher/Wox/ViewModel/ContextMenuItemViewModel.cs @@ -0,0 +1,17 @@ +using System.Drawing; +using System.Windows.Input; +using Wox.Plugin; + +namespace Wox.ViewModel +{ + public class ContextMenuItemViewModel : BaseModel + { + public string Title { get; set; } + public string Glyph { get; set; } + public string FontFamily { get; set; } + public ICommand Command { get; set; } + public string AcceleratorKey { get; set; } + public string AcceleratorModifiers { get; set; } + public bool IsEnabled { get; set; } + } +} \ No newline at end of file diff --git a/src/modules/launcher/Wox/ViewModel/MainViewModel.cs b/src/modules/launcher/Wox/ViewModel/MainViewModel.cs index 96445068ca..e28c318f05 100644 --- a/src/modules/launcher/Wox/ViewModel/MainViewModel.cs +++ b/src/modules/launcher/Wox/ViewModel/MainViewModel.cs @@ -114,6 +114,16 @@ namespace Wox.ViewModel SelectPrevItemCommand = new RelayCommand(_ => { SelectedResults.SelectPrevResult(); + }); + + SelectNextTabItemCommand = new RelayCommand(_ => + { + SelectedResults.SelectNextTabItem(); + }); + + SelectPrevTabItemCommand = new RelayCommand(_ => + { + SelectedResults.SelectPrevTabItem(); }); SelectNextPageCommand = new RelayCommand(_ => @@ -142,27 +152,33 @@ namespace Wox.ViewModel results.SelectedIndex = int.Parse(index.ToString()); } - var result = results.SelectedItem?.Result; - if (result != null) // SelectedItem returns null if selection is empty. - { - bool hideWindow = result.Action != null && result.Action(new ActionContext - { - SpecialKeyState = GlobalHotkey.Instance.CheckModifiers() - }); + //If there is a context button selected fire the action for that button before the main command. + bool didExecuteContextButton = results.SelectedItem?.ExecuteSelectedContextButton() ?? false; - if (hideWindow) + if (!didExecuteContextButton) + { + var result = results.SelectedItem?.Result; + if (result != null) // SelectedItem returns null if selection is empty. { - MainWindowVisibility = Visibility.Collapsed; - } + bool hideWindow = result.Action != null && result.Action(new ActionContext + { + SpecialKeyState = GlobalHotkey.Instance.CheckModifiers() + }); - if (SelectedIsFromQueryResults()) - { - _userSelectedRecord.Add(result); - _history.Add(result.OriginQuery.RawQuery); - } - else - { - SelectedResults = Results; + if (hideWindow) + { + MainWindowVisibility = Visibility.Collapsed; + } + + if (SelectedIsFromQueryResults()) + { + _userSelectedRecord.Add(result); + _history.Add(result.OriginQuery.RawQuery); + } + else + { + SelectedResults = Results; + } } } }); @@ -270,7 +286,11 @@ namespace Wox.ViewModel public ICommand EscCommand { get; set; } public ICommand SelectNextItemCommand { get; set; } - public ICommand SelectPrevItemCommand { get; set; } + public ICommand SelectPrevItemCommand { get; set; } + + public ICommand SelectNextTabItemCommand { get; set; } + public ICommand SelectPrevTabItemCommand { get; set; } + public ICommand SelectNextPageCommand { get; set; } public ICommand SelectPrevPageCommand { get; set; } public ICommand SelectFirstResultCommand { get; set; } @@ -287,46 +307,12 @@ namespace Wox.ViewModel { QueryResults(); } - else if (ContextMenuSelected()) - { - QueryContextMenu(); - } else if (HistorySelected()) { QueryHistory(); } } - private void QueryContextMenu() - { - const string id = "Context Menu ID"; - var query = QueryText.ToLower().Trim(); - ContextMenu.Clear(); - - var selected = Results.SelectedItem?.Result; - - if (selected != null) // SelectedItem returns null if selection is empty. - { - var results = PluginManager.GetContextMenusForPlugin(selected); - results.Add(ContextMenuTopMost(selected)); - results.Add(ContextMenuPluginInfo(selected.PluginID)); - - if (!string.IsNullOrEmpty(query)) - { - var filtered = results.Where - ( - r => StringMatcher.FuzzySearch(query, r.Title).IsSearchPrecisionScoreMet() - || StringMatcher.FuzzySearch(query, r.SubTitle).IsSearchPrecisionScoreMet() - ).ToList(); - ContextMenu.AddResults(filtered, id); - } - else - { - ContextMenu.AddResults(results, id); - } - } - } - private void QueryHistory() { const string id = "Query History ID"; @@ -387,9 +373,9 @@ namespace Wox.ViewModel // handle the exclusiveness of plugin using action keyword RemoveOldQueryResults(query); - _lastQuery = query; + _lastQuery = query; var plugins = PluginManager.ValidPluginsForQuery(query); - + Task.Run(() => { // so looping will stop once it was cancelled @@ -463,66 +449,6 @@ namespace Wox.ViewModel } - private Result ContextMenuTopMost(Result result) - { - Result menu; - if (_topMostRecord.IsTopMost(result)) - { - menu = new Result - { - Title = InternationalizationManager.Instance.GetTranslation("cancelTopMostInThisQuery"), - IcoPath = "Images\\down.png", - PluginDirectory = Constant.ProgramDirectory, - Action = _ => - { - _topMostRecord.Remove(result); - App.API.ShowMsg("Success"); - return false; - } - }; - } - else - { - menu = new Result - { - Title = InternationalizationManager.Instance.GetTranslation("setAsTopMostInThisQuery"), - IcoPath = "Images\\up.png", - PluginDirectory = Constant.ProgramDirectory, - Action = _ => - { - _topMostRecord.AddOrUpdate(result); - App.API.ShowMsg("Success"); - return false; - } - }; - } - return menu; - } - - private Result ContextMenuPluginInfo(string id) - { - var metadata = PluginManager.GetPluginForId(id).Metadata; - var translator = InternationalizationManager.Instance; - - var author = translator.GetTranslation("author"); - var website = translator.GetTranslation("website"); - var version = translator.GetTranslation("version"); - var plugin = translator.GetTranslation("plugin"); - var title = $"{plugin}: {metadata.Name}"; - var icon = metadata.IcoPath; - var subtitle = $"{author}: {metadata.Author}, {website}: {metadata.Website} {version}: {metadata.Version}"; - - var menu = new Result - { - Title = title, - IcoPath = icon, - SubTitle = subtitle, - PluginDirectory = metadata.PluginDirectory, - Action = _ => false - }; - return menu; - } - private bool SelectedIsFromQueryResults() { var selected = SelectedResults == Results; diff --git a/src/modules/launcher/Wox/ViewModel/ResultViewModel.cs b/src/modules/launcher/Wox/ViewModel/ResultViewModel.cs index 8daaf4d603..3dfb8eaef1 100644 --- a/src/modules/launcher/Wox/ViewModel/ResultViewModel.cs +++ b/src/modules/launcher/Wox/ViewModel/ResultViewModel.cs @@ -1,69 +1,186 @@ -using System; -using Wox.Infrastructure; -using Wox.Infrastructure.Image; -using Wox.Infrastructure.Logger; -using Wox.Plugin; -using Windows.UI.Xaml.Media; - - -namespace Wox.ViewModel -{ - public class ResultViewModel : BaseModel - { - public ResultViewModel(Result result) - { - if (result != null) - { - Result = result; - } - } - - public ImageSource Image - { - get - { - var imagePath = Result.IcoPath; - if (string.IsNullOrEmpty(imagePath) && Result.Icon != null) - { - try - { - return Result.Icon(); - } - catch (Exception e) - { - Log.Exception($"|ResultViewModel.Image|IcoPath is empty and exception when calling Icon() for result <{Result.Title}> of plugin <{Result.PluginDirectory}>", e); - imagePath = Constant.ErrorIcon; - } - } - - // will get here either when icoPath has value\icon delegate is null\when had exception in delegate - return ImageLoader.Load(imagePath); - } - } - - public Result Result { get; } - - public override bool Equals(object obj) - { - var r = obj as ResultViewModel; - if (r != null) - { - return Result.Equals(r.Result); - } - else - { - return false; - } - } - - public override int GetHashCode() - { - return Result.GetHashCode(); - } - - public override string ToString() - { - return Result.Title.ToString(); - } - } -} +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Runtime.CompilerServices; +using System.Windows.Controls.Ribbon; +using System.Windows.Input; +using Wox.Core.Plugin; +using Wox.Infrastructure; +using Wox.Infrastructure.Hotkey; +using Wox.Infrastructure.Image; +using Wox.Infrastructure.Logger; +using Wox.Plugin; +using Windows.UI.Xaml.Media; + + +namespace Wox.ViewModel +{ + public class ResultViewModel : BaseModel + { + public List ContextMenuItems { get; set; } + + public ICommand LoadContextMenuCommand { get; set; } + + public bool IsSelected { get; set; } + + public int ContextMenuSelectedIndex { get; set; } + + const int NoSelectionIndex = -1; + + public ResultViewModel(Result result) + { + if (result != null) + { + Result = result; + } + ContextMenuSelectedIndex = NoSelectionIndex; + LoadContextMenuCommand = new RelayCommand(LoadContextMenu); + } + public void LoadContextMenu(object sender=null) + { + var results = PluginManager.GetContextMenusForPlugin(Result); + var newItems = new List(); + foreach (var r in results) + { + newItems.Add(new ContextMenuItemViewModel + { + Title = r.Title, + Glyph = r.Glyph, + FontFamily = r.FontFamily, + AcceleratorKey = r.AcceleratorKey, + AcceleratorModifiers = r.AcceleratorModifiers, + Command = new RelayCommand(_ => + { + bool hideWindow = r.Action != null && r.Action(new ActionContext + { + SpecialKeyState = GlobalHotkey.Instance.CheckModifiers() + }); + + if (hideWindow) + { + //TODO - Do we hide the window + // MainWindowVisibility = Visibility.Collapsed; + } + }) + }); + } + + ContextMenuItems = newItems; + } + + internal void EnableContextMenu() + { + foreach(var i in ContextMenuItems) + { + i.IsEnabled = true; + } + } + + internal void DisableContextMenu() + { + foreach (var i in ContextMenuItems) + { + i.IsEnabled = false; + } + } + + public ImageSource Image + { + get + { + var imagePath = Result.IcoPath; + if (string.IsNullOrEmpty(imagePath) && Result.Icon != null) + { + try + { + return Result.Icon(); + } + catch (Exception e) + { + Log.Exception($"|ResultViewModel.Image|IcoPath is empty and exception when calling Icon() for result <{Result.Title}> of plugin <{Result.PluginDirectory}>", e); + imagePath = Constant.ErrorIcon; + } + } + + // will get here either when icoPath has value\icon delegate is null\when had exception in delegate + return ImageLoader.Load(imagePath); + } + } + + //Returns false if we've already reached the last item. + public bool SelectNextContextButton() + { + if(ContextMenuSelectedIndex == (ContextMenuItems.Count -1)) + { + ContextMenuSelectedIndex = NoSelectionIndex; + return false; + } + + ContextMenuSelectedIndex++; + return true; + } + + //Returns false if we've already reached the first item. + public bool SelectPrevContextButton() + { + if (ContextMenuSelectedIndex == NoSelectionIndex) + { + return false; + } + + ContextMenuSelectedIndex--; + return true; + } + + public void SelectLastContextButton() + { + ContextMenuSelectedIndex = ContextMenuItems.Count - 1; + } + + public bool HasSelectedContextButton() + { + var isContextSelected = (ContextMenuSelectedIndex != NoSelectionIndex); + return isContextSelected; + } + + /// + /// Triggers the action on the selected context button + /// + /// False if there is nothing selected, oherwise true + public bool ExecuteSelectedContextButton() + { + if (HasSelectedContextButton()) + { + ContextMenuItems[ContextMenuSelectedIndex].Command.Execute(null); + return true; + } + + return false; + } + + public Result Result { get; } + + public override bool Equals(object obj) + { + var r = obj as ResultViewModel; + if (r != null) + { + return Result.Equals(r.Result); + } + else + { + return false; + } + } + + public override int GetHashCode() + { + return Result.GetHashCode(); + } + + public override string ToString() + { + return Result.Title.ToString(); + } + } +} diff --git a/src/modules/launcher/Wox/ViewModel/ResultsViewModel.cs b/src/modules/launcher/Wox/ViewModel/ResultsViewModel.cs index 76a7ee75ba..d237b0b238 100644 --- a/src/modules/launcher/Wox/ViewModel/ResultsViewModel.cs +++ b/src/modules/launcher/Wox/ViewModel/ResultsViewModel.cs @@ -6,6 +6,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; +using System.Windows.Input; using Wox.Infrastructure.UserSettings; using Wox.Plugin; @@ -47,9 +48,33 @@ namespace Wox.ViewModel public int SelectedIndex { get; set; } - public ResultViewModel SelectedItem { get; set; } + private ResultViewModel _selectedItem; + public ResultViewModel SelectedItem + { + get { return _selectedItem; } + set + { + //value can be null when selecting an item in a virtualized list + if (value != null) + { + if (_selectedItem != null) + { + _selectedItem.IsSelected = false; + _selectedItem.DisableContextMenu(); + } + + _selectedItem = value; + _selectedItem.LoadContextMenu(); + _selectedItem.EnableContextMenu(); + _selectedItem.IsSelected = true; + } + } + } + + + public Thickness Margin { get; set; } - public Visibility Visbility { get; set; } = Visibility.Collapsed; + public Visibility Visbility { get; set; } = Visibility.Hidden; #endregion @@ -127,8 +152,26 @@ namespace Wox.ViewModel public void RemoveResultsFor(PluginMetadata metadata) { Results.RemoveAll(r => r.Result.PluginID == metadata.ID); - } - + } + + public void SelectNextTabItem() + { + if(!SelectedItem.SelectNextContextButton()) + { + SelectNextResult(); + } + } + + public void SelectPrevTabItem() + { + if (!SelectedItem.SelectPrevContextButton()) + { + //Tabbing backwards should highlight the last item of the previous row + SelectPrevResult(); + SelectedItem.SelectLastContextButton(); + } + } + /// /// To avoid deadlock, this method should not called from main thread /// @@ -149,6 +192,7 @@ namespace Wox.ViewModel else { Margin = new Thickness { Top = 0 }; + Visbility = Visibility.Collapsed; } } }