From 45ab678d5b83164d3a2b2201a99a84bf2b3c52de Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Fri, 21 Mar 2025 18:03:57 +0100 Subject: [PATCH] Move Execute method to base class --- MapUiTools/Avalonia/MapMenuItem.Avalonia.cs | 7 ++++-- MapUiTools/Shared/MapLayerMenuItem.cs | 26 +++++++++++++++------ MapUiTools/Shared/MapProjectionMenuItem.cs | 11 ++++----- MapUiTools/Shared/MenuButton.cs | 13 ++++------- MapUiTools/WPF/MapMenuItem.WPF.cs | 8 ++++--- MapUiTools/WinUI/MapMenuItem.WinUI.cs | 7 ++++-- 6 files changed, 43 insertions(+), 29 deletions(-) diff --git a/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs b/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs index 36956211..8466ec02 100644 --- a/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs +++ b/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs @@ -4,10 +4,11 @@ using Avalonia.Media; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace MapControl.UiTools { - public class MapMenuItem : MenuItem + public abstract class MapMenuItem : MenuItem { public MapMenuItem() { @@ -25,7 +26,9 @@ namespace MapControl.UiTools set => Header = value; } - protected IEnumerable ParentMenuItems => (Parent as ItemsControl)?.Items.OfType(); + public abstract Task Execute(MapBase map); + + protected IEnumerable ParentMenuItems => ((ItemsControl)Parent).Items.OfType(); protected override Type StyleKeyOverride => typeof(MenuItem); diff --git a/MapUiTools/Shared/MapLayerMenuItem.cs b/MapUiTools/Shared/MapLayerMenuItem.cs index 7e042a63..77c8f019 100644 --- a/MapUiTools/Shared/MapLayerMenuItem.cs +++ b/MapUiTools/Shared/MapLayerMenuItem.cs @@ -35,10 +35,8 @@ namespace MapControl.UiTools { Click += async (s, e) => { - if (DataContext is MapBase map) + if (DataContext is MapBase map && await Execute(map)) { - await Execute(map); - foreach (var item in ParentMenuItems.OfType()) { item.IsChecked = map.Children.Contains(item.MapLayer); @@ -47,19 +45,31 @@ namespace MapControl.UiTools }; } - public virtual async Task Execute(MapBase map) + public override async Task Execute(MapBase map) { - map.MapLayer = MapLayer ?? (MapLayer = await MapLayerFactory.Invoke()); - IsChecked = true; + var layer = MapLayer ?? (MapLayer = await MapLayerFactory.Invoke()); + + if (layer == null) + { + return false; + } + + map.MapLayer = layer; + return true; } } public class MapOverlayMenuItem : MapLayerMenuItem { - public override async Task Execute(MapBase map) + public override async Task Execute(MapBase map) { var layer = MapLayer ?? (MapLayer = await MapLayerFactory.Invoke()); + if (layer == null) + { + return false; + } + if (map.Children.Contains(layer)) { map.Children.Remove(layer); @@ -85,6 +95,8 @@ namespace MapControl.UiTools } } } + + return true; } } } diff --git a/MapUiTools/Shared/MapProjectionMenuItem.cs b/MapUiTools/Shared/MapProjectionMenuItem.cs index 6b94bf1b..74d46e69 100644 --- a/MapUiTools/Shared/MapProjectionMenuItem.cs +++ b/MapUiTools/Shared/MapProjectionMenuItem.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.Linq; +using System.Threading.Tasks; #if WPF using System.Windows.Markup; #elif UWP @@ -27,12 +28,10 @@ namespace MapControl.UiTools public MapProjectionMenuItem() { - Click += (s, e) => + Click += async (s, e) => { - if (DataContext is MapBase map) + if (DataContext is MapBase map && await Execute(map)) { - Execute(map); - foreach (var item in ParentMenuItems.OfType()) { item.IsChecked = map.MapProjection.CrsId == item.MapProjection; @@ -41,7 +40,7 @@ namespace MapControl.UiTools }; } - public void Execute(MapBase map) + public override Task Execute(MapBase map) { bool success = true; @@ -58,7 +57,7 @@ namespace MapControl.UiTools } } - IsChecked = success; + return Task.FromResult(success); } } } diff --git a/MapUiTools/Shared/MenuButton.cs b/MapUiTools/Shared/MenuButton.cs index 466fa2d5..fdacac77 100644 --- a/MapUiTools/Shared/MenuButton.cs +++ b/MapUiTools/Shared/MenuButton.cs @@ -33,16 +33,11 @@ namespace MapControl.UiTools { DataContext = Map; - if (Items.Count > 0) + if (Items.Count > 0 && + Items[0] is MapMenuItem item && + await item.Execute(Map)) { - if (Items[0] is MapLayerMenuItem mapLayerItem) - { - await mapLayerItem.Execute(Map); - } - else if (Items[0] is MapProjectionMenuItem mapProjectionItem) - { - mapProjectionItem.Execute(Map); - } + item.IsChecked = true; } } } diff --git a/MapUiTools/WPF/MapMenuItem.WPF.cs b/MapUiTools/WPF/MapMenuItem.WPF.cs index 9a316d94..976a3445 100644 --- a/MapUiTools/WPF/MapMenuItem.WPF.cs +++ b/MapUiTools/WPF/MapMenuItem.WPF.cs @@ -1,10 +1,11 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using System.Windows.Controls; namespace MapControl.UiTools { - public class MapMenuItem : MenuItem + public abstract class MapMenuItem : MenuItem { public string Text { @@ -12,7 +13,8 @@ namespace MapControl.UiTools set => Header = value; } - protected IEnumerable ParentMenuItems - => (Parent as ItemsControl)?.Items.OfType(); + public abstract Task Execute(MapBase map); + + protected IEnumerable ParentMenuItems => ((ItemsControl)Parent).Items.OfType(); } } diff --git a/MapUiTools/WinUI/MapMenuItem.WinUI.cs b/MapUiTools/WinUI/MapMenuItem.WinUI.cs index 3065b00e..cf910e6a 100644 --- a/MapUiTools/WinUI/MapMenuItem.WinUI.cs +++ b/MapUiTools/WinUI/MapMenuItem.WinUI.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; #if UWP using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; @@ -10,9 +11,11 @@ using Microsoft.UI.Xaml.Media; namespace MapControl.UiTools { - public class MapMenuItem : ToggleMenuFlyoutItem + public abstract class MapMenuItem : ToggleMenuFlyoutItem { + public abstract Task Execute(MapBase map); + protected IEnumerable ParentMenuItems - => (VisualTreeHelper.GetParent(this) as Panel)?.Children.OfType(); + => ((Panel)VisualTreeHelper.GetParent(this)).Children.OfType(); } }