From 0ccc1fed3d707285929f1e9ccc9e40dc78ac5e4f Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 11 Mar 2020 20:11:42 +0100 Subject: [PATCH] Gradient editor - Added stops creation Core - ColorGradient can now return a color at a certain position --- .../Models/Profile/ColorGradient.cs | 25 +++++++ .../Screens/Dialogs/ConfirmDialogViewModel.cs | 6 +- .../GradientEditor/GradientEditor.xaml | 72 +++++++++---------- .../GradientEditor/GradientEditor.xaml.cs | 11 ++- .../GradientEditorColor.xaml.cs | 1 + 5 files changed, 75 insertions(+), 40 deletions(-) diff --git a/src/Artemis.Core/Models/Profile/ColorGradient.cs b/src/Artemis.Core/Models/Profile/ColorGradient.cs index b702f7e6e..921f7caf6 100644 --- a/src/Artemis.Core/Models/Profile/ColorGradient.cs +++ b/src/Artemis.Core/Models/Profile/ColorGradient.cs @@ -44,6 +44,31 @@ namespace Artemis.Core.Models.Profile { OnPropertyChanged(nameof(Colors)); } + + public SKColor GetColor(float position) + { + var point = Colors.SingleOrDefault(f => f.Position == position); + if (point != null) return point.Color; + + var before = Colors.First(w => w.Position == Colors.Min(m => m.Position)); + var after = Colors.First(w => w.Position == Colors.Max(m => m.Position)); + + foreach (var gs in Colors) + { + if (gs.Position < position && gs.Position > before.Position) + before = gs; + + if (gs.Position >= position && gs.Position < after.Position) + after = gs; + } + + return new SKColor( + (byte) ((position - before.Position) * (after.Color.Red - before.Color.Red) / (after.Position - before.Position) + before.Color.Red), + (byte) ((position - before.Position) * (after.Color.Green - before.Color.Green) / (after.Position - before.Position) + before.Color.Green), + (byte) ((position - before.Position) * (after.Color.Blue - before.Color.Blue) / (after.Position - before.Position) + before.Color.Blue), + (byte) ((position - before.Position) * (after.Color.Alpha - before.Color.Alpha) / (after.Position - before.Position) + before.Color.Alpha) + ); + } } public class ColorGradientColor : INotifyPropertyChanged diff --git a/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogViewModel.cs b/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogViewModel.cs index 47e71b7fd..9443acaf1 100644 --- a/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogViewModel.cs +++ b/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogViewModel.cs @@ -19,12 +19,14 @@ namespace Artemis.UI.Shared.Screens.Dialogs public void Confirm() { - Session.Close(true); + if (!Session.IsEnded) + Session.Close(true); } public void Cancel() { - Session.Close(false); + if (!Session.IsEnded) + Session.Close(false); } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditor.xaml b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditor.xaml index d996b1624..4a9244a62 100644 --- a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditor.xaml +++ b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditor.xaml @@ -41,43 +41,41 @@ Gradient - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stops diff --git a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditor.xaml.cs b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditor.xaml.cs index d3e8d5eb1..ac1ce5a91 100644 --- a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditor.xaml.cs +++ b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditor.xaml.cs @@ -32,7 +32,7 @@ namespace Artemis.UI.Shared.Screens.GradientEditor InitializeComponent(); ColorGradient = colorGradient; } - + public ColorGradient ColorGradient { get => (ColorGradient) GetValue(ColorGradientProperty); @@ -57,5 +57,14 @@ namespace Artemis.UI.Shared.Screens.GradientEditor editor.OnPropertyChanged(nameof(ColorGradient)); editor._inCallback = false; } + + private void Rectangle_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + var position = e.GetPosition((IInputElement) sender); + // Position ranges from 0.0 to 1.0 + var newPosition = (float) Math.Min(1, Math.Max(0, Math.Round((position.X) / 435.0, 3, MidpointRounding.AwayFromZero))); + + ColorGradient.Colors.Add(new ColorGradientColor(ColorGradient.GetColor(newPosition), newPosition)); + } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorColor.xaml.cs b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorColor.xaml.cs index fb56d9b5c..ec7031e29 100644 --- a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorColor.xaml.cs +++ b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorColor.xaml.cs @@ -99,6 +99,7 @@ namespace Artemis.UI.Shared.Screens.GradientEditor } ((IInputElement) sender).ReleaseMouseCapture(); + e.Handled = true; } private void ColorStop_MouseMove(object sender, MouseEventArgs e)