This commit is contained in:
AT
2019-12-14 00:17:05 +02:00
parent 3dfccea522
commit e6e1aab098
3 changed files with 56 additions and 42 deletions

View File

@@ -56,7 +56,7 @@
<Border Style="{DynamicResource WindowBorderStyle}" MouseDown="OnMouseDown" > <Border Style="{DynamicResource WindowBorderStyle}" MouseDown="OnMouseDown" >
<StackPanel Orientation="Vertical"> <StackPanel Orientation="Vertical">
<TextBox Style="{DynamicResource QueryBoxStyle}" <TextBox Style="{DynamicResource QueryBoxStyle}"
Text="{Binding QueryText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Text="{Binding QueryText, Mode=TwoWay, Delay=100, UpdateSourceTrigger=PropertyChanged}"
PreviewDragOver="OnPreviewDragOver" PreviewDragOver="OnPreviewDragOver"
TextChanged="OnTextChanged" TextChanged="OnTextChanged"
AllowDrop="True" AllowDrop="True"

View File

@@ -13,7 +13,6 @@ using Wox.Core.Resource;
using Wox.Helper; using Wox.Helper;
using Wox.Infrastructure; using Wox.Infrastructure;
using Wox.Infrastructure.Hotkey; using Wox.Infrastructure.Hotkey;
using Wox.Infrastructure.Image;
using Wox.Infrastructure.Storage; using Wox.Infrastructure.Storage;
using Wox.Infrastructure.UserSettings; using Wox.Infrastructure.UserSettings;
using Wox.Plugin; using Wox.Plugin;
@@ -25,7 +24,7 @@ namespace Wox.ViewModel
{ {
#region Private Fields #region Private Fields
private bool _queryHasReturn; private bool _isQueryRunning;
private Query _lastQuery; private Query _lastQuery;
private string _queryTextBeforeLeaveResults; private string _queryTextBeforeLeaveResults;
@@ -41,7 +40,7 @@ namespace Wox.ViewModel
private CancellationToken _updateToken; private CancellationToken _updateToken;
private bool _saved; private bool _saved;
private Internationalization _translator = InternationalizationManager.Instance; private readonly Internationalization _translator = InternationalizationManager.Instance;
#endregion #endregion
@@ -312,7 +311,7 @@ namespace Wox.ViewModel
{ {
var filtered = results.Where var filtered = results.Where
( (
r => StringMatcher.FuzzySearch(query, r.Title).IsSearchPrecisionScoreMet() r => StringMatcher.FuzzySearch(query, r.Title).IsSearchPrecisionScoreMet()
|| StringMatcher.FuzzySearch(query, r.SubTitle).IsSearchPrecisionScoreMet() || StringMatcher.FuzzySearch(query, r.SubTitle).IsSearchPrecisionScoreMet()
).ToList(); ).ToList();
ContextMenu.AddResults(filtered, id); ContextMenu.AddResults(filtered, id);
@@ -371,49 +370,33 @@ namespace Wox.ViewModel
if (!string.IsNullOrEmpty(QueryText)) if (!string.IsNullOrEmpty(QueryText))
{ {
_updateSource?.Cancel(); _updateSource?.Cancel();
_updateSource = new CancellationTokenSource(); var currentUpdateSource = new CancellationTokenSource();
var updateToken = _updateSource.Token; _updateSource = currentUpdateSource;
var currentCancellationToken = _updateSource.Token;
_updateToken = currentCancellationToken;
ProgressBarVisibility = Visibility.Hidden; ProgressBarVisibility = Visibility.Hidden;
_queryHasReturn = false; _isQueryRunning = true;
var query = PluginManager.QueryInit(QueryText.Trim()); var query = PluginManager.QueryInit(QueryText.Trim());
if (query != null) if (query != null)
{ {
// handle the exclusiveness of plugin using action keyword // handle the exclusiveness of plugin using action keyword
string lastKeyword = _lastQuery.ActionKeyword; RemoveOldQueryResults(query);
string keyword = query.ActionKeyword;
if (string.IsNullOrEmpty(lastKeyword))
{
if (!string.IsNullOrEmpty(keyword))
{
Results.RemoveResultsExcept(PluginManager.NonGlobalPlugins[keyword].Metadata);
}
}
else
{
if (string.IsNullOrEmpty(keyword))
{
Results.RemoveResultsFor(PluginManager.NonGlobalPlugins[lastKeyword].Metadata);
}
else if (lastKeyword != keyword)
{
Results.RemoveResultsExcept(PluginManager.NonGlobalPlugins[keyword].Metadata);
}
}
_lastQuery = query; _lastQuery = query;
Task.Delay(200, updateToken).ContinueWith(_ => Task.Delay(200, currentCancellationToken).ContinueWith(_ =>
{ { // start the progress bar if query takes more than 200 ms and this is the current running query and it didn't finish yet
if (query.RawQuery == _lastQuery.RawQuery && !_queryHasReturn) if (currentUpdateSource == _updateSource && _isQueryRunning)
{ {
ProgressBarVisibility = Visibility.Visible; ProgressBarVisibility = Visibility.Visible;
} }
}, updateToken); }, currentCancellationToken);
var plugins = PluginManager.ValidPluginsForQuery(query); var plugins = PluginManager.ValidPluginsForQuery(query);
Task.Run(() => Task.Run(() =>
{ {
var parallelOptions = new ParallelOptions {CancellationToken = updateToken}; // so looping will stop once it was cancelled // so looping will stop once it was cancelled
var parallelOptions = new ParallelOptions { CancellationToken = currentCancellationToken };
Parallel.ForEach(plugins, parallelOptions, plugin => Parallel.ForEach(plugins, parallelOptions, plugin =>
{ {
var config = _settings.PluginSettings.Plugins[plugin.Metadata.ID]; var config = _settings.PluginSettings.Plugins[plugin.Metadata.ID];
@@ -422,13 +405,16 @@ namespace Wox.ViewModel
var results = PluginManager.QueryForPlugin(plugin, query); var results = PluginManager.QueryForPlugin(plugin, query);
UpdateResultView(results, plugin.Metadata, query); UpdateResultView(results, plugin.Metadata, query);
} }
});// TODO add cancel code. });
// this should happen once after all queries are done so progress bar should continue // this should happen once after all queries are done so progress bar should continue
// until the end of all querying // until the end of all querying
_queryHasReturn = true; _isQueryRunning = false;
ProgressBarVisibility = Visibility.Hidden; if (currentUpdateSource == _updateSource)
}, updateToken); { // update to hidden if this is still the current query
ProgressBarVisibility = Visibility.Hidden;
}
}, currentCancellationToken);
} }
} }
else else
@@ -438,6 +424,30 @@ namespace Wox.ViewModel
} }
} }
private void RemoveOldQueryResults(Query query)
{
string lastKeyword = _lastQuery.ActionKeyword;
string keyword = query.ActionKeyword;
if (string.IsNullOrEmpty(lastKeyword))
{
if (!string.IsNullOrEmpty(keyword))
{
Results.RemoveResultsExcept(PluginManager.NonGlobalPlugins[keyword].Metadata);
}
}
else
{
if (string.IsNullOrEmpty(keyword))
{
Results.RemoveResultsFor(PluginManager.NonGlobalPlugins[lastKeyword].Metadata);
}
else if (lastKeyword != keyword)
{
Results.RemoveResultsExcept(PluginManager.NonGlobalPlugins[keyword].Metadata);
}
}
}
private Result ContextMenuTopMost(Result result) private Result ContextMenuTopMost(Result result)
{ {
@@ -661,4 +671,4 @@ namespace Wox.ViewModel
#endregion #endregion
} }
} }

View File

@@ -156,14 +156,14 @@ namespace Wox.ViewModel
private List<ResultViewModel> NewResults(List<Result> newRawResults, string resultId) private List<ResultViewModel> NewResults(List<Result> newRawResults, string resultId)
{ {
var results = Results.ToList(); var results = Results.ToList();
var newResults = newRawResults.Select(r => new ResultViewModel(r)).ToList(); var newResults = newRawResults.Select(r => new ResultViewModel(r)).ToList();
var oldResults = results.Where(r => r.Result.PluginID == resultId).ToList(); var oldResults = results.Where(r => r.Result.PluginID == resultId).ToList();
// Find the same results in A (old results) and B (new newResults) // Find the same results in A (old results) and B (new newResults)
var sameResults = oldResults var sameResults = oldResults
.Where(t1 => newResults.Any(x => x.Result.Equals(t1.Result))) .Where(t1 => newResults.Any(x => x.Result.Equals(t1.Result)))
.ToList(); .ToList();
// remove result of relative complement of B in A // remove result of relative complement of B in A
foreach (var result in oldResults.Except(sameResults)) foreach (var result in oldResults.Except(sameResults))
{ {
@@ -248,6 +248,10 @@ namespace Wox.ViewModel
} }
} }
/// <summary>
/// Update the results collection with new results, try to keep identical results
/// </summary>
/// <param name="newItems"></param>
public void Update(List<ResultViewModel> newItems) public void Update(List<ResultViewModel> newItems)
{ {
int newCount = newItems.Count; int newCount = newItems.Count;
@@ -259,7 +263,7 @@ namespace Wox.ViewModel
ResultViewModel oldResult = this[i]; ResultViewModel oldResult = this[i];
ResultViewModel newResult = newItems[i]; ResultViewModel newResult = newItems[i];
if (!oldResult.Equals(newResult)) if (!oldResult.Equals(newResult))
{ { // result is not the same update it in the current index
this[i] = newResult; this[i] = newResult;
} }
else if (oldResult.Result.Score != newResult.Result.Score) else if (oldResult.Result.Score != newResult.Result.Score)
@@ -286,4 +290,4 @@ namespace Wox.ViewModel
} }
} }
} }
} }