Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using MyLibrary;
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.IO;
- using System.Windows.Forms;
- using System.Linq;
- using System.Reflection;
- namespace PolygonDraft
- {
- //TODO: save custom colors
- //C:\Users\Максим\source\repos\MyLibrary\MyLibrary\bin\Debug\MyLibrary.dll
- public partial class MainControl : Form, IOriginator
- {
- private Polygon _polygon = new Polygon(hullColor: Color.Black,
- vertexColor: Color.FromArgb(64, 0, 128),
- vertexSize: 25);
- private DragDropCmd _dragDropCmd;
- private DeleteVertexCmd _deleteCmd;
- private List<Type> _pluggedInTypes;
- public MainControl()
- {
- InitializeComponent();
- //System.Runtime.ProfileOptimization.SetProfileRoot("");
- ChangeTypeCmd.Form = this;
- ChangeShapeCmd.Collection = ShapeToolStripMenuItem.DropDownItems;
- ChangeBackColorCmd.Form = this;
- //CreateToolStripItemCmd.Collection = shapeToolStripMenuItem.DropDownItems;
- TriangleToolStripMenuItem.Checked = true;
- }
- public Type ChosenType { get; set; } = typeof(Triangle);
- private void MainControl_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.Control && e.KeyCode == Keys.Z)
- {
- undoButton.PerformClick();
- }
- else if (e.Control && e.KeyCode == Keys.Y)
- {
- redoButton.PerformClick();
- }
- }
- private void UndoButton_Click(object sender, EventArgs e)
- {
- UndoRedoManager.Undo();
- Invalidate();
- }
- private void RedoButton_Click(object sender, EventArgs e)
- {
- UndoRedoManager.Redo();
- Invalidate();
- }
- private void Form1_MouseDown(object sender, MouseEventArgs e)
- {
- if (e.Button == MouseButtons.Left && DragDropCmd.CanDrag(_polygon, e.X, e.Y)) // Drag and drop
- {
- _dragDropCmd = new DragDropCmd(_polygon);
- _dragDropCmd.DragStart(e.X, e.Y);
- return;
- }
- else if (e.Button == MouseButtons.Right) // Удаление
- {
- if (DeleteVertexCmd.CanDelete(_polygon, e.Location))
- {
- _deleteCmd = new DeleteVertexCmd(_polygon, e.Location);
- if (_dragDropCmd == null)
- {
- _deleteCmd.Execute();
- UndoRedoManager.AddCmd(_deleteCmd);
- _deleteCmd = null;
- }
- Invalidate();
- }
- return;
- }
- Vertex vertex = (Vertex)Activator.CreateInstance(ChosenType, e.X, e.Y, _polygon.VertexColor,
- _polygon.HullColor, _polygon.VertexSize);
- AddVertexCmd addVertexCmd = new AddVertexCmd(vertex, _polygon);
- List<Vertex> verticesToDelete = _polygon.VerticesToDelete(vertex);
- if (verticesToDelete.Count != 0)
- {
- DeleteVertexCmd deleteCmd = new DeleteVertexCmd(_polygon, verticesToDelete);
- deleteCmd.Execute();
- addVertexCmd.Execute();
- UndoRedoManager.AddCmd(addVertexCmd, deleteCmd);
- }
- else
- {
- addVertexCmd.Execute();
- UndoRedoManager.AddCmd(addVertexCmd);
- }
- Invalidate();
- }
- private void Form1_MouseMove(object sender, MouseEventArgs e)
- {
- _dragDropCmd?.DragDo(e.X, e.Y);
- Invalidate();
- }
- private void Form1_MouseUp(object sender, MouseEventArgs e)
- {
- _dragDropCmd?.DragEnd();
- _deleteCmd?.Execute();
- List<Vertex> toDelete = _polygon.VerticesToDelete();
- if (toDelete.Count != 0) // If dragDrop has deleted vertices
- {
- _deleteCmd = new DeleteVertexCmd(_polygon, toDelete);
- UndoRedoManager.AddCmd(_dragDropCmd, _deleteCmd);
- _dragDropCmd = null;
- }
- if (_dragDropCmd != null && _deleteCmd != null) // If a vertex was deleted on drag n drop
- UndoRedoManager.AddCmd(_dragDropCmd, _deleteCmd);
- else if (_dragDropCmd != null) // Simple drag n drop
- UndoRedoManager.AddCmd(_dragDropCmd);
- _deleteCmd = null;
- _dragDropCmd = null;
- if (_polygon.Count >= 3)
- _polygon.MakeConvex();
- Invalidate();
- }
- private void Form1_Paint(object sender, PaintEventArgs e)
- {
- e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //Уменьшаем пикселизацию
- _polygon.Draw(e.Graphics);
- }
- private void ТреугольникToolStripMenuItem_Click(object sender, EventArgs e)
- {
- //_type = typeof(Triangle);
- //foreach (ToolStripMenuItem tool in формаToolStripMenuItem.DropDownItems)
- // tool.Checked = false;
- //triangleToolStripMenuItem.Checked = true;
- if (ChosenType == typeof(Triangle))
- return;
- ChangeTypeCmd typeCmd = new ChangeTypeCmd(ChosenType, typeof(Triangle));
- typeCmd.Execute();
- ChangeShapeCmd shapeCmd = new ChangeShapeCmd(IndexOfCheckedItem(),
- ShapeToolStripMenuItem.DropDownItems.IndexOf(TriangleToolStripMenuItem));
- shapeCmd.Execute();
- UndoRedoManager.AddCmd(typeCmd, shapeCmd);
- }
- //private void КругToolStripMenuItem_Click(object sender, EventArgs e)
- //{
- // //_type = typeof(Circle);
- // //foreach (ToolStripMenuItem tool in формаToolStripMenuItem.DropDownItems)
- // // tool.Checked = false;
- // //circleToolStripMenuItem.Checked = true;
- // if (ChosenType == typeof(Circle))
- // return;
- // ChangeTypeCmd typeCmd = new ChangeTypeCmd(ChosenType, typeof(Circle));
- // typeCmd.Execute();
- // ChangeShapeCmd shapeCmd = new ChangeShapeCmd(IndexOfCheckedItem(),
- // shapeToolStripMenuItem.DropDownItems.IndexOf(CircleToolStripMenuItem));
- // shapeCmd.Execute();
- // UndoRedoManager.AddCmd(typeCmd, shapeCmd);
- //}
- //private void КвадратToolStripMenuItem_Click(object sender, EventArgs e)
- //{
- // //_type = typeof(Square);
- // //foreach (ToolStripMenuItem tool in формаToolStripMenuItem.DropDownItems)
- // // tool.Checked = false;
- // //squareToolStripMenuItem.Checked = true;
- // if (ChosenType == typeof(Square))
- // return;
- // ChangeTypeCmd typeCmd = new ChangeTypeCmd(ChosenType, typeof(Square));
- // typeCmd.Execute();
- // int prevIndex = IndexOfCheckedItem();
- // int newIndex = shapeToolStripMenuItem.DropDownItems.IndexOf(SquareToolStripMenuItem);
- // ChangeShapeCmd shapeCmd = new ChangeShapeCmd(IndexOfCheckedItem(),
- // shapeToolStripMenuItem.DropDownItems.IndexOf(SquareToolStripMenuItem));
- // shapeCmd.Execute();
- // UndoRedoManager.AddCmd(typeCmd, shapeCmd);
- //}
- private void ГраницаToolStripMenuItem_Click(object sender, EventArgs e)
- {
- using (ColorDialog hullDialog = new ColorDialog() { Color = _polygon.HullColor })
- {
- if (hullDialog.ShowDialog() == DialogResult.OK)
- {
- ChangeHullColorCmd cmd = new ChangeHullColorCmd(_polygon,
- hullDialog.Color);
- cmd.Execute();
- UndoRedoManager.AddCmd(cmd);
- Invalidate();
- }
- }
- }
- private void ЗаливкаToolStripMenuItem_Click(object sender, EventArgs e)
- {
- using (ColorDialog vertexColorDialog = new ColorDialog() { Color = _polygon.VertexColor })
- {
- if (vertexColorDialog.ShowDialog() == DialogResult.OK)
- {
- ChangeVertexColorCmd cmd = new ChangeVertexColorCmd(
- _polygon,
- vertexColorDialog.Color);
- cmd.Execute();
- UndoRedoManager.AddCmd(cmd);
- Invalidate();
- }
- }
- }
- private void ФонToolStripMenuItem_Click(object sender, EventArgs e)
- {
- using (ColorDialog backColorDialog = new ColorDialog() { Color = BackColor })
- {
- if (backColorDialog.ShowDialog() == DialogResult.OK)
- {
- ChangeBackColorCmd cmd = new ChangeBackColorCmd(BackColor,
- backColorDialog.Color);
- cmd.Execute();
- UndoRedoManager.AddCmd(cmd);
- Invalidate();
- }
- }
- }
- private void РазмерToolStripMenuItem_Click(object sender, EventArgs e)
- {
- ChangeSizeCmd cmd = new ChangeSizeCmd(null, default, default);
- int prevSize = _polygon.VertexSize;
- TrackBar ResizeBar = new TrackBar
- {
- Minimum = 5,
- Maximum = 150,
- Value = _polygon.VertexSize,
- Orientation = Orientation.Horizontal,
- TickStyle = TickStyle.None,
- Location = new Point(0, 0),
- Width = 420,
- Height = 125,
- Name = "ResizeBar"
- };
- ResizeBar.Scroll += (_, __) =>
- {
- cmd = new ChangeSizeCmd(_polygon, prevSize, ResizeBar.Value);
- cmd.Execute();
- Invalidate();
- };
- ResizeBar.MouseUp += (_, __) =>
- {
- if (prevSize != ResizeBar.Value)
- UndoRedoManager.AddCmd(cmd);
- };
- Form SizeChanger = new Form
- {
- ClientSize = new Size(ResizeBar.Width, ResizeBar.Height),
- FormBorderStyle = FormBorderStyle.FixedSingle,
- MinimizeBox = false,
- MaximizeBox = false,
- Visible = true,
- Text = "RadiusChanger"
- };
- SizeChanger.Controls.Add(ResizeBar);
- SizeChanger.FormClosed += (_, __) => SizeChanger.Dispose();
- SizeChanger.ActiveControl = SizeChanger.Controls["ResizeBar"];
- }
- private void Start_Click(object sender, EventArgs e)
- {
- randTimer.Start();
- Invalidate();
- }
- private void Stop_Click(object sender, EventArgs e)
- {
- randTimer.Stop();
- Invalidate();
- }
- private void RandTimer_Tick(object sender, EventArgs e)
- {
- _polygon.Move();
- Invalidate();
- }
- private void Form1_FormClosing(object sender, FormClosingEventArgs e)
- {
- Application.Exit();
- }
- private int IndexOfCheckedItem()
- {
- int index = 0;
- for (int i = 0; i < ShapeToolStripMenuItem.DropDownItems.Count; i++)
- {
- if (((ToolStripMenuItem)ShapeToolStripMenuItem.DropDownItems[i]).Checked)
- {
- index = i;
- break;
- }
- }
- return index;
- }
- public void SetMemento(MCMemento memento)
- {
- dynamic state = memento.GetState();
- _polygon = state.Polygon;
- BackColor = state.BackColor;
- _pluggedInTypes = state.PluggedInTypes;
- ChosenType = state.Type;
- ShapeToolStripMenuItem.DropDownItems.Clear();
- foreach (Type type in _pluggedInTypes)
- CreateToolStripMenuItem(type);
- //foreach (ToolStripMenuItem tool in ShapeToolStripMenuItem.DropDownItems)
- // tool.Checked = false;
- ((ToolStripMenuItem)ShapeToolStripMenuItem.DropDownItems[state.Index]).Checked = true;
- ChangeTypeCmd.Form = this;
- ChangeShapeCmd.Collection = ShapeToolStripMenuItem.DropDownItems;
- ChangeBackColorCmd.Form = this;
- }
- public IMemento CreateMemento()
- {
- return new MCMemento(_polygon,
- BackColor,
- ChosenType,
- IndexOfCheckedItem(),
- _pluggedInTypes);
- }
- #region Save load
- private void SaveAsToolStripMenuItem_click(object sender, EventArgs e)
- {
- using (SaveFileDialog saveDialog = new SaveFileDialog() { DefaultExt = ".bin" })
- {
- string path;
- if (saveDialog.ShowDialog() == DialogResult.OK)
- path = saveDialog.FileName;
- else
- return;
- SaveOpenManager.Save(path, FileMode.Create, CreateMemento());
- }
- }
- private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
- {
- using (OpenFileDialog openDialog = new OpenFileDialog())
- {
- string path;
- if (openDialog.ShowDialog() == DialogResult.OK)
- path = openDialog.FileName;
- else
- return;
- UndoRedoManager.ClearLog();
- MCMemento McMemento =
- (MCMemento)SaveOpenManager.Load(path, FileMode.Open);
- SetMemento(McMemento);
- }
- Invalidate();
- }
- #endregion
- private void MainControl_DragEnter(object sender, DragEventArgs e)
- {
- if (e.Data.GetDataPresent(DataFormats.FileDrop))
- e.Effect = DragDropEffects.Copy;
- }
- private void MainControl_DragDrop(object sender, DragEventArgs e)
- {
- List<string> paths = new List<string>();
- foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
- {
- if (Directory.Exists(path))
- paths.AddRange(Directory.GetFiles(path, "*.dll", SearchOption.AllDirectories));
- else if (Path.GetExtension(path) == ".dll")
- paths.Add(path);
- }
- foreach (string path in paths)
- {
- _pluggedInTypes = (from type in Assembly.LoadFrom(path).GetExportedTypes()
- where type.BaseType.Equals(typeof(Vertex))
- select type).ToList();
- _pluggedInTypes.ForEach(type => CreateToolStripMenuItem(type));
- }
- }
- public ToolStripMenuItem CreateToolStripMenuItem(Type type)
- {
- ToolStripMenuItem newMenuItem = new ToolStripMenuItem(type.Name);
- newMenuItem.Name = type.Name;
- newMenuItem.Click += (_, __) =>
- {
- //foreach (ToolStripMenuItem item in shapeToolStripMenuItem.DropDownItems)
- // item.Checked = false;
- int index = ShapeToolStripMenuItem.DropDownItems.IndexOf(newMenuItem);
- //ToolStripMenuItem tmp = shapeToolStripMenuItem.DropDownItems[index]
- // as ToolStripMenuItem;
- //tmp.Checked = true;
- ChangeShapeCmd shapeCmd = new ChangeShapeCmd(IndexOfCheckedItem(), index);
- shapeCmd.Execute();
- ChangeTypeCmd typeCmd = new ChangeTypeCmd(ChosenType, type);
- typeCmd.Execute();
- UndoRedoManager.AddCmd(typeCmd, shapeCmd);
- };
- ShapeToolStripMenuItem.DropDownItems.Add(newMenuItem);
- return newMenuItem;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement