MVVM refactoring for web search plugin, part 1

1. #486
2. fix #778 #763 #742
3. MVVM refactoring
4. remove IMultipleActionKeywords interface, use PluginManager directly
This commit is contained in:
bao-qian
2016-06-21 00:14:32 +01:00
parent 3efeb4a0a6
commit 6e13440f1f
30 changed files with 495 additions and 518 deletions

View File

@@ -5,6 +5,7 @@
<system:String x:Key="wox_plugin_websearch_delete">Löschen</system:String> <system:String x:Key="wox_plugin_websearch_delete">Löschen</system:String>
<system:String x:Key="wox_plugin_websearch_edit">Bearbeiten</system:String> <system:String x:Key="wox_plugin_websearch_edit">Bearbeiten</system:String>
<system:String x:Key="wox_plugin_websearch_add">Hinzufügen</system:String> <system:String x:Key="wox_plugin_websearch_add">Hinzufügen</system:String>
<system:String x:Key="wox_plugin_websearch_confirm">Confirm</system:String>
<system:String x:Key="wox_plugin_websearch_action_keyword">Aktionsschlüsselwort</system:String> <system:String x:Key="wox_plugin_websearch_action_keyword">Aktionsschlüsselwort</system:String>
<system:String x:Key="wox_plugin_websearch_url">URL</system:String> <system:String x:Key="wox_plugin_websearch_url">URL</system:String>
<system:String x:Key="wox_plugin_websearch_search">Suche</system:String> <system:String x:Key="wox_plugin_websearch_search">Suche</system:String>
@@ -12,7 +13,7 @@
<system:String x:Key="wox_plugin_websearch_pls_select_web_search">Bitte wähle einen Suchdienst</system:String> <system:String x:Key="wox_plugin_websearch_pls_select_web_search">Bitte wähle einen Suchdienst</system:String>
<system:String x:Key="wox_plugin_websearch_delete_warning">Willst du wirklich {0} löschen?</system:String> <system:String x:Key="wox_plugin_websearch_delete_warning">Willst du wirklich {0} löschen?</system:String>
<!--web search edit--> <!--web search edit-->
<system:String x:Key="wox_plugin_websearch_title">Titel</system:String> <system:String x:Key="wox_plugin_websearch_title">Titel</system:String>
<system:String x:Key="wox_plugin_websearch_enable">Aktivieren</system:String> <system:String x:Key="wox_plugin_websearch_enable">Aktivieren</system:String>

View File

@@ -5,13 +5,14 @@
<system:String x:Key="wox_plugin_websearch_delete">Delete</system:String> <system:String x:Key="wox_plugin_websearch_delete">Delete</system:String>
<system:String x:Key="wox_plugin_websearch_edit">Edit</system:String> <system:String x:Key="wox_plugin_websearch_edit">Edit</system:String>
<system:String x:Key="wox_plugin_websearch_add">Add</system:String> <system:String x:Key="wox_plugin_websearch_add">Add</system:String>
<system:String x:Key="wox_plugin_websearch_confirm">Confirm</system:String>
<system:String x:Key="wox_plugin_websearch_action_keyword">Action Keyword</system:String> <system:String x:Key="wox_plugin_websearch_action_keyword">Action Keyword</system:String>
<system:String x:Key="wox_plugin_websearch_url">URL</system:String> <system:String x:Key="wox_plugin_websearch_url">URL</system:String>
<system:String x:Key="wox_plugin_websearch_search">Search</system:String> <system:String x:Key="wox_plugin_websearch_search">Search</system:String>
<system:String x:Key="wox_plugin_websearch_enable_suggestion">Enable search suggestions</system:String> <system:String x:Key="wox_plugin_websearch_enable_suggestion">Enable search suggestions</system:String>
<system:String x:Key="wox_plugin_websearch_pls_select_web_search">Please select a web search</system:String> <system:String x:Key="wox_plugin_websearch_pls_select_web_search">Please select a web search</system:String>
<system:String x:Key="wox_plugin_websearch_delete_warning">Are you sure you want to delete {0}?</system:String> <system:String x:Key="wox_plugin_websearch_delete_warning">Are you sure you want to delete {0}?</system:String>
<!--web search edit--> <!--web search edit-->
<system:String x:Key="wox_plugin_websearch_title">Title</system:String> <system:String x:Key="wox_plugin_websearch_title">Title</system:String>
<system:String x:Key="wox_plugin_websearch_enable">Enable</system:String> <system:String x:Key="wox_plugin_websearch_enable">Enable</system:String>

View File

@@ -5,13 +5,14 @@
<system:String x:Key="wox_plugin_websearch_delete">Usuń</system:String> <system:String x:Key="wox_plugin_websearch_delete">Usuń</system:String>
<system:String x:Key="wox_plugin_websearch_edit">Edytuj</system:String> <system:String x:Key="wox_plugin_websearch_edit">Edytuj</system:String>
<system:String x:Key="wox_plugin_websearch_add">Dodaj</system:String> <system:String x:Key="wox_plugin_websearch_add">Dodaj</system:String>
<system:String x:Key="wox_plugin_websearch_confirm">Confirm</system:String>
<system:String x:Key="wox_plugin_websearch_action_keyword">Wyzwalacz</system:String> <system:String x:Key="wox_plugin_websearch_action_keyword">Wyzwalacz</system:String>
<system:String x:Key="wox_plugin_websearch_url">Adres URL</system:String> <system:String x:Key="wox_plugin_websearch_url">Adres URL</system:String>
<system:String x:Key="wox_plugin_websearch_search">Szukaj</system:String> <system:String x:Key="wox_plugin_websearch_search">Szukaj</system:String>
<system:String x:Key="wox_plugin_websearch_enable_suggestion">Pokazuj podpowiedzi wyszukiwania</system:String> <system:String x:Key="wox_plugin_websearch_enable_suggestion">Pokazuj podpowiedzi wyszukiwania</system:String>
<system:String x:Key="wox_plugin_websearch_pls_select_web_search">Musisz wybrać coś z listy</system:String> <system:String x:Key="wox_plugin_websearch_pls_select_web_search">Musisz wybrać coś z listy</system:String>
<system:String x:Key="wox_plugin_websearch_delete_warning">Czy jesteś pewnie że chcesz usunąć {0}?</system:String> <system:String x:Key="wox_plugin_websearch_delete_warning">Czy jesteś pewnie że chcesz usunąć {0}?</system:String>
<!--web search edit--> <!--web search edit-->
<system:String x:Key="wox_plugin_websearch_title">Tytuł</system:String> <system:String x:Key="wox_plugin_websearch_title">Tytuł</system:String>
<system:String x:Key="wox_plugin_websearch_enable">Aktywne</system:String> <system:String x:Key="wox_plugin_websearch_enable">Aktywne</system:String>

View File

@@ -5,6 +5,7 @@
<system:String x:Key="wox_plugin_websearch_delete">删除</system:String> <system:String x:Key="wox_plugin_websearch_delete">删除</system:String>
<system:String x:Key="wox_plugin_websearch_edit">编辑</system:String> <system:String x:Key="wox_plugin_websearch_edit">编辑</system:String>
<system:String x:Key="wox_plugin_websearch_add">添加</system:String> <system:String x:Key="wox_plugin_websearch_add">添加</system:String>
<system:String x:Key="wox_plugin_websearch_confirm">确认</system:String>
<system:String x:Key="wox_plugin_websearch_action_keyword">触发关键字</system:String> <system:String x:Key="wox_plugin_websearch_action_keyword">触发关键字</system:String>
<system:String x:Key="wox_plugin_websearch_url">URL</system:String> <system:String x:Key="wox_plugin_websearch_url">URL</system:String>
<system:String x:Key="wox_plugin_websearch_search">搜索</system:String> <system:String x:Key="wox_plugin_websearch_search">搜索</system:String>

View File

@@ -5,6 +5,7 @@
<system:String x:Key="wox_plugin_websearch_delete">刪除</system:String> <system:String x:Key="wox_plugin_websearch_delete">刪除</system:String>
<system:String x:Key="wox_plugin_websearch_edit">編輯</system:String> <system:String x:Key="wox_plugin_websearch_edit">編輯</system:String>
<system:String x:Key="wox_plugin_websearch_add">添加</system:String> <system:String x:Key="wox_plugin_websearch_add">添加</system:String>
<system:String x:Key="wox_plugin_websearch_confirm">确认</system:String>
<system:String x:Key="wox_plugin_websearch_action_keyword">觸發關鍵字</system:String> <system:String x:Key="wox_plugin_websearch_action_keyword">觸發關鍵字</system:String>
<system:String x:Key="wox_plugin_websearch_url">URL</system:String> <system:String x:Key="wox_plugin_websearch_url">URL</system:String>
<system:String x:Key="wox_plugin_websearch_search">搜索</system:String> <system:String x:Key="wox_plugin_websearch_search">搜索</system:String>
@@ -28,5 +29,5 @@
<system:String x:Key="wox_plugin_websearch_plugin_name">網頁搜索</system:String> <system:String x:Key="wox_plugin_websearch_plugin_name">網頁搜索</system:String>
<system:String x:Key="wox_plugin_websearch_plugin_description">提供網頁搜索能力</system:String> <system:String x:Key="wox_plugin_websearch_plugin_description">提供網頁搜索能力</system:String>
</ResourceDictionary> </ResourceDictionary>

View File

@@ -6,28 +6,26 @@ using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Controls; using System.Windows.Controls;
using JetBrains.Annotations;
using Wox.Infrastructure; using Wox.Infrastructure;
using Wox.Infrastructure.Storage; using Wox.Infrastructure.Storage;
using Wox.Plugin.WebSearch.SuggestionSources;
namespace Wox.Plugin.WebSearch namespace Wox.Plugin.WebSearch
{ {
public class Main : IPlugin, ISettingProvider, IPluginI18n, IMultipleActionKeywords, ISavable, IResultUpdated public class Main : IPlugin, ISettingProvider, IPluginI18n, ISavable, IResultUpdated
{ {
public PluginInitContext Context { get; private set; } private PluginInitContext _context;
private PluginJsonStorage<Settings> _storage; private readonly Settings _settings;
private Settings _settings; private readonly SettingsViewModel _viewModel;
private CancellationTokenSource _updateSource; private CancellationTokenSource _updateSource;
private CancellationToken _updateToken; private CancellationToken _updateToken;
public const string Images = "Images"; public const string Images = "Images";
public static string ImagesDirectory; public static readonly string ImagesDirectory;
public void Save() public void Save()
{ {
_storage.Save(); _viewModel.Save();
} }
public List<Result> Query(Query query) public List<Result> Query(Query query)
@@ -36,21 +34,21 @@ namespace Wox.Plugin.WebSearch
_updateSource = new CancellationTokenSource(); _updateSource = new CancellationTokenSource();
_updateToken = _updateSource.Token; _updateToken = _updateSource.Token;
WebSearch webSearch = SearchSource searchSource =
_settings.WebSearches.FirstOrDefault(o => o.ActionKeyword == query.ActionKeyword && o.Enabled); _settings.SearchSources.FirstOrDefault(o => o.ActionKeyword == query.ActionKeyword && o.Enabled);
if (webSearch != null) if (searchSource != null)
{ {
string keyword = query.Search; string keyword = query.Search;
string title = keyword; string title = keyword;
string subtitle = Context.API.GetTranslation("wox_plugin_websearch_search") + " " + webSearch.Title; string subtitle = _context.API.GetTranslation("wox_plugin_websearch_search") + " " + searchSource.Title;
if (string.IsNullOrEmpty(keyword)) if (string.IsNullOrEmpty(keyword))
{ {
var result = new Result var result = new Result
{ {
Title = subtitle, Title = subtitle,
SubTitle = string.Empty, SubTitle = string.Empty,
IcoPath = webSearch.IconPath IcoPath = searchSource.IconPath
}; };
return new List<Result> { result }; return new List<Result> { result };
} }
@@ -62,15 +60,15 @@ namespace Wox.Plugin.WebSearch
Title = title, Title = title,
SubTitle = subtitle, SubTitle = subtitle,
Score = 6, Score = 6,
IcoPath = webSearch.IconPath, IcoPath = searchSource.IconPath,
Action = c => Action = c =>
{ {
Process.Start(webSearch.Url.Replace("{q}", Uri.EscapeDataString(keyword))); Process.Start(searchSource.Url.Replace("{q}", Uri.EscapeDataString(keyword)));
return true; return true;
} }
}; };
results.Add(result); results.Add(result);
UpdateResultsFromSuggestion(results, keyword, subtitle, webSearch, query); UpdateResultsFromSuggestion(results, keyword, subtitle, searchSource, query);
return results; return results;
} }
} }
@@ -80,14 +78,15 @@ namespace Wox.Plugin.WebSearch
} }
} }
private void UpdateResultsFromSuggestion(List<Result> results, string keyword, string subtitle, WebSearch webSearch, Query query) private void UpdateResultsFromSuggestion(List<Result> results, string keyword, string subtitle,
SearchSource searchSource, Query query)
{ {
if (_settings.EnableWebSearchSuggestion) if (_settings.EnableSuggestion)
{ {
const int waittime = 300; const int waittime = 300;
var task = Task.Run(async () => var task = Task.Run(async () =>
{ {
var suggestions = await Suggestions(keyword, subtitle, webSearch); var suggestions = await Suggestions(keyword, subtitle, searchSource);
results.AddRange(suggestions); results.AddRange(suggestions);
}, _updateToken); }, _updateToken);
@@ -102,21 +101,21 @@ namespace Wox.Plugin.WebSearch
} }
} }
private async Task<IEnumerable<Result>> Suggestions(string keyword, string subtitle, WebSearch webSearch) private async Task<IEnumerable<Result>> Suggestions(string keyword, string subtitle, SearchSource searchSource)
{ {
var source = SuggestionSource.GetSuggestionSource(_settings.WebSearchSuggestionSource); var source = _settings.SelectedSuggestion;
if (source != null) if (source != null)
{ {
var suggestions = await source.GetSuggestions(keyword); var suggestions = await source.Suggestions(keyword);
var resultsFromSuggestion = suggestions.Select(o => new Result var resultsFromSuggestion = suggestions.Select(o => new Result
{ {
Title = o, Title = o,
SubTitle = subtitle, SubTitle = subtitle,
Score = 5, Score = 5,
IcoPath = webSearch.IconPath, IcoPath = searchSource.IconPath,
Action = c => Action = c =>
{ {
Process.Start(webSearch.Url.Replace("{q}", Uri.EscapeDataString(o))); Process.Start(searchSource.Url.Replace("{q}", Uri.EscapeDataString(o)));
return true; return true;
} }
}); });
@@ -127,18 +126,21 @@ namespace Wox.Plugin.WebSearch
static Main() static Main()
{ {
var plugins = Infrastructure.Constant.Plugins; var plugins = Constant.Plugins;
var assemblyName = typeof(Main).Assembly.GetName().Name; var assemblyName = typeof(Main).Assembly.GetName().Name;
var pluginDirectory = Path.Combine(Infrastructure.Constant.SettingsPath, plugins, assemblyName); var pluginDirectory = Path.Combine(Constant.SettingsPath, plugins, assemblyName);
ImagesDirectory = Path.Combine(pluginDirectory, Images); ImagesDirectory = Path.Combine(pluginDirectory, Images);
} }
public Main()
{
_viewModel = new SettingsViewModel();
_settings = _viewModel.Settings;
}
public void Init(PluginInitContext context) public void Init(PluginInitContext context)
{ {
Context = context; _context = context;
_storage = new PluginJsonStorage<Settings>();
_settings = _storage.Load();
var pluginDirectory = context.CurrentPluginMetadata.PluginDirectory; var pluginDirectory = context.CurrentPluginMetadata.PluginDirectory;
var bundledImagesDirectory = Path.Combine(pluginDirectory, Images); var bundledImagesDirectory = Path.Combine(pluginDirectory, Images);
@@ -149,43 +151,21 @@ namespace Wox.Plugin.WebSearch
public Control CreateSettingPanel() public Control CreateSettingPanel()
{ {
return new WebSearchesSetting(this, _settings); return new SettingsControl(_context, _viewModel);
} }
#endregion #endregion
public string GetTranslatedPluginTitle() public string GetTranslatedPluginTitle()
{ {
return Context.API.GetTranslation("wox_plugin_websearch_plugin_name"); return _context.API.GetTranslation("wox_plugin_websearch_plugin_name");
} }
public string GetTranslatedPluginDescription() public string GetTranslatedPluginDescription()
{ {
return Context.API.GetTranslation("wox_plugin_websearch_plugin_description"); return _context.API.GetTranslation("wox_plugin_websearch_plugin_description");
} }
public bool IsInstantQuery(string query) => false;
[NotifyPropertyChangedInvocator]
public void NotifyActionKeywordsUpdated(string oldActionKeywords, string newActionKeywords)
{
ActionKeywordsChanged?.Invoke(this, new ActionKeywordsChangedEventArgs
{
OldActionKeyword = oldActionKeywords,
NewActionKeyword = newActionKeywords
});
}
[NotifyPropertyChangedInvocator]
public void NotifyActionKeywordsAdded(string newActionKeywords)
{
ActionKeywordsChanged?.Invoke(this, new ActionKeywordsChangedEventArgs
{
NewActionKeyword = newActionKeywords
});
}
public event ActionKeywordsChangedEventHandler ActionKeywordsChanged;
public event ResultUpdatedEventHandler ResultsUpdated; public event ResultUpdatedEventHandler ResultsUpdated;
} }
} }

View File

@@ -0,0 +1,7 @@
namespace Wox.Plugin.WebSearch
{
public class SearchSourceViewModel
{
public SearchSource SearchSource { get; set; }
}
}

View File

@@ -1,12 +1,23 @@
using System.Collections.Generic; using System;
using System.Collections.ObjectModel;
using Newtonsoft.Json;
using Wox.Plugin.WebSearch.SuggestionSources;
namespace Wox.Plugin.WebSearch namespace Wox.Plugin.WebSearch
{ {
public class Settings public class Settings : BaseModel
{ {
public List<WebSearch> WebSearches { get; set; } = new List<WebSearch> public Settings()
{
SelectedSuggestion = Suggestions[0];
if (SearchSources.Count > 0)
{ {
new WebSearch SelectedSearchSource = SearchSources[0];
}
}
public ObservableCollection<SearchSource> SearchSources { get; set; } = new ObservableCollection<SearchSource>
{
new SearchSource
{ {
Title = "Google", Title = "Google",
ActionKeyword = "g", ActionKeyword = "g",
@@ -14,7 +25,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://www.google.com/search?q={q}", Url = "https://www.google.com/search?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Google Scholar", Title = "Google Scholar",
ActionKeyword = "sc", ActionKeyword = "sc",
@@ -22,7 +33,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://scholar.google.com/scholar?q={q}", Url = "https://scholar.google.com/scholar?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Wikipedia", Title = "Wikipedia",
ActionKeyword = "wiki", ActionKeyword = "wiki",
@@ -30,7 +41,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://en.wikipedia.org/wiki/{q}", Url = "https://en.wikipedia.org/wiki/{q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "FindIcon", Title = "FindIcon",
ActionKeyword = "findicon", ActionKeyword = "findicon",
@@ -38,7 +49,7 @@ namespace Wox.Plugin.WebSearch
Url = "http://findicons.com/search/{q}", Url = "http://findicons.com/search/{q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Facebook", Title = "Facebook",
ActionKeyword = "facebook", ActionKeyword = "facebook",
@@ -46,7 +57,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://www.facebook.com/search/?q={q}", Url = "https://www.facebook.com/search/?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Twitter", Title = "Twitter",
ActionKeyword = "twitter", ActionKeyword = "twitter",
@@ -54,7 +65,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://twitter.com/search?q={q}", Url = "https://twitter.com/search?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Google Maps", Title = "Google Maps",
ActionKeyword = "maps", ActionKeyword = "maps",
@@ -62,7 +73,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://maps.google.com/maps?q={q}", Url = "https://maps.google.com/maps?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Google Translate", Title = "Google Translate",
ActionKeyword = "translate", ActionKeyword = "translate",
@@ -70,7 +81,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://translate.google.com/#auto|en|{q}", Url = "https://translate.google.com/#auto|en|{q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Duckduckgo", Title = "Duckduckgo",
ActionKeyword = "duckduckgo", ActionKeyword = "duckduckgo",
@@ -78,7 +89,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://duckduckgo.com/?q={q}", Url = "https://duckduckgo.com/?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Github", Title = "Github",
ActionKeyword = "github", ActionKeyword = "github",
@@ -86,7 +97,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://github.com/search?q={q}", Url = "https://github.com/search?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Github Gist", Title = "Github Gist",
ActionKeyword = "gist", ActionKeyword = "gist",
@@ -94,7 +105,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://gist.github.com/search?q={q}", Url = "https://gist.github.com/search?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Gmail", Title = "Gmail",
ActionKeyword = "gmail", ActionKeyword = "gmail",
@@ -102,7 +113,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://mail.google.com/mail/ca/u/0/#apps/{q}", Url = "https://mail.google.com/mail/ca/u/0/#apps/{q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Google Drive", Title = "Google Drive",
ActionKeyword = "drive", ActionKeyword = "drive",
@@ -110,7 +121,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://drive.google.com/?hl=en&tab=bo#search/{q}", Url = "https://drive.google.com/?hl=en&tab=bo#search/{q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Wolframalpha", Title = "Wolframalpha",
ActionKeyword = "wolframalpha", ActionKeyword = "wolframalpha",
@@ -118,7 +129,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://www.wolframalpha.com/input/?i={q}", Url = "https://www.wolframalpha.com/input/?i={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Stackoverflow", Title = "Stackoverflow",
ActionKeyword = "stackoverflow", ActionKeyword = "stackoverflow",
@@ -126,7 +137,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://stackoverflow.com/search?q={q}", Url = "https://stackoverflow.com/search?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "I'm Feeling Lucky", Title = "I'm Feeling Lucky",
ActionKeyword = "lucky", ActionKeyword = "lucky",
@@ -134,7 +145,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://google.com/search?q={q}&btnI=I", Url = "https://google.com/search?q={q}&btnI=I",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Google Image", Title = "Google Image",
ActionKeyword = "image", ActionKeyword = "image",
@@ -142,7 +153,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://www.google.com/search?q={q}&tbm=isch", Url = "https://www.google.com/search?q={q}&tbm=isch",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Youtube", Title = "Youtube",
ActionKeyword = "youtube", ActionKeyword = "youtube",
@@ -150,7 +161,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://www.youtube.com/results?search_query={q}", Url = "https://www.youtube.com/results?search_query={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Bing", Title = "Bing",
ActionKeyword = "bing", ActionKeyword = "bing",
@@ -158,7 +169,7 @@ namespace Wox.Plugin.WebSearch
Url = "https://www.bing.com/search?q={q}", Url = "https://www.bing.com/search?q={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title = "Yahoo", Title = "Yahoo",
ActionKeyword = "yahoo", ActionKeyword = "yahoo",
@@ -166,18 +177,50 @@ namespace Wox.Plugin.WebSearch
Url = "https://www.search.yahoo.com/search?p={q}", Url = "https://www.search.yahoo.com/search?p={q}",
Enabled = true Enabled = true
}, },
new WebSearch new SearchSource
{ {
Title= "Baidu", Title = "Baidu",
ActionKeyword= "bd", ActionKeyword = "bd",
Icon= "baidu.png", Icon = "baidu.png",
Url="https://www.baidu.com/#ie=UTF-8&wd={q}", Url = "https://www.baidu.com/#ie=UTF-8&wd={q}",
Enabled= true Enabled = true
} }
}; };
public bool EnableWebSearchSuggestion { get; set; } [JsonIgnore]
public SearchSource SelectedSearchSource { get; set; }
public bool EnableSuggestion { get; set; }
[JsonIgnore]
public SuggestionSource[] Suggestions { get; set; } = {
new Google(),
new Baidu()
};
[JsonIgnore]
public SuggestionSource SelectedSuggestion { get; set; }
/// <summary>
/// used to store Settings.json only
/// </summary>
public string Suggestion
{
get
{
return SelectedSuggestion.ToString();
}
set
{
foreach (var s in Suggestions)
{
if (string.Equals(s.ToString(), value, StringComparison.OrdinalIgnoreCase))
{
SelectedSuggestion = s;
}
}
}
}
public string WebSearchSuggestionSource { get; set; }
} }
} }

View File

@@ -0,0 +1,22 @@
using Wox.Infrastructure.Storage;
namespace Wox.Plugin.WebSearch
{
public class SettingsViewModel
{
private readonly JsonStrorage<Settings> _storage;
public SettingsViewModel()
{
_storage = new PluginJsonStorage<Settings>();
Settings = _storage.Load();
}
public Settings Settings { get; set; }
public void Save()
{
_storage.Save();
}
}
}

View File

@@ -13,11 +13,9 @@ namespace Wox.Plugin.WebSearch.SuggestionSources
{ {
public class Baidu : SuggestionSource public class Baidu : SuggestionSource
{ {
public override string Domain { get; set; } = "www.baidu.com"; private readonly Regex _reg = new Regex("window.baidu.sug\\((.*)\\)");
Regex reg = new Regex("window.baidu.sug\\((.*)\\)"); public override async Task<List<string>> Suggestions(string query)
public override async Task<List<string>> GetSuggestions(string query)
{ {
string result; string result;
@@ -30,12 +28,12 @@ namespace Wox.Plugin.WebSearch.SuggestionSources
{ {
Log.Warn("Can't get suggestion from baidu"); Log.Warn("Can't get suggestion from baidu");
Log.Exception(e); Log.Exception(e);
return new List<string>(); ; return new List<string>();
;
} }
if (string.IsNullOrEmpty(result)) return new List<string>(); if (string.IsNullOrEmpty(result)) return new List<string>();
Match match = _reg.Match(result);
Match match = reg.Match(result);
if (match.Success) if (match.Success)
{ {
JContainer json; JContainer json;
@@ -61,5 +59,10 @@ namespace Wox.Plugin.WebSearch.SuggestionSources
return new List<string>(); return new List<string>();
} }
public override string ToString()
{
return "Baidu";
}
} }
} }

View File

@@ -12,8 +12,7 @@ namespace Wox.Plugin.WebSearch.SuggestionSources
{ {
public class Google : SuggestionSource public class Google : SuggestionSource
{ {
public override string Domain { get; set; } = "www.google.com"; public override async Task<List<string>> Suggestions(string query)
public override async Task<List<string>> GetSuggestions(string query)
{ {
string result; string result;
try try
@@ -25,7 +24,8 @@ namespace Wox.Plugin.WebSearch.SuggestionSources
{ {
Log.Warn("Can't get suggestion from google"); Log.Warn("Can't get suggestion from google");
Log.Exception(e); Log.Exception(e);
return new List<string>(); ; return new List<string>();
;
} }
if (string.IsNullOrEmpty(result)) return new List<string>(); if (string.IsNullOrEmpty(result)) return new List<string>();
JContainer json; JContainer json;
@@ -48,5 +48,10 @@ namespace Wox.Plugin.WebSearch.SuggestionSources
} }
return new List<string>(); return new List<string>();
} }
public override string ToString()
{
return "Google";
}
} }
} }

View File

@@ -3,25 +3,9 @@ using System.Threading.Tasks;
namespace Wox.Plugin.WebSearch.SuggestionSources namespace Wox.Plugin.WebSearch.SuggestionSources
{ {
//todo rename file
public abstract class SuggestionSource public abstract class SuggestionSource
{ {
public virtual string Domain { get; set; } public abstract Task<List<string>> Suggestions(string query);
public abstract Task<List<string>> GetSuggestions(string query);
public static SuggestionSource GetSuggestionSource(string name)
{
switch (name.ToLower())
{
case "google":
return new Google();
case "baidu":
return new Baidu();
default:
return null;
}
}
} }
} }

View File

@@ -1,40 +1,43 @@
using System.IO; using System.IO;
using System.Windows.Media;
using JetBrains.Annotations; using JetBrains.Annotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; using Wox.Infrastructure.Image;
namespace Wox.Plugin.WebSearch namespace Wox.Plugin.WebSearch
{ {
public class WebSearch public class SearchSource : BaseModel
{ {
public const string DefaultIcon = "web_search.png"; public const string DefaultIcon = "web_search.png";
public string Title { get; set; } public string Title { get; set; }
public string ActionKeyword { get; set; } public string ActionKeyword { get; set; }
[NotNull]
private string _icon = DefaultIcon;
[NotNull] [NotNull]
public string Icon public string Icon { private get; set; } = DefaultIcon;
{
get { return _icon; }
set
{
_icon = value;
IconPath = Path.Combine(Main.ImagesDirectory, value);
}
}
/// <summary> /// <summary>
/// All icon should be put under Images directory /// All icon should be put under Images directory
/// </summary> /// </summary>
[NotNull] [NotNull]
[JsonIgnore] [JsonIgnore]
internal string IconPath { get; private set; } = Path.Combine internal string IconPath => Path.Combine(Main.ImagesDirectory, Icon);
( [JsonIgnore]
Main.ImagesDirectory, DefaultIcon public ImageSource Image => ImageLoader.Load(IconPath);
);
public string Url { get; set; } public string Url { get; set; }
public bool Enabled { get; set; } public bool Enabled { get; set; }
public SearchSource DeepCopy()
{
var webSearch = new SearchSource
{
Title = string.Copy(Title),
ActionKeyword = string.Copy(ActionKeyword),
Url = string.Copy(Url),
Icon = string.Copy(Icon),
Enabled = Enabled
};
return webSearch;
}
} }
} }

View File

@@ -1,42 +1,60 @@
<Window x:Class="Wox.Plugin.WebSearch.WebSearchSetting" <Window x:Class="Wox.Plugin.WebSearch.SearchSourceSettingWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:vm="clr-namespace:Wox.Plugin.WebSearch"
mc:Ignorable="d"
ResizeMode="NoResize" ResizeMode="NoResize"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Title="WebSearchSetting" Height="350" Width="674.766"> Title="Search Source Setting" Height="300" Width="500"
d:DataContext="{d:DesignInstance vm:SearchSourceViewModel}">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition></RowDefinition> <RowDefinition />
<RowDefinition></RowDefinition> <RowDefinition />
<RowDefinition></RowDefinition> <RowDefinition />
<RowDefinition></RowDefinition> <RowDefinition />
<RowDefinition Height="60"></RowDefinition> <RowDefinition Height="60" />
<RowDefinition></RowDefinition> <RowDefinition />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="120"></ColumnDefinition> <ColumnDefinition Width="120" />
<ColumnDefinition></ColumnDefinition> <ColumnDefinition />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Margin="10" FontSize="14" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_title}"></TextBlock> <TextBlock Margin="10" FontSize="14" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center"
<TextBox x:Name="WebSearchName" Margin="10" Grid.Row="0" Width="400" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBox> HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_title}" />
<TextBox Text="{Binding SearchSource.Title}" Margin="10" Grid.Row="0" Width="300" Grid.Column="1" VerticalAlignment="Center"
HorizontalAlignment="Left" />
<TextBlock Margin="10" FontSize="14" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_url}"></TextBlock> <TextBlock Margin="10" FontSize="14" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center"
<TextBox x:Name="Url" Margin="10" Grid.Row="1" Width="400" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBox> HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_url}" />
<TextBox Text="{Binding SearchSource.Url}" Margin="10" Grid.Row="1" Width="300" Grid.Column="1" VerticalAlignment="Center"
HorizontalAlignment="Left" />
<TextBlock Margin="10" FontSize="14" Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_action_keyword}"></TextBlock> <TextBlock Margin="10" FontSize="14" Grid.Row="2" Grid.Column="0" VerticalAlignment="Center"
<TextBox x:Name="Actionword" Margin="10" Grid.Row="2" Width="400" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBox> HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_action_keyword}" />
<TextBox Text="{Binding SearchSource.ActionKeyword}" Margin="10" Grid.Row="2" Width="300" Grid.Column="1"
VerticalAlignment="Center" HorizontalAlignment="Left" />
<TextBlock Margin="10" FontSize="14" Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_enable}"></TextBlock> <TextBlock Margin="10" FontSize="14" Grid.Row="3" Grid.Column="0" VerticalAlignment="Center"
<CheckBox x:Name="EnableCheckBox" IsChecked="True" Margin="10" Grid.Row="3" Grid.Column="1" VerticalAlignment="Center"></CheckBox> HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_enable}" />
<CheckBox IsChecked="{Binding SearchSource.Enabled}" Margin="10" Grid.Row="3" Grid.Column="1" VerticalAlignment="Center" />
<TextBlock Margin="10" FontSize="14" Grid.Row="4" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_icon}"></TextBlock> <TextBlock Margin="10" FontSize="14" Grid.Row="4" Grid.Column="0" VerticalAlignment="Center"
HorizontalAlignment="Right" Text="{DynamicResource wox_plugin_websearch_icon}" />
<StackPanel Orientation="Horizontal" Grid.Row="4" Grid.Column="1" Margin="10"> <StackPanel Orientation="Horizontal" Grid.Row="4" Grid.Column="1" Margin="10">
<Image x:Name="WebSearchIcon" Width="24" Height="24" Margin="0 0 10 0" /> <Image Source="{Binding SearchSource.Image ,IsAsync=True}" Width="24" Height="24" Margin="0 0 10 0" />
<Button x:Name="SelectIconButton" Height="24" Click="SelectIconButtonOnClick" Content="{DynamicResource wox_plugin_websearch_select_icon}"></Button> <Button Click="OnSelectIconClick" Height="24"
Content="{DynamicResource wox_plugin_websearch_select_icon}" />
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="5" Grid.Column="1"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="5" Grid.Column="1">
<Button x:Name="CancelButton" Click="CancelButtonOnClick" Margin="10 0 10 0" Width="80" Height="25" Content="{DynamicResource wox_plugin_websearch_cancel}"/> <Button Click="OnCancelButtonClick"
<Button x:Name="ConfirmButton" Margin="10 0 10 0" Width="80" Height="25" Click="ConfirmButtonOnClick" Content="{DynamicResource wox_plugin_websearch_add}"/> Margin="10 0 10 0" Width="80" Height="25"
Content="{DynamicResource wox_plugin_websearch_cancel}" />
<Button Click="OnConfirmButtonClick"
Margin="10 0 10 0" Width="80" Height="25"
Content="{DynamicResource wox_plugin_websearch_confirm}" />
</StackPanel> </StackPanel>
</Grid> </Grid>
</Window> </Window>

View File

@@ -1,150 +1,150 @@
using System; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Windows; using System.Windows;
using Microsoft.Win32; using Microsoft.Win32;
using Wox.Infrastructure.Exception; using Wox.Core.Plugin;
using Wox.Infrastructure.Image;
namespace Wox.Plugin.WebSearch namespace Wox.Plugin.WebSearch
{ {
public partial class WebSearchSetting public partial class SearchSourceSettingWindow
{ {
private readonly WebSearchesSetting _settingWindow; private readonly SearchSource _oldSearchSource;
private bool _isUpdate; private SearchSource _searchSource;
private WebSearch _webSearch; private IList<SearchSource> _searchSources;
private readonly PluginInitContext _context; private Action _action;
private readonly Main _plugin; private PluginInitContext _context;
private readonly Settings _settings; private IPublicAPI _api;
private SearchSourceViewModel _viewModel;
public WebSearchSetting(WebSearchesSetting settingWidow, Settings settings)
public SearchSourceSettingWindow(IList<SearchSource> sources, PluginInitContext context, SearchSource old)
{
_oldSearchSource = old;
_viewModel = new SearchSourceViewModel { SearchSource = old.DeepCopy() };
Initilize(sources, context, Action.Edit);
}
public SearchSourceSettingWindow(IList<SearchSource> sources, PluginInitContext context)
{
_viewModel = new SearchSourceViewModel { SearchSource = new SearchSource() };
Initilize(sources, context, Action.Add);
}
private void Initilize(IList<SearchSource> sources, PluginInitContext context, Action action)
{ {
InitializeComponent(); InitializeComponent();
WebSearchName.Focus(); DataContext = _viewModel;
_plugin = settingWidow.Plugin; _searchSource = _viewModel.SearchSource;
_context = settingWidow.Context; _searchSources = sources;
_settingWindow = settingWidow; _action = action;
_settings = settings; _context = context;
_api = _context.API;
} }
public void UpdateItem(WebSearch webSearch) private void OnCancelButtonClick(object sender, RoutedEventArgs e)
{
_webSearch = _settings.WebSearches.FirstOrDefault(o => o == webSearch);
if (_webSearch == null || string.IsNullOrEmpty(_webSearch.Url))
{
string warning = _context.API.GetTranslation("wox_plugin_websearch_invalid_web_search");
MessageBox.Show(warning);
Close();
return;
}
_isUpdate = true;
ConfirmButton.Content = "Update";
WebSearchIcon.Source = ImageLoader.Load(webSearch.IconPath);
EnableCheckBox.IsChecked = webSearch.Enabled;
WebSearchName.Text = webSearch.Title;
Url.Text = webSearch.Url;
Actionword.Text = webSearch.ActionKeyword;
}
public void AddItem(WebSearch webSearch)
{
_webSearch = webSearch;
WebSearchIcon.Source = ImageLoader.Load(webSearch.IconPath);
}
private void CancelButtonOnClick(object sender, RoutedEventArgs e)
{ {
Close(); Close();
} }
/// <summary> private void OnConfirmButtonClick(object sender, RoutedEventArgs e)
/// Confirm button for both add and update
/// </summary>
private void ConfirmButtonOnClick(object sender, RoutedEventArgs e)
{ {
string title = WebSearchName.Text;
if (string.IsNullOrEmpty(title))
{
string warning = _context.API.GetTranslation("wox_plugin_websearch_input_title");
MessageBox.Show(warning);
return;
}
string url = Url.Text; if (string.IsNullOrEmpty(_searchSource.Title))
if (string.IsNullOrEmpty(url))
{ {
string warning = _context.API.GetTranslation("wox_plugin_websearch_input_url"); var warning = _api.GetTranslation("wox_plugin_websearch_input_title");
MessageBox.Show(warning); MessageBox.Show(warning);
return;
} }
else if (string.IsNullOrEmpty(_searchSource.Url))
string newActionKeyword = Actionword.Text.Trim();
if (_isUpdate)
{ {
try var warning = _api.GetTranslation("wox_plugin_websearch_input_url");
{ MessageBox.Show(warning);
_plugin.NotifyActionKeywordsUpdated(_webSearch.ActionKeyword, newActionKeyword); }
} else if (string.IsNullOrEmpty(_searchSource.ActionKeyword))
catch (WoxPluginException exception) {
{ var warning = _api.GetTranslation("wox_plugin_websearch_input_action_keyword");
MessageBox.Show(exception.Message); MessageBox.Show(warning);
return; }
} else if (_action == Action.Add)
{
AddSearchSource();
}
else if (_action == Action.Edit)
{
EditSearchSource();
}
}
private void AddSearchSource()
{
var keyword = _searchSource.ActionKeyword;
if (!PluginManager.ActionKeywordRegistered(keyword))
{
var id = _context.CurrentPluginMetadata.ID;
PluginManager.AddActionKeyword(id, keyword);
_searchSources.Add(_searchSource);
var info = _api.GetTranslation("succeed");
MessageBox.Show(info);
Close();
} }
else else
{ {
try var warning = _api.GetTranslation("newActionKeywordsHasBeenAssigned");
{ MessageBox.Show(warning);
_plugin.NotifyActionKeywordsAdded(newActionKeyword);
}
catch (WoxPluginException exception)
{
MessageBox.Show(exception.Message);
return;
}
_settings.WebSearches.Add(_webSearch);
} }
_webSearch.ActionKeyword = newActionKeyword;
_webSearch.Enabled = EnableCheckBox.IsChecked ?? false;
_webSearch.Url = url;
_webSearch.Title = title;
_settingWindow.ReloadWebSearchView();
Close();
} }
private void SelectIconButtonOnClick(object sender, RoutedEventArgs e) private void EditSearchSource()
{
var keyword = _searchSource.ActionKeyword;
if (!PluginManager.ActionKeywordRegistered(keyword))
{
var newKeyword = keyword;
var oldKeyword = _oldSearchSource.ActionKeyword;
var id = _context.CurrentPluginMetadata.ID;
PluginManager.ReplaceActionKeyword(id, oldKeyword, newKeyword);
var index = _searchSources.IndexOf(_oldSearchSource);
_searchSources[index] = _searchSource;
var info = _api.GetTranslation("succeed");
MessageBox.Show(info);
Close();
}
else
{
var warning = _api.GetTranslation("newActionKeywordsHasBeenAssigned");
MessageBox.Show(warning);
}
}
private void OnSelectIconClick(object sender, RoutedEventArgs e)
{ {
var directory = Path.Combine(Main.ImagesDirectory, Main.Images); var directory = Path.Combine(Main.ImagesDirectory, Main.Images);
var dlg = new OpenFileDialog const string filter = "Image files (*.jpg, *.jpeg, *.gif, *.png, *.bmp) |*.jpg; *.jpeg; *.gif; *.png; *.bmp";
{ var dialog = new OpenFileDialog { InitialDirectory = directory, Filter = filter };
InitialDirectory = directory,
Filter = "Image files (*.jpg, *.jpeg, *.gif, *.png, *.bmp) |*.jpg; *.jpeg; *.gif; *.png; *.bmp"
};
bool? result = dlg.ShowDialog(); var result = dialog.ShowDialog();
if (result != null && result == true) if (result == true)
{ {
string fullpath = dlg.FileName; var fullpath = dialog.FileName;
if (fullpath != null) if (!string.IsNullOrEmpty(fullpath))
{ {
_webSearch.Icon = Path.GetFileName(fullpath); _searchSource.Icon = Path.GetFileName(fullpath);
if (File.Exists(_webSearch.IconPath)) if (!File.Exists(_searchSource.IconPath))
{ {
WebSearchIcon.Source = ImageLoader.Load(_webSearch.IconPath); _searchSource.Icon = SearchSource.DefaultIcon;
}
else
{
_webSearch.Icon = WebSearch.DefaultIcon;
MessageBox.Show($"The file should be put under {directory}"); MessageBox.Show($"The file should be put under {directory}");
} }
} }
} }
} }
} }
}
public enum Action
{
Add,
Edit
}
}

View File

@@ -1,35 +1,45 @@
<UserControl x:Class="Wox.Plugin.WebSearch.WebSearchesSetting" <UserControl x:Class="Wox.Plugin.WebSearch.SettingsControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" xmlns:vm="clr-namespace:Wox.Plugin.WebSearch"
mc:Ignorable="d"
Background="White"
d:DataContext="{d:DesignInstance vm:SettingsViewModel}"
d:DesignHeight="300" d:DesignWidth="500"> d:DesignHeight="300" d:DesignWidth="500">
<Grid Margin="10"> <Grid Margin="10">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="42"/> <RowDefinition Height="40" />
<RowDefinition/> <RowDefinition />
<RowDefinition Height="50"/> <RowDefinition Height="40" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Grid.Row="0"> <StackPanel Orientation="Horizontal" Grid.Row="0">
<CheckBox x:Name="cbEnableWebSearchSuggestion" Unchecked="CbEnableWebSearchSuggestion_OnUnchecked" Checked="CbEnableWebSearchSuggestion_OnChecked" Margin="0 10 10 10" Content="{DynamicResource wox_plugin_websearch_enable_suggestion}"></CheckBox> <CheckBox IsChecked="{Binding Settings.EnableSuggestion}"
<ComboBox x:Name="comboBoxSuggestionSource" SelectionChanged="ComboBoxSuggestionSource_OnSelectionChanged" Margin="10"> Margin="0 10 10 10"
</ComboBox> Name="EnableSuggestion"
Content="{DynamicResource wox_plugin_websearch_enable_suggestion}" />
<ComboBox ItemsSource="{Binding Settings.Suggestions}"
SelectedItem="{Binding Settings.SelectedSuggestion}"
IsEnabled="{Binding ElementName=EnableSuggestion, Path=IsChecked}" Margin="10" />
<!-- Not sure why binding IsEnabled directly to Settings.EnableWebSaerchSuggestion is not working -->
</StackPanel> </StackPanel>
<ListView x:Name="webSearchView" Grid.Row="1"> <ListView ItemsSource="{Binding Settings.SearchSources}"
SelectedItem="{Binding Settings.SelectedSearchSource}"
Grid.Row="1">
<ListView.View> <ListView.View>
<GridView> <GridView>
<GridViewColumn Header="{DynamicResource wox_plugin_websearch_action_keyword}" Width="180"> <GridViewColumn Header="{DynamicResource wox_plugin_websearch_action_keyword}">
<GridViewColumn.CellTemplate> <GridViewColumn.CellTemplate>
<DataTemplate> <DataTemplate>
<TextBlock Text="{Binding ActionKeyword}"/> <TextBlock Text="{Binding ActionKeyword}" />
</DataTemplate> </DataTemplate>
</GridViewColumn.CellTemplate> </GridViewColumn.CellTemplate>
</GridViewColumn> </GridViewColumn>
<GridViewColumn Header="{DynamicResource wox_plugin_websearch_url}" Width="500"> <GridViewColumn Header="{DynamicResource wox_plugin_websearch_url}">
<GridViewColumn.CellTemplate> <GridViewColumn.CellTemplate>
<DataTemplate> <DataTemplate>
<TextBlock Text="{Binding Url}"/> <TextBlock Text="{Binding Url}" />
</DataTemplate> </DataTemplate>
</GridViewColumn.CellTemplate> </GridViewColumn.CellTemplate>
</GridViewColumn> </GridViewColumn>
@@ -37,9 +47,12 @@
</ListView.View> </ListView.View>
</ListView> </ListView>
<StackPanel Grid.Row="2" HorizontalAlignment="Right" Orientation="Horizontal"> <StackPanel Grid.Row="2" HorizontalAlignment="Right" Orientation="Horizontal">
<Button x:Name="btnDeleteWebSearch" Click="btnDeleteWebSearch_OnClick" Width="100" Margin="10" Content="{DynamicResource wox_plugin_websearch_delete}"/> <Button Click="OnDeleteSearchSearchClick" Width="100" Margin="10"
<Button x:Name="btnEditWebSearch" Click="btnEditWebSearch_OnClick" Width="100" Margin="10" Content="{DynamicResource wox_plugin_websearch_edit}"/> Content="{DynamicResource wox_plugin_websearch_delete}" />
<Button x:Name="btnAddWebSearch" Click="btnAddWebSearch_OnClick" Width="100" Margin="10" Content="{DynamicResource wox_plugin_websearch_add}"/> <Button Click="OnEditSearchSourceClick" Width="100" Margin="10"
Content="{DynamicResource wox_plugin_websearch_edit}" />
<Button Click="OnAddSearchSearchClick" Width="100" Margin="10"
Content="{DynamicResource wox_plugin_websearch_add}" />
</StackPanel> </StackPanel>
</Grid> </Grid>
</UserControl> </UserControl>

View File

@@ -1,120 +1,54 @@
using System.Collections.Generic; using System.Windows;
using System.Linq;
using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using Wox.Core.Plugin;
namespace Wox.Plugin.WebSearch namespace Wox.Plugin.WebSearch
{ {
/// <summary> /// <summary>
/// Interaction logic for WebSearchesSetting.xaml /// Interaction logic for WebSearchesSetting.xaml
/// </summary> /// </summary>
public partial class WebSearchesSetting : UserControl public partial class SettingsControl : UserControl
{ {
private Settings _settings; private readonly Settings _settings;
public PluginInitContext Context { get; } private readonly PluginInitContext _context;
public Main Plugin { get; }
public WebSearchesSetting(Main plugin, Settings settings) public SettingsControl(PluginInitContext context, SettingsViewModel viewModel)
{ {
Context = plugin.Context;
Plugin = plugin;
InitializeComponent(); InitializeComponent();
Loaded += Setting_Loaded; _context = context;
_settings = settings; _settings = viewModel.Settings;
DataContext = viewModel;
} }
private void Setting_Loaded(object sender, RoutedEventArgs e) private void OnAddSearchSearchClick(object sender, RoutedEventArgs e)
{ {
webSearchView.ItemsSource = _settings.WebSearches; var setting = new SearchSourceSettingWindow(_settings.SearchSources, _context);
cbEnableWebSearchSuggestion.IsChecked = _settings.EnableWebSearchSuggestion;
comboBoxSuggestionSource.Visibility = _settings.EnableWebSearchSuggestion
? Visibility.Visible
: Visibility.Collapsed;
List<ComboBoxItem> items = new List<ComboBoxItem>
{
new ComboBoxItem {Content = "Google"},
new ComboBoxItem {Content = "Baidu"}
};
ComboBoxItem selected = items.FirstOrDefault(o => o.Content.ToString() == _settings.WebSearchSuggestionSource);
if (selected == null)
{
selected = items[0];
}
comboBoxSuggestionSource.ItemsSource = items;
comboBoxSuggestionSource.SelectedItem = selected;
}
public void ReloadWebSearchView()
{
webSearchView.Items.Refresh();
}
private void btnAddWebSearch_OnClick(object sender, RoutedEventArgs e)
{
var setting = new WebSearchSetting(this, _settings);
var webSearch = new WebSearch();
setting.AddItem(webSearch);
setting.ShowDialog(); setting.ShowDialog();
} }
private void btnDeleteWebSearch_OnClick(object sender, RoutedEventArgs e) private void OnDeleteSearchSearchClick(object sender, RoutedEventArgs e)
{ {
WebSearch selectedWebSearch = webSearchView.SelectedItem as WebSearch; var selected = _settings.SelectedSearchSource;
if (selectedWebSearch != null) var warning = _context.API.GetTranslation("wox_plugin_websearch_delete_warning");
{ var formated = string.Format(warning, selected.Title);
string msg = string.Format(Context.API.GetTranslation("wox_plugin_websearch_delete_warning"), selectedWebSearch.Title);
if (MessageBox.Show(msg, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.Yes) var result = MessageBox.Show(formated, string.Empty, MessageBoxButton.YesNo);
{ if (result == MessageBoxResult.Yes)
_settings.WebSearches.Remove(selectedWebSearch);
webSearchView.Items.Refresh();
}
}
else
{ {
string warning = Context.API.GetTranslation("wox_plugin_websearch_pls_select_web_search"); var id = _context.CurrentPluginMetadata.ID;
MessageBox.Show(warning); PluginManager.RemoveActionKeyword(id, selected.ActionKeyword);
_settings.SearchSources.Remove(selected);
} }
} }
private void btnEditWebSearch_OnClick(object sender, RoutedEventArgs e) private void OnEditSearchSourceClick(object sender, RoutedEventArgs e)
{ {
WebSearch selectedWebSearch = webSearchView.SelectedItem as WebSearch; var selected = _settings.SelectedSearchSource;
if (selectedWebSearch != null) var webSearch = new SearchSourceSettingWindow
{ (
WebSearchSetting webSearch = new WebSearchSetting(this, _settings); _settings.SearchSources, _context, selected
webSearch.UpdateItem(selectedWebSearch); );
webSearch.ShowDialog(); webSearch.ShowDialog();
}
else
{
string warning = Context.API.GetTranslation("wox_plugin_websearch_pls_select_web_search");
MessageBox.Show(warning);
}
}
private void CbEnableWebSearchSuggestion_OnChecked(object sender, RoutedEventArgs e)
{
comboBoxSuggestionSource.Visibility = Visibility.Visible;
_settings.EnableWebSearchSuggestion = true;
}
private void CbEnableWebSearchSuggestion_OnUnchecked(object sender, RoutedEventArgs e)
{
comboBoxSuggestionSource.Visibility = Visibility.Collapsed;
_settings.EnableWebSearchSuggestion = false;
}
private void ComboBoxSuggestionSource_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
{
_settings.WebSearchSuggestionSource = ((ComboBoxItem)e.AddedItems[0]).Content.ToString();
}
} }
} }
} }

View File

@@ -59,6 +59,8 @@
<Link>Properties\SolutionAssemblyInfo.cs</Link> <Link>Properties\SolutionAssemblyInfo.cs</Link>
</Compile> </Compile>
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SearchSourceViewModel.cs" />
<Compile Include="SettingsViewModel.cs" />
<Compile Include="SuggestionSources\Baidu.cs" /> <Compile Include="SuggestionSources\Baidu.cs" />
<Compile Include="SuggestionSources\Google.cs" /> <Compile Include="SuggestionSources\Google.cs" />
<Compile Include="SuggestionSources\ISuggestionSource.cs" /> <Compile Include="SuggestionSources\ISuggestionSource.cs" />
@@ -162,6 +164,10 @@
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\Wox.Core\Wox.Core.csproj">
<Project>{B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}</Project>
<Name>Wox.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\Wox.Infrastructure\Wox.Infrastructure.csproj"> <ProjectReference Include="..\..\Wox.Infrastructure\Wox.Infrastructure.csproj">
<Project>{4fd29318-a8ab-4d8f-aa47-60bc241b8da3}</Project> <Project>{4fd29318-a8ab-4d8f-aa47-60bc241b8da3}</Project>
<Name>Wox.Infrastructure</Name> <Name>Wox.Infrastructure</Name>

View File

@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="JetBrains.Annotations" version="10.1.4" targetFramework="net452" /> <package id="JetBrains.Annotations" version="10.1.4" targetFramework="net452" />
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net452" /> <package id="Newtonsoft.Json" version="8.0.3" targetFramework="net452" />

View File

@@ -2,6 +2,7 @@ using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
#if DEBUG #if DEBUG
[assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Debug build, https://github.com/Wox-launcher/Wox")] [assembly: AssemblyDescription("Debug build, https://github.com/Wox-launcher/Wox")]
#else #else

View File

@@ -2,7 +2,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Wox.Core.Resource; using Wox.Core.Resource;
using Wox.Infrastructure; using Wox.Infrastructure;
@@ -30,16 +29,17 @@ namespace Wox.Core.Plugin
public static readonly Dictionary<string, PluginPair> NonGlobalPlugins = new Dictionary<string, PluginPair>(); public static readonly Dictionary<string, PluginPair> NonGlobalPlugins = new Dictionary<string, PluginPair>();
public static IPublicAPI API { private set; get; } public static IPublicAPI API { private set; get; }
// todo happlebao, this should not be public, the indicator function should be embeded // todo happlebao, this should not be public, the indicator function should be embeded
public static PluginsSettings Settings; public static PluginsSettings Settings;
private static List<PluginMetadata> _metadatas; private static List<PluginMetadata> _metadatas;
private static readonly string[] Directories = { Infrastructure.Constant.PreinstalledDirectory, Infrastructure.Constant.UserDirectory }; private static readonly string[] Directories = { Constant.PreinstalledDirectory, Constant.UserDirectory };
private static void ValidateUserDirectory() private static void ValidateUserDirectory()
{ {
if (!Directory.Exists(Infrastructure.Constant.UserDirectory)) if (!Directory.Exists(Constant.UserDirectory))
{ {
Directory.CreateDirectory(Infrastructure.Constant.UserDirectory); Directory.CreateDirectory(Constant.UserDirectory);
} }
} }
@@ -238,59 +238,58 @@ namespace Wox.Core.Plugin
} }
public static void UpdateActionKeywordForPlugin(PluginPair plugin, string oldActionKeyword, string newActionKeyword) public static bool ActionKeywordRegistered(string actionKeyword)
{ {
var actionKeywords = plugin.Metadata.ActionKeywords; if (actionKeyword != Query.GlobalPluginWildcardSign &&
if (string.IsNullOrEmpty(newActionKeyword)) NonGlobalPlugins.ContainsKey(actionKeyword))
{ {
string msg = InternationalizationManager.Instance.GetTranslation("newActionKeywordsCannotBeEmpty"); return true;
throw new WoxPluginException(plugin.Metadata.Name, msg);
} }
// do nothing if they are same
if (oldActionKeyword == newActionKeyword) return;
if (NonGlobalPlugins.ContainsKey(newActionKeyword))
{
string msg = InternationalizationManager.Instance.GetTranslation("newActionKeywordsHasBeenAssigned");
throw new WoxPluginException(plugin.Metadata.Name, msg);
}
// add new action keyword
if (string.IsNullOrEmpty(oldActionKeyword))
{
actionKeywords.Add(newActionKeyword);
if (newActionKeyword == Query.GlobalPluginWildcardSign)
{
GlobalPlugins.Add(plugin);
}
else
{
NonGlobalPlugins[newActionKeyword] = plugin;
}
}
// update existing action keyword
else else
{ {
int index = actionKeywords.IndexOf(oldActionKeyword); return false;
actionKeywords[index] = newActionKeyword;
if (oldActionKeyword == Query.GlobalPluginWildcardSign)
{
GlobalPlugins.Remove(plugin);
}
else
{
NonGlobalPlugins.Remove(oldActionKeyword);
}
if (newActionKeyword == Query.GlobalPluginWildcardSign)
{
GlobalPlugins.Add(plugin);
}
else
{
NonGlobalPlugins[newActionKeyword] = plugin;
}
} }
} }
public static void AddActionKeyword(string id, string newActionKeyword)
{
var plugin = GetPluginForId(id);
if (newActionKeyword == Query.GlobalPluginWildcardSign)
{
GlobalPlugins.Add(plugin);
}
else
{
NonGlobalPlugins[newActionKeyword] = plugin;
}
AllPlugins.Add(plugin);
plugin.Metadata.ActionKeywords.Add(newActionKeyword);
}
public static void RemoveActionKeyword(string id, string oldActionkeyword)
{
var plugin = GetPluginForId(id);
if (oldActionkeyword == Query.GlobalPluginWildcardSign)
{
GlobalPlugins.Remove(plugin);
}
else
{
NonGlobalPlugins.Remove(oldActionkeyword);
}
AllPlugins.Remove(plugin);
plugin.Metadata.ActionKeywords.Remove(oldActionkeyword);
}
public static void ReplaceActionKeyword(string id, string oldActionKeyword, string newActionKeyword)
{
if (oldActionKeyword != newActionKeyword)
{
AddActionKeyword(id, newActionKeyword);
RemoveActionKeyword(id, oldActionKeyword);
}
}
} }
} }

View File

@@ -14,9 +14,5 @@
{ {
PluginName = pluginName; PluginName = pluginName;
} }
public WoxPluginException(string msg) : base(msg)
{
}
} }
} }

View File

@@ -34,12 +34,6 @@ namespace Wox.Infrastructure.UserSettings
} }
} }
} }
public void UpdateActionKeyword(PluginMetadata metadata)
{
var settings = Plugins[metadata.ID];
settings.ActionKeywords = metadata.ActionKeywords;
}
} }
public class Plugin public class Plugin
{ {

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized;
namespace Wox.Plugin namespace Wox.Plugin
{ {
@@ -37,19 +38,6 @@ namespace Wox.Plugin
string GetTranslatedPluginDescription(); string GetTranslatedPluginDescription();
} }
public interface IMultipleActionKeywords : IFeatures
{
event ActionKeywordsChangedEventHandler ActionKeywordsChanged;
}
public class ActionKeywordsChangedEventArgs : EventArgs
{
public string OldActionKeyword { get; set; }
public string NewActionKeyword { get; set; }
}
public delegate void ActionKeywordsChangedEventHandler(IMultipleActionKeywords sender, ActionKeywordsChangedEventArgs e);
public interface IResultUpdated : IFeatures public interface IResultUpdated : IFeatures
{ {
event ResultUpdatedEventHandler ResultsUpdated; event ResultUpdatedEventHandler ResultsUpdated;

View File

@@ -11,6 +11,7 @@ namespace Wox
{ {
private PluginPair _plugin; private PluginPair _plugin;
private Settings _settings; private Settings _settings;
private readonly Internationalization _translater = InternationalizationManager.Instance;
public ActionKeywords(string pluginId, Settings settings) public ActionKeywords(string pluginId, Settings settings)
{ {
@@ -19,7 +20,7 @@ namespace Wox
_settings = settings; _settings = settings;
if (_plugin == null) if (_plugin == null)
{ {
MessageBox.Show(InternationalizationManager.Instance.GetTranslation("cannotFindSpecifiedPlugin")); MessageBox.Show(_translater.GetTranslation("cannotFindSpecifiedPlugin"));
Close(); Close();
} }
} }
@@ -39,21 +40,18 @@ namespace Wox
{ {
var oldActionKeyword = _plugin.Metadata.ActionKeywords[0]; var oldActionKeyword = _plugin.Metadata.ActionKeywords[0];
var newActionKeyword = tbAction.Text.Trim(); var newActionKeyword = tbAction.Text.Trim();
try if (!PluginManager.ActionKeywordRegistered(newActionKeyword))
{ {
// update in-memory data var id = _plugin.Metadata.ID;
PluginManager.UpdateActionKeywordForPlugin(_plugin, oldActionKeyword, newActionKeyword); PluginManager.ReplaceActionKeyword(id, oldActionKeyword, newActionKeyword);
MessageBox.Show(_translater.GetTranslation("succeed"));
Close();
} }
catch (WoxPluginException e) else
{ {
MessageBox.Show(e.Message); string msg = _translater.GetTranslation("newActionKeywordsHasBeenAssigned");
return; MessageBox.Show(msg);
} }
// update persistant data
_settings.PluginSettings.UpdateActionKeyword(_plugin.Metadata);
MessageBox.Show(InternationalizationManager.Instance.GetTranslation("succeed"));
Close();
} }
} }
} }

View File

@@ -83,10 +83,10 @@
<Image Source="{Binding Image, IsAsync=True}" <Image Source="{Binding Image, IsAsync=True}"
Width="32" Height="32" /> Width="32" Height="32" />
<StackPanel Margin="3 0 3 0"> <StackPanel Margin="3 0 3 0">
<TextBlock Text="{Binding Metadata.Name}" <TextBlock Text="{Binding PluginPair.Metadata.Name}"
ToolTip="{Binding Metadata.Name}" /> ToolTip="{Binding PluginPair.Metadata.Name}" />
<TextBlock Text="{Binding Metadata.Description}" <TextBlock Text="{Binding PluginPair.Metadata.Description}"
ToolTip="{Binding Metadata.Description}" ToolTip="{Binding PluginPair.Metadata.Description}"
Opacity="0.5" /> Opacity="0.5" />
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
@@ -119,8 +119,8 @@
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition /> <ColumnDefinition />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="{Binding Metadata.Name}" <TextBlock Text="{Binding PluginPair.Metadata.Name}"
ToolTip="{Binding Metadata.Name}" ToolTip="{Binding PluginPair.Metadata.Name}"
Grid.Column="0" Grid.Column="0"
Cursor="Hand" MouseUp="OnPluginNameClick" FontSize="24" Cursor="Hand" MouseUp="OnPluginNameClick" FontSize="24"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
@@ -128,14 +128,14 @@
VerticalAlignment="Bottom" Opacity="0.5"> VerticalAlignment="Bottom" Opacity="0.5">
<TextBlock Text="{DynamicResource author}" /> <TextBlock Text="{DynamicResource author}" />
<TextBlock Text=": " /> <TextBlock Text=": " />
<TextBlock Text="{Binding Metadata.Author}" ToolTip="{Binding Metadata.Author}" /> <TextBlock Text="{Binding PluginPair.Metadata.Author}" ToolTip="{Binding PluginPair.Metadata.Author}" />
</StackPanel> </StackPanel>
</Grid> </Grid>
<TextBlock Text="{Binding Metadata.Description}" <TextBlock Text="{Binding PluginPair.Metadata.Description}"
ToolTip="{Binding Metadata.Description}" ToolTip="{Binding PluginPair.Metadata.Description}"
Grid.Row="1" Opacity="0.5" /> Grid.Row="1" Opacity="0.5" />
<DockPanel Grid.Row="2" Margin="0 10 0 8"> <DockPanel Grid.Row="2" Margin="0 10 0 8">
<CheckBox IsChecked="{Binding Metadata.Disabled}" Checked="OnPluginToggled" <CheckBox IsChecked="{Binding PluginPair.Metadata.Disabled}" Checked="OnPluginToggled"
Unchecked="OnPluginToggled"> Unchecked="OnPluginToggled">
<TextBlock Text="{DynamicResource disable}" /> <TextBlock Text="{DynamicResource disable}" />
</CheckBox> </CheckBox>

View File

@@ -214,15 +214,15 @@ namespace Wox
private void OnPluginToggled(object sender, RoutedEventArgs e) private void OnPluginToggled(object sender, RoutedEventArgs e)
{ {
var id = _viewModel.SelectedPlugin.Metadata.ID; var id = _viewModel.SelectedPlugin.PluginPair.Metadata.ID;
_settings.PluginSettings.Plugins[id].Disabled = _viewModel.SelectedPlugin.Metadata.Disabled; _settings.PluginSettings.Plugins[id].Disabled = _viewModel.SelectedPlugin.PluginPair.Metadata.Disabled;
} }
private void OnPluginActionKeywordsClick(object sender, MouseButtonEventArgs e) private void OnPluginActionKeywordsClick(object sender, MouseButtonEventArgs e)
{ {
if (e.ChangedButton == MouseButton.Left) if (e.ChangedButton == MouseButton.Left)
{ {
var id = _viewModel.SelectedPlugin.Metadata.ID; var id = _viewModel.SelectedPlugin.PluginPair.Metadata.ID;
ActionKeywords changeKeywordsWindow = new ActionKeywords(id, _settings); ActionKeywords changeKeywordsWindow = new ActionKeywords(id, _settings);
changeKeywordsWindow.ShowDialog(); changeKeywordsWindow.ShowDialog();
} }
@@ -234,7 +234,7 @@ namespace Wox
{ {
if (e.ChangedButton == MouseButton.Left) if (e.ChangedButton == MouseButton.Left)
{ {
var website = _viewModel.SelectedPlugin.Metadata.Website; var website = _viewModel.SelectedPlugin.PluginPair.Metadata.Website;
if (!string.IsNullOrEmpty(website)) if (!string.IsNullOrEmpty(website))
{ {
var uri = new Uri(website); var uri = new Uri(website);
@@ -251,7 +251,7 @@ namespace Wox
{ {
if (e.ChangedButton == MouseButton.Left) if (e.ChangedButton == MouseButton.Left)
{ {
var directory = _viewModel.SelectedPlugin.Metadata.PluginDirectory; var directory = _viewModel.SelectedPlugin.PluginPair.Metadata.PluginDirectory;
if (!string.IsNullOrEmpty(directory) && Directory.Exists(directory)) if (!string.IsNullOrEmpty(directory) && Directory.Exists(directory))
{ {
Process.Start(directory); Process.Start(directory);

View File

@@ -9,15 +9,13 @@ namespace Wox.ViewModel
public class PluginViewModel : BaseModel public class PluginViewModel : BaseModel
{ {
public PluginPair PluginPair { get; set; } public PluginPair PluginPair { get; set; }
public PluginMetadata Metadata { get; set; }
public IPlugin Plugin { get; set; }
private readonly Internationalization _translator = InternationalizationManager.Instance; private readonly Internationalization _translator = InternationalizationManager.Instance;
public ImageSource Image => ImageLoader.Load(Metadata.IcoPath); public ImageSource Image => ImageLoader.Load(PluginPair.Metadata.IcoPath);
public Visibility ActionKeywordsVisibility => Metadata.ActionKeywords.Count > 1 ? Visibility.Collapsed : Visibility.Visible; public Visibility ActionKeywordsVisibility => PluginPair.Metadata.ActionKeywords.Count > 1 ? Visibility.Collapsed : Visibility.Visible;
public string InitilizaTime => string.Format(_translator.GetTranslation("plugin_init_time"), Metadata.InitTime); public string InitilizaTime => string.Format(_translator.GetTranslation("plugin_init_time"), PluginPair.Metadata.InitTime);
public string QueryTime => string.Format(_translator.GetTranslation("plugin_query_time"), Metadata.AvgQueryTime); public string QueryTime => string.Format(_translator.GetTranslation("plugin_query_time"), PluginPair.Metadata.AvgQueryTime);
public string ActionKeywordsText => string.Join(Query.ActionKeywordSeperater, Metadata.ActionKeywords); public string ActionKeywordsText => string.Join(Query.ActionKeywordSeperater, PluginPair.Metadata.ActionKeywords);
} }
} }

View File

@@ -36,14 +36,7 @@ namespace Wox.ViewModel
public string PluginID => RawResult.PluginID; public string PluginID => RawResult.PluginID;
public ImageSource Image public ImageSource Image => ImageLoader.Load(RawResult.IcoPath);
{
get
{
var image = ImageLoader.Load(RawResult.IcoPath);
return image;
}
}
public int Score public int Score
{ {

View File

@@ -84,8 +84,6 @@ namespace Wox.ViewModel
var metadatas = plugins.Select(p => new PluginViewModel var metadatas = plugins.Select(p => new PluginViewModel
{ {
PluginPair = p, PluginPair = p,
Metadata = p.Metadata,
Plugin = p.Plugin
}).ToList(); }).ToList();
return metadatas; return metadatas;
} }
@@ -95,23 +93,9 @@ namespace Wox.ViewModel
{ {
get get
{ {
var settingProvider = SelectedPlugin.Plugin as ISettingProvider; var settingProvider = SelectedPlugin.PluginPair.Plugin as ISettingProvider;
if (settingProvider != null) if (settingProvider != null)
{ {
var multipleActionKeywordsProvider = settingProvider as IMultipleActionKeywords;
if (multipleActionKeywordsProvider != null)
{
multipleActionKeywordsProvider.ActionKeywordsChanged += (o, e) =>
{
// update in-memory data
PluginManager.UpdateActionKeywordForPlugin(SelectedPlugin.PluginPair, e.OldActionKeyword,
e.NewActionKeyword);
// update persistant data
Settings.PluginSettings.UpdateActionKeyword(SelectedPlugin.Metadata);
MessageBox.Show(_translater.GetTranslation("succeed"));
};
}
var control = settingProvider.CreateSettingPanel(); var control = settingProvider.CreateSettingPanel();
control.HorizontalAlignment = HorizontalAlignment.Stretch; control.HorizontalAlignment = HorizontalAlignment.Stretch;
control.VerticalAlignment = VerticalAlignment.Stretch; control.VerticalAlignment = VerticalAlignment.Stretch;
@@ -124,6 +108,8 @@ namespace Wox.ViewModel
} }
} }
#endregion #endregion
#region theme #region theme