Skip to content

Commit c134337

Browse files
committed
refactor: rewrite the way to register git command log receiver
Signed-off-by: leo <[email protected]>
1 parent bd81ccd commit c134337

File tree

5 files changed

+50
-31
lines changed

5 files changed

+50
-31
lines changed

src/Models/ICommandLog.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
namespace SourceGit.Models
22
{
3+
public interface ICommandLogReceiver
4+
{
5+
void OnReceiveCommandLog(string line);
6+
}
7+
38
public interface ICommandLog
49
{
510
void AppendLine(string line);

src/ViewModels/CommandLog.cs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Text;
34
using Avalonia.Threading;
45
using CommunityToolkit.Mvvm.ComponentModel;
@@ -43,10 +44,14 @@ public CommandLog(string name)
4344
Name = name;
4445
}
4546

46-
public void Register(Action<string> handler)
47+
public void Subscribe(Models.ICommandLogReceiver receiver)
4748
{
48-
if (!IsComplete)
49-
_onNewLineReceived += handler;
49+
_receivers.Add(receiver);
50+
}
51+
52+
public void Unsubscribe(Models.ICommandLogReceiver receiver)
53+
{
54+
_receivers.Remove(receiver);
5055
}
5156

5257
public void AppendLine(string line = null)
@@ -59,7 +64,9 @@ public void AppendLine(string line = null)
5964
{
6065
var newline = line ?? string.Empty;
6166
_builder.AppendLine(newline);
62-
_onNewLineReceived?.Invoke(newline);
67+
68+
foreach (var receiver in _receivers)
69+
receiver.OnReceiveCommandLog(newline);
6370
}
6471
}
6572

@@ -76,20 +83,14 @@ public void Complete()
7683

7784
_content = _builder.ToString();
7885
_builder.Clear();
86+
_receivers.Clear();
7987
_builder = null;
8088

8189
OnPropertyChanged(nameof(IsComplete));
82-
83-
if (_onNewLineReceived != null)
84-
{
85-
var dumpHandlers = _onNewLineReceived.GetInvocationList();
86-
foreach (var d in dumpHandlers)
87-
_onNewLineReceived -= (Action<string>)d;
88-
}
8990
}
9091

9192
private string _content = string.Empty;
9293
private StringBuilder _builder = new StringBuilder();
93-
private event Action<string> _onNewLineReceived;
94+
private List<Models.ICommandLogReceiver> _receivers = new List<Models.ICommandLogReceiver>();
9495
}
9596
}

src/ViewModels/LauncherPage.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,10 @@ public async void ProcessPopup()
110110
{
111111
var finished = await dump.Sure();
112112
if (finished)
113+
{
114+
dump.Cleanup();
113115
Popup = null;
116+
}
114117
}
115118
catch (Exception e)
116119
{

src/ViewModels/Popup.cs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace SourceGit.ViewModels
66
{
7-
public class Popup : ObservableValidator
7+
public class Popup : ObservableValidator, Models.ICommandLogReceiver
88
{
99
public bool InProgress
1010
{
@@ -27,6 +27,18 @@ public bool Check()
2727
return !HasErrors;
2828
}
2929

30+
public void OnReceiveCommandLog(string data)
31+
{
32+
var desc = data.Trim();
33+
if (!string.IsNullOrEmpty(desc))
34+
ProgressDescription = desc;
35+
}
36+
37+
public void Cleanup()
38+
{
39+
_log?.Unsubscribe(this);
40+
}
41+
3042
public virtual bool CanStartDirectly()
3143
{
3244
return true;
@@ -39,17 +51,12 @@ public virtual Task<bool> Sure()
3951

4052
protected void Use(CommandLog log)
4153
{
42-
log.Register(SetDescription);
43-
}
44-
45-
private void SetDescription(string data)
46-
{
47-
var desc = data.Trim();
48-
if (!string.IsNullOrEmpty(desc))
49-
ProgressDescription = desc;
54+
_log = log;
55+
_log.Subscribe(this);
5056
}
5157

5258
private bool _inProgress = false;
5359
private string _progressDescription = string.Empty;
60+
private CommandLog _log = null;
5461
}
5562
}

src/Views/CommandLogContentPresenter.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
namespace SourceGit.Views
1616
{
17-
public class CommandLogContentPresenter : TextEditor
17+
public class CommandLogContentPresenter : TextEditor, Models.ICommandLogReceiver
1818
{
1919
public class LineStyleTransformer : DocumentColorizingTransformer
2020
{
@@ -95,6 +95,12 @@ public string PureText
9595
TextArea.TextView.Options.EnableEmailHyperlinks = false;
9696
}
9797

98+
public void OnReceiveCommandLog(string line)
99+
{
100+
AppendText("\n");
101+
AppendText(line);
102+
}
103+
98104
protected override void OnLoaded(RoutedEventArgs e)
99105
{
100106
base.OnLoaded(e);
@@ -126,10 +132,13 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
126132

127133
if (change.Property == LogProperty)
128134
{
129-
if (change.NewValue is ViewModels.CommandLog log)
135+
if (change.OldValue is ViewModels.CommandLog oldLog)
136+
oldLog.Unsubscribe(this);
137+
138+
if (change.NewValue is ViewModels.CommandLog newLog)
130139
{
131-
Text = log.Content;
132-
log.Register(OnLogLineReceived);
140+
Text = newLog.Content;
141+
newLog.Subscribe(this);
133142
}
134143
else
135144
{
@@ -143,12 +152,6 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
143152
}
144153
}
145154

146-
private void OnLogLineReceived(string newline)
147-
{
148-
AppendText("\n");
149-
AppendText(newline);
150-
}
151-
152155
private TextMate.Installation _textMate = null;
153156
}
154157
}

0 commit comments

Comments
 (0)