From c596039453523fdfa7d4daceaa91bce8f9df783d Mon Sep 17 00:00:00 2001 From: bao-qian Date: Mon, 28 Mar 2016 01:09:40 +0100 Subject: [PATCH] Rearrange query execution order 1. remove usage of PushResult 2. rearrange query execution order 3. decouple UserSetting dependency 4. remove instant query 5. remove backkeydown event 6. part of #389 --- Plugins/Wox.Plugin.Folder/FolderPlugin.cs | 21 --------- Wox.Core/Plugin/PluginInstaller.cs | 2 +- Wox.Core/Plugin/PluginManager.cs | 57 +++++++++-------------- Wox.Plugin/IPublicAPI.cs | 9 ++-- Wox.Test/Plugins/PluginInitTest.cs | 2 +- Wox/App.xaml.cs | 7 ++- Wox/Languages/en.xaml | 2 +- Wox/PublicAPIInstance.cs | 27 ++++------- Wox/SettingWindow.xaml | 2 +- Wox/ViewModel/MainViewModel.cs | 45 +++++++++++++----- 10 files changed, 77 insertions(+), 97 deletions(-) diff --git a/Plugins/Wox.Plugin.Folder/FolderPlugin.cs b/Plugins/Wox.Plugin.Folder/FolderPlugin.cs index 18109c7092..c57cdad1e8 100644 --- a/Plugins/Wox.Plugin.Folder/FolderPlugin.cs +++ b/Plugins/Wox.Plugin.Folder/FolderPlugin.cs @@ -21,7 +21,6 @@ namespace Wox.Plugin.Folder public void Init(PluginInitContext context) { this.context = context; - this.context.API.BackKeyDownEvent += ApiBackKeyDownEvent; InitialDriverList(); if (FolderStorage.Instance.FolderLinks == null) { @@ -30,26 +29,6 @@ namespace Wox.Plugin.Folder } } - private void ApiBackKeyDownEvent(WoxKeyDownEventArgs e) - { - string query = e.Query; - if (Directory.Exists(query)) - { - if (query.EndsWith("\\")) - { - query = query.Remove(query.Length - 1); - } - - if (query.Contains("\\")) - { - int index = query.LastIndexOf("\\"); - query = query.Remove(index) + "\\"; - } - - context.API.ChangeQuery(query); - } - } - public List Query(Query query) { string input = query.Search.ToLower(); diff --git a/Wox.Core/Plugin/PluginInstaller.cs b/Wox.Core/Plugin/PluginInstaller.cs index 4f7f221d75..d4155a917f 100644 --- a/Wox.Core/Plugin/PluginInstaller.cs +++ b/Wox.Core/Plugin/PluginInstaller.cs @@ -80,7 +80,7 @@ namespace Wox.Core.Plugin //current solution is to restart wox. Ugly. //if (MainWindow.Initialized) //{ - // Plugins.Init(); + // Plugins.Initialize(); //} if (MessageBox.Show($"You have installed plugin {plugin.Name} successfully.{Environment.NewLine}" + " Restart Wox to take effect?", diff --git a/Wox.Core/Plugin/PluginManager.cs b/Wox.Core/Plugin/PluginManager.cs index ba114c3d3e..29213be54b 100644 --- a/Wox.Core/Plugin/PluginManager.cs +++ b/Wox.Core/Plugin/PluginManager.cs @@ -63,12 +63,10 @@ namespace Wox.Core.Plugin /// /// Load and init all Wox plugins /// - public static void Init(IPublicAPI api) + /// + public static void Initialize() { - if (api == null) throw new WoxFatalException("api is null"); - SetupPluginDirectories(); - API = api; var metadatas = PluginConfig.Parse(PluginDirectories); AllPlugins = (new CSharpPluginLoader().LoadPlugin(metadatas)). @@ -76,7 +74,11 @@ namespace Wox.Core.Plugin //load plugin i18n languages ResourceMerger.UpdatePluginLanguages(); + } + public static void InitializePlugins(IPublicAPI api) + { + API = api; foreach (PluginPair pluginPair in AllPlugins) { PluginPair pair = pluginPair; @@ -98,7 +100,6 @@ namespace Wox.Core.Plugin ThreadPool.QueueUserWorkItem(o => { - InstantQueryPlugins = GetPluginsForInterface(); _contextMenuPlugins = GetPluginsForInterface(); foreach (var plugin in AllPlugins) { @@ -149,53 +150,41 @@ namespace Wox.Core.Plugin }; } - public static void QueryForAllPlugins(Query query) + public static List ValidPluginsForQuery(Query query) { - var pluginPairs = NonGlobalPlugins.ContainsKey(query.ActionKeyword) ? - new List { NonGlobalPlugins[query.ActionKeyword] } : GlobalPlugins; - foreach (var plugin in pluginPairs) + if (NonGlobalPlugins.ContainsKey(query.ActionKeyword)) { - var customizedPluginConfig = UserSettingStorage.Instance. - CustomizedPluginConfigs[plugin.Metadata.ID]; - if (customizedPluginConfig.Disabled) continue; - if (IsInstantQueryPlugin(plugin)) - { - Stopwatch.Normal($"Instant QueryForPlugin for {plugin.Metadata.Name}", () => - { - QueryForPlugin(plugin, query); - }); - } - else - { - ThreadPool.QueueUserWorkItem(state => - { - Stopwatch.Normal($"Normal QueryForPlugin for {plugin.Metadata.Name}", () => - { - QueryForPlugin(plugin, query); - }); - }); - } + var plugin = NonGlobalPlugins[query.ActionKeyword]; + return new List { plugin }; + } + else + { + return GlobalPlugins; } } - - private static void QueryForPlugin(PluginPair pair, Query query) + public static List QueryForPlugin(PluginPair pair, Query query) { + var results = new List(); try { - List results = new List(); var milliseconds = Stopwatch.Normal($"Plugin.Query cost for {pair.Metadata.Name}", () => { results = pair.Plugin.Query(query) ?? results; - results.ForEach(o => { o.PluginID = pair.Metadata.ID; }); + results.ForEach(o => + { + o.PluginDirectory = pair.Metadata.PluginDirectory; + o.PluginID = pair.Metadata.ID; + o.OriginQuery = query; + }); }); pair.QueryCount += 1; pair.AvgQueryTime = pair.QueryCount == 1 ? milliseconds : (pair.AvgQueryTime + milliseconds) / 2; - API.PushResults(query, pair.Metadata, results); } catch (Exception e) { throw new WoxPluginException(pair.Metadata.Name, $"QueryForPlugin failed", e); } + return results; } private static bool IsGlobalPlugin(PluginMetadata metadata) diff --git a/Wox.Plugin/IPublicAPI.cs b/Wox.Plugin/IPublicAPI.cs index d8b41aef46..356671a661 100644 --- a/Wox.Plugin/IPublicAPI.cs +++ b/Wox.Plugin/IPublicAPI.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace Wox.Plugin { @@ -13,6 +14,7 @@ namespace Wox.Plugin /// /// /// + [Obsolete("This method will be removed in Wox 1.3")] void PushResults(Query query, PluginMetadata plugin, List results); /// @@ -99,11 +101,6 @@ namespace Wox.Plugin /// List GetAllPlugins(); - /// - /// Fired after Back key down in the Wox query box - /// - event WoxKeyDownEventHandler BackKeyDownEvent; - /// /// Fired after global keyboard events /// if you want to hook something like Ctrl+R, you should use this event diff --git a/Wox.Test/Plugins/PluginInitTest.cs b/Wox.Test/Plugins/PluginInitTest.cs index 2afd891533..2ca59f64c5 100644 --- a/Wox.Test/Plugins/PluginInitTest.cs +++ b/Wox.Test/Plugins/PluginInitTest.cs @@ -11,7 +11,7 @@ namespace Wox.Test.Plugins [Test] public void PublicAPIIsNullTest() { - Assert.Throws(typeof(WoxFatalException), () => PluginManager.Init(null)); + //Assert.Throws(typeof(WoxFatalException), () => PluginManager.Initialize(null)); } } } diff --git a/Wox/App.xaml.cs b/Wox/App.xaml.cs index 4cbd7cea2d..ca0602b369 100644 --- a/Wox/App.xaml.cs +++ b/Wox/App.xaml.cs @@ -47,11 +47,14 @@ namespace Wox ThreadPool.SetMinThreads(10, 5); ThreadPool.QueueUserWorkItem(_ => { ImageLoader.ImageLoader.PreloadImages(); }); - MainViewModel mainVM = new MainViewModel(); + PluginManager.Initialize(); + UserSettingStorage settings = UserSettingStorage.Instance; + MainViewModel mainVM = new MainViewModel(settings); API = new PublicAPIInstance(mainVM); + PluginManager.InitializePlugins(API); + Window = new MainWindow {DataContext = mainVM}; NotifyIconManager notifyIconManager = new NotifyIconManager(API); - PluginManager.Init(API); CommandArgsFactory.Execute(e.Args.ToList()); // happlebao todo: the whole setting releated initialization should be put into seperate class/method diff --git a/Wox/Languages/en.xaml b/Wox/Languages/en.xaml index 8040ad6bc7..c7cbfa81c0 100644 --- a/Wox/Languages/en.xaml +++ b/Wox/Languages/en.xaml @@ -32,7 +32,7 @@ Action keywords Plugin Directory Author - Init time: {0}ms + Initialize time: {0}ms Query time: {0}ms diff --git a/Wox/PublicAPIInstance.cs b/Wox/PublicAPIInstance.cs index 9ba2b19b91..c07bd42608 100644 --- a/Wox/PublicAPIInstance.cs +++ b/Wox/PublicAPIInstance.cs @@ -19,36 +19,21 @@ namespace Wox { public class PublicAPIInstance : IPublicAPI { - + private UserSettingStorage _settings; #region Constructor public PublicAPIInstance(MainViewModel mainVM) { MainVM = mainVM; - - GlobalHotkey.Instance.hookedKeyboardCallback += KListener_hookedKeyboardCallback; WebRequest.RegisterPrefix("data", new DataWebRequestFactory()); - - MainVM.ListeningKeyPressed += (o, e) => - { - - if (e.KeyEventArgs.Key == Key.Back) - { - BackKeyDownEvent?.Invoke(new WoxKeyDownEventArgs - { - Query = MainVM.QueryText, - keyEventArgs = e.KeyEventArgs - }); - } - }; } #endregion #region Properties - private MainViewModel MainVM + public MainViewModel MainVM { get; set; @@ -131,7 +116,11 @@ namespace Wox public void ReloadPlugins() { - Application.Current.Dispatcher.Invoke(() => PluginManager.Init(this)); + Application.Current.Dispatcher.Invoke(() => + { + PluginManager.Initialize(); + PluginManager.InitializePlugins(this); + }); } public string GetTranslation(string key) @@ -144,9 +133,9 @@ namespace Wox return PluginManager.AllPlugins.ToList(); } - public event WoxKeyDownEventHandler BackKeyDownEvent; public event WoxGlobalKeyboardEventHandler GlobalKeyboardEvent; + [Obsolete("This will be removed in Wox 1.3")] public void PushResults(Query query, PluginMetadata plugin, List results) { results.ForEach(o => diff --git a/Wox/SettingWindow.xaml b/Wox/SettingWindow.xaml index cdbe1088dc..e6ef2bce54 100644 --- a/Wox/SettingWindow.xaml +++ b/Wox/SettingWindow.xaml @@ -126,7 +126,7 @@ - + { - var nextQuery = QueryHistoryStorage.Instance.Next(); + var nextQuery = _queryHistory.Next(); DisplayQueryHistory(nextQuery); }); DisplayPrevQueryCommand = new RelayCommand(_ => { - var prev = QueryHistoryStorage.Instance.Previous(); + var prev = _queryHistory.Previous(); DisplayQueryHistory(prev); }); @@ -288,8 +299,8 @@ namespace Wox.ViewModel MainWindowVisibility = Visibility.Collapsed; } - UserSelectedRecordStorage.Instance.Add(result); - QueryHistoryStorage.Instance.Add(result.OriginQuery.RawQuery); + _userSelectedRecord.Add(result); + _queryHistory.Add(result.OriginQuery.RawQuery); }); LoadContextMenuCommand = new RelayCommand(_ => @@ -413,7 +424,19 @@ namespace Wox.ViewModel } }; action.Invoke(); - PluginManager.QueryForAllPlugins(query); + var plugins = PluginManager.ValidPluginsForQuery(query); + foreach (var plugin in plugins) + { + var config = _settings.CustomizedPluginConfigs[plugin.Metadata.ID]; + if (!config.Disabled) + { + ThreadPool.QueueUserWorkItem(o => + { + var results = PluginManager.QueryForPlugin(plugin, query); + UpdateResultView(results, plugin.Metadata, query); + }); + } + } } IsProgressBarTooltipVisible = false; @@ -422,7 +445,7 @@ namespace Wox.ViewModel private void ResetQueryHistoryIndex() { Results.RemoveResultsFor(QueryHistoryStorage.MetaData); - QueryHistoryStorage.Instance.Reset(); + _queryHistory.Reset(); } private void UpdateResultViewInternal(List list, PluginMetadata metadata) @@ -462,14 +485,14 @@ namespace Wox.ViewModel } private Result GetTopMostContextMenu(Result result) { - if (TopMostRecordStorage.Instance.IsTopMost(result)) + if (_topMostRecord.IsTopMost(result)) { return new Result(InternationalizationManager.Instance.GetTranslation("cancelTopMostInThisQuery"), "Images\\down.png") { PluginDirectory = WoxDirectroy.Executable, Action = _ => { - TopMostRecordStorage.Instance.Remove(result); + _topMostRecord.Remove(result); App.API.ShowMsg("Succeed"); return false; } @@ -482,7 +505,7 @@ namespace Wox.ViewModel PluginDirectory = WoxDirectroy.Executable, Action = _ => { - TopMostRecordStorage.Instance.AddOrUpdate(result); + _topMostRecord.AddOrUpdate(result); App.API.ShowMsg("Succeed"); return false; } @@ -500,7 +523,7 @@ namespace Wox.ViewModel list.ForEach(o => { - o.Score += UserSelectedRecordStorage.Instance.GetSelectedCount(o) * 5; + o.Score += _userSelectedRecord.GetSelectedCount(o) * 5; }); if (originQuery.RawQuery == _lastQuery.RawQuery) {