2021-10-13 ElementEiditor.cs

这里写自定义目录标题


ElementEditor.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CanvasDemo.Canvas
{
    /// <summary>
    /// 选择框对象
    /// </summary>
    public class ElementEditor : Element
    {
        SelectionBox SelectionBox;

        public ElementEditor(TimCanvas canvas) : base(canvas, nameof(ElementEditor))
        {
            SelectionBox = new SelectionBox(this, canvas);

        }

        public override void Drawing(Graphics g)
        {
            //绘制选择对象的拖动柄
            SelectedElements.ForEach(x => x.DrawingJoystick(g));

            SelectionBox.Drawing(g);
        }

        public Point MPoint;
        //对象状态
        private EditorState EState = EditorState.None;
        //拖动柄状态
        private TransformState TState = TransformState.None;

        public void MouseDown(MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                MPoint = Viewer.MousePointToLocal(e.Location);
                var elem = SelectedElements.FirstOrDefault(x => x.Rect.Contains(MPoint) == true);
                if (elem != null)
                {//点击已经选择的对象
                    SetCurrent(elem);//设定当前点的对象为操作对象

                    if (Canvas.IsLocked == false)
                    {//如果是只读,那么就不要进入移动和调整大小模式
                        if (MPoint.X > elem.Rect.Right - elem.JoystickSize && MPoint.Y > elem.Rect.Bottom - elem.JoystickSize && MPoint.X < elem.Rect.Right && MPoint.Y < elem.Rect.Bottom)
                        {
                            EState = EditorState.Transform;
                            TState = TransformState.RightBottom;
                        }
                        else if (MPoint.X > elem.Rect.Right - elem.JoystickSize && MPoint.Y > elem.Rect.Y + elem.Rect.Height / 2 - elem.JoystickSize / 2 && MPoint.X < elem.Rect.Right && MPoint.Y < elem.Rect.Y + elem.Rect.Height / 2 + elem.JoystickSize / 2)
                        {
                            EState = EditorState.Transform;
                            TState = TransformState.Right;
                        }
                        else if (MPoint.X > elem.Rect.X + elem.Rect.Width / 2 - elem.JoystickSize / 2 && MPoint.Y > elem.Rect.Bottom - elem.JoystickSize && MPoint.X < elem.Rect.X + elem.Rect.Width / 2 + elem.JoystickSize / 2 && MPoint.Y < elem.Rect.Bottom)
                        {
                            EState = EditorState.Transform;
                            TState = TransformState.Bottom;
                        }
                        else
                        {
                            EState = EditorState.Move;
                        }
                    }

                }
                else
                {
                    EState = EditorState.Selection;
                    SelectionBox.MouseDown(e);
                }
            }
        }

        public void MouseMove(MouseEventArgs e)
        {
            if (EState == EditorState.Move)
            {//移动模式,设定对象位置
                var end = Viewer.MousePointToLocal(e.Location);
                var x = (end.X - MPoint.X);
                var y = (end.Y - MPoint.Y);

                SelectedElements.ForEach(elem => elem.Rect.Offset(x, y));
                MPoint = end;
            }
            else if (EState == EditorState.Transform)
            {//调整大小
                var end = Viewer.MousePointToLocal(e.Location);
                var x = (end.X - MPoint.X);
                var y = (end.Y - MPoint.Y);

                SelectedElements.ForEach(elem =>
                {
                    switch (TState)
                    {
                        case TransformState.RightBottom:
                            elem.Rect.Width += x;
                            elem.Rect.Height += y;
                            break;
                        case TransformState.Right:
                            elem.Rect.Width += x;
                            break;
                        case TransformState.Bottom:
                            elem.Rect.Height += y;
                            break;
                    }

                    if (elem.Rect.Width < 10) elem.Rect.Width = 10;
                    if (elem.Rect.Height < 10) elem.Rect.Height = 10;
                });

                MPoint = end;
            }
            else if (EState == EditorState.Selection)
            {//选择
                SelectionBox.MouseMove(e);

            }
        }

        public void MouseUp(MouseEventArgs e)
        {
            if (EState == EditorState.Selection)
            {
                SelectionBox.MouseUp(e);
            }

            EState = EditorState.None;
        }

        public void MouseWheel(MouseEventArgs e)
        {

        }

        #region 对象选择操作

        /// <summary>
        /// 选择的对象集合
        /// </summary>
        public List<ObjElement> SelectedElements = new List<ObjElement>();

        /// <summary>
        /// 当前对象
        /// </summary>
        public ObjElement CurrentElement = null;

        /// <summary>
        /// 清除选的的对象
        /// </summary>
        public void ClearSelected()
        {
            SelectedElements.ForEach(x => x?.UnSelected());
            SelectedElements.Clear();
        }

        /// <summary>
        /// 设置当前选择的对象
        /// </summary>
        /// <param name="element"></param>
        public void SetCurrent(ObjElement element)
        {
            CurrentElement?.UnCurrent();
            CurrentElement = element;
            CurrentElement?.Current();
        }

        /// <summary>
        /// 添加选中的对象
        /// </summary>
        /// <param name="elements"></param>
        public void AddSelected(List<ObjElement> elements)
        {
            SelectedElements.AddRange(elements);
            elements.ForEach(x => x?.Selected());

            SelectedObjElementsEvent?.Invoke(SelectedElements);

        }
        /// <summary>
        /// 选择了对象元素后触发此方法
        /// </summary>
        public event Action<List<ObjElement>> SelectedObjElementsEvent;



        #endregion



        #region 元素操作

        /// <summary>
        /// 被删除的对象,可以理解成当前布局的回收站,可以从这里拿回已经删除的对象
        /// </summary>
        public Dictionary<string, ObjElement> DeletedElems = new Dictionary<string, ObjElement>();

        /// <summary>
        /// 移除选择的对象
        /// </summary>
        public void RemoveSelectElements()
        {
            foreach (var item in SelectedElements)
            {
                item.Layer.Elements.Remove(item);
                DeletedElems.Add(item.ID, item);
            }
            ClearSelected();

            SelectedObjElementsEvent?.Invoke(SelectedElements);

        }

        #endregion

        #region 对象布局操作

        /// <summary>
        /// 左对齐
        /// </summary>
        public void AlignLeft()
        {
            if (SelectedElements.Count <= 1) return;

            foreach (var item in SelectedElements)
            {
                item.Rect.X = CurrentElement.Rect.X;
            }
            Canvas.Refresh();
        }

        /// <summary>
        /// 右对齐
        /// </summary>
        public void AlignRight()
        {
            if (SelectedElements.Count <= 1) return;

            foreach (var item in SelectedElements)
            {
                item.Rect.X = CurrentElement.Rect.Right - item.Rect.Width;
            };
            Canvas.Refresh();
        }

        /// <summary>
        /// 上对齐
        /// </summary>
        public void AlignTop()
        {
            if (SelectedElements.Count <= 1) return;

            foreach (var item in SelectedElements)
            {
                item.Rect.Y = CurrentElement.Rect.Y;
            };
            Canvas.Refresh();
        }

        /// <summary>
        /// 下对齐
        /// </summary>
        public void AlignBottom()
        {
            if (SelectedElements.Count <= 1) return;

            foreach (var item in SelectedElements)
            {
                item.Rect.Y = CurrentElement.Rect.Bottom - item.Rect.Height;
            };
            Canvas.Refresh();
        }

        /// <summary>
        /// 居中齐
        /// </summary>
        public void AlignCenter()
        {
            if (SelectedElements.Count <= 1) return;

            var center = CurrentElement.Rect.X + CurrentElement.Rect.Width / 2;

            foreach (var item in SelectedElements)
            {
                item.Rect.X = center - item.Rect.Width / 2;
            };
            Canvas.Refresh();
        }

        /// <summary>
        /// 中间齐
        /// </summary>
        public void AlignMiddle()
        {
            if (SelectedElements.Count <= 1) return;

            var middle = CurrentElement.Rect.Y + CurrentElement.Rect.Height / 2;

            foreach (var item in SelectedElements)
            {
                item.Rect.Y = middle - item.Rect.Height / 2;
            };
            Canvas.Refresh();
        }

        /// <summary>
        /// 宽度相同
        /// </summary>
        public void SameWidth()
        {
            if (SelectedElements.Count <= 1) return;

            foreach (var item in SelectedElements)
            {
                item.Rect.Width = CurrentElement.Rect.Width;
            };
            Canvas.Refresh();
        }

        /// <summary>
        /// 高度相同
        /// </summary>
        public void SameHeight()
        {
            if (SelectedElements.Count <= 1) return;

            foreach (var item in SelectedElements)
            {
                item.Rect.Height = CurrentElement.Rect.Height;
            };
            Canvas.Refresh();
        }

        /// <summary>
        /// 大小相同
        /// </summary>
        public void SameSize()
        {
            if (SelectedElements.Count <= 1) return;

            foreach (var item in SelectedElements)
            {
                item.Rect.Width = CurrentElement.Rect.Width;
                item.Rect.Height = CurrentElement.Rect.Height;
            };
            Canvas.Refresh();
        }

        /// <summary>
        /// 水平间距相同
        /// </summary>
        public void SameHorizontalSpace()
        {
            if (SelectedElements.Count <= 1) return;

            var orderFans = SelectedElements.OrderBy(x => x.Rect.X).ToList();
            var minLeft = orderFans.First().Rect.X;
            var maxLeft = orderFans.Last().Rect.X;
            var distance = maxLeft - minLeft;

            for (int i = 0; i < orderFans.Count; i++)
            {
                orderFans[i].Rect.X = (int)(minLeft + (float)i / ((float)orderFans.Count - 1.0f) * distance);
            }
            Canvas.Refresh();
        }

        /// <summary>
        /// 垂直间距相同
        /// </summary>
        public void SameVerticalSpace()
        {
            if (SelectedElements.Count <= 1) return;

            var orderFans = SelectedElements.OrderBy(x => x.Rect.Y).ToList();
            var minTop = orderFans.First().Rect.Y;
            var maxTop = orderFans.Last().Rect.Y;
            var distance = maxTop - minTop;

            for (int i = 0; i < orderFans.Count; i++)
            {
                orderFans[i].Rect.Y = (int)(minTop + (float)i / ((float)orderFans.Count - 1.0f) * distance);
            }
            Canvas.Refresh();
        }

        public override void DrawingAfter(Graphics g)
        {

        }


        #endregion


        enum EditorState
        {
            None,//没有任何操作
            Selection,//框选状态
            Move,//移动状态
            Transform,//调整大小状态
        }


        enum TransformState
        {
            None,
            RightBottom,
            Right,
            Bottom,

        }
    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值