diff --git a/AntiAircraftGun/AntiAircraftGun/AbstractMap.cs b/AntiAircraftGun/AntiAircraftGun/AbstractMap.cs index 553ef44..750f21e 100644 --- a/AntiAircraftGun/AntiAircraftGun/AbstractMap.cs +++ b/AntiAircraftGun/AntiAircraftGun/AbstractMap.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace AntiAircraftGun { - internal abstract class AbstractMap + internal abstract class AbstractMap : IEquatable { private IDrawingObject _drawingObject = null; protected int[,] _map = null; @@ -153,5 +153,10 @@ namespace AntiAircraftGun protected abstract void GenerateMap(); protected abstract void DrawRoadPart(Graphics g, int i, int j); protected abstract void DrawBarrierPart(Graphics g, int i, int j); + + public bool Equals(AbstractMap? other) + { + return this == other && this._width == other._width && this._height == other._height && this._map == other._map && this._drawingObject == other._drawingObject; + } } } diff --git a/AntiAircraftGun/AntiAircraftGun/AntiAircraftGunCompareByColor.cs b/AntiAircraftGun/AntiAircraftGun/AntiAircraftGunCompareByColor.cs new file mode 100644 index 0000000..1ea7e52 --- /dev/null +++ b/AntiAircraftGun/AntiAircraftGun/AntiAircraftGunCompareByColor.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AntiAircraftGun +{ + internal class AntiAircraftGunCompareByColor : IComparer + { + public int Compare(IDrawingObject? x, IDrawingObject? y) + { + if (x == null && y == null) + { + return 0; + } + if (x == null && y != null) + { + return 1; + } + if (x != null && y == null) + { + return -1; + } + var xAntiAircraftGun = x as DrawingObjectAntiAircraftGun; + var yAntiAircraftGun = y as DrawingObjectAntiAircraftGun; + if (xAntiAircraftGun == null && yAntiAircraftGun == null) + { + return 0; + } + if (xAntiAircraftGun == null && yAntiAircraftGun != null) + { + return 1; + } + if (xAntiAircraftGun != null && yAntiAircraftGun == null) + { + return -1; + } + if (xAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor == yAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor) + { + return 0; + } + if (xAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.R.CompareTo(yAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.R) == 0) + { + if (xAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.G.CompareTo(yAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.G) == 0) + { + return xAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.B.CompareTo(yAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.B); + } + else return xAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.G.CompareTo(yAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.G); + } + else return xAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.R.CompareTo(yAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.BodyColor.R); + } + } +} diff --git a/AntiAircraftGun/AntiAircraftGun/AntiAircraftGunCompareByType.cs b/AntiAircraftGun/AntiAircraftGun/AntiAircraftGunCompareByType.cs new file mode 100644 index 0000000..6c9b1c7 --- /dev/null +++ b/AntiAircraftGun/AntiAircraftGun/AntiAircraftGunCompareByType.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AntiAircraftGun +{ + internal class AntiAircraftGunCompareByType : IComparer + { + public int Compare(IDrawingObject? x, IDrawingObject? y) + { + if (x == null && y == null) + { + return 0; + } + if (x == null && y != null) + { + return 1; + } + if (x != null && y == null) + { + return -1; + } + var xAntiAircraftGun = x as DrawingObjectAntiAircraftGun; + var yAntiAircraftGun = y as DrawingObjectAntiAircraftGun; + if (xAntiAircraftGun == null && yAntiAircraftGun == null) + { + return 0; + } + if (xAntiAircraftGun == null && yAntiAircraftGun != null) + { + return 1; + } + if (xAntiAircraftGun != null && yAntiAircraftGun == null) + { + return -1; + } + if (xAntiAircraftGun.GetAntiAircraftGun.GetType().Name != yAntiAircraftGun.GetAntiAircraftGun.GetType().Name) + { + if (xAntiAircraftGun.GetAntiAircraftGun.GetType().Name == "DrawingAntiAircraftGun") + { + return -1; + } + return 1; + } + var speedCompare = xAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.Speed.CompareTo(yAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return xAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.Weight.CompareTo(yAntiAircraftGun.GetAntiAircraftGun.AntiAircraftGun.Weight); + } + } +} diff --git a/AntiAircraftGun/AntiAircraftGun/DrawingObjectAntiAircraftGun.cs b/AntiAircraftGun/AntiAircraftGun/DrawingObjectAntiAircraftGun.cs index bd7fc3c..a9894a7 100644 --- a/AntiAircraftGun/AntiAircraftGun/DrawingObjectAntiAircraftGun.cs +++ b/AntiAircraftGun/AntiAircraftGun/DrawingObjectAntiAircraftGun.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection.PortableExecutable; using System.Text; using System.Threading.Tasks; @@ -14,6 +15,7 @@ namespace AntiAircraftGun _antiAircraftGun = antiAircraftGun; } public float Step => _antiAircraftGun?.AntiAircraftGun?.Step ?? 0; + public DrawingAntiAircraftGun GetAntiAircraftGun => _antiAircraftGun; public (float Left, float Right, float Top, float Bottom) GetCurrentPosition() { return _antiAircraftGun?.GetCurrentPosition() ?? default; @@ -35,5 +37,49 @@ namespace AntiAircraftGun public string GetInfo() => _antiAircraftGun?.GetDataForSave(); public static IDrawingObject Create(string data) => new DrawingObjectAntiAircraftGun(data.CreateDrawingAntiAircraftGun()); + + public bool Equals(IDrawingObject? other) + { + if (other == null) + { + return false; + } + var otherAntiAircraftGun = other as DrawingObjectAntiAircraftGun; + if (otherAntiAircraftGun == null) + { + return false; + } + var antiAircraftGun = _antiAircraftGun.AntiAircraftGun; + var otherAntiAircraftGunAntiAircraftGun = otherAntiAircraftGun._antiAircraftGun.AntiAircraftGun; + if (antiAircraftGun.Speed != otherAntiAircraftGunAntiAircraftGun.Speed) + { + return false; + } + if (antiAircraftGun.Weight != otherAntiAircraftGunAntiAircraftGun.Weight) + { + return false; + } + if (antiAircraftGun.BodyColor != otherAntiAircraftGunAntiAircraftGun.BodyColor) + { + return false; + } + + if (antiAircraftGun is EntityUpdateAntiAircraftGun && otherAntiAircraftGunAntiAircraftGun is EntityUpdateAntiAircraftGun) + { + var updateAntiAircraftGun = antiAircraftGun as EntityUpdateAntiAircraftGun; + var otherUpdateAntiAircraftGun = otherAntiAircraftGunAntiAircraftGun as EntityUpdateAntiAircraftGun; + if (updateAntiAircraftGun.DopColor != otherUpdateAntiAircraftGun.DopColor || updateAntiAircraftGun.Gun != otherUpdateAntiAircraftGun.Gun || + updateAntiAircraftGun.Radar != otherUpdateAntiAircraftGun.Radar) + { + return false; + } + } + else if (antiAircraftGun is EntityUpdateAntiAircraftGun || otherAntiAircraftGunAntiAircraftGun is EntityUpdateAntiAircraftGun) + { + return false; + } + + return true; + } } } diff --git a/AntiAircraftGun/AntiAircraftGun/FormMapWithSetAntiAircraftGuns.Designer.cs b/AntiAircraftGun/AntiAircraftGun/FormMapWithSetAntiAircraftGuns.Designer.cs index 9d7a137..829ac9e 100644 --- a/AntiAircraftGun/AntiAircraftGun/FormMapWithSetAntiAircraftGuns.Designer.cs +++ b/AntiAircraftGun/AntiAircraftGun/FormMapWithSetAntiAircraftGuns.Designer.cs @@ -51,6 +51,8 @@ this.LoadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); + this.ButtonSortByType = new System.Windows.Forms.Button(); + this.ButtonSortByColor = new System.Windows.Forms.Button(); this.groupBox.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); this.groupBoxMaps.SuspendLayout(); @@ -59,6 +61,8 @@ // // groupBox // + this.groupBox.Controls.Add(this.ButtonSortByColor); + this.groupBox.Controls.Add(this.ButtonSortByType); this.groupBox.Controls.Add(this.buttonShowOnMap); this.groupBox.Controls.Add(this.buttonShowStorage); this.groupBox.Controls.Add(this.buttonRemoveAntiAircraftGun); @@ -71,14 +75,14 @@ this.groupBox.Dock = System.Windows.Forms.DockStyle.Right; this.groupBox.Location = new System.Drawing.Point(574, 28); this.groupBox.Name = "groupBox"; - this.groupBox.Size = new System.Drawing.Size(238, 579); + this.groupBox.Size = new System.Drawing.Size(238, 658); this.groupBox.TabIndex = 0; this.groupBox.TabStop = false; this.groupBox.Text = "Инструменты"; // // buttonShowOnMap // - this.buttonShowOnMap.Location = new System.Drawing.Point(20, 465); + this.buttonShowOnMap.Location = new System.Drawing.Point(20, 540); this.buttonShowOnMap.Name = "buttonShowOnMap"; this.buttonShowOnMap.Size = new System.Drawing.Size(194, 29); this.buttonShowOnMap.TabIndex = 16; @@ -88,7 +92,7 @@ // // buttonShowStorage // - this.buttonShowStorage.Location = new System.Drawing.Point(20, 430); + this.buttonShowStorage.Location = new System.Drawing.Point(20, 505); this.buttonShowStorage.Name = "buttonShowStorage"; this.buttonShowStorage.Size = new System.Drawing.Size(194, 29); this.buttonShowStorage.TabIndex = 15; @@ -98,7 +102,7 @@ // // buttonRemoveAntiAircraftGun // - this.buttonRemoveAntiAircraftGun.Location = new System.Drawing.Point(20, 395); + this.buttonRemoveAntiAircraftGun.Location = new System.Drawing.Point(20, 470); this.buttonRemoveAntiAircraftGun.Name = "buttonRemoveAntiAircraftGun"; this.buttonRemoveAntiAircraftGun.Size = new System.Drawing.Size(194, 29); this.buttonRemoveAntiAircraftGun.TabIndex = 14; @@ -108,7 +112,7 @@ // // maskedTextBoxPosition // - this.maskedTextBoxPosition.Location = new System.Drawing.Point(22, 362); + this.maskedTextBoxPosition.Location = new System.Drawing.Point(22, 437); this.maskedTextBoxPosition.Mask = "00"; this.maskedTextBoxPosition.Name = "maskedTextBoxPosition"; this.maskedTextBoxPosition.Size = new System.Drawing.Size(194, 27); @@ -116,7 +120,7 @@ // // buttonAddAntiAircraftGun // - this.buttonAddAntiAircraftGun.Location = new System.Drawing.Point(20, 327); + this.buttonAddAntiAircraftGun.Location = new System.Drawing.Point(20, 402); this.buttonAddAntiAircraftGun.Name = "buttonAddAntiAircraftGun"; this.buttonAddAntiAircraftGun.Size = new System.Drawing.Size(194, 29); this.buttonAddAntiAircraftGun.TabIndex = 12; @@ -129,7 +133,7 @@ this.buttonDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonDown.BackgroundImage = global::AntiAircraftGun.Properties.Resources.arrowDown; this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.buttonDown.Location = new System.Drawing.Point(108, 537); + this.buttonDown.Location = new System.Drawing.Point(103, 613); this.buttonDown.Name = "buttonDown"; this.buttonDown.Size = new System.Drawing.Size(30, 29); this.buttonDown.TabIndex = 10; @@ -141,7 +145,7 @@ this.buttonRight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonRight.BackgroundImage = global::AntiAircraftGun.Properties.Resources.arrowRight; this.buttonRight.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.buttonRight.Location = new System.Drawing.Point(143, 537); + this.buttonRight.Location = new System.Drawing.Point(138, 613); this.buttonRight.Name = "buttonRight"; this.buttonRight.Size = new System.Drawing.Size(30, 29); this.buttonRight.TabIndex = 9; @@ -153,7 +157,7 @@ this.buttonLeft.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonLeft.BackgroundImage = global::AntiAircraftGun.Properties.Resources.arrowLeft; this.buttonLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.buttonLeft.Location = new System.Drawing.Point(71, 537); + this.buttonLeft.Location = new System.Drawing.Point(66, 613); this.buttonLeft.Name = "buttonLeft"; this.buttonLeft.Size = new System.Drawing.Size(30, 29); this.buttonLeft.TabIndex = 8; @@ -165,7 +169,7 @@ this.buttonUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonUp.BackgroundImage = global::AntiAircraftGun.Properties.Resources.arrowUp; this.buttonUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.buttonUp.Location = new System.Drawing.Point(108, 499); + this.buttonUp.Location = new System.Drawing.Point(103, 575); this.buttonUp.Name = "buttonUp"; this.buttonUp.Size = new System.Drawing.Size(30, 29); this.buttonUp.TabIndex = 7; @@ -189,7 +193,7 @@ this.pictureBox.Dock = System.Windows.Forms.DockStyle.Fill; this.pictureBox.Location = new System.Drawing.Point(0, 28); this.pictureBox.Name = "pictureBox"; - this.pictureBox.Size = new System.Drawing.Size(574, 579); + this.pictureBox.Size = new System.Drawing.Size(574, 658); this.pictureBox.TabIndex = 1; this.pictureBox.TabStop = false; // @@ -267,14 +271,14 @@ // SaveToolStripMenuItem // this.SaveToolStripMenuItem.Name = "SaveToolStripMenuItem"; - this.SaveToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.SaveToolStripMenuItem.Size = new System.Drawing.Size(177, 26); this.SaveToolStripMenuItem.Text = "Сохранение"; this.SaveToolStripMenuItem.Click += new System.EventHandler(this.SaveToolStripMenuItem_Click); // // LoadToolStripMenuItem // this.LoadToolStripMenuItem.Name = "LoadToolStripMenuItem"; - this.LoadToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.LoadToolStripMenuItem.Size = new System.Drawing.Size(177, 26); this.LoadToolStripMenuItem.Text = "Загрузка"; this.LoadToolStripMenuItem.Click += new System.EventHandler(this.LoadToolStripMenuItem_Click); // @@ -286,11 +290,31 @@ // this.saveFileDialog.Filter = "txt file | *.txt"; // + // ButtonSortByType + // + this.ButtonSortByType.Location = new System.Drawing.Point(22, 297); + this.ButtonSortByType.Name = "ButtonSortByType"; + this.ButtonSortByType.Size = new System.Drawing.Size(192, 29); + this.ButtonSortByType.TabIndex = 17; + this.ButtonSortByType.Text = "Сортировать по типу"; + this.ButtonSortByType.UseVisualStyleBackColor = true; + this.ButtonSortByType.Click += new System.EventHandler(this.ButtonSortByType_Click); + // + // ButtonSortByColor + // + this.ButtonSortByColor.Location = new System.Drawing.Point(22, 346); + this.ButtonSortByColor.Name = "ButtonSortByColor"; + this.ButtonSortByColor.Size = new System.Drawing.Size(194, 29); + this.ButtonSortByColor.TabIndex = 18; + this.ButtonSortByColor.Text = "Сортировать по цвету"; + this.ButtonSortByColor.UseVisualStyleBackColor = true; + this.ButtonSortByColor.Click += new System.EventHandler(this.ButtonSortByColor_Click); + // // FormMapWithSetAntiAircraftGuns // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(812, 607); + this.ClientSize = new System.Drawing.Size(812, 686); this.Controls.Add(this.groupBoxMaps); this.Controls.Add(this.pictureBox); this.Controls.Add(this.groupBox); @@ -335,5 +359,7 @@ private ToolStripMenuItem LoadToolStripMenuItem; private OpenFileDialog openFileDialog; private SaveFileDialog saveFileDialog; + private Button ButtonSortByColor; + private Button ButtonSortByType; } } \ No newline at end of file diff --git a/AntiAircraftGun/AntiAircraftGun/FormMapWithSetAntiAircraftGuns.cs b/AntiAircraftGun/AntiAircraftGun/FormMapWithSetAntiAircraftGuns.cs index dfd7d50..9c3a855 100644 --- a/AntiAircraftGun/AntiAircraftGun/FormMapWithSetAntiAircraftGuns.cs +++ b/AntiAircraftGun/AntiAircraftGun/FormMapWithSetAntiAircraftGuns.cs @@ -145,8 +145,8 @@ namespace AntiAircraftGun DrawingObjectAntiAircraftGun antiAircraftGun = new DrawingObjectAntiAircraftGun(drawingAntiAircraftGuns); if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] + antiAircraftGun != -1) { - MessageBox.Show("Объект добавлен"); pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + MessageBox.Show("Объект добавлен"); _logger.LogInformation($"Добавлен объект {drawingAntiAircraftGuns} на карту "); } else @@ -308,5 +308,33 @@ namespace AntiAircraftGun } } } + /// + /// Сортировка по типу + /// + /// + /// + private void ButtonSortByType_Click(object sender, EventArgs e) + { + if (listBoxMaps.SelectedIndex == -1) + { + return; + } + _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].Sort(new AntiAircraftGunCompareByType()); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + } + /// + /// Сортировка по цвету + /// + /// + /// + private void ButtonSortByColor_Click(object sender, EventArgs e) + { + if (listBoxMaps.SelectedIndex == -1) + { + return; + } + _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].Sort(new AntiAircraftGunCompareByColor()); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + } } } diff --git a/AntiAircraftGun/AntiAircraftGun/IDrawingObject.cs b/AntiAircraftGun/AntiAircraftGun/IDrawingObject.cs index 6128b09..deeada7 100644 --- a/AntiAircraftGun/AntiAircraftGun/IDrawingObject.cs +++ b/AntiAircraftGun/AntiAircraftGun/IDrawingObject.cs @@ -9,7 +9,7 @@ namespace AntiAircraftGun /// /// Интерфейс для работы с объектом, прорисовываемом на форме /// - internal interface IDrawingObject + internal interface IDrawingObject : IEquatable { /// /// Шаг перемещения объекта diff --git a/AntiAircraftGun/AntiAircraftGun/MapWithSetAntiAircraftGunsGeneric.cs b/AntiAircraftGun/AntiAircraftGun/MapWithSetAntiAircraftGunsGeneric.cs index aaaa625..50211e5 100644 --- a/AntiAircraftGun/AntiAircraftGun/MapWithSetAntiAircraftGunsGeneric.cs +++ b/AntiAircraftGun/AntiAircraftGun/MapWithSetAntiAircraftGunsGeneric.cs @@ -12,7 +12,7 @@ namespace AntiAircraftGun /// /// internal class MapWithSetAntiAircraftGunsGeneric - where T : class, IDrawingObject + where T : class, IDrawingObject, IEquatable where U : AbstractMap { /// @@ -138,6 +138,14 @@ namespace AntiAircraftGun } } /// + /// Сортировка + /// + /// + public void Sort(IComparer comparer) + { + _setAntiAircraftGuns.SortSet(comparer); + } + /// /// "Взбалтываем" набор, чтобы все элементы оказались в начале /// private void Shaking() diff --git a/AntiAircraftGun/AntiAircraftGun/SetAntiAircraftGunsGeneric.cs b/AntiAircraftGun/AntiAircraftGun/SetAntiAircraftGunsGeneric.cs index b5b0f68..ca7294c 100644 --- a/AntiAircraftGun/AntiAircraftGun/SetAntiAircraftGunsGeneric.cs +++ b/AntiAircraftGun/AntiAircraftGun/SetAntiAircraftGunsGeneric.cs @@ -13,7 +13,7 @@ namespace AntiAircraftGun /// /// internal class SetAntiAircraftGunsGeneric - where T : class + where T : class, IEquatable { /// /// Список объектов, которые храним @@ -51,9 +51,13 @@ namespace AntiAircraftGun /// public int Insert(T antiAircraftGun, int position) { - if (position >= _maxCount) throw new StorageOverflowException(_maxCount); - _places.Insert(position, antiAircraftGun); - return position; + if (_places.All(p => p.Equals(antiAircraftGun) == false)) + { + if (position >= _maxCount) throw new StorageOverflowException(_maxCount); + _places.Insert(position, antiAircraftGun); + return position; + } + return - 1; } /// /// Удаление объекта из набора с конкретной позиции @@ -104,5 +108,17 @@ namespace AntiAircraftGun } } } + /// + /// Сортировка набора объектов + /// + /// + public void SortSet(IComparer comparer) + { + if (comparer == null) + { + return; + } + _places.Sort(comparer); + } } }