mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-07 19:57:07 +02:00
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:
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
7
Plugins/Wox.Plugin.WebSearch/SearchSourceViewModel.cs
Normal file
7
Plugins/Wox.Plugin.WebSearch/SearchSourceViewModel.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace Wox.Plugin.WebSearch
|
||||||
|
{
|
||||||
|
public class SearchSourceViewModel
|
||||||
|
{
|
||||||
|
public SearchSource SearchSource { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
22
Plugins/Wox.Plugin.WebSearch/SettingsViewModel.cs
Normal file
22
Plugins/Wox.Plugin.WebSearch/SettingsViewModel.cs
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,9 +14,5 @@
|
|||||||
{
|
{
|
||||||
PluginName = pluginName;
|
PluginName = pluginName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WoxPluginException(string msg) : base(msg)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user