/// file: Form1.cs /// Author: Maxime Rohmer /// Brief: Class that is controlling the view /// Version: 0.1.0 /// Date: 25/05/2022 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Paint_2 { public partial class PaintForm : Form { const int WINDOW_OFFSET = 10; const string DEFAULT_FILEPATH = "C:/Paint2/Drawings/"; public Sketch sketch; List toolList; bool drawing = false; bool randomColor = false; Random rnd; Color hoveringColor; public PaintForm() { InitializeComponent(); rnd = new Random(); toolList = new List(); toolList.Add(new Pencil("Default Pencil")); toolList.Add(new DotPencil("Dotted Line")); toolList.Add(new BezierPencil("Bezier Generator")); sketch = new Sketch(new Size(canvas.Width, canvas.Height), toolList); tmrRefresh.Enabled = true; RefreshUi(); } private Point MousePositionToCanvasPosition() { //return new Point(MousePosition.X - canvas.Location.X, MousePosition.Y - canvas.Location.Y); return canvas.PointToClient(MousePosition); } private void canvas_MouseDown(object sender, MouseEventArgs e) { drawing = true; if (randomColor) { sketch.StartDrawing(MousePositionToCanvasPosition(), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), (int)nupPencilWidth.Value); } else { sketch.StartDrawing(MousePositionToCanvasPosition(), sketch.CurrentTool.Color, (int)nupPencilWidth.Value); } } private void canvas_MouseUp(object sender, MouseEventArgs e) { sketch.AddDrawingPoint(MousePositionToCanvasPosition()); drawing = false; canvas.Image = sketch.StopDrawing((Bitmap)canvas.Image); RefreshUi(); } private void tmrRefresh_Tick(object sender, EventArgs e) { if (drawing) { sketch.AddDrawingPoint(MousePositionToCanvasPosition()); } RefreshUi(); } private void BtnColor_Click(object sender, EventArgs e) { Button button = sender as Button; sketch.ChangePaintToolColor(button.BackColor); tmrRefresh_Tick(sender, e); } private string ColorToString(Color color) { // Expected Hex:FFFFFF R:255 G:255 B:255 string result = ""; int toBase = 16; result += ColorPicker.ColorToHex(color); result += " "; result += "R:" + color.R + " G:" + color.G + " B:" + color.B; return result; } private void ForceRefresh() { canvas.Image = sketch.ForcePaint(); RefreshUi(); } private void RefreshUi() { canvas.Image = sketch.Paint(); lblSelectedColor.Text = ColorToString(sketch.CurrentTool.Color); btnSelectedColor.BackColor = sketch.CurrentTool.Color; hoveringColor = GetHoverColor(); lblHoveringColor.Text = ColorToString(hoveringColor); btnHoveringColor.BackColor = hoveringColor; List colorHistory = sketch.CurrentTool.GetLastColors(4); btnColorHistory1.BackColor = colorHistory[0]; btnColorHistory2.BackColor = colorHistory[1]; btnColorHistory3.BackColor = colorHistory[2]; btnColorHistory4.BackColor = colorHistory[3]; lsbTools.DataSource = toolList; lblWidth.Text = "Width: " + canvas.Width.ToString(); lblHeight.Text = "Height: " + canvas.Height.ToString(); if (randomColor) { btnRandomColor.ForeColor = Color.Green; } else { btnRandomColor.ForeColor = Color.Red; } } private Color GetHoverColor() { Point cursorLocation = MousePositionToCanvasPosition(); Color pixel; if (cursorLocation.X > 0 && cursorLocation.X < canvas.Width && cursorLocation.Y > 0 && cursorLocation.Y < canvas.Height && cursorLocation.X < Width && cursorLocation.Y < Height) { int DEBUG = Width; pixel = (canvas.Image as Bitmap).GetPixel(cursorLocation.X, cursorLocation.Y); } else { pixel = Color.FromArgb(0x00, 0x00, 0x00); } return pixel; } private void btnClear_Click(object sender, EventArgs e) { sketch.Clear(); ForceRefresh(); } private void nupPencilWidth_ValueChanged(object sender, EventArgs e) { sketch.ChangePaintToolWidth((int)nupPencilWidth.Value); } private void btnSave_Click(object sender, EventArgs e) { string fileName = tbxProjectName.Text; Bitmap image = (Bitmap)canvas.Image; if (!Directory.Exists(DEFAULT_FILEPATH)) { Directory.CreateDirectory(DEFAULT_FILEPATH); } if (!Directory.Exists(DEFAULT_FILEPATH + fileName)) { Directory.CreateDirectory(DEFAULT_FILEPATH + fileName); } image.Save(DEFAULT_FILEPATH + fileName + "/" + fileName + ".png", System.Drawing.Imaging.ImageFormat.Png); } private void btnSaveCopy_Click(object sender, EventArgs e) { string fileName = tbxProjectName.Text; int version = 1; Bitmap image = (Bitmap)canvas.Image; if (!Directory.Exists(DEFAULT_FILEPATH)) { Directory.CreateDirectory(DEFAULT_FILEPATH); } if (!Directory.Exists(DEFAULT_FILEPATH + fileName)) { Directory.CreateDirectory(DEFAULT_FILEPATH + fileName); } while (File.Exists(DEFAULT_FILEPATH + fileName + "/" + fileName + version + ".png")) { version += 1; } image.Save(DEFAULT_FILEPATH + fileName + "/" + fileName + version + ".png", System.Drawing.Imaging.ImageFormat.Png); } private void lsbTools_SelectedIndexChanged(object sender, EventArgs e) { sketch.ChangeTool(lsbTools.SelectedIndex); RefreshUi(); } private void PaintForm_Resize(object sender, EventArgs e) { canvas.Size = new Size(this.Width - (this.Width - panelTools.Location.X) - canvas.Location.X - WINDOW_OFFSET, this.Height - (this.Height - panelHoverColor.Location.Y) - WINDOW_OFFSET - (panelFile.Location.Y + panelFile.Height)); sketch.Resize(canvas.Size); RefreshUi(); } private void btnRandomColor_Click(object sender, EventArgs e) { randomColor = !randomColor; RefreshUi(); } private void btnUndo_Click(object sender, EventArgs e) { sketch.Undo(); ForceRefresh(); } private void btnRedo_Click(object sender, EventArgs e) { sketch.Redo(); ForceRefresh(); } private void btnColorPicker_Click(object sender, EventArgs e) { ColorPicker cp = new ColorPicker(this); cp.ShowDialog(); } } }