From d1d723b0391118378168fb508ccf958a04ba20b7 Mon Sep 17 00:00:00 2001 From: ruri Date: Tue, 31 Mar 2020 19:48:07 +0200 Subject: [PATCH] Added support for GUI changes in plugins and readonly textboxes --- OpenBullet/Plugins/Build.cs | 15 ++++++----- OpenBullet/Plugins/IControl.cs | 1 - OpenBullet/Plugins/Loader.cs | 4 ++- .../Views/UserControls/PluginControl.xaml.cs | 6 +++-- .../UserControls/UserControlCheckbox.xaml | 2 +- .../UserControls/UserControlCheckbox.xaml.cs | 24 +++++++++++++---- .../UserControls/UserControlDropdown.xaml | 2 +- .../UserControls/UserControlDropdown.xaml.cs | 24 ++++++++++++++--- .../UserControls/UserControlInfoText.xaml | 2 +- .../UserControls/UserControlInfoText.xaml.cs | 22 +++++++++++---- .../UserControls/UserControlNumeric.xaml | 2 +- .../UserControls/UserControlNumeric.xaml.cs | 26 ++++++++++++++---- .../Views/UserControls/UserControlText.xaml | 2 +- .../UserControls/UserControlText.xaml.cs | 27 ++++++++++++++----- .../UserControls/UserControlTextMulti.xaml | 2 +- .../UserControls/UserControlTextMulti.xaml.cs | 24 ++++++++++++++--- PluginFramework/Attributes/Text.cs | 2 ++ PluginFramework/Attributes/TextMulti.cs | 2 ++ 18 files changed, 143 insertions(+), 46 deletions(-) diff --git a/OpenBullet/Plugins/Build.cs b/OpenBullet/Plugins/Build.cs index d873fba..618593e 100644 --- a/OpenBullet/Plugins/Build.cs +++ b/OpenBullet/Plugins/Build.cs @@ -1,6 +1,7 @@ using OpenBullet.Views.UserControls; using PluginFramework; using PluginFramework.Attributes; +using RuriLib.ViewModels; using System; using System.Reflection; @@ -8,7 +9,7 @@ namespace OpenBullet.Plugins { public static class Build { - public static UserControlContainer InputField(object plugin, PropertyInfo property) + public static UserControlContainer InputField(object plugin, PropertyInfo property, ViewModelBase viewModel = null) { // Get the first attribute var attribute = property.GetCustomAttribute(); @@ -19,23 +20,23 @@ namespace OpenBullet.Plugins switch (attribute) { case InfoText a: - control = new UserControlInfoText(defaultValue); + control = new UserControlInfoText(defaultValue, viewModel); break; case Text a: - control = new UserControlText(defaultValue); + control = new UserControlText(defaultValue, a.readOnly, viewModel); break; case Numeric a: - control = new UserControlNumeric(defaultValue, a.minimum, a.maximum); + control = new UserControlNumeric(defaultValue, a.minimum, a.maximum, viewModel); break; case Checkbox a: - control = new UserControlCheckbox(defaultValue); + control = new UserControlCheckbox(defaultValue, viewModel); break; case TextMulti a: - control = new UserControlTextMulti(defaultValue); + control = new UserControlTextMulti(defaultValue, a.readOnly, viewModel); break; case FilePicker a: @@ -43,7 +44,7 @@ namespace OpenBullet.Plugins break; case Dropdown a: - control = new UserControlDropdown(defaultValue, a.options); + control = new UserControlDropdown(defaultValue, a.options, viewModel); break; case WordlistPicker a: diff --git a/OpenBullet/Plugins/IControl.cs b/OpenBullet/Plugins/IControl.cs index 70bb39b..b17de7a 100644 --- a/OpenBullet/Plugins/IControl.cs +++ b/OpenBullet/Plugins/IControl.cs @@ -8,7 +8,6 @@ namespace OpenBullet.Plugins { public interface IControl { - string Name { get; set; } dynamic GetValue(); void SetValue(dynamic value); } diff --git a/OpenBullet/Plugins/Loader.cs b/OpenBullet/Plugins/Loader.cs index 126a80b..49e8743 100644 --- a/OpenBullet/Plugins/Loader.cs +++ b/OpenBullet/Plugins/Loader.cs @@ -1,6 +1,7 @@ using OpenBullet.Views.UserControls; using PluginFramework; using RuriLib; +using RuriLib.ViewModels; using System; using System.Collections.Generic; using System.IO; @@ -41,7 +42,8 @@ namespace OpenBullet.Plugins // If it implements the IPlugin interface if (type.GetInterface(nameof(IPlugin)) == typeof(IPlugin)) { - plugins.Add(new PluginControl(type, OB.App)); + plugins.Add(new PluginControl(type, OB.App, + type.GetTypeInfo().IsSubclassOf(typeof(ViewModelBase)))); } // If it implements the IBlockPlugin interface and derives from BlockBase else if (type.GetInterface(nameof(IBlockPlugin)) == typeof(IBlockPlugin) diff --git a/OpenBullet/Views/UserControls/PluginControl.xaml.cs b/OpenBullet/Views/UserControls/PluginControl.xaml.cs index 6ba970b..6571e4e 100644 --- a/OpenBullet/Views/UserControls/PluginControl.xaml.cs +++ b/OpenBullet/Views/UserControls/PluginControl.xaml.cs @@ -1,6 +1,7 @@ using OpenBullet.Plugins; using PluginFramework; using RuriLib.Interfaces; +using RuriLib.ViewModels; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -19,7 +20,7 @@ namespace OpenBullet.Views.UserControls public ObservableCollection Controls { get; set; } = new ObservableCollection(); private List ValidProperties { get; set; } = new List(); - public PluginControl(Type type, IApplication app) + public PluginControl(Type type, IApplication app, bool supportsPropertyChanged = false) { InitializeComponent(); DataContext = this; @@ -40,7 +41,8 @@ namespace OpenBullet.Views.UserControls foreach (var p in type.GetProperties().Where(p => Check.InputProperty(p))) { ValidProperties.Add(p); - Controls.Add(Build.InputField(Plugin, p)); + Controls.Add(Build.InputField(Plugin, p, + supportsPropertyChanged ? (Plugin as ViewModelBase) : null)); } // For each valid method, add button diff --git a/OpenBullet/Views/UserControls/UserControlCheckbox.xaml b/OpenBullet/Views/UserControls/UserControlCheckbox.xaml index f093e1c..029558f 100644 --- a/OpenBullet/Views/UserControls/UserControlCheckbox.xaml +++ b/OpenBullet/Views/UserControls/UserControlCheckbox.xaml @@ -12,6 +12,6 @@ - + diff --git a/OpenBullet/Views/UserControls/UserControlCheckbox.xaml.cs b/OpenBullet/Views/UserControls/UserControlCheckbox.xaml.cs index 4fa0596..3a4c26e 100644 --- a/OpenBullet/Views/UserControls/UserControlCheckbox.xaml.cs +++ b/OpenBullet/Views/UserControls/UserControlCheckbox.xaml.cs @@ -1,4 +1,7 @@ using OpenBullet.Plugins; +using RuriLib.ViewModels; +using System; +using System.ComponentModel; using System.Windows.Controls; namespace OpenBullet.Views.UserControls @@ -8,24 +11,35 @@ namespace OpenBullet.Views.UserControls /// public partial class UserControlCheckbox : UserControl, IControl { - public bool Value { get; set; } + private ViewModelBase viewModel; - public UserControlCheckbox(bool value) + public UserControlCheckbox(bool defaultValue, ViewModelBase viewModel = null) { InitializeComponent(); DataContext = this; - Value = value; + SetValue(defaultValue); + + this.viewModel = viewModel; + if (viewModel != null) + { + viewModel.PropertyChanged += ViewModel_PropertyChanged; + } + } + + private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + SetValue(viewModel.GetType().GetProperty(e.PropertyName).GetValue(viewModel)); } public dynamic GetValue() { - return Value; + return valueCheckbox.IsChecked.Value; } public void SetValue(dynamic value) { - Value = (bool)value; + valueCheckbox.IsChecked = (bool)value; } } } diff --git a/OpenBullet/Views/UserControls/UserControlDropdown.xaml b/OpenBullet/Views/UserControls/UserControlDropdown.xaml index 7ef6135..77a789d 100644 --- a/OpenBullet/Views/UserControls/UserControlDropdown.xaml +++ b/OpenBullet/Views/UserControls/UserControlDropdown.xaml @@ -12,6 +12,6 @@ - + diff --git a/OpenBullet/Views/UserControls/UserControlDropdown.xaml.cs b/OpenBullet/Views/UserControls/UserControlDropdown.xaml.cs index 4bc8d55..9d1e936 100644 --- a/OpenBullet/Views/UserControls/UserControlDropdown.xaml.cs +++ b/OpenBullet/Views/UserControls/UserControlDropdown.xaml.cs @@ -1,4 +1,7 @@ using OpenBullet.Plugins; +using RuriLib.ViewModels; +using System; +using System.ComponentModel; using System.Windows.Controls; namespace OpenBullet.Views.UserControls @@ -8,27 +11,40 @@ namespace OpenBullet.Views.UserControls /// public partial class UserControlDropdown : UserControl, IControl { - public UserControlDropdown(string value, string[] options) + private ViewModelBase viewModel; + + public UserControlDropdown(string value, string[] options, ViewModelBase viewModel = null) { InitializeComponent(); DataContext = this; foreach (var option in options) { - Dropdown.Items.Add(option); + valueDropdown.Items.Add(option); } SetValue(value); + + this.viewModel = viewModel; + if (viewModel != null) + { + viewModel.PropertyChanged += ViewModel_PropertyChanged; + } + } + + private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + SetValue(viewModel.GetType().GetProperty(e.PropertyName).GetValue(viewModel)); } public dynamic GetValue() { - return Dropdown.SelectedValue; + return valueDropdown.SelectedValue; } public void SetValue(dynamic value) { - Dropdown.SelectedValue = (string)value; + valueDropdown.SelectedValue = (string)value; } } } diff --git a/OpenBullet/Views/UserControls/UserControlInfoText.xaml b/OpenBullet/Views/UserControls/UserControlInfoText.xaml index 2c477a3..db7a4f4 100644 --- a/OpenBullet/Views/UserControls/UserControlInfoText.xaml +++ b/OpenBullet/Views/UserControls/UserControlInfoText.xaml @@ -6,5 +6,5 @@ xmlns:local="clr-namespace:OpenBullet.Views.UserControls" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> -