Skip to content

Commit 8c4362a

Browse files
committed
feature: subject presenter supports inline codeblock
Signed-off-by: leo <[email protected]>
1 parent 9efbc7d commit 8c4362a

File tree

7 files changed

+280
-110
lines changed

7 files changed

+280
-110
lines changed

src/Models/Commit.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,6 @@ public void ParseDecorators(string data)
117117
public class CommitFullMessage
118118
{
119119
public string Message { get; set; } = string.Empty;
120-
public List<Hyperlink> Links { get; set; } = [];
120+
public List<InlineElement> Inlines { get; set; } = [];
121121
}
122122
}
Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
namespace SourceGit.Models
22
{
3-
public class Hyperlink
3+
public enum InlineElementType
44
{
5+
None = 0,
6+
Keyword,
7+
Link,
8+
CommitSHA,
9+
Code,
10+
}
11+
12+
public class InlineElement
13+
{
14+
public InlineElementType Type { get; set; } = InlineElementType.None;
515
public int Start { get; set; } = 0;
616
public int Length { get; set; } = 0;
717
public string Link { get; set; } = "";
8-
public bool IsCommitSHA { get; set; } = false;
918

10-
public Hyperlink(int start, int length, string link, bool isCommitSHA = false)
19+
public InlineElement(InlineElementType type, int start, int length, string link)
1120
{
21+
Type = type;
1222
Start = start;
1323
Length = length;
1424
Link = link;
15-
IsCommitSHA = isCommitSHA;
1625
}
1726

1827
public bool Intersect(int start, int length)

src/Models/IssueTrackerRule.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public string URLTemplate
4646
set => SetProperty(ref _urlTemplate, value);
4747
}
4848

49-
public void Matches(List<Hyperlink> outs, string message)
49+
public void Matches(List<InlineElement> outs, string message)
5050
{
5151
if (_regex == null || string.IsNullOrEmpty(_urlTemplate))
5252
return;
@@ -81,8 +81,7 @@ public void Matches(List<Hyperlink> outs, string message)
8181
link = link.Replace($"${j}", group.Value);
8282
}
8383

84-
var range = new Hyperlink(start, len, link);
85-
outs.Add(range);
84+
outs.Add(new InlineElement(InlineElementType.Link, start, len, link));
8685
}
8786
}
8887

src/ViewModels/CommitDetail.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -578,10 +578,10 @@ private void Refresh()
578578
Task.Run(() =>
579579
{
580580
var message = new Commands.QueryCommitFullMessage(_repo.FullPath, _commit.SHA).Result();
581-
var links = ParseLinksInMessage(message);
581+
var inlines = ParseInlinesInMessage(message);
582582

583583
if (!token.IsCancellationRequested)
584-
Dispatcher.UIThread.Invoke(() => FullMessage = new Models.CommitFullMessage { Message = message, Links = links });
584+
Dispatcher.UIThread.Invoke(() => FullMessage = new Models.CommitFullMessage { Message = message, Inlines = inlines });
585585
});
586586

587587
Task.Run(() =>
@@ -633,13 +633,13 @@ private void Refresh()
633633
});
634634
}
635635

636-
private List<Models.Hyperlink> ParseLinksInMessage(string message)
636+
private List<Models.InlineElement> ParseInlinesInMessage(string message)
637637
{
638-
var links = new List<Models.Hyperlink>();
638+
var inlines = new List<Models.InlineElement>();
639639
if (_repo.Settings.IssueTrackerRules is { Count: > 0 } rules)
640640
{
641641
foreach (var rule in rules)
642-
rule.Matches(links, message);
642+
rule.Matches(inlines, message);
643643
}
644644

645645
var matches = REG_SHA_FORMAT().Matches(message);
@@ -652,7 +652,7 @@ private void Refresh()
652652
var start = match.Index;
653653
var len = match.Length;
654654
var intersect = false;
655-
foreach (var link in links)
655+
foreach (var link in inlines)
656656
{
657657
if (link.Intersect(start, len))
658658
{
@@ -667,13 +667,13 @@ private void Refresh()
667667
var sha = match.Groups[1].Value;
668668
var isCommitSHA = new Commands.IsCommitSHA(_repo.FullPath, sha).Result();
669669
if (isCommitSHA)
670-
links.Add(new Models.Hyperlink(start, len, sha, true));
670+
inlines.Add(new Models.InlineElement(Models.InlineElementType.CommitSHA, start, len, sha));
671671
}
672672

673-
if (links.Count > 0)
674-
links.Sort((l, r) => l.Start - r.Start);
673+
if (inlines.Count > 0)
674+
inlines.Sort((l, r) => l.Start - r.Start);
675675

676-
return links;
676+
return inlines;
677677
}
678678

679679
private void RefreshVisibleChanges()

src/Views/CommitMessagePresenter.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
3939
if (string.IsNullOrEmpty(message))
4040
return;
4141

42-
var links = FullMessage?.Links;
42+
var links = FullMessage?.Inlines;
4343
if (links == null || links.Count == 0)
4444
{
4545
Inlines.Add(new Run(message));
@@ -54,7 +54,7 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
5454
inlines.Add(new Run(message.Substring(pos, link.Start - pos)));
5555

5656
var run = new Run(message.Substring(link.Start, link.Length));
57-
run.Classes.Add(link.IsCommitSHA ? "commit_link" : "issue_link");
57+
run.Classes.Add(link.Type == Models.InlineElementType.CommitSHA ? "commit_link" : "issue_link");
5858
inlines.Add(run);
5959

6060
pos = link.Start + link.Length;
@@ -87,7 +87,7 @@ protected override void OnPointerMoved(PointerEventArgs e)
8787
scrollViewer.LineDown();
8888
}
8989
}
90-
else if (FullMessage is { Links: { Count: > 0 } links })
90+
else if (FullMessage is { Inlines: { Count: > 0 } links })
9191
{
9292
var point = e.GetPosition(this) - new Point(Padding.Left, Padding.Top);
9393
var x = Math.Min(Math.Max(point.X, 0), Math.Max(TextLayout.WidthIncludingTrailingWhitespace, 0));
@@ -106,7 +106,7 @@ protected override void OnPointerMoved(PointerEventArgs e)
106106
SetCurrentValue(CursorProperty, Cursor.Parse("Hand"));
107107

108108
_lastHover = link;
109-
if (!link.IsCommitSHA)
109+
if (link.Type == Models.InlineElementType.Link)
110110
ToolTip.SetTip(this, link.Link);
111111
else
112112
ProcessHoverCommitLink(link);
@@ -127,7 +127,7 @@ protected override void OnPointerPressed(PointerPressedEventArgs e)
127127
var link = _lastHover.Link;
128128
e.Pointer.Capture(null);
129129

130-
if (_lastHover.IsCommitSHA)
130+
if (_lastHover.Type == Models.InlineElementType.CommitSHA)
131131
{
132132
var parentView = this.FindAncestorOfType<CommitBaseInfo>();
133133
if (parentView is { DataContext: ViewModels.CommitDetail detail })
@@ -252,7 +252,7 @@ protected override void OnPointerExited(PointerEventArgs e)
252252
ClearHoveredIssueLink();
253253
}
254254

255-
private void ProcessHoverCommitLink(Models.Hyperlink link)
255+
private void ProcessHoverCommitLink(Models.InlineElement link)
256256
{
257257
var sha = link.Link;
258258

@@ -301,7 +301,7 @@ private void ClearHoveredIssueLink()
301301
}
302302
}
303303

304-
private Models.Hyperlink _lastHover = null;
304+
private Models.InlineElement _lastHover = null;
305305
private Dictionary<string, Models.Commit> _inlineCommits = new();
306306
}
307307
}

0 commit comments

Comments
 (0)