/// file: Pencil.cs /// Author: Maxime Rohmer /// Brief: Paint tool that is kind of the default tool /// Version: 0.1.0 /// Date: 25/05/2022 using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Paint_2 { public class Pencil : PaintTool { private List> _drawings; private List> _drawingsRedo; private List _colors; private List _colorsRedo; private List _widths; private List _widthsRedo; private Color _color; private string _name; private int _width; public List> Drawings { get => _drawings; set => _drawings = value; } public List> DrawingsRedo { get => _drawingsRedo; set => _drawingsRedo = value; } public List Colors { get => _colors; set => _colors = value; } public List ColorsRedo { get => _colorsRedo; set => _colorsRedo = value; } public List Widths { get => _widths; set => _widths = value; } public List WidthsRedo { get => _widthsRedo; set => _widthsRedo = value; } public Color Color { get => _color; set => _color = value; } public string Name { get => _name; set => _name = value; } public int Width { get => _width; set => _width = value; } public Pencil(string name) { Drawings = new List>(); DrawingsRedo = new List>(); Colors = new List(); ColorsRedo = new List(); Widths = new List(); WidthsRedo = new List(); Name = name; } public void Add(Point point) { Drawings[Drawings.Count -1].Add(point); } public void Paint(Bitmap canvas) { Graphics gr = Graphics.FromImage(canvas); int drawingCounter = 0; Size pointSize; foreach (List drawing in Drawings) { int pointCounter = 0; foreach (Point p in drawing) { if (pointCounter > 0) { pointSize = new Size(Widths[drawingCounter], Widths[drawingCounter]); gr.FillEllipse(new SolidBrush(Colors[drawingCounter]),new Rectangle(new Point(p.X - pointSize.Width/2,p.Y - pointSize.Height/2), pointSize)); gr.DrawLine(new Pen(Colors[drawingCounter],Widths[drawingCounter]),drawing[pointCounter -1],p); } pointCounter += 1; } drawingCounter += 1; } } public void Start(Color color, int width) { Color = color; Width = width; List points = new List(); Drawings.Add(points); Colors.Add(Color); Widths.Add(Width); } public void Clear() { Drawings = new List>(); } public void Stop(Point point) { throw new NotImplementedException(); } public List GetLastColors(int colorNumber) { List result = new List(); if (Colors.Count <= colorNumber) { //We need to fill with black color for (int i = Colors.Count; i > 0; i--) { result.Add(Colors[(Colors.Count) - i]); } for (int i = colorNumber - Colors.Count;i > 0; i--) { result.Add(Color.FromArgb(0x00,0x00,0x00)); } } else { for (int i = colorNumber; i > 0; i--) { result.Add(Colors[(Colors.Count) - i]); } } return result; } public override string ToString() { return Name; } public void Undo() { int last = Drawings.Count - 1; if (Drawings.Count > 1) { DrawingsRedo.Add(Drawings[last]); Drawings.RemoveAt(Drawings.Count -1); ColorsRedo.Add(Colors[last]); Colors.RemoveAt(Colors.Count -1); WidthsRedo.Add(Widths[last]); Widths.RemoveAt(Widths.Count -1); } else { DrawingsRedo.Add(Drawings[0]); Drawings.Clear(); ColorsRedo.Add(Colors[0]); Colors.Clear(); WidthsRedo.Add(Widths[0]); Widths.Clear(); } } public void Redo() { if (DrawingsRedo.Count > 0 && WidthsRedo.Count > 0 && ColorsRedo.Count > 0) { Drawings.Add(DrawingsRedo[DrawingsRedo.Count -1]); DrawingsRedo.RemoveAt(DrawingsRedo.Count - 1); Colors.Add(ColorsRedo[ColorsRedo.Count -1]); ColorsRedo.RemoveAt(ColorsRedo.Count - 1); Widths.Add(WidthsRedo[WidthsRedo.Count -1]); WidthsRedo.RemoveAt(WidthsRedo.Count - 1); } } } }