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

Change profile editor VMs to use event aggregator

This commit is contained in:
SpoinkyNL 2019-11-29 08:47:05 +01:00
parent b590c5fed9
commit 8a596f1426
11 changed files with 103 additions and 77 deletions

View File

@ -152,7 +152,9 @@
<Compile Include="Converters\InverseBooleanConverter.cs" />
<Compile Include="Converters\NullToImageConverter.cs" />
<Compile Include="Converters\NullToVisibilityConverter.cs" />
<Compile Include="Events\MainWindowFocusChangedEvent.cs" />
<Compile Include="Events\MainWindowFocusChanged.cs" />
<Compile Include="Events\ProfileEditorSelectedElementChanged.cs" />
<Compile Include="Events\ProfileEditorSelectedProfileChanged.cs" />
<Compile Include="Utilities\BindableSelectedItemBehavior.cs" />
<Compile Include="Utilities\TriggerTracing.cs" />
<Compile Include="Exceptions\ArtemisCoreException.cs" />

View File

@ -0,0 +1,12 @@
namespace Artemis.UI.Events
{
public class MainWindowFocusChanged
{
public MainWindowFocusChanged(bool isFocused)
{
IsFocused = isFocused;
}
public bool IsFocused { get; }
}
}

View File

@ -1,14 +0,0 @@
using System;
namespace Artemis.UI.Events
{
public class MainWindowFocusChangedEvent : EventArgs
{
public MainWindowFocusChangedEvent(bool isFocused)
{
IsFocused = isFocused;
}
public bool IsFocused { get; }
}
}

View File

@ -0,0 +1,15 @@
using Artemis.Core.Models.Profile;
using Artemis.Core.Models.Profile.Abstract;
namespace Artemis.UI.Events
{
public class ProfileEditorSelectedElementChanged
{
public ProfileEditorSelectedElementChanged(ProfileElement profileElement)
{
ProfileElement = profileElement;
}
public ProfileElement ProfileElement { get; }
}
}

View File

@ -0,0 +1,14 @@
using Artemis.Core.Models.Profile;
namespace Artemis.UI.Events
{
public class ProfileEditorSelectedProfileChanged
{
public ProfileEditorSelectedProfileChanged(Profile profile)
{
Profile = profile;
}
public Profile Profile { get; }
}
}

View File

@ -1,22 +1,8 @@
using Artemis.UI.Screens.Module.ProfileEditor.ProfileElements.ProfileElement;
using Stylet;
using Stylet;
namespace Artemis.UI.Screens.Module.ProfileEditor
{
public class ProfileEditorPanelViewModel : Screen
{
public ProfileEditorViewModel ProfileEditorViewModel { get; set; }
public virtual void ActiveProfileChanged()
{
}
public virtual void ActiveProfileUpdated()
{
}
public virtual void ProfileElementSelected(ProfileElementViewModel profileElement)
{
}
}
}

View File

@ -8,12 +8,12 @@ using Artemis.Core.Plugins.Abstract;
using Artemis.Core.Plugins.Models;
using Artemis.Core.Services;
using Artemis.Core.Services.Storage.Interfaces;
using Artemis.UI.Events;
using Artemis.UI.Screens.Module.ProfileEditor.Dialogs;
using Artemis.UI.Screens.Module.ProfileEditor.DisplayConditions;
using Artemis.UI.Screens.Module.ProfileEditor.ElementProperties;
using Artemis.UI.Screens.Module.ProfileEditor.LayerElements;
using Artemis.UI.Screens.Module.ProfileEditor.ProfileElements;
using Artemis.UI.Screens.Module.ProfileEditor.ProfileElements.ProfileElement;
using Artemis.UI.Screens.Module.ProfileEditor.Visualization;
using Artemis.UI.Services.Interfaces;
using Stylet;
@ -22,14 +22,16 @@ namespace Artemis.UI.Screens.Module.ProfileEditor
{
public class ProfileEditorViewModel : Conductor<ProfileEditorPanelViewModel>.Collection.AllActive
{
private readonly IEventAggregator _eventAggregator;
private readonly IProfileService _profileService;
private readonly ISettingsService _settingsService;
public ProfileEditorViewModel(ProfileModule module, ICollection<ProfileEditorPanelViewModel> viewModels, IProfileService profileService,
IDialogService dialogService, ISettingsService settingsService)
IDialogService dialogService, ISettingsService settingsService, IEventAggregator eventAggregator)
{
_profileService = profileService;
_settingsService = settingsService;
_eventAggregator = eventAggregator;
DisplayName = "Profile editor";
Module = module;
@ -76,12 +78,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor
var oldProfile = Module.ActiveProfile;
Module.ChangeActiveProfile(profile);
foreach (var panelViewModel in Items)
{
panelViewModel.ProfileEditorViewModel = this;
panelViewModel.ActiveProfileChanged();
}
_eventAggregator.Publish(new ProfileEditorSelectedProfileChanged(SelectedProfile));
if (oldProfile != null)
_profileService.UpdateProfile(oldProfile, false);
@ -141,11 +138,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor
Task.Run(() =>
{
LoadProfiles();
foreach (var panelViewModel in Items)
{
panelViewModel.ProfileEditorViewModel = this;
panelViewModel.ActiveProfileChanged();
}
_eventAggregator.Publish(new ProfileEditorSelectedProfileChanged(SelectedProfile));
});
base.OnActivate();
}
@ -195,19 +188,5 @@ namespace Artemis.UI.Screens.Module.ProfileEditor
if (!activeProfile.IsActivated)
Module.ChangeActiveProfile(activeProfile);
}
public void OnProfileUpdated(ProfileEditorPanelViewModel source = null)
{
_profileService.UpdateProfile(SelectedProfile, true);
foreach (var panelViewModel in Items.Where(p => p != source))
panelViewModel.ActiveProfileUpdated();
}
public void OnProfileElementSelected(ProfileElementViewModel profileElement, ProfileEditorPanelViewModel source = null)
{
foreach (var panelViewModel in Items.Where(p => p != source))
panelViewModel.ProfileElementSelected(profileElement);
}
}
}

View File

@ -1,17 +1,25 @@
using System.Linq;
using System.Windows;
using Artemis.Core.Models.Profile;
using Artemis.Core.Services.Storage.Interfaces;
using Artemis.UI.Events;
using Artemis.UI.Screens.Module.ProfileEditor.ProfileElements.ProfileElement;
using GongSolutions.Wpf.DragDrop;
using Stylet;
namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileElements
{
public class ProfileElementsViewModel : ProfileEditorPanelViewModel, IDropTarget
{
private readonly IProfileService _profileService;
private readonly IEventAggregator _eventAggregator;
private ProfileElementViewModel _selectedProfileElement;
public ProfileElementsViewModel()
public ProfileElementsViewModel(IProfileService profileService, IEventAggregator eventAggregator)
{
_profileService = profileService;
_eventAggregator = eventAggregator;
CreateRootFolderViewModel();
}
@ -23,7 +31,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileElements
set
{
_selectedProfileElement = value;
ProfileEditorViewModel.OnProfileElementSelected(_selectedProfileElement, this);
_eventAggregator.Publish(new ProfileEditorSelectedElementChanged(_selectedProfileElement.ProfileElement));
}
}
@ -65,6 +73,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileElements
break;
}
_profileService.UpdateProfile(this.RootFolder.P);
ProfileEditorViewModel.OnProfileUpdated(this);
}

View File

@ -158,10 +158,10 @@
<StackPanel ZIndex="1" VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="10">
<materialDesign:Card Padding="8">
<StackPanel Orientation="Horizontal">
<CheckBox Style="{StaticResource MaterialDesignCheckBox}">
<CheckBox Style="{StaticResource MaterialDesignCheckBox}" IsChecked="{Binding HighlightSelectedLayer.Value}">
Highlight selected layer
</CheckBox>
<CheckBox Style="{StaticResource MaterialDesignCheckBox}" Margin="10 0 0 0">
<CheckBox Style="{StaticResource MaterialDesignCheckBox}" Margin="10 0 0 0" IsChecked="{Binding PauseRenderingOnFocusLoss.Value}">
Pause visualization on focus loss
</CheckBox>
</StackPanel>

View File

@ -20,32 +20,29 @@ using Point = System.Windows.Point;
namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization
{
public class ProfileViewModel : ProfileEditorPanelViewModel, IHandle<MainWindowFocusChangedEvent>
public class ProfileViewModel : ProfileEditorPanelViewModel, IHandle<ProfileEditorSelectedElementChanged>, IHandle<MainWindowFocusChanged>
{
private readonly ISettingsService _settingsService;
private readonly TimerUpdateTrigger _updateTrigger;
private readonly ISurfaceService _surfaceService;
private TimerUpdateTrigger _updateTrigger;
public ProfileViewModel(ISurfaceService surfaceService, ISettingsService settingsService, IEventAggregator eventAggregator)
{
_surfaceService = surfaceService;
_settingsService = settingsService;
Devices = new ObservableCollection<ProfileDeviceViewModel>();
Cursor = null;
Execute.PostToUIThread(() =>
{
SelectionRectangle = new RectangleGeometry();
PanZoomViewModel = new PanZoomViewModel();
});
Cursor = null;
ApplySurfaceConfiguration(surfaceService.ActiveSurface);
CreateUpdateTrigger();
// Borrow RGB.NET's update trigger but limit the FPS
var targetFpsSetting = settingsService.GetSetting("Core.TargetFrameRate", 25);
var editorTargetFpsSetting = settingsService.GetSetting("ProfileEditor.TargetFrameRate", 15);
var targetFps = Math.Min(targetFpsSetting.Value, editorTargetFpsSetting.Value);
_updateTrigger = new TimerUpdateTrigger {UpdateFrequency = 1.0 / targetFps};
_updateTrigger.Update += UpdateLeds;
surfaceService.ActiveSurfaceConfigurationChanged += OnActiveSurfaceConfigurationChanged;
eventAggregator.Subscribe(this);
}
public bool IsInitializing { get; private set; }
@ -57,6 +54,18 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization
public Cursor Cursor { get; set; }
private void CreateUpdateTrigger()
{
// Borrow RGB.NET's update trigger but limit the FPS
var targetFpsSetting = _settingsService.GetSetting("Core.TargetFrameRate", 25);
var editorTargetFpsSetting = _settingsService.GetSetting("ProfileEditor.TargetFrameRate", 15);
var targetFps = Math.Min(targetFpsSetting.Value, editorTargetFpsSetting.Value);
_updateTrigger = new TimerUpdateTrigger {UpdateFrequency = 1.0 / targetFps};
_updateTrigger.Update += UpdateLeds;
_surfaceService.ActiveSurfaceConfigurationChanged += OnActiveSurfaceConfigurationChanged;
}
private void OnActiveSurfaceConfigurationChanged(object sender, SurfaceConfigurationEventArgs e)
{
ApplySurfaceConfiguration(e.Surface);
@ -119,7 +128,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization
_updateTrigger.Start();
base.OnActivate();
}
protected override void OnDeactivate()
{
HighlightSelectedLayer.Save();
@ -250,9 +259,23 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization
#endregion
public void Handle(MainWindowFocusChangedEvent message)
#region EventAggregator handlers
public void Handle(ProfileEditorSelectedElementChanged message)
{
Console.WriteLine(message);
if (HighlightSelectedLayer.Value)
{
}
}
public void Handle(MainWindowFocusChanged message)
{
if (PauseRenderingOnFocusLoss.Value && !message.IsFocused)
_updateTrigger.Stop();
else if (PauseRenderingOnFocusLoss.Value && message.IsFocused)
_updateTrigger.Start();
}
#endregion
}
}

View File

@ -143,7 +143,7 @@ namespace Artemis.UI.Screens
return;
_lostFocus = true;
_eventAggregator.Publish(new MainWindowFocusChangedEvent(false));
_eventAggregator.Publish(new MainWindowFocusChanged(false));
}
public void WindowActivated()
@ -152,7 +152,7 @@ namespace Artemis.UI.Screens
return;
_lostFocus = false;
_eventAggregator.Publish(new MainWindowFocusChangedEvent(true));
_eventAggregator.Publish(new MainWindowFocusChanged(true));
}
}
}