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; } } }