1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* Copyright (C) 2013 Open Education Foundation
*
* Copyright (C) 2010-2013 Groupement d'Intérêt Public pour
* l'Education Numérique en Afrique (GIP ENA)
*
* This file is part of OpenBoard.
*
* OpenBoard is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License,
* with a specific linking exception for the OpenSSL project's
* "OpenSSL" library (or with modified versions of it that use the
* same license as the "OpenSSL" library).
*
* OpenBoard is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenBoard. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UBGRAPHICSDELEGATEFRAME_H_
#define UBGRAPHICSDELEGATEFRAME_H_
#include <QtGui>
#include "core/UB.h"
class QGraphicsSceneMouseEvent;
class UBGraphicsItemDelegate;
class QGraphicsSvgItem;
class UBGraphicsDelegateFrame: public QGraphicsRectItem, public QObject
{
public:
UBGraphicsDelegateFrame(UBGraphicsItemDelegate* pDelegate, QRectF pRect, qreal pFrameWidth, bool respectRatio = true, bool hasTitleBar = false);
virtual ~UBGraphicsDelegateFrame();
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
QPainterPath shape() const;
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
QPointF getFixedPointFromPos();
QSizeF getResizeVector(qreal moveX, qreal moveY);
QSizeF resizeDelegate(qreal moveX, qreal moveY);
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void positionHandles();
void setVisible(bool visible);
virtual void setAntiScale(qreal pAntiScale);
enum OperationMode {Scaling, Resizing, ResizingHorizontally};
void setOperationMode(OperationMode pMode) {mOperationMode = pMode;}
bool isResizing(){return mResizing;}
void moveLinkedItems(QLineF movingVector, bool bLinked = false);
void prepareFramesToMove(QList<UBGraphicsDelegateFrame *> framesToMove);
void prepareLinkedFrameToMove();
QList<UBGraphicsDelegateFrame *> getLinkedFrames();
private:
QRectF bottomRightResizeGripRect() const;
QRectF bottomResizeGripRect() const;
QRectF leftResizeGripRect() const;
QRectF rightResizeGripRect() const;
QRectF topResizeGripRect() const;
QRectF rotateButtonBounds() const;
inline bool resizingBottomRight () const { return mCurrentTool == ResizeBottomRight; }
inline bool resizingBottom () const { return mCurrentTool == ResizeBottom; }
inline bool resizingRight () const { return mCurrentTool == ResizeRight; }
inline bool resizingLeft () const { return mCurrentTool == ResizeLeft; }
inline bool resizingTop () const { return mCurrentTool == ResizeTop; }
inline bool rotating () const { return mCurrentTool == Rotate; }
inline bool moving () const { return mCurrentTool == Move; }
void setCursorFromAngle(QString angle);
bool canResizeBottomRight(qreal width, qreal height, qreal scaleFactor);
QTransform buildTransform ();
void updateResizeCursors ();
void initializeTransform ();
enum FrameTool {None, Move, Rotate, ResizeBottomRight, ResizeTop, ResizeRight, ResizeBottom, ResizeLeft};
FrameTool toolFromPos (QPointF pos);
void refreshGeometry();
FrameTool mCurrentTool;
UBGraphicsItemDelegate* mDelegate;
bool mVisible;
qreal mFrameWidth;
qreal mNominalFrameWidth;
bool mRespectRatio;
qreal mAngle;
qreal mAngleOffset;
qreal mTotalScaleX;
qreal mTotalScaleY;
qreal mScaleX;
qreal mScaleY;
qreal mTranslateX;
qreal mTranslateY;
qreal mTotalTranslateX;
qreal mTotalTranslateY;
qreal mAngleTolerance;
QRect mAngleRect;
QPointF mStartingPoint;
QTransform mInitialTransform;
QSizeF mOriginalSize;
QPointF mFixedPoint;
QGraphicsSvgItem* mBottomRightResizeGripSvgItem;
QGraphicsSvgItem* mBottomResizeGripSvgItem;
QGraphicsSvgItem* mLeftResizeGripSvgItem;
QGraphicsSvgItem* mRightResizeGripSvgItem;
QGraphicsSvgItem* mTopResizeGripSvgItem;
QGraphicsSvgItem* mRotateButton;
QGraphicsRectItem* mBottomRightResizeGrip;
QGraphicsRectItem* mBottomResizeGrip;
QGraphicsRectItem* mLeftResizeGrip;
QGraphicsRectItem* mRightResizeGrip;
QGraphicsRectItem* mTopResizeGrip;
OperationMode mOperationMode;
QGraphicsItem* delegated();
bool mFlippedX;
bool mFlippedY;
bool mMirrorX;
bool mMirrorY;
bool mResizing;
bool mMirroredXAtStart;
bool mMirroredYAtStart;
qreal mTitleBarHeight;
QList<UBGraphicsDelegateFrame *> mLinkedFrames;
};
#endif /* UBGRAPHICSDELEGATEFRAME_H_ */