UBGraphicsItemDelegate.h 9.38 KB
Newer Older
Claudio Valerio's avatar
Claudio Valerio committed
1
/*
Claudio Valerio's avatar
Claudio Valerio committed
2 3
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
Claudio Valerio's avatar
Claudio Valerio committed
4
 * the Free Software Foundation, either version 2 of the License, or
Claudio Valerio's avatar
Claudio Valerio committed
5
 * (at your option) any later version.
Claudio Valerio's avatar
Claudio Valerio committed
6
 *
7
 * This prograscenem is distributed in the hope that it will be useful,
Claudio Valerio's avatar
Claudio Valerio committed
8 9 10 11 12 13
 * 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 this program.  If not, see <http://www.gnu.org/licenses/>.
Claudio Valerio's avatar
Claudio Valerio committed
14 15 16 17 18 19 20 21 22 23
 */

#ifndef UBGRAPHICSITEMDELEGATE_H_
#define UBGRAPHICSITEMDELEGATE_H_

#include <QtGui>
#include <QtSvg>
#include <QMimeData>

#include "core/UB.h"
24
#include "core/UBSettings.h"
Claudio Valerio's avatar
Claudio Valerio committed
25 26 27

class QGraphicsSceneMouseEvent;
class QGraphicsItem;
28
class UBGraphicsScene;
Claudio Valerio's avatar
Claudio Valerio committed
29 30 31
class UBGraphicsProxyWidget;
class UBGraphicsDelegateFrame;
class UBGraphicsWidgetItem;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
32
class UBGraphicsMediaItem;
Claudio Valerio's avatar
Claudio Valerio committed
33 34 35

class DelegateButton: public QGraphicsSvgItem
{
36
    Q_OBJECT
Claudio Valerio's avatar
Claudio Valerio committed
37 38

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

41
        virtual ~DelegateButton();
Claudio Valerio's avatar
Claudio Valerio committed
42

43 44 45
        enum { Type = UBGraphicsItemType::DelegateButtonType };
        virtual int type() const { return Type; }

Claudio Valerio's avatar
Claudio Valerio committed
46 47 48 49 50
        void setTransparentToMouseEvent(bool tr)
        {
            mIsTransparentToMouseEvent = tr;
        }

51
        void setFileName(const QString & fileName);
Claudio Valerio's avatar
Claudio Valerio committed
52

53 54 55
        void setSection(Qt::WindowFrameSection section) {mButtonAlignmentSection =  section;}
        Qt::WindowFrameSection getSection() const {return mButtonAlignmentSection;}

Claudio Valerio's avatar
Claudio Valerio committed
56 57
    protected:

58 59
        virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
        virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
Claudio Valerio's avatar
Claudio Valerio committed
60 61 62 63 64 65 66

        void modified();

    private:

        QGraphicsItem* mDelegated;

67
        QTime mPressedTime;
Claudio Valerio's avatar
Claudio Valerio committed
68
        bool mIsTransparentToMouseEvent;
69
        Qt::WindowFrameSection mButtonAlignmentSection;
Claudio Valerio's avatar
Claudio Valerio committed
70 71 72

    signals:
        void clicked (bool checked = false);
73
        void longClicked();
Claudio Valerio's avatar
Claudio Valerio committed
74 75 76

};

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
77 78 79 80
/*
    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
81 82 83 84 85 86 87 88
class MediaTimer: public QGraphicsRectItem
{
public:
    MediaTimer(QGraphicsItem * parent = 0);
    ~MediaTimer();

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget);
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
89

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
90 91 92
    void display(const QString &str);

private:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
93 94 95 96 97 98 99 100 101 102 103

    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);
    void setNumDigits(int nDigits);

    static char segments [][8];

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
104 105 106 107 108
    int ndigits;
    QString digitStr;
    QBitArray points;
    double val;

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
109 110
    uint shadow : 1;
    uint smallPoint : 1;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
111 112
};

113
class DelegateMediaControl: public QObject, public QGraphicsRectItem
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
114
{
115 116
    Q_OBJECT

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
    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);
Aleksei Kanash's avatar
Aleksei Kanash committed
139
        QSizeF lcdAreaSize(){return mLCDTimerArea.size();}
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
140

141 142 143 144
    signals:
        void used();

    protected:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
145 146 147 148 149 150 151 152 153 154
        void seekToMousePos(QPointF mousePos);

        UBGraphicsMediaItem* mDelegate;
        bool mDisplayCurrentTime;

        qint64 mCurrentTimeInMs;
        qint64 mTotalTimeInMs;

    private:
        int mStartWidth;
155
        int mSeecAreaBorderHeight;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
156 157 158 159 160 161 162

        QRectF mSeecArea;
        QRectF mLCDTimerArea;

        MediaTimer *lcdTimer;
};

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
163 164 165 166
class UBGraphicsToolBarItem : public QGraphicsRectItem, public QObject
{
    public:
        UBGraphicsToolBarItem(QGraphicsItem * parent = 0);
root's avatar
root committed
167
        virtual ~UBGraphicsToolBarItem() {;}
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
168 169 170 171 172 173 174 175

        bool isVisibleOnBoard() const { return mVisible; }
        void setVisibleOnBoard(bool visible) { mVisible = visible; }
        bool isShifting() const { return mShifting; }
        void setShifting(bool shifting) { mShifting = shifting; } 
        QList<QGraphicsItem*> itemsOnToolBar() const { return mItemsOnToolBar; }
        void setItemsOnToolBar(QList<QGraphicsItem*> itemsOnToolBar) { mItemsOnToolBar = itemsOnToolBar;}
        int minWidth() { return mMinWidth; }
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
176 177
        void positionHandles();
        void update();
Aleksei Kanash's avatar
Aleksei Kanash committed
178
        int getElementsPadding(){return mElementsPadding;}
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
179 180

    private:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
181 182 183 184 185 186 187
        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget);

    private:
        bool mShifting;
        bool mVisible;
        int mMinWidth;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
188
        int mInitialHeight;
Aleksei Kanash's avatar
Aleksei Kanash committed
189
        int mElementsPadding;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
190 191
        QList<QGraphicsItem*> mItemsOnToolBar;
};
Claudio Valerio's avatar
Claudio Valerio committed
192 193 194

class UBGraphicsItemDelegate : public QObject
{
195
    Q_OBJECT
Claudio Valerio's avatar
Claudio Valerio committed
196 197

    public:
198
        UBGraphicsItemDelegate(QGraphicsItem* pDelegated, QObject * parent = 0,  bool respectRatio = true, bool canRotate = false, bool useToolBar = true);
Claudio Valerio's avatar
Claudio Valerio committed
199 200 201 202 203 204 205 206

        virtual ~UBGraphicsItemDelegate();

        void init();

        virtual bool mousePressEvent(QGraphicsSceneMouseEvent *event);
        virtual bool mouseMoveEvent(QGraphicsSceneMouseEvent *event);
        virtual bool mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
207
        virtual bool weelEvent(QGraphicsSceneWheelEvent *event);
Claudio Valerio's avatar
Claudio Valerio committed
208

209 210 211
        virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
        virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);

Claudio Valerio's avatar
Claudio Valerio committed
212 213
        virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change,
                const QVariant &value);
214
        virtual UBGraphicsScene *castUBGraphicsScene();
Claudio Valerio's avatar
Claudio Valerio committed
215

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

218
        QGraphicsItem* delegated();
Claudio Valerio's avatar
Claudio Valerio committed
219 220 221 222

        void setCanDuplicate(bool allow){ mCanDuplicate = allow; }

        virtual void positionHandles();
223
        void setZOrderButtonsVisible(bool visible);
Claudio Valerio's avatar
Claudio Valerio committed
224 225 226 227 228 229

        void startUndoStep();
        void commitUndoStep();

        UBGraphicsDelegateFrame* frame() { return mFrame; }

230 231
        bool canRotate() const { return mCanRotate; }
        bool isLocked() const;
Claudio Valerio's avatar
Claudio Valerio committed
232 233 234 235
        bool canDuplicate() { return mCanDuplicate; }

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

238
        void setFlippable(bool flippable);
239
        void setRotatable(bool pCanRotate);
240 241
        bool isFlippable();

shibakaneki's avatar
shibakaneki committed
242 243
        void setButtonsVisible(bool visible);

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
244 245 246
        UBGraphicsToolBarItem* getToolBarItem() const { return mToolBarItem; }

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

Claudio Valerio's avatar
Claudio Valerio committed
249 250 251 252 253 254 255 256
    signals:
        void showOnDisplayChanged(bool shown);
        void lockChanged(bool locked);

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

257 258 259 260
        virtual void showHide(bool show);
        virtual void lock(bool lock);
        virtual void duplicate();

261 262 263 264
        void increaseZLevelUp();
        void increaseZLevelDown();
        void increaseZlevelTop();
        void increaseZlevelBottom();
265

266 267
        void onZoomChanged();

Claudio Valerio's avatar
Claudio Valerio committed
268
    protected:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
269
        virtual void buildButtons();
Claudio Valerio's avatar
Claudio Valerio committed
270 271 272 273 274
        virtual void decorateMenu(QMenu *menu);
        virtual void updateMenuActionState();

        QGraphicsItem* mDelegated;

275
        //buttons from the top left section of delegate frame
Claudio Valerio's avatar
Claudio Valerio committed
276 277 278 279
        DelegateButton* mDeleteButton;
        DelegateButton* mDuplicateButton;
        DelegateButton* mMenuButton;

280 281 282 283
        //buttons from the bottom left section of delegate frame
        DelegateButton *mZOrderUpButton;
        DelegateButton *mZOrderDownButton;

Claudio Valerio's avatar
Claudio Valerio committed
284 285 286 287 288 289 290 291 292 293 294
        QMenu* mMenu;

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

        UBGraphicsDelegateFrame* mFrame;
        qreal mFrameWidth;
        qreal mAntiScaleRatio;

        QList<DelegateButton*> mButtons;
295
        QList<DelegateButton*> mToolBarButtons;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
296 297
        UBGraphicsToolBarItem* mToolBarItem;

298
protected slots:
Claudio Valerio's avatar
Claudio Valerio committed
299
        virtual void gotoContentSource(bool checked);
300

301
private:
302 303
        void updateFrame();
        void updateButtons(bool showUpdated = false);
304
        inline void showHideRecurs(const QVariant &pShow, QGraphicsItem *pItem);
305

Claudio Valerio's avatar
Claudio Valerio committed
306 307 308
        QPointF mOffset;
        QTransform mPreviousTransform;
        QPointF mPreviousPosition;
309
        QPointF mDragStartPosition;
Claudio Valerio's avatar
Claudio Valerio committed
310 311 312 313 314 315
        qreal mPreviousZValue;
        QSizeF mPreviousSize;
        bool mCanRotate;
        bool mCanDuplicate;
        bool mRespectRatio;
        QMimeData* mMimeData;
316
        QPixmap mDragPixmap;
317 318 319

        /** A boolean saying that this object can be flippable (mirror effect) */
        bool mFlippable;
320
        bool mToolBarUsed;
Claudio Valerio's avatar
Claudio Valerio committed
321 322 323 324
};


#endif /* UBGRAPHICSITEMDELEGATE_H_ */