From f65288247b864b911fc0c78db826a78312380609 Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 23 Jul 2025 12:38:30 +0800 Subject: [PATCH] refactor: move context menu creation from `ViewModels` to `Views` (PART 3) Signed-off-by: leo --- src/ViewModels/Launcher.cs | 116 ------------------------------ src/Views/Launcher.axaml.cs | 39 +++++++++- src/Views/LauncherTabBar.axaml.cs | 74 +++++++++++++++++-- 3 files changed, 106 insertions(+), 123 deletions(-) diff --git a/src/ViewModels/Launcher.cs b/src/ViewModels/Launcher.cs index b079ccf6..0febfdfc 100644 --- a/src/ViewModels/Launcher.cs +++ b/src/ViewModels/Launcher.cs @@ -2,7 +2,6 @@ using System; using System.IO; using Avalonia.Collections; -using Avalonia.Controls; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; @@ -419,121 +418,6 @@ namespace SourceGit.ViewModels _activePage?.Notifications.Add(notification); } - public ContextMenu CreateContextForWorkspace() - { - var pref = Preferences.Instance; - var menu = new ContextMenu(); - - for (var i = 0; i < pref.Workspaces.Count; i++) - { - var workspace = pref.Workspaces[i]; - - var icon = App.CreateMenuIcon(workspace.IsActive ? "Icons.Check" : "Icons.Workspace"); - icon.Fill = workspace.Brush; - - var item = new MenuItem(); - item.Header = workspace.Name; - item.Icon = icon; - item.Click += (_, e) => - { - if (!workspace.IsActive) - SwitchWorkspace(workspace); - - e.Handled = true; - }; - - menu.Items.Add(item); - } - - menu.Items.Add(new MenuItem() { Header = "-" }); - - var configure = new MenuItem(); - configure.Header = App.Text("Workspace.Configure"); - configure.Click += async (_, e) => - { - await App.ShowDialog(new ConfigureWorkspace()); - e.Handled = true; - }; - menu.Items.Add(configure); - - return menu; - } - - public ContextMenu CreateContextForPageTab(LauncherPage page) - { - if (page == null) - return null; - - var menu = new ContextMenu(); - var close = new MenuItem(); - close.Header = App.Text("PageTabBar.Tab.Close"); - close.Tag = OperatingSystem.IsMacOS() ? "⌘+W" : "Ctrl+W"; - close.Click += (_, e) => - { - CloseTab(page); - e.Handled = true; - }; - menu.Items.Add(close); - - var closeOthers = new MenuItem(); - closeOthers.Header = App.Text("PageTabBar.Tab.CloseOther"); - closeOthers.Click += (_, e) => - { - CloseOtherTabs(); - e.Handled = true; - }; - menu.Items.Add(closeOthers); - - var closeRight = new MenuItem(); - closeRight.Header = App.Text("PageTabBar.Tab.CloseRight"); - closeRight.Click += (_, e) => - { - CloseRightTabs(); - e.Handled = true; - }; - menu.Items.Add(closeRight); - - if (page.Node.IsRepository) - { - var bookmark = new MenuItem(); - bookmark.Header = App.Text("PageTabBar.Tab.Bookmark"); - bookmark.Icon = App.CreateMenuIcon("Icons.Bookmark"); - - for (int i = 0; i < Models.Bookmarks.Supported.Count; i++) - { - var icon = App.CreateMenuIcon("Icons.Bookmark"); - - if (i != 0) - icon.Fill = Models.Bookmarks.Brushes[i]; - - var dupIdx = i; - var setter = new MenuItem(); - setter.Header = icon; - setter.Click += (_, e) => - { - page.Node.Bookmark = dupIdx; - e.Handled = true; - }; - bookmark.Items.Add(setter); - } - menu.Items.Add(new MenuItem() { Header = "-" }); - menu.Items.Add(bookmark); - - var copyPath = new MenuItem(); - copyPath.Header = App.Text("PageTabBar.Tab.CopyPath"); - copyPath.Icon = App.CreateMenuIcon("Icons.Copy"); - copyPath.Click += async (_, e) => - { - await page.CopyPathAsync(); - e.Handled = true; - }; - menu.Items.Add(new MenuItem() { Header = "-" }); - menu.Items.Add(copyPath); - } - - return menu; - } - private string GetRepositoryGitDir(string repo) { var fullpath = Path.Combine(repo, ".git"); diff --git a/src/Views/Launcher.axaml.cs b/src/Views/Launcher.axaml.cs index 4c8a4f9a..a802e451 100644 --- a/src/Views/Launcher.axaml.cs +++ b/src/Views/Launcher.axaml.cs @@ -1,4 +1,4 @@ -using System; +using System; using Avalonia; using Avalonia.Controls; @@ -315,8 +315,41 @@ namespace SourceGit.Views { if (sender is Button btn && DataContext is ViewModels.Launcher launcher) { - var menu = launcher.CreateContextForWorkspace(); - menu?.Open(btn); + var pref = ViewModels.Preferences.Instance; + var menu = new ContextMenu(); + + for (var i = 0; i < pref.Workspaces.Count; i++) + { + var workspace = pref.Workspaces[i]; + + var icon = App.CreateMenuIcon(workspace.IsActive ? "Icons.Check" : "Icons.Workspace"); + icon.Fill = workspace.Brush; + + var item = new MenuItem(); + item.Header = workspace.Name; + item.Icon = icon; + item.Click += (_, e) => + { + if (!workspace.IsActive) + launcher.SwitchWorkspace(workspace); + + e.Handled = true; + }; + + menu.Items.Add(item); + } + + menu.Items.Add(new MenuItem() { Header = "-" }); + + var configure = new MenuItem(); + configure.Header = App.Text("Workspace.Configure"); + configure.Click += async (_, e) => + { + await App.ShowDialog(new ViewModels.ConfigureWorkspace()); + e.Handled = true; + }; + menu.Items.Add(configure); + menu.Open(btn); } e.Handled = true; diff --git a/src/Views/LauncherTabBar.axaml.cs b/src/Views/LauncherTabBar.axaml.cs index 64350e42..8f196adf 100644 --- a/src/Views/LauncherTabBar.axaml.cs +++ b/src/Views/LauncherTabBar.axaml.cs @@ -1,4 +1,4 @@ -using System; +using System; using Avalonia; using Avalonia.Collections; @@ -254,10 +254,76 @@ namespace SourceGit.Views private void OnTabContextRequested(object sender, ContextRequestedEventArgs e) { - if (sender is Border border && DataContext is ViewModels.Launcher vm) + if (sender is Border { DataContext: ViewModels.LauncherPage page } border && + DataContext is ViewModels.Launcher vm) { - var menu = vm.CreateContextForPageTab(border.DataContext as ViewModels.LauncherPage); - menu?.Open(border); + var menu = new ContextMenu(); + var close = new MenuItem(); + close.Header = App.Text("PageTabBar.Tab.Close"); + close.Tag = OperatingSystem.IsMacOS() ? "⌘+W" : "Ctrl+W"; + close.Click += (_, e) => + { + vm.CloseTab(page); + e.Handled = true; + }; + menu.Items.Add(close); + + var closeOthers = new MenuItem(); + closeOthers.Header = App.Text("PageTabBar.Tab.CloseOther"); + closeOthers.Click += (_, e) => + { + vm.CloseOtherTabs(); + e.Handled = true; + }; + menu.Items.Add(closeOthers); + + var closeRight = new MenuItem(); + closeRight.Header = App.Text("PageTabBar.Tab.CloseRight"); + closeRight.Click += (_, e) => + { + vm.CloseRightTabs(); + e.Handled = true; + }; + menu.Items.Add(closeRight); + + if (page.Node.IsRepository) + { + var bookmark = new MenuItem(); + bookmark.Header = App.Text("PageTabBar.Tab.Bookmark"); + bookmark.Icon = App.CreateMenuIcon("Icons.Bookmark"); + + for (int i = 0; i < Models.Bookmarks.Supported.Count; i++) + { + var icon = App.CreateMenuIcon("Icons.Bookmark"); + + if (i != 0) + icon.Fill = Models.Bookmarks.Brushes[i]; + + var dupIdx = i; + var setter = new MenuItem(); + setter.Header = icon; + setter.Click += (_, e) => + { + page.Node.Bookmark = dupIdx; + e.Handled = true; + }; + bookmark.Items.Add(setter); + } + menu.Items.Add(new MenuItem() { Header = "-" }); + menu.Items.Add(bookmark); + + var copyPath = new MenuItem(); + copyPath.Header = App.Text("PageTabBar.Tab.CopyPath"); + copyPath.Icon = App.CreateMenuIcon("Icons.Copy"); + copyPath.Click += async (_, e) => + { + await page.CopyPathAsync(); + e.Handled = true; + }; + menu.Items.Add(new MenuItem() { Header = "-" }); + menu.Items.Add(copyPath); + } + menu.Open(border); } e.Handled = true;