/**
     *\file baseSelector.h
     *
     *\brief selector是用来实现对图元进行具体操作的类，例如创建、编辑、旋转、移动等，通过对鼠标的行为动作进行具体的逻辑编写实现操作表达
     *
     *\author dsc
     */

#ifndef BASESELECTOR_H
#define BASESELECTOR_H

#include <QObject>
#include "designerScene.h"

enum SelectorType
{
    ST_base = 0, //基本
    ST_cerating, //创建
    ST_moving, //移动
    ST_editing, //顶点编辑
    ST_scaling, //缩放
    ST_rotation, //旋转
};

enum OperationMode
{
    OM_none = 0,
    OM_move, //移动
    OM_create, //创建
    OM_edit, //顶点编辑
    OM_scale, //缩放
    OM_rotate, //旋转
};

class BaseSelector : public QObject
{
    Q_OBJECT

public:
    explicit BaseSelector(QObject *parent = 0);
    virtual ~BaseSelector();

public:
    virtual void mousePressEvent(QGraphicsSceneMouseEvent*, DesignerScene*);
    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent*, DesignerScene*);
    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent*, DesignerScene*);
    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*, DesignerScene*);

    SelectorType getSelectorType() { return m_type; }
    //void setOperationMode(OperationMode m) { m_opMode = m; }
    OperationMode getOperationMode() { return ms_opMode; }

    void setCursor(DesignerScene*, const QCursor&);

signals:
    void setWorkingSelector(SelectorType);

protected:
    //静态变量，用于不同类型selector间的成员共享
    static OperationMode   ms_opMode;
    static QPointF         ms_ptMouseDown;
    static QPointF         ms_ptMouseLast;
    static double          ms_dAngleMouseDownToItem; //鼠标按下时其位置和item中心点形成的夹角
    static int             ms_nDragHandle; //当前抓取的控制点

    SelectorType           m_type;

private:
    bool                   m_bHoverOnHandel; //鼠标是否悬停在handel
    OperationMode          m_opMode;
};

#endif
