18#include "layermanager.h"
23#include "layersound.h"
24#include "layerbitmap.h"
25#include "layervector.h"
26#include "layercamera.h"
32LayerManager::~LayerManager()
36bool LayerManager::init()
43 mLastCameraLayerIdx = 0;
51 o->data()->setCurrentLayer(editor()->currentLayerIndex());
55LayerCamera* LayerManager::getCameraLayerBelow(
int layerIndex)
const
57 return static_cast<LayerCamera*
>(object()->getLayerBelow(layerIndex, Layer::CAMERA));
60Layer* LayerManager::getLastCameraLayer()
62 Layer* layer = object()->getLayer(mLastCameraLayerIdx);
63 if (layer->type() == Layer::CAMERA)
69 std::vector<LayerCamera*> camLayers = object()->getLayersByType<
LayerCamera>();
70 if (camLayers.size() > 0)
77Layer* LayerManager::currentLayer()
79 Layer* layer = currentLayer(0);
80 Q_ASSERT(layer !=
nullptr);
84Layer* LayerManager::currentLayer(
int incr)
86 Q_ASSERT(
object() !=
nullptr);
87 return object()->getLayer(editor()->currentLayerIndex() + incr);
90Layer* LayerManager::getLayer(
int index)
92 Q_ASSERT(
object() !=
nullptr);
93 return object()->getLayer(index);
96Layer* LayerManager::findLayerByName(
QString sName, Layer::LAYER_TYPE type)
98 return object()->findLayerByName(sName, type);
101Layer* LayerManager::findLayerById(
int layerId)
const
103 return object()->findLayerById(layerId);
106int LayerManager::currentLayerIndex()
108 return editor()->currentLayerIndex();
111void LayerManager::setCurrentLayer(
int layerIndex)
113 Q_ASSERT(layerIndex >= 0);
114 Q_ASSERT(layerIndex <
object()->getLayerCount());
117 Layer* previousLayer = currentLayer();
118 if (previousLayer !=
object()->getLayer(layerIndex)) {
119 previousLayer->deselectAll();
122 emit currentLayerWillChange(layerIndex);
126 editor()->setCurrentLayerIndex(layerIndex);
127 emit currentLayerChanged(layerIndex);
129 if (
object()->getLayer(layerIndex)->type() == Layer::CAMERA)
131 mLastCameraLayerIdx = layerIndex;
135void LayerManager::setCurrentLayer(
Layer* layer)
137 setCurrentLayer(getIndex(layer));
140void LayerManager::gotoNextLayer()
142 if (editor()->currentLayerIndex() <
object()->getLayerCount() - 1)
144 currentLayer()->deselectAll();
145 editor()->setCurrentLayerIndex(editor()->currentLayerIndex() + 1);
146 emit currentLayerChanged(editor()->currentLayerIndex());
150void LayerManager::gotoPreviouslayer()
152 if (editor()->currentLayerIndex() > 0)
154 currentLayer()->deselectAll();
155 editor()->setCurrentLayerIndex(editor()->currentLayerIndex() - 1);
156 emit currentLayerChanged(editor()->currentLayerIndex());
169 for (
int i = 0; i < count(); i++)
171 sLayers.
append(getLayer(i)->name());
181 newName = QStringLiteral(
"%1 %2")
183 }
while (sLayers.
contains(newName));
189 Layer* layer =
nullptr;
192 layer = object()->addNewBitmapLayer();
195 layer = object()->addNewVectorLayer();
198 layer = object()->addNewSoundLayer();
201 layer = object()->addNewCameraLayer();
208 layer->setName(strLayerName);
209 emit layerCountChanged(count());
210 setCurrentLayer(getLastLayerIndex());
217 LayerBitmap* layer = object()->addNewBitmapLayer();
218 layer->setName(strLayerName);
220 emit layerCountChanged(count());
221 setCurrentLayer(getLastLayerIndex());
228 LayerVector* layer = object()->addNewVectorLayer();
229 layer->setName(strLayerName);
231 emit layerCountChanged(count());
232 setCurrentLayer(getLastLayerIndex());
239 LayerCamera* layer = object()->addNewCameraLayer();
240 layer->setName(strLayerName);
242 emit layerCountChanged(count());
243 setCurrentLayer(getLastLayerIndex());
250 LayerSound* layer = object()->addNewSoundLayer();
251 layer->setName(strLayerName);
253 emit layerCountChanged(count());
254 setCurrentLayer(getLastLayerIndex());
259int LayerManager::lastFrameAtFrame(
int frameIndex)
262 for (
int i = frameIndex; i >= 0; i -= 1)
264 for (
int layerIndex = 0; layerIndex < o->getLayerCount(); ++layerIndex)
266 auto pLayer = o->getLayer(layerIndex);
267 if (pLayer->keyExists(i))
276int LayerManager::firstKeyFrameIndex()
278 int minPosition = INT_MAX;
281 for (
int i = 0; i < o->getLayerCount(); ++i)
283 Layer* pLayer = o->getLayer(i);
285 int position = pLayer->firstKeyFramePosition();
286 if (position < minPosition)
288 minPosition = position;
294int LayerManager::count()
296 return object()->getLayerCount();
299bool LayerManager::canDeleteLayer(
int index)
const
304Status LayerManager::deleteLayer(
int index)
306 Layer* layer = object()->getLayer(index);
307 if (layer->type() == Layer::CAMERA)
309 std::vector<LayerCamera*> camLayers = object()->getLayersByType<
LayerCamera>();
310 if (camLayers.size() == 1)
311 return Status::ERROR_NEED_AT_LEAST_ONE_CAMERA_LAYER;
313 Q_ASSERT(
object()->getLayerCount() >= 2);
316 if (index ==
object()->getLayerCount() - 1 &&
317 index == currentLayerIndex())
319 setCurrentLayer(currentLayerIndex() - 1);
321 object()->deleteLayer(layer);
322 if (index >= currentLayerIndex())
325 setCurrentLayer(currentLayerIndex());
328 emit layerDeleted(index);
329 emit layerCountChanged(count());
336 if (newName.
isEmpty())
return Status::FAIL;
338 layer->setName(newName);
339 emit currentLayerChanged(getIndex(layer));
343void LayerManager::notifyLayerChanged(
Layer* layer)
345 emit currentLayerChanged(getIndex(layer));
357 for (
int i = 0; i < o->getLayerCount(); i++)
359 if (o->getLayer(i)->type() == Layer::SOUND)
364 Layer* soundLayer = o->getLayer(i);
365 soundLayer->foreachKeyFrame([&maxFrame](
KeyFrame* keyFrame)
367 int endPosition = keyFrame->pos() + (keyFrame->length() - 1);
368 if (endPosition > maxFrame)
370 maxFrame = endPosition;
376 int lastFramePos = o->getLayer(i)->getMaxKeyFramePosition();
377 if (lastFramePos > maxFrame)
379 maxFrame = lastFramePos;
391int LayerManager::getIndex(
Layer* layer)
const
393 const Object* o = object();
394 for (
int i = 0; i < o->getLayerCount(); ++i)
396 if (layer == o->getLayer(i))
int animationLength(bool includeSounds=true)
Get the length of current project.
Layer * createLayer(Layer::LAYER_TYPE type, const QString &strLayerName)
Returns a new Layer with the given LAYER_TYPE.
void notifyAnimationLengthChanged()
This should be emitted whenever the animation length frames, eg.
bool canDeleteLayer(int index) const
Allows you to check whether the layer at the given index can be deleted.
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
bool isEmpty() const const
QString number(int n, int base)
void append(const T &value)
bool contains(const T &value) const const