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