From 44c20bbcfe5e9227a1b3264c0dfecb17dbf4cb75 Mon Sep 17 00:00:00 2001 From: olshab Date: Sun, 19 Nov 2023 18:34:46 +0400 Subject: [PATCH 1/5] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20(=D0=BF=D0=BE=D1=87=D1=82=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Generics/EntitiesGenericCollection.cs | 2 + AirBomber/Generics/EntitiesGenericStorage.cs | 136 ++++++++++++++++++ .../Rendering/ExtensionBomberRenderer.cs | 56 ++++++++ 3 files changed, 194 insertions(+) create mode 100644 AirBomber/Rendering/ExtensionBomberRenderer.cs diff --git a/AirBomber/Generics/EntitiesGenericCollection.cs b/AirBomber/Generics/EntitiesGenericCollection.cs index f42b3a1..d8954ee 100644 --- a/AirBomber/Generics/EntitiesGenericCollection.cs +++ b/AirBomber/Generics/EntitiesGenericCollection.cs @@ -15,6 +15,8 @@ namespace AirBomber.Generics private readonly SetGeneric _collection; + public IEnumerable Entities => _collection.GetEntities(); + public EntitiesGenericCollection(int PictureWidth, int PictureHeight) { int width = PictureWidth / _placeSizeWidth; diff --git a/AirBomber/Generics/EntitiesGenericStorage.cs b/AirBomber/Generics/EntitiesGenericStorage.cs index af2fa34..9323efb 100644 --- a/AirBomber/Generics/EntitiesGenericStorage.cs +++ b/AirBomber/Generics/EntitiesGenericStorage.cs @@ -1,5 +1,6 @@ using AirBomber.MovementStrategy; using AirBomber.Rendering; +using System.Text; namespace AirBomber.Generics { @@ -12,6 +13,10 @@ namespace AirBomber.Generics private readonly int _pictureWidth; private readonly int _pictureHeight; + private readonly char _keyValueDelimiter = '|'; + private readonly char _recordsDelimiter = ';'; + private readonly char _entityDelimiter = ':'; + public EntitiesGenericStorage(int PictureWidth, int PictureHeight) { _entityStorages = new Dictionary>(); @@ -49,5 +54,136 @@ namespace AirBomber.Generics return _entityStorages[Index]; } } + + public bool SaveData(string FileName) + { + //if (File.Exists(FileName)) + // File.Delete(FileName); + + if (_entityStorages.Count == 0) + return false; + + using (StreamWriter writer = new StreamWriter(FileName, false)) + { + writer.WriteLine("BomberStorage"); + + foreach (KeyValuePair> Record in _entityStorages) + { + StringBuilder Records = new StringBuilder(); + + foreach (BomberRendererBase? Element in Record.Value.Entities) + Records.Append($"{Element?.SerializeRenderer(_entityDelimiter)}{_recordsDelimiter}"); + + writer.WriteLine($"{Record.Key}{_keyValueDelimiter}{Records}"); + } + } + + //StringBuilder Data = new(); + //foreach (KeyValuePair> Record in _entityStorages) + //{ + // StringBuilder Records = new StringBuilder(); + // + // foreach (RendererBase? Element in Record.Value.Entities) + // Records.Append($"{Element?.SerializeRenderer(_entityDelimiter)}{_recordsDelimiter}"); + // + // Data.AppendLine($"{Record.Key}{_keyValueDelimiter}{Records}"); + //} + + //if (Data.Length == 0) + // return false; + + //using FileStream fs = new(FileName, FileMode.Create); + //byte[] info = new + //UTF8Encoding(true).GetBytes($"BomberStorage{Environment.NewLine}{Data}"); + //fs.Write(info, 0, info.Length); + + return true; + } + + public bool LoadData(string FileName) + { + if (!File.Exists(FileName)) + return false; + + using (StreamReader reader = new StreamReader(FileName)) + { + if (reader.ReadLine() != "BomberStorage") + return false; + + _entityStorages.Clear(); + + string? Data; + while ((Data = reader.ReadLine()) != null) + { + string[] Record = Data.Split(_keyValueDelimiter, StringSplitOptions.RemoveEmptyEntries); + + if (Record.Length != 2) + continue; + + EntitiesGenericCollection Collection = new(_pictureWidth, _pictureHeight); + string[] Set = Record[1].Split(_recordsDelimiter, StringSplitOptions.RemoveEmptyEntries); + + foreach (string Element in Set) + { + BomberRendererBase? Renderer = Element?.DeserializeRenderer(_entityDelimiter, _pictureWidth, _pictureHeight); + + if (Renderer != null) + { + if ((Collection + Renderer) != -1) + return false; + } + } + + _entityStorages.Add(Record[0], Collection); + } + } + + //string Buffer = string.Empty; + //using (FileStream fs = new(FileName, FileMode.Open)) + //{ + // byte[] b = new byte[fs.Length]; + // UTF8Encoding temp = new(true); + // + // while (fs.Read(b, 0, b.Length) > 0) + // Buffer += temp.GetString(b); + //} + // + //var strs = Buffer.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); + // + //if (strs == null || strs.Length == 0) + // return false; + // + //if (!strs[0].StartsWith("BomberStorage")) + // //если нет такой записи, то это не те данные + // return false; + // + //_entityStorages.Clear(); + // + //foreach (string Data in strs) + //{ + // string[] Record = Data.Split(_keyValueDelimiter, StringSplitOptions.RemoveEmptyEntries); + // + // if (Record.Length != 2) + // continue; + // + // EntitiesGenericCollection Collection = new(_pictureWidth, _pictureHeight); + // string[] Set = Record[1].Split(_recordsDelimiter, StringSplitOptions.RemoveEmptyEntries); + // + // foreach (string Element in Set) + // { + // RendererBase? Renderer = Element?.DeserializeRenderer(_entityDelimiter, _pictureWidth, _pictureHeight); + // + // if (Renderer != null) + // { + // if ((Collection + Renderer) != -1) + // return false; + // } + // } + // + // _entityStorages.Add(Record[0], Collection); + //} + + return true; + } } } diff --git a/AirBomber/Rendering/ExtensionBomberRenderer.cs b/AirBomber/Rendering/ExtensionBomberRenderer.cs new file mode 100644 index 0000000..85600b7 --- /dev/null +++ b/AirBomber/Rendering/ExtensionBomberRenderer.cs @@ -0,0 +1,56 @@ +using AirBomber.Entities; + +namespace AirBomber.Rendering +{ + public static class ExtensionBomberRenderer + { + public static BomberRendererBase? DeserializeRenderer(this string Info, char Delimiter, int Width, int Height) + { + string[] Properties = Info.Split(Delimiter); + + if (Properties.Length == 3) + { + return new BomberRendererBase( + Convert.ToInt32(Properties[0]), + Convert.ToInt32(Properties[1]), + Color.FromName(Properties[2]), + Width, + Height + ); + } + + if (Properties.Length == 6) + { + return new BomberRenderer( + Convert.ToInt32(Properties[0]), + Convert.ToInt32(Properties[1]), + Color.FromName(Properties[2]), + Color.FromName(Properties[3]), + Convert.ToBoolean(Properties[4]), + Convert.ToBoolean(Properties[5]), + Width, + Height + ); + } + + return null; + } + + public static string SerializeRenderer(this BomberRendererBase Renderer, char Delimiter) + { + var Bomber = Renderer.EntityBomber; + + if (Bomber is null) + return string.Empty; + + string ResultString = string.Empty; + ResultString += $"{Bomber.Speed}{Delimiter}{Bomber.Weight}{Delimiter}{Bomber.BodyColor.Name}"; + + if (Bomber is BomberEntity AdvancedBomber) + ResultString += $"{Delimiter}{AdvancedBomber.AdditionalColor.Name}" + + $"{Delimiter}{AdvancedBomber.Bombs}{Delimiter}{AdvancedBomber.FuelTanks}"; + + return ResultString; + } + } +} -- 2.25.1 From ae6e3cac02840c82b6c98774c032142bab14737f Mon Sep 17 00:00:00 2001 From: olshab Date: Sat, 25 Nov 2023 23:09:40 +0400 Subject: [PATCH 2/5] Menu strip --- AirBomber/FormEntityCollection.Designer.cs | 66 ++++++++++++++++-- AirBomber/FormEntityCollection.cs | 24 +++++++ AirBomber/FormEntityCollection.resx | 9 +++ AirBomber/Generics/EntitiesGenericStorage.cs | 72 +------------------- 4 files changed, 95 insertions(+), 76 deletions(-) diff --git a/AirBomber/FormEntityCollection.Designer.cs b/AirBomber/FormEntityCollection.Designer.cs index d7ccbef..a6d574a 100644 --- a/AirBomber/FormEntityCollection.Designer.cs +++ b/AirBomber/FormEntityCollection.Designer.cs @@ -39,17 +39,24 @@ RemoveBomberButton = new Button(); NumberMaskedTextBox = new MaskedTextBox(); AddBomberButton = new Button(); + FormMenuStrip = new MenuStrip(); + FileMenuStripItem = new ToolStripMenuItem(); + SaveToolStripMenuItem = new ToolStripMenuItem(); + LoadToolStripMenuItem = new ToolStripMenuItem(); + OpenFileDialog = new OpenFileDialog(); + SaveFileDialog = new SaveFileDialog(); ((System.ComponentModel.ISupportInitialize)CollectionPictureBox).BeginInit(); ToolGroupBox.SuspendLayout(); SetsGroupBox.SuspendLayout(); + FormMenuStrip.SuspendLayout(); SuspendLayout(); // // CollectionPictureBox // CollectionPictureBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; - CollectionPictureBox.Location = new Point(0, 0); + CollectionPictureBox.Location = new Point(0, 27); CollectionPictureBox.Name = "CollectionPictureBox"; - CollectionPictureBox.Size = new Size(812, 603); + CollectionPictureBox.Size = new Size(812, 576); CollectionPictureBox.TabIndex = 0; CollectionPictureBox.TabStop = false; // @@ -61,9 +68,9 @@ ToolGroupBox.Controls.Add(RemoveBomberButton); ToolGroupBox.Controls.Add(NumberMaskedTextBox); ToolGroupBox.Controls.Add(AddBomberButton); - ToolGroupBox.Location = new Point(818, 12); + ToolGroupBox.Location = new Point(818, 27); ToolGroupBox.Name = "ToolGroupBox"; - ToolGroupBox.Size = new Size(176, 579); + ToolGroupBox.Size = new Size(176, 564); ToolGroupBox.TabIndex = 1; ToolGroupBox.TabStop = false; ToolGroupBox.Text = "Инструменты"; @@ -121,7 +128,7 @@ // // RefreshCollectionButton // - RefreshCollectionButton.Location = new Point(6, 543); + RefreshCollectionButton.Location = new Point(6, 528); RefreshCollectionButton.Name = "RefreshCollectionButton"; RefreshCollectionButton.Size = new Size(164, 30); RefreshCollectionButton.TabIndex = 3; @@ -158,6 +165,45 @@ AddBomberButton.UseVisualStyleBackColor = true; AddBomberButton.Click += ButtonAddEntity_Click; // + // FormMenuStrip + // + FormMenuStrip.Items.AddRange(new ToolStripItem[] { FileMenuStripItem }); + FormMenuStrip.Location = new Point(0, 0); + FormMenuStrip.Name = "FormMenuStrip"; + FormMenuStrip.Size = new Size(1006, 24); + FormMenuStrip.TabIndex = 2; + FormMenuStrip.Text = "menuStrip1"; + // + // FileMenuStripItem + // + FileMenuStripItem.DropDownItems.AddRange(new ToolStripItem[] { SaveToolStripMenuItem, LoadToolStripMenuItem }); + FileMenuStripItem.Name = "FileMenuStripItem"; + FileMenuStripItem.Size = new Size(48, 20); + FileMenuStripItem.Text = "Файл"; + // + // SaveToolStripMenuItem + // + SaveToolStripMenuItem.Name = "SaveToolStripMenuItem"; + SaveToolStripMenuItem.Size = new Size(141, 22); + SaveToolStripMenuItem.Text = "Сохранение"; + SaveToolStripMenuItem.Click += SaveToolStripMenuItem_Click; + // + // LoadToolStripMenuItem + // + LoadToolStripMenuItem.Name = "LoadToolStripMenuItem"; + LoadToolStripMenuItem.Size = new Size(141, 22); + LoadToolStripMenuItem.Text = "Загрузка"; + LoadToolStripMenuItem.Click += LoadToolStripMenuItem_Click; + // + // OpenFileDialog + // + OpenFileDialog.FileName = "openFileDialog1"; + OpenFileDialog.Filter = "txt file | *.txt"; + // + // SaveFileDialog + // + SaveFileDialog.Filter = "txt file | *.txt"; + // // FormEntityCollection // AutoScaleDimensions = new SizeF(7F, 15F); @@ -165,6 +211,7 @@ ClientSize = new Size(1006, 603); Controls.Add(ToolGroupBox); Controls.Add(CollectionPictureBox); + Controls.Add(FormMenuStrip); Name = "FormEntityCollection"; Text = "Набор бомбардировщиков"; ((System.ComponentModel.ISupportInitialize)CollectionPictureBox).EndInit(); @@ -172,7 +219,10 @@ ToolGroupBox.PerformLayout(); SetsGroupBox.ResumeLayout(false); SetsGroupBox.PerformLayout(); + FormMenuStrip.ResumeLayout(false); + FormMenuStrip.PerformLayout(); ResumeLayout(false); + PerformLayout(); } #endregion @@ -188,5 +238,11 @@ private ListBox StorageListBox; private Button AddSetButton; private Button RemoveSetButton; + private MenuStrip FormMenuStrip; + private ToolStripMenuItem FileMenuStripItem; + private ToolStripMenuItem SaveToolStripMenuItem; + private ToolStripMenuItem LoadToolStripMenuItem; + private OpenFileDialog OpenFileDialog; + private SaveFileDialog SaveFileDialog; } } \ No newline at end of file diff --git a/AirBomber/FormEntityCollection.cs b/AirBomber/FormEntityCollection.cs index 3b0a265..523094c 100644 --- a/AirBomber/FormEntityCollection.cs +++ b/AirBomber/FormEntityCollection.cs @@ -127,5 +127,29 @@ namespace AirBomber { CollectionPictureBox.Image = _storage[StorageListBox.SelectedItem?.ToString() ?? string.Empty]?.ShowEntities(); } + + private void SaveToolStripMenuItem_Click(object sender, EventArgs e) + { + if (SaveFileDialog.ShowDialog() == DialogResult.OK) + { + if (_storage.SaveData(SaveFileDialog.FileName)) + MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + else + MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadToolStripMenuItem_Click(object sender, EventArgs e) + { + if (OpenFileDialog.ShowDialog() == DialogResult.OK) + { + if (_storage.LoadData(OpenFileDialog.FileName)) + MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + else + MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + ReloadObjects(); + } } } diff --git a/AirBomber/FormEntityCollection.resx b/AirBomber/FormEntityCollection.resx index af32865..ce8fa23 100644 --- a/AirBomber/FormEntityCollection.resx +++ b/AirBomber/FormEntityCollection.resx @@ -117,4 +117,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 153, 17 + + + 288, 17 + \ No newline at end of file diff --git a/AirBomber/Generics/EntitiesGenericStorage.cs b/AirBomber/Generics/EntitiesGenericStorage.cs index 9323efb..2ff7772 100644 --- a/AirBomber/Generics/EntitiesGenericStorage.cs +++ b/AirBomber/Generics/EntitiesGenericStorage.cs @@ -57,9 +57,6 @@ namespace AirBomber.Generics public bool SaveData(string FileName) { - //if (File.Exists(FileName)) - // File.Delete(FileName); - if (_entityStorages.Count == 0) return false; @@ -78,33 +75,11 @@ namespace AirBomber.Generics } } - //StringBuilder Data = new(); - //foreach (KeyValuePair> Record in _entityStorages) - //{ - // StringBuilder Records = new StringBuilder(); - // - // foreach (RendererBase? Element in Record.Value.Entities) - // Records.Append($"{Element?.SerializeRenderer(_entityDelimiter)}{_recordsDelimiter}"); - // - // Data.AppendLine($"{Record.Key}{_keyValueDelimiter}{Records}"); - //} - - //if (Data.Length == 0) - // return false; - - //using FileStream fs = new(FileName, FileMode.Create); - //byte[] info = new - //UTF8Encoding(true).GetBytes($"BomberStorage{Environment.NewLine}{Data}"); - //fs.Write(info, 0, info.Length); - return true; } public bool LoadData(string FileName) { - if (!File.Exists(FileName)) - return false; - using (StreamReader reader = new StreamReader(FileName)) { if (reader.ReadLine() != "BomberStorage") @@ -129,7 +104,7 @@ namespace AirBomber.Generics if (Renderer != null) { - if ((Collection + Renderer) != -1) + if ((Collection + Renderer) == -1) return false; } } @@ -138,51 +113,6 @@ namespace AirBomber.Generics } } - //string Buffer = string.Empty; - //using (FileStream fs = new(FileName, FileMode.Open)) - //{ - // byte[] b = new byte[fs.Length]; - // UTF8Encoding temp = new(true); - // - // while (fs.Read(b, 0, b.Length) > 0) - // Buffer += temp.GetString(b); - //} - // - //var strs = Buffer.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); - // - //if (strs == null || strs.Length == 0) - // return false; - // - //if (!strs[0].StartsWith("BomberStorage")) - // //если нет такой записи, то это не те данные - // return false; - // - //_entityStorages.Clear(); - // - //foreach (string Data in strs) - //{ - // string[] Record = Data.Split(_keyValueDelimiter, StringSplitOptions.RemoveEmptyEntries); - // - // if (Record.Length != 2) - // continue; - // - // EntitiesGenericCollection Collection = new(_pictureWidth, _pictureHeight); - // string[] Set = Record[1].Split(_recordsDelimiter, StringSplitOptions.RemoveEmptyEntries); - // - // foreach (string Element in Set) - // { - // RendererBase? Renderer = Element?.DeserializeRenderer(_entityDelimiter, _pictureWidth, _pictureHeight); - // - // if (Renderer != null) - // { - // if ((Collection + Renderer) != -1) - // return false; - // } - // } - // - // _entityStorages.Add(Record[0], Collection); - //} - return true; } } -- 2.25.1 From 2306f8b82cc1c4d09ab723911446c766c36e528d Mon Sep 17 00:00:00 2001 From: olshab Date: Sat, 25 Nov 2023 23:27:05 +0400 Subject: [PATCH 3/5] Check file existance --- AirBomber/Generics/EntitiesGenericStorage.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AirBomber/Generics/EntitiesGenericStorage.cs b/AirBomber/Generics/EntitiesGenericStorage.cs index 2ff7772..61ab8e3 100644 --- a/AirBomber/Generics/EntitiesGenericStorage.cs +++ b/AirBomber/Generics/EntitiesGenericStorage.cs @@ -80,6 +80,9 @@ namespace AirBomber.Generics public bool LoadData(string FileName) { + if (!File.Exists(FileName)) + return false; + using (StreamReader reader = new StreamReader(FileName)) { if (reader.ReadLine() != "BomberStorage") -- 2.25.1 From e1b3695a42a3a19edfaceb43762e85946d1c9c34 Mon Sep 17 00:00:00 2001 From: olshab Date: Sat, 25 Nov 2023 23:39:59 +0400 Subject: [PATCH 4/5] Add storages count check --- AirBomber/Generics/EntitiesGenericStorage.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AirBomber/Generics/EntitiesGenericStorage.cs b/AirBomber/Generics/EntitiesGenericStorage.cs index 61ab8e3..305bdb2 100644 --- a/AirBomber/Generics/EntitiesGenericStorage.cs +++ b/AirBomber/Generics/EntitiesGenericStorage.cs @@ -73,6 +73,9 @@ namespace AirBomber.Generics writer.WriteLine($"{Record.Key}{_keyValueDelimiter}{Records}"); } + + if (_entityStorages.Count == 0) + return false; } return true; -- 2.25.1 From 1a799909f9a09e79839f7a78a7dedf4f873c8bb1 Mon Sep 17 00:00:00 2001 From: olshab Date: Sat, 25 Nov 2023 23:43:42 +0400 Subject: [PATCH 5/5] fix --- AirBomber/Generics/EntitiesGenericStorage.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/AirBomber/Generics/EntitiesGenericStorage.cs b/AirBomber/Generics/EntitiesGenericStorage.cs index 305bdb2..61ab8e3 100644 --- a/AirBomber/Generics/EntitiesGenericStorage.cs +++ b/AirBomber/Generics/EntitiesGenericStorage.cs @@ -73,9 +73,6 @@ namespace AirBomber.Generics writer.WriteLine($"{Record.Key}{_keyValueDelimiter}{Records}"); } - - if (_entityStorages.Count == 0) - return false; } return true; -- 2.25.1