1 #pragma once 2 3 #ifndef TFRAMEHANDLE_H 4 #define TFRAMEHANDLE_H 5 6 #include <QObject> 7 #include <QTime> 8 #include "tfilepath.h" 9 #include "toonz/txshsoundcolumn.h" 10 11 #include "tcommon.h" 12 13 #undef DVAPI 14 #undef DVVAR 15 #ifdef TOONZLIB_EXPORTS 16 #define DVAPI DV_EXPORT_API 17 #define DVVAR DV_EXPORT_VAR 18 #else 19 #define DVAPI DV_IMPORT_API 20 #define DVVAR DV_IMPORT_VAR 21 #endif 22 23 class TXshSoundColumn; 24 class TXsheet; 25 26 //============================================================================= 27 // TFrameHandle 28 //----------------------------------------------------------------------------- 29 30 class DVAPI TFrameHandle final : public QObject { 31 Q_OBJECT 32 33 public: 34 enum FrameType { SceneFrame, LevelFrame }; 35 36 private: 37 int m_frame; // valid if m_frameType == SceneFrame 38 TFrameId m_fid; // valid if m_frameType == LevelFrame 39 40 int m_sceneFrameSize, m_frame0, m_frame1; 41 42 std::vector<TFrameId> m_fids; 43 44 int m_timerId; 45 int m_previewFrameRate; 46 FrameType m_frameType; 47 bool m_looping, m_isPlaying; 48 49 // audio scrub 50 TXshSoundColumn *m_audioColumn; 51 TXsheet *m_xsheet; 52 std::pair<int, int> m_scrubRange; 53 double m_fps; 54 QTime m_clock; 55 56 // void startPlaying(bool looping); 57 // void stopPlaying(); 58 void setTimer(int frameRate); 59 60 bool scrub(int r0, int r1, double framePerSecond); 61 62 public: 63 TFrameHandle(); 64 ~TFrameHandle(); 65 66 void setCurrentFrame(int index); 67 68 // if m_frameType == SceneFrame 69 int getFrame() const; 70 void setFrame(int frame); // => m_frameType = SceneFrame 71 72 // if m_frameType == LevelFrame 73 TFrameId getFid() const; 74 void setFid(const TFrameId &id); // => m_frameType = LevelFrame 75 isPlaying()76 bool isPlaying() const { return m_isPlaying; } isScrubbing()77 bool isScrubbing() const { return m_scrubRange.first <= m_scrubRange.second; } 78 getFrameType()79 FrameType getFrameType() const { return m_frameType; } 80 // void setFrameType(FrameType frameType); 81 82 void scrubColumn(int r0, int r1, TXshSoundColumn *audioColumn, 83 double framePerSecond = 25); 84 void scrubXsheet(int r0, int r1, TXsheet *xsh, double framePerSecond = 25); 85 void stopScrubbing(); 86 isEditingLevel()87 bool isEditingLevel() const { return getFrameType() == LevelFrame; } isEditingScene()88 bool isEditingScene() const { return getFrameType() == SceneFrame; } 89 90 // i metodi seguenti funzionano sia con LevelFrame sia con SceneFrame 91 int getMaxFrameIndex() const; 92 int getFrameIndex() const; 93 QString getFrameIndexName(int index) const; 94 void setFrameIndex(int index); 95 void setFrameIndexByName(const QString &str); 96 setSceneFrameSize(int frameSize)97 void setSceneFrameSize(int frameSize) { m_sceneFrameSize = frameSize; } setFrameRange(int f0,int f1)98 void setFrameRange(int f0, int f1) { 99 m_frame0 = f0; 100 m_frame1 = f1; 101 } setFrameIds(const std::vector<TFrameId> & fids)102 void setFrameIds(const std::vector<TFrameId> &fids) { m_fids = fids; } getStartFrame()103 int getStartFrame() { return m_frame0; } getEndFrame()104 int getEndFrame() { return m_frame1; } 105 emitTriggerNextKeyframe(QWidget * panel)106 void emitTriggerNextKeyframe(QWidget *panel) { 107 emit triggerNextKeyframe(panel); 108 } emitTriggerPrevKeyframe(QWidget * panel)109 void emitTriggerPrevKeyframe(QWidget *panel) { 110 emit triggerPrevKeyframe(panel); 111 } 112 113 public slots: 114 115 void nextFrame(TFrameId = 0); 116 void prevFrame(); 117 void firstFrame(); 118 void lastFrame(); 119 void setPlaying(bool isPlaying); 120 121 signals: 122 void frameSwitched(); 123 void scrubStarted(); 124 void scrubStopped(); 125 void frameTypeChanged(); 126 void isPlayingStatusChanged(); 127 128 void triggerNextKeyframe(QWidget *panel); 129 void triggerPrevKeyframe(QWidget *panel); 130 131 protected: 132 void timerEvent(QTimerEvent *event) override; 133 }; 134 135 #endif // TFRAMEHANDLE_H 136