diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 25d9c5d2d..89d4f0847 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -161,24 +161,67 @@ namespace Flow.Launcher { 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(); + } + + _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; @@ -191,7 +234,6 @@ namespace Flow.Launcher Dispatcher.Invoke(() => QueryTextBox.CaretIndex = QueryTextBox.Text.Length); _viewModel.QueryTextCursorMovedToEnd = false; } - break; case nameof(MainViewModel.GameModeStatus): _notifyIcon.Icon = _viewModel.GameModeStatus @@ -280,8 +322,8 @@ namespace Flow.Launcher _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. @@ -291,7 +333,9 @@ namespace Flow.Launcher // 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) { @@ -765,12 +809,6 @@ namespace Flow.Launcher { _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 }; diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 192f8b481..9e63244f4 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -10,7 +10,6 @@ using System.Threading.Tasks; 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; @@ -645,22 +644,22 @@ namespace Flow.Launcher.ViewModel return; } - BackToQueryResults(); + BackToQueryResults(); - 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); - } + 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; + QueryTextCursorMovedToEnd = true; } public bool LastQuerySelected { get; set; } @@ -1448,43 +1447,10 @@ namespace Flow.Launcher.ViewModel #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; @@ -1500,6 +1466,9 @@ namespace Flow.Launcher.ViewModel public async void Hide() { + // 📌 Apply DWM Cloak (Completely hide the window) + Win32Helper.DWMSetCloakForWindow(Application.Current.MainWindow, true); + lastHistoryIndex = 1; if (ExternalPreviewVisible) @@ -1534,26 +1503,6 @@ namespace Flow.Launcher.ViewModel 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();