refactor: move context menu creation from ViewModels to Views (PART 3)

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2025-07-23 12:38:30 +08:00
parent c29e1e2490
commit f65288247b
3 changed files with 106 additions and 123 deletions

View File

@@ -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");

View File

@@ -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;

View File

@@ -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;