Browse Source

Decouple Settings from MainWindow

pull/3257/head
tom-englert 12 months ago
parent
commit
97bd5cb122
  1. 15
      ILSpy/Analyzers/AnalyzerTreeView.cs
  2. 6
      ILSpy/Commands/SetThemeCommand.cs
  3. 60
      ILSpy/LanguageSettings.cs
  4. 16
      ILSpy/MainWindow.xaml
  5. 77
      ILSpy/MainWindow.xaml.cs
  6. 7
      ILSpy/Options/DisplaySettingsPanel.xaml.cs
  7. 13
      ILSpy/Search/SearchPane.cs
  8. 18
      ILSpy/SessionSettings.cs
  9. 2
      ILSpy/TreeNodes/AssemblyTreeNode.cs
  10. 2
      ILSpy/TreeNodes/DerivedTypesEntryNode.cs
  11. 2
      ILSpy/TreeNodes/EventTreeNode.cs
  12. 2
      ILSpy/TreeNodes/FieldTreeNode.cs
  13. 51
      ILSpy/TreeNodes/ILSpyTreeNode.cs
  14. 2
      ILSpy/TreeNodes/MethodTreeNode.cs
  15. 2
      ILSpy/TreeNodes/NamespaceTreeNode.cs
  16. 2
      ILSpy/TreeNodes/PropertyTreeNode.cs
  17. 2
      ILSpy/TreeNodes/ResourceListTreeNode.cs
  18. 2
      ILSpy/TreeNodes/ResourceNodes/ResourceTreeNode.cs
  19. 4
      ILSpy/TreeNodes/ThreadingSupport.cs
  20. 2
      ILSpy/TreeNodes/TypeTreeNode.cs
  21. 5
      ILSpy/Util/MessageBus.cs
  22. 20
      ILSpy/Util/SettingsService.cs
  23. 13
      ILSpy/ViewModels/ManageAssemblyListsViewModel.cs
  24. 26
      ILSpy/ViewModels/TabPageModel.cs
  25. 16
      ILSpy/Views/DebugSteps.xaml.cs

15
ILSpy/Analyzers/AnalyzerTreeView.cs

@ -44,29 +44,22 @@ namespace ICSharpCode.ILSpy.Analyzers @@ -44,29 +44,22 @@ namespace ICSharpCode.ILSpy.Analyzers
[Export]
public class AnalyzerTreeView : SharpTreeView
{
FilterSettings filterSettings;
public AnalyzerTreeView()
{
this.ShowRoot = false;
this.BorderThickness = new Thickness(0);
ContextMenuProvider.Add(this);
MessageBus<CurrentAssemblyListChangedEventArgs>.Subscribers += (sender, e) => MainWindow_Instance_CurrentAssemblyListChanged(sender, e);
MessageBus<CurrentAssemblyListChangedEventArgs>.Subscribers += (sender, e) => CurrentAssemblyList_Changed(sender, e);
MessageBus<DockWorkspaceActiveTabPageChangedEventArgs>.Subscribers += DockWorkspace_ActiveTabPageChanged;
filterSettings = MainWindow.Instance.SessionSettings.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
MessageBus<LanguageSettingsChangedEventArgs>.Subscribers += (sender, e) => LanguageSettings_PropertyChanged(sender, e);
}
private void DockWorkspace_ActiveTabPageChanged(object sender, EventArgs e)
{
this.Root ??= new AnalyzerRootNode { Language = MainWindow.Instance.CurrentLanguage };
filterSettings.PropertyChanged -= FilterSettings_PropertyChanged;
filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
}
private void FilterSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
private void LanguageSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
@ -77,7 +70,7 @@ namespace ICSharpCode.ILSpy.Analyzers @@ -77,7 +70,7 @@ namespace ICSharpCode.ILSpy.Analyzers
}
}
void MainWindow_Instance_CurrentAssemblyListChanged(object sender, NotifyCollectionChangedEventArgs e)
void CurrentAssemblyList_Changed(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Reset)
{

6
ILSpy/Commands/SetThemeCommand.cs

@ -1,11 +1,13 @@ @@ -1,11 +1,13 @@
namespace ICSharpCode.ILSpy.Commands
using ICSharpCode.ILSpy.Util;
namespace ICSharpCode.ILSpy.Commands
{
public class SetThemeCommand : SimpleCommand
{
public override void Execute(object parameter)
{
if (parameter is string theme)
MainWindow.Instance.SessionSettings.Theme = theme;
SettingsService.Instance.SessionSettings.Theme = theme;
}
}
}

60
ILSpy/FilterSettings.cs → ILSpy/LanguageSettings.cs

@ -23,6 +23,7 @@ using System.Linq; @@ -23,6 +23,7 @@ using System.Linq;
using System.Runtime.CompilerServices;
using System.Xml.Linq;
using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpyX;
namespace ICSharpCode.ILSpy
@ -30,12 +31,7 @@ namespace ICSharpCode.ILSpy @@ -30,12 +31,7 @@ namespace ICSharpCode.ILSpy
/// <summary>
/// Represents the filters applied to the tree view.
/// </summary>
/// <remarks>
/// This class is mutable; but the ILSpyTreeNode filtering assumes that filter settings are immutable.
/// Thus, the main window will use one mutable instance (for data-binding), and will assign a new
/// clone to the ILSpyTreeNodes whenever the main mutable instance changes.
/// </remarks>
public class FilterSettings : INotifyPropertyChanged
public class LanguageSettings : INotifyPropertyChanged
{
/// <summary>
/// This dictionary is necessary to remember language versions across language changes. For example,
@ -44,13 +40,12 @@ namespace ICSharpCode.ILSpy @@ -44,13 +40,12 @@ namespace ICSharpCode.ILSpy
/// </summary>
private readonly Dictionary<Language, LanguageVersion> languageVersionHistory = new Dictionary<Language, LanguageVersion>();
public FilterSettings(XElement element)
public LanguageSettings(XElement element)
{
this.ShowApiLevel = (ApiVisibility?)(int?)element.Element("ShowAPILevel") ?? ApiVisibility.PublicAndInternal;
this.Language = Languages.GetLanguage((string)element.Element("Language"));
this.LanguageVersion = Language.LanguageVersions.FirstOrDefault(v => v.Version == (string)element.Element("LanguageVersion"));
if (this.LanguageVersion == default(LanguageVersion))
this.LanguageVersion = language.LanguageVersions.LastOrDefault();
this.LanguageVersion = Language.LanguageVersions.FirstOrDefault(v => v.Version == (string)element.Element("LanguageVersion"))
?? Language.LanguageVersions.LastOrDefault();
}
public XElement SaveAsXml()
@ -63,33 +58,6 @@ namespace ICSharpCode.ILSpy @@ -63,33 +58,6 @@ namespace ICSharpCode.ILSpy
);
}
string searchTerm;
/// <summary>
/// Gets/Sets the search term.
/// Only tree nodes containing the search term will be shown.
/// </summary>
public string SearchTerm {
get { return searchTerm; }
set {
if (searchTerm != value)
{
searchTerm = value;
OnPropertyChanged(nameof(SearchTerm));
}
}
}
/// <summary>
/// Gets whether a node with the specified text is matched by the current search term.
/// </summary>
public virtual bool SearchTermMatches(string text)
{
if (string.IsNullOrEmpty(searchTerm))
return true;
return text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0;
}
ApiVisibility showApiLevel;
/// <summary>
@ -211,15 +179,23 @@ namespace ICSharpCode.ILSpy @@ -211,15 +179,23 @@ namespace ICSharpCode.ILSpy
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
var args = new PropertyChangedEventArgs(propertyName);
PropertyChanged(this, args);
MessageBus.Send(this, new LanguageSettingsChangedEventArgs(args));
}
}
public FilterSettings Clone()
// This class has been initially called FilterSettings, but then has been Hijacked to store language settings as well.
// While the filter settings were some sort of local, the language settings are global. This is a bit of a mess.
// There has been a lot of workarounds cloning the FilterSettings to pass them down to the tree nodes, without messing up the global language settings.
// Finally, this filtering was not used at all, so this SearchTerm is just a placeholder to make the filtering code compile, in case someone wants to reactivate filtering in the future.
public string SearchTerm => string.Empty;
public bool SearchTermMatches(string value)
{
FilterSettings f = (FilterSettings)MemberwiseClone();
f.PropertyChanged = null;
return f;
return true;
}
}
}

16
ILSpy/MainWindow.xaml

@ -123,9 +123,9 @@ @@ -123,9 +123,9 @@
<MenuItem Header="{x:Static properties:Resources._File}" Tag="_File" />
<!-- contents of file menu are added using MEF -->
<MenuItem Header="{x:Static properties:Resources._View}" Tag="_View">
<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 Workspace.ActiveTabPage.FilterSettings.ApiVisPublicAndInternal}" />
<MenuItem Header="{x:Static properties:Resources.Show_allTypesAndMembers}" IsCheckable="True" IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisAll}" />
<MenuItem Header="{x:Static properties:Resources.Show_publiconlyTypesMembers}" IsCheckable="True" IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisPublicOnly}" />
<MenuItem Header="{x:Static properties:Resources.Show_internalTypesMembers}" IsCheckable="True" IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisPublicAndInternal}" />
<MenuItem Header="{x:Static properties:Resources.Show_allTypesAndMembers}" IsCheckable="True" IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisAll}" />
<Separator/>
<MenuItem Header="{x:Static properties:Resources.Theme}" ItemsSource="{x:Static themes:ThemeManager.AllThemes}">
<MenuItem.ItemContainerStyle>
@ -189,25 +189,25 @@ @@ -189,25 +189,25 @@
<Image Width="16" Height="16" Source="{controls:XamlResource Images/AssemblyList}" Style="{StaticResource DarkModeAwareImageStyle}"/>
</Button>
<Separator />
<CheckBox IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisPublicOnly}" ToolTip="{x:Static properties:Resources.ShowPublicOnlyTypesMembers}">
<CheckBox IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisPublicOnly}" ToolTip="{x:Static properties:Resources.ShowPublicOnlyTypesMembers}">
<Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowPublicOnly}" Style="{StaticResource DarkModeAwareImageStyle}"/>
</CheckBox>
<CheckBox IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisPublicAndInternal}" ToolTip="{x:Static properties:Resources.ShowInternalTypesMembers}">
<CheckBox IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisPublicAndInternal}" ToolTip="{x:Static properties:Resources.ShowInternalTypesMembers}">
<Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowPrivateInternal}" Style="{StaticResource DarkModeAwareImageStyle}"/>
</CheckBox>
<CheckBox IsChecked="{Binding Workspace.ActiveTabPage.FilterSettings.ApiVisAll}" ToolTip="{x:Static properties:Resources.ShowAllTypesAndMembers}">
<CheckBox IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisAll}" ToolTip="{x:Static properties:Resources.ShowAllTypesAndMembers}">
<Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowAll}" Style="{StaticResource DarkModeAwareImageStyle}"/>
</CheckBox>
<Separator />
<ComboBox Name="languageComboBox" DisplayMemberPath="Name" Width="100" MaxDropDownHeight="Auto"
IsEnabled="{Binding Workspace.ActiveTabPage.SupportsLanguageSwitching}"
ItemsSource="{x:Static local:Languages.AllLanguages}" ToolTip="{x:Static properties:Resources.SelectLanguageDropdownTooltip}"
SelectedItem="{Binding Workspace.ActiveTabPage.FilterSettings.Language}"/>
SelectedItem="{Binding SessionSettings.LanguageSettings.Language}"/>
<ComboBox Name="languageVersionComboBox" DisplayMemberPath="DisplayName" Width="120" MaxDropDownHeight="Auto" ToolTip="{x:Static properties:Resources.SelectVersionDropdownTooltip}"
Visibility="{Binding SelectedItem.HasLanguageVersions, ElementName=languageComboBox, Converter={toms:BooleanToVisibilityConverter}}"
IsEnabled="{Binding Workspace.ActiveTabPage.SupportsLanguageSwitching}"
ItemsSource="{Binding SelectedItem.LanguageVersions, ElementName=languageComboBox, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Workspace.ActiveTabPage.FilterSettings.LanguageVersion, UpdateSourceTrigger=PropertyChanged}"/>
SelectedItem="{Binding SessionSettings.LanguageSettings.LanguageVersion, UpdateSourceTrigger=PropertyChanged}"/>
</ToolBar>
<!-- Update panel -->
<Border DockPanel.Dock="Top" BorderBrush="Black" BorderThickness="1" Name="updatePanel" Visibility="Collapsed">

77
ILSpy/MainWindow.xaml.cs

@ -73,9 +73,7 @@ namespace ICSharpCode.ILSpy @@ -73,9 +73,7 @@ namespace ICSharpCode.ILSpy
{
bool refreshInProgress, changingActiveTab;
readonly NavigationHistory<NavigationState> history = new NavigationHistory<NavigationState>();
ILSpySettings spySettingsForMainWindow_Loaded;
SessionSettings sessionSettings;
FilterSettings filterSettings;
AssemblyList assemblyList;
AssemblyListTreeNode assemblyListTreeNode;
@ -85,10 +83,6 @@ namespace ICSharpCode.ILSpy @@ -85,10 +83,6 @@ namespace ICSharpCode.ILSpy
get { return instance; }
}
public SessionSettings SessionSettings {
get { return sessionSettings; }
}
internal AssemblyListManager AssemblyListManager { get; }
public SharpTreeView AssemblyTreeView {
@ -116,9 +110,10 @@ namespace ICSharpCode.ILSpy @@ -116,9 +110,10 @@ namespace ICSharpCode.ILSpy
public MainWindow()
{
instance = this;
var spySettings = ILSpySettings.Load();
this.spySettingsForMainWindow_Loaded = spySettings;
this.sessionSettings = new SessionSettings(spySettings);
var spySettings = SettingsService.Instance.SpySettings;
var sessionSettings = SettingsService.Instance.SessionSettings;
this.CurrentDecompilerSettings = DecompilerSettingsPanel.LoadDecompilerSettings(spySettings);
this.CurrentDisplaySettings = DisplaySettingsPanel.LoadDisplaySettings(spySettings);
this.AssemblyListManager = new AssemblyListManager(spySettings) {
@ -144,10 +139,11 @@ namespace ICSharpCode.ILSpy @@ -144,10 +139,11 @@ namespace ICSharpCode.ILSpy
InitializeComponent();
InitToolPanes();
DockWorkspace.Instance.InitializeLayout(DockManager);
sessionSettings.PropertyChanged += SessionSettings_PropertyChanged;
filterSettings = sessionSettings.FilterSettings;
filterSettings.PropertyChanged += filterSettings_PropertyChanged;
MessageBus<SessionSettingsChangedEventArgs>.Subscribers += (sender, e) => SessionSettings_PropertyChanged(sender, e);
MessageBus<LanguageSettingsChangedEventArgs>.Subscribers += (sender, e) => filterSettings_PropertyChanged(sender, e);
MessageBus<DockWorkspaceActiveTabPageChangedEventArgs>.Subscribers += DockWorkspace_ActiveTabPageChanged;
InitMainMenu();
InitWindowMenu();
InitToolbar();
@ -160,9 +156,6 @@ namespace ICSharpCode.ILSpy @@ -160,9 +156,6 @@ namespace ICSharpCode.ILSpy
private void DockWorkspace_ActiveTabPageChanged(object sender, EventArgs e)
{
DockWorkspace dock = DockWorkspace.Instance;
filterSettings.PropertyChanged -= filterSettings_PropertyChanged;
filterSettings = dock.ActiveTabPage.FilterSettings;
filterSettings.PropertyChanged += filterSettings_PropertyChanged;
var windowMenuItem = mainMenu.Items.OfType<MenuItem>().First(m => (string)m.Tag == nameof(Properties.Resources._Window));
foreach (MenuItem menuItem in windowMenuItem.Items.OfType<MenuItem>())
@ -176,6 +169,8 @@ namespace ICSharpCode.ILSpy @@ -176,6 +169,8 @@ namespace ICSharpCode.ILSpy
private void SessionSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
var sessionSettings = SettingsService.Instance.SessionSettings;
switch (e.PropertyName)
{
case nameof(SessionSettings.ActiveAssemblyList):
@ -580,6 +575,8 @@ namespace ICSharpCode.ILSpy @@ -580,6 +575,8 @@ namespace ICSharpCode.ILSpy
base.OnSourceInitialized(e);
PresentationSource source = PresentationSource.FromVisual(this);
var sessionSettings = SettingsService.Instance.SessionSettings;
// Validate and Set Window Bounds
Rect bounds = Rect.Transform(sessionSettings.WindowBounds, source.CompositionTarget.TransformToDevice);
var boundsRect = new System.Drawing.Rectangle((int)bounds.Left, (int)bounds.Top, (int)bounds.Width, (int)bounds.Height);
@ -648,7 +645,7 @@ namespace ICSharpCode.ILSpy @@ -648,7 +645,7 @@ namespace ICSharpCode.ILSpy
{
LoadAssemblies(args.AssembliesToLoad, commandLineLoadedAssemblies, focusNode: false);
if (args.Language != null)
filterSettings.Language = Languages.GetLanguage(args.Language);
SettingsService.Instance.SessionSettings.LanguageSettings.Language = Languages.GetLanguage(args.Language);
return true;
}
@ -658,6 +655,8 @@ namespace ICSharpCode.ILSpy @@ -658,6 +655,8 @@ namespace ICSharpCode.ILSpy
/// </summary>
void HandleCommandLineArgumentsAfterShowList(CommandLineArguments args, ILSpySettings spySettings = null)
{
var sessionSettings = SettingsService.Instance.SessionSettings;
var relevantAssemblies = commandLineLoadedAssemblies.ToList();
commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore
NavigateOnLaunch(args.NavigateTo, sessionSettings.ActiveTreeViewPath, spySettings, relevantAssemblies);
@ -832,15 +831,13 @@ namespace ICSharpCode.ILSpy @@ -832,15 +831,13 @@ namespace ICSharpCode.ILSpy
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
DockWorkspace.Instance.TabPages.Add(new TabPageModel() {
FilterSettings = filterSettings.Clone()
});
DockWorkspace.Instance.TabPages.Add(new() { });
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.First();
ILSpySettings spySettings = this.spySettingsForMainWindow_Loaded;
this.spySettingsForMainWindow_Loaded = null;
var loadPreviousAssemblies = Options.MiscSettingsPanel.CurrentMiscSettings.LoadPreviousAssemblies;
var sessionSettings = SettingsService.Instance.SessionSettings;
if (loadPreviousAssemblies)
{
// Load AssemblyList only in Loaded event so that WPF is initialized before we start the CPU-heavy stuff.
@ -870,7 +867,7 @@ namespace ICSharpCode.ILSpy @@ -870,7 +867,7 @@ namespace ICSharpCode.ILSpy
this.assemblyList.Open(sessionSettings.ActiveAutoLoadedAssembly, true);
}
Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => OpenAssemblies(spySettings)));
Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => OpenAssemblies(SettingsService.Instance.SpySettings)));
}
void OpenAssemblies(ILSpySettings spySettings)
@ -1000,7 +997,6 @@ namespace ICSharpCode.ILSpy @@ -1000,7 +997,6 @@ namespace ICSharpCode.ILSpy
assemblyList.CollectionChanged += assemblyList_Assemblies_CollectionChanged;
assemblyListTreeNode = new AssemblyListTreeNode(assemblyList);
assemblyListTreeNode.FilterSettings = filterSettings.Clone();
assemblyListTreeNode.Select = x => SelectNode(x, inNewTabPage: false);
AssemblyTreeView.Root = assemblyListTreeNode;
@ -1064,13 +1060,7 @@ namespace ICSharpCode.ILSpy @@ -1064,13 +1060,7 @@ namespace ICSharpCode.ILSpy
public void RefreshTreeViewFilter()
{
// filterSettings is mutable; but the ILSpyTreeNode filtering assumes that filter settings are immutable.
// 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.
FilterSettings filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings.Clone();
if (assemblyListTreeNode != null)
assemblyListTreeNode.FilterSettings = filterSettings;
SearchPane.UpdateFilter(filterSettings);
SearchPane.UpdateFilter();
}
internal AssemblyListTreeNode AssemblyListTreeNode {
@ -1097,10 +1087,7 @@ namespace ICSharpCode.ILSpy @@ -1097,10 +1087,7 @@ namespace ICSharpCode.ILSpy
{
if (inNewTabPage)
{
DockWorkspace.Instance.TabPages.Add(
new TabPageModel() {
FilterSettings = filterSettings.Clone()
});
DockWorkspace.Instance.TabPages.Add(new TabPageModel() { });
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last();
AssemblyTreeView.SelectedItem = null;
}
@ -1143,10 +1130,7 @@ namespace ICSharpCode.ILSpy @@ -1143,10 +1130,7 @@ namespace ICSharpCode.ILSpy
{
if (inNewTabPage)
{
DockWorkspace.Instance.TabPages.Add(
new TabPageModel() {
FilterSettings = filterSettings.Clone()
});
DockWorkspace.Instance.TabPages.Add(new TabPageModel() { });
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last();
}
@ -1519,8 +1503,9 @@ namespace ICSharpCode.ILSpy @@ -1519,8 +1503,9 @@ namespace ICSharpCode.ILSpy
}
}
public Language CurrentLanguage => DockWorkspace.Instance.ActiveTabPage.FilterSettings.Language;
public LanguageVersion CurrentLanguageVersion => DockWorkspace.Instance.ActiveTabPage.FilterSettings.LanguageVersion;
public Language CurrentLanguage => SettingsService.Instance.SessionSettings.LanguageSettings.Language;
public LanguageVersion CurrentLanguageVersion => SettingsService.Instance.SessionSettings.LanguageSettings.LanguageVersion;
public event SelectionChangedEventHandler SelectionChanged;
@ -1590,10 +1575,7 @@ namespace ICSharpCode.ILSpy @@ -1590,10 +1575,7 @@ namespace ICSharpCode.ILSpy
{
if (inNewTabPage)
{
DockWorkspace.Instance.TabPages.Add(
new TabPageModel() {
FilterSettings = filterSettings.Clone()
});
DockWorkspace.Instance.TabPages.Add(new() { });
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last();
}
@ -1646,18 +1628,19 @@ namespace ICSharpCode.ILSpy @@ -1646,18 +1628,19 @@ namespace ICSharpCode.ILSpy
base.OnStateChanged(e);
// store window state in settings only if it's not minimized
if (this.WindowState != System.Windows.WindowState.Minimized)
sessionSettings.WindowState = this.WindowState;
SettingsService.Instance.SessionSettings.WindowState = this.WindowState;
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
var sessionSettings = SettingsService.Instance.SessionSettings;
sessionSettings.ActiveAssemblyList = assemblyList.ListName;
sessionSettings.ActiveTreeViewPath = GetPathForNode(AssemblyTreeView.SelectedItem as SharpTreeNode);
sessionSettings.ActiveAutoLoadedAssembly = GetAutoLoadedAssemblyNode(AssemblyTreeView.SelectedItem as SharpTreeNode);
sessionSettings.WindowBounds = this.RestoreBounds;
sessionSettings.DockLayout.Serialize(new XmlLayoutSerializer(DockManager));
sessionSettings.FilterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings.Clone();
sessionSettings.Save();
}

7
ILSpy/Options/DisplaySettingsPanel.xaml.cs

@ -27,6 +27,7 @@ using System.Windows.Media; @@ -27,6 +27,7 @@ using System.Windows.Media;
using System.Windows.Threading;
using System.Xml.Linq;
using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpyX.Settings;
namespace ICSharpCode.ILSpy.Options
@ -123,7 +124,7 @@ namespace ICSharpCode.ILSpy.Options @@ -123,7 +124,7 @@ namespace ICSharpCode.ILSpy.Options
s.ShowRawOffsetsAndBytesBeforeInstruction = (bool?)e.Attribute("ShowRawOffsetsAndBytesBeforeInstruction") ?? false;
s.StyleWindowTitleBar = (bool?)e.Attribute("StyleWindowTitleBar") ?? false;
s.Theme = MainWindow.Instance.SessionSettings.Theme;
s.Theme = SettingsService.Instance.SessionSettings.Theme;
return s;
}
@ -154,8 +155,8 @@ namespace ICSharpCode.ILSpy.Options @@ -154,8 +155,8 @@ namespace ICSharpCode.ILSpy.Options
section.SetAttributeValue("ShowRawOffsetsAndBytesBeforeInstruction", s.ShowRawOffsetsAndBytesBeforeInstruction);
section.SetAttributeValue("StyleWindowTitleBar", s.StyleWindowTitleBar);
MainWindow.Instance.SessionSettings.Theme = s.Theme;
var sessionSettings = MainWindow.Instance.SessionSettings.ToXml();
SettingsService.Instance.SessionSettings.Theme = s.Theme;
var sessionSettings = SettingsService.Instance.SessionSettings.ToXml();
MainWindow.Instance.CurrentDisplaySettings.CopyValues(s);

13
ILSpy/Search/SearchPane.cs

@ -50,6 +50,7 @@ namespace ICSharpCode.ILSpy.Search @@ -50,6 +50,7 @@ namespace ICSharpCode.ILSpy.Search
/// </summary>
[DataTemplate(typeof(SearchPaneModel))]
[PartCreationPolicy(CreationPolicy.Shared)]
[Export]
public partial class SearchPane : UserControl
{
const int MAX_RESULTS = 1000;
@ -57,7 +58,6 @@ namespace ICSharpCode.ILSpy.Search @@ -57,7 +58,6 @@ namespace ICSharpCode.ILSpy.Search
RunningSearch currentSearch;
bool runSearchOnNextShow;
IComparer<SearchResult> resultsComparer;
FilterSettings filterSettings;
public static readonly DependencyProperty ResultsProperty =
DependencyProperty.Register("Results", typeof(ObservableCollection<SearchResult>), typeof(SearchPane),
@ -84,11 +84,10 @@ namespace ICSharpCode.ILSpy.Search @@ -84,11 +84,10 @@ namespace ICSharpCode.ILSpy.Search
ContextMenuProvider.Add(listBox);
MessageBus<CurrentAssemblyListChangedEventArgs>.Subscribers += (sender, e) => MainWindow_Instance_CurrentAssemblyListChanged(sender, e);
filterSettings = MainWindow.Instance.SessionSettings.FilterSettings;
CompositionTarget.Rendering += UpdateResults;
// 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)SettingsService.Instance.SessionSettings.SelectedSearchMode;
}
void MainWindow_Instance_CurrentAssemblyListChanged(object sender, NotifyCollectionChangedEventArgs e)
@ -104,10 +103,8 @@ namespace ICSharpCode.ILSpy.Search @@ -104,10 +103,8 @@ namespace ICSharpCode.ILSpy.Search
}
}
internal void UpdateFilter(FilterSettings settings)
internal void UpdateFilter()
{
this.filterSettings = settings;
if (IsVisible)
{
StartSearch(this.SearchTerm);
@ -155,7 +152,7 @@ namespace ICSharpCode.ILSpy.Search @@ -155,7 +152,7 @@ namespace ICSharpCode.ILSpy.Search
void SearchModeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
MainWindow.Instance.SessionSettings.SelectedSearchMode = (SearchMode)searchModeComboBox.SelectedIndex;
SettingsService.Instance.SessionSettings.SelectedSearchMode = (SearchMode)searchModeComboBox.SelectedIndex;
StartSearch(this.SearchTerm);
}
@ -258,7 +255,7 @@ namespace ICSharpCode.ILSpy.Search @@ -258,7 +255,7 @@ namespace ICSharpCode.ILSpy.Search
searchProgressBar.IsIndeterminate = true;
startedSearch = new RunningSearch(await mainWindow.CurrentAssemblyList.GetAllAssemblies(), searchTerm,
(SearchMode)searchModeComboBox.SelectedIndex, mainWindow.CurrentLanguage,
filterSettings.ShowApiLevel);
SettingsService.Instance.SessionSettings.LanguageSettings.ShowApiLevel);
currentSearch = startedSearch;
await startedSearch.Run();

18
ILSpy/SessionSettings.cs

@ -28,6 +28,7 @@ using System.Xml.Linq; @@ -28,6 +28,7 @@ using System.Xml.Linq;
using ICSharpCode.ILSpy.Docking;
using ICSharpCode.ILSpy.Themes;
using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpyX.Search;
using ICSharpCode.ILSpyX.Settings;
@ -47,7 +48,7 @@ namespace ICSharpCode.ILSpy @@ -47,7 +48,7 @@ namespace ICSharpCode.ILSpy
if (filterSettings == null)
filterSettings = new XElement("FilterSettings");
this.FilterSettings = new FilterSettings(filterSettings);
this.LanguageSettings = new LanguageSettings(filterSettings);
this.ActiveAssemblyList = (string)doc.Element("ActiveAssemblyList");
@ -72,10 +73,15 @@ namespace ICSharpCode.ILSpy @@ -72,10 +73,15 @@ namespace ICSharpCode.ILSpy
void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
var args = new PropertyChangedEventArgs(propertyName);
PropertyChanged?.Invoke(this, args);
MessageBus.Send(this, new SessionSettingsChangedEventArgs(args));
}
public FilterSettings FilterSettings { get; internal set; }
public LanguageSettings LanguageSettings { get; }
public SearchMode SelectedSearchMode { get; set; }
public string Theme {
@ -113,16 +119,16 @@ namespace ICSharpCode.ILSpy @@ -113,16 +119,16 @@ namespace ICSharpCode.ILSpy
}
}
public WindowState WindowState = WindowState.Normal;
public WindowState WindowState;
public Rect WindowBounds;
internal static Rect DefaultWindowBounds = new Rect(10, 10, 750, 550);
public DockLayoutSettings DockLayout { get; private set; }
public DockLayoutSettings DockLayout { get; }
public XElement ToXml()
{
XElement doc = new XElement("SessionSettings");
doc.Add(this.FilterSettings.SaveAsXml());
doc.Add(this.LanguageSettings.SaveAsXml());
if (this.ActiveAssemblyList != null)
{
doc.Add(new XElement("ActiveAssemblyList", this.ActiveAssemblyList));

2
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -449,7 +449,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -449,7 +449,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
return dataObject;
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (settings.SearchTermMatches(LoadedAssembly.ShortName))
return FilterResult.Match;

2
ILSpy/TreeNodes/DerivedTypesEntryNode.cs

@ -50,7 +50,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -50,7 +50,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Icon => TypeTreeNode.GetIcon(type);
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (settings.ShowApiLevel == ApiVisibility.PublicOnly && !IsPublicAPI)
return FilterResult.Hidden;

2
ILSpy/TreeNodes/EventTreeNode.cs

@ -68,7 +68,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -68,7 +68,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
return Images.GetIcon(MemberIcon.Event, MethodTreeNode.GetOverlayIcon(@event.Accessibility), @event.IsStatic);
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (settings.ShowApiLevel == ApiVisibility.PublicOnly && !IsPublicAPI)
return FilterResult.Hidden;

2
ILSpy/TreeNodes/FieldTreeNode.cs

@ -69,7 +69,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -69,7 +69,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
return Images.GetIcon(MemberIcon.Field, MethodTreeNode.GetOverlayIcon(field.Accessibility), field.IsStatic);
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (settings.ShowApiLevel == ApiVisibility.PublicOnly && !IsPublicAPI)
return FilterResult.Hidden;

51
ILSpy/TreeNodes/ILSpyTreeNode.cs

@ -27,6 +27,7 @@ using System.Windows.Threading; @@ -27,6 +27,7 @@ using System.Windows.Threading;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpyX.Abstractions;
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
using ICSharpCode.ILSpyX.TreeView;
@ -38,25 +39,20 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -38,25 +39,20 @@ namespace ICSharpCode.ILSpy.TreeNodes
/// </summary>
public abstract class ILSpyTreeNode : SharpTreeNode, ITreeNode
{
FilterSettings filterSettings;
bool childrenNeedFiltering;
public FilterSettings FilterSettings {
get { return filterSettings; }
set {
if (filterSettings != value)
{
filterSettings = value;
OnFilterSettingsChanged();
}
}
public ILSpyTreeNode()
{
MessageBus<LanguageSettingsChangedEventArgs>.Subscribers += LanguageSettings_Changed;
}
LanguageSettings LanguageSettings => SettingsService.Instance.SessionSettings.LanguageSettings;
public Language Language {
get { return filterSettings != null ? filterSettings.Language : Languages.AllLanguages[0]; }
get { return LanguageSettings.Language ?? Languages.AllLanguages[0]; }
}
public virtual FilterResult Filter(FilterSettings settings)
public virtual FilterResult Filter(LanguageSettings settings)
{
if (string.IsNullOrEmpty(settings.SearchTerm))
return FilterResult.Match;
@ -92,7 +88,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -92,7 +88,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
return false;
}
internal protected override void OnChildrenChanged(NotifyCollectionChangedEventArgs e)
protected internal override void OnChildrenChanged(NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
@ -111,27 +107,21 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -111,27 +107,21 @@ namespace ICSharpCode.ILSpy.TreeNodes
void ApplyFilterToChild(ILSpyTreeNode child)
{
FilterResult r;
if (this.FilterSettings == null)
r = FilterResult.Match;
else
r = child.Filter(this.FilterSettings);
FilterResult r = child.Filter(this.LanguageSettings);
switch (r)
{
case FilterResult.Hidden:
child.IsHidden = true;
break;
case FilterResult.Match:
child.FilterSettings = StripSearchTerm(this.FilterSettings);
child.IsHidden = false;
break;
case FilterResult.Recurse:
child.FilterSettings = this.FilterSettings;
child.EnsureChildrenFiltered();
child.IsHidden = child.Children.All(c => c.IsHidden);
break;
case FilterResult.MatchAndRecurse:
child.FilterSettings = StripSearchTerm(this.FilterSettings);
child.EnsureChildrenFiltered();
child.IsHidden = child.Children.All(c => c.IsHidden);
break;
@ -140,19 +130,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -140,19 +130,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
}
static FilterSettings StripSearchTerm(FilterSettings filterSettings)
{
if (filterSettings == null)
return null;
if (!string.IsNullOrEmpty(filterSettings.SearchTerm))
{
filterSettings = filterSettings.Clone();
filterSettings.SearchTerm = null;
}
return filterSettings;
}
protected virtual void OnFilterSettingsChanged()
protected virtual void LanguageSettings_Changed(object sender, EventArgs e)
{
RaisePropertyChanged(nameof(Text));
if (IsVisible)
@ -166,11 +144,6 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -166,11 +144,6 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
}
/*protected override void OnIsVisibleChanged()
{
base.OnIsVisibleChanged();
EnsureChildrenFiltered();
}*/
internal void EnsureChildrenFiltered()
{

2
ILSpy/TreeNodes/MethodTreeNode.cs

@ -99,7 +99,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -99,7 +99,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
language.DecompileMethod(MethodDefinition, output, options);
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (settings.ShowApiLevel == ApiVisibility.PublicOnly && !IsPublicAPI)
return FilterResult.Hidden;

2
ILSpy/TreeNodes/NamespaceTreeNode.cs

@ -57,7 +57,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -57,7 +57,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
this.isPublicAPI = value;
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (settings.SearchTermMatches(name))
return FilterResult.MatchAndRecurse;

2
ILSpy/TreeNodes/PropertyTreeNode.cs

@ -71,7 +71,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -71,7 +71,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
MethodTreeNode.GetOverlayIcon(property.Accessibility), property.IsStatic);
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (settings.ShowApiLevel == ApiVisibility.PublicOnly && !IsPublicAPI)
return FilterResult.Hidden;

2
ILSpy/TreeNodes/ResourceListTreeNode.cs

@ -51,7 +51,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -51,7 +51,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
this.Children.Add(ResourceTreeNode.Create(r));
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (string.IsNullOrEmpty(settings.SearchTerm))
return FilterResult.MatchAndRecurse;

2
ILSpy/TreeNodes/ResourceNodes/ResourceTreeNode.cs

@ -55,7 +55,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -55,7 +55,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Icon => Images.Resource;
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (settings.ShowApiLevel == ApiVisibility.PublicOnly && (Resource.Attributes & ManifestResourceAttributes.VisibilityMask) == ManifestResourceAttributes.Private)
return FilterResult.Hidden;

4
ILSpy/TreeNodes/ThreadingSupport.cs

@ -138,7 +138,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -138,7 +138,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
get { return Resources.Loading; }
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
return FilterResult.Match;
}
@ -161,7 +161,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -161,7 +161,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
this.text = text;
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
return FilterResult.Match;
}

2
ILSpy/TreeNodes/TypeTreeNode.cs

@ -67,7 +67,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -67,7 +67,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
}
public override FilterResult Filter(FilterSettings settings)
public override FilterResult Filter(LanguageSettings settings)
{
if (settings.ShowApiLevel == ApiVisibility.PublicOnly && !IsPublicAPI)
return FilterResult.Hidden;

5
ILSpy/Util/MessageBus.cs

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
using System;
using System.Collections.Specialized;
using System.ComponentModel;
using TomsToolbox.Essentials;
@ -51,5 +52,9 @@ namespace ICSharpCode.ILSpy.Util @@ -51,5 +52,9 @@ namespace ICSharpCode.ILSpy.Util
public class CurrentAssemblyListChangedEventArgs(NotifyCollectionChangedEventArgs e) : WrappedEventArgs<NotifyCollectionChangedEventArgs>(e);
public class LanguageSettingsChangedEventArgs(PropertyChangedEventArgs e) : WrappedEventArgs<PropertyChangedEventArgs>(e);
public class SessionSettingsChangedEventArgs(PropertyChangedEventArgs e) : WrappedEventArgs<PropertyChangedEventArgs>(e);
public class DockWorkspaceActiveTabPageChangedEventArgs : EventArgs;
}

20
ILSpy/Util/SettingsService.cs

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
using ICSharpCode.ILSpyX.Settings;
namespace ICSharpCode.ILSpy.Util
{
internal class SettingsService
{
public static readonly SettingsService Instance = new SettingsService();
private SettingsService()
{
this.SpySettings = ILSpySettings.Load();
SessionSettings = new(this.SpySettings);
}
public ILSpySettings SpySettings { get; }
public SessionSettings SessionSettings { get; }
}
}

13
ILSpy/ViewModels/ManageAssemblyListsViewModel.cs

@ -27,6 +27,7 @@ using System.Windows.Input; @@ -27,6 +27,7 @@ using System.Windows.Input;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.Commands;
using ICSharpCode.ILSpy.Properties;
using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpyX;
namespace ICSharpCode.ILSpy.ViewModels
@ -174,7 +175,7 @@ namespace ICSharpCode.ILSpy.ViewModels @@ -174,7 +175,7 @@ namespace ICSharpCode.ILSpy.ViewModels
return;
manager.ClearAll();
manager.CreateDefaultAssemblyLists();
MainWindow.Instance.SessionSettings.ActiveAssemblyList = manager.AssemblyLists[0];
SettingsService.Instance.SessionSettings.ActiveAssemblyList = manager.AssemblyLists[0];
}
private void ExecuteDelete()
@ -189,9 +190,9 @@ namespace ICSharpCode.ILSpy.ViewModels @@ -189,9 +190,9 @@ namespace ICSharpCode.ILSpy.ViewModels
if (manager.AssemblyLists.Count > 0)
{
SelectedAssemblyList = manager.AssemblyLists[Math.Max(0, index - 1)];
if (MainWindow.Instance.SessionSettings.ActiveAssemblyList == assemblyList)
if (SettingsService.Instance.SessionSettings.ActiveAssemblyList == assemblyList)
{
MainWindow.Instance.SessionSettings.ActiveAssemblyList = SelectedAssemblyList;
SettingsService.Instance.SessionSettings.ActiveAssemblyList = SelectedAssemblyList;
}
}
}
@ -232,9 +233,9 @@ namespace ICSharpCode.ILSpy.ViewModels @@ -232,9 +233,9 @@ namespace ICSharpCode.ILSpy.ViewModels
string assemblyList = SelectedAssemblyList;
SelectedAssemblyList = dlg.ListName;
manager.RenameList(assemblyList, dlg.ListName);
if (MainWindow.Instance.SessionSettings.ActiveAssemblyList == assemblyList)
if (SettingsService.Instance.SessionSettings.ActiveAssemblyList == assemblyList)
{
MainWindow.Instance.SessionSettings.ActiveAssemblyList = manager.AssemblyLists[manager.AssemblyLists.Count - 1];
SettingsService.Instance.SessionSettings.ActiveAssemblyList = manager.AssemblyLists[manager.AssemblyLists.Count - 1];
}
}
}
@ -272,7 +273,7 @@ namespace ICSharpCode.ILSpy.ViewModels @@ -272,7 +273,7 @@ namespace ICSharpCode.ILSpy.ViewModels
private void ExecuteSelectAssemblyList()
{
MainWindow.Instance.SessionSettings.ActiveAssemblyList = SelectedAssemblyList;
SettingsService.Instance.SessionSettings.ActiveAssemblyList = SelectedAssemblyList;
this.parent.Close();
}
}

26
ILSpy/ViewModels/TabPageModel.cs

@ -17,11 +17,10 @@ @@ -17,11 +17,10 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ICSharpCode.ILSpy.TextView;
using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpyX;
namespace ICSharpCode.ILSpy.ViewModels
@ -33,29 +32,6 @@ namespace ICSharpCode.ILSpy.ViewModels @@ -33,29 +32,6 @@ namespace ICSharpCode.ILSpy.ViewModels
this.Title = Properties.Resources.NewTab;
}
private FilterSettings filterSettings;
public FilterSettings FilterSettings {
get => filterSettings;
set {
if (filterSettings != value)
{
filterSettings = value;
RaisePropertyChanged(nameof(FilterSettings));
}
}
}
public Language Language {
get => filterSettings.Language;
set => filterSettings.Language = value;
}
public LanguageVersion LanguageVersion {
get => filterSettings.LanguageVersion;
set => filterSettings.LanguageVersion = value;
}
private bool supportsLanguageSwitching = true;
public bool SupportsLanguageSwitching {

16
ILSpy/Views/DebugSteps.xaml.cs

@ -29,16 +29,13 @@ namespace ICSharpCode.ILSpy @@ -29,16 +29,13 @@ namespace ICSharpCode.ILSpy
#if DEBUG
ILAstLanguage language;
#endif
FilterSettings filterSettings;
public DebugSteps()
{
InitializeComponent();
#if DEBUG
MessageBus<DockWorkspaceActiveTabPageChangedEventArgs>.Subscribers += DockWorkspace_ActiveTabPageChanged;
filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
MessageBus<LanguageSettingsChangedEventArgs>.Subscribers += (sender, e) => LanguageSettings_PropertyChanged(sender, e);
MainWindow.Instance.SelectionChanged += SelectionChanged;
writingOptions.PropertyChanged += WritingOptions_PropertyChanged;
@ -51,13 +48,6 @@ namespace ICSharpCode.ILSpy @@ -51,13 +48,6 @@ namespace ICSharpCode.ILSpy
#endif
}
private void DockWorkspace_ActiveTabPageChanged(object sender, EventArgs e)
{
filterSettings.PropertyChanged -= FilterSettings_PropertyChanged;
filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings;
filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
}
private void WritingOptions_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
DecompileAsync(lastSelectedStep);
@ -71,7 +61,7 @@ namespace ICSharpCode.ILSpy @@ -71,7 +61,7 @@ namespace ICSharpCode.ILSpy
});
}
private void FilterSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
private void LanguageSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
#if DEBUG
if (e.PropertyName == "Language")

Loading…
Cancel
Save