Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 59 additions & 15 deletions Flow.Launcher/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,16 @@ private async void OnLoaded(object sender, RoutedEventArgs _)
// Check first launch
if (_settings.FirstLaunch)
{
// Set First Launch to false
_settings.FirstLaunch = false;

// Set Backdrop Type to Acrylic for Windows 11 when First Launch. Default is None
if (Win32Helper.IsBackdropSupported()) _settings.BackdropType = BackdropTypes.Acrylic;

// Save settings
App.API.SaveAppAllSettings();
/* Set Backdrop Type to Acrylic for Windows 11 when First Launch. Default is None. */
if (OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000))
_settings.BackdropType = BackdropTypes.Acrylic;

// Show Welcome Window
var WelcomeWindow = new WelcomeWindow();
WelcomeWindow.Show();
}
Expand Down Expand Up @@ -161,24 +166,68 @@ private async void OnLoaded(object sender, RoutedEventArgs _)
{
if (_viewModel.MainWindowVisibilityStatus)
{
// Set clock and search icon opacity
var opacity = _settings.UseAnimation ? 0.0 : 1.0;
ClockPanel.Opacity = opacity;
SearchIcon.Opacity = opacity;

// Set clock and search icon visibility
ClockPanel.Visibility = string.IsNullOrEmpty(_viewModel.QueryText) ? Visibility.Visible : Visibility.Collapsed;
if (_viewModel.PluginIconSource != null)
{
SearchIcon.Opacity = 0.0;
}
else
{
_viewModel.SearchIconVisibility = Visibility.Visible;
}

// Play sound effect before activing the window
if (_settings.UseSound)
{
SoundPlay();
}

// Update position & Activate
UpdatePosition();
_viewModel.ResetPreview();
Activate();
QueryTextBox.Focus();
_settings.ActivateTimes++;

// Reset preview
_viewModel.ResetPreview();

// Select last query if need
if (!_viewModel.LastQuerySelected)
{
QueryTextBox.SelectAll();
_viewModel.LastQuerySelected = true;
}

// Focus query box
QueryTextBox.Focus();

// Play window animation
if (_settings.UseAnimation)
{
WindowAnimation();
}

// Update activate times
_settings.ActivateTimes++;
}
else
{
// Set clock and search icon opacity
var opacity = _settings.UseAnimation ? 0.0 : 1.0;
ClockPanel.Opacity = opacity;
SearchIcon.Opacity = opacity;

// Set clock and search icon visibility
ClockPanel.Visibility = Visibility.Hidden;
_viewModel.SearchIconVisibility = Visibility.Hidden;

// Force UI update
ClockPanel.UpdateLayout();
SearchIcon.UpdateLayout();
}
});
break;
Expand All @@ -191,7 +240,6 @@ private async void OnLoaded(object sender, RoutedEventArgs _)
Dispatcher.Invoke(() => QueryTextBox.CaretIndex = QueryTextBox.Text.Length);
_viewModel.QueryTextCursorMovedToEnd = false;
}

break;
case nameof(MainViewModel.GameModeStatus):
_notifyIcon.Icon = _viewModel.GameModeStatus
Expand Down Expand Up @@ -280,8 +328,8 @@ private async void OnDeactivated(object sender, EventArgs e)
_settings.WindowLeft = Left;
_settings.WindowTop = Top;

ClockPanel.Opacity = 0;
SearchIcon.Opacity = 0;
ClockPanel.Opacity = 0.0;
SearchIcon.Opacity = 0.0;

// This condition stops extra hide call when animator is on,
// which causes the toggling to occasional hide instead of show.
Expand All @@ -291,7 +339,9 @@ private async void OnDeactivated(object sender, EventArgs e)
// This also stops the mainwindow from flickering occasionally after Settings window is opened
// and always after Settings window is closed.
if (_settings.UseAnimation)
{
await Task.Delay(100);
}

if (_settings.HideWhenDeactivated && !_viewModel.ExternalPreviewVisible)
{
Expand Down Expand Up @@ -765,12 +815,6 @@ private void WindowAnimation()
{
_isArrowKeyPressed = true;

UpdatePosition();

var opacity = _settings.UseAnimation ? 0.0 : 1.0;
ClockPanel.Opacity = opacity;
SearchIcon.Opacity = opacity;

var clocksb = new Storyboard();
var iconsb = new Storyboard();
var easing = new CircleEase { EasingMode = EasingMode.EaseInOut };
Expand Down
99 changes: 26 additions & 73 deletions Flow.Launcher/ViewModel/MainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Plugin;
Expand Down Expand Up @@ -638,25 +637,29 @@ public void ChangeQueryText(string queryText, bool isReQuery = false)
/// </summary>
private async Task ChangeQueryTextAsync(string queryText, bool isReQuery = false)
{
await Application.Current.Dispatcher.InvokeAsync(async () =>
// Must check access so that we will not block the UI thread which cause window visibility issue
if (!Application.Current.Dispatcher.CheckAccess())
{
BackToQueryResults();
await Application.Current.Dispatcher.InvokeAsync(() => ChangeQueryText(queryText, isReQuery));
return;
}

if (QueryText != queryText)
{
// re-query is done in QueryText's setter method
QueryText = queryText;
// set to false so the subsequent set true triggers
// PropertyChanged and MoveQueryTextToEnd is called
QueryTextCursorMovedToEnd = false;
}
else if (isReQuery)
{
await QueryAsync(isReQuery: true);
}
BackToQueryResults();

QueryTextCursorMovedToEnd = true;
});
if (QueryText != queryText)
{
// re-query is done in QueryText's setter method
QueryText = queryText;
// set to false so the subsequent set true triggers
// PropertyChanged and MoveQueryTextToEnd is called
QueryTextCursorMovedToEnd = false;
}
else if (isReQuery)
{
await QueryAsync(isReQuery: true);
}

QueryTextCursorMovedToEnd = true;
}

public bool LastQuerySelected { get; set; }
Expand Down Expand Up @@ -1444,43 +1447,10 @@ public bool ShouldIgnoreHotkeys()

#pragma warning disable VSTHRD100 // Avoid async void methods

public async void Show()
public void Show()
{
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
var opacity = Settings.UseAnimation ? 0.0 : 1.0;
mainWindow.ClockPanel.Opacity = opacity;
mainWindow.SearchIcon.Opacity = opacity;

// QueryText sometimes is null when it is just initialized
if (QueryText != null && QueryText.Length != 0)
{
mainWindow.ClockPanel.Visibility = Visibility.Collapsed;
}
else
{
mainWindow.ClockPanel.Visibility = Visibility.Visible;
}

if (PluginIconSource != null)
{
mainWindow.SearchIcon.Opacity = 0;
}
else
{
SearchIconVisibility = Visibility.Visible;
}

// 📌 Restore UI elements
//mainWindow.SearchIcon.Visibility = Visibility.Visible;
}
}, DispatcherPriority.Render);
// 📌 Remove DWM Cloak (Make the window visible normally)
Win32Helper.DWMSetCloakForWindow(Application.Current.MainWindow, false);

// Update WPF properties
MainWindowVisibility = Visibility.Visible;
Expand All @@ -1496,6 +1466,9 @@ await Application.Current.Dispatcher.InvokeAsync(() =>

public async void Hide()
{
// 📌 Apply DWM Cloak (Completely hide the window)
Win32Helper.DWMSetCloakForWindow(Application.Current.MainWindow, true);

lastHistoryIndex = 1;

if (ExternalPreviewVisible)
Expand Down Expand Up @@ -1530,26 +1503,6 @@ public async void Hide()
break;
}

await Application.Current.Dispatcher.InvokeAsync(() =>
{
if (Application.Current.MainWindow is MainWindow mainWindow)
{
// 📌 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);
}
});

if (StartWithEnglishMode)
{
Win32Helper.RestorePreviousKeyboardLayout();
Expand Down
Loading