From 1ddd94b95c0af1207d463c73fb411cbf910b5583 Mon Sep 17 00:00:00 2001 From: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> Date: Thu, 23 Apr 2020 12:46:08 -0700 Subject: [PATCH] Revert "Removed folder plugin" This reverts commit 064d638588cfb2d2d69cd1f88b92127c200eac2d. We will use the folder plugin to better mimic the way the start menu and run prompt deal with directories --- PowerToys.sln | 18 + .../Wox.Plugin.Folder/ContextMenuLoader.cs | 151 +++++++++ .../Plugins/Wox.Plugin.Folder/FolderLink.cs | 18 + .../FolderPluginSettings.xaml | 34 ++ .../FolderPluginSettings.xaml.cs | 130 ++++++++ .../Plugins/Wox.Plugin.Folder/Images/copy.png | Bin 0 -> 501 bytes .../Images/deletefilefolder.png | Bin 0 -> 19719 bytes .../Plugins/Wox.Plugin.Folder/Images/file.png | Bin 0 -> 290 bytes .../Wox.Plugin.Folder/Images/folder.png | Bin 0 -> 468 bytes .../Plugins/Wox.Plugin.Folder/Images/user.png | Bin 0 -> 65650 bytes .../Wox.Plugin.Folder/Languages/de.xaml | 15 + .../Wox.Plugin.Folder/Languages/en.xaml | 15 + .../Wox.Plugin.Folder/Languages/pl.xaml | 15 + .../Wox.Plugin.Folder/Languages/tr.xaml | 15 + .../Wox.Plugin.Folder/Languages/zh-cn.xaml | 15 + .../Wox.Plugin.Folder/Languages/zh-tw.xaml | 15 + .../Plugins/Wox.Plugin.Folder/Main.cs | 310 ++++++++++++++++++ .../Plugins/Wox.Plugin.Folder/Settings.cs | 12 + .../Wox.Plugin.Folder.csproj | 112 +++++++ .../Plugins/Wox.Plugin.Folder/plugin.json | 12 + 20 files changed, 887 insertions(+) create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/ContextMenuLoader.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/FolderLink.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/FolderPluginSettings.xaml create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/FolderPluginSettings.xaml.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Images/copy.png create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Images/deletefilefolder.png create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Images/file.png create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Images/folder.png create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Images/user.png create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Languages/de.xaml create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Languages/en.xaml create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Languages/pl.xaml create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Languages/tr.xaml create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Languages/zh-cn.xaml create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Languages/zh-tw.xaml create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Main.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Settings.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/Wox.Plugin.Folder.csproj create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Folder/plugin.json diff --git a/PowerToys.sln b/PowerToys.sln index 75ce73d4c..84ac37b42 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -162,6 +162,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wox", "src\modules\launcher {59BD9891-3837-438A-958D-ADC7F91F6F7E} = {59BD9891-3837-438A-958D-ADC7F91F6F7E} {74F1B9ED-F59C-4FE7-B473-7B453E30837E} = {74F1B9ED-F59C-4FE7-B473-7B453E30837E} {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} + {787B8AA6-CA93-4C84-96FE-DF31110AD1C4} = {787B8AA6-CA93-4C84-96FE-DF31110AD1C4} {F8B870EB-D5F5-45BA-9CF7-A5C459818820} = {F8B870EB-D5F5-45BA-9CF7-A5C459818820} EndProjectSection EndProject @@ -183,6 +184,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wox.Plugin.Program", "src\m EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wox.Plugin.Shell", "src\modules\launcher\Plugins\Wox.Plugin.Shell\Wox.Plugin.Shell.csproj", "{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wox.Plugin.Folder", "src\modules\launcher\Plugins\Wox.Plugin.Folder\Wox.Plugin.Folder.csproj", "{787B8AA6-CA93-4C84-96FE-DF31110AD1C4}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.Indexer", "src\modules\launcher\Plugins\Microsoft.Plugin.Indexer\Microsoft.Plugin.Indexer.csproj", "{F8B870EB-D5F5-45BA-9CF7-A5C459818820}" ProjectSection(ProjectDependencies) = postProject {8451ECDD-2EA4-4966-BB0A-7BBC40138E80} = {8451ECDD-2EA4-4966-BB0A-7BBC40138E80} @@ -561,6 +564,10 @@ Global {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|x64.ActiveCfg = Release|x64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.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 @@ -601,6 +608,16 @@ Global {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 @@ -777,6 +794,7 @@ Global {74F1B9ED-F59C-4FE7-B473-7B453E30837E} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {FDB3555B-58EF-4AE6-B5F1-904719637AB4} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {4AFC9975-2456-4C70-94A4-84073C1CED93} + {787B8AA6-CA93-4C84-96FE-DF31110AD1C4} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {F8B870EB-D5F5-45BA-9CF7-A5C459818820} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {E364F67B-BB12-4E91-B639-355866EBCD8B} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} {F97E5003-F263-4D4A-A964-0F1F3C82DEF2} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Folder/ContextMenuLoader.cs b/src/modules/launcher/Plugins/Wox.Plugin.Folder/ContextMenuLoader.cs new file mode 100644 index 000000000..f6e83b178 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Folder/ContextMenuLoader.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Threading.Tasks; +using System.Windows; +using Wox.Infrastructure.Logger; +using Wox.Infrastructure.Image; +using Wox.Plugin.SharedCommands; + +namespace Wox.Plugin.Folder +{ + internal class ContextMenuLoader : IContextMenu + { + private readonly PluginInitContext _context; + + public ContextMenuLoader(PluginInitContext context) + { + _context = context; + } + + public List LoadContextMenus(Result selectedResult) + { + var contextMenus = new List(); + if (selectedResult.ContextData is SearchResult record) + { + if (record.Type == ResultType.File) + { + 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 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.FullPath); + 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.FullPath}\""); + } + catch(Exception e) + { + var message = $"Fail to open file at {record.FullPath}"; + LogException(message, e); + _context.API.ShowMsg(message); + return false; + } + + return true; + } + }; + } + + + private Result CreateOpenWithEditorResult(SearchResult record) + { + string editorPath = "notepad.exe"; // TODO add the ability to create a custom editor + + var name = "Open With Editor: " + Path.GetFileNameWithoutExtension(editorPath); + return new Result + { + Title = name, + Action = _ => + { + try + { + Process.Start(editorPath, record.FullPath); + return true; + } + catch (Exception e) + { + var message = $"Fail to editor for file at {record.FullPath}"; + LogException(message, e); + _context.API.ShowMsg(message); + return false; + } + }, + IcoPath = editorPath + }; + } + + public void LogException(string message, Exception e) + { + Log.Exception($"|Wox.Plugin.Folder.ContextMenu|{message}", e); + } + + private bool CanRunAsDifferentUser(string path) + { + switch(Path.GetExtension(path)) + { + case ".exe": + case ".bat": + return true; + + default: + return false; + + } + } + } + + public class SearchResult + { + public string FullPath { get; set; } + public ResultType Type { get; set; } + } + + public enum ResultType + { + Volume, + Folder, + File + } +} \ No newline at end of file diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Folder/FolderLink.cs b/src/modules/launcher/Plugins/Wox.Plugin.Folder/FolderLink.cs new file mode 100644 index 000000000..8148c45bf --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Folder/FolderLink.cs @@ -0,0 +1,18 @@ +using System; +using System.Linq; +using Newtonsoft.Json; + +namespace Wox.Plugin.Folder +{ + [JsonObject(MemberSerialization.OptIn)] + public class FolderLink + { + [JsonProperty] + public string Path { get; set; } + + public string Nickname => + Path.Split(new[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.None) + .Last() + + " (" + System.IO.Path.GetDirectoryName(Path) + ")"; + } +} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Folder/FolderPluginSettings.xaml b/src/modules/launcher/Plugins/Wox.Plugin.Folder/FolderPluginSettings.xaml new file mode 100644 index 000000000..93b9178e0 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Folder/FolderPluginSettings.xaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + +