Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
37058f7
Improve code quality.
Jack251970 Jan 4, 2025
562b233
Add progress box support for downloading plugin
Jack251970 Jan 4, 2025
54f02e0
Use public api for ProgressBoxEx & Add support for force close event
Jack251970 Jan 4, 2025
d0bab86
Improve code quality
Jack251970 Jan 4, 2025
f69dd0f
Improve documents
Jack251970 Jan 4, 2025
c06ba59
Add support for cancelling download
Jack251970 Jan 5, 2025
07bb16c
Improve code quality
Jack251970 Jan 5, 2025
c907c29
Fix plugin install issue
Jack251970 Jan 5, 2025
675ee9e
Add translation for progress box title
Jack251970 Jan 6, 2025
0fabe31
Improve code quality
Jack251970 Jan 6, 2025
cc0fb66
Extract duplicate cleanup code into a method
Jack251970 Jan 6, 2025
bc84910
Use static HttpClient instance for heavy load issue
Jack251970 Jan 6, 2025
aff6b1a
Perserve prgBox value when force close
Jack251970 Jan 6, 2025
8aebf95
Check ui thread when calling close function & Update documents
Jack251970 Jan 9, 2025
122887e
Await close event from non-ui thread
Jack251970 Jan 9, 2025
6220b34
Fix dulplicated close event
Jack251970 Jan 9, 2025
5016334
Avoid cancelling all pending requests on shared HttpClient instance
Jack251970 Jan 9, 2025
381e64e
Move ProgressBoxEx to main project for better development experience
Jack251970 Jan 9, 2025
d36aef5
Change ProgressBoxEx namespace
Jack251970 Jan 9, 2025
ed7265d
Remove override close event
Jack251970 Jan 10, 2025
297d191
Use function to delegate the progress task
Jack251970 Jan 10, 2025
cc921c7
Improve progress box when exception happens
Jack251970 Jan 10, 2025
df3cb58
Improve code quality
Jack251970 Jan 11, 2025
029cb38
Fix progress box action under ui thread
Jack251970 Jan 11, 2025
8eb5a4d
Improve HttpDownloadAsync function & Use it in PluginManager plugin
Jack251970 Jan 11, 2025
1bf045f
Make fileMode usage between progress and non-progress paths consistent
Jack251970 Jan 19, 2025
fc2ce73
Merge branch 'dev' into dev3
Jack251970 Jan 19, 2025
c32435f
Use api to call download function & Add message box for all download …
Jack251970 Jan 19, 2025
646bad6
Use parameter for function for readability
Jack251970 Feb 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions Flow.Launcher.Core/ProgressBoxEx.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<Window
x:Class="Flow.Launcher.Core.ProgressBoxEx"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Flow.Launcher.Core"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="MessageBoxWindow"
Width="420"
Height="Auto"
Background="{DynamicResource PopuBGColor}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="32" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
</WindowChrome.WindowChrome>
<Window.InputBindings>
<KeyBinding Key="Escape" Command="Close" />
</Window.InputBindings>
<Window.CommandBindings>
<CommandBinding Command="Close" Executed="KeyEsc_OnPress" />
</Window.CommandBindings>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition MinHeight="68" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button
Grid.Column="1"
Click="Button_Cancel"
Style="{StaticResource TitleBarCloseButtonStyle}">
<Path
Width="46"
Height="32"
Data="M 18,11 27,20 M 18,20 27,11"
Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
StrokeThickness="1">
<Path.Style>
<Style TargetType="Path">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsActive, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Value="False">
<Setter Property="Opacity" Value="0.5" />
</DataTrigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
</Button>
</Grid>
</StackPanel>
</StackPanel>
<Grid Grid.Row="1" Margin="30 0 30 24">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
x:Name="TitleTextBlock"
Grid.Row="0"
MaxWidth="400"
Margin="0 0 26 12"
VerticalAlignment="Center"
FontFamily="Segoe UI"
FontSize="20"
FontWeight="SemiBold"
TextAlignment="Left"
TextWrapping="Wrap" />
<ProgressBar
x:Name="ProgressBar"
Grid.Row="1"
Margin="0 0 26 0"
Maximum="100"
Minimum="0"
Value="0" />
</Grid>
<Border
Grid.Row="2"
Margin="0 0 0 0"
Background="{DynamicResource PopupButtonAreaBGColor}"
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
BorderThickness="0 1 0 0">
<WrapPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
<Button
x:Name="btnCancel"
MinWidth="120"
Margin="5 0 5 0"
Click="Button_Click"
Content="{DynamicResource commonCancel}" />
</WrapPanel>
</Border>
</Grid>
</Window>
105 changes: 105 additions & 0 deletions Flow.Launcher.Core/ProgressBoxEx.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
using System;
using System.Windows;
using System.Windows.Input;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Plugin;

namespace Flow.Launcher.Core
{
public partial class ProgressBoxEx : Window, IProgressBoxEx
{
private readonly Action _forceClosed;
private bool _isClosed;

private ProgressBoxEx(Action forceClosed)
{
_forceClosed = forceClosed;
InitializeComponent();
}

public static IProgressBoxEx Show(string caption, Action forceClosed = null)
{
if (!Application.Current.Dispatcher.CheckAccess())
{
return Application.Current.Dispatcher.Invoke(() => Show(caption, forceClosed));
}

try
{
var prgBox = new ProgressBoxEx(forceClosed)
{
Title = caption
};
prgBox.TitleTextBlock.Text = caption;
prgBox.Show();
return prgBox;
}
catch (Exception e)
{
Log.Error($"|ProgressBoxEx.Show|An error occurred: {e.Message}");
return null;
}
}

public void ReportProgress(double progress)
{
if (!Application.Current.Dispatcher.CheckAccess())
{
Application.Current.Dispatcher.Invoke(() => ReportProgress(progress));
return;
}

if (progress < 0)
{
ProgressBar.Value = 0;
}
else if (progress >= 100)
{
ProgressBar.Value = 100;
Close();
}
else
{
ProgressBar.Value = progress;
}
}

private new void Close()
{
if (_isClosed)
{
return;
}

base.Close();
_isClosed = true;
}

private void KeyEsc_OnPress(object sender, ExecutedRoutedEventArgs e)
{
ForceClose();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
ForceClose();
}

private void Button_Cancel(object sender, RoutedEventArgs e)
{
ForceClose();
}

private void ForceClose()
{
if (_isClosed)
{
return;
}

base.Close();
_isClosed = true;
_forceClosed?.Invoke();
}
}
}
20 changes: 20 additions & 0 deletions Flow.Launcher.Plugin/IProgressBoxEx.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace Flow.Launcher.Plugin;

/// <summary>
/// Interface for progress box
/// </summary>
public interface IProgressBoxEx
{
/// <summary>
/// Show progress box. It should be called from the main ui thread.
/// </summary>
/// <param name="progress">
/// Progress value. Should be between 0 and 100. When progress is 100, the progress box will be closed.
/// </param>
public void ReportProgress(double progress);

/// <summary>
/// Close progress box. It should be called from the main ui thread.
/// </summary>
public void Close();
}
11 changes: 10 additions & 1 deletion Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Flow.Launcher.Plugin.SharedModels;
using Flow.Launcher.Plugin.SharedModels;
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
Expand Down Expand Up @@ -316,5 +316,14 @@ public interface IPublicAPI
/// <param name="defaultResult">Specifies the default result of the message box.</param>
/// <returns>Specifies which message box button is clicked by the user.</returns>
public MessageBoxResult ShowMsgBox(string messageBoxText, string caption = "", MessageBoxButton button = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None, MessageBoxResult defaultResult = MessageBoxResult.OK);

/// <summary>
/// Displays a standardised Flow message box.
/// If there is issue when showing the message box, it will return null.
/// </summary>
/// <param name="caption">The caption of the message box.</param>
/// <param name="forceClosed">When user closes the progress box manually by button or esc key, this action will be called.</param>
/// <returns>A progress box interface.</returns>
public IProgressBoxEx ShowProgressBox(string caption, Action forceClosed = null);
}
}
2 changes: 2 additions & 0 deletions Flow.Launcher/PublicAPIInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,8 @@ public bool IsGameModeOn()
public MessageBoxResult ShowMsgBox(string messageBoxText, string caption = "", MessageBoxButton button = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None, MessageBoxResult defaultResult = MessageBoxResult.OK) =>
MessageBoxEx.Show(messageBoxText, caption, button, icon, defaultResult);

public IProgressBoxEx ShowProgressBox(string caption, Action forceClosed = null) => ProgressBoxEx.Show(caption, forceClosed);

#endregion

#region Private Methods
Expand Down
2 changes: 1 addition & 1 deletion Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
return query.FirstSearch.ToLower() switch
{
//search could be url, no need ToLower() when passed in
Settings.InstallCommand => await pluginManager.RequestInstallOrUpdate(query.SecondToEndSearch, token, query.IsReQuery),
Settings.InstallCommand => await pluginManager.RequestInstallOrUpdateAsync(query.SecondToEndSearch, token, query.IsReQuery),
Settings.UninstallCommand => pluginManager.RequestUninstall(query.SecondToEndSearch),
Settings.UpdateCommand => await pluginManager.RequestUpdateAsync(query.SecondToEndSearch, token, query.IsReQuery),
_ => pluginManager.GetDefaultHotKeys().Where(hotkey =>
Expand Down
Loading
Loading