UBGraphicsItemDelegate.h 10.8 KB
Newer Older
Claudio Valerio's avatar
Claudio Valerio committed
1
/*
Claudio Valerio's avatar
Claudio Valerio committed
2
 * Copyright (C) 2013 Open Education Foundation
Claudio Valerio's avatar
Claudio Valerio committed
3
 *
Claudio Valerio's avatar
Claudio Valerio committed
4 5
 * Copyright (C) 2010-2013 Groupement d'Intérêt Public pour
 * l'Education Numérique en Afrique (GIP ENA)
6
 *
Claudio Valerio's avatar
Claudio Valerio committed
7 8 9
 * This file is part of OpenBoard.
 *
 * OpenBoard is free software: you can redistribute it and/or modify
Claudio Valerio's avatar
Claudio Valerio committed
10 11
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3 of the License,
12 13 14 15
 * 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).
 *
Claudio Valerio's avatar
Claudio Valerio committed
16
 * OpenBoard is distributed in the hope that it will be useful,
Claudio Valerio's avatar
Claudio Valerio committed
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Claudio Valerio's avatar
Claudio Valerio committed
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Claudio Valerio's avatar
Claudio Valerio committed
19
 * GNU General Public License for more details.
Claudio Valerio's avatar
Claudio Valerio committed
20
 *
Claudio Valerio's avatar
Claudio Valerio committed
21
 * You should have received a copy of the GNU General Public License
Claudio Valerio's avatar
Claudio Valerio committed
22
 * along with OpenBoard. If not, see <http://www.gnu.org/licenses/>.
Claudio Valerio's avatar
Claudio Valerio committed
23 24
 */

25

Claudio Valerio's avatar
Claudio Valerio committed
26

Claudio Valerio's avatar
Claudio Valerio committed
27

Claudio Valerio's avatar
Claudio Valerio committed
28 29 30
#ifndef UBGRAPHICSITEMDELEGATE_H_
#define UBGRAPHICSITEMDELEGATE_H_

Ilia Ryabokon's avatar
Ilia Ryabokon committed
31 32 33 34 35
#define UB_FREE_CONTROL(Object, Scene) \
    if (Object) {                      \
        if (Scene) {                   \
            Scene->removeItem(Object); \
        }                              \
36
        Object->deleteLater();         \
Ilia Ryabokon's avatar
Ilia Ryabokon committed
37
        Object = 0;                    \
Ilia Ryabokon's avatar
Ilia Ryabokon committed
38 39
    }                                  \

Claudio Valerio's avatar
Claudio Valerio committed
40 41 42 43 44
#include <QtGui>
#include <QtSvg>
#include <QMimeData>

#include "core/UB.h"
45
#include "core/UBSettings.h"
Claudio Valerio's avatar
Claudio Valerio committed
46 47 48

class QGraphicsSceneMouseEvent;
class QGraphicsItem;
49
class UBGraphicsScene;
Claudio Valerio's avatar
Claudio Valerio committed
50 51 52
class UBGraphicsProxyWidget;
class UBGraphicsDelegateFrame;
class UBGraphicsWidgetItem;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
53
class UBGraphicsMediaItem;
Claudio Valerio's avatar
Claudio Valerio committed
54 55 56

class DelegateButton: public QGraphicsSvgItem
{
57
    Q_OBJECT
Claudio Valerio's avatar
Claudio Valerio committed
58 59

    public:
60
        DelegateButton(const QString & fileName, QGraphicsItem* pDelegated, QGraphicsItem * parent = 0, Qt::WindowFrameSection section = Qt::TopLeftSection);
Claudio Valerio's avatar
Claudio Valerio committed
61

62
        virtual ~DelegateButton();
Claudio Valerio's avatar
Claudio Valerio committed
63

64 65 66
        enum { Type = UBGraphicsItemType::DelegateButtonType };
        virtual int type() const { return Type; }

Claudio Valerio's avatar
Claudio Valerio committed
67 68 69 70 71
        void setTransparentToMouseEvent(bool tr)
        {
            mIsTransparentToMouseEvent = tr;
        }

72
        void setFileName(const QString & fileName);
Claudio Valerio's avatar
Claudio Valerio committed
73

74 75 76
        void setShowProgressIndicator(bool pShow) {mShowProgressIndicator = pShow;}
        bool testShowProgresIndicator() const {return mShowProgressIndicator;}

77 78 79
        void setSection(Qt::WindowFrameSection section) {mButtonAlignmentSection =  section;}
        Qt::WindowFrameSection getSection() const {return mButtonAlignmentSection;}

Claudio Valerio's avatar
Claudio Valerio committed
80 81
    protected:

82 83
        virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
        virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
84 85
        virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
        void timerEvent(QTimerEvent *event);
Claudio Valerio's avatar
Claudio Valerio committed
86 87 88

        void modified();

89 90 91
private slots:
        void startShowProgress();

Claudio Valerio's avatar
Claudio Valerio committed
92 93 94 95
    private:

        QGraphicsItem* mDelegated;

96
        QTime mPressedTime;
Claudio Valerio's avatar
Claudio Valerio committed
97
        bool mIsTransparentToMouseEvent;
98 99 100 101
        bool mIsPressed;
        int mProgressTimerId;
        int mPressProgres;
        bool mShowProgressIndicator;
102
        Qt::WindowFrameSection mButtonAlignmentSection;
Claudio Valerio's avatar
Claudio Valerio committed
103 104 105

    signals:
        void clicked (bool checked = false);
106
        void longClicked();
Claudio Valerio's avatar
Claudio Valerio committed
107 108 109

};

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
110 111 112 113
/*
    Code of this class is copied from QT QLCDNumber class sources
    See src\gui\widgets\qlcdnumber.cpp for original code
*/
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
114 115 116 117 118 119
class MediaTimer: public QGraphicsRectItem
{
public:
    MediaTimer(QGraphicsItem * parent = 0);
    ~MediaTimer();

120
    void positionHandles();
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
121 122
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget);
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
123

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
124
    void display(const QString &str);
125
    void setNumDigits(int nDigits);
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
126 127

private:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
128 129 130 131 132 133 134 135 136 137

    static const char* getSegments(char);
    void drawString(const QString& s, QPainter &, QBitArray * = 0, bool = true);
    void drawDigit(const QPoint &, QPainter &, int, char, char = ' ');
    void drawSegment(const QPoint &, char, QPainter &, int, bool = false);
    void addPoint(QPolygon&, const QPoint&);
    void internalSetString(const QString& s);

    static char segments [][8];

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
138 139 140 141 142
    int ndigits;
    QString digitStr;
    QBitArray points;
    double val;

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
143 144
    uint shadow : 1;
    uint smallPoint : 1;
145 146 147 148 149 150 151 152

    int digitSpace;
    int xSegLen;
    int ySegLen;
    int segLen;
    int xAdvance;
    int xOffset;
    int yOffset;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
153 154
};

155
class DelegateMediaControl: public QObject, public QGraphicsRectItem
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
156
{
157 158
    Q_OBJECT

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
    public:

        DelegateMediaControl(UBGraphicsMediaItem* pDelegated, QGraphicsItem * parent = 0);

        virtual ~DelegateMediaControl()
        {
            // NOOP
        }

        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget);

        QPainterPath shape() const;

        virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
        virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
        virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
        virtual void update();

        void positionHandles();
        void updateTicker(qint64 time);
        void totalTimeChanged(qint64 newTotalTime);

182 183 184 185
    signals:
        void used();

    protected:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
186 187 188 189 190 191 192 193 194 195
        void seekToMousePos(QPointF mousePos);

        UBGraphicsMediaItem* mDelegate;
        bool mDisplayCurrentTime;

        qint64 mCurrentTimeInMs;
        qint64 mTotalTimeInMs;

    private:
        int mStartWidth;
196
        int mSeecAreaBorderHeight;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
197 198 199 200 201

        QRectF mSeecArea;
        QRectF mLCDTimerArea;

        MediaTimer *lcdTimer;
202 203

        QString mDisplayFormat;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
204 205
};

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
206 207 208 209
class UBGraphicsToolBarItem : public QGraphicsRectItem, public QObject
{
    public:
        UBGraphicsToolBarItem(QGraphicsItem * parent = 0);
root's avatar
root committed
210
        virtual ~UBGraphicsToolBarItem() {;}
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
211 212 213 214

        bool isVisibleOnBoard() const { return mVisible; }
        void setVisibleOnBoard(bool visible) { mVisible = visible; }
        bool isShifting() const { return mShifting; }
215
        void setShifting(bool shifting) { mShifting = shifting; }
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
216 217 218
        QList<QGraphicsItem*> itemsOnToolBar() const { return mItemsOnToolBar; }
        void setItemsOnToolBar(QList<QGraphicsItem*> itemsOnToolBar) { mItemsOnToolBar = itemsOnToolBar;}
        int minWidth() { return mMinWidth; }
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
219 220
        void positionHandles();
        void update();
Aleksei Kanash's avatar
Aleksei Kanash committed
221
        int getElementsPadding(){return mElementsPadding;}
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
222 223

    private:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
224 225 226 227 228 229 230
        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget);

    private:
        bool mShifting;
        bool mVisible;
        int mMinWidth;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
231
        int mInitialHeight;
Aleksei Kanash's avatar
Aleksei Kanash committed
232
        int mElementsPadding;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
233 234
        QList<QGraphicsItem*> mItemsOnToolBar;
};
Claudio Valerio's avatar
Claudio Valerio committed
235 236 237

class UBGraphicsItemDelegate : public QObject
{
238
    Q_OBJECT
Claudio Valerio's avatar
Claudio Valerio committed
239 240

    public:
241
    UBGraphicsItemDelegate(QGraphicsItem* pDelegated, QObject * parent = 0, UBGraphicsFlags fls = 0);
Claudio Valerio's avatar
Claudio Valerio committed
242 243 244

        virtual ~UBGraphicsItemDelegate();

Ilia Ryabokon's avatar
Ilia Ryabokon committed
245 246
        virtual void createControls();
        virtual void freeControls();
247
        virtual void showControls();
Ilia Ryabokon's avatar
Ilia Ryabokon committed
248
        virtual bool controlsExist() const;
Claudio Valerio's avatar
Claudio Valerio committed
249 250 251 252

        virtual bool mousePressEvent(QGraphicsSceneMouseEvent *event);
        virtual bool mouseMoveEvent(QGraphicsSceneMouseEvent *event);
        virtual bool mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
Claudio Valerio's avatar
Claudio Valerio committed
253
        virtual bool wheelEvent(QGraphicsSceneWheelEvent *event);
Claudio Valerio's avatar
Claudio Valerio committed
254

255 256 257
        virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
        virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);

258 259 260
        virtual bool keyPressEvent(QKeyEvent *event);
        virtual bool keyReleaseEvent(QKeyEvent *event);

Claudio Valerio's avatar
Claudio Valerio committed
261 262
        virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change,
                const QVariant &value);
263
        virtual UBGraphicsScene *castUBGraphicsScene();
264 265
        virtual void postpaint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

Claudio Valerio's avatar
Claudio Valerio committed
266

Ivan Ilin's avatar
Ivan Ilin committed
267 268
        void printMessage(const QString &mess) {qDebug() << mess;}

269
        QGraphicsItem* delegated();
Claudio Valerio's avatar
Claudio Valerio committed
270 271

        virtual void positionHandles();
272
        void setZOrderButtonsVisible(bool visible);
Claudio Valerio's avatar
Claudio Valerio committed
273 274 275 276

        void startUndoStep();
        void commitUndoStep();

277
        UBGraphicsDelegateFrame* frame() {return mFrame;}
Claudio Valerio's avatar
Claudio Valerio committed
278

279
        bool isLocked() const;
Claudio Valerio's avatar
Claudio Valerio committed
280 281 282

        QMimeData* mimeData(){ return mMimeData; }
        void setMimeData(QMimeData* mimeData);
283
        void setDragPixmap(const QPixmap &pix) {mDragPixmap = pix;}
Claudio Valerio's avatar
Claudio Valerio committed
284

-f's avatar
-f committed
285
        void setLocked(bool pLocked);
shibakaneki's avatar
shibakaneki committed
286 287
        void setButtonsVisible(bool visible);

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
288 289 290
        UBGraphicsToolBarItem* getToolBarItem() const { return mToolBarItem; }

        qreal antiScaleRatio() const { return mAntiScaleRatio; }
Ilia Ryabokon's avatar
Ilia Ryabokon committed
291
        virtual void update() {positionHandles();}
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
292

293 294 295 296 297
        UBGraphicsFlags ubflags() const {return mFlags;}
        bool testUBFlags(UBGraphicsFlags pf) const {return mFlags & pf;}
        void setUBFlags(UBGraphicsFlags pf);
        void setUBFlag(UBGraphicsFlags pf, bool set = true);

Claudio Valerio's avatar
Claudio Valerio committed
298 299 300 301 302 303 304 305
    signals:
        void showOnDisplayChanged(bool shown);
        void lockChanged(bool locked);

    public slots:
        virtual void remove(bool canUndo = true);
        void showMenu();

306 307 308 309
        virtual void showHide(bool show);
        virtual void lock(bool lock);
        virtual void duplicate();

310 311 312 313
        void increaseZLevelUp();
        void increaseZLevelDown();
        void increaseZlevelTop();
        void increaseZlevelBottom();
314

315 316
        void onZoomChanged();

Claudio Valerio's avatar
Claudio Valerio committed
317
    protected:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
318
        virtual void buildButtons();
Ilia Ryabokon's avatar
Ilia Ryabokon committed
319
        virtual void freeButtons();
Claudio Valerio's avatar
Claudio Valerio committed
320 321 322
        virtual void decorateMenu(QMenu *menu);
        virtual void updateMenuActionState();

323
        QList<DelegateButton*> buttons() {return mButtons;}
Claudio Valerio's avatar
Claudio Valerio committed
324 325
        QGraphicsItem* mDelegated;

326
        //buttons from the top left section of delegate frame
Claudio Valerio's avatar
Claudio Valerio committed
327 328 329 330
        DelegateButton* mDeleteButton;
        DelegateButton* mDuplicateButton;
        DelegateButton* mMenuButton;

331 332 333 334
        //buttons from the bottom left section of delegate frame
        DelegateButton *mZOrderUpButton;
        DelegateButton *mZOrderDownButton;

Claudio Valerio's avatar
Claudio Valerio committed
335 336 337 338 339 340 341 342 343 344 345
        QMenu* mMenu;

        QAction* mLockAction;
        QAction* mShowOnDisplayAction;
        QAction* mGotoContentSourceAction;

        UBGraphicsDelegateFrame* mFrame;
        qreal mFrameWidth;
        qreal mAntiScaleRatio;

        QList<DelegateButton*> mButtons;
346
        QList<DelegateButton*> mToolBarButtons;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
347 348
        UBGraphicsToolBarItem* mToolBarItem;

349
protected slots:
350
        virtual void gotoContentSource();
351

352
private:
353 354
        void updateFrame();
        void updateButtons(bool showUpdated = false);
355
        inline void showHideRecurs(const QVariant &pShow, QGraphicsItem *pItem);
356

Claudio Valerio's avatar
Claudio Valerio committed
357 358 359
        QPointF mOffset;
        QTransform mPreviousTransform;
        QPointF mPreviousPosition;
360
        QPointF mDragStartPosition;
Claudio Valerio's avatar
Claudio Valerio committed
361 362 363
        qreal mPreviousZValue;
        QSizeF mPreviousSize;
        QMimeData* mMimeData;
364
        QPixmap mDragPixmap;
365

366
        bool mMoved;
367
        UBGraphicsFlags mFlags;
Claudio Valerio's avatar
Claudio Valerio committed
368 369 370 371
};


#endif /* UBGRAPHICSITEMDELEGATE_H_ */