8000 refactor: build tags view data in viewmodels instead of views · sourcegit-scm/sourcegit@fd93525 · GitHub
[go: up one dir, main page]

Skip to content

Commit fd93525

Browse files
committed
refactor: build tags view data in viewmodels instead of views
Signed-off-by: leo <longshuang@msn.cn>
1 parent f46bbd0 commit fd93525

File tree

7 files changed

+151
-172
lines changed

7 files changed

+151
-172
lines changed

src/ViewModels/Preferences.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ public string IgnoreUpdateTag
178178

179179
public bool ShowTagsAsTree
180180
{
181-
get => _showTagsAsTree;
182-
set => SetProperty(ref _showTagsAsTree, value);
183-
}
181+
get;
182+
set;
183+
} = false;
184184

185185
public bool ShowTagsInGraph
186186
{
@@ -677,7 +677,6 @@ private bool RemoveInvalidRepositoriesRecursive(List<RepositoryNode> collection)
677677
private double _lastCheckUpdateTime = 0;
678678
private string _ignoreUpdateTag = string.Empty;
679679

680-
private bool _showTagsAsTree = false;
681680
private bool _showTagsInGraph = true;
682681
private bool _useTwoColumnsLayoutInHistories = false;
683682
private bool _displayTimeAsPeriodInHistories = false;

src/ViewModels/Repository.cs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,21 @@ public List<Models.Tag&g 57AE t; Tags
198198
private set => SetProperty(ref _tags, value);
199199
}
200200

201-
public List<Models.Tag> VisibleTags
201+
public bool ShowTagsAsTree
202+
{
203+
get => Preferences.Instance.ShowTagsAsTree;
204+
set
205+
{
206+
if (value != Preferences.Instance.ShowTagsAsTree)
207+
{
208+
Preferences.Instance.ShowTagsAsTree = value;
209+
VisibleTags = BuildVisibleTags();
210+
OnPropertyChanged();
211+
}
212+
}
213+
}
214+
215+
public object VisibleTags
202216
{
203217
get => _visibleTags;
204218
private set => SetProperty(ref _visibleTags, value);
@@ -548,7 +562,7 @@ public void Close()
548562
_localBranchTrees.Clear();
549563
_remoteBranchTrees.Clear();
550564
_tags.Clear();
551-
_visibleTags.Clear();
565+
_visibleTags = null;
552566
_submodules.Clear();
553567
_visibleSubmodules = null;
554568
_searchedCommits.Clear();
@@ -2492,7 +2506,7 @@ private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, Lis
24922506
return builder;
24932507
}
24942508

2495-
private List<Models.Tag> BuildVisibleTags()
2509+
private object BuildVisibleTags()
24962510
{
24972511
switch (_settings.TagSortMode)
24982512
{
@@ -2523,7 +2537,11 @@ private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, Lis
25232537

25242538
var historiesFilters = _settings.CollectHistoriesFilters();
25252539
UpdateTagFilterMode(historiesFilters);
2526-
return visible;
2540+
2541+
if (Preferences.Instance.ShowTagsAsTree)
2542+
return TagCollectionAsTree.Build(visible, _visibleTags as TagCollectionAsTree);
2543+
else
2544+
return new TagCollectionAsList() { Tags = visible };
25272545
}
25282546

25292547
private object BuildVisibleSubmodules()
@@ -2775,7 +2793,7 @@ private void AutoFetchImpl(object sender)
27752793
private List<BranchTreeNode> _remoteBranchTrees = new List<BranchTreeNode>();
27762794
private List<Models.Worktree> _worktrees = new List<Models.Worktree>();
27772795
private List<Models.Tag> _tags = new List<Models.Tag>();
2778-
private List<Models.Tag> _visibleTags = new List<Models.Tag>();
2796+
private object _visibleTags = null;
27792797
private List<Models.Submodule> _submodules = new List<Models.Submodule>();
27802798
private object _visibleSubmodules = null;
27812799

src/ViewModels/SubmoduleCollection.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,18 +150,12 @@ public static SubmoduleCollectionAsTree Build(List<Models.Submodule> submodules,
150150
collection.Tree = SubmoduleTreeNode.Build(submodules, oldExpanded);
151151

152152
var rows = new List<SubmoduleTreeNode>();
153-
collection.MakeTreeRows(rows, collection.Tree);
153+
MakeTreeRows(rows, collection.Tree);
154154
collection.Rows.AddRange(rows);
155155

156156
return collection;
157157
}
158158

159-
public void Clear()
160-
{
161-
Tree.Clear();
162-
Rows.Clear();
163-
}
164-
165159
public void ToggleExpand(SubmoduleTreeNode node)
166160
{
167161
node.IsExpanded = !node.IsExpanded;
@@ -193,7 +187,7 @@ public void ToggleExpand(SubmoduleTreeNode node)
193187
}
194188
}
195189

196-
private void MakeTreeRows(List<SubmoduleTreeNode> rows, List<SubmoduleTreeNode> nodes)
190+
private static void MakeTreeRows(List<SubmoduleTreeNode> rows, List<SubmoduleTreeNode> nodes)
197191
{
198192
foreach (var node in nodes)
199193
{

src/ViewModels/TagCollection.cs

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.Collections.Generic;
3+
34
using Avalonia.Collections;
5+
46
using CommunityToolkit.Mvvm.ComponentModel;
57

68
namespace SourceGit.ViewModels
@@ -61,7 +63,7 @@ public TagTreeNode(string path, bool isExpanded, int depth)
6163
Counter = 1;
6264
}
6365

64-
public static List<TagTreeNode> Build(IList<Models.Tag> tags, HashSet<string> expaneded)
66+
public static List<TagTreeNode> Build(List<Models.Tag> tags, HashSet<string> expaneded)
6567
{
6668
var nodes = new List<TagTreeNode>();
6769
var folders = new Dictionary<string, TagTreeNode>();
@@ -131,7 +133,7 @@ private static void InsertFolder(List<TagTreeNode> collection, TagTreeNode subFo
131133

132134
public class TagCollectionAsList
133135
{
134-
public AvaloniaList<Models.Tag> Tags
136+
public List<Models.Tag> Tags
135137
{
136138
get;
137139
set;
@@ -151,5 +153,71 @@ public AvaloniaList<TagTreeNode> Rows
151153
get;
152154
set;
153155
} = [];
156+
157+
public static TagCollectionAsTree Build(List<Models.Tag> tags, TagCollectionAsTree old)
158+
{
159+
var oldExpanded = new HashSet<string>();
160+
if (old != null)
161+
{
162+
foreach (var row in old.Rows)
163+
{
164+
if (row.IsFolder && row.IsExpanded)
165+
oldExpanded.Add(row.FullPath);
166+
}
167+
}
168+
169+
var collection = new TagCollectionAsTree();
170+
collection.Tree = TagTreeNode.Build(tags, oldExpanded);
171+
172+
var rows = new List<TagTreeNode>();
173+
MakeTreeRows(rows, collection.Tree);
174+
collection.Rows.AddRange(rows);
175+
176+
return collection;
177+
}
178+
179+
public void ToggleExpand(TagTreeNode node)
180+
{
181+
node.IsExpanded = !node.IsExpanded;
182+
183+
var rows = Rows;
184+
var depth = node.Depth;
185+
var idx = rows.IndexOf(node);
186+
if (idx == -1)
187+
return;
188+
189+
if (node.IsExpanded)
190+
{
191+
var subrows = new List<TagTreeNode>();
192+
MakeTreeRows(subrows, node.Children);
193+
rows.InsertRange(idx + 1, subrows);
194+
}
195+
else
196+
{
197+
var removeCount = 0;
198+
for (int i = idx + 1; i < rows.Count; i++)
199+
{
200+
var row = rows[i];
201+
if (row.Depth <= depth)
202+
break;
203+
204+
removeCount++;
205+
}
206+
rows.RemoveRange(idx + 1, removeCount);
207+
}
208+
}
209+
210+
private static void MakeTreeRows(List<TagTreeNode> rows, List<TagTreeNode> nodes)
211+
{
212+
foreach (var node in nodes)
213+
{
214+
rows.Add(node);
215+
216+
if (!node.IsExpanded || !node.IsFolder)
217+
continue;
218+
219+
MakeTreeRows(rows, node.Children);
220+
}
221+
}
154222
}
155223
}

src/Views/Repository.axaml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@
271271
<ToggleButton Grid.Column="2"
272272
Classes="show_as_tree"
273273
Width="14"
274-
IsChecked="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowTagsAsTree, Mode=TwoWay}"
274+
IsChecked="{Binding ShowTagsAsTree, Mode=TwoWay}"
275275
ToolTip.Tip="{DynamicResource Text.Repository.ShowTagsAsTree}"/>
276276
<Button Grid.Column="3"
277277
Classes="icon_button"
@@ -296,8 +296,7 @@
296296
Height="0"
297297
Margin="8,0,4,0"
298298
Background="Transparent"
299-
ShowTagsAsTree="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowTagsAsTree, Mode=OneWay}"
300-
Tags="{Binding VisibleTags}"
299+
Content="{Binding VisibleTags}"
301300
Focusable="False"
302301
IsVisible="{Binding IsTagGroupExpanded, Mode=OneWay}"
303302
SelectionChanged="OnTagsSelectionChanged"

src/Views/TagsView.axaml

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,33 @@
2323
<ListBox Classes="repo_left_content_list"
2424
ItemsSource="{Binding Rows}"
2525
SelectionMode="Single"
26-
SelectionChanged="OnRowSelectionChanged">
26+
SelectionChanged="OnSelectionChanged">
27+
28+
<ListBox.DataTemplates>
29+
<DataTemplate DataType="vm:TagTreeNodeToolTip">
30+
<StackPanel Orientation="Vertical" Spacing="6">
31+
<StackPanel Orientation="Horizontal">
32+
<Path Width="10" Height="10" Data="{StaticResource Icons.Tag}"/>
33+
<TextBlock FontWeight="Bold" Margin="4,0,0,0" Text="{Binding Name}"/>
34+
<Border Background="Green" Margin="4,0,0,0" CornerRadius="4" IsVisible="{Binding IsAnnotated}">
35+
<TextBlock Text="{DynamicResource Text.CreateTag.Type.Annotated}" Classes="primary" Margin="4,0" Foreground="White"/>
36+
</Border>
37+
</StackPanel>
38+
39+
<TextBlock Text="{Binding Message}" IsVisible="{Binding Message, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
40+
</StackPanel>
41+
</DataTemplate>
42+
</ListBox.DataTemplates>
43+
2744
<ListBox.ItemTemplate>
2845
<DataTemplate DataType="vm:TagTreeNode">
2946
<Border Height="24"
3047
Background="Transparent"
31-
PointerPressed="OnRowPointerPressed"
32-
DoubleTapped="OnDoubleTappedNode"
33-
ContextRequested="OnRowContextRequested"
48+
PointerPressed="OnItemPointerPressed"
49+
DoubleTapped="OnItemDoubleTapped"
50+
ContextRequested="OnItemContextRequested"
3451
ToolTip.Tip="{Binding ToolTip}"
35-
ToolTip.Placement="Right">
36-
<Border.DataTemplates>
37-
<DataTemplate DataType="vm:TagTreeNodeToolTip">
38-
<StackPanel Orientation="Vertical" Spacing="6">
39-
<StackPanel Orientation="Horizontal">
40-
<Path Width="10" Height="10" Data="{StaticResource Icons.Tag}"/>
41-
<TextBlock FontWeight="Bold" Margin="4,0,0,0" Text="{Binding Name}"/>
42-
<Border Background="Green" Margin="4,0,0,0" CornerRadius="4" IsVisible="{Binding IsAnnotated}">
43-
<TextBlock Text="{DynamicResource Text.CreateTag.Type.Annotated}" Classes="primary" Margin="4,0" Foreground="White"/>
44-
</Border>
45-
</StackPanel>
46-
47-
<TextBlock Text="{Binding Message}" IsVisible="{Binding Message, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
48-
</StackPanel>
49-
</DataTemplate>
50-
</Border.DataTemplates>
51-
52+
ToolTip.Placement="Right">
5253
<Grid ColumnDefinitions="16,Auto,*,Auto"
5354
Margin="{Binding Depth, Converter={x:Static c:IntConverters.ToTreeMargin}}"
5455
VerticalAlignment="Center">
@@ -59,9 +60,7 @@
5960
IsChecked="{Binding IsExpanded, Mode=OneWay}"
6061
IsVisible="{Binding IsFolder}"/>
6162

62-
<v:TagTreeNodeIcon Grid.Column="1"
63-
Node="{Binding .}"
64-
IsExpanded="{Binding IsExpanded, Mode=OneWay}"/>
63+
<v:TagTreeNodeIcon Grid.Column="1" IsExpanded="{Binding IsExpanded, Mode=OneWay}"/>
6564

6665
<TextBlock Grid.Column="2"
6766
Classes="primary"
@@ -89,13 +88,13 @@
8988
Margin="8,0,0,0"
9089
ItemsSource="{Binding Tags}"
9190
SelectionMode="Single"
92-
SelectionChanged="OnRowSelectionChanged">
91+
SelectionChanged="OnSelectionChanged">
9392
<ListBox.ItemTemplate>
9493
<DataTemplate DataType="m:Tag">
9594
<Border Height="24"
9695
Background="Transparent"
97-
PointerPressed="OnRowPointerPressed"
98-
ContextRequested="OnRowContextRequested"
96+
PointerPressed="OnItemPointerPressed"
97+
ContextRequested="OnItemContextRequested"
9998
ToolTip.Placement="Right">
10099
<ToolTip.Tip>
101100
<StackPanel Orientation="Vertical" Spacing="6">

0 commit comments

Comments
 (0)
0