Files
Paint2/Paint_2/Project.cs

400 lines
13 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<string> _selectedLayers;
private Guid uniqIdGenerator;
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<string> 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>();
LayersToPrint = new List<string>();
AddLayer();
LayersToPrint.Add(Layers[0].Id);
}
public string AddLayer()
{
List<PaintTool> newTools = new List<PaintTool>();
foreach (PaintTool tool in AvaibleTools)
{
newTools.Add((PaintTool)tool.Clone());
}
uniqIdGenerator = Guid.NewGuid();
string test = uniqIdGenerator.ToString();
Sketch newSketch = new Sketch(String.Concat("Layer_", Layers.Count + 1), CanvasSize, newTools, uniqIdGenerator.ToString());
Layers.Add(newSketch);
LayersToPrint.Add(newSketch.Id);
RestoreLayerNames();
return (newSketch.Id);
}
private void RestoreLayerNames()
{
//resets all the names to not have multiple layer 3 for example
for (int i = 0; i < Layers.Count; i++)
{
Layers[i].Name = "Layer_" + (i + 1);
}
}
public bool RemoveLayer(string layerId)
{
Sketch layer = FindSketch(Layers, layerId);
if (layer != null)
{
Layers.Remove(layer);
RestoreLayerNames();
return true;
}
else
{
return false;
}
}
public Sketch FindSketch(List<Sketch> layers, string id)
{
foreach (Sketch layer in layers)
{
if (layer.Id == id)
{
return layer;
}
}
return null;
}
public bool IsSketchPresent (List<string> layers, string id)
{
foreach (string layer in layers)
{
if (layer == id)
{
return true;
}
}
return false;
}
public List<Sketch> GetAllLayers()
{
return Layers;
}
public void SwitchLayer(string idLayer)
{
bool present = IsSketchPresent(LayersToPrint,idLayer);
if (present)
{
LayersToPrint.Remove(idLayer);
}
else
{
LayersToPrint.Add(idLayer);
}
}
public void MouseDown(List<string> selectedLayers, Color hoveringColor, Point mousePosition, int toolWidth)
{
foreach (string id in selectedLayers)
{
Sketch layer = FindSketch(Layers, id);
if (layer != null)
{
if (Eyedropping)
{
Color pointedColor = hoveringColor;
if (layer.CurrentTool.Color != pointedColor)
{
layer.ChangePaintToolColor(pointedColor);
}
}
else
{
Drawing = true;
if (RandomColor)
{
layer.StartDrawing(mousePosition, Color.FromArgb(Random.Next(0, 256), Random.Next(0, 256), Random.Next(0, 256)), toolWidth);
}
else
{
layer.StartDrawing(mousePosition, layer.CurrentTool.Color, toolWidth);
}
}
}
}
}
public void MouseUp(List<string> selectedLayers, Point mousePosition)
{
foreach (string id in selectedLayers)
{
Sketch layer = FindSketch(Layers, id);
if (layer != null)
{
if (!Eyedropping)
{
layer.AddDrawingPoint(mousePosition);
Drawing = false;
layer.StopDrawing();
}
}
}
}
public void TimerTick(List<string> selectedLayers, Point mousePosition)
{
foreach (string id in selectedLayers)
{
Sketch layer = FindSketch(Layers, id);
if (layer != null)
{
if (Drawing)
{
layer.AddDrawingPoint(mousePosition);
}
}
}
}
public void ChangeColor(List<string> selectedLayers, Color newColor)
{
foreach (string id in selectedLayers)
{
Sketch layer = FindSketch(Layers, id);
if (layer != null)
{
layer.ChangePaintToolColor(newColor);
}
}
}
public void ChangeWidth(List<string> selectedLayers, int width)
{
foreach (string id in selectedLayers)
{
Sketch layer = FindSketch(Layers, id);
if (layer != null)
{
layer.ChangePaintToolWidth(width);
}
}
}
public void ChangeTool(List<string> selectedLayers, int toolId)
{
foreach (string id in selectedLayers)
{
Sketch layer = FindSketch(Layers, id);
if (layer != null)
{
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);
foreach (string layerId in LayersToPrint)
{
Sketch layer = FindSketch(Layers, layerId);
if (layer != null)
{
gr.DrawImage(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);
foreach (string layerId in LayersToPrint)
{
Sketch layer = FindSketch(Layers, layerId);
if (layer != null)
{
gr.DrawImage(layer.Paint(), Point.Empty);
}
}
return result;
}
public void Clear()
{
foreach (Sketch layer in Layers)
{
layer.Clear();
}
}
public Color GetCurrentToolColor(List<string> selectedLayers)
{
if (Layers.Count == 0 || selectedLayers.Count == 0)
{
return DEFAULT_COLOR;
}
else
{
//Sketch CurrentLayer = Layers[selectedLayers[0];
Sketch CurrentLayer = FindSketch(Layers,selectedLayers[0]);
return CurrentLayer.CurrentTool.Color;
}
}
public int GetCurrentToolWidth(List<string> selectedLayers)
{
if (selectedLayers.Count == 0)
{
return DEFAULT_WIDTH;
}
Sketch CurrentLayer = FindSketch(Layers, selectedLayers[0]);
return CurrentLayer.CurrentTool.Width;
}
public List<Color> GetLayerColorHistory(List<string> 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 = FindSketch(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<string> selectedLayers)
{
foreach (string id in selectedLayers)
{
Sketch layer = FindSketch(Layers, id);
if (layer != null)
{
layer.Undo();
}
}
}
public void Redo(List<string> selectedLayers)
{
foreach (string id in selectedLayers)
{
Sketch layer = FindSketch(Layers, id);
if (layer != null)
{
layer.Redo();
}
}
}
public string PrintAllLayers()
{
string result = "";
foreach (Sketch layer in Layers)
{
result += layer.Name;
result += Environment.NewLine;
}
return result;
}
}
}