diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index fd96c82c4..4c7af4cd4 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -323,18 +323,17 @@ namespace Flow.Launcher.Plugin
public MessageBoxResult ShowMsgBox(string messageBoxText, string caption = "", MessageBoxButton button = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None, MessageBoxResult defaultResult = MessageBoxResult.OK);
///
- /// Displays a standardised Flow message box.
- /// If there is issue when showing the message box, it will return null.
+ /// Displays a standardised Flow progress box.
///
- /// The caption of the message box.
+ /// The caption of the progress box.
///
/// Time-consuming task function, whose input is the action to report progress.
/// The input of the action is the progress value which is a double value between 0 and 100.
/// If there are any exceptions, this action will be null.
///
- /// When user closes the progress box manually by button or esc key, this action will be called.
- /// A progress box interface.
- public Task ShowProgressBoxAsync(string caption, Func, Task> reportProgressAsync, Action forceClosed = null);
+ /// When user cancel the progress, this action will be called.
+ ///
+ public Task ShowProgressBoxAsync(string caption, Func, Task> reportProgressAsync, Action cancelProgress = null);
///
/// Start the loading bar in main window
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 8374fc9fe..447eca792 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -35,31 +35,64 @@ namespace Flow.Launcher
public App()
{
// Initialize settings
- var storage = new FlowLauncherJsonStorage();
- _settings = storage.Load();
- _settings.SetStorage(storage);
- _settings.WMPInstalled = WindowsMediaPlayerHelper.IsWindowsMediaPlayerInstalled();
+ try
+ {
+ var storage = new FlowLauncherJsonStorage();
+ _settings = storage.Load();
+ _settings.SetStorage(storage);
+ _settings.WMPInstalled = WindowsMediaPlayerHelper.IsWindowsMediaPlayerInstalled();
+ }
+ catch (Exception e)
+ {
+ ShowErrorMsgBoxAndFailFast("Cannot load setting storage, please check local data directory", e);
+ return;
+ }
// Configure the dependency injection container
- var host = Host.CreateDefaultBuilder()
- .UseContentRoot(AppContext.BaseDirectory)
- .ConfigureServices(services => services
- .AddSingleton(_ => _settings)
- .AddSingleton(sp => new Updater(sp.GetRequiredService(), Launcher.Properties.Settings.Default.GithubRepo))
- .AddSingleton()
- .AddSingleton()
- .AddSingleton()
- .AddSingleton()
- .AddSingleton()
- .AddSingleton()
- .AddSingleton()
- .AddSingleton()
- ).Build();
- Ioc.Default.ConfigureServices(host.Services);
+ try
+ {
+ var host = Host.CreateDefaultBuilder()
+ .UseContentRoot(AppContext.BaseDirectory)
+ .ConfigureServices(services => services
+ .AddSingleton(_ => _settings)
+ .AddSingleton(sp => new Updater(sp.GetRequiredService(), Launcher.Properties.Settings.Default.GithubRepo))
+ .AddSingleton()
+ .AddSingleton()
+ .AddSingleton()
+ .AddSingleton()
+ .AddSingleton()
+ .AddSingleton()
+ .AddSingleton()
+ .AddSingleton()
+ ).Build();
+ Ioc.Default.ConfigureServices(host.Services);
+ }
+ catch (Exception e)
+ {
+ ShowErrorMsgBoxAndFailFast("Cannot configure dependency injection container, please open new issue in Flow.Launcher", e);
+ return;
+ }
// Initialize the public API and Settings first
- API = Ioc.Default.GetRequiredService();
- _settings.Initialize();
+ try
+ {
+ API = Ioc.Default.GetRequiredService();
+ _settings.Initialize();
+ }
+ catch (Exception e)
+ {
+ ShowErrorMsgBoxAndFailFast("Cannot initialize api and settings, please open new issue in Flow.Launcher", e);
+ return;
+ }
+ }
+
+ private static void ShowErrorMsgBoxAndFailFast(string message, Exception e)
+ {
+ // Firstly show users the message
+ MessageBox.Show(e.ToString(), message, MessageBoxButton.OK, MessageBoxImage.Error);
+
+ // Flow cannot construct its App instance, so ensure Flow crashes w/ the exception info.
+ Environment.FailFast(message, e);
}
[STAThread]
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 0baa1bef5..33d13614f 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -92,7 +92,7 @@
-
+
all
@@ -104,7 +104,7 @@
-
+
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 3d987127e..058a51ae3 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -368,6 +368,7 @@
OK
Yes
No
+ Background
Version
diff --git a/Flow.Launcher/ProgressBoxEx.xaml b/Flow.Launcher/ProgressBoxEx.xaml
index 3102cfb72..c17f8b61d 100644
--- a/Flow.Launcher/ProgressBoxEx.xaml
+++ b/Flow.Launcher/ProgressBoxEx.xaml
@@ -12,6 +12,7 @@
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
+ Topmost="True"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
@@ -35,9 +36,32 @@
+
+