Browse Source

Merge pull request #66 from ArtemK123/master

Change object based settings to typed generics #44
Krzysztof Krysiński 4 years ago
parent
commit
a184cd8706

+ 4 - 4
PixiEditor/Models/Controllers/BitmapManager.cs

@@ -12,7 +12,7 @@ using PixiEditor.Models.ImageManipulation;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Tools;
 using PixiEditor.Models.Tools;
-using PixiEditor.Models.Tools.ToolSettings;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 
 
 namespace PixiEditor.Models.Controllers
 namespace PixiEditor.Models.Controllers
 {
 {
@@ -46,12 +46,12 @@ namespace PixiEditor.Models.Controllers
 
 
         public int ToolSize
         public int ToolSize
         {
         {
-            get => SelectedTool.Toolbar.GetSetting("ToolSize") != null
-            ? (int)SelectedTool.Toolbar.GetSetting("ToolSize").Value
+            get => SelectedTool.Toolbar.GetSetting<SizeSetting>("ToolSize") != null
+            ? SelectedTool.Toolbar.GetSetting<SizeSetting>("ToolSize").Value
             : 1;
             : 1;
             set
             set
             {
             {
-                if (SelectedTool.Toolbar.GetSetting("ToolSize") is Setting toolSize)
+                if (SelectedTool.Toolbar.GetSetting<SizeSetting>("ToolSize") is var toolSize)
                 {
                 {
                     toolSize.Value = value;
                     toolSize.Value = value;
                     HighlightPixels(MousePositionConverter.CurrentCoordinates);
                     HighlightPixels(MousePositionConverter.CurrentCoordinates);

+ 2 - 2
PixiEditor/Models/Tools/ToolSettings/Settings/BoolSetting.cs

@@ -5,7 +5,7 @@ using System.Windows.Data;
 
 
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 {
 {
-    public class BoolSetting : Setting
+    public class BoolSetting : Setting<bool>
     {
     {
         public BoolSetting(string name, string label = "") : base(name)
         public BoolSetting(string name, string label = "") : base(name)
         {
         {
@@ -25,7 +25,7 @@ namespace PixiEditor.Models.Tools.ToolSettings.Settings
         {
         {
             CheckBox checkBox = new CheckBox
             CheckBox checkBox = new CheckBox
             {
             {
-                IsChecked = (bool) Value,
+                IsChecked = Value,
                 VerticalAlignment = VerticalAlignment.Center
                 VerticalAlignment = VerticalAlignment.Center
             };
             };
 
 

+ 1 - 1
PixiEditor/Models/Tools/ToolSettings/Settings/ColorSetting.cs

@@ -4,7 +4,7 @@ using ColorPicker;
 
 
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 {
 {
-    public class ColorSetting : Setting
+    public class ColorSetting : Setting<Color>
     {
     {
         public ColorSetting(string name, string label = "") : base(name)
         public ColorSetting(string name, string label = "") : base(name)
         {
         {

+ 1 - 1
PixiEditor/Models/Tools/ToolSettings/Settings/DropdownSetting.cs

@@ -5,7 +5,7 @@ using System.Windows.Data;
 
 
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 {
 {
-    public class DropdownSetting : Setting
+    public class DropdownSetting : Setting<object>
     {
     {
         public string[] Values { get; set; }
         public string[] Values { get; set; }
 
 

+ 1 - 1
PixiEditor/Models/Tools/ToolSettings/Settings/FloatSetting.cs

@@ -3,7 +3,7 @@ using PixiEditor.Views;
 
 
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 {
 {
-    public class FloatSetting : Setting
+    public class FloatSetting : Setting<float>
     {
     {
         public float Min { get; set; }
         public float Min { get; set; }
         public float Max { get; set; }
         public float Max { get; set; }

+ 19 - 8
PixiEditor/Models/Tools/ToolSettings/Settings/Setting.cs

@@ -1,15 +1,18 @@
 using System.Windows.Controls;
 using System.Windows.Controls;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 
 
-namespace PixiEditor.Models.Tools.ToolSettings
+namespace PixiEditor.Models.Tools.ToolSettings.Settings
 {
 {
-    public abstract class Setting : NotifyableObject
+    public abstract class Setting<T> : Setting
     {
     {
-        public string Name { get; protected set; }
-        public string Label { get; set; }
-        public bool HasLabel => !string.IsNullOrEmpty(Label);
+        private T value;
 
 
-        public object Value
+        protected Setting(string name)
+            : base(name)
+        {
+        }
+
+        public T Value
         {
         {
             get => value;
             get => value;
             set
             set
@@ -18,11 +21,19 @@ namespace PixiEditor.Models.Tools.ToolSettings
                 RaisePropertyChanged("Value");
                 RaisePropertyChanged("Value");
             }
             }
         }
         }
+    }
+
+    public abstract class Setting : NotifyableObject
+    {
+        public string Name { get; }
+
+        public string Label { get; set; }
+
+        public bool HasLabel => !string.IsNullOrEmpty(Label);
 
 
         public Control SettingControl { get; set; }
         public Control SettingControl { get; set; }
-        private object value;
 
 
-        public Setting(string name)
+        protected Setting(string name)
         {
         {
             Name = name;
             Name = name;
         }
         }

+ 2 - 2
PixiEditor/Models/Tools/ToolSettings/Settings/SizeSetting.cs

@@ -7,7 +7,7 @@ using PixiEditor.Helpers.Behaviours;
 
 
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 namespace PixiEditor.Models.Tools.ToolSettings.Settings
 {
 {
-    public class SizeSetting : Setting
+    public class SizeSetting : Setting<int>
     {
     {
         public SizeSetting(string name, string label = null) : base(name)
         public SizeSetting(string name, string label = null) : base(name)
         {
         {
@@ -28,7 +28,7 @@ namespace PixiEditor.Models.Tools.ToolSettings.Settings
 
 
             if (Application.Current != null)
             if (Application.Current != null)
             {
             {
-                tb.Style = (Style)Application.Current.TryFindResource("DarkTextBoxStyle"); ;
+                tb.Style = (Style)Application.Current.TryFindResource("DarkTextBoxStyle");
             }
             }
 
 
             Binding binding = new Binding("Value")
             Binding binding = new Binding("Value")

+ 30 - 8
PixiEditor/Models/Tools/ToolSettings/Toolbars/Toolbar.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Collections.ObjectModel;
 using System.Linq;
 using System.Linq;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 
 
 namespace PixiEditor.Models.Tools.ToolSettings.Toolbars
 namespace PixiEditor.Models.Tools.ToolSettings.Toolbars
 {
 {
@@ -20,16 +21,29 @@ namespace PixiEditor.Models.Tools.ToolSettings.Toolbars
             return Settings.FirstOrDefault(x => string.Equals(x.Name, name, StringComparison.CurrentCultureIgnoreCase));
             return Settings.FirstOrDefault(x => string.Equals(x.Name, name, StringComparison.CurrentCultureIgnoreCase));
         }
         }
 
 
+        /// <summary>
+        ///     Gets setting of given type T in toolbar by name.
+        /// </summary>
+        /// <param name="name">Setting name, non case sensitive</param>
+        /// <returns></returns>
+        public T GetSetting<T>(string name)
+            where T : Setting
+        {
+            Setting setting =  Settings.FirstOrDefault(currentSetting => string.Equals(currentSetting.Name, name, StringComparison.CurrentCultureIgnoreCase));
+
+            if (setting == null || !(setting is T convertedSetting))
+                return null;
+
+            return convertedSetting;
+        }
+
         /// <summary>
         /// <summary>
         ///     Saves current toolbar state, so other toolbars with common settings can load them.
         ///     Saves current toolbar state, so other toolbars with common settings can load them.
         /// </summary>
         /// </summary>
         public void SaveToolbarSettings()
         public void SaveToolbarSettings()
         {
         {
-            for (int i = 0; i < Settings.Count; i++)
-                if (SharedSettings.Any(x => x.Name == Settings[i].Name))
-                    SharedSettings.First(x => x.Name == Settings[i].Name).Value = Settings[i].Value;
-                else
-                    SharedSettings.Add(Settings[i]);
+            foreach (Setting setting in Settings)
+                AddSettingToCollection(SharedSettings, setting);
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -37,9 +51,17 @@ namespace PixiEditor.Models.Tools.ToolSettings.Toolbars
         /// </summary>
         /// </summary>
         public void LoadSharedSettings()
         public void LoadSharedSettings()
         {
         {
-            for (int i = 0; i < SharedSettings.Count; i++)
-                if (Settings.Any(x => x.Name == SharedSettings[i].Name))
-                    Settings.First(x => x.Name == SharedSettings[i].Name).Value = SharedSettings[i].Value;
+            foreach (Setting sharedSetting in SharedSettings)
+                AddSettingToCollection(Settings, sharedSetting);
+        }
+
+        private static void AddSettingToCollection(ICollection<Setting> collection, Setting setting)
+        {
+            Setting storedSetting = collection.FirstOrDefault(currentSetting => currentSetting.Name == setting.Name);
+            if (storedSetting != null)
+                collection.Remove(storedSetting);
+
+            collection.Add(setting);
         }
         }
     }
     }
 }
 }

+ 4 - 4
PixiEditor/Models/Tools/Tools/BrightnessTool.cs

@@ -3,12 +3,12 @@ using System.Collections.Generic;
 using System.Windows.Controls;
 using System.Windows.Controls;
 using System.Windows.Input;
 using System.Windows.Input;
 using System.Windows.Media;
 using System.Windows.Media;
-using System.Windows.Media.Imaging;
 using PixiEditor.Models.Colors;
 using PixiEditor.Models.Colors;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Enums;
 using PixiEditor.Models.Enums;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Position;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 
 
 namespace PixiEditor.Models.Tools.Tools
 namespace PixiEditor.Models.Tools.Tools
@@ -35,9 +35,9 @@ namespace PixiEditor.Models.Tools.Tools
 
 
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         {
         {
-            int toolSize = (int) Toolbar.GetSetting("ToolSize").Value;
-            float correctionFactor = (float) Toolbar.GetSetting("CorrectionFactor").Value;
-            Enum.TryParse<BrightnessMode>((Toolbar.GetSetting("Mode").Value as ComboBoxItem)?.Content as string, out var mode);
+            int toolSize = Toolbar.GetSetting<SizeSetting>("ToolSize").Value;
+            float correctionFactor = Toolbar.GetSetting<FloatSetting>("CorrectionFactor").Value;
+            Enum.TryParse((Toolbar.GetSetting<DropdownSetting>("Mode")?.Value as ComboBoxItem)?.Content as string, out BrightnessMode mode);
             Mode = mode;
             Mode = mode;
 
 
             LayerChange[] layersChanges = new LayerChange[1];
             LayerChange[] layersChanges = new LayerChange[1];

+ 4 - 5
PixiEditor/Models/Tools/Tools/CircleTool.cs

@@ -1,13 +1,12 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
-using System.Diagnostics;
 using System.Linq;
 using System.Linq;
-using System.Numerics;
 using System.Windows.Media;
 using System.Windows.Media;
 using PixiEditor.Helpers.Extensions;
 using PixiEditor.Helpers.Extensions;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Position;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 
 
 namespace PixiEditor.Models.Tools.Tools
 namespace PixiEditor.Models.Tools.Tools
 {
 {
@@ -22,13 +21,13 @@ namespace PixiEditor.Models.Tools.Tools
 
 
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         {
         {
-            int thickness = (int) Toolbar.GetSetting("ToolSize").Value;
+            int thickness = Toolbar.GetSetting<SizeSetting>("ToolSize").Value;
             DoubleCords fixedCoordinates = CalculateCoordinatesForShapeRotation(coordinates[^1], coordinates[0]);
             DoubleCords fixedCoordinates = CalculateCoordinatesForShapeRotation(coordinates[^1], coordinates[0]);
             IEnumerable<Coordinates> outline = CreateEllipse(fixedCoordinates.Coords1, fixedCoordinates.Coords2, thickness);
             IEnumerable<Coordinates> outline = CreateEllipse(fixedCoordinates.Coords1, fixedCoordinates.Coords2, thickness);
             BitmapPixelChanges pixels = BitmapPixelChanges.FromSingleColoredArray(outline, color);
             BitmapPixelChanges pixels = BitmapPixelChanges.FromSingleColoredArray(outline, color);
-            if ((bool) Toolbar.GetSetting("Fill").Value)
+            if (Toolbar.GetSetting<BoolSetting>("Fill").Value)
             {
             {
-                Color fillColor = (Color) Toolbar.GetSetting("FillColor").Value;
+                Color fillColor = Toolbar.GetSetting<ColorSetting>("FillColor").Value;
                 pixels.ChangedPixels.AddRangeNewOnly(
                 pixels.ChangedPixels.AddRangeNewOnly(
                     BitmapPixelChanges.FromSingleColoredArray(CalculateFillForEllipse(outline), fillColor)
                     BitmapPixelChanges.FromSingleColoredArray(CalculateFillForEllipse(outline), fillColor)
                         .ChangedPixels);
                         .ChangedPixels);

+ 2 - 2
PixiEditor/Models/Tools/Tools/EraserTool.cs

@@ -2,7 +2,7 @@
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Position;
-using PixiEditor.Models.Tools.ToolSettings;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 
 
 namespace PixiEditor.Models.Tools.Tools
 namespace PixiEditor.Models.Tools.Tools
@@ -19,7 +19,7 @@ namespace PixiEditor.Models.Tools.Tools
 
 
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         {
         {
-            return Erase(layer, coordinates, (int) Toolbar.GetSetting("ToolSize").Value);
+            return Erase(layer, coordinates, Toolbar.GetSetting<SizeSetting>("ToolSize").Value);
         }
         }
 
 
         public LayerChange[] Erase(Layer layer, Coordinates[] coordinates, int toolSize)
         public LayerChange[] Erase(Layer layer, Coordinates[] coordinates, int toolSize)

+ 3 - 4
PixiEditor/Models/Tools/Tools/LineTool.cs

@@ -1,12 +1,11 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Windows.Media;
 using System.Windows.Media;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Enums;
 using PixiEditor.Models.Enums;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Position;
-using PixiEditor.Models.Tools.ToolSettings;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 
 
 namespace PixiEditor.Models.Tools.Tools
 namespace PixiEditor.Models.Tools.Tools
@@ -26,7 +25,7 @@ namespace PixiEditor.Models.Tools.Tools
             var pixels =
             var pixels =
                 BitmapPixelChanges.FromSingleColoredArray(
                 BitmapPixelChanges.FromSingleColoredArray(
                     CreateLine(coordinates, 
                     CreateLine(coordinates, 
-                        (int) Toolbar.GetSetting("ToolSize").Value, CapType.Square, CapType.Square), color);
+                        Toolbar.GetSetting<SizeSetting>("ToolSize").Value, CapType.Square, CapType.Square), color);
             return Only(pixels, layer);
             return Only(pixels, layer);
         }
         }
 
 

+ 4 - 5
PixiEditor/Models/Tools/Tools/PenTool.cs

@@ -1,10 +1,9 @@
 using System.Windows.Input;
 using System.Windows.Input;
 using System.Windows.Media;
 using System.Windows.Media;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders;
-using PixiEditor.Models.Enums;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Position;
-using PixiEditor.Models.Tools.ToolSettings;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 
 
 namespace PixiEditor.Models.Tools.Tools
 namespace PixiEditor.Models.Tools.Tools
@@ -12,20 +11,20 @@ namespace PixiEditor.Models.Tools.Tools
     public class PenTool : BitmapOperationTool
     public class PenTool : BitmapOperationTool
     {
     {
         public override ToolType ToolType => ToolType.Pen;
         public override ToolType ToolType => ToolType.Pen;
-        private readonly int _toolSizeIndex;
+        private readonly SizeSetting _toolSizeSetting;
 
 
         public PenTool()
         public PenTool()
         {
         {
             Cursor = Cursors.Pen;
             Cursor = Cursors.Pen;
             Tooltip = "Standard brush (B)";
             Tooltip = "Standard brush (B)";
             Toolbar = new BasicToolbar();
             Toolbar = new BasicToolbar();
-            _toolSizeIndex = Toolbar.Settings.IndexOf(Toolbar.GetSetting("ToolSize"));
+            _toolSizeSetting = Toolbar.GetSetting<SizeSetting>("ToolSize");
         }
         }
 
 
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         {
         {
             Coordinates startingCords = coordinates.Length > 1 ? coordinates[1] : coordinates[0];
             Coordinates startingCords = coordinates.Length > 1 ? coordinates[1] : coordinates[0];
-            var pixels = Draw(startingCords, coordinates[0], color, (int) Toolbar.Settings[_toolSizeIndex].Value);
+            var pixels = Draw(startingCords, coordinates[0], color, _toolSizeSetting.Value);
             return Only(pixels, layer);
             return Only(pixels, layer);
         }
         }
 
 

+ 4 - 3
PixiEditor/Models/Tools/Tools/RectangleTool.cs

@@ -6,6 +6,7 @@ using PixiEditor.Helpers.Extensions;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Position;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 
 
 namespace PixiEditor.Models.Tools.Tools
 namespace PixiEditor.Models.Tools.Tools
 {
 {
@@ -21,12 +22,12 @@ namespace PixiEditor.Models.Tools.Tools
 
 
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         public override LayerChange[] Use(Layer layer, Coordinates[] coordinates, Color color)
         {
         {
-            int thickness = (int) Toolbar.GetSetting("ToolSize").Value;
+            int thickness = Toolbar.GetSetting<SizeSetting>("ToolSize").Value;
             BitmapPixelChanges pixels =
             BitmapPixelChanges pixels =
                 BitmapPixelChanges.FromSingleColoredArray(CreateRectangle(coordinates, thickness), color);
                 BitmapPixelChanges.FromSingleColoredArray(CreateRectangle(coordinates, thickness), color);
-            if ((bool) Toolbar.GetSetting("Fill").Value)
+            if (Toolbar.GetSetting<BoolSetting>("Fill").Value)
             {
             {
-                Color fillColor = (Color) Toolbar.GetSetting("FillColor").Value;
+                Color fillColor = Toolbar.GetSetting<ColorSetting>("FillColor").Value;
                 pixels.ChangedPixels.AddRangeOverride(
                 pixels.ChangedPixels.AddRangeOverride(
                     BitmapPixelChanges.FromSingleColoredArray
                     BitmapPixelChanges.FromSingleColoredArray
                             (CalculateFillForRectangle(coordinates[^1], coordinates[0], thickness), fillColor)
                             (CalculateFillForRectangle(coordinates[^1], coordinates[0], thickness), fillColor)

+ 2 - 2
PixiEditor/Models/Tools/Tools/SelectTool.cs

@@ -6,8 +6,8 @@ using System.Windows.Input;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Enums;
 using PixiEditor.Models.Enums;
-using PixiEditor.Models.Layers;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Position;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 using PixiEditor.ViewModels;
 using PixiEditor.ViewModels;
 
 
@@ -27,7 +27,7 @@ namespace PixiEditor.Models.Tools.Tools
 
 
         public override void OnMouseDown(MouseEventArgs e)
         public override void OnMouseDown(MouseEventArgs e)
         {
         {
-            Enum.TryParse((Toolbar.GetSetting("Mode").Value as ComboBoxItem)?.Content as string, out SelectionType);
+            Enum.TryParse((Toolbar.GetSetting<DropdownSetting>("Mode")?.Value as ComboBoxItem)?.Content as string, out SelectionType);
 
 
             _oldSelection = null;
             _oldSelection = null;
             if (ViewModelMain.Current.ActiveSelection != null &&
             if (ViewModelMain.Current.ActiveSelection != null &&

+ 41 - 8
PixiEditorTests/ModelsTests/ToolsTests/ToolbarTests/ToolbarBaseTests.cs

@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using PixiEditor.Models.Tools.ToolSettings;
+using PixiEditor.Models.Tools.ToolSettings.Settings;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 using PixiEditor.Models.Tools.ToolSettings.Toolbars;
 using Xunit;
 using Xunit;
 
 
@@ -10,7 +7,6 @@ namespace PixiEditorTests.ModelsTests.ToolsTests.ToolbarTests
     [Collection("Application collection")]
     [Collection("Application collection")]
     public class ToolbarBaseTests
     public class ToolbarBaseTests
     {
     {
-
         [StaFact]
         [StaFact]
         public void TestThatGetSettingReturnsCorrectSetting()
         public void TestThatGetSettingReturnsCorrectSetting()
         {
         {
@@ -23,22 +19,59 @@ namespace PixiEditorTests.ModelsTests.ToolsTests.ToolbarTests
             Assert.Equal(settingName,setting.Name);
             Assert.Equal(settingName,setting.Name);
         }
         }
 
 
+        [StaFact]
+        public void TestThatGenericGetSettingReturnsSettingWithCorrectType()
+        {
+            const string settingName = "test";
+            const bool settingValue = true;
+            Setting<bool> expected = new BoolSetting(settingName, settingValue);
+
+            BasicToolbar toolbar = new BasicToolbar();
+            toolbar.Settings.Add(expected);
+
+            BoolSetting actual = toolbar.GetSetting<BoolSetting>(settingName);
+
+            Assert.Equal(expected.Value, actual.Value);
+        }
+
+        [StaFact]
+        public void TestThatGenericGetSettingReturnsNullWhenSettingIsNotFound()
+        {
+            BasicToolbar toolbar = new BasicToolbar();
+
+            BoolSetting actual = toolbar.GetSetting<BoolSetting>("invalid");
+
+            Assert.Null(actual);
+        }
+
+        [StaFact]
+        public void TestThatGenericGetSettingReturnsNullWhenSettingHasWrongType()
+        {
+            const string settingName = "test";
+            BasicToolbar toolbar = new BasicToolbar();
+            toolbar.Settings.Add(new BoolSetting(settingName));
+
+            SizeSetting actual = toolbar.GetSetting<SizeSetting>(settingName);
+
+            Assert.Null(actual);
+        }
+
         [StaFact]
         [StaFact]
         public void TestThatSaveToolbarSettingsSavesSettingAndLoadsItIntoNewToolbar()
         public void TestThatSaveToolbarSettingsSavesSettingAndLoadsItIntoNewToolbar()
         {
         {
             BasicToolbar toolbar = new BasicToolbar();
             BasicToolbar toolbar = new BasicToolbar();
 
 
-            toolbar.Settings[0].Value = 5;
+            toolbar.GetSetting<SizeSetting>("ToolSize").Value = 5;
 
 
             toolbar.SaveToolbarSettings();
             toolbar.SaveToolbarSettings();
 
 
             BasicShapeToolbar shapeToolbar = new BasicShapeToolbar();
             BasicShapeToolbar shapeToolbar = new BasicShapeToolbar();
 
 
-            Assert.NotEqual(5, (int)shapeToolbar.GetSetting("ToolSize").Value);
+            Assert.NotEqual(5, shapeToolbar.GetSetting<SizeSetting>("ToolSize").Value);
 
 
             shapeToolbar.LoadSharedSettings();
             shapeToolbar.LoadSharedSettings();
 
 
-            Assert.Equal(5, (int)shapeToolbar.GetSetting("ToolSize").Value);
+            Assert.Equal(5, shapeToolbar.GetSetting<SizeSetting>("ToolSize").Value);
         }
         }
     }
     }
 }
 }