Browse Source

Root order

Krzysztof Krysiński 1 year ago
parent
commit
3e31a53e84

+ 8 - 4
src/PixiEditor.AvaloniaUI/ViewModels/Document/DocumentManagerViewModel.cs

@@ -58,7 +58,8 @@ internal class DocumentManagerViewModel : SubViewModel<ViewModelMain>, IDocument
     [Evaluator.CanExecute("PixiEditor.HasDocument", nameof(ActiveDocument))]
     public bool DocumentNotNull() => ActiveDocument != null;
 
-    [Command.Basic("PixiEditor.Document.ClipCanvas", "CLIP_CANVAS", "CLIP_CANVAS", CanExecute = "PixiEditor.HasDocument", IconPath = "crop.png")]
+    [Command.Basic("PixiEditor.Document.ClipCanvas", "CLIP_CANVAS", "CLIP_CANVAS", CanExecute = "PixiEditor.HasDocument", IconPath = "crop.png",
+        MenuItemPath = "IMAGE/CLIP_CANVAS", MenuItemOrder = 2)]
     public void ClipCanvas() => ActiveDocument?.Operations.ClipCanvas();
 
     [Command.Basic("PixiEditor.Document.FlipImageHorizontal", FlipType.Horizontal, "FLIP_IMG_HORIZONTALLY", "FLIP_IMG_HORIZONTALLY", CanExecute = "PixiEditor.HasDocument")]
@@ -146,8 +147,10 @@ internal class DocumentManagerViewModel : SubViewModel<ViewModelMain>, IDocument
     }
 
 
-    [Command.Basic("PixiEditor.Document.ResizeDocument", false, "RESIZE_DOCUMENT", "RESIZE_DOCUMENT", CanExecute = "PixiEditor.HasDocument", Key = Key.I, Modifiers = KeyModifiers.Control | KeyModifiers.Shift)]
-    [Command.Basic("PixiEditor.Document.ResizeCanvas", true, "RESIZE_CANVAS", "RESIZE_CANVAS", CanExecute = "PixiEditor.HasDocument", Key = Key.C, Modifiers = KeyModifiers.Control | KeyModifiers.Shift)]
+    [Command.Basic("PixiEditor.Document.ResizeDocument", false, "RESIZE_DOCUMENT", "RESIZE_DOCUMENT", CanExecute = "PixiEditor.HasDocument", Key = Key.I, Modifiers = KeyModifiers.Control | KeyModifiers.Shift,
+        MenuItemPath = "IMAGE/RESIZE_IMAGE", MenuItemOrder = 0)]
+    [Command.Basic("PixiEditor.Document.ResizeCanvas", true, "RESIZE_CANVAS", "RESIZE_CANVAS", CanExecute = "PixiEditor.HasDocument", Key = Key.C, Modifiers = KeyModifiers.Control | KeyModifiers.Shift,
+        MenuItemPath = "IMAGE/RESIZE_CANVAS", MenuItemOrder = 1)]
     public async Task OpenResizePopup(bool canvas)
     {
         DocumentViewModel? doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
@@ -172,7 +175,8 @@ internal class DocumentManagerViewModel : SubViewModel<ViewModelMain>, IDocument
         }
     }
 
-    [Command.Basic("PixiEditor.Document.CenterContent", "CENTER_CONTENT", "CENTER_CONTENT", CanExecute = "PixiEditor.HasDocument")]
+    [Command.Basic("PixiEditor.Document.CenterContent", "CENTER_CONTENT", "CENTER_CONTENT", CanExecute = "PixiEditor.HasDocument",
+        MenuItemPath = "IMAGE/CLIP_CANVAS", MenuItemOrder = 3)]
     public void CenterContent()
     {
         if(ActiveDocument?.SelectedStructureMember == null)

+ 26 - 1
src/PixiEditor.AvaloniaUI/ViewModels/Menu/MenuBarViewModel.cs

@@ -17,10 +17,24 @@ internal class MenuBarViewModel : PixiObservableObject
 
     private Dictionary<string, MenuTreeItem> menuItems = new();
 
+    private readonly Dictionary<string, int> menuOrderMultiplier = new Dictionary<string, int>()
+    {
+        { "FILE", 100 },
+        { "EDIT", 200 },
+        { "SELECT", 300 },
+        { "IMAGE", 400 },
+        { "VIEW", 500 },
+        { "HELP", 600 },
+        { "DEBUG", 1000 },
+    };
+
     public void Init(IServiceProvider serviceProvider, CommandController controller)
     {
         MenuItemBuilder[] builders = serviceProvider.GetServices<MenuItemBuilder>().ToArray();
-        foreach (var command in controller.Commands.OrderBy(x => x.MenuItemOrder).ThenBy(x => x.InternalName))
+
+        var commandsWithMenuItems = controller.Commands.Where(x => !string.IsNullOrEmpty(x.MenuItemPath) && IsValid(x.MenuItemPath)).ToArray();
+
+        foreach (var command in commandsWithMenuItems.OrderBy(GetCategoryMultiplier).ThenBy(x => x.MenuItemOrder).ThenBy(x => x.InternalName))
         {
            if(string.IsNullOrEmpty(command.MenuItemPath)) continue;
 
@@ -30,6 +44,17 @@ internal class MenuBarViewModel : PixiObservableObject
         BuildMenu(builders);
     }
 
+    private int GetCategoryMultiplier(Command command)
+    {
+        string category = command.MenuItemPath!.Split('/')[0];
+        return menuOrderMultiplier.GetValueOrDefault(category, 9999);
+    }
+
+    private bool IsValid(string argMenuItemPath)
+    {
+        return argMenuItemPath.Split('/').Length > 1;
+    }
+
     private void BuildMenu(MenuItemBuilder[] builders)
     {
         BuildSimpleItems(menuItems);