Files

107 lines
3.5 KiB
C#
Raw Permalink Normal View History

using Io.Github.Kerwinxu.LibShapes.Core.Shape;
using Io.Github.Kerwinxu.LibShapes.Core.State.ChangeStrategy;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
namespace Io.Github.Kerwinxu.LibShapes.Core.State
{
/// <summary>
/// 创建状态。
/// </summary>
public class StateCreate:State
{
public StateCreate(UserControlCanvas canvas, PointF start_pointF) : base(canvas, start_pointF)
{
}
public StateCreate(UserControlCanvas canvas) : base(canvas)
{
}
private Shapes oldShapes;
public ShapeEle shape { get; set; }
public StateCreate(UserControlCanvas canvas, ShapeEle shape):base(canvas)
{
this.shape = shape; // 保存要创建的图形
}
private IChangeStrategy strategy = new ResizeModeSouthEast(); // 更改的策略
private ShapeEle newshape; // 建立的图形。
public override void LeftMouseDown(PointF pointF)
{
oldShapes = this.canvas.shapes.DeepClone();
// 这里先创建一个拷贝
newshape = shape.DeepClone();
// 判断是否需要对齐
startPoint = this.canvas.gridAlign(pointF);
// 这里的坐标要转换成虚拟中的坐标
var point3 = cantosPointToVirtualPoint(startPoint);
// 这个x和y就有了
newshape.X = point3.X;
newshape.Y = point3.Y;
// 然后计算id
newshape.ID = this.canvas.shapes.getNextId();
Trace.WriteLine($"增加了一个新的图形id:{newshape.ID}");
// 然后添加到图形中
this.canvas.addShape(newshape);
// 刷新
this.canvas.Refresh();
//base.LeftMouseDown(pointF);
}
public override void LeftMouseMove(PointF pointF)
{
// 判断是否需要对齐
var point2 = cantosPointToVirtualPoint(this.canvas.gridAlign(pointF));
strategy.action(newshape, cantosPointToVirtualPoint(startPoint), point2);
// 刷新
this.canvas.Refresh();
base.LeftMouseMove(pointF);
}
public override void LeftMouseUp(PointF pointF)
{
// 这里有一个特殊的情况就是宽和高都是0的情况下会死机
var point2 = cantosPointToVirtualPoint(this.canvas.gridAlign(pointF));
strategy.action(newshape, cantosPointToVirtualPoint(startPoint), point2);
newshape.ChangeComplated();
if (newshape.Width == 0 && newshape.Height == 0)
{
this.canvas.deleteShapes(newshape);
}
else
{
// 更改成选择模式
this.canvas.state = new StateSelected(this.canvas);
// 需要发送命令
this.canvas.commandRecorder.addCommand(
new Command.CommandShapesChanged()
{
canvas=this.canvas,
OldShapes = this.oldShapes,
NewShapes = this.canvas.shapes.DeepClone()
}
) ;
// 这里还是发出改变通知
this.canvas.changeSelect(newshape);
}
//base.LeftMouseUp(pointF);
// 刷新
this.canvas.Refresh();
}
}
}