Skip to content

Commit f105147

Browse files
Merge pull request #3283 from tom-englert/dev/WpfRefactoring
Fix #3281: Help -> About is broken
2 parents bf2cf93 + 5b8e7ce commit f105147

File tree

2 files changed

+49
-58
lines changed

2 files changed

+49
-58
lines changed

ILSpy/AssemblyTree/AssemblyTreeModel.cs

+48-58
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@
4444
using ICSharpCode.Decompiler.Documentation;
4545
using ICSharpCode.Decompiler.TypeSystem.Implementation;
4646
using System.Reflection.Metadata;
47+
using System.Text;
48+
using System.Windows.Navigation;
4749

4850
using ICSharpCode.ILSpy.AppEnv;
4951
using ICSharpCode.ILSpy.Search;
5052
using ICSharpCode.Decompiler;
51-
using System.Text;
5253

5354
using TomsToolbox.Essentials;
5455
using TomsToolbox.Wpf;
55-
using System.Windows.Navigation;
5656

5757
namespace ICSharpCode.ILSpy.AssemblyTree
5858
{
@@ -67,6 +67,7 @@ public class AssemblyTreeModel : ToolPaneModel
6767
AssemblyListTreeNode assemblyListTreeNode;
6868

6969
readonly NavigationHistory<NavigationState> history = new();
70+
private bool isNavigatingHistory;
7071

7172
public AssemblyTreeModel()
7273
{
@@ -78,7 +79,7 @@ public AssemblyTreeModel()
7879
MessageBus<NavigateToReferenceEventArgs>.Subscribers += JumpToReference;
7980
MessageBus<SettingsChangedEventArgs>.Subscribers += (sender, e) => Settings_PropertyChanged(sender, e);
8081

81-
var selectionChangeThrottle = new DispatcherThrottle(DispatcherPriority.Background, TreeView_SelectionChanged);
82+
var selectionChangeThrottle = new DispatcherThrottle(DispatcherPriority.Input, TreeView_SelectionChanged);
8283
SelectedItems.CollectionChanged += (_, _) => selectionChangeThrottle.Tick();
8384
}
8485

@@ -94,8 +95,7 @@ private void Settings_PropertyChanged(object sender, PropertyChangedEventArgs e)
9495
case nameof(SessionSettings.Theme):
9596
// update syntax highlighting and force reload (AvalonEdit does not automatically refresh on highlighting change)
9697
DecompilerTextView.RegisterHighlighting();
97-
DecompileSelectedNodes(
98-
DockWorkspace.Instance.ActiveTabPage.GetState() as DecompilerTextViewState);
98+
DecompileSelectedNodes(DockWorkspace.Instance.ActiveTabPage.GetState() as DecompilerTextViewState);
9999
break;
100100
case nameof(SessionSettings.CurrentCulture):
101101
MessageBox.Show(Properties.Resources.SettingsChangeRestartRequired, "ILSpy");
@@ -107,7 +107,7 @@ private void Settings_PropertyChanged(object sender, PropertyChangedEventArgs e)
107107
switch (e.PropertyName)
108108
{
109109
case nameof(LanguageSettings.Language) or nameof(LanguageSettings.LanguageVersion):
110-
DecompileSelectedNodes(recordHistory: false);
110+
DecompileSelectedNodes();
111111
break;
112112
}
113113
}
@@ -502,36 +502,26 @@ public void SelectNode(SharpTreeNode node, bool inNewTabPage = false)
502502
}
503503
}
504504

505-
internal void SelectNodes(IEnumerable<SharpTreeNode> nodes, bool ignoreCompilationRequests = false)
505+
internal void SelectNodes(IEnumerable<SharpTreeNode> nodes)
506506
{
507-
this.ignoreDecompilationRequests = ignoreCompilationRequests;
507+
// Ensure nodes exist
508+
var nodesList = nodes.Select(n => FindNodeByPath(GetPathForNode(n), true))
509+
.Where(n => n != null)
510+
.ToArray();
508511

509-
try
512+
if (!nodesList.Any() || nodesList.Any(n => n.AncestorsAndSelf().Any(a => a.IsHidden)))
510513
{
511-
// Ensure nodes exist
512-
var nodesList = nodes.Select(n => FindNodeByPath(GetPathForNode(n), true))
513-
.Where(n => n != null)
514-
.ToArray();
515-
516-
if (!nodesList.Any() || nodesList.Any(n => n.AncestorsAndSelf().Any(a => a.IsHidden)))
517-
{
518-
return;
519-
}
520-
521-
if (SelectedItems.SequenceEqual(nodesList))
522-
{
523-
Dispatcher.BeginInvoke(RefreshDecompiledView);
524-
return;
525-
}
526-
527-
SelectedItems.Clear();
528-
SelectedItems.AddRange(nodesList);
514+
return;
529515
}
530-
finally
516+
517+
if (SelectedItems.SequenceEqual(nodesList))
531518
{
532-
this.ignoreDecompilationRequests = false;
519+
Dispatcher.BeginInvoke(RefreshDecompiledView);
520+
return;
533521
}
534522

523+
SelectedItems.Clear();
524+
SelectedItems.AddRange(nodesList);
535525
}
536526

537527
/// <summary>
@@ -700,15 +690,27 @@ public void LoadAssemblies(IEnumerable<string> fileNames, List<LoadedAssembly> l
700690

701691
void TreeView_SelectionChanged()
702692
{
703-
var delayDecompilationRequestDueToContextMenu = Mouse.RightButton == MouseButtonState.Pressed;
704-
705-
if (!delayDecompilationRequestDueToContextMenu)
706-
{
707-
DecompileSelectedNodes();
708-
}
709-
else
693+
if (SelectedItems.Count > 0)
710694
{
711-
ContextMenuProvider.ContextMenuClosed += ContextMenuClosed;
695+
if (!isNavigatingHistory)
696+
{
697+
var activeTabPage = DockWorkspace.Instance.ActiveTabPage;
698+
var currentState = activeTabPage.GetState();
699+
if (currentState != null)
700+
history.UpdateCurrent(new NavigationState(activeTabPage, currentState));
701+
history.Record(new NavigationState(activeTabPage, SelectedItems));
702+
}
703+
704+
var delayDecompilationRequestDueToContextMenu = Mouse.RightButton == MouseButtonState.Pressed;
705+
706+
if (!delayDecompilationRequestDueToContextMenu)
707+
{
708+
DecompileSelectedNodes();
709+
}
710+
else
711+
{
712+
ContextMenuProvider.ContextMenuClosed += ContextMenuClosed;
713+
}
712714
}
713715

714716
MessageBus.Send(this, new AssemblyTreeSelectionChangedEventArgs());
@@ -728,23 +730,10 @@ void ContextMenuClosed(object sender, EventArgs e)
728730
}
729731
}
730732

731-
private bool ignoreDecompilationRequests;
732-
733-
public void DecompileSelectedNodes(DecompilerTextViewState newState = null, bool recordHistory = true)
733+
private void DecompileSelectedNodes(DecompilerTextViewState newState = null)
734734
{
735-
if (ignoreDecompilationRequests)
736-
return;
737-
738735
var activeTabPage = DockWorkspace.Instance.ActiveTabPage;
739736

740-
if (recordHistory)
741-
{
742-
var currentState = activeTabPage.GetState();
743-
if (currentState != null)
744-
history.UpdateCurrent(new NavigationState(activeTabPage, currentState));
745-
history.Record(new NavigationState(activeTabPage, SelectedItems));
746-
}
747-
748737
activeTabPage.SupportsLanguageSwitching = true;
749738

750739
if (SelectedItems.Count == 1)
@@ -754,7 +743,7 @@ public void DecompileSelectedNodes(DecompilerTextViewState newState = null, bool
754743
}
755744
if (newState?.ViewedUri != null)
756745
{
757-
MainWindow.Instance.AssemblyTreeModel.NavigateTo(new(newState.ViewedUri, null), recordHistory: false);
746+
NavigateTo(new(newState.ViewedUri, null), recordHistory: false);
758747
return;
759748
}
760749

@@ -782,6 +771,9 @@ public IEnumerable<ILSpyTreeNode> SelectedNodes {
782771

783772
public void NavigateHistory(bool forward)
784773
{
774+
isNavigatingHistory = true;
775+
this.Dispatcher.BeginInvoke(DispatcherPriority.Background, () => isNavigatingHistory = false);
776+
785777
TabPageModel tabPage = DockWorkspace.Instance.ActiveTabPage;
786778
var state = tabPage.GetState();
787779
if (state != null)
@@ -790,8 +782,7 @@ public void NavigateHistory(bool forward)
790782

791783
DockWorkspace.Instance.ActiveTabPage = newState.TabPage;
792784

793-
SelectNodes(newState.TreeNodes, ignoreCompilationRequests: true);
794-
DecompileSelectedNodes(newState.ViewState as DecompilerTextViewState, false);
785+
SelectNodes(newState.TreeNodes);
795786
}
796787

797788
public bool CanNavigateBack => history.CanNavigateBack;
@@ -814,6 +805,7 @@ internal void NavigateTo(RequestNavigateEventArgs e, bool recordHistory = true,
814805
e.Handled = true;
815806
return;
816807
}
808+
817809
AvalonEditTextOutput output = new AvalonEditTextOutput {
818810
Address = e.Uri,
819811
Title = e.Uri.AbsolutePath,
@@ -845,7 +837,7 @@ void RecordHistory()
845837
if (currentState != null)
846838
history.UpdateCurrent(new NavigationState(tabPage, currentState));
847839

848-
UnselectAll(ignoreCompilationRequests: true);
840+
UnselectAll();
849841

850842
history.Record(new NavigationState(tabPage, new ViewState { ViewedUri = e.Uri }));
851843
}
@@ -861,11 +853,9 @@ public void Refresh()
861853
}
862854
}
863855

864-
public void UnselectAll(bool ignoreCompilationRequests = false)
856+
private void UnselectAll()
865857
{
866-
this.ignoreDecompilationRequests = ignoreCompilationRequests;
867858
SelectedItems.Clear();
868-
this.ignoreDecompilationRequests = false;
869859
}
870860

871861
public IEnumerable<SharpTreeNode> GetTopLevelSelection()

ILSpy/MainWindow.xaml

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
<Window.InputBindings>
3939
<KeyBinding Key="R" Modifiers="Control" Command="{x:Static local:ILSpyCommands.Analyze}" />
40+
<KeyBinding Key="Z" Modifiers="Control" Command="{x:Static NavigationCommands.BrowseBack}" />
4041
</Window.InputBindings>
4142

4243
<Window.TaskbarItemInfo>

0 commit comments

Comments
 (0)