diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs index ab1e7bf..23bc19d 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs @@ -30,11 +30,12 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormLocomotiveCollection)); groupBoxSets = new GroupBox(); + ButtonSortByType = new Button(); textBoxSetName = new TextBox(); buttonDeleteSet = new Button(); listBoxStorages = new ListBox(); - ButtonAddLocomotive = new Button(); buttonAddSet = new Button(); + ButtonAddLocomotive = new Button(); maskedTextBoxNumber = new MaskedTextBox(); ButtonRefreshCollection = new Button(); ButtonRemoveLocomotive = new Button(); @@ -47,7 +48,6 @@ openFileDialog = new OpenFileDialog(); groupBoxMenu = new GroupBox(); ButtonSortByColor = new Button(); - ButtonSortByType = new Button(); groupBoxSets.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit(); menuStrip.SuspendLayout(); @@ -56,18 +56,27 @@ // // groupBoxSets // - groupBoxSets.Controls.Add(ButtonSortByType); groupBoxSets.Controls.Add(textBoxSetName); groupBoxSets.Controls.Add(buttonDeleteSet); groupBoxSets.Controls.Add(listBoxStorages); groupBoxSets.Controls.Add(buttonAddSet); groupBoxSets.Location = new Point(0, 22); groupBoxSets.Name = "groupBoxSets"; - groupBoxSets.Size = new Size(242, 314); + groupBoxSets.Size = new Size(242, 264); groupBoxSets.TabIndex = 5; groupBoxSets.TabStop = false; groupBoxSets.Text = "Наборы"; // + // ButtonSortByType + // + ButtonSortByType.Location = new Point(6, 295); + ButtonSortByType.Name = "ButtonSortByType"; + ButtonSortByType.Size = new Size(230, 41); + ButtonSortByType.TabIndex = 4; + ButtonSortByType.Text = "Сортировка по типу"; + ButtonSortByType.UseVisualStyleBackColor = true; + ButtonSortByType.Click += ButtonSortByType_Click; + // // textBoxSetName // textBoxSetName.Location = new Point(6, 38); @@ -95,16 +104,6 @@ listBoxStorages.TabIndex = 1; listBoxStorages.SelectedIndexChanged += listBoxStorages_SelectedIndexChanged; // - // ButtonAddLocomotive - // - ButtonAddLocomotive.Location = new Point(6, 395); - ButtonAddLocomotive.Name = "ButtonAddLocomotive"; - ButtonAddLocomotive.Size = new Size(230, 39); - ButtonAddLocomotive.TabIndex = 0; - ButtonAddLocomotive.Text = "Добавить локомотив"; - ButtonAddLocomotive.UseVisualStyleBackColor = true; - ButtonAddLocomotive.Click += buttonAddLocomotive_Click; - // // buttonAddSet // buttonAddSet.Location = new Point(6, 67); @@ -115,6 +114,16 @@ buttonAddSet.UseVisualStyleBackColor = true; buttonAddSet.Click += ButtonAddObject_Click; // + // ButtonAddLocomotive + // + ButtonAddLocomotive.Location = new Point(6, 395); + ButtonAddLocomotive.Name = "ButtonAddLocomotive"; + ButtonAddLocomotive.Size = new Size(230, 39); + ButtonAddLocomotive.TabIndex = 0; + ButtonAddLocomotive.Text = "Добавить локомотив"; + ButtonAddLocomotive.UseVisualStyleBackColor = true; + ButtonAddLocomotive.Click += buttonAddLocomotive_Click; + // // maskedTextBoxNumber // maskedTextBoxNumber.Location = new Point(6, 440); @@ -197,6 +206,7 @@ // groupBoxMenu // groupBoxMenu.AutoSize = true; + groupBoxMenu.Controls.Add(ButtonSortByType); groupBoxMenu.Controls.Add(ButtonSortByColor); groupBoxMenu.Controls.Add(maskedTextBoxNumber); groupBoxMenu.Controls.Add(groupBoxSets); @@ -219,15 +229,7 @@ ButtonSortByColor.TabIndex = 4; ButtonSortByColor.Text = "Сортировка по цвету"; ButtonSortByColor.UseVisualStyleBackColor = true; - // - // ButtonSortByType - // - ButtonSortByType.Location = new Point(6, 273); - ButtonSortByType.Name = "ButtonSortByType"; - ButtonSortByType.Size = new Size(230, 41); - ButtonSortByType.TabIndex = 4; - ButtonSortByType.Text = "Сортировка по типу"; - ButtonSortByType.UseVisualStyleBackColor = true; + ButtonSortByColor.Click += ButtonSortByColor_Click; // // FormLocomotiveCollection // diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs index d88fc9f..42af062 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs @@ -157,6 +157,36 @@ namespace ProjectElectricLocomotive } pictureBoxCollection.Image = obj.ShowLocomotives(); } + private void ButtonSortByType_Click(object sender, EventArgs e) => CompareLocomotives(new LocomotiveCompareByType()); + /// + /// Сортировка по цвету + /// + /// + /// + private void ButtonSortByColor_Click(object sender, EventArgs e) + { + // TODO продумать логику + } + /// + /// Сортировка по сравнителю + /// + /// + private void CompareLocomotives(IComparer comparer) + { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? + string.Empty]; + if (obj == null) + { + return; + } + obj.Sort(comparer); + pictureBoxCollection.Image = obj.ShowLocomotives(); + } + private void listBoxStorages_SelectedIndexChanged(object sender, EventArgs e) { pictureBoxCollection.Image = _storage[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowLocomotives(); diff --git a/ElectricLocomotive/ElectricLocomotive/LocomotiveCompareByColor.cs b/ElectricLocomotive/ElectricLocomotive/LocomotiveCompareByColor.cs index 5097ffc..026ea0e 100644 --- a/ElectricLocomotive/ElectricLocomotive/LocomotiveCompareByColor.cs +++ b/ElectricLocomotive/ElectricLocomotive/LocomotiveCompareByColor.cs @@ -4,16 +4,32 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using ProjectElectricLocomotive.DrawingObjects; +using ProjectElectricLocomotive.Entities; namespace ProjectElectricLocomotive.Generics { - internal interface LocomotiveCompareByColor + internal class LocoCompareByColor : IComparer { public int Compare(DrawingLocomotive? x, DrawingLocomotive? y) { - // TODO реализовать логику сравнения - throw new NotImplementedException(); - } + if (x == null || x.EntityLocomotive == null) + throw new NotImplementedException(nameof(x)); + + if (y == null || y.EntityLocomotive == null) + throw new NotImplementedException(nameof(y)); + + var bodyColor = x.EntityLocomotive.BodyColor.Name.CompareTo(y.EntityLocomotive.BodyColor.Name); + + if (bodyColor != 0) return bodyColor; + + if (x.EntityLocomotive is EntityElectricLocomotive && + y.EntityLocomotive is EntityElectricLocomotive) + { + var addcolor = (x.EntityLocomotive as EntityElectricLocomotive).AdditionalColor.Name.CompareTo((y.EntityLocomotive as EntityElectricLocomotive).AdditionalColor.Name); + if (addcolor != 0) return addcolor; + } + return 1; + } } } diff --git a/ElectricLocomotive/ElectricLocomotive/LocomotiveCompareByType.cs b/ElectricLocomotive/ElectricLocomotive/LocomotiveCompareByType.cs index 656238e..ad4cafd 100644 --- a/ElectricLocomotive/ElectricLocomotive/LocomotiveCompareByType.cs +++ b/ElectricLocomotive/ElectricLocomotive/LocomotiveCompareByType.cs @@ -7,7 +7,7 @@ using ProjectElectricLocomotive.DrawingObjects; namespace ProjectElectricLocomotive.Generics { - internal interface LocomotiveCompareByType : IComparer + internal class LocomotiveCompareByType : IComparer { public int Compare(DrawingLocomotive? x, DrawingLocomotive? y) { diff --git a/ElectricLocomotive/ElectricLocomotive/LocomotivesCollectionInfo.cs b/ElectricLocomotive/ElectricLocomotive/LocomotivesCollectionInfo.cs new file mode 100644 index 0000000..6cc75f2 --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/LocomotivesCollectionInfo.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive.Generics +{ + internal class LocomotivesCollectionInfo : IEquatable + { + public string Name { get; private set; } + public string Description { get; private set; } + public LocomotivesCollectionInfo(string name, string description) + { + Name = name; + Description = description; + } + public bool Equals(LocomotivesCollectionInfo other) + { + if (Name != other?.Name) + return false; + return true; + } + + public override int GetHashCode() + { + return Name.GetHashCode(); + } + + public override string ToString() + { + return Name; + } + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs index 6ddc96b..aec96cc 100644 --- a/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs +++ b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs @@ -10,8 +10,8 @@ namespace ProjectElectricLocomotive.Generics { internal class LocomotivesGenericStorage { - readonly Dictionary> _locomotivesStorage; - public List Keys => _locomotivesStorage.Keys.ToList(); + readonly Dictionary> _locomotivesStorage; + public List Keys => _locomotivesStorage.Keys.ToList(); private static readonly char _separatorForKeyValue = '|'; private readonly char _separatorRecords = ';'; private static readonly char _separatorForObject = ':'; @@ -22,22 +22,23 @@ namespace ProjectElectricLocomotive.Generics public LocomotivesGenericStorage(int pictureWidth, int pictureHeight) { - _locomotivesStorage = new Dictionary>(); + _locomotivesStorage = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } public void AddSet(string name) { - if (!_locomotivesStorage.ContainsKey(name)) + if (!_locomotivesStorage.ContainsKey( new LocomotivesCollectionInfo(name, ""))) { - _locomotivesStorage.Add(name, new LocomotivesGenericCollection(_pictureWidth, _pictureHeight)); + _locomotivesStorage.Add(new LocomotivesCollectionInfo(name, ""), + new LocomotivesGenericCollection(_pictureWidth, _pictureHeight)); } } public void DelSet(string name) { - if (_locomotivesStorage.ContainsKey(name)) + if (_locomotivesStorage.ContainsKey(new LocomotivesCollectionInfo(name, ""))) { - _locomotivesStorage.Remove(name); + _locomotivesStorage.Remove(new LocomotivesCollectionInfo(name, "")); } } public LocomotivesGenericCollection? @@ -45,9 +46,9 @@ namespace ProjectElectricLocomotive.Generics { get { - if (_locomotivesStorage.ContainsKey(ind)) + if (_locomotivesStorage.ContainsKey(new LocomotivesCollectionInfo(ind, ""))) { - return _locomotivesStorage[ind]; + return _locomotivesStorage[new LocomotivesCollectionInfo(ind, "")]; } return null; } @@ -59,7 +60,7 @@ namespace ProjectElectricLocomotive.Generics File.Delete(filename); } StringBuilder data = new(); - foreach (KeyValuePair> record in _locomotivesStorage) + foreach (KeyValuePair> record in _locomotivesStorage) { StringBuilder records = new(); foreach (DrawingLocomotive? elem in record.Value.GetLocomotives) @@ -126,13 +127,13 @@ namespace ProjectElectricLocomotive.Generics DrawingLocomotive? loco = elem?.CreateDrawningLocomotive(_separatorForObject, _pictureWidth, _pictureHeight); if (loco != null) { - if ((collection + loco) == -1) // for my realization it's -1, for eegov's realization it's boolean + if ((collection + loco) == -1) { throw new Exception("Ошибка добавления "); } } } - _locomotivesStorage.Add(record[0], collection); + _locomotivesStorage.Add(new LocomotivesCollectionInfo(record[0], string.Empty), collection); } return; }