From 93a5d7baea923483fe10fbae8414e59a934f7c11 Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 6 May 2025 15:51:57 +0800 Subject: [PATCH] feature: supports to visit remote repository in web browser (#1265) - combine `Open in File Manager`, `Open in Terminal` and `Open with external editor` into one dropdown menu - add `Visit $REMOTE in Browser` Signed-off-by: leo --- src/Resources/Locales/en_US.axaml | 1 + src/Resources/Locales/zh_CN.axaml | 1 + src/Resources/Locales/zh_TW.axaml | 1 + src/ViewModels/Repository.cs | 96 ++++++++++++++++++++++--------- src/Views/RepositoryToolbar.axaml | 10 +--- 5 files changed, 73 insertions(+), 36 deletions(-) diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index 640cb8f3..0ebeeeb0 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -626,6 +626,7 @@ Open in Terminal Use relative time in histories View Logs + Visit '{0}' in Browser WORKTREES ADD WORKTREE PRUNE diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index 5db542b1..6bf7f5d1 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -630,6 +630,7 @@ 在终端中打开 在提交列表中使用相对时间 查看命令日志 + 访问远程仓库 '{0}' 工作树列表 新增工作树 清理 diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml index 6fd380ec..9ed35c8a 100644 --- a/src/Resources/Locales/zh_TW.axaml +++ b/src/Resources/Locales/zh_TW.axaml @@ -630,6 +630,7 @@ 在終端機中開啟 在提交列表中使用相對時間 檢視 Git 指令記錄 + 檢視遠端存放庫 '{0}' 工作區列表 新增工作區 清理 diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 5e8bd40d..bf084fb0 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -583,45 +583,87 @@ namespace SourceGit.ViewModels Task.Run(RefreshStashes); } - public void OpenInFileManager() - { - Native.OS.OpenInFileManager(_fullpath); - } - - public void OpenInTerminal() - { - Native.OS.OpenTerminal(_fullpath); - } - public ContextMenu CreateContextMenuForExternalTools() { - var tools = Native.OS.ExternalTools; - if (tools.Count == 0) - { - App.RaiseException(_fullpath, "No available external editors found!"); - return null; - } - var menu = new ContextMenu(); menu.Placement = PlacementMode.BottomEdgeAlignedLeft; + RenderOptions.SetBitmapInterpolationMode(menu, BitmapInterpolationMode.HighQuality); + RenderOptions.SetEdgeMode(menu, EdgeMode.Antialias); + RenderOptions.SetTextRenderingMode(menu, TextRenderingMode.Antialias); - foreach (var tool in tools) + var explore = new MenuItem(); + explore.Header = App.Text("Repository.Explore"); + explore.Icon = App.CreateMenuIcon("Icons.Explore"); + explore.Click += (_, e) => { - var dupTool = tool; + Native.OS.OpenInFileManager(_fullpath); + e.Handled = true; + }; - var item = new MenuItem(); - item.Header = App.Text("Repository.OpenIn", dupTool.Name); - item.Icon = new Image { Width = 16, Height = 16, Source = dupTool.IconImage }; - item.Click += (_, e) => + var terminal = new MenuItem(); + terminal.Header = App.Text("Repository.Terminal"); + terminal.Icon = App.CreateMenuIcon("Icons.Terminal"); + terminal.Click += (_, e) => + { + Native.OS.OpenTerminal(_fullpath); + e.Handled = true; + }; + + menu.Items.Add(explore); + menu.Items.Add(terminal); + + var tools = Native.OS.ExternalTools; + if (tools.Count > 0) + { + menu.Items.Add(new MenuItem() { Header = "-" }); + + foreach (var tool in Native.OS.ExternalTools) { - dupTool.Open(_fullpath); - e.Handled = true; - }; + var dupTool = tool; - menu.Items.Add(item); + var item = new MenuItem(); + item.Header = App.Text("Repository.OpenIn", dupTool.Name); + item.Icon = new Image { Width = 16, Height = 16, Source = dupTool.IconImage }; + item.Click += (_, e) => + { + dupTool.Open(_fullpath); + e.Handled = true; + }; + + menu.Items.Add(item); + } } + var urls = new Dictionary(); + foreach (var r in _remotes) + { + if (r.TryGetVisitURL(out var visit)) + urls.Add(r.Name, visit); + } + + if (urls.Count > 0) + { + menu.Items.Add(new MenuItem() { Header = "-" }); + + foreach (var url in urls) + { + var name = url.Key; + var addr = url.Value; + + var item = new MenuItem(); + item.Header = App.Text("Repository.Visit", name); + item.Icon = App.CreateMenuIcon("Icons.Remotes"); + item.Click += (_, e) => + { + Native.OS.OpenBrowser(addr); + e.Handled = true; + }; + + menu.Items.Add(item); + } + } + return menu; } diff --git a/src/Views/RepositoryToolbar.axaml b/src/Views/RepositoryToolbar.axaml index 85b2ad76..208ff725 100644 --- a/src/Views/RepositoryToolbar.axaml +++ b/src/Views/RepositoryToolbar.axaml @@ -9,16 +9,8 @@ x:DataType="vm:Repository"> - - - -