Browse Source

Use separate FilterSettings for each tab and bind the dropdowns directly to the settings of the active tab page. This should fix #2404.

pull/2554/head
Siegfried Pammer 4 years ago
parent
commit
98d5957e24
  1. 18
      ILSpy/Analyzers/AnalyzerTreeView.cs
  2. 19
      ILSpy/Docking/DockWorkspace.cs
  3. 31
      ILSpy/FilterSettings.cs
  4. 22
      ILSpy/MainWindow.xaml
  5. 57
      ILSpy/MainWindow.xaml.cs
  6. 30
      ILSpy/MainWindowViewModel.cs
  7. 17
      ILSpy/Search/SearchPane.cs
  8. 2
      ILSpy/SessionSettings.cs
  9. 10
      ILSpy/ViewModels/ManageAssemblyListsViewModel.cs
  10. 54
      ILSpy/ViewModels/TabPageModel.cs
  11. 18
      ILSpy/Views/DebugSteps.xaml.cs

18
ILSpy/Analyzers/AnalyzerTreeView.cs

@ -35,6 +35,8 @@ namespace ICSharpCode.ILSpy.Analyzers
/// </summary> /// </summary>
public class AnalyzerTreeView : SharpTreeView public class AnalyzerTreeView : SharpTreeView
{ {
FilterSettings filterSettings;
public AnalyzerTreeView() public AnalyzerTreeView()
{ {
this.ShowRoot = false; this.ShowRoot = false;
@ -42,7 +44,21 @@ namespace ICSharpCode.ILSpy.Analyzers
this.BorderThickness = new Thickness(0); this.BorderThickness = new Thickness(0);
ContextMenuProvider.Add(this); ContextMenuProvider.Add(this);
MainWindow.Instance.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged; MainWindow.Instance.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged;
MainWindow.Instance.SessionSettings.FilterSettings.PropertyChanged += FilterSettings_PropertyChanged; DockWorkspace.Instance.PropertyChanged += DockWorkspace_PropertyChanged;
filterSettings = MainWindow.Instance.SessionSettings.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
}
private void DockWorkspace_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(DockWorkspace.Instance.ActiveTabPage):
filterSettings.PropertyChanged -= FilterSettings_PropertyChanged;
filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
break;
}
} }
private void FilterSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) private void FilterSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)

19
ILSpy/Docking/DockWorkspace.cs

@ -94,8 +94,6 @@ namespace ICSharpCode.ILSpy.Docking
if (_activeTabPage != value) if (_activeTabPage != value)
{ {
_activeTabPage = value; _activeTabPage = value;
this.sessionSettings.FilterSettings.Language = value.Language;
this.sessionSettings.FilterSettings.LanguageVersion = value.LanguageVersion;
var state = value.GetState(); var state = value.GetState();
if (state != null) if (state != null)
{ {
@ -173,23 +171,6 @@ namespace ICSharpCode.ILSpy.Docking
internal void LoadSettings(SessionSettings sessionSettings) internal void LoadSettings(SessionSettings sessionSettings)
{ {
this.sessionSettings = sessionSettings; this.sessionSettings = sessionSettings;
sessionSettings.FilterSettings.PropertyChanged += FilterSettings_PropertyChanged;
}
private void FilterSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Language")
{
ActiveTabPage.Language = sessionSettings.FilterSettings.Language;
if (sessionSettings.FilterSettings.Language.HasLanguageVersions)
{
sessionSettings.FilterSettings.LanguageVersion = ActiveTabPage.LanguageVersion;
}
}
else if (e.PropertyName == "LanguageVersion")
{
ActiveTabPage.LanguageVersion = sessionSettings.FilterSettings.LanguageVersion;
}
} }
internal void CloseAllTabs() internal void CloseAllTabs()

31
ILSpy/FilterSettings.cs

@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System; using System;
using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
@ -34,6 +35,13 @@ namespace ICSharpCode.ILSpy
/// </remarks> /// </remarks>
public class FilterSettings : INotifyPropertyChanged public class FilterSettings : INotifyPropertyChanged
{ {
/// <summary>
/// This dictionary is necessary to remember language versions across language changes. For example,
/// the user first select C# 10, then switches to IL, then switches back to C#. After that we must be
/// able to restore the original selection (i.e., C# 10).
/// </summary>
private readonly Dictionary<Language, LanguageVersion> languageVersionHistory = new Dictionary<Language, LanguageVersion>();
public FilterSettings(XElement element) public FilterSettings(XElement element)
{ {
this.ShowApiLevel = (ApiVisibility?)(int?)element.Element("ShowAPILevel") ?? ApiVisibility.PublicAndInternal; this.ShowApiLevel = (ApiVisibility?)(int?)element.Element("ShowAPILevel") ?? ApiVisibility.PublicAndInternal;
@ -146,8 +154,27 @@ namespace ICSharpCode.ILSpy
set { set {
if (language != value) if (language != value)
{ {
if (language != null && language.HasLanguageVersions)
{
languageVersionHistory[language] = languageVersion;
}
language = value; language = value;
OnPropertyChanged(); OnPropertyChanged();
if (language.HasLanguageVersions)
{
if (languageVersionHistory.TryGetValue(value, out var version))
{
LanguageVersion = version;
}
else
{
LanguageVersion = Language.LanguageVersions.Last();
}
}
else
{
LanguageVersion = default;
}
} }
} }
} }
@ -167,6 +194,10 @@ namespace ICSharpCode.ILSpy
if (languageVersion != value) if (languageVersion != value)
{ {
languageVersion = value; languageVersion = value;
if (language.HasLanguageVersions)
{
languageVersionHistory[language] = languageVersion;
}
OnPropertyChanged(); OnPropertyChanged();
} }
} }

22
ILSpy/MainWindow.xaml

@ -19,7 +19,7 @@
xmlns:styles="urn:TomsToolbox.Wpf.Styles" xmlns:styles="urn:TomsToolbox.Wpf.Styles"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors" xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
xmlns:themes="clr-namespace:ICSharpCode.ILSpy.Themes" xmlns:themes="clr-namespace:ICSharpCode.ILSpy.Themes"
d:DataContext="{d:DesignInstance local:MainWindowDataContext}" d:DataContext="{d:DesignInstance local:MainWindowViewModel}"
> >
<Window.Resources> <Window.Resources>
<controls:BoolToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> <controls:BoolToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
@ -103,9 +103,9 @@
<MenuItem Header="{x:Static properties:Resources._File}" /> <MenuItem Header="{x:Static properties:Resources._File}" />
<!-- contents of file menu are added using MEF --> <!-- contents of file menu are added using MEF -->
<MenuItem Header="{x:Static properties:Resources._View}"> <MenuItem Header="{x:Static properties:Resources._View}">
<MenuItem Header="{x:Static properties:Resources.Show_publiconlyTypesMembers}" IsCheckable="True" IsChecked="{Binding SessionSettings.FilterSettings.ApiVisPublicOnly}" /> <MenuItem Header="{x:Static properties:Resources.Show_publiconlyTypesMembers}" IsCheckable="True" IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisPublicOnly}" />
<MenuItem Header="{x:Static properties:Resources.Show_internalTypesMembers}" IsCheckable="True" IsChecked="{Binding SessionSettings.FilterSettings.ApiVisPublicAndInternal}" /> <MenuItem Header="{x:Static properties:Resources.Show_internalTypesMembers}" IsCheckable="True" IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisPublicAndInternal}" />
<MenuItem Header="{x:Static properties:Resources.Show_allTypesAndMembers}" IsCheckable="True" IsChecked="{Binding SessionSettings.FilterSettings.ApiVisAll}" /> <MenuItem Header="{x:Static properties:Resources.Show_allTypesAndMembers}" IsCheckable="True" IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisAll}" />
<Separator/> <Separator/>
<MenuItem Header="{x:Static properties:Resources.UILanguage}"> <MenuItem Header="{x:Static properties:Resources.UILanguage}">
<MenuItem Header="{x:Static properties:Resources.UILanguage_System}" IsCheckable="True" IsChecked="{Binding SessionSettings.CurrentCulture, Converter={StaticResource cultureSelectionConverter}, ConverterParameter={x:Null}}" /> <MenuItem Header="{x:Static properties:Resources.UILanguage_System}" IsCheckable="True" IsChecked="{Binding SessionSettings.CurrentCulture, Converter={StaticResource cultureSelectionConverter}, ConverterParameter={x:Null}}" />
@ -156,25 +156,25 @@
<Image Width="16" Height="16" Source="{controls:XamlResource Images/AssemblyList}" Style="{StaticResource DarkModeAwareImageStyle}"/> <Image Width="16" Height="16" Source="{controls:XamlResource Images/AssemblyList}" Style="{StaticResource DarkModeAwareImageStyle}"/>
</Button> </Button>
<Separator /> <Separator />
<CheckBox IsChecked="{Binding SessionSettings.FilterSettings.ApiVisPublicOnly}" ToolTip="{x:Static properties:Resources.ShowPublicOnlyTypesMembers}"> <CheckBox IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisPublicOnly}" ToolTip="{x:Static properties:Resources.ShowPublicOnlyTypesMembers}">
<Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowPublicOnly}" Style="{StaticResource DarkModeAwareImageStyle}"/> <Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowPublicOnly}" Style="{StaticResource DarkModeAwareImageStyle}"/>
</CheckBox> </CheckBox>
<CheckBox IsChecked="{Binding SessionSettings.FilterSettings.ApiVisPublicAndInternal}" ToolTip="{x:Static properties:Resources.ShowInternalTypesMembers}"> <CheckBox IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisPublicAndInternal}" ToolTip="{x:Static properties:Resources.ShowInternalTypesMembers}">
<Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowPrivateInternal}" Style="{StaticResource DarkModeAwareImageStyle}"/> <Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowPrivateInternal}" Style="{StaticResource DarkModeAwareImageStyle}"/>
</CheckBox> </CheckBox>
<CheckBox IsChecked="{Binding SessionSettings.FilterSettings.ApiVisAll}" ToolTip="{x:Static properties:Resources.ShowAllTypesAndMembers}"> <CheckBox IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisAll}" ToolTip="{x:Static properties:Resources.ShowAllTypesAndMembers}">
<Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowAll}" Style="{StaticResource DarkModeAwareImageStyle}"/> <Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowAll}" Style="{StaticResource DarkModeAwareImageStyle}"/>
</CheckBox> </CheckBox>
<Separator /> <Separator />
<ComboBox Name="languageComboBox" DisplayMemberPath="Name" Width="100" MaxDropDownHeight="Auto" <ComboBox Name="languageComboBox" DisplayMemberPath="Name" Width="100" MaxDropDownHeight="Auto"
IsEnabled="{Binding ActiveTabPage.SupportsLanguageSwitching, Source={x:Static docking:DockWorkspace.Instance}}" IsEnabled="{Binding Workspace.ActiveTabPage.SupportsLanguageSwitching}"
ItemsSource="{x:Static local:Languages.AllLanguages}" ToolTip="{x:Static properties:Resources.SelectLanguageDropdownTooltip}" ItemsSource="{x:Static local:Languages.AllLanguages}" ToolTip="{x:Static properties:Resources.SelectLanguageDropdownTooltip}"
SelectedItem="{Binding SessionSettings.FilterSettings.Language}"/> SelectedItem="{Binding Workspace.ActiveTabPage.FilterSettings.Language}"/>
<ComboBox Name="languageVersionComboBox" DisplayMemberPath="DisplayName" Width="120" MaxDropDownHeight="Auto" ToolTip="{x:Static properties:Resources.SelectVersionDropdownTooltip}" <ComboBox Name="languageVersionComboBox" DisplayMemberPath="DisplayName" Width="120" MaxDropDownHeight="Auto" ToolTip="{x:Static properties:Resources.SelectVersionDropdownTooltip}"
Visibility="{Binding SelectedItem.HasLanguageVersions, ElementName=languageComboBox, Converter={StaticResource BooleanToVisibilityConverter}}" Visibility="{Binding SelectedItem.HasLanguageVersions, ElementName=languageComboBox, Converter={StaticResource BooleanToVisibilityConverter}}"
IsEnabled="{Binding ActiveTabPage.SupportsLanguageSwitching, Source={x:Static docking:DockWorkspace.Instance}}" IsEnabled="{Binding Workspace.ActiveTabPage.SupportsLanguageSwitching}"
ItemsSource="{Binding SelectedItem.LanguageVersions, ElementName=languageComboBox, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding SelectedItem.LanguageVersions, ElementName=languageComboBox, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SessionSettings.FilterSettings.LanguageVersion, UpdateSourceTrigger=PropertyChanged}"/> SelectedItem="{Binding Workspace.ActiveTabPage.FilterSettings.LanguageVersion, UpdateSourceTrigger=PropertyChanged}"/>
<Separator /> <Separator />
<CheckBox IsChecked="{Binding SessionSettings.IsDarkMode}" ToolTip="{x:Static properties:Resources.DarkMode}"> <CheckBox IsChecked="{Binding SessionSettings.IsDarkMode}" ToolTip="{x:Static properties:Resources.DarkMode}">
<Image Source="Images/DarkMode.png" Stretch="None" Style="{StaticResource DarkModeAwareImageStyle}"/> <Image Source="Images/DarkMode.png" Stretch="None" Style="{StaticResource DarkModeAwareImageStyle}"/>

57
ILSpy/MainWindow.xaml.cs

@ -32,7 +32,6 @@ using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Interop; using System.Windows.Interop;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation; using System.Windows.Navigation;
using System.Windows.Threading; using System.Windows.Threading;
@ -55,13 +54,6 @@ using Microsoft.Win32;
namespace ICSharpCode.ILSpy namespace ICSharpCode.ILSpy
{ {
class MainWindowDataContext
{
public DockWorkspace Workspace { get; set; }
public SessionSettings SessionSettings { get; set; }
public AssemblyListManager AssemblyListManager { get; set; }
}
/// <summary> /// <summary>
/// The main window of the application. /// The main window of the application.
/// </summary> /// </summary>
@ -70,7 +62,8 @@ namespace ICSharpCode.ILSpy
bool refreshInProgress, changingActiveTab; bool refreshInProgress, changingActiveTab;
readonly NavigationHistory<NavigationState> history = new NavigationHistory<NavigationState>(); readonly NavigationHistory<NavigationState> history = new NavigationHistory<NavigationState>();
ILSpySettings spySettingsForMainWindow_Loaded; ILSpySettings spySettingsForMainWindow_Loaded;
internal SessionSettings sessionSettings; SessionSettings sessionSettings;
FilterSettings filterSettings;
AssemblyList assemblyList; AssemblyList assemblyList;
AssemblyListTreeNode assemblyListTreeNode; AssemblyListTreeNode assemblyListTreeNode;
@ -115,7 +108,7 @@ namespace ICSharpCode.ILSpy
// Make sure Images are initialized on the UI thread. // Make sure Images are initialized on the UI thread.
this.Icon = Images.ILSpyIcon; this.Icon = Images.ILSpyIcon;
this.DataContext = new MainWindowDataContext { this.DataContext = new MainWindowViewModel {
Workspace = DockWorkspace.Instance, Workspace = DockWorkspace.Instance,
SessionSettings = sessionSettings, SessionSettings = sessionSettings,
AssemblyListManager = AssemblyListManager AssemblyListManager = AssemblyListManager
@ -130,8 +123,10 @@ namespace ICSharpCode.ILSpy
InitializeComponent(); InitializeComponent();
InitToolPanes(); InitToolPanes();
DockWorkspace.Instance.InitializeLayout(DockManager); DockWorkspace.Instance.InitializeLayout(DockManager);
sessionSettings.FilterSettings.PropertyChanged += filterSettings_PropertyChanged;
sessionSettings.PropertyChanged += SessionSettings_PropertyChanged; sessionSettings.PropertyChanged += SessionSettings_PropertyChanged;
filterSettings = sessionSettings.FilterSettings;
filterSettings.PropertyChanged += filterSettings_PropertyChanged;
DockWorkspace.Instance.PropertyChanged += DockWorkspace_PropertyChanged;
InitMainMenu(); InitMainMenu();
InitToolbar(); InitToolbar();
ContextMenuProvider.Add(AssemblyTreeView); ContextMenuProvider.Add(AssemblyTreeView);
@ -139,6 +134,18 @@ namespace ICSharpCode.ILSpy
this.Loaded += MainWindow_Loaded; this.Loaded += MainWindow_Loaded;
} }
private void DockWorkspace_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(DockWorkspace.Instance.ActiveTabPage):
filterSettings.PropertyChanged -= filterSettings_PropertyChanged;
filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings;
filterSettings.PropertyChanged += filterSettings_PropertyChanged;
break;
}
}
private void SessionSettings_PropertyChanged(object sender, PropertyChangedEventArgs e) private void SessionSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)
{ {
switch (e.PropertyName) switch (e.PropertyName)
@ -406,7 +413,7 @@ namespace ICSharpCode.ILSpy
{ {
LoadAssemblies(args.AssembliesToLoad, commandLineLoadedAssemblies, focusNode: false); LoadAssemblies(args.AssembliesToLoad, commandLineLoadedAssemblies, focusNode: false);
if (args.Language != null) if (args.Language != null)
sessionSettings.FilterSettings.Language = Languages.GetLanguage(args.Language); filterSettings.Language = Languages.GetLanguage(args.Language);
return true; return true;
} }
@ -597,8 +604,7 @@ namespace ICSharpCode.ILSpy
void MainWindow_Loaded(object sender, RoutedEventArgs e) void MainWindow_Loaded(object sender, RoutedEventArgs e)
{ {
DockWorkspace.Instance.TabPages.Add(new TabPageModel() { DockWorkspace.Instance.TabPages.Add(new TabPageModel() {
Language = CurrentLanguage, FilterSettings = filterSettings.Clone()
LanguageVersion = CurrentLanguageVersion
}); });
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.First(); DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.First();
@ -770,7 +776,7 @@ namespace ICSharpCode.ILSpy
assemblyList.CollectionChanged += assemblyList_Assemblies_CollectionChanged; assemblyList.CollectionChanged += assemblyList_Assemblies_CollectionChanged;
assemblyListTreeNode = new AssemblyListTreeNode(assemblyList); assemblyListTreeNode = new AssemblyListTreeNode(assemblyList);
assemblyListTreeNode.FilterSettings = sessionSettings.FilterSettings.Clone(); assemblyListTreeNode.FilterSettings = filterSettings.Clone();
assemblyListTreeNode.Select = x => SelectNode(x, inNewTabPage: false); assemblyListTreeNode.Select = x => SelectNode(x, inNewTabPage: false);
AssemblyTreeView.Root = assemblyListTreeNode; AssemblyTreeView.Root = assemblyListTreeNode;
@ -837,7 +843,7 @@ namespace ICSharpCode.ILSpy
// Thus, the main window will use one mutable instance (for data-binding), and assign a new clone to the ILSpyTreeNodes whenever the main // Thus, the main window will use one mutable instance (for data-binding), and assign a new clone to the ILSpyTreeNodes whenever the main
// mutable instance changes. // mutable instance changes.
if (assemblyListTreeNode != null) if (assemblyListTreeNode != null)
assemblyListTreeNode.FilterSettings = sessionSettings.FilterSettings.Clone(); assemblyListTreeNode.FilterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings.Clone();
} }
internal AssemblyListTreeNode AssemblyListTreeNode { internal AssemblyListTreeNode AssemblyListTreeNode {
@ -866,8 +872,7 @@ namespace ICSharpCode.ILSpy
{ {
DockWorkspace.Instance.TabPages.Add( DockWorkspace.Instance.TabPages.Add(
new TabPageModel() { new TabPageModel() {
Language = CurrentLanguage, FilterSettings = filterSettings.Clone()
LanguageVersion = CurrentLanguageVersion
}); });
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last(); DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last();
AssemblyTreeView.SelectedItem = null; AssemblyTreeView.SelectedItem = null;
@ -913,8 +918,7 @@ namespace ICSharpCode.ILSpy
{ {
DockWorkspace.Instance.TabPages.Add( DockWorkspace.Instance.TabPages.Add(
new TabPageModel() { new TabPageModel() {
Language = CurrentLanguage, FilterSettings = filterSettings.Clone()
LanguageVersion = CurrentLanguageVersion
}); });
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last(); DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last();
} }
@ -1200,7 +1204,10 @@ namespace ICSharpCode.ILSpy
{ {
state = DockWorkspace.Instance.ActiveTabPage.GetState() as DecompilerTextViewState; state = DockWorkspace.Instance.ActiveTabPage.GetState() as DecompilerTextViewState;
} }
if (!changingActiveTab)
{
DecompileSelectedNodes(state); DecompileSelectedNodes(state);
}
SelectionChanged?.Invoke(sender, e); SelectionChanged?.Invoke(sender, e);
} }
@ -1268,8 +1275,10 @@ namespace ICSharpCode.ILSpy
} }
} }
public Language CurrentLanguage => sessionSettings.FilterSettings.Language; public Language CurrentLanguage => DockWorkspace.Instance.ActiveTabPage.FilterSettings.Language;
public LanguageVersion CurrentLanguageVersion => sessionSettings.FilterSettings.LanguageVersion; public LanguageVersion CurrentLanguageVersion => DockWorkspace.Instance.ActiveTabPage.FilterSettings.LanguageVersion;
public bool SupportsLanguageSwitching => DockWorkspace.Instance.ActiveTabPage.SupportsLanguageSwitching;
public event SelectionChangedEventHandler SelectionChanged; public event SelectionChangedEventHandler SelectionChanged;
@ -1341,8 +1350,7 @@ namespace ICSharpCode.ILSpy
{ {
DockWorkspace.Instance.TabPages.Add( DockWorkspace.Instance.TabPages.Add(
new TabPageModel() { new TabPageModel() {
Language = CurrentLanguage, FilterSettings = filterSettings.Clone()
LanguageVersion = CurrentLanguageVersion
}); });
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last(); DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last();
} }
@ -1407,6 +1415,7 @@ namespace ICSharpCode.ILSpy
sessionSettings.ActiveAutoLoadedAssembly = GetAutoLoadedAssemblyNode(AssemblyTreeView.SelectedItem as SharpTreeNode); sessionSettings.ActiveAutoLoadedAssembly = GetAutoLoadedAssemblyNode(AssemblyTreeView.SelectedItem as SharpTreeNode);
sessionSettings.WindowBounds = this.RestoreBounds; sessionSettings.WindowBounds = this.RestoreBounds;
sessionSettings.DockLayout.Serialize(new XmlLayoutSerializer(DockManager)); sessionSettings.DockLayout.Serialize(new XmlLayoutSerializer(DockManager));
sessionSettings.FilterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings.Clone();
sessionSettings.Save(); sessionSettings.Save();
} }

30
ILSpy/MainWindowViewModel.cs

@ -0,0 +1,30 @@
// Copyright (c) 2021 Siegfried Pammer
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using ICSharpCode.ILSpy.Docking;
using ICSharpCode.ILSpy.ViewModels;
namespace ICSharpCode.ILSpy
{
class MainWindowViewModel
{
public DockWorkspace Workspace { get; set; }
public SessionSettings SessionSettings { get; set; }
public AssemblyListManager AssemblyListManager { get; set; }
}
}

17
ILSpy/Search/SearchPane.cs

@ -50,6 +50,7 @@ namespace ICSharpCode.ILSpy
RunningSearch currentSearch; RunningSearch currentSearch;
bool runSearchOnNextShow; bool runSearchOnNextShow;
IComparer<SearchResult> resultsComparer; IComparer<SearchResult> resultsComparer;
FilterSettings filterSettings;
public static readonly DependencyProperty ResultsProperty = public static readonly DependencyProperty ResultsProperty =
DependencyProperty.Register("Results", typeof(ObservableCollection<SearchResult>), typeof(SearchPane), DependencyProperty.Register("Results", typeof(ObservableCollection<SearchResult>), typeof(SearchPane),
@ -76,13 +77,27 @@ namespace ICSharpCode.ILSpy
ContextMenuProvider.Add(listBox); ContextMenuProvider.Add(listBox);
MainWindow.Instance.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged; MainWindow.Instance.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged;
MainWindow.Instance.SessionSettings.FilterSettings.PropertyChanged += FilterSettings_PropertyChanged; DockWorkspace.Instance.PropertyChanged += DockWorkspace_PropertyChanged;
filterSettings = MainWindow.Instance.SessionSettings.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
CompositionTarget.Rendering += UpdateResults; CompositionTarget.Rendering += UpdateResults;
// This starts empty search right away, so do at the end (we're still in ctor) // This starts empty search right away, so do at the end (we're still in ctor)
searchModeComboBox.SelectedIndex = (int)MainWindow.Instance.SessionSettings.SelectedSearchMode; searchModeComboBox.SelectedIndex = (int)MainWindow.Instance.SessionSettings.SelectedSearchMode;
} }
private void DockWorkspace_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(DockWorkspace.Instance.ActiveTabPage):
filterSettings.PropertyChanged -= FilterSettings_PropertyChanged;
filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
break;
}
}
void MainWindow_Instance_CurrentAssemblyListChanged(object sender, NotifyCollectionChangedEventArgs e) void MainWindow_Instance_CurrentAssemblyListChanged(object sender, NotifyCollectionChangedEventArgs e)
{ {
if (IsVisible) if (IsVisible)

2
ILSpy/SessionSettings.cs

@ -76,7 +76,7 @@ namespace ICSharpCode.ILSpy
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} }
public FilterSettings FilterSettings { get; private set; } public FilterSettings FilterSettings { get; internal set; }
public SearchMode SelectedSearchMode { get; set; } public SearchMode SelectedSearchMode { get; set; }
public bool IsDarkMode { public bool IsDarkMode {

10
ILSpy/ViewModels/ManageAssemblyListsViewModel.cs

@ -191,9 +191,9 @@ namespace ICSharpCode.ILSpy.ViewModels
if (manager.AssemblyLists.Count > 0) if (manager.AssemblyLists.Count > 0)
{ {
SelectedAssemblyList = manager.AssemblyLists[Math.Max(0, index - 1)]; SelectedAssemblyList = manager.AssemblyLists[Math.Max(0, index - 1)];
if (MainWindow.Instance.sessionSettings.ActiveAssemblyList == assemblyList) if (MainWindow.Instance.SessionSettings.ActiveAssemblyList == assemblyList)
{ {
MainWindow.Instance.sessionSettings.ActiveAssemblyList = SelectedAssemblyList; MainWindow.Instance.SessionSettings.ActiveAssemblyList = SelectedAssemblyList;
} }
} }
} }
@ -234,9 +234,9 @@ namespace ICSharpCode.ILSpy.ViewModels
string assemblyList = SelectedAssemblyList; string assemblyList = SelectedAssemblyList;
SelectedAssemblyList = dlg.ListName; SelectedAssemblyList = dlg.ListName;
manager.RenameList(assemblyList, dlg.ListName); manager.RenameList(assemblyList, dlg.ListName);
if (MainWindow.Instance.sessionSettings.ActiveAssemblyList == assemblyList) if (MainWindow.Instance.SessionSettings.ActiveAssemblyList == assemblyList)
{ {
MainWindow.Instance.sessionSettings.ActiveAssemblyList = manager.AssemblyLists[manager.AssemblyLists.Count - 1]; MainWindow.Instance.SessionSettings.ActiveAssemblyList = manager.AssemblyLists[manager.AssemblyLists.Count - 1];
} }
} }
} }
@ -372,7 +372,7 @@ namespace ICSharpCode.ILSpy.ViewModels
private void ExecuteSelectAssemblyList() private void ExecuteSelectAssemblyList()
{ {
MainWindow.Instance.sessionSettings.ActiveAssemblyList = SelectedAssemblyList; MainWindow.Instance.SessionSettings.ActiveAssemblyList = SelectedAssemblyList;
this.parent.Close(); this.parent.Close();
} }
} }

54
ILSpy/ViewModels/TabPageModel.cs

@ -27,61 +27,36 @@ namespace ICSharpCode.ILSpy.ViewModels
{ {
public class TabPageModel : PaneModel public class TabPageModel : PaneModel
{ {
private readonly Dictionary<Language, LanguageVersion> languageVersionHistory = new Dictionary<Language, LanguageVersion>();
public TabPageModel() public TabPageModel()
{ {
this.Title = Properties.Resources.NewTab; this.Title = Properties.Resources.NewTab;
} }
private Language language; private FilterSettings filterSettings;
public Language Language {
get => language; public FilterSettings FilterSettings {
get => filterSettings;
set { set {
if (language != value) if (filterSettings != value)
{
if (language != null && language.HasLanguageVersions)
{
languageVersionHistory[language] = languageVersion;
}
language = value;
RaisePropertyChanged(nameof(Language));
if (language.HasLanguageVersions)
{
if (languageVersionHistory.TryGetValue(value, out var version))
{
LanguageVersion = version;
}
else
{
LanguageVersion = Language.LanguageVersions.Last();
}
}
else
{ {
LanguageVersion = default; filterSettings = value;
RaisePropertyChanged(nameof(FilterSettings));
} }
} }
} }
public Language Language {
get => filterSettings.Language;
set => filterSettings.Language = value;
} }
private LanguageVersion languageVersion;
public LanguageVersion LanguageVersion { public LanguageVersion LanguageVersion {
get => languageVersion; get => filterSettings.LanguageVersion;
set { set => filterSettings.LanguageVersion = value;
if (languageVersion != value)
{
languageVersion = value;
if (language.HasLanguageVersions)
{
languageVersionHistory[language] = languageVersion;
}
RaisePropertyChanged(nameof(LanguageVersion));
}
}
} }
private bool supportsLanguageSwitching = true; private bool supportsLanguageSwitching = true;
public bool SupportsLanguageSwitching { public bool SupportsLanguageSwitching {
get => supportsLanguageSwitching; get => supportsLanguageSwitching;
set { set {
@ -94,6 +69,7 @@ namespace ICSharpCode.ILSpy.ViewModels
} }
private object content; private object content;
public object Content { public object Content {
get => content; get => content;
set { set {

18
ILSpy/Views/DebugSteps.xaml.cs

@ -1,4 +1,5 @@
using System; using System;
using System.ComponentModel;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
@ -22,13 +23,16 @@ namespace ICSharpCode.ILSpy
#if DEBUG #if DEBUG
ILAstLanguage language; ILAstLanguage language;
#endif #endif
FilterSettings filterSettings;
public DebugSteps() public DebugSteps()
{ {
InitializeComponent(); InitializeComponent();
#if DEBUG #if DEBUG
MainWindow.Instance.SessionSettings.FilterSettings.PropertyChanged += FilterSettings_PropertyChanged; DockWorkspace.Instance.PropertyChanged += DockWorkspace_PropertyChanged;
this.filterSettings = MainWindow.Instance.SessionSettings.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
MainWindow.Instance.SelectionChanged += SelectionChanged; MainWindow.Instance.SelectionChanged += SelectionChanged;
writingOptions.PropertyChanged += WritingOptions_PropertyChanged; writingOptions.PropertyChanged += WritingOptions_PropertyChanged;
@ -41,6 +45,18 @@ namespace ICSharpCode.ILSpy
#endif #endif
} }
private void DockWorkspace_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(DockWorkspace.Instance.ActiveTabPage):
filterSettings.PropertyChanged -= FilterSettings_PropertyChanged;
filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
break;
}
}
private void WritingOptions_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) private void WritingOptions_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
DecompileAsync(lastSelectedStep); DecompileAsync(lastSelectedStep);

Loading…
Cancel
Save