From a5bdcab3415ac76caee4493e7444dd2bb3c2d2d6 Mon Sep 17 00:00:00 2001 From: leo Date: Thu, 20 Mar 2025 09:38:02 +0800 Subject: [PATCH] code_style: move dynamic context menu creation to view models Signed-off-by: leo --- src/ViewModels/Repository.cs | 168 ++++++++++++++++++++++++++++------ src/Views/Repository.axaml.cs | 116 +---------------------- 2 files changed, 144 insertions(+), 140 deletions(-) diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index bf283532..4f35d215 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -118,20 +118,6 @@ namespace SourceGit.ViewModels } } - public bool EnableTopoOrderInHistories - { - get => _settings.EnableTopoOrderInHistories; - set - { - if (value != _settings.EnableTopoOrderInHistories) - { - _settings.EnableTopoOrderInHistories = value; - OnPropertyChanged(); - Task.Run(RefreshCommits); - } - } - } - public bool OnlyHighlightCurrentBranchInHistories { get => _settings.OnlyHighlighCurrentBranchInHistories; @@ -145,20 +131,6 @@ namespace SourceGit.ViewModels } } - public Models.TagSortMode TagSortMode - { - get => _settings.TagSortMode; - set - { - if (value != _settings.TagSortMode) - { - _settings.TagSortMode = value; - OnPropertyChanged(); - VisibleTags = BuildVisibleTags(); - } - } - } - public string Filter { get => _filter; @@ -1470,6 +1442,97 @@ namespace SourceGit.ViewModels return menu; } + public ContextMenu CreateContextMenuForHistoriesPage() + { + var layout = new MenuItem(); + layout.Header = App.Text("Repository.HistoriesLayout"); + layout.IsEnabled = false; + + var isHorizontal = Preferences.Instance.UseTwoColumnsLayoutInHistories; + var horizontal = new MenuItem(); + horizontal.Header = App.Text("Repository.HistoriesLayout.Horizontal"); + if (isHorizontal) + horizontal.Icon = App.CreateMenuIcon("Icons.Check"); + horizontal.Click += (_, ev) => + { + Preferences.Instance.UseTwoColumnsLayoutInHistories = true; + ev.Handled = true; + }; + + var vertical = new MenuItem(); + vertical.Header = App.Text("Repository.HistoriesLayout.Vertical"); + if (!isHorizontal) + vertical.Icon = App.CreateMenuIcon("Icons.Check"); + vertical.Click += (_, ev) => + { + Preferences.Instance.UseTwoColumnsLayoutInHistories = false; + ev.Handled = true; + }; + + var order = new MenuItem(); + order.Header = App.Text("Repository.HistoriesOrder"); + order.IsEnabled = false; + + var dateOrder = new MenuItem(); + dateOrder.Header = App.Text("Repository.HistoriesOrder.ByDate"); + dateOrder.SetValue(Views.MenuItemExtension.CommandProperty, "--date-order"); + if (!_settings.EnableTopoOrderInHistories) + dateOrder.Icon = App.CreateMenuIcon("Icons.Check"); + dateOrder.Click += (_, ev) => + { + if (_settings.EnableTopoOrderInHistories) + { + _settings.EnableTopoOrderInHistories = false; + Task.Run(RefreshCommits); + } + + ev.Handled = true; + }; + + var topoOrder = new MenuItem(); + topoOrder.Header = App.Text("Repository.HistoriesOrder.Topo"); + topoOrder.SetValue(Views.MenuItemExtension.CommandProperty, "--top-order"); + if (_settings.EnableTopoOrderInHistories) + topoOrder.Icon = App.CreateMenuIcon("Icons.Check"); + topoOrder.Click += (_, ev) => + { + if (!_settings.EnableTopoOrderInHistories) + { + _settings.EnableTopoOrderInHistories = true; + Task.Run(RefreshCommits); + } + + ev.Handled = true; + }; + + var others = new MenuItem(); + others.Header = App.Text("Repository.HistoriesOptions"); + others.IsEnabled = false; + + var showTagsInGraph = new MenuItem(); + showTagsInGraph.Header = App.Text("Repository.HistoriesOptions.ShowTagsInGraph"); + if (Preferences.Instance.ShowTagsInGraph) + showTagsInGraph.Icon = App.CreateMenuIcon("Icons.Check"); + showTagsInGraph.Click += (_, ev) => + { + Preferences.Instance.ShowTagsInGraph = !Preferences.Instance.ShowTagsInGraph; + ev.Handled = true; + }; + + var menu = new ContextMenu(); + menu.Items.Add(layout); + menu.Items.Add(horizontal); + menu.Items.Add(vertical); + menu.Items.Add(new MenuItem() { Header = "-" }); + menu.Items.Add(order); + menu.Items.Add(dateOrder); + menu.Items.Add(topoOrder); + menu.Items.Add(new MenuItem() { Header = "-" }); + menu.Items.Add(others); + menu.Items.Add(showTagsInGraph); + return menu; + } + public ContextMenu CreateContextMenuForLocalBranch(Models.Branch branch) { var menu = new ContextMenu(); @@ -2065,6 +2128,55 @@ namespace SourceGit.ViewModels return menu; } + public ContextMenu CreateContextMenuForTagSortMode() + { + var mode = _settings.TagSortMode; + var changeMode = new Action((m) => + { + if (_settings.TagSortMode != m) + { + _settings.TagSortMode = m; + VisibleTags = BuildVisibleTags(); + } + }); + + var byCreatorDate = new MenuItem(); + byCreatorDate.Header = App.Text("Repository.Tags.OrderByCreatorDate"); + if (mode == Models.TagSortMode.CreatorDate) + byCreatorDate.Icon = App.CreateMenuIcon("Icons.Check"); + byCreatorDate.Click += (_, ev) => + { + changeMode(Models.TagSortMode.CreatorDate); + ev.Handled = true; + }; + + var byNameAsc = new MenuItem(); + byNameAsc.Header = App.Text("Repository.Tags.OrderByNameAsc"); + if (mode == Models.TagSortMode.NameInAscending) + byNameAsc.Icon = App.CreateMenuIcon("Icons.Check"); + byNameAsc.Click += (_, ev) => + { + changeMode(Models.TagSortMode.NameInAscending); + ev.Handled = true; + }; + + var byNameDes = new MenuItem(); + byNameDes.Header = App.Text("Repository.Tags.OrderByNameDes"); + if (mode == Models.TagSortMode.NameInDescending) + byNameDes.Icon = App.CreateMenuIcon("Icons.Check"); + byNameDes.Click += (_, ev) => + { + changeMode(Models.TagSortMode.NameInDescending); + ev.Handled = true; + }; + + var menu = new ContextMenu(); + menu.Items.Add(byCreatorDate); + menu.Items.Add(byNameAsc); + menu.Items.Add(byNameDes); + return menu; + } + public ContextMenu CreateContextMenuForSubmodule(string submodule) { var open = new MenuItem(); diff --git a/src/Views/Repository.axaml.cs b/src/Views/Repository.axaml.cs index e98adf70..d848c000 100644 --- a/src/Views/Repository.axaml.cs +++ b/src/Views/Repository.axaml.cs @@ -396,83 +396,8 @@ namespace SourceGit.Views { if (sender is Button button && DataContext is ViewModels.Repository repo) { - var layout = new MenuItem(); - layout.Header = App.Text("Repository.HistoriesLayout"); - layout.IsEnabled = false; - - var isHorizontal = ViewModels.Preferences.Instance.UseTwoColumnsLayoutInHistories; - var horizontal = new MenuItem(); - horizontal.Header = App.Text("Repository.HistoriesLayout.Horizontal"); - if (isHorizontal) - horizontal.Icon = App.CreateMenuIcon("Icons.Check"); - horizontal.Click += (_, ev) => - { - ViewModels.Preferences.Instance.UseTwoColumnsLayoutInHistories = true; - ev.Handled = true; - }; - - var vertical = new MenuItem(); - vertical.Header = App.Text("Repository.HistoriesLayout.Vertical"); - if (!isHorizontal) - vertical.Icon = App.CreateMenuIcon("Icons.Check"); - vertical.Click += (_, ev) => - { - ViewModels.Preferences.Instance.UseTwoColumnsLayoutInHistories = false; - ev.Handled = true; - }; - - var order = new MenuItem(); - order.Header = App.Text("Repository.HistoriesOrder"); - order.IsEnabled = false; - - var dateOrder = new MenuItem(); - dateOrder.Header = App.Text("Repository.HistoriesOrder.ByDate"); - dateOrder.SetValue(MenuItemExtension.CommandProperty, "--date-order"); - if (!repo.EnableTopoOrderInHistories) - dateOrder.Icon = App.CreateMenuIcon("Icons.Check"); - dateOrder.Click += (_, ev) => - { - repo.EnableTopoOrderInHistories = false; - ev.Handled = true; - }; - - var topoOrder = new MenuItem(); - topoOrder.Header = App.Text("Repository.HistoriesOrder.Topo"); - topoOrder.SetValue(MenuItemExtension.CommandProperty, "--top-order"); - if (repo.EnableTopoOrderInHistories) - topoOrder.Icon = App.CreateMenuIcon("Icons.Check"); - topoOrder.Click += (_, ev) => - { - repo.EnableTopoOrderInHistories = true; - ev.Handled = true; - }; - - var others = new MenuItem(); - others.Header = App.Text("Repository.HistoriesOptions"); - others.IsEnabled = false; - - var showTagsInGraph = new MenuItem(); - showTagsInGraph.Header = App.Text("Repository.HistoriesOptions.ShowTagsInGraph"); - if (ViewModels.Preferences.Instance.ShowTagsInGraph) - showTagsInGraph.Icon = App.CreateMenuIcon("Icons.Check"); - showTagsInGraph.Click += (_, ev) => - { - ViewModels.Preferences.Instance.ShowTagsInGraph = !ViewModels.Preferences.Instance.ShowTagsInGraph; - ev.Handled = true; - }; - - var menu = new ContextMenu(); - menu.Items.Add(layout); - menu.Items.Add(horizontal); - menu.Items.Add(vertical); - menu.Items.Add(new MenuItem() { Header = "-" }); - menu.Items.Add(order); - menu.Items.Add(dateOrder); - menu.Items.Add(topoOrder); - menu.Items.Add(new MenuItem() { Header = "-" }); - menu.Items.Add(others); - menu.Items.Add(showTagsInGraph); - menu.Open(button); + var menu = repo.CreateContextMenuForHistoriesPage(); + menu?.Open(button); } e.Handled = true; @@ -482,41 +407,8 @@ namespace SourceGit.Views { if (sender is Button button && DataContext is ViewModels.Repository repo) { - var byCreatorDate = new MenuItem(); - byCreatorDate.Header = App.Text("Repository.Tags.OrderByCreatorDate"); - if (repo.TagSortMode == Models.TagSortMode.CreatorDate) - byCreatorDate.Icon = App.CreateMenuIcon("Icons.Check"); - byCreatorDate.Click += (_, ev) => - { - repo.TagSortMode = Models.TagSortMode.CreatorDate; - ev.Handled = true; - }; - - var byNameAsc = new MenuItem(); - byNameAsc.Header = App.Text("Repository.Tags.OrderByNameAsc"); - if (repo.TagSortMode == Models.TagSortMode.NameInAscending) - byNameAsc.Icon = App.CreateMenuIcon("Icons.Check"); - byNameAsc.Click += (_, ev) => - { - repo.TagSortMode = Models.TagSortMode.NameInAscending; - ev.Handled = true; - }; - - var byNameDes = new MenuItem(); - byNameDes.Header = App.Text("Repository.Tags.OrderByNameDes"); - if (repo.TagSortMode == Models.TagSortMode.NameInDescending) - byNameDes.Icon = App.CreateMenuIcon("Icons.Check"); - byNameDes.Click += (_, ev) => - { - repo.TagSortMode = Models.TagSortMode.NameInDescending; - ev.Handled = true; - }; - - var menu = new ContextMenu(); - menu.Items.Add(byCreatorDate); - menu.Items.Add(byNameAsc); - menu.Items.Add(byNameDes); - menu.Open(button); + var menu = repo.CreateContextMenuForTagSortMode(); + menu?.Open(button); } e.Handled = true;