Files
Paint2/Paint_2/Form1.cs

239 lines
7.9 KiB
C#

/// file: Form1.cs
/// Author: Maxime Rohmer <maxluligames@gmail.com>
/// Brief: Class that is controlling the view
/// Version: 0.1.0
/// Date: 08/06/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 = 15;
const string DEFAULT_FILEPATH = "C:/Paint2/Drawings/";
Color FLAT_RED = Color.FromArgb(0xC6,0x28,0x28);
Color FLAT_GREEN = Color.FromArgb(0x00,0x89,0x7B);
public Sketch sketch;
List<PaintTool> toolList;
bool drawing = false;
bool randomColor = false;
Random rnd;
Color hoveringColor;
public PaintForm()
{
InitializeComponent();
rnd = new Random();
toolList = new List<PaintTool>();
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 = "";
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<Color> 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 = "W: " + canvas.Width.ToString();
lblHeight.Text = "H: " + canvas.Height.ToString();
if (randomColor)
{
btnRandomColor.BackColor = FLAT_GREEN;
}
else
{
btnRandomColor.BackColor = FLAT_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);
//ColorDialog cd = new ColorDialog();
cp.Show();
//cd.ShowDialog();
}
private void PaintForm_Load(object sender, EventArgs e)
{
}
}
}