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

27

Claudio Valerio's avatar
Claudio Valerio committed
28

Claudio Valerio's avatar
Claudio Valerio committed
29

Claudio Valerio's avatar
Claudio Valerio committed
30 31 32
#ifndef UBGRAPHICSITEMDELEGATE_H_
#define UBGRAPHICSITEMDELEGATE_H_

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

Claudio Valerio's avatar
Claudio Valerio committed
42 43 44
#include <QtGui>
#include <QtSvg>
#include <QMimeData>
45
#include <QGraphicsVideoItem>
Claudio Valerio's avatar
Claudio Valerio committed
46 47

#include "core/UB.h"
48
#include "core/UBSettings.h"
Claudio Valerio's avatar
Claudio Valerio committed
49 50 51

class QGraphicsSceneMouseEvent;
class QGraphicsItem;
52
class UBGraphicsScene;
Claudio Valerio's avatar
Claudio Valerio committed
53 54 55
class UBGraphicsProxyWidget;
class UBGraphicsDelegateFrame;
class UBGraphicsWidgetItem;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
56
class UBGraphicsMediaItem;
Claudio Valerio's avatar
Claudio Valerio committed
57 58 59

class DelegateButton: public QGraphicsSvgItem
{
60
    Q_OBJECT
Claudio Valerio's avatar
Claudio Valerio committed
61 62

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

65
        virtual ~DelegateButton();
Claudio Valerio's avatar
Claudio Valerio committed
66

67 68 69
        enum { Type = UBGraphicsItemType::DelegateButtonType };
        virtual int type() const { return Type; }

Claudio Valerio's avatar
Claudio Valerio committed
70 71 72 73 74
        void setTransparentToMouseEvent(bool tr)
        {
            mIsTransparentToMouseEvent = tr;
        }

75
        void setFileName(const QString & fileName);
Claudio Valerio's avatar
Claudio Valerio committed
76

77 78 79
        void setShowProgressIndicator(bool pShow) {mShowProgressIndicator = pShow;}
        bool testShowProgresIndicator() const {return mShowProgressIndicator;}

80 81 82
        void setSection(Qt::WindowFrameSection section) {mButtonAlignmentSection =  section;}
        Qt::WindowFrameSection getSection() const {return mButtonAlignmentSection;}

Claudio Valerio's avatar
Claudio Valerio committed
83 84
    protected:

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

        void modified();

92 93 94
private slots:
        void startShowProgress();

Claudio Valerio's avatar
Claudio Valerio committed
95 96 97 98
    private:

        QGraphicsItem* mDelegated;

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

    signals:
        void clicked (bool checked = false);
109
        void longClicked();
Claudio Valerio's avatar
Claudio Valerio committed
110 111 112

};

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
113 114 115 116
/*
    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
117 118 119 120 121 122
class MediaTimer: public QGraphicsRectItem
{
public:
    MediaTimer(QGraphicsItem * parent = 0);
    ~MediaTimer();

123
    void positionHandles();
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
124 125
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget);
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
126

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
127
    void display(const QString &str);
128
    void setNumDigits(int nDigits);
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
129 130

private:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
131 132 133 134 135 136 137 138 139 140

    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
141 142 143 144 145
    int ndigits;
    QString digitStr;
    QBitArray points;
    double val;

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
146 147
    uint shadow : 1;
    uint smallPoint : 1;
148 149 150 151 152 153 154 155

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

158
class DelegateMediaControl: public QObject, public QGraphicsRectItem
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
159
{
160 161
    Q_OBJECT

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
    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);

185 186 187 188
    signals:
        void used();

    protected:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
189 190 191 192 193 194 195 196 197 198
        void seekToMousePos(QPointF mousePos);

        UBGraphicsMediaItem* mDelegate;
        bool mDisplayCurrentTime;

        qint64 mCurrentTimeInMs;
        qint64 mTotalTimeInMs;

    private:
        int mStartWidth;
199
        int mSeecAreaBorderHeight;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
200 201 202 203 204

        QRectF mSeecArea;
        QRectF mLCDTimerArea;

        MediaTimer *lcdTimer;
205 206

        QString mDisplayFormat;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
207 208
};

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

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

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

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

class UBGraphicsItemDelegate : public QObject
{
241
    Q_OBJECT
Claudio Valerio's avatar
Claudio Valerio committed
242 243

    public:
244
    UBGraphicsItemDelegate(QGraphicsItem* pDelegated, QObject * parent = 0, UBGraphicsFlags fls = 0);
Claudio Valerio's avatar
Claudio Valerio committed
245 246 247

        virtual ~UBGraphicsItemDelegate();

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

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

258 259 260
        virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
        virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);

261 262 263
        virtual bool keyPressEvent(QKeyEvent *event);
        virtual bool keyReleaseEvent(QKeyEvent *event);

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

Claudio Valerio's avatar
Claudio Valerio committed
269

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

272
        QGraphicsItem* delegated();
Claudio Valerio's avatar
Claudio Valerio committed
273 274

        virtual void positionHandles();
275
        void setZOrderButtonsVisible(bool visible);
Claudio Valerio's avatar
Claudio Valerio committed
276 277 278 279

        void startUndoStep();
        void commitUndoStep();

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

282
        bool isLocked() const;
Claudio Valerio's avatar
Claudio Valerio committed
283 284 285

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

-f's avatar
-f committed
288
        void setLocked(bool pLocked);
shibakaneki's avatar
shibakaneki committed
289 290
        void setButtonsVisible(bool visible);

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
291 292 293
        UBGraphicsToolBarItem* getToolBarItem() const { return mToolBarItem; }

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

296 297 298 299 300
        UBGraphicsFlags ubflags() const {return mFlags;}
        bool testUBFlags(UBGraphicsFlags pf) const {return mFlags & pf;}
        void setUBFlags(UBGraphicsFlags pf);
        void setUBFlag(UBGraphicsFlags pf, bool set = true);

301
        virtual void showToolBar(bool autohide = true) {Q_UNUSED(autohide);}
302

Claudio Valerio's avatar
Claudio Valerio committed
303 304 305 306 307 308 309 310
    signals:
        void showOnDisplayChanged(bool shown);
        void lockChanged(bool locked);

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

311 312 313 314
        virtual void showHide(bool show);
        virtual void lock(bool lock);
        virtual void duplicate();

315 316 317 318
        void increaseZLevelUp();
        void increaseZLevelDown();
        void increaseZlevelTop();
        void increaseZlevelBottom();
319

320 321
        void onZoomChanged();

Claudio Valerio's avatar
Claudio Valerio committed
322
    protected:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
323
        virtual void buildButtons();
Ilia Ryabokon's avatar
Ilia Ryabokon committed
324
        virtual void freeButtons();
Claudio Valerio's avatar
Claudio Valerio committed
325 326 327
        virtual void decorateMenu(QMenu *menu);
        virtual void updateMenuActionState();

328
        void showHideRecurs(const QVariant &pShow, QGraphicsItem *pItem);
329
        void setLockedRecurs(const QVariant &pLock, QGraphicsItem *pItem);
330

331
        QList<DelegateButton*> buttons() {return mButtons;}
Claudio Valerio's avatar
Claudio Valerio committed
332 333
        QGraphicsItem* mDelegated;

334
        //buttons from the top left section of delegate frame
Claudio Valerio's avatar
Claudio Valerio committed
335 336 337 338
        DelegateButton* mDeleteButton;
        DelegateButton* mDuplicateButton;
        DelegateButton* mMenuButton;

339 340 341 342
        //buttons from the bottom left section of delegate frame
        DelegateButton *mZOrderUpButton;
        DelegateButton *mZOrderDownButton;

Claudio Valerio's avatar
Claudio Valerio committed
343 344 345 346
        QMenu* mMenu;

        QAction* mLockAction;
        QAction* mShowOnDisplayAction;
347
        QAction* mSetAsBackgroundAction;
Claudio Valerio's avatar
Claudio Valerio committed
348 349 350 351 352 353 354
        QAction* mGotoContentSourceAction;

        UBGraphicsDelegateFrame* mFrame;
        qreal mFrameWidth;
        qreal mAntiScaleRatio;

        QList<DelegateButton*> mButtons;
355
        QList<DelegateButton*> mToolBarButtons;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
356 357
        UBGraphicsToolBarItem* mToolBarItem;

358
protected slots:
359
        virtual void setAsBackground();
360
        virtual void gotoContentSource();
361

362
private:
363 364 365
        void updateFrame();
        void updateButtons(bool showUpdated = false);

Claudio Valerio's avatar
Claudio Valerio committed
366 367 368
        QPointF mOffset;
        QTransform mPreviousTransform;
        QPointF mPreviousPosition;
369
        QPointF mDragStartPosition;
Claudio Valerio's avatar
Claudio Valerio committed
370 371 372
        qreal mPreviousZValue;
        QSizeF mPreviousSize;
        QMimeData* mMimeData;
373
        QPixmap mDragPixmap;
374

375
        bool mMoved;
376
        UBGraphicsFlags mFlags;
Claudio Valerio's avatar
Claudio Valerio committed
377 378 379 380
};


#endif /* UBGRAPHICSITEMDELEGATE_H_ */