Files
Paint2/Paint_2/Project.cs
2022-06-10 18:19:56 +02:00

345 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Paint_2
{
public class Project
{
const string DEFAULT_FILEPATH = "C:/Paint2/Drawings/";
readonly Color DEFAULT_COLOR = Color.Firebrick;
const int DEFAULT_WIDTH = 0;
private List<PaintTool> _avaibleTools;
private List<int> _selectedLayers;
//private Sketch _currentSketch;
private List<Sketch> _layers;
private bool _eyedropping;
private bool _randomColor;
private Size _canvasSize;
private Random _random;
private bool _drawing;
private string _name;
public List<PaintTool> AvaibleTools { get => _avaibleTools; set => _avaibleTools = value; }
//public Sketch CurrentLayer { get => _currentSketch; set => _currentSketch = value; }
public List<Sketch> Layers { get => _layers; set => _layers = value; }
public bool Eyedropping { get => _eyedropping; set => _eyedropping = value; }
public bool RandomColor { get => _randomColor; set => _randomColor = value; }
public Size CanvasSize { get => _canvasSize; set => _canvasSize = value; }
public Random Random { get => _random; set => _random = value; }
public bool Drawing { get => _drawing; set => _drawing = value; }
public string Name { get => _name; set => _name = value; }
public List<int> LayersToPrint { get => _selectedLayers; set => _selectedLayers = value; }
public Project(string name, Size canvasSize)
{
Name = name;
CanvasSize = canvasSize;
Random = new Random();
//We set all the avaible tools at first
AvaibleTools = new List<PaintTool>();
AvaibleTools.Add(new Pencil("Default Pencil"));
AvaibleTools.Add(new DotPencil("Dotted Line"));
AvaibleTools.Add(new BezierPencil("Bezier Generator"));
//We create a single first layer with the default toolSet
Layers = new List<Sketch>();
AddLayer();
//CurrentLayer = Layers[0];
LayersToPrint = new List<int>();
LayersToPrint.Add(0);
}
public void AddLayer()
{
List<PaintTool> newTools = new List<PaintTool>();
foreach (PaintTool tool in AvaibleTools)
{
newTools.Add((PaintTool)tool.Clone());
}
Layers.Add(new Sketch(String.Concat("Layer", Layers.Count + 1), CanvasSize, newTools));
}
public void RemoveLayer(int layerId)
{
if (layerId >= 0 && layerId < Layers.Count)
{
Layers.RemoveAt(layerId);
}
}
/*
public void ChangeLayer(int idLayer)
{
CurrentLayer = Layers[idLayer];
}
*/
public List<Sketch> GetAllLayers()
{
return Layers;
}
public void SwitchLayer(int idLayer)
{
if (LayersToPrint.Contains(idLayer))
{
LayersToPrint.Remove(idLayer);
}
else
{
LayersToPrint.Add(idLayer);
}
}
public void MouseDown(List<int> selectedLayers, Color hoveringColor, Point mousePosition, int toolWidth)
{
for (int layer = 0; layer < Layers.Count; layer++)
{
if (selectedLayers.Contains(layer))
{
if (Eyedropping)
{
Color pointedColor = hoveringColor;
if (Layers[layer].CurrentTool.Color != pointedColor)
{
Layers[layer].ChangePaintToolColor(pointedColor);
}
}
else
{
Drawing = true;
if (RandomColor)
{
Layers[layer].StartDrawing(mousePosition, Color.FromArgb(Random.Next(0, 256), Random.Next(0, 256), Random.Next(0, 256)), toolWidth);
}
else
{
Layers[layer].StartDrawing(mousePosition, Layers[layer].CurrentTool.Color, toolWidth);
}
}
}
}
}
public void MouseUp(List<int> selectedLayers, Point mousePosition)
{
for (int layer = 0; layer < Layers.Count; layer++)
{
if (selectedLayers.Contains(layer))
{
if (!Eyedropping)
{
Layers[layer].AddDrawingPoint(mousePosition);
Drawing = false;
Layers[layer].StopDrawing();
}
}
}
}
public void TimerTick(List<int> selectedLayers, Point mousePosition)
{
for (int layer = 0; layer < Layers.Count; layer++)
{
if (selectedLayers.Contains(layer))
{
if (Drawing)
{
Layers[layer].AddDrawingPoint(mousePosition);
}
}
}
}
public void ChangeColor(List<int> selectedLayers, Color newColor)
{
for (int layer = 0; layer < Layers.Count; layer++)
{
if (selectedLayers.Contains(layer))
{
Layers[layer].ChangePaintToolColor(newColor);
}
}
}
public void ChangeWidth(List<int> selectedLayers, int width)
{
for (int layer = 0; layer < Layers.Count; layer++)
{
if (selectedLayers.Contains(layer))
{
Layers[layer].ChangePaintToolWidth(width);
}
}
}
public void ChangeTool(List<int> selectedLayers, int toolId)
{
for (int layer = 0; layer < Layers.Count; layer++)
{
if (selectedLayers.Contains(layer))
{
Layers[layer].ChangeTool(toolId);
}
}
}
public Bitmap ForcePaintAllLayers()
{
Bitmap result = new Bitmap(CanvasSize.Width, CanvasSize.Height);
Graphics gr = Graphics.FromImage(result);
foreach (Sketch layer in Layers)
{
gr.DrawImage(layer.ForcePaint(), Point.Empty);
}
return result;
}
public Bitmap ForcePaintLayers()
{
Bitmap result = new Bitmap(CanvasSize.Width, CanvasSize.Height);
Graphics gr = Graphics.FromImage(result);
for (int layer = 0; layer < Layers.Count; layer++)
{
if (LayersToPrint.Contains(layer))
{
gr.DrawImage(Layers[layer].ForcePaint(), Point.Empty);
}
}
return result;
}
public Bitmap PaintAllLayers()
{
Bitmap result = new Bitmap(CanvasSize.Width, CanvasSize.Height);
Graphics gr = Graphics.FromImage(result);
foreach (Sketch layer in Layers)
{
gr.DrawImage(layer.Paint(), Point.Empty);
}
return result;
}
public Bitmap PaintLayers()
{
Bitmap result = new Bitmap(CanvasSize.Width, CanvasSize.Height);
Graphics gr = Graphics.FromImage(result);
for (int layer = 0; layer < Layers.Count; layer++)
{
if (LayersToPrint.Contains(layer))
{
gr.DrawImage(Layers[layer].Paint(), Point.Empty);
}
}
return result;
}
public void Clear()
{
foreach (Sketch layer in Layers)
{
layer.Clear();
}
}
public Color GetCurrentToolColor(List<int> selectedLayers)
{
if(selectedLayers.Count == 0)
{
return DEFAULT_COLOR;
}
Sketch CurrentLayer = Layers[selectedLayers[0]];
return CurrentLayer.CurrentTool.Color;
}
public int GetCurrentToolWidth(List<int> selectedLayers)
{
if (selectedLayers.Count == 0)
{
return DEFAULT_WIDTH;
}
Sketch CurrentLayer = Layers[selectedLayers[0]];
return CurrentLayer.CurrentTool.Width;
}
public List<Color> GetLayerColorHistory(List<int> selectedLayers,int colorsCount)
{
if(selectedLayers.Count == 0)
{
List<Color> result = new List<Color>();
for (int i = 0;i < colorsCount;i++)
{
result.Add(DEFAULT_COLOR);
}
return result;
}
Sketch CurrentLayer = Layers[selectedLayers[0]];
return CurrentLayer.CurrentTool.GetLastColors(colorsCount);
}
public void Save(string fileName, Bitmap 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);
}
public void SaveCopy(string fileName, Bitmap image)
{
int version = 1;
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);
}
public void Resize(Size newSize)
{
CanvasSize = newSize;
foreach (Sketch layer in Layers)
{
layer.Resize(CanvasSize);
}
}
public void SwitchRandom()
{
RandomColor = !RandomColor;
}
public void SwitchEyeDrop()
{
Eyedropping = !Eyedropping;
}
public void Undo(List<int> selectedLayers)
{
for (int layer = 0; layer < Layers.Count; layer++)
{
if (selectedLayers.Contains(layer))
{
Layers[layer].Undo();
}
}
}
public void Redo(List<int> selectedLayers)
{
for (int layer = 0; layer < Layers.Count; layer++)
{
if (selectedLayers.Contains(layer))
{
Layers[layer].Redo();
}
}
}
public string PrintAllLayers()
{
string result = "";
foreach (Sketch layer in Layers)
{
result += layer.Name;
result += Environment.NewLine;
}
return result;
}
}
}