diff --git a/Cruiser/Drawing/DrawingCruiser.cs b/Cruiser/Drawing/DrawingCruiser.cs index 4bf62b9..8e593c4 100644 --- a/Cruiser/Drawing/DrawingCruiser.cs +++ b/Cruiser/Drawing/DrawingCruiser.cs @@ -63,7 +63,7 @@ namespace Cruiser.Drawing /// Элементов цвет /// Ширина картинки /// Высота картинки - public DrawingCruiser(int speed, double weight, Color bodyColor, Color secColor, int width, int height) + public DrawingCruiser(int speed, double weight, Color bodyColor, int width, int height) { if (width < _cruiserWidth || height < _cruiserHeight) { @@ -72,7 +72,7 @@ namespace Cruiser.Drawing } _pictureWidth = width; _pictureHeight = height; - EntityCruiser = new EntityCruiser(speed, weight, bodyColor, secColor); + EntityCruiser = new EntityCruiser(speed, weight, bodyColor);//переделал конструктор, т.к. secColor не использовался в конечном результате для отрисовки } /// /// Конструктор @@ -80,18 +80,17 @@ namespace Cruiser.Drawing /// Скорость /// Вес автомобиля /// Основной цвет - /// Элементов цвет /// Ширина картинки /// Высота картинки /// Ширина прорисовки крейсера /// Высота прорисовки крейсера - public DrawingCruiser(int speed, double weight, Color bodyColor, Color secColor, int width, int height, int cruiserWidth, int cruiserHeight) + public DrawingCruiser(int speed, double weight, Color bodyColor, int width, int height, int cruiserWidth, int cruiserHeight) { _pictureWidth = width; _pictureHeight = height; _cruiserHeight = cruiserHeight; _cruiserWidth = cruiserWidth; - EntityCruiser = new EntityCruiser(speed, weight, bodyColor, secColor); + EntityCruiser = new EntityCruiser(speed, weight, bodyColor); //переделал конструктор, т.к. secColor не использовался в конечном результате для отрисовки } /// /// Установка позиции @@ -199,6 +198,7 @@ namespace Cruiser.Drawing Brush brush = new SolidBrush(EntityCruiser.BodyColor); g.FillPolygon(brush, Paluba); // элементы + Brush colForElem = new SolidBrush(Color.Black); //поменял цвет для элементов(ОСНОВНЫХ) на чёрный, т.к. secColor не использовался Point[] Elements = new Point[8] { new Point(_startPosX + 50,_startPosY + 20), @@ -210,13 +210,12 @@ namespace Cruiser.Drawing new Point(_startPosX + 70,_startPosY + 40), new Point(_startPosX + 50,_startPosY + 40), }; - Brush brushElem = new SolidBrush(EntityCruiser.SecondColor); - g.FillPolygon(brushElem, Elements); - g.FillEllipse(brushElem, _startPosX + 100, _startPosY + 20, 20, 20); + // шар на корабле + g.FillPolygon(colForElem, Elements); + g.FillEllipse(colForElem, _startPosX + 100, _startPosY + 20, 20, 20); // турбины - Brush Turbins = new SolidBrush(Color.Black); - g.FillRectangle(Turbins, _startPosX, _startPosY + 10, 10, 20); - g.FillRectangle(Turbins, _startPosX, _startPosY + 35, 10, 20); + g.FillRectangle(colForElem, _startPosX, _startPosY + 10, 10, 20); + g.FillRectangle(colForElem, _startPosX, _startPosY + 35, 10, 20); } } } diff --git a/Cruiser/Drawing/DrawingProCruiser.cs b/Cruiser/Drawing/DrawingProCruiser.cs index 6161167..aac6545 100644 --- a/Cruiser/Drawing/DrawingProCruiser.cs +++ b/Cruiser/Drawing/DrawingProCruiser.cs @@ -16,12 +16,13 @@ namespace Cruiser.Drawing { (EntityCruiser as EntityProCruiser).ElementsColor = color; } - public DrawingProCruiser(int speed, double weight, Color bodyColor, Color secColor, Color elemColor, bool rocketMines, bool helipad, int width, int height) : - base (speed, weight, bodyColor, secColor, width, height, 150, 60) + public DrawingProCruiser(int speed, double weight, Color bodyColor, Color elemColor, bool rocketMines, bool helipad, int width, int height) : + base (speed, weight, bodyColor, width, height, 150, 60) { if (EntityCruiser != null) { - EntityCruiser = new EntityProCruiser(speed, weight, bodyColor, secColor, elemColor, rocketMines, helipad); + EntityCruiser = new EntityProCruiser(speed, weight, bodyColor, elemColor, rocketMines, helipad); + // по тем же причинам, что и для обычного, фиксим конструктор класса отрисовки для улучшенного } } public override void DrawTransport(Graphics g) diff --git a/Cruiser/Drawing/ExtentionDrawingCruiser.cs b/Cruiser/Drawing/ExtentionDrawingCruiser.cs new file mode 100644 index 0000000..1115c05 --- /dev/null +++ b/Cruiser/Drawing/ExtentionDrawingCruiser.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Cruiser.Drawing; +using Cruiser.Entities; +namespace Cruiser.Drawing +{ + /// + /// Расширение для класса EntityCruiser + /// + public static class ExtentionDrawningCruiser + { + /// + /// Создание объекта из строки + /// + /// Строка с данными для создания объекта + /// Разделитель даннных + /// Ширина + /// Высота + /// Объект + public static DrawingCruiser? CreateDrawingCruiser(this string info, char separatorForObject, int width, int height) + { + string[] strs = info.Split(separatorForObject); + if (strs.Length == 3) + { + return new DrawingCruiser(Convert.ToInt32(strs[0]), Convert.ToInt32(strs[1]), Color.FromName(strs[2]), width, height); + } + if (strs.Length == 6) + { + return new DrawingProCruiser(Convert.ToInt32(strs[0]), + Convert.ToInt32(strs[1]), + Color.FromName(strs[2]), + Color.FromName(strs[3]), + Convert.ToBoolean(strs[4]), + Convert.ToBoolean(strs[5]), width, height); + } + return null; + } + /// + /// Получение данных для сохранения в файл + /// + /// Сохраняемый объект + /// Разделитель даннных + /// Строка с данными по объекту + public static string GetDataForSave(this DrawingCruiser drawingCruiser, char separatorForObject) + { + var cruiser = drawingCruiser.EntityCruiser; + if (cruiser == null) + { + return string.Empty; + } + var str = $"{cruiser.Speed}{separatorForObject}{cruiser.Weight}{separatorForObject}{cruiser.BodyColor.Name}"; + if (cruiser is not EntityProCruiser proCruiser) + { + return str; + } + return $"{str}{separatorForObject}{proCruiser.ElementsColor.Name}{separatorForObject}{proCruiser.RocketMines}{separatorForObject}{proCruiser.Helipad}"; + } + } +} + + diff --git a/Cruiser/Entities/EntityCruiser.cs b/Cruiser/Entities/EntityCruiser.cs index 6aa3721..d901196 100644 --- a/Cruiser/Entities/EntityCruiser.cs +++ b/Cruiser/Entities/EntityCruiser.cs @@ -24,23 +24,19 @@ namespace Cruiser.Entities /// public Color BodyColor { get; set; } /// - /// Второстепенный цвет - /// - public Color SecondColor { get; set; } - /// /// Шаг перемещения Крейсера /// + // убрал secColor т.к. у обычного крейсера должен быть один цвет + не использовался для отрисовки public double Step => (double)Speed * 100 / Weight; /// Скорость /// Вес Крейсера /// Основной цвет /// Второстепенный цвет - public EntityCruiser(int speed, double weight, Color bodyColor, Color secColor) + public EntityCruiser(int speed, double weight, Color bodyColor) { Speed = speed; Weight = weight; - BodyColor = bodyColor; - SecondColor = secColor; + BodyColor = bodyColor; // переделал конструктор и убрал secondColor, т.к. у обычного крейсера должен быть один цвет + не использовался для отрисовки } } } diff --git a/Cruiser/Entities/EntityProCruiser.cs b/Cruiser/Entities/EntityProCruiser.cs index 6d45247..a7d23e4 100644 --- a/Cruiser/Entities/EntityProCruiser.cs +++ b/Cruiser/Entities/EntityProCruiser.cs @@ -26,16 +26,15 @@ namespace Cruiser.Entities /// Скорость /// Вес Крейсера /// Основной цвет - /// Второстепенный цвет /// Элементов цвет /// Признак наличия ракетных шахт /// Признак наличия вертолётной площадки - public EntityProCruiser(int speed, double weight, Color bodyColor, Color secColor, Color elemColor, bool rocketMines, bool helipad) : - base(speed, weight, bodyColor, secColor) + public EntityProCruiser(int speed, double weight, Color bodyColor, Color elemColor, bool rocketMines, bool helipad) : + base(speed, weight, bodyColor) { RocketMines = rocketMines; Helipad = helipad; - ElementsColor = elemColor; + ElementsColor = elemColor; // по тем же причинам, что и для обычного, фиксим конструктор класса для улучшенного } } } diff --git a/Cruiser/FormCruiser.cs b/Cruiser/FormCruiser.cs index 7cee9c9..79bbaef 100644 --- a/Cruiser/FormCruiser.cs +++ b/Cruiser/FormCruiser.cs @@ -132,8 +132,7 @@ namespace Cruiser _drawningCruiser = new DrawingCruiser(random.Next(100, 300), random.Next(1000, 3000), - colorFirst, - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + colorFirst, // pictureBoxCruiser.Width, pictureBoxCruiser.Height); _drawningCruiser.SetPosition(random.Next(10, 100), random.Next(10, 100)); @@ -157,8 +156,7 @@ namespace Cruiser _drawningCruiser = new DrawingProCruiser(random.Next(100, 300), random.Next(1000, 3000), colorFirst, - colorSecond, - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + colorSecond, // Convert.ToBoolean(random.Next(1, 2)), Convert.ToBoolean(random.Next(1, 2)), pictureBoxCruiser.Width, diff --git a/Cruiser/FormCruiserCollection.Designer.cs b/Cruiser/FormCruiserCollection.Designer.cs index 8b2e0e0..79ce8b8 100644 --- a/Cruiser/FormCruiserCollection.Designer.cs +++ b/Cruiser/FormCruiserCollection.Designer.cs @@ -39,9 +39,16 @@ buttonDelObject = new Button(); textBoxStorageName = new TextBox(); buttonAddObject = new Button(); + menuStripCruiser = new MenuStrip(); + FileToolStripMenuItem = new ToolStripMenuItem(); + SaveToolStripMenuItem = new ToolStripMenuItem(); + UploadToolStripMenuItem = new ToolStripMenuItem(); + openFileDialog = new OpenFileDialog(); + saveFileDialog = new SaveFileDialog(); groupBoxTools.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit(); groupBoxStorage.SuspendLayout(); + menuStripCruiser.SuspendLayout(); SuspendLayout(); // // groupBoxTools @@ -75,7 +82,7 @@ // // buttonAddCruiser // - buttonAddCruiser.Location = new Point(15, 22); + buttonAddCruiser.Location = new Point(15, 26); buttonAddCruiser.Name = "buttonAddCruiser"; buttonAddCruiser.Size = new Size(122, 38); buttonAddCruiser.TabIndex = 0; @@ -95,9 +102,9 @@ // // pictureBoxCollection // - pictureBoxCollection.Location = new Point(14, 1); + pictureBoxCollection.Location = new Point(14, 27); pictureBoxCollection.Name = "pictureBoxCollection"; - pictureBoxCollection.Size = new Size(642, 448); + pictureBoxCollection.Size = new Size(642, 422); pictureBoxCollection.TabIndex = 1; pictureBoxCollection.TabStop = false; // @@ -151,15 +158,57 @@ buttonAddObject.UseVisualStyleBackColor = true; buttonAddObject.Click += ButtonAddObject_Click; // + // menuStripCruiser + // + menuStripCruiser.Items.AddRange(new ToolStripItem[] { FileToolStripMenuItem }); + menuStripCruiser.Location = new Point(0, 0); + menuStripCruiser.Name = "menuStripCruiser"; + menuStripCruiser.Size = new Size(800, 24); + menuStripCruiser.TabIndex = 4; + menuStripCruiser.Text = "menuStrip1"; + // + // FileToolStripMenuItem + // + FileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { SaveToolStripMenuItem, UploadToolStripMenuItem }); + FileToolStripMenuItem.Name = "FileToolStripMenuItem"; + FileToolStripMenuItem.Size = new Size(48, 20); + FileToolStripMenuItem.Text = "Файл"; + // + // SaveToolStripMenuItem + // + SaveToolStripMenuItem.Name = "SaveToolStripMenuItem"; + SaveToolStripMenuItem.Size = new Size(180, 22); + SaveToolStripMenuItem.Text = "Сохранить"; + SaveToolStripMenuItem.Click += SaveToolStripMenuItem_Click; + // + // UploadToolStripMenuItem + // + UploadToolStripMenuItem.Name = "UploadToolStripMenuItem"; + UploadToolStripMenuItem.Size = new Size(180, 22); + UploadToolStripMenuItem.Text = "Загрузить"; + UploadToolStripMenuItem.Click += LoadToolStripMenuItem_Click; + // + // openFileDialog + // + openFileDialog.FileName = "openFileDialog"; + openFileDialog.Filter = "txt file | *.txt"; + // + // saveFileDialog + // + saveFileDialog.FileName = "saveFileDialog"; + saveFileDialog.Filter = "txt file | *.txt"; + // // FormCruiserCollection // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(800, 450); + Controls.Add(menuStripCruiser); Controls.Add(buttonRefreshCollection); Controls.Add(groupBoxStorage); Controls.Add(pictureBoxCollection); Controls.Add(groupBoxTools); + MainMenuStrip = menuStripCruiser; Name = "FormCruiserCollection"; Text = "Набор Крейсеров"; groupBoxTools.ResumeLayout(false); @@ -167,7 +216,10 @@ ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit(); groupBoxStorage.ResumeLayout(false); groupBoxStorage.PerformLayout(); + menuStripCruiser.ResumeLayout(false); + menuStripCruiser.PerformLayout(); ResumeLayout(false); + PerformLayout(); } #endregion @@ -183,5 +235,11 @@ private TextBox textBoxStorageName; private Button buttonAddObject; private ListBox listBoxStorages; + private MenuStrip menuStripCruiser; + private ToolStripMenuItem FileToolStripMenuItem; + private ToolStripMenuItem SaveToolStripMenuItem; + private ToolStripMenuItem UploadToolStripMenuItem; + private OpenFileDialog openFileDialog; + private SaveFileDialog saveFileDialog; } } \ No newline at end of file diff --git a/Cruiser/FormCruiserCollection.cs b/Cruiser/FormCruiserCollection.cs index d10f237..eafc0b1 100644 --- a/Cruiser/FormCruiserCollection.cs +++ b/Cruiser/FormCruiserCollection.cs @@ -184,5 +184,44 @@ namespace Cruiser formCruiserConfig.Show(); formCruiserConfig.AddEvent(AddCruiser); } + /// + /// Обработка нажатия "Сохранение" + /// + /// + /// + 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); + ReloadObjects(); + } + else + { + MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } } } diff --git a/Cruiser/FormCruiserCollection.resx b/Cruiser/FormCruiserCollection.resx index af32865..c6bf9ab 100644 --- a/Cruiser/FormCruiserCollection.resx +++ b/Cruiser/FormCruiserCollection.resx @@ -117,4 +117,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 163, 17 + + + 296, 17 + \ No newline at end of file diff --git a/Cruiser/FormCruiserConfig.cs b/Cruiser/FormCruiserConfig.cs index 2ba9277..0ef8ea3 100644 --- a/Cruiser/FormCruiserConfig.cs +++ b/Cruiser/FormCruiserConfig.cs @@ -106,15 +106,15 @@ namespace Cruiser { switch (e.Data?.GetData(DataFormats.Text).ToString()) { - case "labelCruiser": + case "labelCruiser": //переделал из за изменения конструкторов (см. комментарии там) _cruiser = new DrawingCruiser((int)numericUpDownSpeed.Value, (int)numericUpDownWeight.Value, - Color.Orchid, Color.Black, + Color.Orchid, pictureBoxToCruiser.Width, pictureBoxToCruiser.Height); break; - case "labelProCruiser": + case "labelProCruiser": //переделал из за изменения конструкторов (см. комментарии там) _cruiser = new DrawingProCruiser((int)numericUpDownSpeed.Value, (int)numericUpDownWeight.Value, - Color.Orchid, Color.Black, Color.Aquamarine, + Color.Orchid, Color.Aquamarine, checkBoxRockMines.Checked, checkBoxHelipad.Checked, pictureBoxToCruiser.Width, pictureBoxToCruiser.Height); diff --git a/Cruiser/Generics/CruisersGenericCollection.cs b/Cruiser/Generics/CruisersGenericCollection.cs index 9302b31..a527800 100644 --- a/Cruiser/Generics/CruisersGenericCollection.cs +++ b/Cruiser/Generics/CruisersGenericCollection.cs @@ -17,6 +17,10 @@ namespace Cruiser.Generics where T : DrawingCruiser where U : IMoveableObject { + /// + /// Получение объектов коллекции + /// + public IEnumerable GetCruisers => _collection.GetCruisers(); /// /// Ширина окна прорисовки /// diff --git a/Cruiser/Generics/CruisersGenericStorage.cs b/Cruiser/Generics/CruisersGenericStorage.cs index a38eaf7..5541640 100644 --- a/Cruiser/Generics/CruisersGenericStorage.cs +++ b/Cruiser/Generics/CruisersGenericStorage.cs @@ -6,15 +6,27 @@ using System.Threading.Tasks; using Cruiser.Drawing; using Cruiser.MovementStrategy; - namespace Cruiser.Generics { internal class CruisersGenericStorage { + /// + /// Разделитель для записи ключа и значения элемента словаря + /// + private static readonly char _separatorForKeyValue = '|'; + /// + /// Разделитель для записей коллекции данных в файл + /// + private readonly char _separatorRecords = ';'; + /// + /// Разделитель для записи информации по объекту в файл + /// + private static readonly char _separatorForObject = ':'; + /// /// Словарь (хранилище) /// - readonly Dictionary> _cruiserStorages; + readonly Dictionary> _cruiserStorages; /// /// Возвращение списка названий наборов /// @@ -34,7 +46,7 @@ namespace Cruiser.Generics /// public CruisersGenericStorage(int pictureWidth, int pictureHeight) { - _cruiserStorages = new Dictionary>(); + _cruiserStorages = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } @@ -70,6 +82,92 @@ namespace Cruiser.Generics return null; } } + /// + /// Сохранение информации по автомобилям в хранилище в файл + /// + /// Путь и имя файла + /// true - сохранение прошло успешно, false - ошибка при сохранении данных + public bool SaveData(string filename) + { + if (File.Exists(filename)) + { + File.Delete(filename); + } + StringBuilder data = new(); + foreach (KeyValuePair> record in _cruiserStorages) + { + StringBuilder records = new(); + foreach (DrawingCruiser? elem in record.Value.GetCruisers) + { + records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); + } + data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}"); + } + if (data.Length == 0) + { + return false; + } + string dataStr = data.ToString(); + using (StreamWriter writer = new StreamWriter(filename)) + { + writer.WriteLine("CruiserStorage"); + writer.WriteLine(dataStr); + } + return true; + } + /// + /// Загрузка информации по крейсеру в хранилище из файла + /// + /// Путь и имя файла + /// true - загрузка прошла успешно, false - ошибка при загрузке данных + public bool LoadData(string filename) + { + if (!File.Exists(filename)) + { + return false; + } + using (StreamReader reader = new StreamReader(filename)) + { + string checker = reader.ReadLine(); + if (checker == null) + { + return false; + } + if (!checker.StartsWith("CruiserStorage")) + { + return false; + } + _cruiserStorages.Clear(); + string strs; + bool firstinit = true; + while ((strs = reader.ReadLine()) != null) + { + if (strs == null && firstinit) + return false; + if (strs == null) + break; + if (strs == string.Empty) + break; + firstinit = false; + string name = strs.Split('|')[0]; + CarsGenericCollection collection = new(_pictureWidth, _pictureHeight); + foreach (string data in strs.Split('|')[1].Split(';').Reverse()) + { + DrawingCruiser? cruiser = data?.CreateDrawingCruiser(_separatorForObject, _pictureWidth, _pictureHeight); + if (cruiser != null) + { + if (collection + cruiser == false) + { + return false; + } + } + + } + _cruiserStorages.Add(name, collection); + } + return true; + } + } } }