mirror of
https://fastgit.cc/github.com/sourcegit-scm/sourcegit
synced 2026-04-23 10:22:13 +08:00
refactor: move context menu creation from ViewModels to Views (PART 3)
Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user