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