From ed1351b1f789e7550be3b8b7857953edf2a84fec Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 16 May 2025 11:31:53 +0800 Subject: [PATCH] feature: supports to show submodules as tree or list (#1307) 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/Resources/Styles.axaml | 2 +- src/ViewModels/Preferences.cs | 6 + src/ViewModels/Repository.cs | 27 +- ...duleTreeNode.cs => SubmoduleCollection.cs} | 24 +- src/Views/Repository.axaml | 16 +- src/Views/SubmodulesView.axaml | 312 ++++++++++++------ src/Views/SubmodulesView.axaml.cs | 64 ++-- 10 files changed, 302 insertions(+), 152 deletions(-) rename src/ViewModels/{SubmoduleTreeNode.cs => SubmoduleCollection.cs} (90%) diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index cee9ad2c..2f7c5c43 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -617,6 +617,7 @@ Message SHA Current Branch + Show Submodules as Tree Show Tags as Tree SKIP Statistics diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index 3b0237da..56227607 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -621,6 +621,7 @@ 提交信息 提交指纹 仅在当前分支中查找 + 以树型结构展示 以树型结构展示 跳过此提交 提交统计 diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml index 6b3ce423..204e1cf7 100644 --- a/src/Resources/Locales/zh_TW.axaml +++ b/src/Resources/Locales/zh_TW.axaml @@ -621,6 +621,7 @@ 提交訊息 提交編號 僅搜尋目前分支 + 以樹型結構展示 以樹型結構展示 跳過此提交 提交統計 diff --git a/src/Resources/Styles.axaml b/src/Resources/Styles.axaml index 882a14f4..923ef22b 100644 --- a/src/Resources/Styles.axaml +++ b/src/Resources/Styles.axaml @@ -1235,7 +1235,7 @@ - + - - - - + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Views/SubmodulesView.axaml.cs b/src/Views/SubmodulesView.axaml.cs index 116cbe9f..81ccdc5d 100644 --- a/src/Views/SubmodulesView.axaml.cs +++ b/src/Views/SubmodulesView.axaml.cs @@ -89,15 +89,6 @@ namespace SourceGit.Views public partial class SubmodulesView : UserControl { - public static readonly StyledProperty SubmodulesProperty = - AvaloniaProperty.Register(nameof(Submodules)); - - public ViewModels.SubmoduleCollection Submodules - { - get => GetValue(SubmodulesProperty); - set => SetValue(SubmodulesProperty, value); - } - public static readonly RoutedEvent RowsChangedEvent = RoutedEvent.Register(nameof(RowsChanged), RoutingStrategies.Tunnel | RoutingStrategies.Bubble); @@ -120,11 +111,10 @@ namespace SourceGit.Views public void ToggleNodeIsExpanded(ViewModels.SubmoduleTreeNode node) { - var submodules = Submodules; - if (submodules != null) + if (Content is ViewModels.SubmoduleCollectionAsTree tree) { - submodules.ToggleExpand(node); - Rows = submodules.Rows.Count; + tree.ToggleExpand(node); + Rows = tree.Rows.Count; RaiseEvent(new RoutedEventArgs(RowsChangedEvent)); } } @@ -133,9 +123,15 @@ namespace SourceGit.Views { base.OnPropertyChanged(change); - if (change.Property == SubmodulesProperty) + if (change.Property == ContentProperty) { - Rows = Submodules?.Rows.Count ?? 0; + if (Content is ViewModels.SubmoduleCollectionAsTree tree) + Rows = tree.Rows.Count; + else if (Content is ViewModels.SubmoduleCollectionAsList list) + Rows = list.Submodules.Count; + else + Rows = 0; + RaiseEvent(new RoutedEventArgs(RowsChangedEvent)); } else if (change.Property == IsVisibleProperty) @@ -144,28 +140,40 @@ namespace SourceGit.Views } } - private void OnDoubleTappedNode(object sender, TappedEventArgs e) + private void OnItemDoubleTapped(object sender, TappedEventArgs e) { - if (sender is Control { DataContext: ViewModels.SubmoduleTreeNode node } && - DataContext is ViewModels.Repository repo) + if (sender is Control control && DataContext is ViewModels.Repository repo) { - if (node.IsFolder) - ToggleNodeIsExpanded(node); - else if (node.Module.Status != Models.SubmoduleStatus.NotInited) - repo.OpenSubmodule(node.Module.Path); + if (control.DataContext is ViewModels.SubmoduleTreeNode node) + { + if (node.IsFolder) + ToggleNodeIsExpanded(node); + else if (node.Module.Status != Models.SubmoduleStatus.NotInited) + repo.OpenSubmodule(node.Module.Path); + } + else if (control.DataContext is Models.Submodule m && m.Status != Models.SubmoduleStatus.NotInited) + { + repo.OpenSubmodule(m.Path); + } } e.Handled = true; } - private void OnRowContextRequested(object sender, ContextRequestedEventArgs e) + private void OnItemContextRequested(object sender, ContextRequestedEventArgs e) { - if (sender is Control { DataContext: ViewModels.SubmoduleTreeNode node } control && - node.Module != null && - DataContext is ViewModels.Repository repo) + if (sender is Control control && DataContext is ViewModels.Repository repo) { - var menu = repo.CreateContextMenuForSubmodule(node.Module); - menu?.Open(control); + if (control.DataContext is ViewModels.SubmoduleTreeNode node && node.Module != null) + { + var menu = repo.CreateContextMenuForSubmodule(node.Module); + menu?.Open(control); + } + else if (control.DataContext is Models.Submodule m) + { + var menu = repo.CreateContextMenuForSubmodule(m); + menu?.Open(control); + } } e.Handled = true;