1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-31 09:43:46 +00:00

Added back layer renaming/deleting

Cleaned up VM factories
Surface editor use theme colors
This commit is contained in:
SpoinkyNL 2019-12-07 13:00:52 +01:00
parent 8795be2cde
commit f91ea0f992
14 changed files with 129 additions and 88 deletions

View File

@ -192,10 +192,7 @@
<Compile Include="Exceptions\ArtemisCoreException.cs" /> <Compile Include="Exceptions\ArtemisCoreException.cs" />
<Compile Include="Extensions\RgbColorExtensions.cs" /> <Compile Include="Extensions\RgbColorExtensions.cs" />
<Compile Include="Extensions\RgbRectangleExtensions.cs" /> <Compile Include="Extensions\RgbRectangleExtensions.cs" />
<Compile Include="Ninject\Factories\IArtemisUIFactory.cs" /> <Compile Include="Ninject\Factories\IViewModelFactory.cs" />
<Compile Include="Ninject\Factories\IDeviceSettingsViewModelFactory.cs" />
<Compile Include="Ninject\Factories\IModuleViewModelFactory.cs" />
<Compile Include="Ninject\Factories\IProfileEditorViewModelFactory.cs" />
<Compile Include="Ninject\UIModule.cs" /> <Compile Include="Ninject\UIModule.cs" />
<Compile Include="Utilities\SizeObserver.cs" /> <Compile Include="Utilities\SizeObserver.cs" />
<Compile Include="Properties\Resources.Designer.cs"> <Compile Include="Properties\Resources.Designer.cs">

View File

@ -1,6 +0,0 @@
namespace Artemis.UI.Ninject.Factories
{
public interface IArtemisUIFactory
{
}
}

View File

@ -1,10 +0,0 @@
using Artemis.Core.Models.Surface;
using Artemis.UI.Screens.Settings.Tabs.Devices;
namespace Artemis.UI.Ninject.Factories
{
public interface IDeviceSettingsViewModelFactory : IArtemisUIFactory
{
DeviceSettingsViewModel Create(ArtemisDevice device);
}
}

View File

@ -1,10 +0,0 @@
using Artemis.Core.Plugins.Abstract;
using Artemis.UI.Screens.Module;
namespace Artemis.UI.Ninject.Factories
{
public interface IModuleViewModelFactory : IArtemisUIFactory
{
ModuleRootViewModel Create(Module module);
}
}

View File

@ -1,10 +0,0 @@
using Artemis.Core.Plugins.Abstract;
using Artemis.UI.Screens.Module.ProfileEditor;
namespace Artemis.UI.Ninject.Factories
{
public interface IProfileEditorViewModelFactory : IArtemisUIFactory
{
ProfileEditorViewModel Create(ProfileModule module);
}
}

View File

@ -0,0 +1,40 @@
using Artemis.Core.Models.Profile.Abstract;
using Artemis.Core.Models.Surface;
using Artemis.Core.Plugins.Abstract;
using Artemis.UI.Screens.Module;
using Artemis.UI.Screens.Module.ProfileEditor;
using Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem;
using Artemis.UI.Screens.Settings.Tabs.Devices;
namespace Artemis.UI.Ninject.Factories
{
public interface IViewModelFactory
{
}
public interface IModuleViewModelFactory : IViewModelFactory
{
ModuleRootViewModel Create(Module module);
}
public interface IDeviceSettingsViewModelFactory : IViewModelFactory
{
DeviceSettingsViewModel Create(ArtemisDevice device);
}
public interface IProfileEditorViewModelFactory : IViewModelFactory
{
ProfileEditorViewModel Create(ProfileModule module);
}
public interface IFolderViewModelFactory : IViewModelFactory
{
FolderViewModel Create(ProfileElement folder);
FolderViewModel Create(TreeItemViewModel parent, ProfileElement folder);
}
public interface ILayerViewModelFactory : IViewModelFactory
{
LayerViewModel Create(TreeItemViewModel parent, ProfileElement folder);
}
}

View File

@ -43,15 +43,11 @@ namespace Artemis.UI.Ninject
Kernel.Bind(x => Kernel.Bind(x =>
{ {
x.FromThisAssembly() x.FromThisAssembly()
.SelectAllClasses() .SelectAllInterfaces()
.InheritedFrom<IArtemisUIFactory>() .InheritedFrom<IViewModelFactory>()
.BindToFactory(); .BindToFactory();
}); });
Kernel.Bind<IDeviceSettingsViewModelFactory>().ToFactory();
Kernel.Bind<IModuleViewModelFactory>().ToFactory();
Kernel.Bind<IProfileEditorViewModelFactory>().ToFactory();
// Bind profile editor VMs // Bind profile editor VMs
Kernel.Bind(x => Kernel.Bind(x =>
{ {

View File

@ -2,6 +2,7 @@
using System.Linq; using System.Linq;
using System.Windows; using System.Windows;
using Artemis.Core.Models.Profile; using Artemis.Core.Models.Profile;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem; using Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem;
using Artemis.UI.Services.Interfaces; using Artemis.UI.Services.Interfaces;
using GongSolutions.Wpf.DragDrop; using GongSolutions.Wpf.DragDrop;
@ -11,11 +12,13 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree
public class ProfileTreeViewModel : ProfileEditorPanelViewModel, IDropTarget public class ProfileTreeViewModel : ProfileEditorPanelViewModel, IDropTarget
{ {
private readonly IProfileEditorService _profileEditorService; private readonly IProfileEditorService _profileEditorService;
private readonly IFolderViewModelFactory _folderViewModelFactory;
private TreeItemViewModel _selectedTreeItem; private TreeItemViewModel _selectedTreeItem;
public ProfileTreeViewModel(IProfileEditorService profileEditorService) public ProfileTreeViewModel(IProfileEditorService profileEditorService, IFolderViewModelFactory folderViewModelFactory)
{ {
_profileEditorService = profileEditorService; _profileEditorService = profileEditorService;
_folderViewModelFactory = folderViewModelFactory;
CreateRootFolderViewModel(); CreateRootFolderViewModel();
_profileEditorService.SelectedProfileChanged += OnSelectedProfileChanged; _profileEditorService.SelectedProfileChanged += OnSelectedProfileChanged;
@ -96,7 +99,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree
return; return;
} }
RootFolder = new FolderViewModel(null, folder, _profileEditorService); RootFolder = _folderViewModelFactory.Create(folder);
} }
private static DragDropType GetDragDropType(IDropInfo dropInfo) private static DragDropType GetDragDropType(IDropInfo dropInfo)

View File

@ -1,11 +1,28 @@
using Artemis.Core.Models.Profile.Abstract; using Artemis.Core.Models.Profile.Abstract;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Services.Interfaces; using Artemis.UI.Services.Interfaces;
namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem
{ {
public class FolderViewModel : TreeItemViewModel public class FolderViewModel : TreeItemViewModel
{ {
public FolderViewModel(TreeItemViewModel parent, ProfileElement folder, IProfileEditorService profileEditorService) : base(parent, folder, profileEditorService) // I hate this about DI, oh well
public FolderViewModel(ProfileElement folder,
IProfileEditorService profileEditorService,
IDialogService dialogService,
IFolderViewModelFactory folderViewModelFactory,
ILayerViewModelFactory layerViewModelFactory) :
base(null, folder, profileEditorService, dialogService, folderViewModelFactory, layerViewModelFactory)
{
}
public FolderViewModel(TreeItemViewModel parent,
ProfileElement folder,
IProfileEditorService profileEditorService,
IDialogService dialogService,
IFolderViewModelFactory folderViewModelFactory,
ILayerViewModelFactory layerViewModelFactory) :
base(parent, folder, profileEditorService, dialogService, folderViewModelFactory, layerViewModelFactory)
{ {
} }

View File

@ -1,11 +1,18 @@
using Artemis.Core.Models.Profile.Abstract; using Artemis.Core.Models.Profile.Abstract;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Services.Interfaces; using Artemis.UI.Services.Interfaces;
namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem
{ {
public class LayerViewModel : TreeItemViewModel public class LayerViewModel : TreeItemViewModel
{ {
public LayerViewModel(TreeItemViewModel parent, ProfileElement layer, IProfileEditorService profileEditorService) : base(parent, layer, profileEditorService) public LayerViewModel(TreeItemViewModel parent,
ProfileElement folder,
IProfileEditorService profileEditorService,
IDialogService dialogService,
IFolderViewModelFactory folderViewModelFactory,
ILayerViewModelFactory layerViewModelFactory) :
base(parent, folder, profileEditorService, dialogService, folderViewModelFactory, layerViewModelFactory)
{ {
} }

View File

@ -4,6 +4,8 @@ using System.Threading.Tasks;
using Artemis.Core.Models.Profile; using Artemis.Core.Models.Profile;
using Artemis.Core.Models.Profile.Abstract; using Artemis.Core.Models.Profile.Abstract;
using Artemis.UI.Exceptions; using Artemis.UI.Exceptions;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.Module.ProfileEditor.Dialogs;
using Artemis.UI.Services.Interfaces; using Artemis.UI.Services.Interfaces;
using Stylet; using Stylet;
@ -11,11 +13,25 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem
{ {
public abstract class TreeItemViewModel : PropertyChangedBase public abstract class TreeItemViewModel : PropertyChangedBase
{ {
protected TreeItemViewModel(TreeItemViewModel parent, ProfileElement profileElement, IProfileEditorService profileEditorService) private readonly IProfileEditorService _profileEditorService;
private readonly IDialogService _dialogService;
private readonly IFolderViewModelFactory _folderViewModelFactory;
private readonly ILayerViewModelFactory _layerViewModelFactory;
protected TreeItemViewModel(TreeItemViewModel parent,
ProfileElement profileElement,
IProfileEditorService profileEditorService,
IDialogService dialogService,
IFolderViewModelFactory folderViewModelFactory,
ILayerViewModelFactory layerViewModelFactory)
{ {
_profileEditorService = profileEditorService;
_dialogService = dialogService;
_folderViewModelFactory = folderViewModelFactory;
_layerViewModelFactory = layerViewModelFactory;
Parent = parent; Parent = parent;
ProfileElement = profileElement; ProfileElement = profileElement;
ProfileEditorService = profileEditorService;
Children = new BindableCollection<TreeItemViewModel>(); Children = new BindableCollection<TreeItemViewModel>();
UpdateProfileElements(); UpdateProfileElements();
@ -23,7 +39,6 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem
public TreeItemViewModel Parent { get; set; } public TreeItemViewModel Parent { get; set; }
public ProfileElement ProfileElement { get; set; } public ProfileElement ProfileElement { get; set; }
public IProfileEditorService ProfileEditorService { get; set; }
public abstract bool SupportsChildren { get; } public abstract bool SupportsChildren { get; }
public BindableCollection<TreeItemViewModel> Children { get; set; } public BindableCollection<TreeItemViewModel> Children { get; set; }
@ -95,7 +110,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem
ProfileElement.AddChild(new Folder(ProfileElement.Profile, ProfileElement, "New folder")); ProfileElement.AddChild(new Folder(ProfileElement.Profile, ProfileElement, "New folder"));
UpdateProfileElements(); UpdateProfileElements();
ProfileEditorService.UpdateSelectedProfile(); _profileEditorService.UpdateSelectedProfile();
} }
public void AddLayer() public void AddLayer()
@ -105,40 +120,40 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem
ProfileElement.AddChild(new Layer(ProfileElement.Profile, ProfileElement, "New layer")); ProfileElement.AddChild(new Layer(ProfileElement.Profile, ProfileElement, "New layer"));
UpdateProfileElements(); UpdateProfileElements();
ProfileEditorService.UpdateSelectedProfile(); _profileEditorService.UpdateSelectedProfile();
} }
// ReSharper disable once UnusedMember.Global - Called from view // ReSharper disable once UnusedMember.Global - Called from view
public async Task RenameElement() public async Task RenameElement()
{ {
// var result = await ProfileEditorService.DialogService.ShowDialog<ProfileElementRenameViewModel>( var result = await _dialogService.ShowDialog<ProfileElementRenameViewModel>(
// new Dictionary<string, object> {{"profileElement", ProfileElement}} new Dictionary<string, object> {{"profileElement", ProfileElement}}
// ); );
// if (result is string newName) if (result is string newName)
// { {
// ProfileElement.Name = newName; ProfileElement.Name = newName;
// ProfileEditorService.UpdateSelectedProfile(); _profileEditorService.UpdateSelectedProfile();
// } }
} }
// ReSharper disable once UnusedMember.Global - Called from view // ReSharper disable once UnusedMember.Global - Called from view
public async Task DeleteElement() public async Task DeleteElement()
{ {
// var result = await ProfileEditorService.DialogService.ShowConfirmDialog( var result = await _dialogService.ShowConfirmDialog(
// "Delete profile element", "Delete profile element",
// "Are you sure you want to delete this element? This cannot be undone." "Are you sure you want to delete this element? This cannot be undone."
// ); );
//
// if (!result) if (!result)
// return; return;
//
// // Farewell, cruel world // Farewell, cruel world
// var parent = Parent; var parent = Parent;
// ProfileElement.Parent.RemoveChild(ProfileElement); ProfileElement.Parent.RemoveChild(ProfileElement);
// parent.RemoveExistingElement(this); parent.RemoveExistingElement(this);
// parent.UpdateProfileElements(); parent.UpdateProfileElements();
//
// ProfileEditorService.UpdateSelectedProfile(); _profileEditorService.UpdateSelectedProfile();
} }
private void UpdateProfileElements() private void UpdateProfileElements()
@ -161,13 +176,13 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem
{ {
existing = Children.FirstOrDefault(p => p is FolderViewModel vm && vm.ProfileElement == folder); existing = Children.FirstOrDefault(p => p is FolderViewModel vm && vm.ProfileElement == folder);
if (existing == null) if (existing == null)
Children.Add(new FolderViewModel(this, folder, ProfileEditorService)); Children.Add(_folderViewModelFactory.Create((FolderViewModel) this, folder));
} }
else if (profileElement is Layer layer) else if (profileElement is Layer layer)
{ {
existing = Children.FirstOrDefault(p => p is LayerViewModel vm && vm.ProfileElement == layer); existing = Children.FirstOrDefault(p => p is LayerViewModel vm && vm.ProfileElement == layer);
if (existing == null) if (existing == null)
Children.Add(new LayerViewModel(this, layer, ProfileEditorService)); Children.Add(_layerViewModelFactory.Create((FolderViewModel) this, layer));
} }
existing?.UpdateProfileElements(); existing?.UpdateProfileElements();

View File

@ -21,9 +21,9 @@
</Grid.LayoutTransform> </Grid.LayoutTransform>
<!-- Device image with fallback --> <!-- Device image with fallback -->
<Border Effect="{StaticResource MaterialDesignShadowDepth3}" VerticalAlignment="Top" HorizontalAlignment="Left" > <Image VerticalAlignment="Top"
<Image Source="{Binding Device.RgbDevice.DeviceInfo.Image, Converter={StaticResource NullToImageConverter}}"/> HorizontalAlignment="Left"
</Border> Source="{Binding Device.RgbDevice.DeviceInfo.Image, Converter={StaticResource NullToImageConverter}}" />
<Rectangle Fill="{DynamicResource ControlBackgroundBrush}" <Rectangle Fill="{DynamicResource ControlBackgroundBrush}"
Stroke="{DynamicResource ControlBorderBrush}" Stroke="{DynamicResource ControlBorderBrush}"

View File

@ -57,7 +57,7 @@
<Grid.Background> <Grid.Background>
<VisualBrush TileMode="Tile" Stretch="Uniform" Viewport="{Binding PanZoomViewModel.BackgroundViewport}" ViewportUnits="Absolute"> <VisualBrush TileMode="Tile" Stretch="Uniform" Viewport="{Binding PanZoomViewModel.BackgroundViewport}" ViewportUnits="Absolute">
<VisualBrush.Visual> <VisualBrush.Visual>
<Grid Width="20" Height="20"> <Grid Width="25" Height="25">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
@ -66,10 +66,10 @@
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition /> <ColumnDefinition />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Rectangle Grid.Row="0" Grid.Column="0" Fill="LightGray" /> <Rectangle Grid.Row="0" Grid.Column="0" Fill="{DynamicResource MaterialDesignPaper}" />
<Rectangle Grid.Row="0" Grid.Column="1" /> <Rectangle Grid.Row="0" Grid.Column="1" />
<Rectangle Grid.Row="1" Grid.Column="0" /> <Rectangle Grid.Row="1" Grid.Column="0" />
<Rectangle Grid.Row="1" Grid.Column="1" Fill="LightGray" /> <Rectangle Grid.Row="1" Grid.Column="1" Fill="{DynamicResource MaterialDesignPaper}" />
</Grid> </Grid>
</VisualBrush.Visual> </VisualBrush.Visual>
</VisualBrush> </VisualBrush>

View File

@ -26,7 +26,9 @@
</Grid.LayoutTransform> </Grid.LayoutTransform>
<!-- Device image with fallback --> <!-- Device image with fallback -->
<Image Source="{Binding Device.RgbDevice.DeviceInfo.Image, Converter={StaticResource NullToImageConverter}}" VerticalAlignment="Top" HorizontalAlignment="Left" /> <Image VerticalAlignment="Top"
HorizontalAlignment="Left"
Source="{Binding Device.RgbDevice.DeviceInfo.Image, Converter={StaticResource NullToImageConverter}}" />
<Rectangle Fill="{DynamicResource ControlBackgroundBrush}" <Rectangle Fill="{DynamicResource ControlBackgroundBrush}"
Stroke="{DynamicResource ControlBorderBrush}" Stroke="{DynamicResource ControlBorderBrush}"