feat: Add commit Tooltip in Blame (#1055)

Fixes #993
This commit is contained in:
GadflyFang 2025-03-05 09:36:32 +08:00 committed by GitHub
parent 5e898a809e
commit 269903503f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 62 additions and 15 deletions

View file

@ -57,6 +57,11 @@ namespace SourceGit.ViewModels
}
}
public Models.Commit GetCommitInfo(string commitSHA)
{
return new Commands.QuerySingleCommit(_repo, commitSHA).Result();
}
private readonly string _repo;
private Models.BlameData _data = null;
}

View file

@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:m="using:SourceGit.Models"
xmlns:vm="using:SourceGit.ViewModels"
xmlns:v="using:SourceGit.Views"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
@ -59,7 +60,21 @@
FontFamily="{DynamicResource Fonts.Monospace}"
FontSize="{Binding Source={x:Static vm:Preferences.Instance}, Path=EditorFontSize}"
TabWidth="{Binding Source={x:Static vm:Preferences.Instance}, Path=EditorTabWidth}"
BlameData="{Binding Data}"/>
BlameData="{Binding Data}">
<v:BlameTextEditor.DataTemplates>
<DataTemplate DataType="m:Commit">
<StackPanel MinWidth="400" Orientation="Vertical">
<Grid ColumnDefinitions="Auto,*,Auto">
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
</Grid>
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
</StackPanel>
</DataTemplate>
</v:BlameTextEditor.DataTemplates>
</v:BlameTextEditor>
<!-- Not supported mask (for binary files) -->
<StackPanel Orientation="Vertical"

View file

@ -1,13 +1,13 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Media;
using Avalonia.Threading;
using AvaloniaEdit;
using AvaloniaEdit.Document;
using AvaloniaEdit.Editing;
@ -162,7 +162,8 @@ namespace SourceGit.Views
break;
var info = _editor.BlameData.LineInfos[lineNumber - 1];
var y = line.GetTextLineVisualYPosition(line.TextLines[0], VisualYPosition.TextTop) - view.VerticalOffset;
var y = line.GetTextLineVisualYPosition(line.TextLines[0], VisualYPosition.TextTop)
- view.VerticalOffset;
var shaLink = new FormattedText(
info.CommitSHA,
CultureInfo.CurrentCulture,
@ -175,12 +176,38 @@ namespace SourceGit.Views
if (rect.Contains(pos))
{
Cursor = Cursor.Parse("Hand");
// check if the tooltip is already set
var tooltip = ToolTip.GetTip(this);
if (tooltip is Models.Commit existedCommit && existedCommit.SHA == info.CommitSHA)
return;
if (DataContext is ViewModels.Blame blame)
{
Task.Run(() =>
{
var commit = blame.GetCommitInfo(info.CommitSHA);
if (commit == null)
return;
Dispatcher.UIThread.Invoke(() =>
{
if (IsEffectivelyVisible && IsPointerOver)
{
ToolTip.SetTip(this, commit);
ToolTip.SetIsOpen(this, true);
}
});
});
}
return;
}
}
Cursor = Cursor.Default;
ToolTip.SetIsOpen(this, false);
}
}
protected override void OnPointerPressed(PointerPressedEventArgs e)
@ -230,9 +257,9 @@ namespace SourceGit.Views
private readonly BlameTextEditor _editor = null;
}
public class VerticalSeperatorMargin : AbstractMargin
public class VerticalSeparatorMargin : AbstractMargin
{
public VerticalSeperatorMargin(BlameTextEditor editor)
public VerticalSeparatorMargin(BlameTextEditor editor)
{
_editor = editor;
}
@ -284,9 +311,9 @@ namespace SourceGit.Views
_textMate = Models.TextMateHelper.CreateForEditor(this);
TextArea.LeftMargins.Add(new LineNumberMargin() { Margin = new Thickness(8, 0) });
TextArea.LeftMargins.Add(new VerticalSeperatorMargin(this));
TextArea.LeftMargins.Add(new VerticalSeparatorMargin(this));
TextArea.LeftMargins.Add(new CommitInfoMargin(this) { Margin = new Thickness(8, 0) });
TextArea.LeftMargins.Add(new VerticalSeperatorMargin(this));
TextArea.LeftMargins.Add(new VerticalSeparatorMargin(this));
TextArea.Caret.PositionChanged += OnTextAreaCaretPositionChanged;
TextArea.LayoutUpdated += OnTextAreaLayoutUpdated;
TextArea.PointerWheelChanged += OnTextAreaPointerWheelChanged;

View file

@ -60,7 +60,7 @@ namespace SourceGit.Views
public class ThemedTextDiffPresenter : TextEditor
{
public class VerticalSeperatorMargin : AbstractMargin
public class VerticalSeparatorMargin : AbstractMargin
{
public override void Render(DrawingContext context)
{
@ -1085,9 +1085,9 @@ namespace SourceGit.Views
public CombinedTextDiffPresenter() : base(new TextArea(), new TextDocument())
{
TextArea.LeftMargins.Add(new LineNumberMargin(false, true));
TextArea.LeftMargins.Add(new VerticalSeperatorMargin());
TextArea.LeftMargins.Add(new VerticalSeparatorMargin());
TextArea.LeftMargins.Add(new LineNumberMargin(false, false));
TextArea.LeftMargins.Add(new VerticalSeperatorMargin());
TextArea.LeftMargins.Add(new VerticalSeparatorMargin());
TextArea.LeftMargins.Add(new LineModifyTypeMargin());
}
@ -1286,7 +1286,7 @@ namespace SourceGit.Views
public SingleSideTextDiffPresenter() : base(new TextArea(), new TextDocument())
{
TextArea.LeftMargins.Add(new LineNumberMargin(true, false));
TextArea.LeftMargins.Add(new VerticalSeperatorMargin());
TextArea.LeftMargins.Add(new VerticalSeparatorMargin());
TextArea.LeftMargins.Add(new LineModifyTypeMargin());
}