Skip to content

Commit 7ceca40

Browse files
Merge pull request #3285 from tom-englert/dev/WpfRefactoring
Fix #3284: Focus, Tabs and Title issues
2 parents f105147 + 22c5735 commit 7ceca40

File tree

2 files changed

+57
-29
lines changed

2 files changed

+57
-29
lines changed

ILSpy/AssemblyTree/AssemblyListPane.xaml.cs

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.ComponentModel.Composition;
22
using System.Windows;
3-
4-
using ICSharpCode.ILSpyX.TreeView;
3+
using System.Windows.Threading;
54

65
using TomsToolbox.Wpf.Composition.Mef;
76

@@ -31,13 +30,16 @@ protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
3130
return;
3231

3332
model.SetActiveView(this);
34-
}
35-
else if (e.Property == SelectedItemProperty)
36-
{
37-
if (e.NewValue is not SharpTreeNode treeNode)
38-
return;
3933

40-
FocusNode(treeNode);
34+
// If there is already a selected item in the model, we need to scroll it into view, so it can be selected in the UI.
35+
var selected = model.SelectedItem;
36+
if (selected != null)
37+
{
38+
this.Dispatcher.BeginInvoke(DispatcherPriority.Background, () => {
39+
ScrollIntoView(selected);
40+
this.SelectedItem = selected;
41+
});
42+
}
4143
}
4244
}
4345
}

ILSpy/AssemblyTree/AssemblyTreeModel.cs

+47-21
Original file line numberDiff line numberDiff line change
@@ -418,17 +418,22 @@ void ShowAssemblyList(AssemblyList assemblyList)
418418

419419
Root = assemblyListTreeNode;
420420

421+
var mainWindow = Application.Current?.MainWindow;
422+
423+
if (mainWindow == null)
424+
return;
425+
421426
if (assemblyList.ListName == AssemblyListManager.DefaultListName)
422427
#if DEBUG
423-
this.Title = $"ILSpy {DecompilerVersionInfo.FullVersion}";
428+
mainWindow.Title = $"ILSpy {DecompilerVersionInfo.FullVersion}";
424429
#else
425-
this.Title = "ILSpy";
430+
mainWindow.Title = "ILSpy";
426431
#endif
427432
else
428433
#if DEBUG
429-
this.Title = $"ILSpy {DecompilerVersionInfo.FullVersion} - " + assemblyList.ListName;
434+
mainWindow.Title = $"ILSpy {DecompilerVersionInfo.FullVersion} - " + assemblyList.ListName;
430435
#else
431-
this.Title = "ILSpy - " + assemblyList.ListName;
436+
mainWindow.Title = "ILSpy - " + assemblyList.ListName;
432437
#endif
433438
}
434439

@@ -506,7 +511,7 @@ internal void SelectNodes(IEnumerable<SharpTreeNode> nodes)
506511
{
507512
// Ensure nodes exist
508513
var nodesList = nodes.Select(n => FindNodeByPath(GetPathForNode(n), true))
509-
.Where(n => n != null)
514+
.ExceptNullItems()
510515
.ToArray();
511516

512517
if (!nodesList.Any() || nodesList.Any(n => n.AncestorsAndSelf().Any(a => a.IsHidden)))
@@ -516,12 +521,22 @@ internal void SelectNodes(IEnumerable<SharpTreeNode> nodes)
516521

517522
if (SelectedItems.SequenceEqual(nodesList))
518523
{
519-
Dispatcher.BeginInvoke(RefreshDecompiledView);
520524
return;
521525
}
522526

523-
SelectedItems.Clear();
524-
SelectedItems.AddRange(nodesList);
527+
if (this.isNavigatingHistory)
528+
{
529+
SelectedItems.Clear();
530+
SelectedItems.AddRange(nodesList);
531+
}
532+
else
533+
{
534+
// defer selection change, so it does not interfere with the focus of the tab page.
535+
Dispatcher.BeginInvoke(() => {
536+
SelectedItems.Clear();
537+
SelectedItems.AddRange(nodesList);
538+
});
539+
}
525540
}
526541

527542
/// <summary>
@@ -543,10 +558,8 @@ public SharpTreeNode FindNodeByPath(string[] path, bool returnBestMatch)
543558
ilSpyTreeNode.EnsureChildrenFiltered();
544559
node = node.Children.FirstOrDefault(c => c.ToString() == element);
545560
}
546-
if (returnBestMatch)
547-
return node ?? bestMatch;
548-
else
549-
return node;
561+
562+
return returnBestMatch ? node ?? bestMatch : node;
550563
}
551564

552565
/// <summary>
@@ -692,20 +705,28 @@ void TreeView_SelectionChanged()
692705
{
693706
if (SelectedItems.Count > 0)
694707
{
708+
var activeTabPage = DockWorkspace.Instance.ActiveTabPage;
709+
695710
if (!isNavigatingHistory)
696711
{
697-
var activeTabPage = DockWorkspace.Instance.ActiveTabPage;
698-
var currentState = activeTabPage.GetState();
699-
if (currentState != null)
700-
history.UpdateCurrent(new NavigationState(activeTabPage, currentState));
701712
history.Record(new NavigationState(activeTabPage, SelectedItems));
702713
}
703714

704715
var delayDecompilationRequestDueToContextMenu = Mouse.RightButton == MouseButtonState.Pressed;
705716

706717
if (!delayDecompilationRequestDueToContextMenu)
707718
{
708-
DecompileSelectedNodes();
719+
var decompiledNodes = activeTabPage
720+
.GetState()
721+
?.DecompiledNodes
722+
?.Select(n => FindNodeByPath(GetPathForNode(n), true))
723+
.ExceptNullItems()
724+
.ToArray() ?? [];
725+
726+
if (!decompiledNodes.SequenceEqual(SelectedItems))
727+
{
728+
DecompileSelectedNodes();
729+
}
709730
}
710731
else
711732
{
@@ -743,7 +764,7 @@ private void DecompileSelectedNodes(DecompilerTextViewState newState = null)
743764
}
744765
if (newState?.ViewedUri != null)
745766
{
746-
NavigateTo(new(newState.ViewedUri, null), recordHistory: false);
767+
NavigateTo(new(newState.ViewedUri, null));
747768
return;
748769
}
749770

@@ -780,7 +801,12 @@ public void NavigateHistory(bool forward)
780801
history.UpdateCurrent(new NavigationState(tabPage, state));
781802
var newState = forward ? history.GoForward() : history.GoBack();
782803

783-
DockWorkspace.Instance.ActiveTabPage = newState.TabPage;
804+
TabPageModel activeTabPage = newState.TabPage;
805+
806+
if (!DockWorkspace.Instance.TabPages.Contains(activeTabPage))
807+
DockWorkspace.Instance.AddTabPage(activeTabPage);
808+
else
809+
DockWorkspace.Instance.ActiveTabPage = activeTabPage;
784810

785811
SelectNodes(newState.TreeNodes);
786812
}
@@ -789,7 +815,7 @@ public void NavigateHistory(bool forward)
789815

790816
public bool CanNavigateForward => history.CanNavigateForward;
791817

792-
internal void NavigateTo(RequestNavigateEventArgs e, bool recordHistory = true, bool inNewTabPage = false)
818+
internal void NavigateTo(RequestNavigateEventArgs e, bool inNewTabPage = false)
793819
{
794820
if (e.Uri.Scheme == "resource")
795821
{
@@ -830,7 +856,7 @@ internal void NavigateTo(RequestNavigateEventArgs e, bool recordHistory = true,
830856

831857
void RecordHistory()
832858
{
833-
if (!recordHistory)
859+
if (isNavigatingHistory)
834860
return;
835861
TabPageModel tabPage = DockWorkspace.Instance.ActiveTabPage;
836862
var currentState = tabPage.GetState();

0 commit comments

Comments
 (0)