diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 2ce3d1e95..e1bd8a429 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -296,7 +296,7 @@ namespace Flow.Launcher e.Handled = true; break; case Key.Right: - if (_viewModel.SelectedIsFromQueryResults() + if (_viewModel.QueryResultsSelected() && QueryTextBox.CaretIndex == QueryTextBox.Text.Length && !string.IsNullOrEmpty(QueryTextBox.Text)) { @@ -306,7 +306,7 @@ namespace Flow.Launcher break; case Key.Left: - if (!_viewModel.SelectedIsFromQueryResults() && QueryTextBox.CaretIndex == 0) + if (!_viewModel.QueryResultsSelected() && QueryTextBox.CaretIndex == 0) { _viewModel.EscCommand.Execute(null); e.Handled = true; @@ -316,7 +316,7 @@ namespace Flow.Launcher case Key.Back: if (specialKeyState.CtrlPressed) { - if (_viewModel.SelectedIsFromQueryResults() + if (_viewModel.QueryResultsSelected() && QueryTextBox.Text.Length > 0 && QueryTextBox.CaretIndex == QueryTextBox.Text.Length) { diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index cf8b59453..d055bee60 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -164,7 +164,7 @@ namespace Flow.Launcher.ViewModel case nameof(Results.SelectedItem): _selectedItemFromQueryResults = true; PreviewSelectedItem = Results.SelectedItem; - UpdatePreview(); + _ = UpdatePreviewAsync(); break; } }; @@ -176,7 +176,7 @@ namespace Flow.Launcher.ViewModel case nameof(History.SelectedItem): _selectedItemFromQueryResults = false; PreviewSelectedItem = History.SelectedItem; - UpdatePreview(); + _ = UpdatePreviewAsync(); break; } }; @@ -280,7 +280,7 @@ namespace Flow.Launcher.ViewModel [RelayCommand] private void LoadHistory() { - if (SelectedIsFromQueryResults()) + if (QueryResultsSelected()) { SelectedResults = History; History.SelectedIndex = _history.Items.Count - 1; @@ -294,7 +294,7 @@ namespace Flow.Launcher.ViewModel [RelayCommand] public void ReQuery() { - if (SelectedIsFromQueryResults()) + if (QueryResultsSelected()) { _ = QueryResultsAsync(isReQuery: true); } @@ -335,7 +335,7 @@ namespace Flow.Launcher.ViewModel [RelayCommand] private void LoadContextMenu() { - if (SelectedIsFromQueryResults()) + if (QueryResultsSelected()) { // When switch to ContextMenu from QueryResults, but no item being chosen, should do nothing // i.e. Shift+Enter/Ctrl+O right after Alt + Space should do nothing @@ -365,7 +365,7 @@ namespace Flow.Launcher.ViewModel private void AutocompleteQuery() { var result = SelectedResults.SelectedItem?.Result; - if (result != null && SelectedIsFromQueryResults()) // SelectedItem returns null if selection is empty. + if (result != null && QueryResultsSelected()) // SelectedItem returns null if selection is empty. { var autoCompleteText = result.Title; @@ -417,7 +417,7 @@ namespace Flow.Launcher.ViewModel }) .ConfigureAwait(false); - if (SelectedIsFromQueryResults()) + if (QueryResultsSelected()) { _userSelectedRecord.Add(result); // origin query is null when user select the context menu item directly of one item from query list @@ -496,7 +496,7 @@ namespace Flow.Launcher.ViewModel { if (_history.Items.Count > 0 && QueryText == string.Empty - && SelectedIsFromQueryResults()) + && QueryResultsSelected()) { lastHistoryIndex = 1; ReverseHistory(); @@ -516,7 +516,7 @@ namespace Flow.Launcher.ViewModel [RelayCommand] private void Esc() { - if (!SelectedIsFromQueryResults()) + if (!QueryResultsSelected()) { SelectedResults = Results; } @@ -528,7 +528,7 @@ namespace Flow.Launcher.ViewModel public void BackToQueryResults() { - if (!SelectedIsFromQueryResults()) + if (!QueryResultsSelected()) { SelectedResults = Results; } @@ -662,11 +662,11 @@ namespace Flow.Launcher.ViewModel get => _selectedResults; set { - var isReturningFromQueryResults = SelectedIsFromQueryResults(); + var isReturningFromQueryResults = QueryResultsSelected(); var isReturningFromContextMenu = ContextMenuSelected(); var isReturningFromHistory = HistorySelected(); _selectedResults = value; - if (SelectedIsFromQueryResults()) + if (QueryResultsSelected()) { Results.Visibility = Visibility.Visible; ContextMenu.Visibility = Visibility.Collapsed; @@ -871,9 +871,9 @@ namespace Flow.Launcher.ViewModel // This is not a reliable indicator of whether external preview is visible due to the // ability of manually closing/exiting the external preview program which, does not inform flow that // preview is no longer available. - public bool ExternalPreviewVisible { get; set; } = false; + public bool ExternalPreviewVisible { get; private set; } - private void ShowPreview() + private async Task ShowPreviewAsync() { var useExternalPreview = PluginManager.UseExternalPreview(); @@ -884,13 +884,15 @@ namespace Flow.Launcher.ViewModel // Internal preview may still be on when user switches to external if (InternalPreviewVisible) HideInternalPreview(); - OpenExternalPreview(path); + + _ = OpenExternalPreviewAsync(path); break; case true when !CanExternalPreviewSelectedResult(out var _): if (ExternalPreviewVisible) - CloseExternalPreview(); + await CloseExternalPreviewAsync(); + ShowInternalPreview(); break; @@ -903,7 +905,7 @@ namespace Flow.Launcher.ViewModel private void HidePreview() { if (PluginManager.UseExternalPreview()) - CloseExternalPreview(); + _ = CloseExternalPreviewAsync(); if (InternalPreviewVisible) HideInternalPreview(); @@ -918,25 +920,25 @@ namespace Flow.Launcher.ViewModel } else { - ShowPreview(); + _ = ShowPreviewAsync(); } } - private void OpenExternalPreview(string path, bool sendFailToast = true) + private async Task OpenExternalPreviewAsync(string path, bool sendFailToast = true) { - _ = PluginManager.OpenExternalPreviewAsync(path, sendFailToast).ConfigureAwait(false); + await PluginManager.OpenExternalPreviewAsync(path, sendFailToast).ConfigureAwait(false); ExternalPreviewVisible = true; } - private void CloseExternalPreview() + private async Task CloseExternalPreviewAsync() { - _ = PluginManager.CloseExternalPreviewAsync().ConfigureAwait(false); + await PluginManager.CloseExternalPreviewAsync().ConfigureAwait(false); ExternalPreviewVisible = false; } - private static void SwitchExternalPreview(string path, bool sendFailToast = true) + private static async Task SwitchExternalPreviewAsync(string path, bool sendFailToast = true) { - _ = PluginManager.SwitchExternalPreviewAsync(path,sendFailToast).ConfigureAwait(false); + await PluginManager.SwitchExternalPreviewAsync(path, sendFailToast).ConfigureAwait(false); } private void ShowInternalPreview() @@ -956,20 +958,18 @@ namespace Flow.Launcher.ViewModel { case true when PluginManager.AllowAlwaysPreview() && CanExternalPreviewSelectedResult(out var path): - OpenExternalPreview(path); + _ = OpenExternalPreviewAsync(path); break; - case true: ShowInternalPreview(); break; - case false: HidePreview(); break; } } - private void UpdatePreview() + private async Task UpdatePreviewAsync() { switch (PluginManager.UseExternalPreview()) { @@ -977,24 +977,22 @@ namespace Flow.Launcher.ViewModel when CanExternalPreviewSelectedResult(out var path): if (ExternalPreviewVisible) { - SwitchExternalPreview(path, false); + _ = SwitchExternalPreviewAsync(path, false); } else if (InternalPreviewVisible) { HideInternalPreview(); - OpenExternalPreview(path); + _ = OpenExternalPreviewAsync(path); } break; - case true when !CanExternalPreviewSelectedResult(out var _): if (ExternalPreviewVisible) { - CloseExternalPreview(); + await CloseExternalPreviewAsync(); ShowInternalPreview(); } break; - case false when InternalPreviewVisible: PreviewSelectedItem?.LoadPreviewImage(); @@ -1004,9 +1002,15 @@ namespace Flow.Launcher.ViewModel private bool CanExternalPreviewSelectedResult(out string path) { - path = PreviewSelectedItem == Results.SelectedItem ? Results.SelectedItem?.Result?.Preview.FilePath : string.Empty; + path = QueryResultsPreviewed() ? Results.SelectedItem?.Result?.Preview.FilePath : string.Empty; return !string.IsNullOrEmpty(path); } + + private bool QueryResultsPreviewed() + { + var previewed = PreviewSelectedItem == Results.SelectedItem; + return previewed; + } #endregion @@ -1014,7 +1018,7 @@ namespace Flow.Launcher.ViewModel public void Query(bool isReQuery = false) { - if (SelectedIsFromQueryResults()) + if (QueryResultsSelected()) { _ = QueryResultsAsync(isReQuery); } @@ -1382,7 +1386,7 @@ namespace Flow.Launcher.ViewModel return menu; } - internal bool SelectedIsFromQueryResults() + internal bool QueryResultsSelected() { var selected = SelectedResults == Results; return selected; @@ -1447,10 +1451,10 @@ namespace Flow.Launcher.ViewModel if (ExternalPreviewVisible) { - CloseExternalPreview(); + await CloseExternalPreviewAsync(); } - if (!SelectedIsFromQueryResults()) + if (!QueryResultsSelected()) { SelectedResults = Results; } @@ -1460,10 +1464,7 @@ namespace Flow.Launcher.ViewModel { 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 - }); + Application.Current.Dispatcher.Invoke(Application.Current.MainWindow.UpdateLayout); // Force UI update } switch (Settings.LastQueryMode)