Skip to content

Commit

Permalink
Add wait dialogs and improve performance
Browse files Browse the repository at this point in the history
  • Loading branch information
FalconNL93 committed Dec 5, 2021
1 parent 8b2018c commit 76f71a3
Show file tree
Hide file tree
Showing 8 changed files with 196 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public static async void Execute(DistributionClass distribution, string file)

await Task.WhenAll(exportTask, fireImportEvent);

ToolboxClass.OnRefreshRequired();
DistributionExportFinished?.Invoke(typeof(ExportDistributionCommand), args);
ToolboxClass.OnRefreshRequired();
}

private static async Task<CommandClass> ExportAsync(DistributionClass distribution, string file)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ public static async void Execute(DistributionClass distribution)
{
var openShell = await CommandClass.StartShellAsync(distribution);

ToolboxClass.OnRefreshRequired();
if (openShell.ExitCode != 0) return;
if (distribution.IsInstalled) return;
ToolboxClass.OnRefreshRequired();
if (ToolboxClass.DistributionByName(distribution.Name) != null) return;

var installTries = 0;
while (!ToolboxClass.DistributionByName(distribution.Name).IsInstalled)
Expand Down
6 changes: 3 additions & 3 deletions WslToolbox.Core/WslToolbox.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

<PropertyGroup>
<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
<PackageVersion>0.4.0</PackageVersion>
<AssemblyVersion>0.4.0</AssemblyVersion>
<FileVersion>0.4.0</FileVersion>
<PackageVersion>0.5.0</PackageVersion>
<AssemblyVersion>0.5.0</AssemblyVersion>
<FileVersion>0.5.0</FileVersion>
<IsPackable>false</IsPackable>
</PropertyGroup>

Expand Down
39 changes: 39 additions & 0 deletions WslToolbox.Gui/Commands/Distribution/ExportDistributionCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,49 @@ namespace WslToolbox.Gui.Commands.Distribution
public class ExportDistributionCommand : GenericDistributionCommand
{
private readonly MainViewModel _model;
private readonly ContentDialog _waitDialog;
private readonly WaitHelper _waitHelper;

public ExportDistributionCommand(DistributionClass distributionClass, MainViewModel model) : base(
distributionClass)
{
RegisterEventHandlers();
_model = model;
IsExecutableDefault = _ => distributionClass != null;
IsExecutable = IsExecutableDefault;
_waitHelper = new WaitHelper
{
ProgressRingActive = true
};

_waitDialog = _waitHelper.WaitDialog();
}

private void RegisterEventHandlers()
{
Core.Commands.Distribution.ExportDistributionCommand.DistributionExportStarted += ExportStarted;
Core.Commands.Distribution.ExportDistributionCommand.DistributionExportFinished += ExportFinished;
}

private void ExportStarted(object? sender, EventArgs e)
{
_waitHelper.CloseButtonText = "Hide";
_waitDialog.IsPrimaryButtonEnabled = false;
_waitDialog.IsSecondaryButtonEnabled = false;
_waitHelper.DialogTitle = "Exporting";
_waitHelper.DialogMessage = "Exporting, please wait...";

if (!_waitDialog.IsVisible)
_waitDialog.ShowAsync();
}

private void ExportFinished(object? sender, EventArgs e)
{
if (_waitDialog.IsVisible)
_waitDialog.Hide();
}


public override async void Execute(object parameter)
{
if (!_model.Config.Configuration.HideExportWarning)
Expand All @@ -34,6 +68,11 @@ public override async void Execute(object parameter)
try
{
IsExecutable = _ => false;
_waitDialog.CloseButtonText = null;
_waitHelper.DialogTitle = "Exporting";
_waitHelper.DialogMessage = "Initialising...";
_waitDialog.ShowAsync();
ToolboxClass.OnRefreshRequired(2000);
Core.Commands.Distribution.ExportDistributionCommand.Execute((DistributionClass) parameter, fileName);
}
catch (Exception ex)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,8 @@ public ImportDistributionCommand(DistributionClass distributionClass, MainViewMo
RegisterEventHandlers();
_waitHelper = new WaitHelper
{
DialogTitle = "Importing",
DialogMessage = "Please wait while importing the distribution..."
ProgressRingActive = true
};

_waitDialog = _waitHelper.WaitDialog();
}

Expand All @@ -40,6 +38,8 @@ private void ImportStarted(object? sender, EventArgs e)
{
_waitDialog.IsPrimaryButtonEnabled = false;
_waitDialog.IsSecondaryButtonEnabled = false;
_waitHelper.DialogTitle = "Importing";
_waitHelper.DialogMessage = "Distribution is being imported, please wait...";
_waitDialog.CloseButtonText = "Hide";

if (!_waitDialog.IsVisible)
Expand Down Expand Up @@ -69,6 +69,8 @@ public override async void Execute(object parameter)
if (result != ContentDialogResult.Primary) return;
IsExecutable = _ => false;
_waitDialog.CloseButtonText = null;
_waitHelper.DialogTitle = "Importing";
_waitHelper.DialogMessage = "Initialising...";
_waitDialog.ShowAsync();
ToolboxClass.OnRefreshRequired(2000);
Core.Commands.Distribution.ImportDistributionCommand.Execute(
Expand Down
7 changes: 5 additions & 2 deletions WslToolbox.Gui/Helpers/BindHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,15 @@ public static void AddBindings(IEnumerable<BindElement> bindElements)
}
}

public static Binding BindingObject(string path, object source, BindingMode mode = BindingMode.Default)
public static Binding BindingObject(string path, object source, BindingMode mode = BindingMode.Default,
IValueConverter converter = null, UpdateSourceTrigger trigger = UpdateSourceTrigger.Default)
{
return new Binding(path)
{
Mode = mode,
Source = source
Source = source,
Converter = converter,
UpdateSourceTrigger = trigger
};
}
}
Expand Down
162 changes: 138 additions & 24 deletions WslToolbox.Gui/Helpers/Ui/WaitHelper.cs
Original file line number Diff line number Diff line change
@@ -1,45 +1,159 @@
using System.Windows;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using ModernWpf.Controls;
using WslToolbox.Gui.Converters;

namespace WslToolbox.Gui.Helpers.Ui
{
public class WaitHelper
public class WaitHelper : INotifyPropertyChanged
{
public string DialogTitle { get; set; } = null;
public string DialogMessage { get; set; } = null;
public string PrimaryButtonText { get; set; } = null;
public string SecondaryButtonText { get; set; } = null;
public string CloseButtonText { get; set; } = null;
public Window Owner { get; set; } = null;
private string _closeButtonText;
private string _dialogMessage;
private string _dialogTitle;
private Window _owner;
private string _primaryButtonText;
private bool _progressRingActive;
private string _secondaryButtonText;

public BoolToValueConverter Aa = new()
{
TrueValue = "Ja",
FalseValue = "Nee"
};

public string DialogTitle
{
get => _dialogTitle;
set
{
if (_dialogTitle == value) return;
_dialogTitle = value;
OnPropertyChanged(nameof(DialogTitle));
}
}

public string DialogMessage
{
get => _dialogMessage;
set
{
if (_dialogMessage == value) return;
_dialogMessage = value;
OnPropertyChanged(nameof(DialogMessage));
}
}

public string PrimaryButtonText
{
get => _primaryButtonText;
set
{
if (_primaryButtonText == value) return;
_primaryButtonText = value;
OnPropertyChanged(nameof(PrimaryButtonText));
}
}

public string SecondaryButtonText
{
get => _secondaryButtonText;
set
{
if (_secondaryButtonText == value) return;
_secondaryButtonText = value;
OnPropertyChanged(nameof(SecondaryButtonText));
}
}

public string CloseButtonText
{
get => _closeButtonText;
set
{
if (_closeButtonText == value) return;
_closeButtonText = value;
OnPropertyChanged(nameof(CloseButtonText));
}
}

public Window Owner
{
get => _owner;
set
{
if (_owner == value) return;
_owner = value;
OnPropertyChanged(nameof(Owner));
}
}

public bool ProgressRingActive
{
get => _progressRingActive;
set
{
if (_progressRingActive == value) return;
_progressRingActive = value;
OnPropertyChanged(nameof(ProgressRingActive));
}
}

public event PropertyChangedEventHandler PropertyChanged;

public ContentDialog WaitDialog()
{
var dialogContent = new StackPanel
{
Children =
{
new TextBlock
{
Text = DialogMessage,
TextTrimming = TextTrimming.WordEllipsis,
TextWrapping = TextWrapping.Wrap
}
}
var textBlock = new TextBlock
{
TextTrimming = TextTrimming.WordEllipsis,
TextWrapping = TextWrapping.Wrap
};

textBlock.SetBinding(TextBlock.TextProperty,
BindHelper.BindingObject(nameof(DialogMessage), this));

var progressRing = new ProgressRing
{
Margin = new Thickness(0, 15, 0, 0),
Height = 40,
Width = 40
};

progressRing.SetBinding(ProgressRing.IsActiveProperty,
BindHelper.BindingObject(nameof(ProgressRingActive), this));

StackPanel itemStack = new();
itemStack.Children.Add(textBlock);
itemStack.Children.Add(progressRing);

var dialog = new ContentDialog
{
Title = DialogTitle,
PrimaryButtonText = PrimaryButtonText,
PrimaryButtonStyle = ResourceHelper.FindResource("AccentButtonStyle"),
SecondaryButtonText = SecondaryButtonText,
CloseButtonText = CloseButtonText,
Content = new ScrollViewer {Content = dialogContent},
Content = new ScrollViewer {Content = itemStack},
Owner = Owner
};

dialog.SetBinding(ContentDialog.TitleProperty,
BindHelper.BindingObject(nameof(DialogTitle), this));

dialog.SetBinding(ContentDialog.PrimaryButtonTextProperty,
BindHelper.BindingObject(nameof(PrimaryButtonText), this));

dialog.SetBinding(ContentDialog.SecondaryButtonTextProperty,
BindHelper.BindingObject(nameof(SecondaryButtonText), this));

dialog.SetBinding(ContentDialog.CloseButtonTextProperty,
BindHelper.BindingObject(nameof(CloseButtonText), this));

return dialog;
}

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
Debug.WriteLine($"{propertyName} changed to {CloseButtonText}");
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
6 changes: 3 additions & 3 deletions WslToolbox.Gui/WslToolbox.Gui.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
<Company>FalconNL93</Company>
<MinimumPlatformVersion>7.0</MinimumPlatformVersion>
<ApplicationIcon>Resources\Images\AppIcon.ico</ApplicationIcon>
<AssemblyVersion>0.4.0</AssemblyVersion>
<FileVersion>0.4.0</FileVersion>
<AssemblyVersion>0.5.0</AssemblyVersion>
<FileVersion>0.5.0</FileVersion>
<Configurations>Debug;Release</Configurations>
<PackageVersion>0.4.0</PackageVersion>
<PackageVersion>0.5.0</PackageVersion>
<IsPackable>false</IsPackable>
</PropertyGroup>

Expand Down

0 comments on commit 76f71a3

Please # to comment.