diff --git a/Plugins/Wox.Plugin.BrowserBookmark/Commands/Bookmarks.cs b/Plugins/Wox.Plugin.BrowserBookmark/Commands/Bookmarks.cs new file mode 100644 index 0000000000..778e0ee65b --- /dev/null +++ b/Plugins/Wox.Plugin.BrowserBookmark/Commands/Bookmarks.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.Linq; +using Wox.Infrastructure; + +namespace Wox.Plugin.BrowserBookmark.Commands +{ + internal static class Bookmarks + { + internal static bool MatchProgram(Bookmark bookmark, string queryString) + { + if (StringMatcher.FuzzySearch(queryString, bookmark.Name, new MatchOption()).IsSearchPrecisionScoreMet()) return true; + if (StringMatcher.FuzzySearch(queryString, bookmark.PinyinName, new MatchOption()).IsSearchPrecisionScoreMet()) return true; + if (StringMatcher.FuzzySearch(queryString, bookmark.Url, new MatchOption()).IsSearchPrecisionScoreMet()) return true; + + return false; + } + + internal static List LoadAllBookmarks() + { + var allbookmarks = new List(); + + var chromeBookmarks = new ChromeBookmarks(); + var mozBookmarks = new FirefoxBookmarks(); + + //TODO: Let the user select which browser's bookmarks are displayed + // Add Firefox bookmarks + mozBookmarks.GetBookmarks().ForEach(x => allbookmarks.Add(x)); + + // Add Chrome bookmarks + chromeBookmarks.GetBookmarks().ForEach(x => allbookmarks.Add(x)); + + return allbookmarks.Distinct().ToList(); + } + } +} diff --git a/Plugins/Wox.Plugin.BrowserBookmark/Main.cs b/Plugins/Wox.Plugin.BrowserBookmark/Main.cs index e18eb49530..a2805b1c1e 100644 --- a/Plugins/Wox.Plugin.BrowserBookmark/Main.cs +++ b/Plugins/Wox.Plugin.BrowserBookmark/Main.cs @@ -1,32 +1,21 @@ using System.Collections.Generic; using System.Linq; -using Wox.Infrastructure; +using Wox.Plugin.BrowserBookmark.Commands; using Wox.Plugin.SharedCommands; namespace Wox.Plugin.BrowserBookmark { - public class Main : IPlugin + public class Main : IPlugin, IReloadable { private PluginInitContext context; - - // TODO: periodically refresh the Cache? + private List cachedBookmarks = new List(); public void Init(PluginInitContext context) { this.context = context; - // Cache all bookmarks - var chromeBookmarks = new ChromeBookmarks(); - var mozBookmarks = new FirefoxBookmarks(); - - //TODO: Let the user select which browser's bookmarks are displayed - // Add Firefox bookmarks - cachedBookmarks.AddRange(mozBookmarks.GetBookmarks()); - // Add Chrome bookmarks - cachedBookmarks.AddRange(chromeBookmarks.GetBookmarks()); - - cachedBookmarks = cachedBookmarks.Distinct().ToList(); + cachedBookmarks = Bookmarks.LoadAllBookmarks(); } public List Query(Query query) @@ -41,7 +30,7 @@ namespace Wox.Plugin.BrowserBookmark if (!topResults) { // Since we mixed chrome and firefox bookmarks, we should order them again - returnList = cachedBookmarks.Where(o => MatchProgram(o, param)).ToList(); + returnList = cachedBookmarks.Where(o => Bookmarks.MatchProgram(o, param)).ToList(); returnList = returnList.OrderByDescending(o => o.Score).ToList(); } @@ -60,13 +49,11 @@ namespace Wox.Plugin.BrowserBookmark }).ToList(); } - private bool MatchProgram(Bookmark bookmark, string queryString) + public void ReloadData() { - if (StringMatcher.FuzzySearch(queryString, bookmark.Name, new MatchOption()).IsSearchPrecisionScoreMet()) return true; - if ( StringMatcher.FuzzySearch(queryString, bookmark.PinyinName, new MatchOption()).IsSearchPrecisionScoreMet()) return true; - if (StringMatcher.FuzzySearch(queryString, bookmark.Url, new MatchOption()).IsSearchPrecisionScoreMet()) return true; + cachedBookmarks.Clear(); - return false; + cachedBookmarks = Bookmarks.LoadAllBookmarks(); } } } diff --git a/Plugins/Wox.Plugin.BrowserBookmark/Wox.Plugin.BrowserBookmark.csproj b/Plugins/Wox.Plugin.BrowserBookmark/Wox.Plugin.BrowserBookmark.csproj index db420b4659..4252438c4d 100644 --- a/Plugins/Wox.Plugin.BrowserBookmark/Wox.Plugin.BrowserBookmark.csproj +++ b/Plugins/Wox.Plugin.BrowserBookmark/Wox.Plugin.BrowserBookmark.csproj @@ -66,6 +66,7 @@ + diff --git a/Plugins/Wox.Plugin.Program/Main.cs b/Plugins/Wox.Plugin.Program/Main.cs index 7cdb3507b0..575d147696 100644 --- a/Plugins/Wox.Plugin.Program/Main.cs +++ b/Plugins/Wox.Plugin.Program/Main.cs @@ -13,7 +13,7 @@ using Stopwatch = Wox.Infrastructure.Stopwatch; namespace Wox.Plugin.Program { - public class Main : ISettingProvider, IPlugin, IPluginI18n, IContextMenu, ISavable + public class Main : ISettingProvider, IPlugin, IPluginI18n, IContextMenu, ISavable, IReloadable { private static readonly object IndexLock = new object(); private static Win32[] _win32s; @@ -145,5 +145,13 @@ namespace Wox.Plugin.Program } return hide; } + + public void ReloadData() + { + Task.Run(() => + { + IndexPrograms(); + }); + } } } \ No newline at end of file diff --git a/Plugins/Wox.Plugin.Sys/Main.cs b/Plugins/Wox.Plugin.Sys/Main.cs index bb447db9e5..6186b3cacc 100644 --- a/Plugins/Wox.Plugin.Sys/Main.cs +++ b/Plugins/Wox.Plugin.Sys/Main.cs @@ -207,6 +207,17 @@ namespace Wox.Plugin.Sys context.API.OpenSettingDialog(); return true; } + }, + new Result + { + Title = "Reload Plugin Data", + SubTitle = "Reloads plugin data with new content added after Wox started. Plugins need to have this feature already added.", + IcoPath = "Images\\app.png", + Action = c => + { + context.API.ReloadAllPluginData(); + return true; + } } }); return results; diff --git a/Wox.Core/Plugin/PluginManager.cs b/Wox.Core/Plugin/PluginManager.cs index 6ca826fd9b..e42cf02e80 100644 --- a/Wox.Core/Plugin/PluginManager.cs +++ b/Wox.Core/Plugin/PluginManager.cs @@ -3,9 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; -using Wox.Core.Resource; using Wox.Infrastructure; -using Wox.Infrastructure.Exception; using Wox.Infrastructure.Logger; using Wox.Infrastructure.Storage; using Wox.Infrastructure.UserSettings; @@ -66,6 +64,15 @@ namespace Wox.Core.Plugin } } + public static void ReloadData() + { + foreach(var plugin in AllPlugins) + { + var reloadablePlugin = plugin.Plugin as IReloadable; + reloadablePlugin?.ReloadData(); + } + } + static PluginManager() { ValidateUserDirectory(); diff --git a/Wox.Plugin/IPublicAPI.cs b/Wox.Plugin/IPublicAPI.cs index 7dcac48440..eb3f18fa70 100644 --- a/Wox.Plugin/IPublicAPI.cs +++ b/Wox.Plugin/IPublicAPI.cs @@ -62,6 +62,14 @@ namespace Wox.Plugin /// void SaveAppAllSettings(); + /// + /// Reloads any Plugins that have the + /// IReloadable implemented. It refeshes + /// Plugin's in memory data with new content + /// added by user. + /// + void ReloadAllPluginData(); + /// /// Show message box /// diff --git a/Wox.Plugin/Interfaces/IReloadable.cs b/Wox.Plugin/Interfaces/IReloadable.cs new file mode 100644 index 0000000000..86f75ee3e9 --- /dev/null +++ b/Wox.Plugin/Interfaces/IReloadable.cs @@ -0,0 +1,18 @@ +namespace Wox.Plugin +{ + /// + /// This interface is to indicate and allow plugins to reload their + /// in memory data cache or other mediums when user makes a new change + /// that is not immediately captured. For example, for BrowserBookmark and Program + /// plugin does not automatically detect when a user added a new bookmark or program, + /// so this interface's function is exposed to allow user manually do the reloading after + /// those new additions. + /// + /// The command that allows user to manual reload is exposed via Plugin.Sys, and + /// it will call the plugins that have implemented this interface. + /// + public interface IReloadable + { + void ReloadData(); + } +} diff --git a/Wox.Plugin/Wox.Plugin.csproj b/Wox.Plugin/Wox.Plugin.csproj index 8b1e9f0ca7..843cc7d8bf 100644 --- a/Wox.Plugin/Wox.Plugin.csproj +++ b/Wox.Plugin/Wox.Plugin.csproj @@ -66,6 +66,7 @@ + diff --git a/Wox/PublicAPIInstance.cs b/Wox/PublicAPIInstance.cs index 9c8e7008bd..4bcc825309 100644 --- a/Wox/PublicAPIInstance.cs +++ b/Wox/PublicAPIInstance.cs @@ -73,6 +73,11 @@ namespace Wox Alphabet.Save(); } + public void ReloadAllPluginData() + { + PluginManager.ReloadData(); + } + [Obsolete] public void HideApp() {