Skip to content

Commit 2047631

Browse files
committed
feature: supports to disable GitHub style default avatar (#1814)
Signed-off-by: leo <longshuang@msn.cn>
1 parent 0ab4926 commit 2047631

File tree

6 files changed

+91
-1
lines changed

6 files changed

+91
-1
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@
575575
<x:String x:Key="Text.Preferences.General.ShowChildren" xml:space="preserve">Show children in the commit details</x:String>
576576
<x:String x:Key="Text.Preferences.General.ShowTagsInGraph" xml:space="preserve">Show tags in commit graph</x:String>
577577
<x:String x:Key="Text.Preferences.General.SubjectGuideLength" xml:space="preserve">Subject Guide Length</x:String>
578+
<x:String x:Key="Text.Preferences.General.UseGitHubStyleAvatar" xml:space="preserve">Generate Github style default avatar</x:String>
578579
<x:String x:Key="Text.Preferences.Git" xml:space="preserve">GIT</x:String>
579580
<x:String x:Key="Text.Preferences.Git.CRLF" xml:space="preserve">Enable Auto CRLF</x:String>
580581
<x:String x:Key="Text.Preferences.Git.DefaultCloneDir" xml:space="preserve">Default Clone Dir</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@
579579
<x:String x:Key="Text.Preferences.General.ShowChildren" xml:space="preserve">在提交详情页中显示子提交列表</x:String>
580580
<x:String x:Key="Text.Preferences.General.ShowTagsInGraph" xml:space="preserve">在提交路线图中显示标签</x:String>
581581
<x:String x:Key="Text.Preferences.General.SubjectGuideLength" xml:space="preserve">SUBJECT字数检测</x:String>
582+
<x:String x:Key="Text.Preferences.General.UseGitHubStyleAvatar" xml:space="preserve">生成GitHub风格的默认头像</x:String>
582583
<x:String x:Key="Text.Preferences.Git" xml:space="preserve">GIT配置</x:String>
583584
<x:String x:Key="Text.Preferences.Git.CRLF" xml:space="preserve">自动换行转换</x:String>
584585
<x:String x:Key="Text.Preferences.Git.DefaultCloneDir" xml:space="preserve">默认克隆路径</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@
579579
<x:String x:Key="Text.Preferences.General.ShowChildren" xml:space="preserve">在提交詳細資訊中顯示後續提交</x:String>
580580
<x:String x:Key="Text.Preferences.General.ShowTagsInGraph" xml:space="preserve">在路線圖中顯示標籤</x:String>
581581
<x:String x:Key="Text.Preferences.General.SubjectGuideLength" xml:space="preserve">提交標題字數偵測</x:String>
582+
<x:String x:Key="Text.Preferences.General.UseGitHubStyleAvatar" xml:space="preserve">生成 GitHub 風格的預設頭像</x:String>
582583
<x:String x:Key="Text.Preferences.Git" xml:space="preserve">Git 設定</x:String>
583584
<x:String x:Key="Text.Preferences.Git.CRLF" xml:space="preserve">自動換行轉換</x:String>
584585
<x:String x:Key="Text.Preferences.Git.DefaultCloneDir" xml:space="preserve">預設複製 (clone) 路徑</x:String>

src/ViewModels/Preferences.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,12 @@ public bool UseAutoHideScrollBars
170170
set => SetProperty(ref _useAutoHideScrollBars, value);
171171
}
172172

173+
public bool UseGitHubStyleAvatar
174+
{
175+
get => _useGitHubStyleAvatar;
176+
set => SetProperty(ref _useGitHubStyleAvatar, value);
177+
}
178+
173179
public bool Check4UpdatesOnStartup
174180
{
175181
get => _check4UpdatesOnStartup;
@@ -725,6 +731,7 @@ private bool RemoveInvalidRepositoriesRecursive(List<RepositoryNode> collection)
725731
private int _subjectGuideLength = 50;
726732
private bool _useFixedTabWidth = true;
727733
private bool _useAutoHideScrollBars = true;
734+
private bool _useGitHubStyleAvatar = true;
728735
private bool _showAuthorTimeInGraph = false;
729736
private bool _showChildren = false;
730737

src/Views/Avatar.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Globalization;
34
using System.IO;
45
using System.Security.Cryptography;
56
using System.Text;
67

78
using Avalonia;
89
using Avalonia.Controls;
10+
using Avalonia.Data;
911
using Avalonia.Interactivity;
1012
using Avalonia.Media;
1113
using Avalonia.Media.Imaging;
@@ -24,9 +26,25 @@ public Models.User User
2426
set => SetValue(UserProperty, value);
2527
}
2628

29+
public static readonly StyledProperty<bool> UseGitHubStyleAvatarProperty =
30+
AvaloniaProperty.Register<Avatar, bool>(nameof(UseGitHubStyleAvatar));
31+
32+
public bool UseGitHubStyleAvatar
33+
{
34+
get => GetValue(UseGitHubStyleAvatarProperty);
35+
set => SetValue(UseGitHubStyleAvatarProperty, value);
36+
}
37+
2738
public Avatar()
2839
{
2940
RenderOptions.SetBitmapInterpolationMode(this, BitmapInterpolationMode.HighQuality);
41+
42+
this.Bind(UseGitHubStyleAvatarProperty, new Binding()
43+
{
44+
Mode = BindingMode.OneWay,
45+
Source = ViewModels.Preferences.Instance,
46+
Path = "UseGitHubStyleAvatar"
47+
});
3048
}
3149

3250
public override void Render(DrawingContext context)
@@ -42,6 +60,34 @@ public override void Render(DrawingContext context)
4260
{
4361
context.DrawImage(_img, rect);
4462
}
63+
else if (!UseGitHubStyleAvatar)
64+
{
65+
var fallback = GetFallbackString(User.Name);
66+
var typeface = new Typeface("fonts:SourceGit#JetBrains Mono");
67+
var label = new FormattedText(
68+
fallback,
69+
CultureInfo.CurrentCulture,
70+
FlowDirection.LeftToRight,
71+
typeface,
72+
Bounds.Width * 0.65,
73+
Brushes.White);
74+
75+
var chars = fallback.ToCharArray();
76+
var sum = 0;
77+
foreach (var c in chars)
78+
sum += Math.Abs(c);
79+
80+
var bg = new LinearGradientBrush()
81+
{
82+
GradientStops = FALLBACK_GRADIENTS[sum % FALLBACK_GRADIENTS.Length],
83+
StartPoint = new RelativePoint(0, 0, RelativeUnit.Relative),
84+
EndPoint = new RelativePoint(0, 1, RelativeUnit.Relative),
85+
};
86+
87+
Point textOrigin = new Point((Bounds.Width - label.Width) * 0.5, (Bounds.Height - label.Height) * 0.5);
88+
context.DrawRectangle(bg, null, new Rect(0, 0, Bounds.Width, Bounds.Height), corner, corner);
89+
context.DrawText(label, textOrigin);
90+
}
4591
else
4692
{
4793
context.DrawRectangle(Brushes.White, new Pen(new SolidColorBrush(Colors.Black, 0.3f), 0.65f), rect, corner, corner);
@@ -130,6 +176,11 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
130176
_img = Models.AvatarManager.Instance.Request(User.Email, false);
131177
InvalidateVisual();
132178
}
179+
else if (change.Property == UseGitHubStyleAvatarProperty)
180+
{
181+
if (_img == null)
182+
InvalidateVisual();
183+
}
133184
}
134185

135186
private void OnContextRequested(object sender, ContextRequestedEventArgs e)
@@ -220,6 +271,30 @@ private void OnContextRequested(object sender, ContextRequestedEventArgs e)
220271
menu.Open(this);
221272
}
222273

274+
private string GetFallbackString(string name)
275+
{
276+
if (string.IsNullOrWhiteSpace(name))
277+
return "?";
278+
279+
var parts = name.Split(' ', StringSplitOptions.RemoveEmptyEntries);
280+
var chars = new List<char>();
281+
foreach (var part in parts)
282+
chars.Add(part[0]);
283+
284+
if (chars.Count >= 2 && char.IsAsciiLetterOrDigit(chars[0]) && char.IsAsciiLetterOrDigit(chars[^1]))
285+
return string.Format("{0}{1}", chars[0], chars[^1]);
286+
287+
return name.Substring(0, 1);
288+
}
289+
290+
private static readonly GradientStops[] FALLBACK_GRADIENTS = [
291+
new GradientStops() { new GradientStop(Colors.Orange, 0), new GradientStop(Color.FromRgb(255, 213, 134), 1) },
292+
new GradientStops() { new GradientStop(Colors.DodgerBlue, 0), new GradientStop(Colors.LightSkyBlue, 1) },
293+
new GradientStops() { new GradientStop(Colors.LimeGreen, 0), new GradientStop(Color.FromRgb(124, 241, 124), 1) },
294+
new GradientStops() { new GradientStop(Colors.Orchid, 0), new GradientStop(Color.FromRgb(248, 161, 245), 1) },
295+
new GradientStops() { new GradientStop(Colors.Tomato, 0), new GradientStop(Color.FromRgb(252, 165, 150), 1) },
296+
];
297+
223298
private Bitmap _img = null;
224299
}
225300
}

src/Views/Preferences.axaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
<TabItem.Header>
4747
<TextBlock Classes="tab_header" Text="{DynamicResource Text.Preferences.General}"/>
4848
</TabItem.Header>
49-
<Grid Margin="8" RowDefinitions="32,32,32,32,32,32,32,32,32,32,32,Auto" ColumnDefinitions="Auto,*">
49+
<Grid Margin="8" RowDefinitions="32,32,32,32,32,32,32,32,32,32,32,32,Auto" ColumnDefinitions="Auto,*">
5050
<TextBlock Grid.Row="0" Grid.Column="0"
5151
Text="{DynamicResource Text.Preferences.General.Locale}"
5252
HorizontalAlignment="Right"
@@ -163,6 +163,11 @@
163163
IsChecked="{Binding EnableCompactFoldersInChangesTree, Mode=TwoWay}"/>
164164

165165
<CheckBox Grid.Row="11" Grid.Column="1"
166+
Height="32"
167+
Content="{DynamicResource Text.Preferences.General.UseGitHubStyleAvatar}"
168+
IsChecked="{Binding UseGitHubStyleAvatar, Mode=TwoWay}"/>
169+
170+
<CheckBox Grid.Row="12" Grid.Column="1"
166171
Height="32"
167172
Content="{DynamicResource Text.Preferences.General.Check4UpdatesOnStartup}"
168173
IsVisible="{x:Static s:App.IsCheckForUpdateCommandVisible}"

0 commit comments

Comments
 (0)