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 EDITOR_H
19 #define EDITOR_H
20 
21 #include <memory>
22 #include <QObject>
23 #include "pencilerror.h"
24 #include "pencildef.h"
25 
26 
27 class QDragEnterEvent;
28 class QDropEvent;
29 class QTemporaryDir;
30 class Object;
31 class KeyFrame;
32 class LayerCamera;
33 class MainWindow2;
34 class BaseManager;
35 class ColorManager;
36 class ToolManager;
37 class LayerManager;
38 class PlaybackManager;
39 class ViewManager;
40 class PreferenceManager;
41 class SelectionManager;
42 class SoundManager;
43 class ScribbleArea;
44 class TimeLine;
45 class BackupElement;
46 class ActiveFramePool;
47 
48 enum class SETTING;
49 
50 class Editor : public QObject
51 {
52     Q_OBJECT
53 
54         Q_PROPERTY(ColorManager*    color    READ color)
55         Q_PROPERTY(ToolManager*     tools    READ tools)
56         Q_PROPERTY(LayerManager*    layers   READ layers)
57         Q_PROPERTY(PlaybackManager* playback READ playback)
58         Q_PROPERTY(ViewManager*     view     READ view)
59         Q_PROPERTY(PreferenceManager* preference READ preference)
60         Q_PROPERTY(SoundManager*    sound    READ sound)
61         Q_PROPERTY(SelectionManager* select READ select)
62 
63 public:
64     explicit Editor(QObject* parent = nullptr);
65     ~Editor() override;
66 
67     bool init();
68 
69     /************************************************************************/
70     /* Managers                                                             */
71     /************************************************************************/
color()72     ColorManager*      color() const { return mColorManager; }
tools()73     ToolManager*       tools() const { return mToolManager; }
layers()74     LayerManager*      layers() const { return mLayerManager; }
playback()75     PlaybackManager*   playback() const { return mPlaybackManager; }
view()76     ViewManager*       view() const { return mViewManager; }
preference()77     PreferenceManager* preference() const { return mPreferenceManager; }
sound()78     SoundManager*      sound() const { return mSoundManager; }
select()79     SelectionManager*  select() const { return mSelectionManager; }
80 
object()81     Object* object() const { return mObject.get(); }
82     Status setObject(Object* object);
83     void updateObject();
84     void prepareSave();
85 
setScribbleArea(ScribbleArea * pScirbbleArea)86     void setScribbleArea(ScribbleArea* pScirbbleArea) { mScribbleArea = pScirbbleArea; }
getScribbleArea()87     ScribbleArea* getScribbleArea() { return mScribbleArea; }
88 
89     int currentFrame();
90     int fps();
91     void setFps(int fps);
92 
currentLayerIndex()93     int  currentLayerIndex() const { return mCurrentLayerIndex; }
94     void setCurrentLayerIndex(int i);
95 
96     void scrubTo(int frameNumber);
97 
98     /**
99      * @brief The visibility value should match any of the VISIBILITY enum values
100      */
101     void setLayerVisibility(LayerVisibility visibility);
102     LayerVisibility layerVisibility();
103 
104     qreal viewScaleInversed();
105     void deselectAll();
106     void selectAll();
107 
108     // backup
109     int mBackupIndex;
110     BackupElement* currentBackup();
111     QList<BackupElement*> mBackupList;
112 
113 signals:
114 
115     /** This should be emitted after scrubbing */
116     void scrubbed(int frameNumber);
117 
118     /** This should be emitted after modifying the frame content */
119     void frameModified(int frameNumber);
120 
121     /** This should be emitted after the object has been changed */
122     void objectChanged();
123 
124     /** This should be emitted after modifying multiple frames */
125     void framesModified();
126 
127     void updateTimeLine();
128     void updateLayerCount();
129     void updateBackup();
130 
131     void objectLoaded();
132 
133     void changeThinLinesButton(bool);
134     void fpsChanged(int fps);
135 
136     void needSave();
137     void needDisplayInfo(const QString& title, const QString& body);
138     void needDisplayInfoNoTitle(const QString& body);
139 
140 public: //slots
141 
142     /** Will call update() and update the canvas
143      * Only call this directly If you need the cache to be intact and require the frame to be repainted
144      * Convenient method that does the same as updateFrame but for the current frame
145     */
146     void updateCurrentFrame();
147 
148     /** Will call update() and update the canvas
149      * Only call this directly If you need the cache to be intact and require the frame to be repainted
150     */
151     void updateFrame(int frameNumber);
152 
153     void clearCurrentFrame();
154 
155     void cut();
156 
157     bool importImage(QString filePath);
158     bool importGIF(QString filePath, int numOfImages = 0);
159     void restoreKey();
160 
161     void scrubNextKeyFrame();
162     void scrubPreviousKeyFrame();
163     void scrubForward();
164     void scrubBackward();
165 
166     KeyFrame* addNewKey();
167     void removeKey();
168 
169     void notifyAnimationLengthChanged();
170     void switchVisibilityOfLayer(int layerNumber);
171     void swapLayers(int i, int j);
172     Status pegBarAlignment(QStringList layers);
173 
174     void backup(QString undoText);
175     void backup(int layerNumber, int frameNumber, QString undoText);
176     /**
177      * Restores integrity of the backup elements after a layer has been deleted.
178      * Removes backup elements affecting the deleted layer and adjusts the layer
179      * index on other backup elements as necessary.
180      *
181      * @param layerIndex The index of the layer that was deleted
182      *
183      * @warning This serves as a temporary hack to prevent crashes until #864 is done
184      *          (see #1412).
185      */
186     void sanitizeBackupElementsAfterLayerDeletion(int layerIndex);
187     void undo();
188     void redo();
189     void copy();
190 
191     void paste();
192     void clipboardChanged();
193     void increaseLayerVisibilityIndex();
194     void decreaseLayerVisibilityIndex();
195     void flipSelection(bool flipVertical);
196 
197     void toggleOnionSkinType();
198 
199     void clearTemporary();
200     void addTemporaryDir(QTemporaryDir* dir);
201 
202     void settingUpdated(SETTING);
203 
dontAskAutoSave(bool b)204     void dontAskAutoSave(bool b) { mAutosaveNeverAskAgain = b; }
autoSaveNeverAskAgain()205     bool autoSaveNeverAskAgain() const { return mAutosaveNeverAskAgain; }
206     void resetAutoSaveCounter();
207 
208     void createNewBitmapLayer(const QString& name);
209     void createNewVectorLayer(const QString& name);
210     void createNewSoundLayer(const QString& name);
211     void createNewCameraLayer(const QString& name);
212 
213 protected:
214     // Need to move to somewhere...
215     void dragEnterEvent(QDragEnterEvent*);
216     void dropEvent(QDropEvent*);
217 
218 private:
219     bool importBitmapImage(QString, int space = 0);
220     bool importVectorImage(QString);
221 
222     // the object to be edited by the editor
223     std::unique_ptr<Object> mObject;
224 
225     int mFrame = 1; // current frame number.
226     int mCurrentLayerIndex = 0; // the current layer to be edited/displayed
227 
228     ScribbleArea* mScribbleArea = nullptr;
229 
230     ColorManager*      mColorManager = nullptr;
231     ToolManager*       mToolManager = nullptr;
232     LayerManager*      mLayerManager = nullptr;
233     PlaybackManager*   mPlaybackManager = nullptr;
234     ViewManager*       mViewManager = nullptr;
235     PreferenceManager* mPreferenceManager = nullptr;
236     SoundManager*      mSoundManager = nullptr;
237     SelectionManager* mSelectionManager = nullptr;
238 
239     std::vector< BaseManager* > mAllManagers;
240 
241     bool mIsAutosave = true;
242     int mAutosaveNumber = 12;
243     int mAutosaveCounter = 0;
244     bool mAutosaveNeverAskAgain = false;
245 
246     void makeConnections();
247     KeyFrame* addKeyFrame(int layerNumber, int frameNumber);
248 
249     QList<QTemporaryDir*> mTemporaryDirs;
250 
251     // backup
252     void clearUndoStack();
253     void updateAutoSaveCounter();
254     int mLastModifiedFrame = -1;
255     int mLastModifiedLayer = -1;
256 
257     // clipboard
258     bool clipboardBitmapOk = true;
259     bool clipboardVectorOk = true;
260     bool clipboardSoundClipOk = true;
261 };
262 
263 #endif
264