mirror of
https://github.com/rmcrackan/Libation.git
synced 2026-03-25 02:13:27 -04:00
Make fields readonly Remove unnecessary casts Format document Remove unnecessary usings Sort usings Use file-level namespaces Order modifiers
96 lines
2.8 KiB
C#
96 lines
2.8 KiB
C#
using Avalonia.Controls;
|
|
using Avalonia.Controls.Primitives;
|
|
using Avalonia.Styling;
|
|
using LibationFileManager;
|
|
using LibationUiBase.Forms;
|
|
using System;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace LibationAvalonia.Dialogs;
|
|
|
|
public abstract class DialogWindow : Window
|
|
{
|
|
protected bool CancelOnEscape { get; set; } = true;
|
|
protected bool SaveOnEnter { get; set; } = true;
|
|
public bool SaveAndRestorePosition { get; set; }
|
|
public Control? ControlToFocusOnShow { get; set; }
|
|
protected override Type StyleKeyOverride => typeof(DialogWindow);
|
|
public DialogResult DialogResult { get; private set; } = DialogResult.None;
|
|
|
|
public DialogWindow(bool saveAndRestorePosition = true)
|
|
{
|
|
SaveAndRestorePosition = saveAndRestorePosition;
|
|
KeyDown += DialogWindow_KeyDown;
|
|
Initialized += DialogWindow_Initialized;
|
|
Opened += DialogWindow_Opened;
|
|
Loaded += DialogWindow_Loaded;
|
|
Closing += DialogWindow_Closing;
|
|
|
|
if (Design.IsDesignMode)
|
|
{
|
|
var themeVariant = Configuration.CreateMockInstance().ThemeVariant;
|
|
RequestedThemeVariant = themeVariant switch
|
|
{
|
|
Configuration.Theme.Dark => ThemeVariant.Dark,
|
|
Configuration.Theme.Light => ThemeVariant.Light,
|
|
_ => ThemeVariant.Default,
|
|
};
|
|
}
|
|
}
|
|
|
|
private void DialogWindow_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
|
{
|
|
if (!CanResize)
|
|
this.HideMinMaxBtns();
|
|
}
|
|
|
|
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
|
|
{
|
|
base.OnApplyTemplate(e);
|
|
|
|
if (MinHeight == MaxHeight && MinWidth == MaxWidth)
|
|
{
|
|
CanResize = false;
|
|
Height = MinHeight;
|
|
Width = MinWidth;
|
|
}
|
|
}
|
|
|
|
private void DialogWindow_Initialized(object? sender, EventArgs e)
|
|
{
|
|
this.WindowStartupLocation = WindowStartupLocation.CenterOwner;
|
|
if (SaveAndRestorePosition)
|
|
this.RestoreSizeAndLocation(Configuration.Instance);
|
|
}
|
|
|
|
private void DialogWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e)
|
|
{
|
|
if (SaveAndRestorePosition)
|
|
this.SaveSizeAndLocation(Configuration.Instance);
|
|
}
|
|
|
|
private void DialogWindow_Opened(object? sender, EventArgs e)
|
|
{
|
|
ControlToFocusOnShow?.Focus();
|
|
}
|
|
|
|
public void Close(DialogResult dialogResult)
|
|
{
|
|
DialogResult = dialogResult;
|
|
base.Close(dialogResult);
|
|
}
|
|
|
|
protected virtual void SaveAndClose() => Close(DialogResult.OK);
|
|
protected virtual async Task SaveAndCloseAsync() => await Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(SaveAndClose);
|
|
protected virtual void CancelAndClose() => Close(DialogResult.Cancel);
|
|
protected virtual async Task CancelAndCloseAsync() => await Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(CancelAndClose);
|
|
|
|
private async void DialogWindow_KeyDown(object? sender, Avalonia.Input.KeyEventArgs e)
|
|
{
|
|
if (CancelOnEscape && e.Key == Avalonia.Input.Key.Escape)
|
|
await CancelAndCloseAsync();
|
|
else if (SaveOnEnter && e.Key == Avalonia.Input.Key.Return)
|
|
await SaveAndCloseAsync();
|
|
}
|
|
}
|