UBGraphicsItemDelegate.h 8.68 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 46 47

        void setTransparentToMouseEvent(bool tr)
        {
            mIsTransparentToMouseEvent = tr;
        }

48
        void setFileName(const QString & fileName);
Claudio Valerio's avatar
Claudio Valerio committed
49

50 51 52
        void setSection(Qt::WindowFrameSection section) {mButtonAlignmentSection =  section;}
        Qt::WindowFrameSection getSection() const {return mButtonAlignmentSection;}

Claudio Valerio's avatar
Claudio Valerio committed
53 54
    protected:

55 56
        virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
        virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
Claudio Valerio's avatar
Claudio Valerio committed
57 58 59 60 61 62 63

        void modified();

    private:

        QGraphicsItem* mDelegated;

64
        QTime mPressedTime;
Claudio Valerio's avatar
Claudio Valerio committed
65
        bool mIsTransparentToMouseEvent;
66
        Qt::WindowFrameSection mButtonAlignmentSection;
Claudio Valerio's avatar
Claudio Valerio committed
67 68 69

    signals:
        void clicked (bool checked = false);
70
        void longClicked();
Claudio Valerio's avatar
Claudio Valerio committed
71 72 73

};

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
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
class MediaTimer: public QGraphicsRectItem
{
public:
    MediaTimer(QGraphicsItem * parent = 0);
    ~MediaTimer();

    char* getSegments(char);
    void addPoint(QPolygon&, const QPoint&);
    void init();
    void internalSetString(const QString& s);
    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 paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget);
    void display(const QString &str);
    void setNumDigits(int nDigits);

private:
    int ndigits;
    QString digitStr;
    QBitArray points;
    double val;


uint fill : 1;
uint shadow : 1;
uint smallPoint : 1;

};

105
class DelegateMediaControl: public QObject, public QGraphicsRectItem
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
106
{
107 108
    Q_OBJECT

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
    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);

132 133 134 135
    signals:
        void used();

    protected:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
        void seekToMousePos(QPointF mousePos);

        UBGraphicsMediaItem* mDelegate;
        bool mDisplayCurrentTime;

        qint64 mCurrentTimeInMs;
        qint64 mTotalTimeInMs;

    private:
        int mStartWidth;

        QRectF mSeecArea;
        QRectF mLCDTimerArea;

        MediaTimer *lcdTimer;
};

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
153 154 155 156
class UBGraphicsToolBarItem : public QGraphicsRectItem, public QObject
{
    public:
        UBGraphicsToolBarItem(QGraphicsItem * parent = 0);
root's avatar
root committed
157
        virtual ~UBGraphicsToolBarItem() {;}
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
158 159 160 161 162 163 164 165

        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
166 167 168 169
        void positionHandles();
        void update();

    private:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
170 171 172 173 174 175 176
        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget);

    private:
        bool mShifting;
        bool mVisible;
        int mMinWidth;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
177
        int mInitialHeight;
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
178 179
        QList<QGraphicsItem*> mItemsOnToolBar;
};
Claudio Valerio's avatar
Claudio Valerio committed
180 181 182

class UBGraphicsItemDelegate : public QObject
{
183
    Q_OBJECT
Claudio Valerio's avatar
Claudio Valerio committed
184 185

    public:
186
        UBGraphicsItemDelegate(QGraphicsItem* pDelegated, QObject * parent = 0,  bool respectRatio = true, bool canRotate = false, bool useToolBar = true);
Claudio Valerio's avatar
Claudio Valerio committed
187 188 189 190 191 192 193 194

        virtual ~UBGraphicsItemDelegate();

        void init();

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

197 198 199
        virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
        virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);

Claudio Valerio's avatar
Claudio Valerio committed
200 201
        virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change,
                const QVariant &value);
202
        virtual UBGraphicsScene *castUBGraphicsScene();
Claudio Valerio's avatar
Claudio Valerio committed
203

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

206
        QGraphicsItem* delegated();
Claudio Valerio's avatar
Claudio Valerio committed
207 208 209 210

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

        virtual void positionHandles();
211
        void setZOrderButtonsVisible(bool visible);
Claudio Valerio's avatar
Claudio Valerio committed
212 213 214 215 216 217 218 219 220 221 222 223

        void startUndoStep();
        void commitUndoStep();

        UBGraphicsDelegateFrame* frame() { return mFrame; }

        bool canRotate() { return mCanRotate; }
        bool isLocked();
        bool canDuplicate() { return mCanDuplicate; }

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

226 227 228
        void setFlippable(bool flippable);
        bool isFlippable();

shibakaneki's avatar
shibakaneki committed
229 230
        void setButtonsVisible(bool visible);

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
231 232 233 234
        UBGraphicsToolBarItem* getToolBarItem() const { return mToolBarItem; }

        qreal antiScaleRatio() const { return mAntiScaleRatio; }

Claudio Valerio's avatar
Claudio Valerio committed
235 236 237 238 239 240 241 242
    signals:
        void showOnDisplayChanged(bool shown);
        void lockChanged(bool locked);

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

243 244 245 246
        virtual void showHide(bool show);
        virtual void lock(bool lock);
        virtual void duplicate();

247 248 249 250
        void increaseZLevelUp();
        void increaseZLevelDown();
        void increaseZlevelTop();
        void increaseZlevelBottom();
251

Claudio Valerio's avatar
Claudio Valerio committed
252
    protected:
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
253
        virtual void buildButtons();
Claudio Valerio's avatar
Claudio Valerio committed
254 255 256 257 258
        virtual void decorateMenu(QMenu *menu);
        virtual void updateMenuActionState();

        QGraphicsItem* mDelegated;

259
        //buttons from the top left section of delegate frame
Claudio Valerio's avatar
Claudio Valerio committed
260 261 262 263
        DelegateButton* mDeleteButton;
        DelegateButton* mDuplicateButton;
        DelegateButton* mMenuButton;

264 265 266 267
        //buttons from the bottom left section of delegate frame
        DelegateButton *mZOrderUpButton;
        DelegateButton *mZOrderDownButton;

Claudio Valerio's avatar
Claudio Valerio committed
268 269 270 271 272 273 274 275 276 277 278 279
        QMenu* mMenu;

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

        UBGraphicsDelegateFrame* mFrame;
        qreal mFrameWidth;
        qreal mAntiScaleRatio;

        QList<DelegateButton*> mButtons;

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
280 281
        UBGraphicsToolBarItem* mToolBarItem;

282
protected slots:
Claudio Valerio's avatar
Claudio Valerio committed
283
        virtual void gotoContentSource(bool checked);
284

285
private:
286 287 288
        void updateFrame();
        void updateButtons(bool showUpdated = false);

Claudio Valerio's avatar
Claudio Valerio committed
289 290 291
        QPointF mOffset;
        QTransform mPreviousTransform;
        QPointF mPreviousPosition;
292
        QPointF mDragStartPosition;
Claudio Valerio's avatar
Claudio Valerio committed
293 294 295 296 297 298
        qreal mPreviousZValue;
        QSizeF mPreviousSize;
        bool mCanRotate;
        bool mCanDuplicate;
        bool mRespectRatio;
        QMimeData* mMimeData;
299
        QPixmap mDragPixmap;
300 301 302

        /** A boolean saying that this object can be flippable (mirror effect) */
        bool mFlippable;
303
        bool mToolBarUsed;
Claudio Valerio's avatar
Claudio Valerio committed
304 305 306 307
};


#endif /* UBGRAPHICSITEMDELEGATE_H_ */