1 /* 2 3 Pencil2D - Traditional Animation Software 4 Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon 5 Copyright (C) 2012-2020 Matthew Chiawen Chang 6 7 This program is free software; you can redistribute it and/or 8 modify it under the terms of the GNU General Public License 9 as published by the Free Software Foundation; version 2 of the License. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 */ 17 18 #ifndef TIMELINECELLS_H 19 #define TIMELINECELLS_H 20 21 #include <QString> 22 #include <QWidget> 23 #include "layercamera.h" 24 25 class Layer; 26 enum class LayerVisibility; 27 class TimeLine; 28 class QPaintEvent; 29 class QMouseEvent; 30 class QResizeEvent; 31 class Editor; 32 class PreferenceManager; 33 enum class SETTING; 34 35 enum class TIMELINE_CELL_TYPE 36 { 37 Layers, 38 Tracks 39 }; 40 41 class TimeLineCells : public QWidget 42 { 43 Q_OBJECT 44 45 public: 46 TimeLineCells( TimeLine* parent, Editor* editor, TIMELINE_CELL_TYPE ); 47 ~TimeLineCells() override; 48 49 int getLayerNumber(int y); 50 int getInbetweenLayerNumber(int y); 51 int getLayerY(int layerNumber); 52 int getFrameNumber(int x) const; 53 int getFrameX(int frameNumber) const; getMouseMoveY()54 int getMouseMoveY() const { return mMouseMoveY; } getOffsetX()55 static int getOffsetX() { return mOffsetX; } getOffsetY()56 static int getOffsetY() { return mOffsetY; } getLayerHeight()57 int getLayerHeight() const { return mLayerHeight; } 58 getFrameLength()59 int getFrameLength() const { return mFrameLength; } setFrameLength(int n)60 void setFrameLength(int n) { mFrameLength = n; } 61 void setFrameSize(int size); 62 getFrameSize()63 int getFrameSize() const { return mFrameSize; } clearCache()64 void clearCache() { delete mCache; mCache = new QPixmap( size() ); } 65 void paintLayerGutter(QPainter& painter); 66 bool didDetachLayer() const; getCurrentFrame()67 int getCurrentFrame() const { return mCurrentFrame; } 68 69 signals: 70 void mouseMovedY(int); 71 void lengthChanged(int); 72 void offsetChanged(int); 73 74 public slots: 75 void updateContent(); 76 void updateFrame(int frameNumber); 77 void hScrollChange(int); 78 void vScrollChange(int); 79 void setMouseMoveY(int x); 80 81 protected: 82 void trackScrubber(); 83 void drawContent(); 84 void paintOnionSkin(QPainter& painter); 85 void paintEvent(QPaintEvent* event) override; 86 void resizeEvent(QResizeEvent* event) override; 87 void mousePressEvent(QMouseEvent* event) override; 88 void mouseMoveEvent(QMouseEvent* event) override; 89 void mouseReleaseEvent(QMouseEvent* event) override; 90 void mouseDoubleClickEvent(QMouseEvent* event) override; 91 92 private slots: 93 void loadSetting(SETTING setting); 94 95 private: 96 void paintTrack(QPainter& painter, const Layer* layer, int x, int y, int width, int height, bool selected, int frameSize) const; 97 void paintFrames(QPainter& painter, const Layer* layer, QColor trackCol, int y, int height, bool selected, int frameSize) const; 98 void paintLabel(QPainter& painter, const Layer* layer, int x, int y, int height, int width, bool selected, LayerVisibility layerVisibility) const; 99 void paintSelection(QPainter& painter, int x, int y, int width, int height) const; 100 101 void editLayerProperties(Layer* layer) const; 102 void editLayerProperties(LayerCamera *layer) const; 103 void editLayerName(Layer* layer) const; 104 105 TimeLine* mTimeLine; 106 Editor* mEditor; // the editor for which this timeLine operates 107 PreferenceManager* mPrefs; 108 109 TIMELINE_CELL_TYPE mType; 110 111 QPixmap* mCache = nullptr; 112 bool mDrawFrameNumber = true; 113 bool mbShortScrub = false; 114 int mFrameLength = 1; 115 int mFrameSize = 0; 116 int mFontSize = 10; 117 bool mScrubbing = false; 118 int mLayerHeight = 20; 119 int mStartY = 0; 120 int mEndY = 0; 121 122 int mCurrentFrame = 0; 123 int mLastScrubFrame = 0; 124 125 int mFromLayer = 0; 126 int mToLayer = 1; 127 int mStartLayerNumber = -1; 128 int mStartFrameNumber = 0; 129 int mLastFrameNumber = -1; 130 int mMouseMoveY = 0; 131 int mPrevFrame = 0; 132 int mFrameOffset = 0; 133 int mLayerOffset = 0; 134 Qt::MouseButton primaryButton = Qt::NoButton; 135 136 bool mCanMoveFrame = false; 137 bool mMovingFrames = false; 138 139 bool mCanBoxSelect = false; 140 bool mBoxSelecting = false; 141 142 bool mClickSelecting = false; 143 144 const static int mOffsetX = 0; 145 const static int mOffsetY = 20; 146 const static int mLayerDetachThreshold = 5; 147 }; 148 149 #endif // TIMELINECELLS_H 150