345 lines
12 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|