From 405d55f3f6f7bccd1c1476d5866d7f434ecc59ee Mon Sep 17 00:00:00 2001 From: bao-qian Date: Tue, 10 May 2016 01:08:54 +0100 Subject: [PATCH] Don't call init() and constructor for disabled plugins part of #351 --- Wox.Core/Plugin/PluginManager.cs | 26 +++++++++++++++----------- Wox.Core/Plugin/PluginsLoader.cs | 11 +++++++++++ Wox/App.xaml.cs | 16 +++++++++++----- Wox/ViewModel/MainViewModel.cs | 9 ++++----- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/Wox.Core/Plugin/PluginManager.cs b/Wox.Core/Plugin/PluginManager.cs index 2b8ee81cba..d5d2d84970 100644 --- a/Wox.Core/Plugin/PluginManager.cs +++ b/Wox.Core/Plugin/PluginManager.cs @@ -55,18 +55,22 @@ namespace Wox.Core.Plugin { ValidateUserDirectory(); - // todo happlebao temp hack to let MainVM to register ResultsUpdated event - _metadatas = PluginConfig.Parse(Directories); - AllPlugins = PluginsLoader.CSharpPlugins(_metadatas).ToList(); } - public static void InitializePlugins(IPublicAPI api, PluginsSettings settings) - { - _settings = settings; - var plugins = PluginsLoader.PythonPlugins(_metadatas, _settings.PythonDirectory); - var executable_plugins = PluginsLoader.ExecutablePlugins(_metadatas); - AllPlugins = AllPlugins.Concat(plugins).Concat(executable_plugins).ToList(); - _settings.UpdatePluginSettings(AllPlugins); + /// + /// because InitializePlugins needs API, so LoadPlugins needs to be called first + /// todo happlebao The API should be removed + /// + /// + public static void LoadPlugins(PluginsSettings settings) + { + _metadatas = PluginConfig.Parse(Directories); + _settings = settings; + AllPlugins = PluginsLoader.Plugins(_metadatas, _settings); + _settings.UpdatePluginSettings(AllPlugins); + } + public static void InitializePlugins(IPublicAPI api) + { //load plugin i18n languages ResourceMerger.UpdatePluginLanguages(); @@ -149,7 +153,7 @@ namespace Wox.Core.Plugin } } - //happlebao todo prevent plugin initial when plugin is disabled + //happlebao todo dynamic release corresponding dll / exe / process public static void DisablePlugin(PluginPair plugin) { var actionKeywords = plugin.Metadata.ActionKeywords; diff --git a/Wox.Core/Plugin/PluginsLoader.cs b/Wox.Core/Plugin/PluginsLoader.cs index 8817de03a2..a60e87ff16 100644 --- a/Wox.Core/Plugin/PluginsLoader.cs +++ b/Wox.Core/Plugin/PluginsLoader.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using Wox.Core.UserSettings; using Wox.Infrastructure.Exception; using Wox.Infrastructure.Logger; using Wox.Plugin; @@ -15,6 +16,16 @@ namespace Wox.Core.Plugin public const string Python = "python"; public const string PythonExecutable = "pythonw.exe"; + public static List Plugins(List source, PluginsSettings settings) + { + var metadatas = source.Where(m => !settings.Plugins[m.ID].Disabled).ToList(); + var csharpPlugins = CSharpPlugins(metadatas).ToList(); + var pythonPlugins = PythonPlugins(metadatas, settings.PythonDirectory); + var executablePlugins = ExecutablePlugins(metadatas); + var plugins = csharpPlugins.Concat(pythonPlugins).Concat(executablePlugins).ToList(); + return plugins; + } + public static IEnumerable CSharpPlugins(List source) { var plugins = new List(); diff --git a/Wox/App.xaml.cs b/Wox/App.xaml.cs index c96f3bddcb..dcd6b03aea 100644 --- a/Wox/App.xaml.cs +++ b/Wox/App.xaml.cs @@ -3,8 +3,10 @@ using System.Diagnostics; using System.Windows; using Wox.Core; using Wox.Core.Plugin; +using Wox.Core.UserSettings; using Wox.Helper; using Wox.Infrastructure.Image; +using Wox.Infrastructure.Storage; using Wox.ViewModel; using Stopwatch = Wox.Infrastructure.Stopwatch; @@ -38,11 +40,15 @@ namespace Wox ImageLoader.PreloadImages(); - var vm = new MainViewModel(); - var pluginsSettings = vm._settings.PluginSettings; - var window = new MainWindow(vm._settings, vm); - API = new PublicAPIInstance(vm._settings, vm); - PluginManager.InitializePlugins(API, pluginsSettings); + var storage = new JsonStrorage(); + var settings = storage.Load(); + + PluginManager.LoadPlugins(settings.PluginSettings); + var vm = new MainViewModel(settings, storage); + var pluginsSettings = settings.PluginSettings; + var window = new MainWindow(settings, vm); + API = new PublicAPIInstance(settings, vm); + PluginManager.InitializePlugins(API); RegisterExitEvents(); diff --git a/Wox/ViewModel/MainViewModel.cs b/Wox/ViewModel/MainViewModel.cs index 3f180cc8c7..8477364f95 100644 --- a/Wox/ViewModel/MainViewModel.cs +++ b/Wox/ViewModel/MainViewModel.cs @@ -42,8 +42,7 @@ namespace Wox.ViewModel private readonly JsonStrorage _queryHistoryStorage; private readonly JsonStrorage _userSelectedRecordStorage; private readonly JsonStrorage _topMostRecordStorage; - // todo happlebao this field should be private in the future - public readonly Settings _settings; + private readonly Settings _settings; private readonly QueryHistory _queryHistory; private readonly UserSelectedRecord _userSelectedRecord; private readonly TopMostRecord _topMostRecord; @@ -56,15 +55,15 @@ namespace Wox.ViewModel #region Constructor - public MainViewModel() + public MainViewModel(Settings settings, JsonStrorage storage) { _saved = false; _queryTextBeforeLoadContextMenu = ""; _queryText = ""; _lastQuery = new Query(); - _settingsStorage = new JsonStrorage(); - _settings = _settingsStorage.Load(); + _settingsStorage = storage; + _settings = settings; // happlebao todo temp fix for instance code logic HttpProxy.Instance.Settings = _settings;