mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Code quality & Async support for show / hide
This commit is contained in:
parent
40bb4efa79
commit
b88057cbe5
1 changed files with 65 additions and 71 deletions
|
|
@ -1,15 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Windows.Input;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Threading;
|
||||
using CommunityToolkit.Mvvm.DependencyInjection;
|
||||
|
|
@ -631,7 +630,15 @@ namespace Flow.Launcher.ViewModel
|
|||
/// <param name="isReQuery">Force query even when Query Text doesn't change</param>
|
||||
public void ChangeQueryText(string queryText, bool isReQuery = false)
|
||||
{
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
_ = ChangeQueryTextAsync(queryText, isReQuery);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Async version of <see cref="ChangeQueryText"/>
|
||||
/// </summary>
|
||||
private async Task ChangeQueryTextAsync(string queryText, bool isReQuery = false)
|
||||
{
|
||||
await Application.Current.Dispatcher.InvokeAsync(async () =>
|
||||
{
|
||||
BackToQueryResults();
|
||||
|
||||
|
|
@ -645,7 +652,7 @@ namespace Flow.Launcher.ViewModel
|
|||
}
|
||||
else if (isReQuery)
|
||||
{
|
||||
Query(isReQuery: true);
|
||||
await QueryAsync(isReQuery: true);
|
||||
}
|
||||
|
||||
QueryTextCursorMovedToEnd = true;
|
||||
|
|
@ -1017,10 +1024,15 @@ namespace Flow.Launcher.ViewModel
|
|||
#region Query
|
||||
|
||||
private void Query(bool isReQuery = false)
|
||||
{
|
||||
_ = QueryAsync(isReQuery);
|
||||
}
|
||||
|
||||
private async Task QueryAsync(bool isReQuery = false)
|
||||
{
|
||||
if (QueryResultsSelected())
|
||||
{
|
||||
_ = QueryResultsAsync(isReQuery);
|
||||
await QueryResultsAsync(isReQuery);
|
||||
}
|
||||
else if (ContextMenuSelected())
|
||||
{
|
||||
|
|
@ -1054,10 +1066,10 @@ namespace Flow.Launcher.ViewModel
|
|||
(
|
||||
r =>
|
||||
{
|
||||
var match = StringMatcher.FuzzySearch(query, r.Title);
|
||||
var match = App.API.FuzzySearch(query, r.Title);
|
||||
if (!match.IsSearchPrecisionScoreMet())
|
||||
{
|
||||
match = StringMatcher.FuzzySearch(query, r.SubTitle);
|
||||
match = App.API.FuzzySearch(query, r.SubTitle);
|
||||
}
|
||||
|
||||
if (!match.IsSearchPrecisionScoreMet()) return false;
|
||||
|
|
@ -1099,7 +1111,7 @@ namespace Flow.Launcher.ViewModel
|
|||
Action = _ =>
|
||||
{
|
||||
SelectedResults = Results;
|
||||
ChangeQueryText(h.Query);
|
||||
App.API.ChangeQuery(h.Query);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
|
@ -1110,8 +1122,8 @@ namespace Flow.Launcher.ViewModel
|
|||
{
|
||||
var filtered = results.Where
|
||||
(
|
||||
r => StringMatcher.FuzzySearch(query, r.Title).IsSearchPrecisionScoreMet() ||
|
||||
StringMatcher.FuzzySearch(query, r.SubTitle).IsSearchPrecisionScoreMet()
|
||||
r => App.API.FuzzySearch(query, r.Title).IsSearchPrecisionScoreMet() ||
|
||||
App.API.FuzzySearch(query, r.SubTitle).IsSearchPrecisionScoreMet()
|
||||
).ToList();
|
||||
History.AddResults(filtered, id);
|
||||
}
|
||||
|
|
@ -1430,28 +1442,23 @@ namespace Flow.Launcher.ViewModel
|
|||
|
||||
#region Public Methods
|
||||
|
||||
public void Show()
|
||||
#pragma warning disable VSTHRD100 // Avoid async void methods
|
||||
|
||||
public async void Show()
|
||||
{
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
await Application.Current.Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
if (Application.Current.MainWindow is MainWindow mainWindow)
|
||||
{
|
||||
// 📌 Remove DWM Cloak (Make the window visible normally)
|
||||
Win32Helper.DWMSetCloakForWindow(mainWindow, false);
|
||||
|
||||
//Clock and SearchIcon hide when show situation
|
||||
if(Settings.UseAnimation)
|
||||
{
|
||||
mainWindow.ClockPanel.Opacity = 0;
|
||||
mainWindow.SearchIcon.Opacity = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mainWindow.ClockPanel.Opacity = 1;
|
||||
mainWindow.SearchIcon.Opacity = 1;
|
||||
}
|
||||
|
||||
if (mainWindow.QueryTextBox.Text.Length != 0)
|
||||
// Clock and SearchIcon hide when show situation
|
||||
var opacity = Settings.UseAnimation ? 0.0 : 1.0;
|
||||
mainWindow.ClockPanel.Opacity = opacity;
|
||||
mainWindow.SearchIcon.Opacity = opacity;
|
||||
|
||||
if (QueryText.Length != 0)
|
||||
{
|
||||
mainWindow.ClockPanel.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
|
@ -1459,6 +1466,7 @@ namespace Flow.Launcher.ViewModel
|
|||
{
|
||||
mainWindow.ClockPanel.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
if (PluginIconSource != null)
|
||||
{
|
||||
mainWindow.SearchIcon.Opacity = 0;
|
||||
|
|
@ -1467,30 +1475,28 @@ namespace Flow.Launcher.ViewModel
|
|||
{
|
||||
SearchIconVisibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
// 📌 Restore UI elements
|
||||
//mainWindow.SearchIcon.Visibility = Visibility.Visible;
|
||||
if (Settings.UseAnimation)
|
||||
{
|
||||
Application.Current.Dispatcher.BeginInvoke(() =>
|
||||
mainWindow.WindowAnimation());
|
||||
mainWindow.WindowAnimation();
|
||||
}
|
||||
}
|
||||
}, DispatcherPriority.Render);
|
||||
|
||||
// Update WPF properties
|
||||
MainWindowVisibility = Visibility.Visible;
|
||||
MainWindowOpacity = 1;
|
||||
MainWindowVisibilityStatus = true;
|
||||
VisibilityChanged?.Invoke(this, new VisibilityChangedEventArgs { IsVisible = true });
|
||||
// Update WPF properties
|
||||
MainWindowVisibility = Visibility.Visible;
|
||||
MainWindowOpacity = 1;
|
||||
MainWindowVisibilityStatus = true;
|
||||
VisibilityChanged?.Invoke(this, new VisibilityChangedEventArgs { IsVisible = true });
|
||||
|
||||
if (StartWithEnglishMode)
|
||||
{
|
||||
Win32Helper.SwitchToEnglishKeyboardLayout(true);
|
||||
}
|
||||
});
|
||||
if (StartWithEnglishMode)
|
||||
{
|
||||
Win32Helper.SwitchToEnglishKeyboardLayout(true);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma warning disable VSTHRD100 // Avoid async void methods
|
||||
|
||||
public async void Hide()
|
||||
{
|
||||
lastHistoryIndex = 1;
|
||||
|
|
@ -1505,59 +1511,47 @@ namespace Flow.Launcher.ViewModel
|
|||
SelectedResults = Results;
|
||||
}
|
||||
|
||||
// 📌 Immediately apply text reset + force UI update
|
||||
/*if (Settings.LastQueryMode == LastQueryMode.Empty)
|
||||
{
|
||||
ChangeQueryText(string.Empty);
|
||||
await Task.Delay(1); // Wait for one frame to ensure UI reflects changes
|
||||
Application.Current.Dispatcher.Invoke(Application.Current.MainWindow.UpdateLayout); // Force UI update
|
||||
}*/
|
||||
|
||||
switch (Settings.LastQueryMode)
|
||||
{
|
||||
case LastQueryMode.Empty:
|
||||
ChangeQueryText(string.Empty);
|
||||
await Task.Delay(1);
|
||||
await ChangeQueryTextAsync(string.Empty);
|
||||
break;
|
||||
case LastQueryMode.Preserved:
|
||||
case LastQueryMode.Selected:
|
||||
LastQuerySelected = (Settings.LastQueryMode == LastQueryMode.Preserved);
|
||||
LastQuerySelected = Settings.LastQueryMode == LastQueryMode.Preserved;
|
||||
break;
|
||||
|
||||
case LastQueryMode.ActionKeywordPreserved:
|
||||
case LastQueryMode.ActionKeywordSelected:
|
||||
var newQuery = _lastQuery.ActionKeyword;
|
||||
|
||||
if (!string.IsNullOrEmpty(newQuery))
|
||||
newQuery += " ";
|
||||
ChangeQueryText(newQuery);
|
||||
await ChangeQueryTextAsync(newQuery);
|
||||
|
||||
if (Settings.LastQueryMode == LastQueryMode.ActionKeywordSelected)
|
||||
LastQuerySelected = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (Application.Current.MainWindow is MainWindow mainWindow)
|
||||
await Application.Current.Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
// 📌 Set Opacity of icon and clock to 0 and apply Visibility.Hidden
|
||||
if(Settings.UseAnimation)
|
||||
if (Application.Current.MainWindow is MainWindow mainWindow)
|
||||
{
|
||||
mainWindow.ClockPanel.Opacity = 0;
|
||||
mainWindow.SearchIcon.Opacity = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mainWindow.ClockPanel.Opacity = 1;
|
||||
mainWindow.SearchIcon.Opacity = 1;
|
||||
}
|
||||
mainWindow.ClockPanel.Visibility = Visibility.Hidden;
|
||||
SearchIconVisibility = Visibility.Hidden;
|
||||
// 📌 Set Opacity of icon and clock to 0 and apply Visibility.Hidden
|
||||
var opacity = Settings.UseAnimation ? 0.0 : 1.0;
|
||||
mainWindow.ClockPanel.Opacity = opacity;
|
||||
mainWindow.SearchIcon.Opacity = opacity;
|
||||
mainWindow.ClockPanel.Visibility = Visibility.Hidden;
|
||||
SearchIconVisibility = Visibility.Hidden;
|
||||
|
||||
// Force UI update
|
||||
mainWindow.ClockPanel.UpdateLayout();
|
||||
mainWindow.SearchIcon.UpdateLayout();
|
||||
// 📌 Apply DWM Cloak (Completely hide the window)
|
||||
Win32Helper.DWMSetCloakForWindow(mainWindow, true);
|
||||
}
|
||||
// Force UI update
|
||||
mainWindow.ClockPanel.UpdateLayout();
|
||||
mainWindow.SearchIcon.UpdateLayout();
|
||||
|
||||
// 📌 Apply DWM Cloak (Completely hide the window)
|
||||
Win32Helper.DWMSetCloakForWindow(mainWindow, true);
|
||||
}
|
||||
});
|
||||
|
||||
if (StartWithEnglishMode)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue