diff --git a/Cruiser/FormCruiserCollection.Designer.cs b/Cruiser/FormCruiserCollection.Designer.cs index cc2ca2b..6e1d956 100644 --- a/Cruiser/FormCruiserCollection.Designer.cs +++ b/Cruiser/FormCruiserCollection.Designer.cs @@ -29,51 +29,46 @@ private void InitializeComponent() { groupBoxTools = new GroupBox(); - button3 = new Button(); - button2 = new Button(); + buttonDeleteCruiser = new Button(); textBoxNumber = new TextBox(); buttonAddCruiser = new Button(); + buttonRefreshCollection = new Button(); pictureBoxCollection = new PictureBox(); + groupBoxStorage = new GroupBox(); + listBoxStorages = new ListBox(); + buttonDelObject = new Button(); + textBoxStorageName = new TextBox(); + buttonAddObject = new Button(); groupBoxTools.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit(); + groupBoxStorage.SuspendLayout(); SuspendLayout(); // // groupBoxTools // - groupBoxTools.Controls.Add(button3); - groupBoxTools.Controls.Add(button2); + groupBoxTools.Controls.Add(buttonDeleteCruiser); groupBoxTools.Controls.Add(textBoxNumber); groupBoxTools.Controls.Add(buttonAddCruiser); - groupBoxTools.Location = new Point(645, 1); + groupBoxTools.Location = new Point(653, 1); groupBoxTools.Name = "groupBoxTools"; - groupBoxTools.Size = new Size(154, 448); + groupBoxTools.Size = new Size(148, 140); groupBoxTools.TabIndex = 0; groupBoxTools.TabStop = false; groupBoxTools.Text = "Инструменты"; // - // button3 + // buttonDeleteCruiser // - button3.Location = new Point(15, 171); - button3.Name = "button3"; - button3.Size = new Size(122, 41); - button3.TabIndex = 3; - button3.Text = "Обновить коллекцию"; - button3.UseVisualStyleBackColor = true; - button3.Click += ButtonRefreshCollection_Click; - // - // button2 - // - button2.Location = new Point(15, 107); - button2.Name = "button2"; - button2.Size = new Size(122, 37); - button2.TabIndex = 2; - button2.Text = "Удалить лайнер"; - button2.UseVisualStyleBackColor = true; - button2.Click += ButtonRemoveCar_Click; + buttonDeleteCruiser.Location = new Point(15, 95); + buttonDeleteCruiser.Name = "buttonDeleteCruiser"; + buttonDeleteCruiser.Size = new Size(122, 37); + buttonDeleteCruiser.TabIndex = 2; + buttonDeleteCruiser.Text = "Удалить лайнер"; + buttonDeleteCruiser.UseVisualStyleBackColor = true; + buttonDeleteCruiser.Click += ButtonRemoveCar_Click; // // textBoxNumber // - textBoxNumber.Location = new Point(15, 78); + textBoxNumber.Location = new Point(15, 66); textBoxNumber.Name = "textBoxNumber"; textBoxNumber.Size = new Size(122, 23); textBoxNumber.TabIndex = 1; @@ -88,19 +83,81 @@ buttonAddCruiser.UseVisualStyleBackColor = true; buttonAddCruiser.Click += buttonAddCruiser_Click; // + // buttonRefreshCollection + // + buttonRefreshCollection.Location = new Point(662, 397); + buttonRefreshCollection.Name = "buttonRefreshCollection"; + buttonRefreshCollection.Size = new Size(131, 41); + buttonRefreshCollection.TabIndex = 3; + buttonRefreshCollection.Text = "Обновить коллекцию"; + buttonRefreshCollection.UseVisualStyleBackColor = true; + buttonRefreshCollection.Click += ButtonRefreshCollection_Click; + // // pictureBoxCollection // - pictureBoxCollection.Location = new Point(-1, 1); + pictureBoxCollection.Location = new Point(14, 1); pictureBoxCollection.Name = "pictureBoxCollection"; pictureBoxCollection.Size = new Size(642, 448); pictureBoxCollection.TabIndex = 1; pictureBoxCollection.TabStop = false; // + // groupBoxStorage + // + groupBoxStorage.Controls.Add(listBoxStorages); + groupBoxStorage.Controls.Add(buttonDelObject); + groupBoxStorage.Controls.Add(textBoxStorageName); + groupBoxStorage.Controls.Add(buttonAddObject); + groupBoxStorage.Location = new Point(662, 139); + groupBoxStorage.Name = "groupBoxStorage"; + groupBoxStorage.Size = new Size(136, 252); + groupBoxStorage.TabIndex = 2; + groupBoxStorage.TabStop = false; + groupBoxStorage.Text = "Наборы"; + // + // listBoxStorages + // + listBoxStorages.FormattingEnabled = true; + listBoxStorages.ItemHeight = 15; + listBoxStorages.Location = new Point(10, 117); + listBoxStorages.Name = "listBoxStorages"; + listBoxStorages.Size = new Size(120, 124); + listBoxStorages.TabIndex = 7; + listBoxStorages.SelectedIndexChanged += ListBoxObjects_SelectedIndexChanged; + // + // buttonDelObject + // + buttonDelObject.Location = new Point(8, 86); + buttonDelObject.Name = "buttonDelObject"; + buttonDelObject.Size = new Size(122, 25); + buttonDelObject.TabIndex = 2; + buttonDelObject.Text = "Удалить набор"; + buttonDelObject.UseVisualStyleBackColor = true; + buttonDelObject.Click += ButtonDelObject_Click; + // + // textBoxStorageName + // + textBoxStorageName.Location = new Point(8, 22); + textBoxStorageName.Name = "textBoxStorageName"; + textBoxStorageName.Size = new Size(122, 23); + textBoxStorageName.TabIndex = 1; + // + // buttonAddObject + // + buttonAddObject.Location = new Point(8, 52); + buttonAddObject.Name = "buttonAddObject"; + buttonAddObject.Size = new Size(122, 28); + buttonAddObject.TabIndex = 0; + buttonAddObject.Text = "Добавить набор"; + buttonAddObject.UseVisualStyleBackColor = true; + buttonAddObject.Click += ButtonAddObject_Click; + // // FormCruiserCollection // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(800, 450); + Controls.Add(buttonRefreshCollection); + Controls.Add(groupBoxStorage); Controls.Add(pictureBoxCollection); Controls.Add(groupBoxTools); Name = "FormCruiserCollection"; @@ -109,6 +166,8 @@ groupBoxTools.ResumeLayout(false); groupBoxTools.PerformLayout(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit(); + groupBoxStorage.ResumeLayout(false); + groupBoxStorage.PerformLayout(); ResumeLayout(false); } @@ -117,8 +176,13 @@ private GroupBox groupBoxTools; private TextBox textBoxNumber; private Button buttonAddCruiser; - private Button button3; - private Button button2; + private Button buttonRefreshCollection; + private Button buttonDeleteCruiser; private PictureBox pictureBoxCollection; + private GroupBox groupBoxStorage; + private Button buttonDelObject; + private TextBox textBoxStorageName; + private Button buttonAddObject; + private ListBox listBoxStorages; } } \ No newline at end of file diff --git a/Cruiser/FormCruiserCollection.cs b/Cruiser/FormCruiserCollection.cs index 7b2df8a..cf4bf6a 100644 --- a/Cruiser/FormCruiserCollection.cs +++ b/Cruiser/FormCruiserCollection.cs @@ -22,15 +22,80 @@ namespace Cruiser /// /// Набор объектов /// - private readonly CarsGenericCollection _cruisers; + private readonly CruisersGenericStorage _storage; /// /// Конструктор /// public FormCruiserCollection() { InitializeComponent(); - _cruisers = new CarsGenericCollection(pictureBoxCollection.Width, pictureBoxCollection.Height); + _storage = new CruisersGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height); } + /// + /// Заполнение listBoxObjects + /// + private void ReloadObjects() + { + int index = listBoxStorages.SelectedIndex; + listBoxStorages.Items.Clear(); + for (int i = 0; i < _storage.Keys.Count; i++) + { + listBoxStorages.Items.Add(_storage.Keys[i]); + } + if (listBoxStorages.Items.Count > 0 && (index == -1 || index >= listBoxStorages.Items.Count)) + { + listBoxStorages.SelectedIndex = 0; + } + else if (listBoxStorages.Items.Count > 0 && index > -1 && index < listBoxStorages.Items.Count) + { + listBoxStorages.SelectedIndex = index; + } + } + /// + /// Добавление набора в коллекцию + /// + /// + /// + private void ButtonAddObject_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxStorageName.Text)) + { + MessageBox.Show("Придумайте имя набору", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _storage.AddSet(textBoxStorageName.Text); + ReloadObjects(); + } + /// + /// Удаление набора + /// + /// + /// + private void ButtonDelObject_Click(object sender, EventArgs e) + { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + if (MessageBox.Show($"Удалить объект{listBoxStorages.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + _storage.DelSet(listBoxStorages.SelectedItem.ToString() ?? string.Empty); + ReloadObjects(); + } + } + + /// + /// Выбор набора + /// + /// + /// + private void ListBoxObjects_SelectedIndexChanged(object sender, + EventArgs e) + { + pictureBoxCollection.Image = _storage[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowCruiser(); + } + + /// /// Добавление объекта в набор /// @@ -38,13 +103,22 @@ namespace Cruiser /// private void buttonAddCruiser_Click(object sender, EventArgs e) { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty]; + if (obj == null) + { + return; + } FormCruiser form = new(); if (form.ShowDialog() == DialogResult.OK) { - if (_cruisers + form.SelectedCruiser != -1) + if (obj + form.SelectedCruiser) { MessageBox.Show("Объект добавлен"); - pictureBoxCollection.Image = _cruisers.ShowCruiser(); + pictureBoxCollection.Image = obj.ShowCruiser(); } else { @@ -59,21 +133,25 @@ namespace Cruiser /// private void ButtonRemoveCar_Click(object sender, EventArgs e) { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty]; + if (obj == null) + { + return; + } if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { return; } - if (textBoxNumber.Text == "") - { - MessageBox.Show("Вы ничего не ввели"); - return; - } int pos = Convert.ToInt32(textBoxNumber.Text); - if (_cruisers - pos) + if (obj - pos != null) { MessageBox.Show("Объект удален"); - pictureBoxCollection.Image = _cruisers.ShowCruiser(); + pictureBoxCollection.Image = obj.ShowCruiser(); } else { @@ -87,7 +165,17 @@ namespace Cruiser /// private void ButtonRefreshCollection_Click(object sender, EventArgs e) { - pictureBoxCollection.Image = _cruisers.ShowCruiser(); + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? + string.Empty]; + if (obj == null) + { + return; + } + pictureBoxCollection.Image = obj.ShowCruiser(); } diff --git a/Cruiser/Generics/CruisersGenericCollection.cs b/Cruiser/Generics/CruisersGenericCollection.cs index fd10545..945a6d2 100644 --- a/Cruiser/Generics/CruisersGenericCollection.cs +++ b/Cruiser/Generics/CruisersGenericCollection.cs @@ -56,11 +56,11 @@ namespace Cruiser.Generics /// /// /// - public static int operator +(CarsGenericCollection collect, T? obj) + public static bool operator +(CarsGenericCollection collect, T? obj) { if (obj == null) { - return -1; + return false; } return collect._collection.Insert(obj); } @@ -70,15 +70,14 @@ namespace Cruiser.Generics /// /// /// - public static bool operator -(CarsGenericCollection collect, int pos) + public static T? operator -(CarsGenericCollection collect, int pos) { - T? obj = collect._collection.Get(pos); + T? obj = collect._collection[pos]; if (obj != null) { collect._collection.Remove(pos); - return true; } - return false; + return obj; } /// /// Получение объекта IMoveableObject @@ -87,7 +86,7 @@ namespace Cruiser.Generics /// public U? GetU(int pos) { - return (U?)_collection.Get(pos)?.GetMoveableObject; + return (U?)_collection[pos]?.GetMoveableObject; } /// /// Вывод всего набора объектов @@ -125,16 +124,18 @@ namespace Cruiser.Generics { int Ix = 0; int Iy = 0; - for (int i = 0; i < _collection.Count - 1; i++) + int i = 0; + foreach (var cruiser in _collection.GetCruisers()) { - _collection.Get(i)?.SetPosition(Ix, Iy); - _collection.Get(i)?.DrawTransport(g); + _collection[i]?.SetPosition(Ix, Iy); + _collection[i]?.DrawTransport(g); Ix += _placeSizeWidth; if (Ix + _placeSizeHeight > _pictureWidth) { Ix = 0; Iy = _placeSizeHeight; - } + } + i++; } } } diff --git a/Cruiser/Generics/CruisersGenericStorage.cs b/Cruiser/Generics/CruisersGenericStorage.cs new file mode 100644 index 0000000..a38eaf7 --- /dev/null +++ b/Cruiser/Generics/CruisersGenericStorage.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Cruiser.Drawing; +using Cruiser.MovementStrategy; + + +namespace Cruiser.Generics +{ + internal class CruisersGenericStorage + { + /// + /// Словарь (хранилище) + /// + readonly Dictionary> _cruiserStorages; + /// + /// Возвращение списка названий наборов + /// + public List Keys => _cruiserStorages.Keys.ToList(); + /// + /// Ширина окна отрисовки + /// + private readonly int _pictureWidth; + /// + /// Высота окна отрисовки + /// + private readonly int _pictureHeight; + /// + /// Конструктор + /// + /// + /// + public CruisersGenericStorage(int pictureWidth, int pictureHeight) + { + _cruiserStorages = new Dictionary>(); + _pictureWidth = pictureWidth; + _pictureHeight = pictureHeight; + } + /// + /// Добавление набора + /// + /// Название набора + public void AddSet(string name) + { + if (_cruiserStorages.ContainsKey(name)) return; + _cruiserStorages[name] = new CarsGenericCollection(_pictureWidth, _pictureHeight); + } + /// + /// Удаление набора + /// + /// Название набора + public void DelSet(string name) + { + if (!_cruiserStorages.ContainsKey(name)) return; + _cruiserStorages.Remove(name); + } + /// + /// Доступ к набору + /// + /// + /// + public CarsGenericCollection? + this[string ind] + { + get + { + if (_cruiserStorages.ContainsKey(ind)) return _cruiserStorages[ind]; + return null; + } + } + + } +} diff --git a/Cruiser/Generics/SetGeneric.cs b/Cruiser/Generics/SetGeneric.cs index 12b76e0..39d2da4 100644 --- a/Cruiser/Generics/SetGeneric.cs +++ b/Cruiser/Generics/SetGeneric.cs @@ -15,43 +15,38 @@ namespace Cruiser.Generics where T : class { /// - /// Массив объектов, которые храним + /// Список объектов, которые храним /// - private readonly T?[] _places; + private readonly List _places; /// - /// Количество объектов в массиве + /// Количество объектов в списке /// - public int Count => _places.Length; + public int Count => _places.Count; + /// + /// Максимальное количество объектов в списке + /// + private readonly int _maxCount; /// /// Конструктор /// /// public SetGeneric(int count) { - _places = new T?[count]; + _maxCount = count; + _places = new List(count); } /// /// Добавление объекта в набор /// /// Добавляемый лайнер /// - public int Insert(T cruiser) + public bool Insert(T cruiser) { - int zero = 0; - for (; _places[zero] != null;) + if (_places.Count + 1 <= _maxCount) { - zero++; - if (zero == _places.Length) - { - return -1; - } + _places.Insert(0, cruiser); } - for (int i = zero; i > 0; i--) - { - _places[i] = _places[i - 1]; - } - _places[0] = cruiser; - return 0; + return true; } /// /// Удаление объекта из набора с конкретной позиции @@ -60,7 +55,7 @@ namespace Cruiser.Generics /// public bool Remove(int position) { - if (position < 0 || position > _places.Length) + if (position < 0 || position > _places.Count) { return false; } @@ -73,36 +68,41 @@ namespace Cruiser.Generics /// Добавляемый автомобиль /// Позиция /// - public int Insert(T cruiser, int position) + public bool Insert(T cruiser, int position) { - if (position < 0 || position > _places.Length) + if (_places.Count + 1 <= _maxCount && _places.Count >= position) { - return 0; + _places.Insert(position, cruiser); + return true; } - if (_places.Length != null) + return false; + } + public T? this[int position] + { + get { - int zero = position; - while (_places[zero] != null) + if (position < 0 || position > _maxCount) + { return null; } + return _places[position]; + } + set + { + if (position < 0 || position > _maxCount) + return; + _places[position] = value; + } + } + public IEnumerable GetCruisers(int? maxCruisers = null) + { + for (int i = 0; i < _places.Count; ++i) + { + yield return _places[i]; + if (maxCruisers.HasValue && i == maxCruisers.Value) { - zero++; - return -1; + yield break; } } - _places[position] = cruiser; - return position; - } - /// - /// Получение объекта из набора по позиции - /// - /// - /// - public T? Get(int position) - { - if (position < 0 || position > _places.Length) - { - return null; - } - return _places[position]; } + } }