diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs index 4cfa83382ba..b6ff01ad944 100644 --- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs +++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs @@ -115,7 +115,7 @@ private List ParseResults(JsonRPCQueryResponseModel queryResponseModel) foreach (var result in queryResponseModel.Result) { - result.Action = c => + result.AsyncAction = async c => { UpdateSettings(result.SettingsChange); @@ -133,15 +133,15 @@ private List ParseResults(JsonRPCQueryResponseModel queryResponseModel) } else { - var actionResponse = Request(result.JsonRPCAction); + var actionResponse = await RequestAsync(result.JsonRPCAction); - if (string.IsNullOrEmpty(actionResponse)) + if (actionResponse.Length == 0) { return !result.JsonRPCAction.DontHideAfterAction; } - var jsonRpcRequestModel = - JsonSerializer.Deserialize(actionResponse, options); + var jsonRpcRequestModel = await + JsonSerializer.DeserializeAsync(actionResponse, options); if (jsonRpcRequestModel?.Method?.StartsWith("Flow.Launcher.") ?? false) { @@ -166,19 +166,20 @@ private List ParseResults(JsonRPCQueryResponseModel queryResponseModel) private void ExecuteFlowLauncherAPI(string method, object[] parameters) { var parametersTypeArray = parameters.Select(param => param.GetType()).ToArray(); - MethodInfo methodInfo = PluginManager.API.GetType().GetMethod(method, parametersTypeArray); - if (methodInfo != null) + var methodInfo = typeof(IPublicAPI).GetMethod(method, parametersTypeArray); + if (methodInfo == null) + { + return; + } + try + { + methodInfo.Invoke(PluginManager.API, parameters); + } + catch (Exception) { - try - { - methodInfo.Invoke(PluginManager.API, parameters); - } - catch (Exception) - { #if (DEBUG) - throw; + throw; #endif - } } } @@ -365,8 +366,7 @@ public Control CreateSettingPanel() var settingWindow = new UserControl(); var mainPanel = new StackPanel { - Margin = settingPanelMargin, - Orientation = Orientation.Vertical + Margin = settingPanelMargin, Orientation = Orientation.Vertical }; settingWindow.Content = mainPanel; @@ -374,8 +374,7 @@ public Control CreateSettingPanel() { var panel = new StackPanel { - Orientation = Orientation.Horizontal, - Margin = settingControlMargin + Orientation = Orientation.Horizontal, Margin = settingControlMargin }; var name = new TextBlock() { diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index 4a5eb39afc0..f80b6c02846 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using System.Windows.Media; namespace Flow.Launcher.Plugin @@ -85,6 +86,14 @@ public string IcoPath /// public Func Action { get; set; } + /// + /// Delegate. An Async action to take in the form of a function call when the result has been selected + /// + /// true to hide flowlauncher after select result + /// + /// + public Func> AsyncAction { get; set; } + /// /// Priority of the current result /// default: 0 @@ -169,5 +178,10 @@ public override string ToString() /// Show message as ToolTip on result SubTitle hover over /// public string SubTitleToolTip { get; set; } + + public ValueTask ExecuteAsync(ActionContext context) + { + return AsyncAction?.Invoke(context) ?? ValueTask.FromResult(Action?.Invoke(context) ?? false); + } } } \ No newline at end of file diff --git a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs index 383650619ce..5ca97d93a73 100644 --- a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs +++ b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs @@ -48,7 +48,7 @@ public async Task GivenVariousJsonText_WhenVariousNamingCase_ThenExpectNotNullRe foreach (var result in results) { Assert.IsNotNull(result); - Assert.IsNotNull(result.Action); + Assert.IsNotNull(result.AsyncAction); Assert.IsNotNull(result.Title); } @@ -92,7 +92,7 @@ public async Task GivenModel_WhenSerializeWithDifferentNamingPolicy_ThenExpectSa Assert.AreEqual(result1, referenceResult); Assert.IsNotNull(result1); - Assert.IsNotNull(result1.Action); + Assert.IsNotNull(result1.AsyncAction); } } diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml index b96abca9550..2a7f9c49440 100644 --- a/Flow.Launcher/ResultListBox.xaml +++ b/Flow.Launcher/ResultListBox.xaml @@ -86,7 +86,7 @@ Height="32" Margin="0,0,0,0" HorizontalAlignment="Center" - Source="{Binding Image}" + Source="{Binding Image, TargetNullValue={x:Null}}" Stretch="Uniform" Visibility="{Binding ShowIcon}" /> diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 0fe3bdf8052..2b3d5037722 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -194,37 +194,38 @@ private void InitializeKeyCommands() PluginManager.API.OpenUrl("https://github.com/Flow-Launcher/Flow.Launcher/wiki/Flow-Launcher/"); }); OpenSettingCommand = new RelayCommand(_ => { App.API.OpenSettingDialog(); }); - OpenResultCommand = new RelayCommand(index => + OpenResultCommand = new RelayCommand(async index => { var results = SelectedResults; if (index != null) { - results.SelectedIndex = int.Parse(index.ToString()); + results.SelectedIndex = int.Parse(index.ToString()!); } var result = results.SelectedItem?.Result; - if (result != null) // SelectedItem returns null if selection is empty. + if (result == null) { - bool hideWindow = result.Action != null && result.Action(new ActionContext - { - SpecialKeyState = GlobalHotkey.CheckModifiers() - }); + return; + } + var hideWindow = await result.ExecuteAsync(new ActionContext + { + SpecialKeyState = GlobalHotkey.CheckModifiers() + }).ConfigureAwait(false); - if (hideWindow) - { - Hide(); - } + if (hideWindow) + { + Hide(); + } - if (SelectedIsFromQueryResults()) - { - _userSelectedRecord.Add(result); - _history.Add(result.OriginQuery.RawQuery); - } - else - { - SelectedResults = Results; - } + if (SelectedIsFromQueryResults()) + { + _userSelectedRecord.Add(result); + _history.Add(result.OriginQuery.RawQuery); + } + else + { + SelectedResults = Results; } });