Skip to content

Commit c27c9f6

Browse files
committed
feature: show tagger in annotated tag's tooltip (#1664)
Signed-off-by: leo <[email protected]>
1 parent 2225322 commit c27c9f6

File tree

10 files changed

+116
-20
lines changed

10 files changed

+116
-20
lines changed

src/Commands/QueryTags.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public QueryTags(string repo)
1212

1313
Context = repo;
1414
WorkingDirectory = repo;
15-
Args = $"tag -l --format=\"{_boundary}%(refname)%00%(objecttype)%00%(objectname)%00%(*objectname)%00%(creatordate:unix)%00%(contents:subject)%0a%0a%(contents:body)\"";
15+
Args = $"tag -l --format=\"{_boundary}%(refname)%00%(objecttype)%00%(objectname)%00%(*objectname)%00%(taggername)±%(taggeremail)%00%(creatordate:unix)%00%(contents:subject)%0a%0a%(contents:body)\"";
1616
}
1717

1818
public async Task<List<Models.Tag>> GetResultAsync()
@@ -26,11 +26,11 @@ public QueryTags(string repo)
2626
foreach (var record in records)
2727
{
2828
var subs = record.Split('\0');
29-
if (subs.Length != 6)
29+
if (subs.Length != 7)
3030
continue;
3131

3232
var name = subs[0].Substring(10);
33-
var message = subs[5].Trim();
33+
var message = subs[6].Trim();
3434
if (!string.IsNullOrEmpty(message) && message.Equals(name, StringComparison.Ordinal))
3535
message = null;
3636

@@ -39,7 +39,8 @@ public QueryTags(string repo)
3939
Name = name,
4040
IsAnnotated = subs[1].Equals("tag", StringComparison.Ordinal),
4141
SHA = string.IsNullOrEmpty(subs[3]) ? subs[2] : subs[3],
42-
CreatorDate = ulong.Parse(subs[4]),
42+
Creator = Models.User.FindOrAdd(subs[4]),
43+
CreatorDate = ulong.Parse(subs[5]),
4344
Message = message,
4445
});
4546
}

src/Models/Tag.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using CommunityToolkit.Mvvm.ComponentModel;
1+
using System;
2+
using CommunityToolkit.Mvvm.ComponentModel;
23

34
namespace SourceGit.Models
45
{
@@ -13,9 +14,15 @@ public class Tag : ObservableObject
1314
public string Name { get; set; } = string.Empty;
1415
public bool IsAnnotated { get; set; } = false;
1516
public string SHA { get; set; } = string.Empty;
17+
public User Creator { get; set; } = null;
1618
public ulong CreatorDate { get; set; } = 0;
1719
public string Message { get; set; } = string.Empty;
1820

21+
public string CreatorDateStr
22+
{
23+
get => DateTime.UnixEpoch.AddSeconds(CreatorDate).ToLocalTime().ToString(DateTimeFormat.Active.DateTime);
24+
}
25+
1926
public FilterMode FilterMode
2027
{
2128
get => _filterMode;

src/Models/User.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public User(string data)
2121
parts = [string.Empty, data];
2222

2323
Name = parts[0];
24-
Email = parts[1];
24+
Email = parts[1].TrimStart('<').TrimEnd('>');
2525
_hash = data.GetHashCode();
2626
}
2727

src/Resources/Locales/en_US.axaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,8 +780,11 @@
780780
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">Update</x:String>
781781
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">URL</x:String>
782782
<x:String x:Key="Text.Sure" xml:space="preserve">OK</x:String>
783-
<x:String x:Key="Text.TagCM.Copy" xml:space="preserve">Copy Tag Name</x:String>
784-
<x:String x:Key="Text.TagCM.CopyMessage" xml:space="preserve">Copy Tag Message</x:String>
783+
<x:String x:Key="Text.Tag.Tagger" xml:space="preserve">TAGGER</x:String>
784+
<x:String x:Key="Text.Tag.Time" xml:space="preserve">TIME</x:String>
785+
<x:String x:Key="Text.TagCM.Copy.Message" xml:space="preserve">Message</x:String>
786+
<x:String x:Key="Text.TagCM.Copy.Name" xml:space="preserve">Name</x:String>
787+
<x:String x:Key="Text.TagCM.Copy.Tagger" xml:space="preserve">Tagger</x:String>
785788
<x:String x:Key="Text.TagCM.CustomAction" xml:space="preserve">Custom Action</x:String>
786789
<x:String x:Key="Text.TagCM.Delete" xml:space="preserve">Delete ${0}$...</x:String>
787790
<x:String x:Key="Text.TagCM.Merge" xml:space="preserve">Merge ${0}$ into ${1}$...</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -784,8 +784,11 @@
784784
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">更新</x:String>
785785
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">仓库</x:String>
786786
<x:String x:Key="Text.Sure" xml:space="preserve">确 定</x:String>
787-
<x:String x:Key="Text.TagCM.Copy" xml:space="preserve">复制标签名</x:String>
788-
<x:String x:Key="Text.TagCM.CopyMessage" xml:space="preserve">复制标签信息</x:String>
787+
<x:String x:Key="Text.Tag.Tagger" xml:space="preserve">创建者</x:String>
788+
<x:String x:Key="Text.Tag.Time" xml:space="preserve">创建时间</x:String>
789+
<x:String x:Key="Text.TagCM.Copy.Message" xml:space="preserve">标签信息</x:String>
790+
<x:String x:Key="Text.TagCM.Copy.Name" xml:space="preserve">标签名</x:String>
791+
<x:String x:Key="Text.TagCM.Copy.Tagger" xml:space="preserve">创建者</x:String>
789792
<x:String x:Key="Text.TagCM.CustomAction" xml:space="preserve">自定义操作</x:String>
790793
<x:String x:Key="Text.TagCM.Delete" xml:space="preserve">删除 ${0}$...</x:String>
791794
<x:String x:Key="Text.TagCM.Merge" xml:space="preserve">合并 ${0}$ 到 ${1}$...</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -784,8 +784,11 @@
784784
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">更新</x:String>
785785
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">存放庫</x:String>
786786
<x:String x:Key="Text.Sure" xml:space="preserve">確 定</x:String>
787-
<x:String x:Key="Text.TagCM.Copy" xml:space="preserve">複製標籤名稱</x:String>
788-
<x:String x:Key="Text.TagCM.CopyMessage" xml:space="preserve">複製標籤訊息</x:String>
787+
<x:String x:Key="Text.Tag.Tagger" xml:space="preserve">創建者</x:String>
788+
<x:String x:Key="Text.Tag.Time" xml:space="preserve">創建時間</x:String>
789+
<x:String x:Key="Text.TagCM.Copy.Message" xml:space="preserve">標籤訊息</x:String>
790+
<x:String x:Key="Text.TagCM.Copy.Name" xml:space="preserve">標籤名稱</x:String>
791+
<x:String x:Key="Text.TagCM.Copy.Tagger" xml:space="preserve">創建者</x:String>
789792
<x:String x:Key="Text.TagCM.CustomAction" xml:space="preserve">自訂動作</x:String>
790793
<x:String x:Key="Text.TagCM.Delete" xml:space="preserve">刪除 ${0}$...</x:String>
791794
<x:String x:Key="Text.TagCM.Merge" xml:space="preserve">合併 ${0}$ 到 ${1}$...</x:String>

src/ViewModels/TagCollection.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@ public class TagTreeNodeToolTip
1010
{
1111
public string Name { get; private set; }
1212
public bool IsAnnotated { get; private set; }
13+
public Models.User Creator { get; private set; }
14+
public string CreatorDateStr { get; private set; }
1315
public string Message { get; private set; }
1416

1517
public TagTreeNodeToolTip(Models.Tag t)
1618
{
1719
Name = t.Name;
1820
IsAnnotated = t.IsAnnotated;
21+
Creator = t.Creator;
22+
CreatorDateStr = t.CreatorDateStr;
1923
Message = t.Message;
2024
}
2125
}

src/Views/SubmodulesView.axaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727

2828
<Grid RowDefinitions="24,24,24" ColumnDefinitions="Auto,Auto" Margin="0,8,0,0">
2929
<TextBlock Grid.Row="0" Grid.Column="0"
30-
Classes="info_label"
31-
HorizontalAlignment="Left" VerticalAlignment="Center"
32-
Text="{DynamicResource Text.Submodule.Branch}"/>
30+
Classes="info_label"
31+
HorizontalAlignment="Left" VerticalAlignment="Center"
32+
Text="{DynamicResource Text.Submodule.Branch}"/>
3333
<StackPanel Grid.Row="0" Grid.Column="1"
3434
Orientation="Horizontal"
3535
Margin="8,0,0,0">

src/Views/TagsView.axaml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,34 @@
3737
</Border>
3838
</StackPanel>
3939

40+
<Grid RowDefinitions="20,20" ColumnDefinitions="Auto,*" Margin="0,6" IsVisible="{Binding IsAnnotated}">
41+
<TextBlock Grid.Row="0" Grid.Column="0"
42+
Classes="info_label"
43+
HorizontalAlignment="Left" VerticalAlignment="Center"
44+
Text="{DynamicResource Text.Tag.Tagger}"/>
45+
<ContentControl Grid.Row="0" Grid.Column="1" Margin="8,0,0,0" Content="{Binding Creator}">
46+
<ContentControl.DataTemplates>
47+
<DataTemplate DataType="m:User">
48+
<StackPanel Orientation="Horizontal">
49+
<v:Avatar Width="16" Height="16" User="{Binding}"/>
50+
<TextBlock Margin="8,0,0,0">
51+
<Run Text="{Binding Name, Mode=OneWay}"/>
52+
<Run Text="{Binding Email, Mode=OneWay}" Foreground="{DynamicResource Brush.FG2}"/>
53+
</TextBlock>
54+
</StackPanel>
55+
</DataTemplate>
56+
</ContentControl.DataTemplates>
57+
</ContentControl>
58+
59+
<TextBlock Grid.Row="1" Grid.Column="0"
60+
Classes="info_label"
61+
HorizontalAlignment="Left" VerticalAlignment="Center"
62+
Text="{DynamicResource Text.Tag.Time}"/>
63+
<TextBlock Grid.Row="1" Grid.Column="1"
64+
Margin="8,0,0,0"
65+
Text="{Binding CreatorDateStr, Mode=OneWay}"/>
66+
</Grid>
67+
4068
<TextBlock Text="{Binding Message}" IsVisible="{Binding Message, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
4169
</StackPanel>
4270
</DataTemplate>
@@ -109,6 +137,34 @@
109137
</Border>
110138
</StackPanel>
111139

140+
<Grid RowDefinitions="20,20" ColumnDefinitions="Auto,*" Margin="0,6" IsVisible="{Binding IsAnnotated}">
141+
<TextBlock Grid.Row="0" Grid.Column="0"
142+
Classes="info_label"
143+
HorizontalAlignment="Left" VerticalAlignment="Center"
144+
Text="{DynamicResource Text.Tag.Tagger}"/>
145+
<ContentControl Grid.Row="0" Grid.Column="1" Margin="8,0,0,0" Content="{Binding Creator}">
146+
<ContentControl.DataTemplates>
147+
<DataTemplate DataType="m:User">
148+
<StackPanel Orientation="Horizontal">
149+
<v:Avatar Width="16" Height="16" User="{Binding}"/>
150+
<TextBlock Margin="8,0,0,0">
151+
<Run Text="{Binding Name, Mode=OneWay}"/>
152+
<Run Text="{Binding Email, Mode=OneWay}" Foreground="{DynamicResource Brush.FG2}"/>
153+
</TextBlock>
154+
</StackPanel>
155+
</DataTemplate>
156+
</ContentControl.DataTemplates>
157+
</ContentControl>
158+
159+
<TextBlock Grid.Row="1" Grid.Column="0"
160+
Classes="info_label"
161+
HorizontalAlignment="Left" VerticalAlignment="Center"
162+
Text="{DynamicResource Text.Tag.Time}"/>
163+
<TextBlock Grid.Row="1" Grid.Column="1"
164+
Margin="8,0,0,0"
165+
Text="{Binding CreatorDateStr, Mode=OneWay}"/>
166+
</Grid>
167+
112168
<TextBlock Text="{Binding Message}" IsVisible="{Binding Message, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
113169
</StackPanel>
114170
</ToolTip.Tip>

src/Views/TagsView.axaml.cs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -280,26 +280,45 @@ private void OnItemContextRequested(object sender, ContextRequestedEventArgs e)
280280
}
281281

282282
var copy = new MenuItem();
283-
copy.Header = App.Text("TagCM.Copy");
283+
copy.Header = App.Text("Copy");
284284
copy.Icon = App.CreateMenuIcon("Icons.Copy");
285-
copy.Click += async (_, ev) =>
285+
286+
var copyName = new MenuItem();
287+
copyName.Header = App.Text("TagCM.Copy.Name");
288+
copyName.Icon = App.CreateMenuIcon("Icons.Tag");
289+
copyName.Click += async (_, ev) =>
286290
{
287291
await App.CopyTextAsync(selected.Name);
288292
ev.Handled = true;
289293
};
290294

291295
var copyMessage = new MenuItem();
292-
copyMessage.Header = App.Text("TagCM.CopyMessage");
293-
copyMessage.Icon = App.CreateMenuIcon("Icons.Copy");
296+
copyMessage.Header = App.Text("TagCM.Copy.Message");
297+
copyMessage.Icon = App.CreateMenuIcon("Icons.Info");
294298
copyMessage.IsEnabled = !string.IsNullOrEmpty(selected.Message);
295299
copyMessage.Click += async (_, ev) =>
296300
{
297301
await App.CopyTextAsync(selected.Message);
298302
ev.Handled = true;
299303
};
300304

305+
copy.Items.Add(copyName);
306+
copy.Items.Add(copyMessage);
307+
308+
if (selected.Creator is { Email: { Length: > 0 } })
309+
{
310+
var copyCreator = new MenuItem();
311+
copyCreator.Header = App.Text("TagCM.Copy.Tagger");
312+
copyCreator.Icon = App.CreateMenuIcon("Icons.User");
313+
copyCreator.Click += async (_, ev) =>
314+
{
315+
await App.CopyTextAsync(selected.Creator.ToString());
316+
ev.Handled = true;
317+
};
318+
copy.Items.Add(copyCreator);
319+
}
320+
301321
menu.Items.Add(copy);
302-
menu.Items.Add(copyMessage);
303322
menu.Open(control);
304323
}
305324

0 commit comments

Comments
 (0)