Skip to content

Commit 0dea7ed

Browse files
committed
fix: context menu did NOT closed after its placement target being recycled (#140)
1 parent e9208ef commit 0dea7ed

11 files changed

+54
-38
lines changed

src/Views/Blame.axaml.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,8 @@ private void OnTextViewContextRequested(object sender, ContextRequestedEventArgs
299299

300300
var menu = new ContextMenu();
301301
menu.Items.Add(copy);
302-
menu.Open(TextArea.TextView);
302+
303+
TextArea.TextView.OpenContextMenu(menu);
303304
e.Handled = true;
304305
}
305306

src/Views/CommitChanges.axaml.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ private void OnDataGridContextRequested(object sender, ContextRequestedEventArgs
2424
{
2525
var detail = DataContext as ViewModels.CommitDetail;
2626
var menu = detail.CreateChangeContextMenu(datagrid.SelectedItem as Models.Change);
27-
menu.Open(datagrid);
27+
datagrid.OpenContextMenu(menu);
2828
}
2929

3030
e.Handled = true;
@@ -39,7 +39,7 @@ private void OnTreeViewContextRequested(object sender, ContextRequestedEventArgs
3939
if (node != null && !node.IsFolder)
4040
{
4141
var menu = detail.CreateChangeContextMenu(node.Backend as Models.Change);
42-
menu.Open(view);
42+
view.OpenContextMenu(menu);
4343
}
4444
}
4545

src/Views/CommitDetail.axaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ private void OnChangeListContextRequested(object sender, ContextRequestedEventAr
3333
}
3434

3535
var menu = detail.CreateChangeContextMenu(datagrid.SelectedItem as Models.Change);
36-
menu.Open(datagrid);
36+
datagrid.OpenContextMenu(menu);
3737
}
3838
e.Handled = true;
3939
}

src/Views/ContextMenuExtension.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
using System.ComponentModel;
3+
4+
using Avalonia.Controls;
5+
6+
namespace SourceGit.Views
7+
{
8+
public static class ContextMenuExtension
9+
{
10+
public static void OpenContextMenu(this Control control, ContextMenu menu)
11+
{
12+
menu.PlacementTarget = control;
13+
menu.Closing += OnContextMenuClosing; // Clear context menu because it is dynamic.
14+
15+
control.ContextMenu = menu;
16+
control.ContextMenu.Open();
17+
}
18+
19+
private static void OnContextMenuClosing(object sender, CancelEventArgs e)
20+
{
21+
if (sender is ContextMenu menu && menu.PlacementTarget != null)
22+
menu.PlacementTarget.ContextMenu = null;
23+
}
24+
}
25+
}

src/Views/Histories.axaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ private void OnCommitDataGridContextRequested(object sender, ContextRequestedEve
300300
if (DataContext is ViewModels.Histories histories)
301301
{
302302
var menu = histories.MakeContextMenu();
303-
menu?.Open(sender as Control);
303+
(sender as Control)?.OpenContextMenu(menu);
304304
}
305305
e.Handled = true;
306306
}

src/Views/Repository.axaml.cs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,8 @@ private void OnOpenWithExternalTools(object sender, RoutedEventArgs e)
6666
if (sender is Button button && DataContext is ViewModels.Repository repo)
6767
{
6868
var menu = repo.CreateContextMenuForExternalTools();
69-
if (menu != null)
70-
{
71-
menu.Open(button);
72-
e.Handled = true;
73-
}
69+
button.OpenContextMenu(menu);
70+
e.Handled = true;
7471
}
7572
}
7673

@@ -201,8 +198,7 @@ private void OnLocalBranchContextMenuRequested(object sender, ContextRequestedEv
201198
if (node.IsBranch && DataContext is ViewModels.Repository repo)
202199
{
203200
var menu = repo.CreateContextMenuForLocalBranch(node.Backend as Models.Branch);
204-
if (menu != null)
205-
menu.Open(grid);
201+
grid.OpenContextMenu(menu);
206202
}
207203
}
208204

@@ -218,14 +214,12 @@ private void OnRemoteBranchContextMenuRequested(object sender, ContextRequestedE
218214
if (node.IsRemote)
219215
{
220216
var menu = repo.CreateContextMenuForRemote(node.Backend as Models.Remote);
221-
if (menu != null)
222-
menu.Open(grid);
217+
grid.OpenContextMenu(menu);
223218
}
224219
else if (node.IsBranch)
225220
{
226221
var menu = repo.CreateContextMenuForRemoteBranch(node.Backend as Models.Branch);
227-
if (menu != null)
228-
menu.Open(grid);
222+
grid.OpenContextMenu(menu);
229223
}
230224
}
231225

@@ -238,8 +232,7 @@ private void OnTagContextRequested(object sender, ContextRequestedEventArgs e)
238232
{
239233
var tag = datagrid.SelectedItem as Models.Tag;
240234
var menu = repo.CreateContextMenuForTag(tag);
241-
if (menu != null)
242-
menu.Open(datagrid);
235+
datagrid.OpenContextMenu(menu);
243236
}
244237

245238
e.Handled = true;
@@ -251,8 +244,7 @@ private void OnSubmoduleContextRequested(object sender, ContextRequestedEventArg
251244
{
252245
var submodule = datagrid.SelectedItem as string;
253246
var menu = repo.CreateContextMenuForSubmodule(submodule);
254-
if (menu != null)
255-
menu.Open(datagrid);
247+
datagrid.OpenContextMenu(menu);
256248
}
257249

258250
e.Handled = true;
@@ -263,8 +255,7 @@ private void OpenGitFlowMenu(object sender, RoutedEventArgs e)
263255
if (DataContext is ViewModels.Repository repo)
264256
{
265257
var menu = repo.CreateContextMenuForGitFlow();
266-
if (menu != null)
267-
menu.Open(sender as Button);
258+
(sender as Control)?.OpenContextMenu(menu);
268259
}
269260

270261
e.Handled = true;

src/Views/RevisionCompare.axaml.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ private void OnDataGridContextRequested(object sender, ContextRequestedEventArgs
2525
{
2626
var compare = DataContext as ViewModels.RevisionCompare;
2727
var menu = compare.CreateChangeContextMenu(datagrid.SelectedItem as Models.Change);
28-
menu.Open(datagrid);
28+
datagrid.OpenContextMenu(menu);
2929
}
3030

3131
e.Handled = true;
@@ -40,7 +40,7 @@ private void OnTreeViewContextRequested(object sender, ContextRequestedEventArgs
4040
if (node != null && !node.IsFolder)
4141
{
4242
var menu = compare.CreateChangeContextMenu(node.Backend as Models.Change);
43-
menu.Open(view);
43+
view.OpenContextMenu(menu);
4444
}
4545
}
4646

src/Views/RevisionFiles.axaml.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ private void OnTextViewContextRequested(object sender, ContextRequestedEventArgs
198198

199199
var menu = new ContextMenu();
200200
menu.Items.Add(copy);
201-
menu.Open(TextArea.TextView);
201+
202+
TextArea.TextView.OpenContextMenu(menu);
202203
e.Handled = true;
203204
}
204205

@@ -219,7 +220,7 @@ private void OnTreeViewContextRequested(object sender, ContextRequestedEventArgs
219220
if (!node.IsFolder)
220221
{
221222
var menu = detail.CreateRevisionFileContextMenu(node.Backend as Models.Object);
222-
menu.Open(sender as Control);
223+
(sender as Control)?.OpenContextMenu(menu);
223224
}
224225

225226
e.Handled = true;

src/Views/TextDiffView.axaml.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,8 @@ private void OnTextViewContextRequested(object sender, ContextRequestedEventArgs
320320
};
321321

322322
menu.Items.Add(copy);
323-
menu.Open(TextArea.TextView);
323+
324+
TextArea.TextView.OpenContextMenu(menu);
324325
e.Handled = true;
325326
}
326327

@@ -731,7 +732,8 @@ private void OnTextViewContextRequested(object sender, ContextRequestedEventArgs
731732
};
732733

733734
menu.Items.Add(copy);
734-
menu.Open(TextArea.TextView);
735+
736+
TextArea.TextView.OpenContextMenu(menu);
735737
e.Handled = true;
736738
}
737739

src/Views/Welcome.axaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs
4242
if (sender is Grid grid && DataContext is ViewModels.Welcome vm)
4343
{
4444
var menu = vm.CreateContextMenu(grid.DataContext as ViewModels.RepositoryNode);
45-
menu?.Open(grid);
45+
grid.OpenContextMenu(menu);
4646
e.Handled = true;
4747
}
4848
}

0 commit comments

Comments
 (0)