1
0
Files
cpo-lab/Lab2/src/Form/MainWindow.xaml.cs
2024-05-15 01:11:15 +03:00

201 lines
5.7 KiB
C#

using System;
using System.Windows;
using System.Collections.ObjectModel;
using Patterns;
using System.Collections.Generic;
using System.Linq;
namespace Lab2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
/// <summary>
/// Коллекция инструментов
/// </summary>
private ObservableCollection<Tool> _tools = new();
/// <summary>
/// Случайный генератор
/// </summary>
private Random _random = new();
/// <summary>
/// Список фабрик
/// </summary>
private List<IToolFactoryMethod> _factoryMethods = new()
{
new ScissorsAndTrimmerFactoryMethod(),
new ScytheAndLawnmowerFactoryMethod(),
new PrototypeFactoryMethod(),
};
/// <summary>
/// Текущая фабрика
/// </summary>
private IToolFactory _currentFactory;
/// <summary>
/// Выбранный фабричный метод
/// </summary>
private IToolFactoryMethod _selectedMethod;
/// <summary>
/// Список фабрик
/// </summary>
public ICollection<IToolFactoryMethod> FactoryMethods => _factoryMethods;
/// <summary>
/// Выбранный фабричный метод
/// </summary>
public IToolFactoryMethod SelectedMethod
{
get => _selectedMethod;
set
{
_selectedMethod = value;
_currentFactory = value.CreateFactory();
}
}
/// <summary>
/// Конструктор
/// </summary>
public MainWindow()
{
InitializeComponent();
SelectedMethod = _factoryMethods.First();
DataContext = this;
_dataGrid.ItemsSource = _tools;
}
/// <summary>
/// Проверяет, является ли индекс валидным
/// </summary>
/// <param name="parIndex"> Индекс </param>
/// <returns> True, если индекс валиден, иначе - false </returns>
private bool IsValidIndex(int parIndex)
{
return _tools.Count > 0 && parIndex >= 0 && parIndex < _tools.Count;
}
/// <summary>
/// Возвращает выбранный инструмент
/// </summary>
/// <returns> Выбранный инструмент </returns>
private Tool? GetSelectedItem()
{
if (!IsValidIndex(_dataGrid.SelectedIndex))
return null;
return _tools[_dataGrid.SelectedIndex];
}
/// <summary>
/// Генерирует случайный триммер
/// </summary>
/// <returns>Случайный триммер</returns>
private Trimmer GenerateTrimmer()
{
return new Trimmer($"Tr{_random.Next(0, 100)}", (Material)_random.Next(0, 3), _random.Next(1, 100), (uint)_random.Next(1, 100));
}
/// <summary>
/// Генерирует случайную газонокосилку
/// </summary>
/// <returns>Случайная газонокосилка</returns>
private Lawnmower GenerateLawnmower()
{
return new Lawnmower($"La{_random.Next(0, 100)}", (Material)_random.Next(0, 3), _random.Next(1, 100), (uint)_random.Next(1, 100), _random.Next(1, 100));
}
/// <summary>
/// Генерирует случайные ножницы
/// </summary>
/// <returns>Случайные ножницы</returns>
private Scissors GenerateScissors()
{
return new Scissors($"Si{_random.Next(0, 100)}", (Material)_random.Next(0, 3), _random.Next(1, 100), (uint)_random.Next(1, 100), _random.Next(1, 100));
}
/// <summary>
/// Генерирует случайную косу
/// </summary>
/// <returns>Случайная коса</returns>
private Scythe GenerateScythe()
{
return new Scythe($"Sc{_random.Next(0, 100)}", (Material)_random.Next(0, 3), _random.Next(1, 100), (uint)_random.Next(1, 100), (BladeType)_random.Next(0, 3));
}
/// <summary>
/// Обработчик события нажатия на кнопку "Add Manual Tool"
/// </summary>
private void CreateManualToolButton_Click(object sender, RoutedEventArgs e)
{
var tool = _currentFactory.CreateManualTool();
if (Util.ShowEditForm(tool))
_tools.Add(tool);
}
/// <summary>
/// Обработчик события нажатия на кнопку "Add Electric Tool"
/// </summary>
private void CreateElectricToolButton_Click(object sender, RoutedEventArgs e)
{
var tool = _currentFactory.CreateElectricTool();
if (Util.ShowEditForm(tool))
_tools.Add(tool);
}
/// <summary>
/// Обработчик события нажатия на кнопку "Edit"
/// </summary>
private void EditSelectedButton_Click(object sender, RoutedEventArgs e)
{
var item = GetSelectedItem();
if (item == null)
return;
Util.ShowEditForm(item);
_dataGrid.Items.Refresh();
}
/// <summary>
/// Обработчик события нажатия на кнопку "Delete"
/// </summary>
private void DeleteSelectedButton_Click(object sender, RoutedEventArgs e)
{
var selected = GetSelectedItem();
if (selected == null)
return;
if (!Util.ShowEditForm(selected, true))
return;
_tools.Remove(selected);
}
/// <summary>
/// Обработчик события нажатия на кнопку "Generate"
/// </summary>
private void GenerateButton_Click(object sender, RoutedEventArgs e)
{
Tool tool = _random.Next(0, 4) switch
{
0 => GenerateScissors(),
1 => GenerateScythe(),
2 => GenerateTrimmer(),
3 => GenerateLawnmower(),
_ => GenerateScissors(),
};
_tools.Add(tool);
}
}
}