Skip to content

Commit 2699035

Browse files
authored
feat: Add commit Tooltip in Blame (#1055)
Fixes #993
1 parent 5e898a8 commit 2699035

File tree

4 files changed

+62
-15
lines changed

4 files changed

+62
-15
lines changed

src/ViewModels/Blame.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ public void NavigateToCommit(string commitSHA)
5757
}
5858
}
5959

60+
public Models.Commit GetCommitInfo(string commitSHA)
61+
{
62+
return new Commands.QuerySingleCommit(_repo, commitSHA).Result();
63+
}
64+
6065
private readonly string _repo;
6166
private Models.BlameData _data = null;
6267
}

src/Views/Blame.axaml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
33
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
44
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:m="using:SourceGit.Models"
56
xmlns:vm="using:SourceGit.ViewModels"
67
xmlns:v="using:SourceGit.Views"
78
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
@@ -59,8 +60,22 @@
5960
FontFamily="{DynamicResource Fonts.Monospace}"
6061
FontSize="{Binding Source={x:Static vm:Preferences.Instance}, Path=EditorFontSize}"
6162
TabWidth="{Binding Source={x:Static vm:Preferences.Instance}, Path=EditorTabWidth}"
62-
BlameData="{Binding Data}"/>
63-
63+
BlameData="{Binding Data}">
64+
<v:BlameTextEditor.DataTemplates>
65+
<DataTemplate DataType="m:Commit">
66+
<StackPanel MinWidth="400" Orientation="Vertical">
67+
<Grid ColumnDefinitions="Auto,*,Auto">
68+
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
69+
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
70+
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
71+
</Grid>
72+
73+
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
74+
</StackPanel>
75+
</DataTemplate>
76+
</v:BlameTextEditor.DataTemplates>
77+
</v:BlameTextEditor>
78+
6479
<!-- Not supported mask (for binary files) -->
6580
<StackPanel Orientation="Vertical"
6681
HorizontalAlignment="Center" VerticalAlignment="Center"

src/Views/Blame.axaml.cs

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Globalization;
4-
4+
using System.Threading.Tasks;
55
using Avalonia;
66
using Avalonia.Controls;
77
using Avalonia.Input;
88
using Avalonia.Interactivity;
99
using Avalonia.Media;
10-
10+
using Avalonia.Threading;
1111
using AvaloniaEdit;
1212
using AvaloniaEdit.Document;
1313
using AvaloniaEdit.Editing;
@@ -162,7 +162,8 @@ protected override void OnPointerMoved(PointerEventArgs e)
162162
break;
163163

164164
var info = _editor.BlameData.LineInfos[lineNumber - 1];
165-
var y = line.GetTextLineVisualYPosition(line.TextLines[0], VisualYPosition.TextTop) - view.VerticalOffset;
165+
var y = line.GetTextLineVisualYPosition(line.TextLines[0], VisualYPosition.TextTop)
166+
- view.VerticalOffset;
166167
var shaLink = new FormattedText(
167168
info.CommitSHA,
168169
CultureInfo.CurrentCulture,
@@ -175,12 +176,38 @@ protected override void OnPointerMoved(PointerEventArgs e)
175176
if (rect.Contains(pos))
176177
{
177178
Cursor = Cursor.Parse("Hand");
179+
180+
// check if the tooltip is already set
181+
var tooltip = ToolTip.GetTip(this);
182+
if (tooltip is Models.Commit existedCommit && existedCommit.SHA == info.CommitSHA)
183+
return;
184+
185+
if (DataContext is ViewModels.Blame blame)
186+
{
187+
Task.Run(() =>
188+
{
189+
var commit = blame.GetCommitInfo(info.CommitSHA);
190+
if (commit == null)
191+
return;
192+
193+
Dispatcher.UIThread.Invoke(() =>
194+
{
195+
if (IsEffectivelyVisible && IsPointerOver)
196+
{
197+
ToolTip.SetTip(this, commit);
198+
ToolTip.SetIsOpen(this, true);
199+
}
200+
});
201+
});
202+
}
203+
178204
return;
179205
}
180206
}
181-
}
182207

183-
Cursor = Cursor.Default;
208+
Cursor = Cursor.Default;
209+
ToolTip.SetIsOpen(this, false);
210+
}
184211
}
185212

186213
protected override void OnPointerPressed(PointerPressedEventArgs e)
@@ -230,9 +257,9 @@ protected override void OnPointerPressed(PointerPressedEventArgs e)
230257
private readonly BlameTextEditor _editor = null;
231258
}
232259

233-
public class VerticalSeperatorMargin : AbstractMargin
260+
public class VerticalSeparatorMargin : AbstractMargin
234261
{
235-
public VerticalSeperatorMargin(BlameTextEditor editor)
262+
public VerticalSeparatorMargin(BlameTextEditor editor)
236263
{
237264
_editor = editor;
238265
}
@@ -284,9 +311,9 @@ public int TabWidth
284311
_textMate = Models.TextMateHelper.CreateForEditor(this);
285312

286313
TextArea.LeftMargins.Add(new LineNumberMargin() { Margin = new Thickness(8, 0) });
287-
TextArea.LeftMargins.Add(new VerticalSeperatorMargin(this));
314+
TextArea.LeftMargins.Add(new VerticalSeparatorMargin(this));
288315
TextArea.LeftMargins.Add(new CommitInfoMargin(this) { Margin = new Thickness(8, 0) });
289-
TextArea.LeftMargins.Add(new VerticalSeperatorMargin(this));
316+
TextArea.LeftMargins.Add(new VerticalSeparatorMargin(this));
290317
TextArea.Caret.PositionChanged += OnTextAreaCaretPositionChanged;
291318
TextArea.LayoutUpdated += OnTextAreaLayoutUpdated;
292319
TextArea.PointerWheelChanged += OnTextAreaPointerWheelChanged;

src/Views/TextDiffView.axaml.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public TextDiffViewRange(int startIdx, int endIdx)
6060

6161
public class ThemedTextDiffPresenter : TextEditor
6262
{
63-
public class VerticalSeperatorMargin : AbstractMargin
63+
public class VerticalSeparatorMargin : AbstractMargin
6464
{
6565
public override void Render(DrawingContext context)
6666
{
@@ -1085,9 +1085,9 @@ public class CombinedTextDiffPresenter : ThemedTextDiffPresenter
10851085
public CombinedTextDiffPresenter() : base(new TextArea(), new TextDocument())
10861086
{
10871087
TextArea.LeftMargins.Add(new LineNumberMargin(false, true));
1088-
TextArea.LeftMargins.Add(new VerticalSeperatorMargin());
1088+
TextArea.LeftMargins.Add(new VerticalSeparatorMargin());
10891089
TextArea.LeftMargins.Add(new LineNumberMargin(false, false));
1090-
TextArea.LeftMargins.Add(new VerticalSeperatorMargin());
1090+
TextArea.LeftMargins.Add(new VerticalSeparatorMargin());
10911091
TextArea.LeftMargins.Add(new LineModifyTypeMargin());
10921092
}
10931093

@@ -1286,7 +1286,7 @@ public class SingleSideTextDiffPresenter : ThemedTextDiffPresenter
12861286
public SingleSideTextDiffPresenter() : base(new TextArea(), new TextDocument())
12871287
{
12881288
TextArea.LeftMargins.Add(new LineNumberMargin(true, false));
1289-
TextArea.LeftMargins.Add(new VerticalSeperatorMargin());
1289+
TextArea.LeftMargins.Add(new VerticalSeparatorMargin());
12901290
TextArea.LeftMargins.Add(new LineModifyTypeMargin());
12911291
}
12921292

0 commit comments

Comments
 (0)