diff --git a/src/Artemis.Core/Models/Profile/Folder.cs b/src/Artemis.Core/Models/Profile/Folder.cs index f679e78a0..7ca6f82ee 100644 --- a/src/Artemis.Core/Models/Profile/Folder.cs +++ b/src/Artemis.Core/Models/Profile/Folder.cs @@ -1,7 +1,6 @@ using System; using System.Linq; using Artemis.Core.Models.Profile.LayerShapes; -using Artemis.Core.Models.Surface; using Artemis.Storage.Entities.Profile; using SkiaSharp; diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index 32a8c5542..9e2a5ee98 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -14,6 +14,7 @@ namespace Artemis.Core.Models.Profile { public sealed class Layer : ProfileElement { + private readonly List _properties; private LayerShape _layerShape; private List _leds; @@ -27,6 +28,9 @@ namespace Artemis.Core.Models.Profile Name = name; _leds = new List(); + _properties = new List(); + + CreateDefaultProperties(); } internal Layer(Profile profile, ProfileElement parent, LayerEntity layerEntity) @@ -40,6 +44,10 @@ namespace Artemis.Core.Models.Profile Order = layerEntity.Order; _leds = new List(); + _properties = new List(); + + // TODO: Load properties from entity instead of creating the defaults + CreateDefaultProperties(); switch (layerEntity.ShapeEntity?.Type) { @@ -89,7 +97,7 @@ namespace Artemis.Core.Models.Profile public SKPath Path { get; private set; } /// - /// Defines the shape that is rendered by the . + /// Defines the shape that is rendered by the . /// public LayerShape LayerShape { @@ -103,7 +111,37 @@ namespace Artemis.Core.Models.Profile } /// - /// The brush that will fill the . + /// A collection of all the properties on this layer + /// + public ReadOnlyCollection Properties => _properties.AsReadOnly(); + + /// + /// The anchor point property of this layer, also found in + /// + public LayerProperty AnchorPointProperty { get; private set; } + + /// + /// The position of this layer, also found in + /// + public LayerProperty PositionProperty { get; private set; } + + /// + /// The scale property of this layer, also found in + /// + public LayerProperty ScaleProperty { get; private set; } + + /// + /// The rotation property of this layer, also found in + /// + public LayerProperty RotationProperty { get; private set; } + + /// + /// The opacity property of this layer, also found in + /// + public LayerProperty OpacityProperty { get; private set; } + + /// + /// The brush that will fill the . /// public LayerBrush LayerBrush { get; internal set; } @@ -121,7 +159,7 @@ namespace Artemis.Core.Models.Profile canvas.ClipPath(Path); // Placeholder if (LayerShape?.RenderPath != null) - canvas.DrawPath(LayerShape.RenderPath, new SKPaint(){Color = new SKColor(255,0,0)}); + canvas.DrawPath(LayerShape.RenderPath, new SKPaint {Color = new SKColor(255, 0, 0)}); LayerBrush?.Render(canvas); canvas.Restore(); } @@ -134,6 +172,8 @@ namespace Artemis.Core.Models.Profile LayerEntity.Order = Order; LayerEntity.Name = Name; LayerEntity.ProfileId = Profile.EntityId; + foreach (var layerProperty in Properties) + layerProperty.ApplyToEntity(); // LEDs LayerEntity.Leds.Clear(); @@ -251,6 +291,25 @@ namespace Artemis.Core.Models.Profile OnRenderPropertiesUpdated(); } + private void CreateDefaultProperties() + { + var transformProperty = new LayerProperty(this, null, "Transform", "The default properties collection every layer has, allows you to transform the shape.", null); + AnchorPointProperty = new LayerProperty(this, transformProperty, "Anchor Point", "The point at which the shape is attached to its position.", typeof(SKPoint)); + PositionProperty = new LayerProperty(this, transformProperty, "Position", "The position of the shape.", typeof(SKPoint)); + ScaleProperty = new LayerProperty(this, transformProperty, "Scale", "The scale of the shape.", typeof(SKSize)); + RotationProperty = new LayerProperty(this, transformProperty, "Rotation", "The rotation of the shape in degrees.", typeof(int)); + OpacityProperty = new LayerProperty(this, transformProperty, "Opacity", "The opacity of the shape from 0 to 1.", typeof(float)); + + transformProperty.Children.Add(AnchorPointProperty); + transformProperty.Children.Add(PositionProperty); + transformProperty.Children.Add(ScaleProperty); + transformProperty.Children.Add(RotationProperty); + transformProperty.Children.Add(OpacityProperty); + + _properties.Add(transformProperty); + _properties.AddRange(transformProperty.Children); + } + public override string ToString() { return $"[Layer] {nameof(Name)}: {Name}, {nameof(Order)}: {Order}"; diff --git a/src/Artemis.Core/Models/Profile/LayerProperty.cs b/src/Artemis.Core/Models/Profile/LayerProperty.cs index 542a2b688..9cb8ce13e 100644 --- a/src/Artemis.Core/Models/Profile/LayerProperty.cs +++ b/src/Artemis.Core/Models/Profile/LayerProperty.cs @@ -1,16 +1,23 @@ using System; using System.Collections.Generic; +using Artemis.Core.Exceptions; namespace Artemis.Core.Models.Profile { public class LayerProperty { - internal LayerProperty(Layer layer, LayerProperty parent) + private object _baseValue; + + internal LayerProperty(Layer layer, LayerProperty parent, string name, string description, Type type) { Layer = layer; Parent = parent; + Name = name; + Description = description; + Type = type; Children = new List(); + Keyframes = new List(); } public Layer Layer { get; } @@ -20,7 +27,23 @@ namespace Artemis.Core.Models.Profile public string Name { get; set; } public string Description { get; set; } public Type Type { get; set; } - public object BaseValue { get; set; } + + public object BaseValue + { + get => _baseValue; + set + { + if (value != null && value.GetType() != Type) + throw new ArtemisCoreException($"Cannot set value of type {value.GetType()} on property {Name}, expected type is {Type}."); + _baseValue = value; + } + } + public List Keyframes { get; set; } + + public void ApplyToEntity() + { + // Big o' TODO + } } } \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/LayerShapes/Fill.cs b/src/Artemis.Core/Models/Profile/LayerShapes/Fill.cs index d1b05f776..ace6d87dd 100644 --- a/src/Artemis.Core/Models/Profile/LayerShapes/Fill.cs +++ b/src/Artemis.Core/Models/Profile/LayerShapes/Fill.cs @@ -7,6 +7,7 @@ namespace Artemis.Core.Models.Profile.LayerShapes public Fill(Layer layer) : base(layer) { } + internal Fill(Layer layer, ShapeEntity shapeEntity) : base(layer, shapeEntity) { } diff --git a/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs b/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs index 79adc2133..00ade6057 100644 --- a/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs +++ b/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs @@ -1,5 +1,4 @@ -using System; -using System.Linq; +using System.Linq; using Artemis.Storage.Entities.Profile; using SkiaSharp; @@ -61,12 +60,12 @@ namespace Artemis.Core.Models.Profile.LayerShapes } /// - /// A render rectangle relative to the layer + /// A render rectangle relative to the layer /// public SKRect RenderRectangle { get; protected set; } /// - /// A path relative to the layer + /// A path relative to the layer /// public SKPath RenderPath { get; protected set; } @@ -84,7 +83,7 @@ namespace Artemis.Core.Models.Profile.LayerShapes } /// - /// Updates Position and Size using the provided unscaled rectangle + /// Updates Position and Size using the provided unscaled rectangle /// /// An unscaled rectangle where 1px = 1mm public void SetFromUnscaledRectangle(SKRect rect) diff --git a/src/Artemis.Core/Models/Profile/LayerShapes/Polygon.cs b/src/Artemis.Core/Models/Profile/LayerShapes/Polygon.cs index a3444285f..a5c230259 100644 --- a/src/Artemis.Core/Models/Profile/LayerShapes/Polygon.cs +++ b/src/Artemis.Core/Models/Profile/LayerShapes/Polygon.cs @@ -7,7 +7,6 @@ namespace Artemis.Core.Models.Profile.LayerShapes { public class Polygon : LayerShape { - public Polygon(Layer layer) : base(layer) { } @@ -39,7 +38,7 @@ namespace Artemis.Core.Models.Profile.LayerShapes { base.ApplyToEntity(); Layer.LayerEntity.ShapeEntity.Type = ShapeEntityType.Polygon; - Layer.LayerEntity.ShapeEntity.Points = Points.Select(p => new ShapePointEntity { X = p.X, Y = p.Y }).ToList(); + Layer.LayerEntity.ShapeEntity.Points = Points.Select(p => new ShapePointEntity {X = p.X, Y = p.Y}).ToList(); } } } \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/ProfileElement.cs b/src/Artemis.Core/Models/Profile/ProfileElement.cs index a927a9fd6..611797e06 100644 --- a/src/Artemis.Core/Models/Profile/ProfileElement.cs +++ b/src/Artemis.Core/Models/Profile/ProfileElement.cs @@ -131,7 +131,5 @@ namespace Artemis.Core.Models.Profile child.Parent = null; } } - - } } \ No newline at end of file diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index c118fe942..2cfaf5a66 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -149,11 +149,13 @@ + + LayerPropertiesView.xaml @@ -161,6 +163,7 @@ + diff --git a/src/Artemis.UI/Converters/LeftMarginMultiplierConverter.cs b/src/Artemis.UI/Converters/LeftMarginMultiplierConverter.cs new file mode 100644 index 000000000..a6654c2a7 --- /dev/null +++ b/src/Artemis.UI/Converters/LeftMarginMultiplierConverter.cs @@ -0,0 +1,28 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using Artemis.UI.Extensions; + +namespace Artemis.UI.Converters +{ + public class LeftMarginMultiplierConverter : IValueConverter + { + public double Length { get; set; } + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var item = value as TreeViewItem; + if (item == null) + return new Thickness(0); + + return new Thickness(Length * item.GetDepth(), 0, 0, 0); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Extensions/TreeViewItemExtensions.cs b/src/Artemis.UI/Extensions/TreeViewItemExtensions.cs new file mode 100644 index 000000000..7b6a6fc5c --- /dev/null +++ b/src/Artemis.UI/Extensions/TreeViewItemExtensions.cs @@ -0,0 +1,24 @@ +using System.Windows.Controls; +using System.Windows.Media; + +namespace Artemis.UI.Extensions +{ + public static class TreeViewItemExtensions + { + public static int GetDepth(this TreeViewItem item) + { + TreeViewItem parent; + while ((parent = GetParent(item)) != null) + return GetDepth(parent) + 1; + return 0; + } + + private static TreeViewItem GetParent(TreeViewItem item) + { + var parent = VisualTreeHelper.GetParent(item); + while (!(parent is TreeViewItem || parent is TreeView)) + parent = VisualTreeHelper.GetParent(parent); + return parent as TreeViewItem; + } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml index 5a48c5b38..679edfdc9 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml @@ -7,8 +7,14 @@ xmlns:s="https://github.com/canton7/Stylet" xmlns:timeline="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline" mc:Ignorable="d" - d:DesignHeight="450" d:DesignWidth="800"> - + d:DesignHeight="450" + d:DesignWidth="800" + d:DataContext="{d:DesignInstance local:LayerPropertiesViewModel}"> + + + + + @@ -22,34 +28,44 @@ - - A play button, current time etc. etc.! + + - - + + + + - + + + + + + + - + - - - - - - @@ -57,12 +73,20 @@ - + + + + - + - + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml.cs index 95a6b456a..4bc4ca79e 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml.cs @@ -1,22 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; +using System.Windows.Controls; namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties { /// - /// Interaction logic for LayerPropertiesView.xaml + /// Interaction logic for LayerPropertiesView.xaml /// public partial class LayerPropertiesView : UserControl { @@ -27,4 +14,4 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties // Keeping the scroll viewers in sync is up to the view, not a viewmodel concern } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesViewModel.cs index 841b3039d..9900aa558 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesViewModel.cs @@ -1,20 +1,52 @@ using System; +using System.Linq; using System.Windows; +using System.Windows.Input; +using Artemis.Core.Models.Profile; using Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree; using Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline; +using Artemis.UI.Services.Interfaces; namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties { public class LayerPropertiesViewModel : ProfileEditorPanelViewModel { - public LayerPropertiesViewModel() + private readonly IProfileEditorService _profileEditorService; + + public LayerPropertiesViewModel(IProfileEditorService profileEditorService) { + _profileEditorService = profileEditorService; + + CurrentTime = TimeSpan.Zero; + PixelsPerSecond = 1; PropertyTree = new PropertyTreeViewModel(this); PropertyTimeline = new PropertyTimelineViewModel(this); + + PopulateProperties(); + + _profileEditorService.SelectedProfileElementChanged += (sender, args) => PopulateProperties(); + } + + public TimeSpan CurrentTime + { + get => _currentTime; + set + { + _currentTime = value; + OnCurrentTimeChanged(); + } + } + + public int PixelsPerSecond + { + get => _pixelsPerSecond; + set + { + _pixelsPerSecond = value; + OnPixelsPerSecondChanged(); + } } - public TimeSpan CurrentTime { get; set; } - public int PixelsPerSecond { get; set; } public Thickness TimeCaretPosition { get => new Thickness(CurrentTime.TotalSeconds * PixelsPerSecond, 0, 0, 0); @@ -24,29 +56,72 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties public PropertyTreeViewModel PropertyTree { get; set; } public PropertyTimelineViewModel PropertyTimeline { get; set; } - private void CreateTestValues() + private void PopulateProperties() { -// var propertyRailViewModels = new List(); -// for (var i = 0; i < 20; i++) -// propertyRailViewModels.Add(new TimelinePropertyRailViewModel()); -// -// TimelinePropertyRailViewModels.AddRange(propertyRailViewModels); -// -// // Transform will be the only built-in properties so test with that -// var testVm = new TimelinePropertiesViewModel { PropertiesName = "Transform" }; -// testVm.Properties.Add(new TimelinePropertyViewModel { PropertyName = "Anchor Point" }); -// testVm.Properties.Add(new TimelinePropertyViewModel { PropertyName = "Position" }); -// testVm.Properties.Add(new TimelinePropertyViewModel { PropertyName = "Scale" }); -// testVm.Properties.Add(new TimelinePropertyViewModel { PropertyName = "Rotation" }); -// testVm.Properties.Add(new TimelinePropertyViewModel { PropertyName = "Opacity" }); -// // Purely for testing, add a nested property -// var subTestVm = new TimelinePropertiesViewModel() { PropertiesName = "Sub Properties" }; -// subTestVm.Properties.Add(new TimelinePropertyViewModel { PropertyName = "Sub Property 1" }); -// subTestVm.Properties.Add(new TimelinePropertyViewModel { PropertyName = "Sub Property 2" }); -// subTestVm.Properties.Add(new TimelinePropertyViewModel { PropertyName = "Sub Property 3" }); -// testVm.Properties.Add(subTestVm); -// -// TimelinePropertiesViewModels.Add(testVm); + if (_profileEditorService.SelectedProfileElement is Layer selectedLayer) + { + // Only create VMs for top-level parents, let parents populate their own children recursively + var propertyViewModels = selectedLayer.Properties + .Where(p => p.Children.Any()) + .Select(p => new LayerPropertyViewModel(p, null)) + .ToList(); + + PropertyTree.PopulateProperties(propertyViewModels); + PropertyTimeline.PopulateProperties(propertyViewModels); + } + else + { + PropertyTree.ClearProperties(); + PropertyTimeline.ClearProperties(); + } } + + #region Caret movement + + private double _caretStartMouseStartOffset; + private bool _mouseOverCaret; + private int _pixelsPerSecond; + private TimeSpan _currentTime; + + public void RightGridMouseDown(object sender, MouseButtonEventArgs e) + { + _caretStartMouseStartOffset = e.GetPosition((IInputElement) sender).X - TimeCaretPosition.Left; + } + + public void CaretMouseEnter(object sender, MouseEventArgs e) + { + _mouseOverCaret = true; + } + + public void CaretMouseLeave(object sender, MouseEventArgs e) + { + if (e.LeftButton != MouseButtonState.Pressed) + _mouseOverCaret = false; + } + + public void RightGridMouseMove(object sender, MouseEventArgs e) + { + if (_mouseOverCaret && e.LeftButton == MouseButtonState.Pressed) + TimeCaretPosition = new Thickness(Math.Max(0, e.GetPosition((IInputElement) sender).X), 0, 0, 0); + } + + #endregion + + #region Events + + public event EventHandler CurrentTimeChanged; + public event EventHandler PixelsPerSecondChanged; + + protected virtual void OnCurrentTimeChanged() + { + CurrentTimeChanged?.Invoke(this, EventArgs.Empty); + } + + protected virtual void OnPixelsPerSecondChanged() + { + PixelsPerSecondChanged?.Invoke(this, EventArgs.Empty); + } + + #endregion } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs index 77a71819e..b96bac1fc 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; using Artemis.Core.Models.Profile; using Stylet; @@ -10,13 +6,21 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties { public class LayerPropertyViewModel : PropertyChangedBase { - public LayerProperty LayerProperty { get; } - - public LayerPropertyViewModel(LayerProperty layerProperty) + public LayerPropertyViewModel(LayerProperty layerProperty, LayerPropertyViewModel parent) { LayerProperty = layerProperty; + Parent = parent; + Children = new List(); + + foreach (var child in layerProperty.Children) + Children.Add(new LayerPropertyViewModel(child, this)); } - public bool IsCollapsed { get; set; } + public LayerProperty LayerProperty { get; } + + public LayerPropertyViewModel Parent { get; } + public List Children { get; set; } + + public bool IsExpanded { get; set; } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildView.xaml index bf4bfd3e3..57ef7607c 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildView.xaml @@ -1,17 +1,20 @@  - + mc:Ignorable="d" + d:DesignHeight="19" + d:DesignWidth="800" + d:DataContext="{d:DesignInstance local:PropertyTreeChildViewModel}"> + + - - + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs index 2e2b5a504..be854364b 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs @@ -1,19 +1,28 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Stylet; - -namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree +namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree { - public class PropertyTreeChildViewModel : PropertyChangedBase + public class PropertyTreeChildViewModel : PropertyTreeItemViewModel { - public LayerPropertyViewModel LayerPropertyViewModel { get; } + private bool _keyframesEnabled; public PropertyTreeChildViewModel(LayerPropertyViewModel layerPropertyViewModel) { LayerPropertyViewModel = layerPropertyViewModel; } + + public LayerPropertyViewModel LayerPropertyViewModel { get; } + + public bool KeyframesEnabled + { + get => _keyframesEnabled; + set + { + _keyframesEnabled = value; + UpdateKeyframes(); + } + } + + private void UpdateKeyframes() + { + } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeItemViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeItemViewModel.cs new file mode 100644 index 000000000..1837a36d1 --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeItemViewModel.cs @@ -0,0 +1,8 @@ +using Stylet; + +namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree +{ + public class PropertyTreeItemViewModel : PropertyChangedBase + { + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs index f54b158f3..3ef565ab9 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs @@ -1,19 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Linq; using Stylet; namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree { public class PropertyTreeParentViewModel : PropertyTreeItemViewModel { - public string Name { get; set; } - public PropertyTreeItemViewModel Children { get; set; } - } + public PropertyTreeParentViewModel(LayerPropertyViewModel layerPropertyViewModel) + { + LayerPropertyViewModel = layerPropertyViewModel; + Children = new BindableCollection(); - public class PropertyTreeItemViewModel : PropertyChangedBase - { + foreach (var childProperty in layerPropertyViewModel.Children) + { + if (childProperty.Children.Any()) + Children.Add(new PropertyTreeParentViewModel(childProperty)); + else + Children.Add(new PropertyTreeChildViewModel(childProperty)); + } + } + + public LayerPropertyViewModel LayerPropertyViewModel { get; } + public BindableCollection Children { get; set; } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeView.xaml index 5dd792ee9..d0fba88ce 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeView.xaml @@ -1,31 +1,103 @@  + + + + Background="{DynamicResource MaterialDesignToolBarBackground}" + Margin="0 -1"> - - + + + + @@ -33,4 +105,4 @@ - + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs index beab63d4d..1d8ed7f48 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs @@ -1,19 +1,35 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Stylet; namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree { public class PropertyTreeViewModel : PropertyChangedBase { - public LayerPropertiesViewModel LayerPropertiesViewModel { get; } - public BindableCollection PropertyTreeItemViewModels { get; set; } public PropertyTreeViewModel(LayerPropertiesViewModel layerPropertiesViewModel) { LayerPropertiesViewModel = layerPropertiesViewModel; + PropertyTreeItemViewModels = new BindableCollection(); + } + + public LayerPropertiesViewModel LayerPropertiesViewModel { get; } + public BindableCollection PropertyTreeItemViewModels { get; set; } + + public void PopulateProperties(List properties) + { + PropertyTreeItemViewModels.Clear(); + + // Only put parents on the top-level, let parents populate their own children recursively + foreach (var property in properties) + { + if (property.Children.Any()) + PropertyTreeItemViewModels.Add(new PropertyTreeParentViewModel(property)); + } + } + + public void ClearProperties() + { + PropertyTreeItemViewModels.Clear(); } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineView.xaml index 79db3583d..e3e57b324 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineView.xaml @@ -1,33 +1,23 @@  - - - - - - - - - - + - + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs index c7d59ecdb..63b4cdc1f 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using Stylet; @@ -9,21 +10,46 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline public PropertyTimelineViewModel(LayerPropertiesViewModel layerPropertiesViewModel) { LayerPropertiesViewModel = layerPropertiesViewModel; - RailItemViewModels = new BindableCollection(); + PropertyTrackViewModels = new BindableCollection(); } public LayerPropertiesViewModel LayerPropertiesViewModel { get; } public double Width { get; set; } - public BindableCollection RailItemViewModels { get; set; } + public BindableCollection PropertyTrackViewModels { get; set; } public void UpdateEndTime() { // End time is the last keyframe + 10 sec - var lastKeyFrame = RailItemViewModels.SelectMany(r => r.KeyframeViewModels).OrderByDescending(t => t.Keyframe.Position).FirstOrDefault(); + var lastKeyFrame = PropertyTrackViewModels.SelectMany(r => r.KeyframeViewModels).OrderByDescending(t => t.Keyframe.Position).FirstOrDefault(); var endTime = lastKeyFrame?.Keyframe.Position.Add(new TimeSpan(0, 0, 0, 10)) ?? TimeSpan.FromSeconds(10); Width = endTime.TotalSeconds * LayerPropertiesViewModel.PixelsPerSecond; + + // Ensure the caret isn't outside the end time + if (LayerPropertiesViewModel.CurrentTime > endTime) + LayerPropertiesViewModel.CurrentTime = endTime; + } + + public void PopulateProperties(List properties) + { + PropertyTrackViewModels.Clear(); + foreach (var property in properties) + CreateViewModels(property); + + UpdateEndTime(); + } + + private void CreateViewModels(LayerPropertyViewModel property) + { + PropertyTrackViewModels.Add(new PropertyTrackViewModel(this, property)); + foreach (var child in property.Children) + CreateViewModels(child); + } + + public void ClearProperties() + { + PropertyTrackViewModels.Clear(); } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackView.xaml index 2afe43a1d..fd12f649e 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackView.xaml @@ -9,23 +9,28 @@ mc:Ignorable="d" d:DesignHeight="20" d:DesignWidth="600" d:DataContext="{d:DesignInstance local:PropertyTrackViewModel}"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackViewModel.cs index b6f4d1e21..0e64f6bc6 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackViewModel.cs @@ -1,18 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Linq; using Stylet; namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline { public class PropertyTrackViewModel : PropertyChangedBase { - public PropertyTimelineViewModel PropertyTimelineViewModel { get; } - public LayerPropertyViewModel LayerPropertyViewModel { get; } - public BindableCollection KeyframeViewModels { get; set; } - public PropertyTrackViewModel(PropertyTimelineViewModel propertyTimelineViewModel, LayerPropertyViewModel layerPropertyViewModel) { PropertyTimelineViewModel = propertyTimelineViewModel; @@ -23,6 +15,10 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline UpdateKeyframes(propertyTimelineViewModel.LayerPropertiesViewModel.PixelsPerSecond); } + public PropertyTimelineViewModel PropertyTimelineViewModel { get; } + public LayerPropertyViewModel LayerPropertyViewModel { get; } + public BindableCollection KeyframeViewModels { get; set; } + public void PopulateKeyframes() { foreach (var keyframe in LayerPropertyViewModel.LayerProperty.Keyframes) @@ -36,9 +32,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline public void UpdateKeyframes(int pixelsPerSecond) { foreach (var keyframeViewModel in KeyframeViewModels) - { keyframeViewModel.Update(pixelsPerSecond); - } } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/TreeItemViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/TreeItemViewModel.cs index 37bc1aa93..f0efe6155 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/TreeItemViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/TreeItemViewModel.cs @@ -12,10 +12,10 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem { public abstract class TreeItemViewModel : PropertyChangedBase { - private readonly IProfileEditorService _profileEditorService; private readonly IDialogService _dialogService; private readonly IFolderViewModelFactory _folderViewModelFactory; private readonly ILayerViewModelFactory _layerViewModelFactory; + private readonly IProfileEditorService _profileEditorService; protected TreeItemViewModel(TreeItemViewModel parent, ProfileElement profileElement, @@ -175,13 +175,13 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem { existing = Children.FirstOrDefault(p => p is FolderViewModel vm && vm.ProfileElement == folder); if (existing == null) - Children.Add(_folderViewModelFactory.Create((FolderViewModel)this, folder)); + Children.Add(_folderViewModelFactory.Create((FolderViewModel) this, folder)); } else if (profileElement is Layer layer) { existing = Children.FirstOrDefault(p => p is LayerViewModel vm && vm.ProfileElement == layer); if (existing == null) - Children.Add(_layerViewModelFactory.Create((FolderViewModel)this, layer)); + Children.Add(_layerViewModelFactory.Create((FolderViewModel) this, layer)); } existing?.UpdateProfileElements(); diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceViewModel.cs index 19dfb99a5..3bedd6e44 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceViewModel.cs @@ -7,7 +7,7 @@ using Stylet; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization { - public class ProfileDeviceViewModel : CanvasViewModel + public class ProfileDeviceViewModel : CanvasViewModel { public ProfileDeviceViewModel(ArtemisDevice device) { diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml index d676cea0e..961392118 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml @@ -30,7 +30,7 @@ - + @@ -40,7 +40,7 @@ - + diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml.cs index 5ed8f1f0c..79b26cf6e 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml.cs @@ -1,22 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; +using System.Windows.Controls; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization { /// - /// Interaction logic for ProfileLayerView.xaml + /// Interaction logic for ProfileLayerView.xaml /// public partial class ProfileLayerView : UserControl { @@ -25,4 +12,4 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedView.xaml index 1f25a5673..92311bd8c 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedView.xaml @@ -86,7 +86,7 @@ - + diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileViewModel.cs index f9dfc4b2f..9693b215c 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileViewModel.cs @@ -23,8 +23,8 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization public class ProfileViewModel : ProfileEditorPanelViewModel, IHandle, IHandle { private readonly IProfileEditorService _profileEditorService; - private readonly ISettingsService _settingsService; private readonly IProfileLayerViewModelFactory _profileLayerViewModelFactory; + private readonly ISettingsService _settingsService; private readonly ISurfaceService _surfaceService; private int _activeToolIndex; private VisualizationToolViewModel _activeToolViewModel; @@ -181,6 +181,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization { viewModel = Devices.FirstOrDefault(vm => vm.Device.RgbDevice == surfaceDeviceConfiguration.RgbDevice); } + if (viewModel == null) { // Create outside the UI thread to avoid slowdowns as much as possible diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolView.xaml.cs index 0e1f9d1f8..596559a60 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolView.xaml.cs @@ -1,22 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; +using System.Windows.Controls; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { /// - /// Interaction logic for EllipseToolView.xaml + /// Interaction logic for EllipseToolView.xaml /// public partial class EllipseToolView : UserControl { @@ -25,4 +12,4 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs index ffa6a935d..8130a360b 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs @@ -1,12 +1,10 @@ using System.IO; -using System.Linq; using System.Windows; using System.Windows.Input; using Artemis.Core.Models.Profile; using Artemis.Core.Models.Profile.LayerShapes; using Artemis.UI.Properties; using Artemis.UI.Services.Interfaces; -using SkiaSharp; using SkiaSharp.Views.WPF; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml index 7fd55cde8..ee9c8af10 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml @@ -1,9 +1,9 @@  - + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml.cs index 41ae6b8bb..567573f77 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml.cs @@ -1,22 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; +using System.Windows.Controls; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { /// - /// Interaction logic for FillToolView.xaml + /// Interaction logic for FillToolView.xaml /// public partial class FillToolView : UserControl { @@ -25,4 +12,4 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolViewModel.cs index c449b3d2d..de499d4d5 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolViewModel.cs @@ -31,7 +31,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools led => panZoomVm.TransformContainingRect(led.RgbLed.AbsoluteLedRectangle).Contains(position)) ); - if (layer == null) + if (layer == null) return; layer.LayerShape = new Fill(layer); ProfileEditorService.UpdateSelectedProfileElement(); diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml index 06e4f4c34..077b11991 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml @@ -1,12 +1,10 @@  - - - - + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml.cs index 474e29284..7caf3cef5 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml.cs @@ -1,22 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; +using System.Windows.Controls; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { /// - /// Interaction logic for PolygonToolView.xaml + /// Interaction logic for PolygonToolView.xaml /// public partial class PolygonToolView : UserControl { @@ -25,4 +12,4 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml index f1a04656c..08544994c 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml @@ -31,7 +31,7 @@ - + diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml.cs index 8b4ea29f8..d18292114 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml.cs @@ -1,22 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; +using System.Windows.Controls; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { /// - /// Interaction logic for RectangleToolView.xaml + /// Interaction logic for RectangleToolView.xaml /// public partial class RectangleToolView : UserControl { @@ -25,4 +12,4 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionAddToolView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionAddToolView.xaml index f259e7a54..ea940689d 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionAddToolView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionAddToolView.xaml @@ -1,12 +1,10 @@  - - - - + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionAddToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionAddToolView.xaml.cs index 579d26b00..dfeb04a68 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionAddToolView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionAddToolView.xaml.cs @@ -1,22 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; +using System.Windows.Controls; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { /// - /// Interaction logic for SelectionAddToolView.xaml + /// Interaction logic for SelectionAddToolView.xaml /// public partial class SelectionAddToolView : UserControl { @@ -25,4 +12,4 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml index abca091af..04865a926 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml @@ -1,12 +1,10 @@  - - - - + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml.cs index a8a4c5974..a0e31d51f 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml.cs @@ -1,22 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; +using System.Windows.Controls; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { /// - /// Interaction logic for SelectionRemoveToolView.xaml + /// Interaction logic for SelectionRemoveToolView.xaml /// public partial class SelectionRemoveToolView : UserControl { @@ -25,4 +12,4 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolViewModel.cs index b0f8d7fa2..692271412 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolViewModel.cs @@ -20,7 +20,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { base.MouseUp(sender, e); - var position = e.GetPosition((IInputElement)sender); + var position = e.GetPosition((IInputElement) sender); var selectedRect = new Rect(MouseDownStartPosition, position); foreach (var device in ProfileViewModel.Devices) diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolView.xaml index 25af68504..2a590c293 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolView.xaml @@ -1,12 +1,12 @@