From f562e159e86cde0ed74ca60ee3d355418cb4a72a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 18 Jul 2025 15:26:07 +0800
Subject: [PATCH] Add update dialog
---
Flow.Launcher/App.xaml.cs | 18 ++-
Flow.Launcher/Languages/en.xaml | 5 +
Flow.Launcher/PluginUpdateWindow.xaml | 105 ++++++++++++++++++
Flow.Launcher/PluginUpdateWindow.xaml.cs | 85 ++++++++++++++
.../SettingsPanePluginStoreViewModel.cs | 10 +-
5 files changed, 220 insertions(+), 3 deletions(-)
create mode 100644 Flow.Launcher/PluginUpdateWindow.xaml
create mode 100644 Flow.Launcher/PluginUpdateWindow.xaml.cs
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 7e3915b2b..1bef1166e 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -298,11 +298,25 @@ namespace Flow.Launcher
{
// check plugin updates every 5 hour
var timer = new PeriodicTimer(TimeSpan.FromHours(5));
- await PluginInstaller.CheckForPluginUpdatesAsync();
+ await PluginInstaller.CheckForPluginUpdatesAsync((plugins) =>
+ {
+ Current.Dispatcher.Invoke(() =>
+ {
+ var pluginUpdateWindow = new PluginUpdateWindow(plugins);
+ pluginUpdateWindow.ShowDialog();
+ });
+ });
while (await timer.WaitForNextTickAsync())
// check updates on startup
- await PluginInstaller.CheckForPluginUpdatesAsync();
+ await PluginInstaller.CheckForPluginUpdatesAsync((plugins) =>
+ {
+ Current.Dispatcher.Invoke(() =>
+ {
+ var pluginUpdateWindow = new PluginUpdateWindow(plugins);
+ pluginUpdateWindow.ShowDialog();
+ });
+ });
}
});
}
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index a7328f1b8..ac58fdc5f 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -564,6 +564,11 @@
Update files
Update description
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
Skip
Welcome to Flow Launcher
diff --git a/Flow.Launcher/PluginUpdateWindow.xaml b/Flow.Launcher/PluginUpdateWindow.xaml
new file mode 100644
index 000000000..eb7e2219d
--- /dev/null
+++ b/Flow.Launcher/PluginUpdateWindow.xaml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/PluginUpdateWindow.xaml.cs b/Flow.Launcher/PluginUpdateWindow.xaml.cs
new file mode 100644
index 000000000..20f033425
--- /dev/null
+++ b/Flow.Launcher/PluginUpdateWindow.xaml.cs
@@ -0,0 +1,85 @@
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Infrastructure.UserSettings;
+
+namespace Flow.Launcher
+{
+ public partial class PluginUpdateWindow : Window
+ {
+ public List Plugins { get; set; } = new();
+ public bool Restart { get; set; }
+
+ private readonly Settings _settings = Ioc.Default.GetRequiredService();
+
+ public PluginUpdateWindow(List allPlugins)
+ {
+ Restart = _settings.AutoRestartAfterChanging;
+ InitializeComponent();
+ foreach (var plugin in allPlugins)
+ {
+ var checkBox = new CheckBox
+ {
+ Content = string.Format(App.API.GetTranslation("updatePluginCheckboxContent"), plugin.Name, plugin.CurrentVersion, plugin.NewVersion),
+ IsChecked = true,
+ Margin = new Thickness(0, 5, 0, 5),
+ Tag = plugin,
+ VerticalAlignment = VerticalAlignment.Center,
+ };
+ checkBox.Checked += CheckBox_Checked;
+ checkBox.Unchecked += CheckBox_Unchecked;
+ UpdatePluginStackPanel.Children.Add(checkBox);
+ Plugins.Add(plugin);
+ }
+ }
+
+ private void CheckBox_Checked(object sender, RoutedEventArgs e)
+ {
+ if (sender is not CheckBox cb) return;
+ if (cb.Tag is not PluginUpdateInfo plugin) return;
+ if (!Plugins.Contains(plugin))
+ {
+ Plugins.Add(plugin);
+ }
+ }
+
+ private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (sender is not CheckBox cb) return;
+ if (cb.Tag is not PluginUpdateInfo plugin) return;
+ if (Plugins.Contains(plugin))
+ {
+ Plugins.Remove(plugin);
+ }
+ }
+
+ private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
+ {
+ DialogResult = false;
+ Close();
+ }
+
+ private void btnUpdate_OnClick(object sender, RoutedEventArgs e)
+ {
+ if (Plugins.Count == 0)
+ {
+ App.API.ShowMsgBox(App.API.GetTranslation("updatePluginNoSelected"));
+ return;
+ }
+
+ _ = PluginInstaller.UpdateAllPluginsAsync(Plugins, Restart);
+
+ DialogResult = true;
+ Close();
+ }
+
+ private void cmdEsc_OnPress(object sender, ExecutedRoutedEventArgs e)
+ {
+ DialogResult = false;
+ Close();
+ }
+ }
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
index 96cd44072..140a1765b 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using System.Windows;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Plugin;
@@ -112,7 +113,14 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel
[RelayCommand]
private async Task CheckPluginUpdatesAsync()
{
- await PluginInstaller.CheckForPluginUpdatesAsync(silentUpdate: false);
+ await PluginInstaller.CheckForPluginUpdatesAsync((plugins) =>
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var pluginUpdateWindow = new PluginUpdateWindow(plugins);
+ pluginUpdateWindow.ShowDialog();
+ });
+ }, silentUpdate: false);
}
private static string GetFileFromDialog(string title, string filter = "")