mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Optimize Logic and code
This commit is contained in:
parent
b017bdeed4
commit
350499a480
3 changed files with 14 additions and 23 deletions
|
|
@ -47,7 +47,7 @@ namespace Flow.Launcher.ViewModel
|
||||||
|
|
||||||
private readonly Internationalization _translator = InternationalizationManager.Instance;
|
private readonly Internationalization _translator = InternationalizationManager.Instance;
|
||||||
|
|
||||||
private Channel<ResultsForUpdate> _resultsUpdateQueue;
|
private ChannelWriter<ResultsForUpdate> _resultsUpdateChannelWriter;
|
||||||
private Task _resultsViewUpdateTask;
|
private Task _resultsViewUpdateTask;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -86,20 +86,21 @@ namespace Flow.Launcher.ViewModel
|
||||||
|
|
||||||
private void RegisterViewUpdate()
|
private void RegisterViewUpdate()
|
||||||
{
|
{
|
||||||
_resultsUpdateQueue = Channel.CreateUnbounded<ResultsForUpdate>();
|
var resultUpdateChannel = Channel.CreateUnbounded<ResultsForUpdate>();
|
||||||
|
_resultsUpdateChannelWriter = resultUpdateChannel.Writer;
|
||||||
_resultsViewUpdateTask =
|
_resultsViewUpdateTask =
|
||||||
Task.Run(updateAction).ContinueWith(continueAction, TaskContinuationOptions.OnlyOnFaulted);
|
Task.Run(updateAction).ContinueWith(continueAction, TaskContinuationOptions.OnlyOnFaulted);
|
||||||
|
|
||||||
async Task updateAction()
|
async Task updateAction()
|
||||||
{
|
{
|
||||||
var queue = new Dictionary<string, ResultsForUpdate>();
|
var queue = new Dictionary<string, ResultsForUpdate>();
|
||||||
var queueReader = _resultsUpdateQueue.Reader;
|
var channelReader = resultUpdateChannel.Reader;
|
||||||
|
|
||||||
// it is not supposed to be false because it won't be complete
|
// it is not supposed to be false because it won't be complete
|
||||||
while (await queueReader.WaitToReadAsync())
|
while (await channelReader.WaitToReadAsync())
|
||||||
{
|
{
|
||||||
await Task.Delay(20);
|
await Task.Delay(20);
|
||||||
while (queueReader.TryRead(out var item))
|
while (channelReader.TryRead(out var item))
|
||||||
{
|
{
|
||||||
if (!item.Token.IsCancellationRequested)
|
if (!item.Token.IsCancellationRequested)
|
||||||
queue[item.ID] = item;
|
queue[item.ID] = item;
|
||||||
|
|
@ -134,7 +135,7 @@ namespace Flow.Launcher.ViewModel
|
||||||
if (e.Query.RawQuery == QueryText) // TODO: allow cancellation
|
if (e.Query.RawQuery == QueryText) // TODO: allow cancellation
|
||||||
{
|
{
|
||||||
PluginManager.UpdatePluginMetadata(e.Results, pair.Metadata, e.Query);
|
PluginManager.UpdatePluginMetadata(e.Results, pair.Metadata, e.Query);
|
||||||
if (!_resultsUpdateQueue.Writer.TryWrite(new ResultsForUpdate(e.Results, pair.Metadata, e.Query, _updateToken)))
|
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(e.Results, pair.Metadata, e.Query, _updateToken)))
|
||||||
{
|
{
|
||||||
Log.Error("MainViewModel", "Unable to add item to Result Update Queue");
|
Log.Error("MainViewModel", "Unable to add item to Result Update Queue");
|
||||||
};
|
};
|
||||||
|
|
@ -540,7 +541,7 @@ namespace Flow.Launcher.ViewModel
|
||||||
var results = await PluginManager.QueryForPlugin(plugin, query, currentCancellationToken);
|
var results = await PluginManager.QueryForPlugin(plugin, query, currentCancellationToken);
|
||||||
if (currentCancellationToken.IsCancellationRequested || results == null) return;
|
if (currentCancellationToken.IsCancellationRequested || results == null) return;
|
||||||
|
|
||||||
if (!_resultsUpdateQueue.Writer.TryWrite(new ResultsForUpdate(results, plugin.Metadata, query, currentCancellationToken)))
|
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, plugin.Metadata, query, currentCancellationToken)))
|
||||||
{
|
{
|
||||||
Log.Error("MainViewModel", "Unable to add item to Result Update Queue");
|
Log.Error("MainViewModel", "Unable to add item to Result Update Queue");
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ using System.Threading;
|
||||||
|
|
||||||
namespace Flow.Launcher.ViewModel
|
namespace Flow.Launcher.ViewModel
|
||||||
{
|
{
|
||||||
public class ResultsForUpdate
|
public struct ResultsForUpdate
|
||||||
{
|
{
|
||||||
public List<Result> Results { get; }
|
public List<Result> Results { get; }
|
||||||
|
|
||||||
|
|
@ -16,13 +16,6 @@ namespace Flow.Launcher.ViewModel
|
||||||
public Query Query { get; }
|
public Query Query { get; }
|
||||||
public CancellationToken Token { get; }
|
public CancellationToken Token { get; }
|
||||||
|
|
||||||
public ResultsForUpdate(List<Result> results, string resultID, CancellationToken token)
|
|
||||||
{
|
|
||||||
Results = results;
|
|
||||||
ID = resultID;
|
|
||||||
Token = token;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResultsForUpdate(List<Result> results, PluginMetadata metadata, Query query, CancellationToken token)
|
public ResultsForUpdate(List<Result> results, PluginMetadata metadata, Query query, CancellationToken token)
|
||||||
{
|
{
|
||||||
Results = results;
|
Results = results;
|
||||||
|
|
|
||||||
|
|
@ -183,13 +183,12 @@ namespace Flow.Launcher.ViewModel
|
||||||
private List<ResultViewModel> NewResults(List<Result> newRawResults, string resultId)
|
private List<ResultViewModel> NewResults(List<Result> newRawResults, string resultId)
|
||||||
{
|
{
|
||||||
if (newRawResults.Count == 0)
|
if (newRawResults.Count == 0)
|
||||||
return Results.ToList();
|
return Results;
|
||||||
|
|
||||||
var results = Results as IEnumerable<ResultViewModel>;
|
|
||||||
|
|
||||||
var newResults = newRawResults.Select(r => new ResultViewModel(r, _settings));
|
var newResults = newRawResults.Select(r => new ResultViewModel(r, _settings));
|
||||||
|
|
||||||
return results.Where(r => r.Result.PluginID != resultId)
|
return Results.Where(r => r.Result.PluginID != resultId)
|
||||||
.Concat(newResults)
|
.Concat(newResults)
|
||||||
.OrderByDescending(r => r.Result.Score)
|
.OrderByDescending(r => r.Result.Score)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
@ -198,11 +197,9 @@ namespace Flow.Launcher.ViewModel
|
||||||
private List<ResultViewModel> NewResults(IEnumerable<ResultsForUpdate> resultsForUpdates)
|
private List<ResultViewModel> NewResults(IEnumerable<ResultsForUpdate> resultsForUpdates)
|
||||||
{
|
{
|
||||||
if (!resultsForUpdates.Any())
|
if (!resultsForUpdates.Any())
|
||||||
return Results.ToList();
|
return Results;
|
||||||
|
|
||||||
var results = Results as IEnumerable<ResultViewModel>;
|
return Results.Where(r => r != null && !resultsForUpdates.Any(u => u.ID == r.Result.PluginID))
|
||||||
|
|
||||||
return results.Where(r => r != null && !resultsForUpdates.Any(u => u.Metadata.ID == r.Result.PluginID))
|
|
||||||
.Concat(resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings)))
|
.Concat(resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings)))
|
||||||
.OrderByDescending(rv => rv.Result.Score)
|
.OrderByDescending(rv => rv.Result.Score)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue