diff --git a/src/Artemis.Core/Artemis.Core.csproj b/src/Artemis.Core/Artemis.Core.csproj index 47ba62de6..ea172f092 100644 --- a/src/Artemis.Core/Artemis.Core.csproj +++ b/src/Artemis.Core/Artemis.Core.csproj @@ -12,7 +12,7 @@ Artemis.Core v4.7.2 512 - false + false @@ -149,6 +149,7 @@ + @@ -160,6 +161,7 @@ + diff --git a/src/Artemis.Core/Models/Profile/Keyframe.cs b/src/Artemis.Core/Models/Profile/Keyframe.cs new file mode 100644 index 000000000..f89ace002 --- /dev/null +++ b/src/Artemis.Core/Models/Profile/Keyframe.cs @@ -0,0 +1,13 @@ +using System; + +namespace Artemis.Core.Models.Profile +{ + public class Keyframe + { + public Layer Layer { get; set; } + public LayerProperty Property { get; set; } + + public TimeSpan Position { get; set; } + public object Value { get; set; } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/LayerProperty.cs b/src/Artemis.Core/Models/Profile/LayerProperty.cs new file mode 100644 index 000000000..542a2b688 --- /dev/null +++ b/src/Artemis.Core/Models/Profile/LayerProperty.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; + +namespace Artemis.Core.Models.Profile +{ + public class LayerProperty + { + internal LayerProperty(Layer layer, LayerProperty parent) + { + Layer = layer; + Parent = parent; + + Children = new List(); + } + + public Layer Layer { get; } + public LayerProperty Parent { get; } + public List Children { get; set; } + + public string Name { get; set; } + public string Description { get; set; } + public Type Type { get; set; } + public object BaseValue { get; set; } + public List Keyframes { get; set; } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index 44a0f405f..c118fe942 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -159,23 +159,14 @@ LayerPropertiesView.xaml - - - LayerPropertiesTimelineView.xaml - - - - TimelineKeyframeView.xaml - - - - TimelinePropertyRailView.xaml - - - - TimelinePropertyView.xaml - - + + + + + + + + ProfileLayerView.xaml @@ -310,19 +301,19 @@ Designer MSBuild:Compile - + Designer MSBuild:Compile - + Designer MSBuild:Compile - + Designer MSBuild:Compile - + Designer MSBuild:Compile diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml index 4ef1adc6d..5a48c5b38 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml @@ -1,13 +1,78 @@  - + + + + + + + + + + + + + + + A play button, current time etc. etc.! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ 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 2ae9f3467..95a6b456a 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesView.xaml.cs @@ -24,5 +24,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties { InitializeComponent(); } + + // Keeping the scroll viewers in sync is up to the view, not a viewmodel concern } } diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesViewModel.cs index 7dc57f96f..841b3039d 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertiesViewModel.cs @@ -1,4 +1,7 @@ -using Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline; +using System; +using System.Windows; +using Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree; +using Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline; namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties { @@ -6,9 +9,44 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties { public LayerPropertiesViewModel() { - Timeline = new LayerPropertiesTimelineViewModel(); + PropertyTree = new PropertyTreeViewModel(this); + PropertyTimeline = new PropertyTimelineViewModel(this); } - public LayerPropertiesTimelineViewModel Timeline { get; set; } + public TimeSpan CurrentTime { get; set; } + public int PixelsPerSecond { get; set; } + public Thickness TimeCaretPosition + { + get => new Thickness(CurrentTime.TotalSeconds * PixelsPerSecond, 0, 0, 0); + set => CurrentTime = TimeSpan.FromSeconds(value.Left / PixelsPerSecond); + } + + public PropertyTreeViewModel PropertyTree { get; set; } + public PropertyTimelineViewModel PropertyTimeline { get; set; } + + private void CreateTestValues() + { +// 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); + } } } \ 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 new file mode 100644 index 000000000..77a71819e --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Artemis.Core.Models.Profile; +using Stylet; + +namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties +{ + public class LayerPropertyViewModel : PropertyChangedBase + { + public LayerProperty LayerProperty { get; } + + public LayerPropertyViewModel(LayerProperty layerProperty) + { + LayerProperty = layerProperty; + } + + public bool IsCollapsed { 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 new file mode 100644 index 000000000..bf4bfd3e3 --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildView.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs new file mode 100644 index 000000000..2e2b5a504 --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs @@ -0,0 +1,19 @@ +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 +{ + public class PropertyTreeChildViewModel : PropertyChangedBase + { + public LayerPropertyViewModel LayerPropertyViewModel { get; } + + public PropertyTreeChildViewModel(LayerPropertyViewModel layerPropertyViewModel) + { + LayerPropertyViewModel = layerPropertyViewModel; + } + } +} diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs new file mode 100644 index 000000000..f54b158f3 --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs @@ -0,0 +1,19 @@ +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 +{ + public class PropertyTreeParentViewModel : PropertyTreeItemViewModel + { + public string Name { get; set; } + public PropertyTreeItemViewModel Children { get; set; } + } + + public class PropertyTreeItemViewModel : PropertyChangedBase + { + } +} diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeView.xaml new file mode 100644 index 000000000..5dd792ee9 --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeView.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs new file mode 100644 index 000000000..beab63d4d --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs @@ -0,0 +1,19 @@ +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 +{ + public class PropertyTreeViewModel : PropertyChangedBase + { + public LayerPropertiesViewModel LayerPropertiesViewModel { get; } + public BindableCollection PropertyTreeItemViewModels { get; set; } + public PropertyTreeViewModel(LayerPropertiesViewModel layerPropertiesViewModel) + { + LayerPropertiesViewModel = layerPropertiesViewModel; + } + } +} diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/LayerPropertiesTimelineView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/LayerPropertiesTimelineView.xaml deleted file mode 100644 index 59c165490..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/LayerPropertiesTimelineView.xaml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/LayerPropertiesTimelineView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/LayerPropertiesTimelineView.xaml.cs deleted file mode 100644 index 0b73bf13a..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/LayerPropertiesTimelineView.xaml.cs +++ /dev/null @@ -1,28 +0,0 @@ -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; - -namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline -{ - /// - /// Interaction logic for LayerPropertiesTimelineView.xaml - /// - public partial class LayerPropertiesTimelineView : UserControl - { - public LayerPropertiesTimelineView() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/LayerPropertiesTimelineViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/LayerPropertiesTimelineViewModel.cs deleted file mode 100644 index ed271a0ef..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/LayerPropertiesTimelineViewModel.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows; -using System.Windows.Markup; -using Stylet; - -namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline -{ - public class LayerPropertiesTimelineViewModel : PropertyChangedBase - { - private int _pixelsPerSecond = 1; - - public LayerPropertiesTimelineViewModel() - { - TimelinePropertyRailViewModels = new BindableCollection(); - - TimeCaretTime = TimeSpan.FromSeconds(3); - CreateTestValues(); - Update(); - } - - public int PixelsPerSecond - { - get => _pixelsPerSecond; - set - { - _pixelsPerSecond = value; - Update(); - } - } - - public TimeSpan TimeCaretTime { get; set; } - public Thickness TimeCaretPosition - { - get => new Thickness(TimeCaretTime.TotalSeconds * PixelsPerSecond, 0, 0, 0); - set => TimeCaretTime = TimeSpan.FromSeconds(value.Left / PixelsPerSecond); - } - - public BindableCollection TimelinePropertyRailViewModels { get; set; } - - private void CreateTestValues() - { - var propertyRailViewModels = new List(); - for (var i = 0; i < 20; i++) - propertyRailViewModels.Add(new TimelinePropertyRailViewModel()); - - TimelinePropertyRailViewModels.AddRange(propertyRailViewModels); - } - - public void Update() - { - foreach (var timelinePropertyRailViewModel in TimelinePropertyRailViewModels) - timelinePropertyRailViewModel.Update(PixelsPerSecond); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelineKeyframeView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyRailItemView.xaml.cs similarity index 78% rename from src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelineKeyframeView.xaml.cs rename to src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyRailItemView.xaml.cs index 8bc9392df..de529c138 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelineKeyframeView.xaml.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyRailItemView.xaml.cs @@ -16,11 +16,11 @@ using System.Windows.Shapes; namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline { /// - /// Interaction logic for TimelineKeyframeView.xaml + /// Interaction logic for PropertyRailItemView.xaml /// - public partial class TimelineKeyframeView : UserControl + public partial class PropertyTrackView : UserControl { - public TimelineKeyframeView() + public PropertyTrackView() { InitializeComponent(); } diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/Controls/TimelineTime.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineHeader.cs similarity index 95% rename from src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/Controls/TimelineTime.cs rename to src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineHeader.cs index 78554e8a2..be55f7b43 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/Controls/TimelineTime.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineHeader.cs @@ -4,31 +4,30 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Media; -namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline.Controls +namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline { - public class TimelineTime : FrameworkElement + public class PropertyTimelineHeader : FrameworkElement { - public static readonly DependencyProperty FillProperty = DependencyProperty.Register(nameof(Fill), typeof(Brush), typeof(TimelineTime), + public static readonly DependencyProperty FillProperty = DependencyProperty.Register(nameof(Fill), typeof(Brush), typeof(PropertyTimelineHeader), new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.AffectsRender)); - public static readonly DependencyProperty FontFamilyProperty = DependencyProperty.Register(nameof(FontFamily), typeof(FontFamily), typeof(TimelineTime), + public static readonly DependencyProperty FontFamilyProperty = DependencyProperty.Register(nameof(FontFamily), typeof(FontFamily), typeof(PropertyTimelineHeader), new FrameworkPropertyMetadata(TextBlock.FontFamilyProperty.DefaultMetadata.DefaultValue, FrameworkPropertyMetadataOptions.AffectsRender)); - public static readonly DependencyProperty PixelsPerSecondProperty = DependencyProperty.Register(nameof(PixelsPerSecond), typeof(int), typeof(TimelineTime), + public static readonly DependencyProperty PixelsPerSecondProperty = DependencyProperty.Register(nameof(PixelsPerSecond), typeof(int), typeof(PropertyTimelineHeader), new FrameworkPropertyMetadata(default(int), FrameworkPropertyMetadataOptions.AffectsRender)); - public static readonly DependencyProperty HorizontalOffsetProperty = DependencyProperty.Register(nameof(HorizontalOffset), typeof(double), typeof(TimelineTime), + public static readonly DependencyProperty HorizontalOffsetProperty = DependencyProperty.Register(nameof(HorizontalOffset), typeof(double), typeof(PropertyTimelineHeader), new FrameworkPropertyMetadata(default(double), FrameworkPropertyMetadataOptions.AffectsRender)); - public static readonly DependencyProperty VisibleWidthProperty = DependencyProperty.Register(nameof(VisibleWidth), typeof(double), typeof(TimelineTime), + public static readonly DependencyProperty VisibleWidthProperty = DependencyProperty.Register(nameof(VisibleWidth), typeof(double), typeof(PropertyTimelineHeader), new FrameworkPropertyMetadata(default(double), FrameworkPropertyMetadataOptions.AffectsRender)); private double _subd1; private double _subd2; private double _subd3; - public Brush Fill { get => (Brush) GetValue(FillProperty); @@ -80,7 +79,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline.Contr // Add a 100px margin to allow the text to partially render when needed if (x < HorizontalOffset - 100 || x > HorizontalOffset + width) continue; - + var t = TimeSpan.FromSeconds((i * units - offsetUnits) / PixelsPerSecond + frameStart); // 0.00 is always formatted as 0.00 if (t == TimeSpan.Zero) @@ -123,8 +122,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline.Contr if (x == 1) drawingContext.DrawText(formattedText, new Point(x, 2)); else - drawingContext.DrawText(formattedText, new Point(x - formattedText.Width /2, 2)); - + drawingContext.DrawText(formattedText, new Point(x - formattedText.Width / 2, 2)); } private void UpdateTimeScale() diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineView.xaml new file mode 100644 index 000000000..79db3583d --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineView.xaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs new file mode 100644 index 000000000..c7d59ecdb --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs @@ -0,0 +1,29 @@ +using System; +using System.Linq; +using Stylet; + +namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline +{ + public class PropertyTimelineViewModel : PropertyChangedBase + { + public PropertyTimelineViewModel(LayerPropertiesViewModel layerPropertiesViewModel) + { + LayerPropertiesViewModel = layerPropertiesViewModel; + RailItemViewModels = new BindableCollection(); + } + + public LayerPropertiesViewModel LayerPropertiesViewModel { get; } + + public double Width { get; set; } + public BindableCollection RailItemViewModels { 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 endTime = lastKeyFrame?.Keyframe.Position.Add(new TimeSpan(0, 0, 0, 10)) ?? TimeSpan.FromSeconds(10); + + Width = endTime.TotalSeconds * LayerPropertiesViewModel.PixelsPerSecond; + } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackKeyframeViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackKeyframeViewModel.cs new file mode 100644 index 000000000..3c6f1574e --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackKeyframeViewModel.cs @@ -0,0 +1,25 @@ +using System; +using Artemis.Core.Models.Profile; +using Stylet; + +namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline +{ + public class PropertyTrackKeyframeViewModel : PropertyChangedBase + { + public PropertyTrackKeyframeViewModel(Keyframe keyframe) + { + Keyframe = keyframe; + } + + public Keyframe Keyframe { get; } + + public double X { get; set; } + public string Timestamp { get; set; } + + public void Update(int pixelsPerSecond) + { + X = pixelsPerSecond * Keyframe.Position.TotalSeconds; + Timestamp = $"{Math.Floor(Keyframe.Position.TotalSeconds):00}.{Keyframe.Position.Milliseconds:000}"; + } + } +} \ 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 new file mode 100644 index 000000000..2afe43a1d --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackView.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 000000000..b6f4d1e21 --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackViewModel.cs @@ -0,0 +1,44 @@ +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.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; + LayerPropertyViewModel = layerPropertyViewModel; + KeyframeViewModels = new BindableCollection(); + + PopulateKeyframes(); + UpdateKeyframes(propertyTimelineViewModel.LayerPropertiesViewModel.PixelsPerSecond); + } + + public void PopulateKeyframes() + { + foreach (var keyframe in LayerPropertyViewModel.LayerProperty.Keyframes) + { + if (KeyframeViewModels.Any(k => k.Keyframe == keyframe)) + continue; + KeyframeViewModels.Add(new PropertyTrackKeyframeViewModel(keyframe)); + } + } + + 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/LayerProperties/Timeline/TimelineKeyframeView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelineKeyframeView.xaml deleted file mode 100644 index 5b3ce28a3..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelineKeyframeView.xaml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelineKeyframeViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelineKeyframeViewModel.cs deleted file mode 100644 index f61eb91fc..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelineKeyframeViewModel.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using Stylet; - -namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline -{ - public class TimelineKeyframeViewModel : PropertyChangedBase - { - private const double BaseSize = 60.0; - - public TimeSpan Position { get; set; } - - public double X { get; set; } - public string Timestamp { get; set; } - - public void Update(int pixelsPerSecond) - { -// var timelinePartWidth = pixelsPerSecond % BaseSize + BaseSize; -// var millisecondsPerPart = extraParts > 0 ? BaseSize * 1000 / extraParts : BaseSize * 1000; - X = pixelsPerSecond * Position.TotalSeconds; - Timestamp = $"{Math.Floor(Position.TotalSeconds):00}.{Position.Milliseconds:000}"; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyRailView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyRailView.xaml deleted file mode 100644 index 17dab3685..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyRailView.xaml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyRailView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyRailView.xaml.cs deleted file mode 100644 index 7a9c25366..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyRailView.xaml.cs +++ /dev/null @@ -1,28 +0,0 @@ -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; - -namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline -{ - /// - /// Interaction logic for TimelinePropertyRailView.xaml - /// - public partial class TimelinePropertyRailView : UserControl - { - public TimelinePropertyRailView() - { - InitializeComponent(); - } - } -} diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyRailViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyRailViewModel.cs deleted file mode 100644 index 0ec42d02b..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyRailViewModel.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Stylet; - -namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline -{ - public class TimelinePropertyRailViewModel : PropertyChangedBase - { - public TimelinePropertyRailViewModel() - { - TimelineKeyframeViewModels = new BindableCollection(); - CreateTestValues(); - } - - public BindableCollection TimelineKeyframeViewModels { get; set; } - public double Width { get; set; } - - public void CreateTestValues() - { - var keyframeViewModels = new List(); - for (var i = 0; i < 20; i++) - { - keyframeViewModels.Add(new TimelineKeyframeViewModel()); - keyframeViewModels[i].Position = TimeSpan.FromSeconds(i); - } - - TimelineKeyframeViewModels.AddRange(keyframeViewModels); - } - - public void Update(int pixelsPerSecond) - { - foreach (var timelineKeyframeViewModel in TimelineKeyframeViewModels) - timelineKeyframeViewModel.Update(pixelsPerSecond); - - // End time is the last keyframe + 10 sec - var lastKeyFrame = TimelineKeyframeViewModels.OrderByDescending(t => t.Position).FirstOrDefault(); - var endTime = lastKeyFrame?.Position.Add(new TimeSpan(0, 0, 0, 10)) ?? TimeSpan.FromSeconds(10); - - Width = endTime.TotalSeconds * pixelsPerSecond; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyView.xaml deleted file mode 100644 index 77538fd84..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyView.xaml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Lorem ipsum dolor sit amet, consectetur adipisicing - - - - - \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyView.xaml.cs deleted file mode 100644 index 1bb67c8d6..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyView.xaml.cs +++ /dev/null @@ -1,28 +0,0 @@ -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; - -namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline -{ - /// - /// Interaction logic for TimelinePropertyView.xaml - /// - public partial class TimelinePropertyView : UserControl - { - public TimelinePropertyView() - { - InitializeComponent(); - } - } -} diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyViewModel.cs deleted file mode 100644 index 7769d55bd..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/TimelinePropertyViewModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -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.Timeline -{ - public class TimelinePropertyViewModel : PropertyChangedBase - { - } -} \ No newline at end of file