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