Skip to content

Commit 03160d3

Browse files
committed
refactor: move context menu creation from ViewModels to Views (PART 6)
Signed-off-by: leo <longshuang@msn.cn>
1 parent dd00d0e commit 03160d3

File tree

4 files changed

+119
-122
lines changed

4 files changed

+119
-122
lines changed

src/ViewModels/Repository.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1564,7 +1564,7 @@ public void OpenWorktree(Models.Worktree worktree)
15641564
IsRepository = true,
15651565
};
15661566

1567-
App.GetLauncher()?.OpenRepositoryInTab(node, null);
1567+
App.GetLauncher().OpenRepositoryInTab(node, null);
15681568
}
15691569

15701570
public async Task LockWorktreeAsync(Models.Worktree worktree)

src/ViewModels/RepositoryNode.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,18 @@ public List<RepositoryNode> SubNodes
6868
set;
6969
} = [];
7070

71+
public void OpenOrInit()
72+
{
73+
if (IsRepository)
74+
{
75+
App.GetLauncher().OpenRepositoryInTab(this, null);
76+
return;
77+
}
78+
79+
foreach (var subNode in SubNodes)
80+
subNode.OpenOrInit();
81+
}
82+
7183
public void Edit()
7284
{
7385
var activePage = App.GetLauncher().ActivePage;
@@ -82,6 +94,13 @@ public void AddSubFolder()
8294
activePage.Popup = new CreateGroup(this);
8395
}
8496

97+
public void Move()
98+
{
99+
var activePage = App.GetLauncher().ActivePage;
100+
if (activePage != null && activePage.CanCreatePopup())
101+
activePage.Popup = new MoveRepositoryNode(this);
102+
}
103+
85104
public void OpenInFileManager()
86105
{
87106
if (!IsRepository)

src/ViewModels/Welcome.cs

Lines changed: 0 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
using System.IO;
44

55
using Avalonia.Collections;
6-
using Avalonia.Controls;
7-
86
using CommunityToolkit.Mvvm.ComponentModel;
97

108
namespace SourceGit.ViewModels
@@ -198,111 +196,6 @@ public void MoveNode(RepositoryNode from, RepositoryNode to)
198196
Refresh();
199197
}
200198

201-
public ContextMenu CreateContextMenu(RepositoryNode node)
202-
{
203-
var menu = new ContextMenu();
204-
205-
if (!node.IsRepository && node.SubNodes.Count > 0)
206-
{
207-
var openAll = new MenuItem();
208-
openAll.Header = App.Text("Welcome.OpenAllInNode");
209-
openAll.Icon = App.CreateMenuIcon("Icons.Folder.Open");
210-
openAll.Click += (_, e) =>
211-
{
212-
OpenAllInNode(App.GetLauncher(), node);
213-
e.Handled = true;
214-
};
215-
216-
menu.Items.Add(openAll);
217-
menu.Items.Add(new MenuItem() { Header = "-" });
218-
}
219-
220-
if (node.IsRepository)
221-
{
222-
var open = new MenuItem();
223-
open.Header = App.Text("Welcome.OpenOrInit");
224-
open.Icon = App.CreateMenuIcon("Icons.Folder.Open");
225-
open.Click += (_, e) =>
226-
{
227-
App.GetLauncher()?.OpenRepositoryInTab(node, null);
228-
e.Handled = true;
229-
};
230-
231-
var explore = new MenuItem();
232-
explore.Header = App.Text("Repository.Explore");
233-
explore.Icon = App.CreateMenuIcon("Icons.Explore");
234-
explore.Click += (_, e) =>
235-
{
236-
node.OpenInFileManager();
237-
e.Handled = true;
238-
};
239-
240-
var terminal = new MenuItem();
241-
terminal.Header = App.Text("Repository.Terminal");
242-
terminal.Icon = App.CreateMenuIcon("Icons.Terminal");
243-
terminal.Click += (_, e) =>
244-
{
245-
node.OpenTerminal();
246-
e.Handled = true;
247-
};
248-
249-
menu.Items.Add(open);
250-
menu.Items.Add(new MenuItem() { Header = "-" });
251-
menu.Items.Add(explore);
252-
menu.Items.Add(terminal);
253-
menu.Items.Add(new MenuItem() { Header = "-" });
254-
}
255-
else
256-
{
257-
var addSubFolder = new MenuItem();
258-
addSubFolder.Header = App.Text("Welcome.AddSubFolder");
259-
addSubFolder.Icon = App.CreateMenuIcon("Icons.Folder.Add");
260-
addSubFolder.Click += (_, e) =>
261-
{
262-
node.AddSubFolder();
263-
e.Handled = true;
264-
};
265-
menu.Items.Add(addSubFolder);
266-
}
267-
268-
var edit = new MenuItem();
269-
edit.Header = App.Text("Welcome.Edit");
270-
edit.Icon = App.CreateMenuIcon("Icons.Edit");
271-
edit.Click += (_, e) =>
272-
{
273-
node.Edit();
274-
e.Handled = true;
275-
};
276-
277-
var move = new MenuItem();
278-
move.Header = App.Text("Welcome.Move");
279-
move.Icon = App.CreateMenuIcon("Icons.MoveTo");
280-
move.Click += (_, e) =>
281-
{
282-
var activePage = App.GetLauncher().ActivePage;
283-
if (activePage != null && activePage.CanCreatePopup())
284-
activePage.Popup = new MoveRepositoryNode(node);
285-
286-
e.Handled = true;
287-
};
288-
289-
var delete = new MenuItem();
290-
delete.Header = App.Text("Welcome.Delete");
291-
delete.Icon = App.CreateMenuIcon("Icons.Clear");
292-
delete.Click += (_, e) =>
293-
{
294-
node.Delete();
295-
e.Handled = true;
296-
};
297-
298-
menu.Items.Add(edit);
299-
menu.Items.Add(move);
300-
menu.Items.Add(new MenuItem() { Header = "-" });
301-
menu.Items.Add(delete);
302-
303-
return menu;
304-
}
305-
306199
private void ResetVisibility(RepositoryNode node)
307200
{
308201
node.IsVisible = true;
@@ -355,17 +248,6 @@ private void MakeTreeRows(List<RepositoryNode> rows, List<RepositoryNode> nodes,
355248
}
356249
}
357250

358-
private void OpenAllInNode(Launcher launcher, RepositoryNode node)
359-
{
360-
foreach (var subNode in node.SubNodes)
361-
{
362-
if (subNode.IsRepository)
363-
launcher.OpenRepositoryInTab(subNode, null);
364-
else if (subNode.SubNodes.Count > 0)
365-
OpenAllInNode(launcher, subNode);
366-
}
367-
}
368-
369251
private string _searchFilter = string.Empty;
370252
}
371253
}

src/Views/Welcome.axaml.cs

Lines changed: 99 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,106 @@ private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs
112112
{
113113
if (sender is Grid { DataContext: ViewModels.RepositoryNode node } grid)
114114
{
115-
var menu = ViewModels.Welcome.Instance.CreateContextMenu(node);
116-
menu?.Open(grid);
117-
e.Handled = true;
115+
var menu = new ContextMenu();
116+
117+
if (!node.IsRepository && node.SubNodes.Count > 0)
118+
{
119+
var openAll = new MenuItem();
120+
openAll.Header = App.Text("Welcome.OpenAllInNode");
121+
openAll.Icon = App.CreateMenuIcon("Icons.Folder.Open");
122+
openAll.Click += (_, e) =>
123+
{
124+
node.OpenOrInit();
125+
e.Handled = true;
126+
};
127+
128+
menu.Items.Add(openAll);
129+
menu.Items.Add(new MenuItem() { Header = "-" });
130+
}
131+
132+
if (node.IsRepository)
133+
{
134+
var open = new MenuItem();
135+
open.Header = App.Text("Welcome.OpenOrInit");
136+
open.Icon = App.CreateMenuIcon("Icons.Folder.Open");
137+
open.Click += (_, e) =>
138+
{
139+
node.OpenOrInit();
140+
e.Handled = true;
141+
};
142+
143+
var explore = new MenuItem();
144+
explore.Header = App.Text("Repository.Explore");
145+
explore.Icon = App.CreateMenuIcon("Icons.Explore");
146+
explore.Click += (_, e) =>
147+
{
148+
node.OpenInFileManager();
149+
e.Handled = true;
150+
};
151+
152+
var terminal = new MenuItem();
153+
terminal.Header = App.Text("Repository.Terminal");
154+
terminal.Icon = App.CreateMenuIcon("Icons.Terminal");
155+
terminal.Click += (_, e) =>
156+
{
157+
node.OpenTerminal();
158+
e.Handled = true;
159+
};
160+
161+
menu.Items.Add(open);
162+
menu.Items.Add(new MenuItem() { Header = "-" });
163+
menu.Items.Add(explore);
164+
menu.Items.Add(terminal);
165+
menu.Items.Add(new MenuItem() { Header = "-" });
166+
}
167+
else
168+
{
169+
var addSubFolder = new MenuItem();
170+
addSubFolder.Header = App.Text("Welcome.AddSubFolder");
171+
addSubFolder.Icon = App.CreateMenuIcon("Icons.Folder.Add");
172+
addSubFolder.Click += (_, e) =>
173+
{
174+
node.AddSubFolder();
175+
e.Handled = true;
176+
};
177+
menu.Items.Add(addSubFolder);
178+
}
179+
180+
var edit = new MenuItem();
181+
edit.Header = App.Text("Welcome.Edit");
182+
edit.Icon = App.CreateMenuIcon("Icons.Edit");
183+
edit.Click += (_, e) =>
184+
{
185+
node.Edit();
186+
e.Handled = true;
187+
};
188+
189+
var move = new MenuItem();
190+
move.Header = App.Text("Welcome.Move");
191+
move.Icon = App.CreateMenuIcon("Icons.MoveTo");
192+
move.Click += (_, e) =>
193+
{
194+
node.Move();
195+
e.Handled = true;
196+
};
197+
198+
var delete = new MenuItem();
199+
delete.Header = App.Text("Welcome.Delete");
200+
delete.Icon = App.CreateMenuIcon("Icons.Clear");
201+
delete.Click += (_, e) =>
202+
{
203+
node.Delete();
204+
e.Handled = true;
205+
};
206+
207+
menu.Items.Add(edit);
208+
menu.Items.Add(move);
209+
menu.Items.Add(new MenuItem() { Header = "-" });
210+
menu.Items.Add(delete);
211+
menu.Open(grid);
118212
}
213+
214+
e.Handled = true;
119215
}
120216

121217
private void OnPointerPressedTreeNode(object sender, PointerPressedEventArgs e)

0 commit comments

Comments
 (0)