19 #include <QApplication>
23 #include <QDomElement>
26 #include "timelinecells.h"
30 bool sortAsc(
int left,
int right)
35 Layer::Layer(
Object*
object, LAYER_TYPE eType) :
QObject(object)
37 Q_ASSERT(eType != UNDEFINED);
41 mName =
QString(tr(
"Undefined Layer"));
43 mId =
object->getUniqueLayerID();
48 for (
auto it : mKeyFrames)
56 void Layer::setObject(
Object* obj)
61 mId = mObject->getUniqueLayerID();
64 void Layer::foreachKeyFrame(std::function<
void(
KeyFrame*)> action)
const
66 for (
auto pair : mKeyFrames)
72 bool Layer::keyExists(
int position)
const
74 return (mKeyFrames.find(position) != mKeyFrames.end());
77 KeyFrame* Layer::getKeyFrameAt(
int position)
const
79 auto it = mKeyFrames.find(position);
80 if (it == mKeyFrames.end())
87 KeyFrame* Layer::getLastKeyFrameAtPosition(
int position)
const
93 auto it = mKeyFrames.lower_bound(position);
94 if (it == mKeyFrames.end())
101 int Layer::getPreviousKeyFramePosition(
int position)
const
103 auto it = mKeyFrames.upper_bound(position);
104 if (it == mKeyFrames.end())
106 return firstKeyFramePosition();
111 int Layer::getNextKeyFramePosition(
int position)
const
115 if (position < firstKeyFramePosition())
117 return firstKeyFramePosition();
120 auto it = mKeyFrames.lower_bound(position);
121 if (it == mKeyFrames.end())
123 return getMaxKeyFramePosition();
126 if (it != mKeyFrames.begin())
133 int Layer::getPreviousFrameNumber(
int position,
bool isAbsolute)
const
138 prevNumber = getPreviousKeyFramePosition(position);
140 prevNumber = position - 1;
142 if (prevNumber >= position)
149 int Layer::getNextFrameNumber(
int position,
bool isAbsolute)
const
154 nextNumber = getNextKeyFramePosition(position);
156 nextNumber = position + 1;
158 if (nextNumber <= position)
164 int Layer::firstKeyFramePosition()
const
166 if (!mKeyFrames.empty())
168 return mKeyFrames.rbegin()->first;
173 int Layer::getMaxKeyFramePosition()
const
175 if (!mKeyFrames.empty())
177 return mKeyFrames.begin()->first;
182 bool Layer::addNewKeyFrameAt(
int position)
184 if (position <= 0)
return false;
186 KeyFrame* key = createKeyFrame(position, mObject);
187 return addKeyFrame(position, key);
190 bool Layer::addKeyFrame(
int position,
KeyFrame* pKeyFrame)
192 Q_ASSERT(position > 0);
193 auto it = mKeyFrames.find(position);
194 if (it != mKeyFrames.end())
199 pKeyFrame->setPos(position);
200 mKeyFrames.insert(std::make_pair(position, pKeyFrame));
205 bool Layer::removeKeyFrame(
int position)
207 auto frame = getKeyFrameWhichCovers(position);
210 mKeyFrames.erase(frame->pos());
216 bool Layer::moveKeyFrameForward(
int position)
218 return swapKeyFrames(position, position + 1);
221 bool Layer::moveKeyFrameBackward(
int position)
225 return swapKeyFrames(position, position - 1);
230 bool Layer::swapKeyFrames(
int position1,
int position2)
232 bool keyPosition1 =
false;
233 bool keyPosition2 =
false;
237 if (keyExists(position1))
239 auto firstFrame = mKeyFrames.find(position1);
240 pFirstFrame = firstFrame->second;
242 mKeyFrames.erase(position1);
247 if (keyExists(position2))
249 auto secondFrame = mKeyFrames.find(position2);
250 pSecondFrame = secondFrame->second;
252 mKeyFrames.erase(position2);
259 pSecondFrame->setPos(position1);
260 mKeyFrames.insert(std::make_pair(position1, pSecondFrame));
262 else if (position1 == 1)
264 addNewKeyFrameAt(position1);
269 pFirstFrame->setPos(position2);
270 mKeyFrames.insert(std::make_pair(position2, pFirstFrame));
272 else if (position2 == 1)
274 addNewKeyFrameAt(position2);
278 pFirstFrame->modification();
281 pSecondFrame->modification();
288 auto it = mKeyFrames.find(pKey->pos());
289 if (it != mKeyFrames.end())
292 mKeyFrames.erase(it);
294 mKeyFrames.emplace(pKey->pos(), pKey);
305 for (
auto pair : mKeyFrames)
308 Status st = saveKeyFrameFile(keyFrame, sDataFolder);
312 if (!keyFrame->fileName().
isEmpty())
313 attachedFiles.
append(keyFrame->fileName());
318 dd.collect(st.details());
319 dd <<
QString(
"- Keyframe[%1] failed to save").
arg(keyFrame->pos());
325 return Status(Status::FAIL, dd);
330 void Layer::setModified(
int position,
bool modified)
332 KeyFrame* key = getKeyFrameAt(position);
335 key->setModified(modified);
339 bool Layer::isFrameSelected(
int position)
const
341 KeyFrame* keyFrame = getKeyFrameWhichCovers(position);
344 return mSelectedFrames_byLast.
contains(keyFrame->pos());
349 void Layer::setFrameSelected(
int position,
bool isSelected)
351 KeyFrame* keyFrame = getKeyFrameWhichCovers(position);
352 if (keyFrame !=
nullptr)
354 int startPosition = keyFrame->pos();
356 if (isSelected && !mSelectedFrames_byLast.
contains(startPosition))
359 mSelectedFrames_byLast.
insert(0, startPosition);
360 mSelectedFrames_byPosition.
append(startPosition);
364 std::sort(mSelectedFrames_byPosition.
begin(), mSelectedFrames_byPosition.
end(), sortAsc);
366 else if (!isSelected)
369 int iLast = mSelectedFrames_byLast.
indexOf(startPosition);
370 mSelectedFrames_byLast.
removeAt(iLast);
372 int iPos = mSelectedFrames_byPosition.
indexOf(startPosition);
373 mSelectedFrames_byPosition.
removeAt(iPos);
375 keyFrame->setSelected(isSelected);
379 void Layer::toggleFrameSelected(
int position,
bool allowMultiple)
381 bool wasSelected = isFrameSelected(position);
388 setFrameSelected(position, !wasSelected);
391 void Layer::extendSelectionTo(
int position)
393 if (mSelectedFrames_byLast.
count() > 0)
395 int lastSelected = mSelectedFrames_byLast[0];
399 if (lastSelected < position)
401 startPos = lastSelected;
407 endPos = lastSelected;
413 setFrameSelected(i,
true);
419 void Layer::selectAllFramesAfter(
int position)
421 int startPosition = position;
422 int endPosition = getMaxKeyFramePosition();
424 if (!keyExists(startPosition))
426 startPosition = getNextKeyFramePosition(startPosition);
429 if (startPosition > 0 && startPosition <= endPosition)
432 setFrameSelected(startPosition,
true);
433 extendSelectionTo(endPosition);
437 void Layer::deselectAll()
439 mSelectedFrames_byLast.
clear();
440 mSelectedFrames_byPosition.
clear();
442 for (
auto pair : mKeyFrames)
444 pair.second->setSelected(
false);
448 bool Layer::moveSelectedFrames(
int offset)
450 if (offset != 0 && mSelectedFrames_byPosition.
count() > 0)
453 int indexInSelection = mSelectedFrames_byPosition.
count() - 1;
459 indexInSelection = 0;
463 if (mSelectedFrames_byPosition[0] + offset < 1)
return false;
466 while (indexInSelection > -1 && indexInSelection < mSelectedFrames_byPosition.
count())
468 int fromPos = mSelectedFrames_byPosition[indexInSelection];
469 int toPos = fromPos + offset;
472 KeyFrame* selectedFrame = getKeyFrameAt(fromPos);
474 if (selectedFrame !=
nullptr)
476 mKeyFrames.erase(fromPos);
480 bool isBetween =
true;
481 int targetPosition = fromPos;
485 int framePosition = targetPosition - step;
487 KeyFrame* frame = getKeyFrameAt(framePosition);
489 if (frame !=
nullptr)
491 mKeyFrames.erase(framePosition);
493 frame->setPos(targetPosition);
494 mKeyFrames.insert(std::make_pair(targetPosition, frame));
497 targetPosition = targetPosition - step;
498 if (fromPos < toPos && (targetPosition < fromPos || targetPosition >= toPos))
500 if (fromPos > toPos && (targetPosition > fromPos || targetPosition <= toPos))
511 selectedFrame->setPos(toPos);
512 mKeyFrames.insert(std::make_pair(toPos, selectedFrame));
514 indexInSelection = indexInSelection + step;
518 for (
int i = 0; i < mSelectedFrames_byPosition.
count(); i++)
520 mSelectedFrames_byPosition[i] = mSelectedFrames_byPosition[i] + offset;
522 for (
int i = 0; i < mSelectedFrames_byLast.
count(); i++)
524 mSelectedFrames_byLast[i] = mSelectedFrames_byLast[i] + offset;
531 bool Layer::isPaintable()
const
533 return (type() == BITMAP || type() == VECTOR);
536 bool Layer::keyExistsWhichCovers(
int frameNumber)
538 return getKeyFrameWhichCovers(frameNumber) !=
nullptr;
541 KeyFrame* Layer::getKeyFrameWhichCovers(
int frameNumber)
const
543 auto keyFrame = getLastKeyFrameAtPosition(frameNumber);
544 if (keyFrame !=
nullptr)
546 if (keyFrame->pos() + keyFrame->length() > frameNumber)
564 void Layer::loadBaseDomElement(
const QDomElement& elem)
571 setName(elem.
attribute(
"name",
"untitled"));
QString attribute(const QString &name, const QString &defValue) const const
bool isNull() const const
int indexOf(const T &value, int from) const const
int count(const T &value) const const
void append(const T &value)
void setAttribute(const QString &name, const QString &value)
int toInt(bool *ok, int base) const const
bool isEmpty() const const
void setParent(QObject *parent)
bool contains(const T &value) const const
void insert(int i, const T &value)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QDomElement createElement(const QString &tagName)