Skip to content

Commit f652882

Browse files
committed
refactor: move context menu creation from ViewModels to Views (PART 3)
Signed-off-by: leo <longshuang@msn.cn>
1 parent c29e1e2 commit f652882

File tree

3 files changed

+106
-123
lines changed

3 files changed

+106
-123
lines changed

src/ViewModels/Launcher.cs

Lines changed: 0 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.IO;
33

44
using Avalonia.Collections;
5-
using Avalonia.Controls;
65
using Avalonia.Threading;
76

87
using CommunityToolkit.Mvvm.ComponentModel;
@@ -419,121 +418,6 @@ public void DispatchNotification(string pageId, string message, bool isError)
419418
_activePage?.Notifications.Add(notification);
420419
}
421420

422-
public ContextMenu CreateContextForWorkspace()
423-
{
424-
var pref = Preferences.Instance;
425-
var menu = new ContextMenu();
426-
427-
for (var i = 0; i < pref.Workspaces.Count; i++)
428-
{
429-
var workspace = pref.Workspaces[i];
430-
431-
var icon = App.CreateMenuIcon(workspace.IsActive ? "Icons.Check" : "Icons.Workspace");
432-
icon.Fill = workspace.Brush;
433-
434-
var item = new MenuItem();
435-
item.Header = workspace.Name;
436-
item.Icon = icon;
437-
item.Click += (_, e) =>
438-
{
439-
if (!workspace.IsActive)
440-
SwitchWorkspace(workspace);
441-
442-
e.Handled = true;
443-
};
444-
445-
menu.Items.Add(item);
446-
}
447-
448-
menu.Items.Add(new MenuItem() { Header = "-" });
449-
450-
var configure = new MenuItem();
451-
configure.Header = App.Text("Workspace.Configure");
452-
configure.Click += async (_, e) =>
453-
{
454-
await App.ShowDialog(new ConfigureWorkspace());
455-
e.Handled = true;
456-
};
457-
menu.Items.Add(configure);
458-
459-
return menu;
460-
}
461-
462-
public ContextMenu CreateContextForPageTab(LauncherPage page)
463-
{
464-
if (page == null)
465-
return null;
466-
467-
var menu = new ContextMenu();
468-
var close = new MenuItem();
469-
close.Header = App.Text("PageTabBar.Tab.Close");
470-
close.Tag = OperatingSystem.IsMacOS() ? "⌘+W" : "Ctrl+W";
471-
close.Click += (_, e) =>
472-
{
473-
CloseTab(page);
474-
e.Handled = true;
475-
};
476-
menu.Items.Add(close);
477-
478-
var closeOthers = new MenuItem();
479-
closeOthers.Header = App.Text("PageTabBar.Tab.CloseOther");
480-
closeOthers.Click += (_, e) =>
481-
{
482-
CloseOtherTabs();
483-
e.Handled = true;
484-
};
485-
menu.Items.Add(closeOthers);
486-
487-
var closeRight = new MenuItem();
488-
closeRight.Header = App.Text("PageTabBar.Tab.CloseRight");
489-
closeRight.Click += (_, e) =>
490-
{
491-
CloseRightTabs();
492-
e.Handled = true;
493-
};
494-
menu.Items.Add(closeRight);
495-
496-
if (page.Node.IsRepository)
497-
{
498-
var bookmark = new MenuItem();
499-
bookmark.Header = App.Text("PageTabBar.Tab.Bookmark");
500-
bookmark.Icon = App.CreateMenuIcon("Icons.Bookmark");
501-
502-
for (int i = 0; i < Models.Bookmarks.Supported.Count; i++)
503-
{
504-
var icon = App.CreateMenuIcon("Icons.Bookmark");
505-
506-
if (i != 0)
507-
icon.Fill = Models.Bookmarks.Brushes[i];
508-
509-
var dupIdx = i;
510-
var setter = new MenuItem();
511-
setter.Header = icon;
512-
setter.Click += (_, e) =>
513-
{
514-
page.Node.Bookmark = dupIdx;
515-
e.Handled = true;
516-
};
517-
bookmark.Items.Add(setter);
518-
}
519-
menu.Items.Add(new MenuItem() { Header = "-" });
520-
menu.Items.Add(bookmark);
521-
522-
var copyPath = new MenuItem();
523-
copyPath.Header = App.Text("PageTabBar.Tab.CopyPath");
524-
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
525-
copyPath.Click += async (_, e) =>
526-
{
527-
await page.CopyPathAsync();
528-
e.Handled = true;
529-
};
530-
menu.Items.Add(new MenuItem() { Header = "-" });
531-
menu.Items.Add(copyPath);
532-
}
533-
534-
return menu;
535-
}
536-
537421
private string GetRepositoryGitDir(string repo)
538422
{
539423
var fullpath = Path.Combine(repo, ".git");

src/Views/Launcher.axaml.cs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22

33
using Avalonia;
44
using Avalonia.Controls;
@@ -315,8 +315,41 @@ private void OnOpenWorkspaceMenu(object sender, RoutedEventArgs e)
315315
{
316316
if (sender is Button btn && DataContext is ViewModels.Launcher launcher)
317317
{
318-
var menu = launcher.CreateContextForWorkspace();
319-
menu?.Open(btn);
318+
var pref = ViewModels.Preferences.Instance;
319+
var menu = new ContextMenu();
320+
321+
for (var i = 0; i < pref.Workspaces.Count; i++)
322+
{
323+
var workspace = pref.Workspaces[i];
324+
325+
var icon = App.CreateMenuIcon(workspace.IsActive ? "Icons.Check" : "Icons.Workspace");
326+
icon.Fill = workspace.Brush;
327+
328+
var item = new MenuItem();
329+
item.Header = workspace.Name;
330+
item.Icon = icon;
331+
item.Click += (_, e) =>
332+
{
333+
if (!workspace.IsActive)
334+
launcher.SwitchWorkspace(workspace);
335+
336+
e.Handled = true;
337+
};
338+
339+
menu.Items.Add(item);
340+
}
341+
342+
menu.Items.Add(new MenuItem() { Header = "-" });
343+
344+
var configure = new MenuItem();
345+
configure.Header = App.Text("Workspace.Configure");
346+
configure.Click += async (_, e) =>
347+
{
348+
await App.ShowDialog(new ViewModels.ConfigureWorkspace());
349+
e.Handled = true;
350+
};
351+
menu.Items.Add(configure);
352+
menu.Open(btn);
320353
}
321354

322355
e.Handled = true;

src/Views/LauncherTabBar.axaml.cs

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22

33
using Avalonia;
44
using Avalonia.Collections;
@@ -254,10 +254,76 @@ private void DropTab(object sender, DragEventArgs e)
254254

255255
private void OnTabContextRequested(object sender, ContextRequestedEventArgs e)
256256
{
257-
if (sender is Border border && DataContext is ViewModels.Launcher vm)
257+
if (sender is Border { DataContext: ViewModels.LauncherPage page } border &&
258+
DataContext is ViewModels.Launcher vm)
258259
{
259-
var menu = vm.CreateContextForPageTab(border.DataContext as ViewModels.LauncherPage);
260-
menu?.Open(border);
260+
var menu = new ContextMenu();
261+
var close = new MenuItem();
262+
close.Header = App.Text("PageTabBar.Tab.Close");
263+
close.Tag = OperatingSystem.IsMacOS() ? "⌘+W" : "Ctrl+W";
264+
close.Click += (_, e) =>
265+
{
266+
vm.CloseTab(page);
267+
e.Handled = true;
268+
};
269+
menu.Items.Add(close);
270+
271+
var closeOthers = new MenuItem();
272+
closeOthers.Header = App.Text("PageTabBar.Tab.CloseOther");
273+
closeOthers.Click += (_, e) =>
274+
{
275+
vm.CloseOtherTabs();
276+
e.Handled = true;
277+
};
278+
menu.Items.Add(closeOthers);
279+
280+
var closeRight = new MenuItem();
281+
closeRight.Header = App.Text("PageTabBar.Tab.CloseRight");
282+
closeRight.Click += (_, e) =>
283+
{
284+
vm.CloseRightTabs();
285+
e.Handled = true;
286+
};
287+
menu.Items.Add(closeRight);
288+
289+
if (page.Node.IsRepository)
290+
{
291+
var bookmark = new MenuItem();
292+
bookmark.Header = App.Text("PageTabBar.Tab.Bookmark");
293+
bookmark.Icon = App.CreateMenuIcon("Icons.Bookmark");
294+
295+
for (int i = 0; i < Models.Bookmarks.Supported.Count; i++)
296+
{
297+
var icon = App.CreateMenuIcon("Icons.Bookmark");
298+
299+
if (i != 0)
300+
icon.Fill = Models.Bookmarks.Brushes[i];
301+
302+
var dupIdx = i;
303+
var setter = new MenuItem();
304+
setter.Header = icon;
305+
setter.Click += (_, e) =>
306+
{
307+
page.Node.Bookmark = dupIdx;
308+
e.Handled = true;
309+
};
310+
bookmark.Items.Add(setter);
311+
}
312+
menu.Items.Add(new MenuItem() { Header = "-" });
313+
menu.Items.Add(bookmark);
314+
315+
var copyPath = new MenuItem();
316+
copyPath.Header = App.Text("PageTabBar.Tab.CopyPath");
317+
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
318+
copyPath.Click += async (_, e) =>
319+
{
320+
await page.CopyPathAsync();
321+
e.Handled = true;
322+
};
323+
menu.Items.Add(new MenuItem() { Header = "-" });
324+
menu.Items.Add(copyPath);
325+
}
326+
menu.Open(border);
261327
}
262328

263329
e.Handled = true;

0 commit comments

Comments
 (0)