Files
Paint2/Paint_2/Form1.cs

371 lines
12 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/";
readonly Color FLAT_RED = Color.FromArgb(0xC6, 0x28, 0x28);
readonly Color FLAT_GREEN = Color.FromArgb(0x00, 0x89, 0x7B);
//public Sketch sketch;
//List<PaintTool> toolList;
//bool drawing = false;
//bool randomColor = false;
//bool eyeDropping = false;
//Random _random;
private Color _hoveringColor;
private Project _project;
private int _selectedLayer;
private List<string> _selectedLayers;
public Color HoveringColor { get => _hoveringColor; set => _hoveringColor = value; }
public Project Project { get => _project; set => _project = value; }
public int SelectedLayer { get => _selectedLayer; set => _selectedLayer = value; }
public List<string> SelectedLayers { get => _selectedLayers; set => _selectedLayers = value; }
public PaintForm()
{
InitializeComponent();
Project = new Project("Untitled project", canvas.Size);
SelectedLayers = new List<string>();
SelectedLayers.Add(Project.GetAllLayers()[0].Id);
RefreshUi();
}
private Point MousePositionToCanvasPosition()
{
return canvas.PointToClient(MousePosition);
}
private void canvas_MouseDown(object sender, MouseEventArgs e)
{
Color hoveringColor = GetHoverColor();
Point mousePosition = MousePositionToCanvasPosition();
int toolWidth = (int)nupPencilWidth.Value;
Project.MouseDown(SelectedLayers, hoveringColor, mousePosition, toolWidth);
RefreshUi();
}
private void canvas_MouseUp(object sender, MouseEventArgs e)
{
Point mousePosition = MousePositionToCanvasPosition();
Project.MouseUp(SelectedLayers, mousePosition);
RefreshUi();
}
private void tmrRefresh_Tick(object sender, EventArgs e)
{
Point mousePosition = MousePositionToCanvasPosition();
Project.TimerTick(SelectedLayers, mousePosition);
RefreshUi();
}
private void BtnColor_Click(object sender, EventArgs e)
{
Color newColor = (sender as Button).BackColor;
Project.ChangeColor(SelectedLayers, newColor);
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 + " A:" + color.A;
return result;
}
private void ForceRefresh()
{
//canvas.Image = Project.ForcePaintAllLayers();
canvas.Image = Project.ForcePaintLayers();
RefreshUi();
}
private void RefreshUi()
{
lsbTools.DataSource = Project.AvaibleTools;
DebugLabel.Text = "";
canvas.Image = Project.PaintLayers();
lblSelectedColor.Text = ColorToString(Project.GetCurrentToolColor(SelectedLayers));
btnSelectedColor.BackColor = Project.GetCurrentToolColor(SelectedLayers);
HoveringColor = GetHoverColor();
lblHoveringColor.Text = ColorToString(HoveringColor);
btnHoveringColor.BackColor = HoveringColor;
List<Color> colorHistory = Project.GetLayerColorHistory(SelectedLayers, 4);
btnColorHistory1.BackColor = colorHistory[0];
btnColorHistory1.ForeColor = colorHistory[0];
btnColorHistory2.BackColor = colorHistory[1];
btnColorHistory2.ForeColor = colorHistory[1];
btnColorHistory3.BackColor = colorHistory[2];
btnColorHistory3.ForeColor = colorHistory[2];
btnColorHistory4.BackColor = colorHistory[3];
btnColorHistory4.ForeColor = colorHistory[3];
lblWidth.Text = "W: " + canvas.Width.ToString();
lblHeight.Text = "H: " + canvas.Height.ToString();
pbxSample.Image = DrawSample(pbxSample.Size);
if (Project.RandomColor)
{
btnRandomColor.BackColor = FLAT_GREEN;
}
else
{
btnRandomColor.BackColor = FLAT_RED;
}
if (Project.Eyedropping)
{
btnEyeDrop.BackColor = FLAT_GREEN;
}
else
{
btnEyeDrop.BackColor = FLAT_RED;
}
}
private Bitmap DrawSample(Size size)
{
Bitmap map = new Bitmap(size.Width, size.Height);
Graphics gr = Graphics.FromImage(map);
gr.DrawLine(new Pen(Project.GetCurrentToolColor(SelectedLayers), Project.GetCurrentToolWidth(SelectedLayers)), new Point(0, 0), new Point(size.Width, size.Height));
return map;
}
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)
{
Project.Clear();
ForceRefresh();
}
private void nupPencilWidth_ValueChanged(object sender, EventArgs e)
{
int newWidth = (int)nupPencilWidth.Value;
Project.ChangeWidth(SelectedLayers, newWidth);
}
private void btnSave_Click(object sender, EventArgs e)
{
string fileName = tbxProjectName.Text;
Bitmap image = (Bitmap)canvas.Image;
Project.Save(fileName, image);
}
private void btnSaveCopy_Click(object sender, EventArgs e)
{
string fileName = tbxProjectName.Text;
Bitmap image = (Bitmap)canvas.Image;
Project.SaveCopy(fileName, image);
}
private void lsbTools_SelectedIndexChanged(object sender, EventArgs e)
{
int toolId = lsbTools.SelectedIndex;
Project.ChangeTool(SelectedLayers, toolId);
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));
Project.Resize(canvas.Size);
RefreshUi();
}
private void btnRandomColor_Click(object sender, EventArgs e)
{
Project.SwitchRandom();
RefreshUi();
}
private void btnEyeDrop_Click(object sender, EventArgs e)
{
Project.SwitchEyeDrop();
RefreshUi();
}
private void btnUndo_Click(object sender, EventArgs e)
{
Project.Undo(SelectedLayers);
ForceRefresh();
}
private void btnRedo_Click(object sender, EventArgs e)
{
Project.Redo(SelectedLayers);
ForceRefresh();
}
private void btnColorPicker_Click(object sender, EventArgs e)
{
ColorPicker cp = new ColorPicker(this);
cp.Show();
}
private void PaintForm_Load(object sender, EventArgs e)
{
tmrRefresh.Enabled = true;
DisplayLayers();
}
private void btnLayerRemove_Click(object sender, EventArgs e)
{
int layersCount = SelectedLayers.Count;
List<String> LayersToRemove = new List<string>();
foreach (string layer in SelectedLayers)
{
LayersToRemove.Add(layer);
}
for (int id = layersCount -1; id >= 0; id--)
{
if (Project.RemoveLayer(LayersToRemove[id]))
{
SelectedLayers.RemoveAt(id);
}
else
{
Console.WriteLine("Could not delete the layer");
}
}
DisplayLayers();
RefreshUi();
}
private void BtnAddLayer_Click(object sender, EventArgs e)
{
Project.AddLayer();
DisplayLayers();
RefreshUi();
}
private void DisplayLayers()
{
//I know I know this is not really MVC yet but I will address that
int Yoffset = 25;
int Xoffset = 10;
int blocsCount = 1;
int btnWidth = 75;
int labelWidth = 70;
int BtnXoffset = labelWidth;
int ChkXOffset = BtnXoffset + btnWidth + Xoffset / 2;
int ChkWidth = 20;
pnlLayers.Controls.Clear();
List<Sketch> layers = Project.GetAllLayers();
foreach (Sketch layer in layers)
{
Label name = new Label();
name.AutoSize = false;
name.Width = labelWidth;
name.Text = layer.Name;
name.BackColor = Color.Transparent;
pnlLayers.Controls.Add(name);
name.Location = new Point(0, blocsCount * Yoffset);
Button btn = new Button();
btn.Name = "ChkLayerVisible:" + layer.Id;
btn.Click += LayerSelection;
if (Project.LayersToPrint.Contains(layer.Id))
{
btn.Text = "Visible";
}
else
{
btn.Text = "Invisible";
}
pnlLayers.Controls.Add(btn);
btn.BackColor = Color.FromArgb(59, 59, 59);
btn.Location = new Point(BtnXoffset, blocsCount * Yoffset);
btn.Width = btnWidth;
btn.FlatStyle = FlatStyle.Popup;
Button chk = new Button();
chk.Click += LayerCheck;
if (SelectedLayers.Contains(layer.Id))
{
chk.BackColor = Color.Green;
}
else
{
chk.BackColor = Color.Red;
}
pnlLayers.Controls.Add(chk);
chk.Location = new Point(ChkXOffset, blocsCount * Yoffset);
chk.AutoSize = false;
chk.Text = "";
chk.FlatStyle = FlatStyle.Popup;
chk.Width = ChkWidth;
chk.Name = "ChkLayerSelected:" + layer.Id;
blocsCount++;
}
}
private void LayerSelection(object sender, EventArgs e)
{
//We assume that the id of the layer is the name of the button
Button btn = sender as Button;
string rawId = btn.Name;
string id = rawId.Replace("ChkLayerVisible:", String.Empty);
Project.SwitchLayer(id);
DisplayLayers();
}
private void LayerCheck(object sender, EventArgs e)
{
// We should receive "CheckBox:937r9837r893"
Button btn = sender as Button;
//MessageBox.Show("Btn " + btn.Name + " pressed");
string rawId = btn.Name;
string id = rawId.Replace("ChkLayerSelected:", String.Empty);
//MessageBox.Show("Select or Deslect layer n:"+id);
if (SelectedLayers.Contains(id))
{
SelectedLayers.Remove(id);
}
else
{
SelectedLayers.Add(id);
}
DisplayLayers();
}
}
}