1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Gradient picker button - Always update gradient on UI thread

Data bindings - Added AlwaysApplyDataBindings setting
This commit is contained in:
Robert 2022-07-24 14:25:13 +02:00
parent 29ef160975
commit f09b4a20bf
3 changed files with 27 additions and 7 deletions

View File

@ -10,6 +10,7 @@ using Avalonia.Controls.Primitives;
using Avalonia.Data; using Avalonia.Data;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Threading;
using FluentAvalonia.Core; using FluentAvalonia.Core;
using Button = FluentAvalonia.UI.Controls.Button; using Button = FluentAvalonia.UI.Controls.Button;
@ -138,12 +139,12 @@ public class GradientPickerButton : TemplatedControl
private void ColorGradientOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) private void ColorGradientOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{ {
UpdateGradient(); Dispatcher.UIThread.Post(UpdateGradient);
} }
private void ColorGradientOnStopChanged(object? sender, EventArgs e) private void ColorGradientOnStopChanged(object? sender, EventArgs e)
{ {
UpdateGradient(); Dispatcher.UIThread.Post(UpdateGradient);
} }
private void OnButtonClick(object? sender, RoutedEventArgs e) private void OnButtonClick(object? sender, RoutedEventArgs e)

View File

@ -6,8 +6,6 @@ using Artemis.Core;
using Artemis.Core.Services; using Artemis.Core.Services;
using Artemis.UI.Shared; using Artemis.UI.Shared;
using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Threading; using Avalonia.Threading;
using ReactiveUI; using ReactiveUI;

View File

@ -1,6 +1,10 @@
using System.Reactive.Linq; using System;
using System.Reactive;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Artemis.Core; using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Extensions; using Artemis.UI.Extensions;
using Artemis.UI.Ninject.Factories; using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.VisualScripting; using Artemis.UI.Screens.VisualScripting;
@ -8,7 +12,7 @@ using Artemis.UI.Shared;
using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor;
using Artemis.UI.Shared.Services.ProfileEditor.Commands; using Artemis.UI.Shared.Services.ProfileEditor.Commands;
using Avalonia.Controls.Mixins; using Avalonia.Threading;
using ReactiveUI; using ReactiveUI;
namespace Artemis.UI.Screens.ProfileEditor.Properties.DataBinding; namespace Artemis.UI.Screens.ProfileEditor.Properties.DataBinding;
@ -17,14 +21,17 @@ public class DataBindingViewModel : ActivatableViewModelBase
{ {
private readonly IProfileEditorService _profileEditorService; private readonly IProfileEditorService _profileEditorService;
private readonly IWindowService _windowService; private readonly IWindowService _windowService;
private readonly PluginSetting<bool> _alwaysApplyDataBindings;
private ObservableAsPropertyHelper<bool>? _dataBindingEnabled; private ObservableAsPropertyHelper<bool>? _dataBindingEnabled;
private ObservableAsPropertyHelper<ILayerProperty?>? _layerProperty; private ObservableAsPropertyHelper<ILayerProperty?>? _layerProperty;
private ObservableAsPropertyHelper<NodeScriptViewModel?>? _nodeScriptViewModel; private ObservableAsPropertyHelper<NodeScriptViewModel?>? _nodeScriptViewModel;
private bool _playing;
public DataBindingViewModel(IProfileEditorService profileEditorService, INodeVmFactory nodeVmFactory, IWindowService windowService) public DataBindingViewModel(IProfileEditorService profileEditorService, INodeVmFactory nodeVmFactory, IWindowService windowService, ISettingsService settingsService)
{ {
_profileEditorService = profileEditorService; _profileEditorService = profileEditorService;
_windowService = windowService; _windowService = windowService;
_alwaysApplyDataBindings = settingsService.GetSetting("ProfileEditor.AlwaysApplyDataBindings", false);
this.WhenActivated(d => this.WhenActivated(d =>
{ {
@ -41,6 +48,11 @@ public class DataBindingViewModel : ActivatableViewModelBase
.Select(b => b.IsEnabled) .Select(b => b.IsEnabled)
.ToProperty(this, vm => vm.DataBindingEnabled) .ToProperty(this, vm => vm.DataBindingEnabled)
.DisposeWith(d); .DisposeWith(d);
_profileEditorService.Playing.CombineLatest(_profileEditorService.SuspendedEditing).Subscribe(tuple => _playing = tuple.First || tuple.Second).DisposeWith(d);
DispatcherTimer updateTimer = new(TimeSpan.FromMilliseconds(60.0 / 1000), DispatcherPriority.Render, Update);
updateTimer.Start();
Disposable.Create(() => updateTimer.Stop()).DisposeWith(d);
}); });
} }
@ -62,4 +74,13 @@ public class DataBindingViewModel : ActivatableViewModelBase
if (LayerProperty != null && LayerProperty.BaseDataBinding.IsEnabled) if (LayerProperty != null && LayerProperty.BaseDataBinding.IsEnabled)
await _windowService.ShowDialogAsync<NodeScriptWindowViewModel, bool>(("nodeScript", LayerProperty.BaseDataBinding.Script)); await _windowService.ShowDialogAsync<NodeScriptWindowViewModel, bool>(("nodeScript", LayerProperty.BaseDataBinding.Script));
} }
private void Update(object? sender, EventArgs e)
{
// If playing the data binding will already be updated, no need to do it here
if (_playing || !_alwaysApplyDataBindings.Value)
return;
LayerProperty?.UpdateDataBinding();
}
} }