From fa26e6b7da19421e5dbaba73ef48aa5bac5ecc3b Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 9 Mar 2021 23:30:06 +0100 Subject: [PATCH] Plugin settings - Open settings as an extra window instead of a dialog Conditions UI - Display condition results while editing Conditions UI - Added event trigger indicator while editing --- .../Conditions/DataModelConditionEvent.cs | 11 ++--- .../Models/Surface/Layout/ArtemisLayout.cs | 6 --- .../DataModelConditionPredicateViewModel.cs | 5 +++ .../Abstract/DataModelConditionViewModel.cs | 10 +++++ .../DataModelConditionEventView.xaml | 40 ++++++++++++++++++- .../DataModelConditionEventViewModel.cs | 19 ++++++++- .../DataModelConditionGroupView.xaml | 27 +++++++++++-- .../DataModelConditionGroupViewModel.cs | 22 ++++++---- .../DataModelConditionListView.xaml | 22 +++++++++- .../DataModelConditionListViewModel.cs | 8 ++++ ...taModelConditionEventPredicateViewModel.cs | 5 +++ ...ataModelConditionGeneralPredicateView.xaml | 20 ++++++++++ ...ModelConditionGeneralPredicateViewModel.cs | 5 +++ ...ataModelConditionListPredicateViewModel.cs | 5 +++ .../DisplayConditionsView.xaml | 16 ++++++-- .../DisplayConditionsViewModel.cs | 12 +++++- .../Tabs/Plugins/PluginSettingsViewModel.cs | 2 +- 17 files changed, 205 insertions(+), 30 deletions(-) diff --git a/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionEvent.cs b/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionEvent.cs index 8ae6d5411..64529c531 100644 --- a/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionEvent.cs +++ b/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionEvent.cs @@ -12,7 +12,6 @@ namespace Artemis.Core { private bool _disposed; private bool _reinitializing; - private DateTime _lastTrigger; /// /// Creates a new instance of the class @@ -39,6 +38,8 @@ namespace Artemis.Core /// public DataModelPath? EventPath { get; private set; } + public DateTime LastTrigger { get; private set; } + /// /// Gets or sets the type of argument the event provides /// @@ -55,10 +56,10 @@ namespace Artemis.Core if (EventPath?.GetValue() is not IDataModelEvent dataModelEvent) return false; // Only evaluate to true once every time the event has been triggered since the last evaluation - if (dataModelEvent.LastTrigger <= _lastTrigger) + if (dataModelEvent.LastTrigger <= LastTrigger) return false; - _lastTrigger = DateTime.Now; + LastTrigger = DateTime.Now; // If there is a child (root group), it must evaluate to true whenever the event triggered if (Children.Any()) @@ -171,8 +172,8 @@ namespace Artemis.Core AddChild(new DataModelConditionGroup(this)); } - if (EventPath?.GetValue() is IDataModelEvent dataModelEvent) - _lastTrigger = dataModelEvent.LastTrigger; + if (EventPath?.GetValue() is IDataModelEvent dataModelEvent) + LastTrigger = dataModelEvent.LastTrigger; } private Type? GetEventArgumentType() diff --git a/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs b/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs index cc837ca3b..7ff43d6ef 100644 --- a/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs +++ b/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs @@ -65,12 +65,6 @@ namespace Artemis.Core /// public LayoutCustomDeviceData LayoutCustomDeviceData { get; private set; } = null!; - public void ReloadFromDisk() - { - Leds.Clear(); - LoadLayout(); - } - internal void ApplyDevice(ArtemisDevice artemisDevice) { Device = artemisDevice; diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionPredicateViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionPredicateViewModel.cs index f0a4a4ba5..6efb8a33a 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionPredicateViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionPredicateViewModel.cs @@ -67,6 +67,11 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions.Abstract protected SolidColorBrush LeftSideColor { get; set; } + public override void Evaluate() + { + IsConditionMet = DataModelConditionPredicate.Evaluate(); + } + public override void Delete() { base.Delete(); diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionViewModel.cs index 0cae105e4..b2f94a711 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionViewModel.cs @@ -8,6 +8,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions.Abstract public abstract class DataModelConditionViewModel : Conductor.Collection.AllActive { private DataModelDynamicViewModel _leftSideSelectionViewModel; + private bool _isConditionMet; protected DataModelConditionViewModel(DataModelConditionPart model) { @@ -22,8 +23,17 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions.Abstract set => SetAndNotify(ref _leftSideSelectionViewModel, value); } + public bool IsConditionMet + { + get => _isConditionMet; + set => SetAndNotify(ref _isConditionMet, value); + } + + public abstract void Update(); + public abstract void Evaluate(); + public virtual void Delete() { Model.Parent.RemoveChild(Model); diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventView.xaml b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventView.xaml index f71fb5e79..8b9a2b81b 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventView.xaml @@ -13,7 +13,14 @@ + + + + + + + @@ -21,6 +28,7 @@ + @@ -52,7 +60,37 @@ triggered - + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventViewModel.cs index b22a5fe17..e864ce342 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventViewModel.cs @@ -15,6 +15,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions private readonly IDataModelConditionsVmFactory _dataModelConditionsVmFactory; private readonly IDataModelUIService _dataModelUIService; private readonly IProfileEditorService _profileEditorService; + private DateTime _lastTrigger; public DataModelConditionEventViewModel(DataModelConditionEvent dataModelConditionEvent, IProfileEditorService profileEditorService, @@ -24,10 +25,18 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions _profileEditorService = profileEditorService; _dataModelUIService = dataModelUIService; _dataModelConditionsVmFactory = dataModelConditionsVmFactory; + + _lastTrigger = DataModelConditionEvent.LastTrigger; } public DataModelConditionEvent DataModelConditionEvent => (DataModelConditionEvent) Model; + public DateTime LastTrigger + { + get => _lastTrigger; + set => SetAndNotify(ref _lastTrigger, value); + } + public void Initialize() { LeftSideSelectionViewModel = _dataModelUIService.GetDynamicSelectionViewModel(_profileEditorService.GetCurrentModule()); @@ -36,7 +45,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions IReadOnlyCollection editors = _dataModelUIService.RegisteredDataModelEditors; List supportedInputTypes = new() {typeof(DataModelEvent), typeof(DataModelEvent<>)}; - + LeftSideSelectionViewModel.FilterTypes = supportedInputTypes.ToArray(); LeftSideSelectionViewModel.ButtonBrush = new SolidColorBrush(Color.FromRgb(185, 164, 10)); LeftSideSelectionViewModel.Placeholder = "Select an event"; @@ -74,6 +83,12 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions childViewModel.Update(); } + public override void Evaluate() + { + LastTrigger = DataModelConditionEvent.LastTrigger; + IsConditionMet = DataModelConditionEvent.Evaluate(); + } + public void ApplyEvent() { DataModelConditionEvent.UpdateEvent(LeftSideSelectionViewModel.DataModelPath); @@ -104,7 +119,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions LeftSideSelectionViewModel.Dispose(); LeftSideSelectionViewModel.PropertySelected -= LeftSideSelectionViewModelOnPropertySelected; } - + #endregion } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionGroupView.xaml b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionGroupView.xaml index 0e4f1b687..421cf840d 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionGroupView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionGroupView.xaml @@ -28,6 +28,7 @@ + @@ -115,9 +116,9 @@ - @@ -133,7 +134,27 @@ - + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionGroupViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionGroupViewModel.cs index adc568df4..437fe3252 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionGroupViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionGroupViewModel.cs @@ -1,12 +1,10 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Artemis.Core; using Artemis.UI.Extensions; using Artemis.UI.Ninject.Factories; using Artemis.UI.Screens.ProfileEditor.Conditions.Abstract; -using Artemis.UI.Screens.ProfileEditor.DisplayConditions; using Artemis.UI.Shared.Services; using Humanizer; using Stylet; @@ -17,9 +15,9 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions { private readonly IDataModelConditionsVmFactory _dataModelConditionsVmFactory; private readonly IProfileEditorService _profileEditorService; + private bool _isEventGroup; private bool _isInitialized; private bool _isRootGroup; - private bool _isEventGroup; public DataModelConditionGroupViewModel(DataModelConditionGroup dataModelConditionGroup, ConditionGroupType groupType, @@ -31,7 +29,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions _profileEditorService = profileEditorService; _dataModelConditionsVmFactory = dataModelConditionsVmFactory; - Items.CollectionChanged += (sender, args) => NotifyOfPropertyChange(nameof(DisplayBooleanOperator)); + Items.CollectionChanged += (_, _) => NotifyOfPropertyChange(nameof(DisplayBooleanOperator)); Execute.PostToUIThread(async () => { @@ -58,7 +56,11 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions public bool IsEventGroup { get => _isEventGroup; - set => SetAndNotify(ref _isEventGroup, value); + set + { + SetAndNotify(ref _isEventGroup, value); + NotifyOfPropertyChange(nameof(DisplayEvaluationResult)); + } } public bool IsInitialized @@ -68,6 +70,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions } public bool DisplayBooleanOperator => Items.Count > 1; + public bool DisplayEvaluationResult => GroupType == ConditionGroupType.General && !IsEventGroup; public string SelectedBooleanOperator => DataModelConditionGroup.BooleanOperator.Humanize(); public void SelectBooleanOperator(string type) @@ -166,14 +169,19 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions IsEventGroup = Items.Any(i => i is DataModelConditionEventViewModel); if (IsEventGroup) - { if (DataModelConditionGroup.BooleanOperator != BooleanOperator.And) SelectBooleanOperator("And"); - } OnUpdated(); } + public override void Evaluate() + { + IsConditionMet = DataModelConditionGroup.Evaluate(); + foreach (DataModelConditionViewModel dataModelConditionViewModel in Items) + dataModelConditionViewModel.Evaluate(); + } + public void ConvertToConditionList(DataModelConditionViewModel predicateViewModel) { // Store the old index and remove the old predicate diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListView.xaml b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListView.xaml index f19dd3a0c..ac405354f 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListView.xaml @@ -22,6 +22,7 @@ + @@ -79,7 +80,26 @@ - + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListViewModel.cs index ef1b68d2d..746955bba 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListViewModel.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Windows.Forms.VisualStyles; using System.Windows.Media; using Artemis.Core; using Artemis.UI.Ninject.Factories; @@ -57,6 +58,13 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions _profileEditorService.UpdateSelectedProfileElement(); } + public override void Evaluate() + { + IsConditionMet = DataModelConditionList.Evaluate(); + foreach (DataModelConditionViewModel dataModelConditionViewModel in Items) + dataModelConditionViewModel.Evaluate(); + } + public override void Delete() { base.Delete(); diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionEventPredicateViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionEventPredicateViewModel.cs index 71e30559e..185ec12c0 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionEventPredicateViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionEventPredicateViewModel.cs @@ -71,5 +71,10 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions return wrapper.CreateViewModel(_dataModelUIService, new DataModelUpdateConfiguration(false)); } + + public override void Evaluate() + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionGeneralPredicateView.xaml b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionGeneralPredicateView.xaml index dfcac88d1..6bd65d3e7 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionGeneralPredicateView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionGeneralPredicateView.xaml @@ -27,6 +27,7 @@ +