From 2f3d9573c9181724b61c26b5fe950e582c334376 Mon Sep 17 00:00:00 2001 From: InfinityGhost Date: Mon, 25 Jul 2022 20:56:13 -0400 Subject: [PATCH] Fix PluginSettingsEditor synchronization --- .../Output/MacOSInteropBenchmark.cs | 2 - .../Output/WindowsInteropBenchmark.cs | 2 - OpenTabletDriver.Console/ProgramCommands.cs | 3 +- OpenTabletDriver.Daemon/DriverDaemon.cs | 2 +- OpenTabletDriver.Desktop/RPC/RpcClient.cs | 1 - OpenTabletDriver.Tests/ConfigurationTest.cs | 3 - .../ReportParserProviderTest.cs | 1 - .../Comparers/IdentifierComparer.cs | 1 - .../OpenTabletDriver.UX.MacOS.csproj | 1 + .../Controls/Editors/PluginSettingsEditor.cs | 26 ++---- .../Editors/PluginSettingsEditorList.cs | 74 ---------------- .../Controls/Editors/PluginSettingsPanel.cs | 84 +++++++++++++++++++ OpenTabletDriver.UX/Controls/FiltersPanel.cs | 15 ++-- OpenTabletDriver.UX/Controls/ProfilePanel.cs | 15 +++- OpenTabletDriver.UX/Controls/ToolsPanel.cs | 19 ++--- 15 files changed, 123 insertions(+), 126 deletions(-) delete mode 100644 OpenTabletDriver.UX/Controls/Editors/PluginSettingsEditorList.cs create mode 100644 OpenTabletDriver.UX/Controls/Editors/PluginSettingsPanel.cs diff --git a/OpenTabletDriver.Benchmarks/Output/MacOSInteropBenchmark.cs b/OpenTabletDriver.Benchmarks/Output/MacOSInteropBenchmark.cs index 892399cdb..ecec86be0 100644 --- a/OpenTabletDriver.Benchmarks/Output/MacOSInteropBenchmark.cs +++ b/OpenTabletDriver.Benchmarks/Output/MacOSInteropBenchmark.cs @@ -2,8 +2,6 @@ using BenchmarkDotNet.Attributes; using Microsoft.Extensions.DependencyInjection; using OpenTabletDriver.Desktop.Interop; -using OpenTabletDriver.Desktop.Interop.Input.Absolute; -using OpenTabletDriver.Desktop.Interop.Input.Relative; using OpenTabletDriver.Platform.Pointer; namespace OpenTabletDriver.Benchmarks.Output diff --git a/OpenTabletDriver.Benchmarks/Output/WindowsInteropBenchmark.cs b/OpenTabletDriver.Benchmarks/Output/WindowsInteropBenchmark.cs index cd6582440..4005e0ca1 100644 --- a/OpenTabletDriver.Benchmarks/Output/WindowsInteropBenchmark.cs +++ b/OpenTabletDriver.Benchmarks/Output/WindowsInteropBenchmark.cs @@ -2,8 +2,6 @@ using BenchmarkDotNet.Attributes; using Microsoft.Extensions.DependencyInjection; using OpenTabletDriver.Desktop.Interop; -using OpenTabletDriver.Desktop.Interop.Input.Absolute; -using OpenTabletDriver.Desktop.Interop.Input.Relative; using OpenTabletDriver.Platform.Pointer; namespace OpenTabletDriver.Benchmarks.Output diff --git a/OpenTabletDriver.Console/ProgramCommands.cs b/OpenTabletDriver.Console/ProgramCommands.cs index 0b3f44b66..08c3261d3 100644 --- a/OpenTabletDriver.Console/ProgramCommands.cs +++ b/OpenTabletDriver.Console/ProgramCommands.cs @@ -10,7 +10,6 @@ using OpenTabletDriver.Desktop.Profiles; using OpenTabletDriver.Desktop.Reflection; using OpenTabletDriver.Output; -using OpenTabletDriver.Tablet; using static System.Console; namespace OpenTabletDriver.Console @@ -351,7 +350,7 @@ public async Task EditSettings(string? editor = null) { await using (var fs = File.OpenRead(path)) { - var newSettings = Serialization.Deserialize(fs); + var newSettings = Serialization.Deserialize(fs)!; await ApplySettings(newSettings); await Out.WriteLineAsync("Settings were successfully applied."); } diff --git a/OpenTabletDriver.Daemon/DriverDaemon.cs b/OpenTabletDriver.Daemon/DriverDaemon.cs index bce04fedd..6bba5cd81 100644 --- a/OpenTabletDriver.Daemon/DriverDaemon.cs +++ b/OpenTabletDriver.Daemon/DriverDaemon.cs @@ -125,7 +125,7 @@ public async Task Initialize() private Collection LogMessages { get; } = new Collection(); private Collection Tools { get; } = new Collection(); -#if !DEBUG +#if RELEASE private SleepDetectionThread? SleepDetection { set; get; } #endif diff --git a/OpenTabletDriver.Desktop/RPC/RpcClient.cs b/OpenTabletDriver.Desktop/RPC/RpcClient.cs index 0168b4281..7a5b4df33 100644 --- a/OpenTabletDriver.Desktop/RPC/RpcClient.cs +++ b/OpenTabletDriver.Desktop/RPC/RpcClient.cs @@ -1,7 +1,6 @@ using System; using System.IO.Pipes; using System.Threading.Tasks; -using JetBrains.Annotations; using OpenTabletDriver.Desktop.RPC.Messages; using StreamJsonRpc; diff --git a/OpenTabletDriver.Tests/ConfigurationTest.cs b/OpenTabletDriver.Tests/ConfigurationTest.cs index 009023cd3..f2ae18018 100644 --- a/OpenTabletDriver.Tests/ConfigurationTest.cs +++ b/OpenTabletDriver.Tests/ConfigurationTest.cs @@ -4,9 +4,6 @@ using System.Linq; using Microsoft.Extensions.DependencyInjection; using OpenTabletDriver.Components; -using OpenTabletDriver.Configurations; -using OpenTabletDriver.Desktop; -using OpenTabletDriver.Desktop.Interop.AppInfo; using OpenTabletDriver.Tablet; using Xunit; using Xunit.Abstractions; diff --git a/OpenTabletDriver.Tests/ReportParserProviderTest.cs b/OpenTabletDriver.Tests/ReportParserProviderTest.cs index 25076f460..27386f570 100644 --- a/OpenTabletDriver.Tests/ReportParserProviderTest.cs +++ b/OpenTabletDriver.Tests/ReportParserProviderTest.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.DependencyInjection; using OpenTabletDriver.Components; using OpenTabletDriver.Configurations.Parsers.XP_Pen; -using OpenTabletDriver.Desktop; using OpenTabletDriver.Tablet; using Xunit; diff --git a/OpenTabletDriver.Tools.udev/Comparers/IdentifierComparer.cs b/OpenTabletDriver.Tools.udev/Comparers/IdentifierComparer.cs index f0ea94750..6b3963485 100644 --- a/OpenTabletDriver.Tools.udev/Comparers/IdentifierComparer.cs +++ b/OpenTabletDriver.Tools.udev/Comparers/IdentifierComparer.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using OpenTabletDriver.Tablet; namespace OpenTabletDriver.Tools.udev.Comparers diff --git a/OpenTabletDriver.UX.MacOS/OpenTabletDriver.UX.MacOS.csproj b/OpenTabletDriver.UX.MacOS/OpenTabletDriver.UX.MacOS.csproj index 9c81e591a..6b20b3a30 100644 --- a/OpenTabletDriver.UX.MacOS/OpenTabletDriver.UX.MacOS.csproj +++ b/OpenTabletDriver.UX.MacOS/OpenTabletDriver.UX.MacOS.csproj @@ -5,6 +5,7 @@ $(FrameworkBase) enable enable + osx-x64;osx-arm64 diff --git a/OpenTabletDriver.UX/Controls/Editors/PluginSettingsEditor.cs b/OpenTabletDriver.UX/Controls/Editors/PluginSettingsEditor.cs index a87f34979..a027e2812 100644 --- a/OpenTabletDriver.UX/Controls/Editors/PluginSettingsEditor.cs +++ b/OpenTabletDriver.UX/Controls/Editors/PluginSettingsEditor.cs @@ -1,37 +1,21 @@ using Eto.Forms; +using OpenTabletDriver.Desktop.Reflection; using OpenTabletDriver.UX.Components; -using OpenTabletDriver.UX.ViewModels; namespace OpenTabletDriver.UX.Controls.Editors { public class PluginSettingsEditor : DesktopPanel { - private readonly IControlBuilder _controlBuilder; - private readonly Placeholder _placeholder; - - public PluginSettingsEditor(IControlBuilder controlBuilder) - { - _controlBuilder = controlBuilder; - - Content = _placeholder = new Placeholder("No plugin selected."); - } - - protected override void OnDataContextChanged(EventArgs e) + public PluginSettingsEditor(IControlBuilder controlBuilder, PluginSettings settings, Type type) { - base.OnDataContextChanged(e); - - if (DataContext is not SettingsViewModel { Settings: not null, Type: not null } model) - { - Content = _placeholder; - return; - } + DataContext = settings; var enableToggle = new CheckBox { Text = "Enable" }; - enableToggle.CheckedBinding.BindDataContext((SettingsViewModel m) => m.Settings.Enable); + enableToggle.CheckedBinding.BindDataContext((PluginSettings s) => s.Enable); var layout = new StackLayout { @@ -44,7 +28,7 @@ protected override void OnDataContextChanged(EventArgs e) } }; - foreach (var control in _controlBuilder.Generate(model.Settings, model.Type)) + foreach (var control in controlBuilder.Generate(settings, type)) { var item = new StackLayoutItem(control); layout.Items.Add(item); diff --git a/OpenTabletDriver.UX/Controls/Editors/PluginSettingsEditorList.cs b/OpenTabletDriver.UX/Controls/Editors/PluginSettingsEditorList.cs deleted file mode 100644 index 4099c207d..000000000 --- a/OpenTabletDriver.UX/Controls/Editors/PluginSettingsEditorList.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.Collections; -using System.Collections.Immutable; -using System.Reflection; -using Eto.Drawing; -using Eto.Forms; -using OpenTabletDriver.Desktop.Reflection; -using OpenTabletDriver.UX.Components; -using OpenTabletDriver.UX.ViewModels; - -namespace OpenTabletDriver.UX.Controls.Editors -{ - public class PluginSettingsEditorList : DesktopPanel where T : class - { - private readonly ListBox _list; - private readonly IPluginFactory _pluginFactory; - private readonly PluginSettingsEditor _settingsPanel; - private readonly App _app; - - // TODO: Fix discard/load not updating settings - public PluginSettingsEditorList(IControlBuilder controlBuilder, IPluginFactory pluginFactory, IPluginManager pluginManager, App app) - { - _app = app; - _pluginFactory = pluginFactory; - - _list = new ListBox - { - ItemKeyBinding = Binding.Property(t => t.FullName!), - ItemTextBinding = Binding.Property(t => t.GetFriendlyName() ?? t.FullName!) - }; - - pluginManager.AssembliesChanged += (_, _) => Refresh(); - Refresh(); - - _settingsPanel = controlBuilder.Build(); - - _list.SelectedIndexChanged += (_, _) => - { - var type = _list.SelectedItem; - if (DataContext is PluginSettingsCollection settingsCollection && settingsCollection.FromType(type) is PluginSettings settings) - _settingsPanel.DataContext = new SettingsViewModel(settings, type); - else - _settingsPanel.DataContext = null; - }; - } - - private void Refresh() - { - var items = _pluginFactory.GetMatchingTypes(typeof(T)).ToImmutableArray(); - _list.DataStore = items; - - if (items.Any()) - { - Content = new Splitter - { - Panel1 = new Panel - { - MinimumSize = new Size(250, 0), - Content = _list - }, - Panel2 = _settingsPanel - }; - } - else - { - var button = new Button((_, _) => _app.ShowWindow()) - { - Text = "Show plugin manager..." - }; - - Content = new Placeholder("No plugins of this type are installed.", button); - } - } - } -} diff --git a/OpenTabletDriver.UX/Controls/Editors/PluginSettingsPanel.cs b/OpenTabletDriver.UX/Controls/Editors/PluginSettingsPanel.cs new file mode 100644 index 000000000..720cf21f4 --- /dev/null +++ b/OpenTabletDriver.UX/Controls/Editors/PluginSettingsPanel.cs @@ -0,0 +1,84 @@ +using System.Collections.Immutable; +using System.Reflection; +using Eto.Drawing; +using Eto.Forms; +using OpenTabletDriver.Desktop.Reflection; +using OpenTabletDriver.UX.Components; + +namespace OpenTabletDriver.UX.Controls.Editors +{ + public abstract class PluginSettingsPanel : DesktopPanel where T : class + { + private readonly IPluginFactory _pluginFactory; + private readonly IControlBuilder _controlBuilder; + private readonly App _app; + private readonly ListBox _list; + private readonly Splitter _splitter; + private readonly Placeholder _placeholder; + + protected PluginSettingsPanel( + IControlBuilder controlBuilder, + IPluginFactory pluginFactory, + App app, + IPluginManager pluginManager + ) + { + _controlBuilder = controlBuilder; + _pluginFactory = pluginFactory; + _app = app; + + _splitter = new Splitter + { + Panel1 = new Panel + { + MinimumSize = new Size(250, 0), + Content = _list = new ListBox + { + ItemKeyBinding = Binding.Property(t => t.FullName!), + ItemTextBinding = Binding.Property(t => t.GetFriendlyName() ?? t.FullName!) + } + }, + Panel2 = _placeholder = new Placeholder("No plugin selected.") + }; + + pluginManager.AssembliesChanged += (_, _) => Refresh(); + DataContextChanged += (_, _) => UpdateContent(); + _list.SelectedIndexChanged += (_, _) => UpdateContent(); + + Refresh(); + } + + protected abstract PluginSettingsCollection? Settings { get; } + + private void Refresh() + { + var items = _pluginFactory.GetMatchingTypes(typeof(T)).ToImmutableArray(); + _list.DataStore = items; + + if (items.Any()) + { + Content = _splitter; + UpdateContent(); + } + else + { + var button = new Button((_, _) => _app.ShowWindow()) + { + Text = "Show plugin manager..." + }; + + Content = new Placeholder("No plugins of this type are installed.", button); + } + } + + private void UpdateContent() + { + var type = _list.SelectedItem; + + if (Settings?.FromType(type) is PluginSettings settings) + _splitter.Panel2 = _controlBuilder.Build(settings, type); + else + _splitter.Panel2 = _placeholder; + } + } +} diff --git a/OpenTabletDriver.UX/Controls/FiltersPanel.cs b/OpenTabletDriver.UX/Controls/FiltersPanel.cs index be849b327..2f2080b9d 100644 --- a/OpenTabletDriver.UX/Controls/FiltersPanel.cs +++ b/OpenTabletDriver.UX/Controls/FiltersPanel.cs @@ -1,17 +1,22 @@ using OpenTabletDriver.Desktop.Profiles; +using OpenTabletDriver.Desktop.Reflection; using OpenTabletDriver.Output; using OpenTabletDriver.UX.Components; using OpenTabletDriver.UX.Controls.Editors; namespace OpenTabletDriver.UX.Controls { - public class FiltersPanel : DesktopPanel + public class FiltersPanel : PluginSettingsPanel { - public FiltersPanel(IControlBuilder controlBuilder) + public FiltersPanel( + IControlBuilder controlBuilder, + IPluginFactory pluginFactory, + App app, + IPluginManager pluginManager + ) : base(controlBuilder, pluginFactory, app, pluginManager) { - var editor = controlBuilder.Build>(); - editor.DataContextBinding.BindDataContext((Profile p) => p.Filters); - Content = editor; } + + protected override PluginSettingsCollection? Settings => (DataContext as Profile)?.Filters; } } diff --git a/OpenTabletDriver.UX/Controls/ProfilePanel.cs b/OpenTabletDriver.UX/Controls/ProfilePanel.cs index 62be41998..17d298bd4 100644 --- a/OpenTabletDriver.UX/Controls/ProfilePanel.cs +++ b/OpenTabletDriver.UX/Controls/ProfilePanel.cs @@ -3,6 +3,7 @@ using OpenTabletDriver.Desktop.Contracts; using OpenTabletDriver.Desktop.Profiles; using OpenTabletDriver.UX.Components; +using Application = Eto.Forms.Application; namespace OpenTabletDriver.UX.Controls { @@ -32,7 +33,7 @@ public ProfilePanel(IDriverDaemon daemon, IControlBuilder controlBuilder, App ap { Pages = { - logPage + placeholderPage } }; @@ -50,6 +51,8 @@ public ProfilePanel(IDriverDaemon daemon, IControlBuilder controlBuilder, App ap DataContextChanged += delegate { + var prevPage = tabControl.SelectedPage; + var pages = tabControl.Pages; pages.Clear(); @@ -74,14 +77,20 @@ public ProfilePanel(IDriverDaemon daemon, IControlBuilder controlBuilder, App ap pages.Add(mousePage); pages.Add(toolsPage); + pages.Add(logPage); + + if (prevPage != placeholderPage && pages.Contains(prevPage)) + tabControl.SelectedPage = prevPage; + else + tabControl.SelectedIndex = 0; } else { pages.Add(placeholderPage); + pages.Add(logPage); + tabControl.SelectedPage = placeholderPage; } - - pages.Add(logPage); }; } diff --git a/OpenTabletDriver.UX/Controls/ToolsPanel.cs b/OpenTabletDriver.UX/Controls/ToolsPanel.cs index 925af2585..396d270f9 100644 --- a/OpenTabletDriver.UX/Controls/ToolsPanel.cs +++ b/OpenTabletDriver.UX/Controls/ToolsPanel.cs @@ -1,24 +1,23 @@ +using OpenTabletDriver.Desktop.Reflection; using OpenTabletDriver.UX.Components; using OpenTabletDriver.UX.Controls.Editors; namespace OpenTabletDriver.UX.Controls { - public class ToolsPanel : DesktopPanel + public class ToolsPanel : PluginSettingsPanel { - private readonly PluginSettingsEditorList _editor; private readonly App _app; - public ToolsPanel(IControlBuilder controlBuilder, App app) + public ToolsPanel( + IControlBuilder controlBuilder, + IPluginFactory pluginFactory, + App app, + IPluginManager pluginManager + ) : base(controlBuilder, pluginFactory, app, pluginManager) { _app = app; - Content = _editor = controlBuilder.Build>(); } - protected override void OnDataContextChanged(EventArgs e) - { - base.OnDataContextChanged(e); - - _editor.DataContext = _app.Settings.Tools; - } + protected override PluginSettingsCollection? Settings => DataContext is null ? null : _app.Settings.Tools; } }