From 937ad0c7083b15e846ae5588b4e7936d9d4ada77 Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 4 Jul 2025 11:37:08 +0800 Subject: [PATCH] feature: add `Update Submodule` context menu entry for selected submodule 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 | 13 +++++++- src/ViewModels/UpdateSubmodules.cs | 48 +++++++++++++++++++++--------- src/Views/UpdateSubmodules.axaml | 21 +++++++++---- 6 files changed, 64 insertions(+), 21 deletions(-) diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index f921e0f9..33f13d9f 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -753,6 +753,7 @@ not initialized revision changed unmerged + Update Submodule URL OK Copy Tag Name diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index 4afd4b0b..861e2f30 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -757,6 +757,7 @@ 未初始化 SHA变更 未解决冲突 + 更新子模块 仓库 确 定 复制标签名 diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml index dbad3d6a..e3e6a94c 100644 --- a/src/Resources/Locales/zh_TW.axaml +++ b/src/Resources/Locales/zh_TW.axaml @@ -757,6 +757,7 @@ 未初始化 SHA 變更 未解決的衝突 + 更新子模組 存放庫 確 定 複製標籤名稱 diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 783b923e..d3303538 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -1440,7 +1440,7 @@ namespace SourceGit.ViewModels public void UpdateSubmodules() { if (CanCreatePopup()) - ShowPopup(new UpdateSubmodules(this)); + ShowPopup(new UpdateSubmodules(this, null)); } public void OpenSubmodule(string submodule) @@ -2556,6 +2556,16 @@ namespace SourceGit.ViewModels ev.Handled = true; }; + var update = new MenuItem(); + update.Header = App.Text("Submodule.Update"); + update.Icon = App.CreateMenuIcon("Icons.Loading"); + update.Click += (_, ev) => + { + if (CanCreatePopup()) + ShowPopup(new UpdateSubmodules(this, submodule)); + ev.Handled = true; + }; + var move = new MenuItem(); move.Header = App.Text("Submodule.Move"); move.Icon = App.CreateMenuIcon("Icons.MoveTo"); @@ -2599,6 +2609,7 @@ namespace SourceGit.ViewModels var menu = new ContextMenu(); menu.Items.Add(open); menu.Items.Add(new MenuItem() { Header = "-" }); + menu.Items.Add(update); menu.Items.Add(move); menu.Items.Add(deinit); menu.Items.Add(rm); diff --git a/src/ViewModels/UpdateSubmodules.cs b/src/ViewModels/UpdateSubmodules.cs index 4aec0e79..78bb1feb 100644 --- a/src/ViewModels/UpdateSubmodules.cs +++ b/src/ViewModels/UpdateSubmodules.cs @@ -5,12 +5,17 @@ namespace SourceGit.ViewModels { public class UpdateSubmodules : Popup { - public List Submodules + public bool HasPreSelectedSubmodule { get; - } = []; + } - public string SelectedSubmodule + public List Submodules + { + get => _repo.Submodules; + } + + public Models.Submodule SelectedSubmodule { get; set; @@ -40,27 +45,42 @@ namespace SourceGit.ViewModels set; } = false; - public UpdateSubmodules(Repository repo) + public UpdateSubmodules(Repository repo, Models.Submodule selected) { _repo = repo; - foreach (var submodule in _repo.Submodules) - Submodules.Add(submodule.Path); - - SelectedSubmodule = Submodules.Count > 0 ? Submodules[0] : string.Empty; + if (selected != null) + { + _updateAll = false; + SelectedSubmodule = selected; + EnableInit = selected.Status == Models.SubmoduleStatus.NotInited; + HasPreSelectedSubmodule = true; + } + else if (repo.Submodules.Count > 0) + { + SelectedSubmodule = repo.Submodules[0]; + HasPreSelectedSubmodule = false; + } } public override async Task Sure() { - _repo.SetWatcherEnabled(false); - - List targets; + var targets = new List(); if (_updateAll) - targets = Submodules; - else - targets = [SelectedSubmodule]; + { + foreach (var submodule in Submodules) + targets.Add(submodule.Path); + } + else if (SelectedSubmodule != null) + { + targets.Add(SelectedSubmodule.Path); + } + + if (targets.Count == 0) + return true; var log = _repo.CreateLog("Update Submodule"); + _repo.SetWatcherEnabled(false); Use(log); await new Commands.Submodule(_repo.FullPath) diff --git a/src/Views/UpdateSubmodules.axaml b/src/Views/UpdateSubmodules.axaml index f189b80d..2b732036 100644 --- a/src/Views/UpdateSubmodules.axaml +++ b/src/Views/UpdateSubmodules.axaml @@ -2,6 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:m="using:SourceGit.Models" xmlns:vm="using:SourceGit.ViewModels" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="SourceGit.Views.UpdateSubmodules" @@ -10,7 +11,7 @@ - + + SelectedItem="{Binding SelectedSubmodule, Mode=TwoWay}"> + + + + + + + - + - + + IsChecked="{Binding UpdateAll, Mode=TwoWay}" + IsVisible="{Binding !HasPreSelectedSubmodule, Mode=OneWay}"/>