feat: make drawer api similar to dialog.

This commit is contained in:
rabbitism
2024-02-10 01:29:06 +08:00
parent 7a9bdf231d
commit f6f216f409
11 changed files with 228 additions and 108 deletions

View File

@@ -7,11 +7,11 @@ namespace Ursa.Controls;
public static class Drawer
{
public static Task<DialogResult> Show<TView, TViewModel>(TViewModel vm, string? hostId = null, DefaultDrawerOptions? options = null)
public static void Show<TView, TViewModel>(TViewModel vm, string? hostId = null, DrawerOptions? options = null)
where TView: Control, new()
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult(default(DialogResult));
if (host is null) return;
var drawer = new DefaultDrawerControl()
{
Content = new TView(),
@@ -19,14 +19,13 @@ public static class Drawer
};
ConfigureDefaultDrawer(drawer, options);
host.AddDrawer(drawer);
return drawer.ShowAsync<DialogResult>();
}
public static Task<DialogResult> Show(Control control, object? vm, string? hostId = null,
DefaultDrawerOptions? options = null)
public static void Show(Control control, object? vm, string? hostId = null,
DrawerOptions? options = null)
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult(default(DialogResult));
if (host is null) return;
var drawer = new DefaultDrawerControl()
{
Content = control,
@@ -34,13 +33,12 @@ public static class Drawer
};
ConfigureDefaultDrawer(drawer, options);
host.AddDrawer(drawer);
return drawer.ShowAsync<DialogResult>();
}
public static Task<DialogResult> Show(object? vm, string? hostId = null, DefaultDrawerOptions? options = null)
public static void Show(object? vm, string? hostId = null, DrawerOptions? options = null)
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult(default(DialogResult));
if (host is null) return;
var view = host.GetDataTemplate(vm)?.Build(vm);
if (view is null) view = new ContentControl() { Padding = new Thickness(24) };
view.DataContext = vm;
@@ -51,14 +49,60 @@ public static class Drawer
};
ConfigureDefaultDrawer(drawer, options);
host.AddDrawer(drawer);
return drawer.ShowAsync<DialogResult>();
}
public static Task<TResult?> ShowCustom<TView, TViewModel, TResult>(TViewModel vm, string? hostId = null, CustomDrawerOptions? options = null)
public static Task<DialogResult> ShowModal<TView, TViewModel>(TViewModel vm, string? hostId = null, DrawerOptions? options = null)
where TView: Control, new()
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult(default(TResult));
if (host is null) return Task.FromResult(DialogResult.None);
var drawer = new DefaultDrawerControl()
{
Content = new TView(),
DataContext = vm,
};
ConfigureDefaultDrawer(drawer, options);
host.AddModalDrawer(drawer);
return drawer.ShowAsync<DialogResult>();
}
public static Task<DialogResult> ShowModal(Control control, object? vm, string? hostId = null,
DrawerOptions? options = null)
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult(DialogResult.None);
var drawer = new DefaultDrawerControl()
{
Content = control,
DataContext = vm,
};
ConfigureDefaultDrawer(drawer, options);
host.AddModalDrawer(drawer);
return drawer.ShowAsync<DialogResult>();
}
public static Task<DialogResult> ShowModal(object? vm, string? hostId = null, DrawerOptions? options = null)
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult(DialogResult.None);
var view = host.GetDataTemplate(vm)?.Build(vm);
if (view is null) view = new ContentControl() { Padding = new Thickness(24) };
view.DataContext = vm;
var drawer = new DefaultDrawerControl()
{
Content = view,
DataContext = vm,
};
ConfigureDefaultDrawer(drawer, options);
host.AddModalDrawer(drawer);
return drawer.ShowAsync<DialogResult>();
}
public static void ShowCustom<TView, TViewModel>(TViewModel vm, string? hostId = null, DrawerOptions? options = null)
where TView: Control, new()
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return;
var dialog = new CustomDrawerControl()
{
Content = new TView(),
@@ -66,13 +110,12 @@ public static class Drawer
};
ConfigureCustomDrawer(dialog, options);
host.AddDrawer(dialog);
return dialog.ShowAsync<TResult>();
}
public static Task<TResult?> ShowCustom<TResult>(Control control, object? vm, string? hostId = null, CustomDrawerOptions? options = null)
public static void ShowCustom(Control control, object? vm, string? hostId = null, DrawerOptions? options = null)
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult(default(TResult));
if (host is null) return;
var dialog = new CustomDrawerControl()
{
Content = control,
@@ -80,13 +123,12 @@ public static class Drawer
};
ConfigureCustomDrawer(dialog, options);
host.AddDrawer(dialog);
return dialog.ShowAsync<TResult>();
}
public static Task<TResult?> ShowCustom<TResult>(object? vm, string? hostId = null, CustomDrawerOptions? options = null)
public static void ShowCustom(object? vm, string? hostId = null, DrawerOptions? options = null)
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult(default(TResult));
if (host is null) return;
var view = host.GetDataTemplate(vm)?.Build(vm);
if (view is null) view = new ContentControl() { Padding = new Thickness(24) };
view.DataContext = vm;
@@ -97,17 +139,59 @@ public static class Drawer
};
ConfigureCustomDrawer(dialog, options);
host.AddDrawer(dialog);
return dialog.ShowAsync<TResult>();
}
private static void ConfigureCustomDrawer(CustomDrawerControl drawer, CustomDrawerOptions? options)
public static Task<TResult?> ShowCustomModal<TView, TViewModel, TResult>(TViewModel vm, string? hostId = null, DrawerOptions? options = null)
where TView: Control, new()
{
options ??= CustomDrawerOptions.Default;
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult<TResult?>(default);
var dialog = new CustomDrawerControl()
{
Content = new TView(),
DataContext = vm,
};
ConfigureCustomDrawer(dialog, options);
host.AddModalDrawer(dialog);
return dialog.ShowAsync<TResult?>();
}
public static Task<TResult?> ShowCustomModal<TResult>(Control control, object? vm, string? hostId = null, DrawerOptions? options = null)
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult<TResult?>(default);
var dialog = new CustomDrawerControl()
{
Content = control,
DataContext = vm,
};
ConfigureCustomDrawer(dialog, options);
host.AddModalDrawer(dialog);
return dialog.ShowAsync<TResult?>();
}
public static Task<TResult?> ShowCustomModal<TResult>(object? vm, string? hostId = null, DrawerOptions? options = null)
{
var host = OverlayDialogManager.GetHost(hostId);
if (host is null) return Task.FromResult<TResult?>(default);
var view = host.GetDataTemplate(vm)?.Build(vm);
if (view is null) view = new ContentControl() { Padding = new Thickness(24) };
view.DataContext = vm;
var dialog = new CustomDrawerControl()
{
Content = view,
DataContext = vm,
};
ConfigureCustomDrawer(dialog, options);
host.AddModalDrawer(dialog);
return dialog.ShowAsync<TResult?>();
}
private static void ConfigureCustomDrawer(CustomDrawerControl drawer, DrawerOptions? options)
{
options ??= DrawerOptions.Default;
drawer.Position = options.Position;
drawer.CanClickOnMaskToClose = options.CanClickOnMaskToClose;
drawer.IsCloseButtonVisible = options.IsCloseButtonVisible;
drawer.ShowMask = options.ShowMask;
drawer.IsCloseButtonVisible = options.ShowCloseButton;
drawer.CanLightDismiss = options.CanLightDismiss;
if (options.Position == Position.Left || options.Position == Position.Right)
{
@@ -121,16 +205,14 @@ public static class Drawer
}
}
private static void ConfigureDefaultDrawer(DefaultDrawerControl drawer, DefaultDrawerOptions? options)
private static void ConfigureDefaultDrawer(DefaultDrawerControl drawer, DrawerOptions? options)
{
options ??= DefaultDrawerOptions.Default;
options ??= DrawerOptions.Default;
drawer.Position = options.Position;
drawer.CanClickOnMaskToClose = options.CanClickOnMaskToClose;
drawer.IsCloseButtonVisible = options.IsCloseButtonVisible;
drawer.CanLightDismiss = options.CanLightDismiss;
drawer.Buttons = options.Buttons;
drawer.Title = options.Title;
drawer.ShowMask = options.ShowMask;
drawer.CanLightDismiss = options.CanLightDismiss;
if (options.Position == Position.Left || options.Position == Position.Right)
{
drawer.MinWidth = options.MinWidth ?? 0.0;

View File

@@ -15,9 +15,7 @@ namespace Ursa.Controls;
[TemplatePart(PART_CloseButton, typeof(Button))]
public abstract class DrawerControlBase: OverlayFeedbackElement
{
public const string PART_CloseButton = "PART_CloseButton";
internal bool CanClickOnMaskToClose { get; set; }
public const string PART_CloseButton = "PART_CloseButton";
protected internal Button? _closeButton;
@@ -50,7 +48,6 @@ public const string PART_CloseButton = "PART_CloseButton";
set => SetValue(IsCloseButtonVisibleProperty, value);
}
protected internal bool ShowMask { get; set; }
protected internal bool CanLightDismiss { get; set; }
static DrawerControlBase()

View File

@@ -1,17 +0,0 @@
using Ursa.Common;
namespace Ursa.Controls.Options;
public class CustomDrawerOptions
{
internal static CustomDrawerOptions Default => new ();
public Position Position { get; set; } = Position.Right;
public bool CanClickOnMaskToClose { get; set; } = true;
public bool CanLightDismiss { get; set; } = false;
public bool ShowMask { get; set; } = true;
public bool IsCloseButtonVisible { get; set; } = true;
public double? MinWidth { get; set; } = null;
public double? MinHeight { get; set; } = null;
public double? MaxWidth { get; set; } = null;
public double? MaxHeight { get; set; } = null;
}

View File

@@ -2,13 +2,11 @@
namespace Ursa.Controls.Options;
public class DefaultDrawerOptions
public class DrawerOptions
{
internal static DefaultDrawerOptions Default => new ();
internal static DrawerOptions Default => new ();
public Position Position { get; set; } = Position.Right;
public bool CanClickOnMaskToClose { get; set; } = true;
public bool CanLightDismiss { get; set; } = false;
public bool ShowMask { get; set; } = true;
public bool CanLightDismiss { get; set; } = true;
public bool IsCloseButtonVisible { get; set; } = true;
public double? MinWidth { get; set; } = null;
public double? MinHeight { get; set; } = null;
@@ -16,4 +14,5 @@ public class DefaultDrawerOptions
public double? MaxHeight { get; set; } = null;
public DialogButton Buttons { get; set; } = DialogButton.OKCancel;
public string? Title { get; set; }
public bool ShowCloseButton { get; set; } = true;
}