mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2024-12-23 20:47:25 -08:00
optimize<Avatar>: create formatted text only if fallback label changed
This commit is contained in:
parent
5b3b551b84
commit
a46fceeea6
1 changed files with 33 additions and 18 deletions
|
@ -61,7 +61,7 @@ namespace SourceGit.Views.Controls {
|
||||||
"FallbackLabel",
|
"FallbackLabel",
|
||||||
typeof(string),
|
typeof(string),
|
||||||
typeof(Avatar),
|
typeof(Avatar),
|
||||||
new PropertyMetadata("?"));
|
new PropertyMetadata("?", OnFallbackLabelChanged));
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 下载头像失败时显示的Label属性
|
/// 下载头像失败时显示的Label属性
|
||||||
|
@ -75,6 +75,9 @@ namespace SourceGit.Views.Controls {
|
||||||
private static Dictionary<string, BitmapImage> loaded = new Dictionary<string, BitmapImage>();
|
private static Dictionary<string, BitmapImage> loaded = new Dictionary<string, BitmapImage>();
|
||||||
private static Task loader = null;
|
private static Task loader = null;
|
||||||
|
|
||||||
|
private int colorIdx = 0;
|
||||||
|
private FormattedText label = null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 渲染实现
|
/// 渲染实现
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -82,17 +85,7 @@ namespace SourceGit.Views.Controls {
|
||||||
protected override void OnRender(DrawingContext dc) {
|
protected override void OnRender(DrawingContext dc) {
|
||||||
base.OnRender(dc);
|
base.OnRender(dc);
|
||||||
|
|
||||||
if (Source == null) {
|
if (Source == null && label != null) {
|
||||||
var placeholder = FallbackLabel.Length > 0 ? FallbackLabel.Substring(0, 1) : "?";
|
|
||||||
var formatted = new FormattedText(
|
|
||||||
placeholder,
|
|
||||||
CultureInfo.CurrentCulture,
|
|
||||||
FlowDirection.LeftToRight,
|
|
||||||
new Typeface(new FontFamily("Consolas"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal),
|
|
||||||
Width * 0.65,
|
|
||||||
Brushes.White,
|
|
||||||
VisualTreeHelper.GetDpi(this).PixelsPerDip);
|
|
||||||
|
|
||||||
var corner = Math.Max(2, Width / 16);
|
var corner = Math.Max(2, Width / 16);
|
||||||
var offsetX = (double)0;
|
var offsetX = (double)0;
|
||||||
if (HorizontalAlignment == HorizontalAlignment.Right) {
|
if (HorizontalAlignment == HorizontalAlignment.Right) {
|
||||||
|
@ -101,16 +94,38 @@ namespace SourceGit.Views.Controls {
|
||||||
offsetX = Width * 0.5;
|
offsetX = Width * 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
var chars = placeholder.ToCharArray();
|
Brush brush = BACKGROUND_BRUSHES[colorIdx];
|
||||||
var sum = 0;
|
|
||||||
foreach (var ch in chars) sum += Math.Abs(ch);
|
|
||||||
|
|
||||||
Brush brush = BACKGROUND_BRUSHES[sum % BACKGROUND_BRUSHES.Length];
|
|
||||||
dc.DrawRoundedRectangle(brush, null, new Rect(-Width * 0.5 + offsetX, -Height * 0.5, Width, Height), corner, corner);
|
dc.DrawRoundedRectangle(brush, null, new Rect(-Width * 0.5 + offsetX, -Height * 0.5, Width, Height), corner, corner);
|
||||||
dc.DrawText(formatted, new Point(formatted.Width * -0.5 + offsetX, formatted.Height * -0.5));
|
dc.DrawText(label, new Point(label.Width * -0.5 + offsetX, label.Height * -0.5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 显示文本变化时触发
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="d"></param>
|
||||||
|
/// <param name="e"></param>
|
||||||
|
private static void OnFallbackLabelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
|
||||||
|
Avatar a = d as Avatar;
|
||||||
|
if (a == null) return;
|
||||||
|
|
||||||
|
var placeholder = a.FallbackLabel.Length > 0 ? a.FallbackLabel.Substring(0, 1) : "?";
|
||||||
|
|
||||||
|
a.colorIdx = 0;
|
||||||
|
a.label = new FormattedText(
|
||||||
|
placeholder,
|
||||||
|
CultureInfo.CurrentCulture,
|
||||||
|
FlowDirection.LeftToRight,
|
||||||
|
new Typeface(new FontFamily("Consolas"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal),
|
||||||
|
a.Width * 0.65,
|
||||||
|
Brushes.White,
|
||||||
|
VisualTreeHelper.GetDpi(a).PixelsPerDip);
|
||||||
|
|
||||||
|
var chars = placeholder.ToCharArray();
|
||||||
|
foreach (var ch in chars) a.colorIdx += Math.Abs(ch);
|
||||||
|
a.colorIdx = a.colorIdx % BACKGROUND_BRUSHES.Length;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 邮件变化时触发
|
/// 邮件变化时触发
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in a new issue