18#include "timelinecells.h"
20#include <QApplication>
21#include <QResizeEvent>
22#include <QInputDialog>
24#include <QRegularExpression>
28#include "camerapropertiesdialog.h"
31#include "layermanager.h"
32#include "viewmanager.h"
34#include "playbackmanager.h"
35#include "preferencemanager.h"
36#include "undoredomanager.h"
39#include "cameracontextmenu.h"
41TimeLineCells::TimeLineCells(
TimeLine* parent,
Editor* editor, TIMELINE_CELL_TYPE type) :
QWidget(parent)
45 mPrefs = editor->preference();
48 mFrameLength = mPrefs->getInt(SETTING::TIMELINE_SIZE);
49 mFontSize = mPrefs->getInt(SETTING::LABEL_FONT_SIZE);
50 mFrameSize = mPrefs->getInt(SETTING::FRAME_SIZE);
51 mbShortScrub = mPrefs->isOn(SETTING::SHORT_SCRUB);
52 mDrawFrameNumber = mPrefs->isOn(SETTING::DRAW_LABEL);
54 setMinimumSize(500, 4 * mLayerHeight);
57 setMouseTracking(
true);
59 connect(mPrefs, &PreferenceManager::optionChanged,
this, &TimeLineCells::loadSetting);
62TimeLineCells::~TimeLineCells()
67void TimeLineCells::loadSetting(SETTING setting)
71 case SETTING::TIMELINE_SIZE:
72 mFrameLength = mPrefs->getInt(SETTING::TIMELINE_SIZE);
73 mTimeLine->updateLength();
75 case SETTING::LABEL_FONT_SIZE:
76 mFontSize = mPrefs->getInt(SETTING::LABEL_FONT_SIZE);
78 case SETTING::FRAME_SIZE:
79 mFrameSize = mPrefs->getInt(SETTING::FRAME_SIZE);
80 mTimeLine->updateLength();
82 case SETTING::SHORT_SCRUB:
83 mbShortScrub = mPrefs->isOn(SETTING::SHORT_SCRUB);
85 case SETTING::DRAW_LABEL:
86 mDrawFrameNumber = mPrefs->isOn(SETTING::DRAW_LABEL);
95int TimeLineCells::getFrameNumber(
int x)
const
97 return mFrameOffset + 1 + (
x - mOffsetX) / mFrameSize;
100int TimeLineCells::getFrameX(
int frameNumber)
const
102 return mOffsetX + (frameNumber - mFrameOffset) * mFrameSize;
105void TimeLineCells::setFrameSize(
int size)
108 mPrefs->set(SETTING::FRAME_SIZE, mFrameSize);
112int TimeLineCells::getLayerNumber(
int y)
const
114 int layerNumber = mLayerOffset + (
y - mOffsetY) / mLayerHeight;
116 int totalLayerCount = mEditor->object()->getLayerCount();
120 if (layerNumber <= totalLayerCount)
121 layerNumber = (totalLayerCount - 1) - layerNumber;
130 if (layerNumber >= totalLayerCount)
132 layerNumber = totalLayerCount;
137 if (layerNumber < -1)
144int TimeLineCells::getInbetweenLayerNumber(
int y)
const {
145 int layerNumber = getLayerNumber(
y);
147 if(layerNumber != mFromLayer) {
148 if(mMouseMoveY > 0 &&
y < getLayerY(layerNumber) + mLayerHeight / 2) {
151 else if(mMouseMoveY < 0 && y > getLayerY(layerNumber) + mLayerHeight / 2) {
158int TimeLineCells::getLayerY(
int layerNumber)
const
160 return mOffsetY + (mEditor->object()->getLayerCount() - 1 - layerNumber - mLayerOffset)*mLayerHeight;
163void TimeLineCells::updateFrame(
int frameNumber)
165 int x = getFrameX(frameNumber);
169void TimeLineCells::updateContent()
171 mRedrawContent =
true;
175bool TimeLineCells::didDetachLayer()
const {
176 return abs(mMouseMoveY) > mLayerDetachThreshold;
179void TimeLineCells::showCameraMenu(
QPoint pos)
181 int frameNumber = getFrameNumber(
pos.x());
183 const Layer* curLayer = mEditor->layers()->currentLayer();
187 if (curLayer->type() != Layer::CAMERA || !curLayer->keyExists(frameNumber))
192 mHighlightFrameEnabled =
true;
193 mHighlightedFrame = frameNumber;
198 mHighlightFrameEnabled =
false;
199 mHighlightedFrame = -1;
202 KeyFrame* key = curLayer->getKeyFrameAt(frameNumber);
203 if (key->isModified()) {
214void TimeLineCells::drawContent()
216 if (mCache ==
nullptr)
234 const int widgetWidth =
width();
237 const Object*
object = mEditor->object();
238 Q_ASSERT(
object !=
nullptr);
239 for (
int i = 0; i <
object->getLayerCount(); i++)
241 if (i == mEditor->layers()->currentLayerIndex())
245 const Layer* layeri =
object->getLayer(i);
247 if (layeri !=
nullptr)
249 const int layerY = getLayerY(i);
252 case TIMELINE_CELL_TYPE::Tracks:
253 paintTrack(painter, layeri, mOffsetX,
254 layerY, widgetWidth - mOffsetX,
255 mLayerHeight,
false, mFrameSize);
258 case TIMELINE_CELL_TYPE::Layers:
259 paintLabel(painter, layeri, 0,
260 layerY, widgetWidth - 1,
261 mLayerHeight,
false, mEditor->layerVisibility());
268 const Layer* currentLayer = mEditor->layers()->currentLayer();
269 if (didDetachLayer())
271 int layerYMouseMove = getLayerY(mEditor->layers()->currentLayerIndex()) + mMouseMoveY;
272 if (mType == TIMELINE_CELL_TYPE::Tracks)
274 paintTrack(painter, currentLayer,
275 mOffsetX, layerYMouseMove,
276 widgetWidth - mOffsetX, mLayerHeight,
279 else if (mType == TIMELINE_CELL_TYPE::Layers)
281 paintLabel(painter, currentLayer,
283 widgetWidth - 1, mLayerHeight,
true, mEditor->layerVisibility());
285 paintLayerGutter(painter);
290 if (mType == TIMELINE_CELL_TYPE::Tracks)
295 getLayerY(mEditor->layers()->currentLayerIndex()),
296 widgetWidth - mOffsetX,
301 else if (mType == TIMELINE_CELL_TYPE::Layers)
306 getLayerY(mEditor->layers()->currentLayerIndex()),
310 mEditor->layerVisibility());
317 painter.drawRect(
QRect(0, 0,
width() - 1, mOffsetY - 1));
321 painter.drawLine(0, mOffsetY - 2,
width() - 1, mOffsetY - 2);
323 if (mType == TIMELINE_CELL_TYPE::Layers)
327 if (mEditor->layerVisibility() == LayerVisibility::CURRENTONLY)
331 else if (mEditor->layerVisibility() == LayerVisibility::RELATED)
335 painter.setBrush(color);
337 else if (mEditor->layerVisibility() == LayerVisibility::ALL)
342 painter.drawEllipse(6, 4, 9, 9);
345 else if (mType == TIMELINE_CELL_TYPE::Tracks)
349 for (
int i = 0; i <
object->getLayerCount(); i++) {
350 paintSelectedFrames(painter, object->getLayer(i), i);
353 mRedrawContent =
false;
356void TimeLineCells::paintTicks(
QPainter& painter,
const QPalette& palette)
const
360 int fps = mEditor->playback()->fps();
361 for (
int i = mFrameOffset; i < mFrameOffset + (
width() - mOffsetX) / mFrameSize; i++)
364 const int lineX = getFrameX(i) + 1;
365 if (i + 1 >= mTimeLine->getRangeLower() && i < mTimeLine->getRangeUpper())
370 painter.
drawRect(lineX, 1, mFrameSize + 1, 2);
377 if (i % fps == 0 || i % fps == fps / 2)
379 painter.
drawLine(lineX, 1, lineX, 5);
383 painter.
drawLine(lineX, 1, lineX, 3);
385 if (i == 0 || i % fps == fps - 1)
387 int incr = (i < 9) ? 4 : 0;
393void TimeLineCells::paintTrack(
QPainter& painter,
const Layer* layer,
394 int x,
int y,
int width,
int height,
395 bool selected,
int frameSize)
const
400 if (layer->type() == Layer::BITMAP) col =
QColor(51, 155, 252);
401 if (layer->type() == Layer::VECTOR) col =
QColor(70, 205, 123);
402 if (layer->type() == Layer::SOUND) col =
QColor(255, 141, 112);
403 if (layer->type() == Layer::CAMERA) col =
QColor(253, 202, 92);
405 if (!layer->visible()) col.
setAlpha(64);
412 if (!layer->visible())
427 linearGrad.setColorAt(0,
QColor(255,255,255,150));
428 linearGrad.setColorAt(1,
QColor(0,0,0,0));
440void TimeLineCells::paintFrames(
QPainter& painter,
QColor trackCol,
const Layer* layer,
int y,
int height,
bool selected,
int frameSize)
const
447 int recHeight =
height - 4;
449 const QList<int> selectedFrames = layer->getSelectedFramesByPos();
450 layer->foreachKeyFrame([&](
KeyFrame* key)
452 int framePos = key->pos();
453 int recWidth = standardWidth;
454 int recLeft = getFrameX(framePos) - recWidth;
457 if (selectedFrames.
contains(framePos)) {
461 if (key->length() > 1)
477 painter.
drawRect(recLeft, recTop, recWidth, recHeight);
481void TimeLineCells::paintCurrentFrameBorder(
QPainter &painter,
int recLeft,
int recTop,
int recWidth,
int recHeight)
const
486 painter.
drawRect(recLeft, recTop, recWidth, recHeight);
490void TimeLineCells::paintFrameCursorOnCurrentLayer(
QPainter &painter,
int recTop,
int recWidth,
int recHeight)
const
492 int recLeft = getFrameX(mFramePosMoveX) - recWidth;
502 painter.
drawRect(recLeft, recTop, recWidth, recHeight);
506void TimeLineCells::paintHighlightedFrame(
QPainter& painter,
int framePos,
int recTop,
int recWidth,
int recHeight)
const
508 int recLeft = getFrameX(framePos) - recWidth;
516 painter.
drawRect(recLeft+1, recTop+1, recWidth-1, recHeight-1);
520void TimeLineCells::paintSelectedFrames(
QPainter& painter,
const Layer* layer,
const int layerIndex)
const
522 int mouseX = mMouseMoveX;
523 int posUnderCursor = getFrameNumber(mMousePressX);
524 int standardWidth = mFrameSize - 2;
525 int recWidth = standardWidth;
526 int recHeight = mLayerHeight - 4;
527 int recTop = getLayerY(layerIndex) + 1;
530 for (
int framePos : layer->getSelectedFramesByPos()) {
532 KeyFrame* key = layer->getKeyFrameAt(framePos);
533 if (key->length() > 1)
537 recWidth = mFrameSize * key->length();
543 int frameX = getFrameX(framePos);
545 int offset = (framePos - posUnderCursor) + mFrameOffset;
546 int newFrameX = getFrameX(getFrameNumber(getFrameX(offset)+mouseX)) - standardWidth;
548 painter.
drawRect(newFrameX, recTop-4, recWidth, recHeight);
551 int currentFrameX = frameX - standardWidth;
552 painter.
drawRect(currentFrameX, recTop, recWidth, recHeight);
558void TimeLineCells::paintLabel(
QPainter& painter,
const Layer* layer,
559 int x,
int y,
int width,
int height,
560 bool selected, LayerVisibility layerVisibility)
const
575 if (!layer->visible())
581 if ((layerVisibility == LayerVisibility::ALL) || selected)
585 else if (layerVisibility == LayerVisibility::CURRENTONLY)
589 else if (layerVisibility == LayerVisibility::RELATED)
608 if (layer->type() == Layer::BITMAP) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-bitmap.svg"));
609 if (layer->type() == Layer::VECTOR) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-vector.svg"));
610 if (layer->type() == Layer::SOUND) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-sound.svg"));
611 if (layer->type() == Layer::CAMERA) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-camera.svg"));
624void TimeLineCells::paintSelection(
QPainter& painter,
int x,
int y,
int width,
int height)
const
627 linearGrad.setColorAt(0,
QColor(0, 0, 0, 255));
628 linearGrad.setColorAt(1,
QColor(255, 255, 255, 0));
637void TimeLineCells::paintLayerGutter(
QPainter& painter)
const
640 if (mMouseMoveY > mLayerDetachThreshold)
642 painter.
drawRect(0, getLayerY(getInbetweenLayerNumber(mEndY))+mLayerHeight,
width(), 2);
646 painter.
drawRect(0, getLayerY(getInbetweenLayerNumber(mEndY)),
width(), 2);
650void TimeLineCells::paintOnionSkin(
QPainter& painter)
const
652 Layer* layer = mEditor->layers()->currentLayer();
653 if (layer ==
nullptr) {
return; }
655 int frameNumber = mEditor->currentFrame();
657 int prevOnionSkinCount = mEditor->preference()->getInt(SETTING::ONION_PREV_FRAMES_NUM);
658 int nextOnionSkinCount = mEditor->preference()->getInt(SETTING::ONION_NEXT_FRAMES_NUM);
660 bool isAbsolute = (mEditor->preference()->getString(SETTING::ONION_TYPE) ==
"absolute");
662 if (mEditor->preference()->isOn(SETTING::PREV_ONION) && prevOnionSkinCount > 0)
664 int onionFrameNumber = frameNumber;
667 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber+1,
true);
669 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber, isAbsolute);
670 int onionPosition = 0;
672 while (onionPosition < prevOnionSkinCount && onionFrameNumber > 0)
682 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber, isAbsolute);
687 if (mEditor->preference()->isOn(SETTING::NEXT_ONION) && nextOnionSkinCount > 0) {
689 int onionFrameNumber = layer->getNextFrameNumber(frameNumber, isAbsolute);
690 int onionPosition = 0;
692 while (onionPosition < nextOnionSkinCount && onionFrameNumber > 0)
702 onionFrameNumber = layer->getNextFrameNumber(onionFrameNumber, isAbsolute);
713 bool isPlaying = mEditor->playback()->isPlaying();
714 if (mCache ==
nullptr || mRedrawContent || trackScrubber())
723 if (mType == TIMELINE_CELL_TYPE::Tracks)
726 paintOnionSkin(painter);
729 int currentFrame = mEditor->currentFrame();
730 Layer* currentLayer = mEditor->layers()->currentLayer();
731 KeyFrame* keyFrame = currentLayer->getKeyFrameWhichCovers(currentFrame);
732 if (keyFrame !=
nullptr)
734 int recWidth = keyFrame->length() == 1 ? mFrameSize - 2 : mFrameSize * keyFrame->length();
735 int recLeft = getFrameX(keyFrame->pos()) - (mFrameSize - 2);
736 paintCurrentFrameBorder(painter, recLeft, getLayerY(mEditor->currentLayerIndex()) + 1, recWidth, mLayerHeight - 4);
739 if (!mMovingFrames && mLayerPosMoveY != -1 && mLayerPosMoveY == mEditor->currentLayerIndex())
742 int recTop = getLayerY(mLayerPosMoveY) + 1;
743 int standardWidth = mFrameSize - 2;
744 int recHeight = mLayerHeight - 4;
746 if (mHighlightFrameEnabled)
748 paintHighlightedFrame(painter, mHighlightedFrame, recTop, standardWidth, recHeight);
750 if (currentLayer->visible())
752 paintFrameCursorOnCurrentLayer(painter, recTop, standardWidth, recHeight);
757 if (currentFrame > mFrameOffset)
764 int currentFrameStartX = getFrameX(currentFrame - 1) + 1;
765 int currentFrameEndX = getFrameX(currentFrame);
775 bool mouseUnderScrubber = currentFrame == mFramePosMoveX;
776 if (mouseUnderScrubber) {
778 QPen pen = scrubColor;
788 int incr = (currentFrame < 10) ? 4 : 0;
800 emit lengthChanged(getFrameLength());
803bool TimeLineCells::event(
QEvent* event)
812void TimeLineCells::mousePressEvent(
QMouseEvent* event)
814 int frameNumber = getFrameNumber(event->
pos().
x());
815 int layerNumber = getLayerNumber(event->
pos().
y());
816 mCurrentLayerNumber = layerNumber;
818 mMousePressX =
event->pos().x();
819 mFromLayer = mToLayer = layerNumber;
821 mStartY =
event->pos().y();
822 mStartLayerNumber = layerNumber;
823 mEndY =
event->pos().y();
825 mStartFrameNumber = frameNumber;
826 mLastFrameNumber = mStartFrameNumber;
828 mCanMoveFrame =
false;
829 mMovingFrames =
false;
831 mCanBoxSelect =
false;
832 mBoxSelecting =
false;
834 mClickSelecting =
false;
836 primaryButton =
event->button();
840 case TIMELINE_CELL_TYPE::Layers:
841 if (layerNumber != -1 && layerNumber < mEditor->
object()->getLayerCount())
843 if (event->
pos().
x() < 15)
845 mEditor->switchVisibilityOfLayer(layerNumber);
847 else if (mEditor->currentLayerIndex() != layerNumber)
849 mEditor->layers()->setCurrentLayer(layerNumber);
850 mEditor->layers()->currentLayer()->deselectAll();
853 if (layerNumber == -1)
855 if (event->
pos().
x() < 15)
858 mEditor->increaseLayerVisibilityIndex();
860 mEditor->decreaseLayerVisibilityIndex();
865 case TIMELINE_CELL_TYPE::Tracks:
868 mLastFrameNumber = getFrameNumber(event->
pos().
x());
872 if (frameNumber == mEditor->currentFrame() && mStartY < 20)
874 if (mEditor->playback()->isPlaying())
876 mEditor->playback()->stop();
878 mTimeLine->scrubbing =
true;
882 if ((layerNumber != -1) && layerNumber < mEditor->
object()->getLayerCount())
884 int previousLayerNumber = mEditor->layers()->currentLayerIndex();
886 if (previousLayerNumber != layerNumber)
888 Layer *previousLayer = mEditor->object()->getLayer(previousLayerNumber);
889 previousLayer->deselectAll();
890 emit mEditor->selectedFramesChanged();
891 mEditor->layers()->setCurrentLayer(layerNumber);
894 Layer *currentLayer = mEditor->object()->getLayer(layerNumber);
900 mClickSelecting =
true;
901 mCanMoveFrame =
true;
903 currentLayer->selectAllFramesAfter(frameNumber);
904 emit mEditor->selectedFramesChanged();
907 else if (!currentLayer->isFrameSelected(frameNumber))
910 mCanBoxSelect =
true;
911 mClickSelecting =
true;
918 currentLayer->toggleFrameSelected(frameNumber,
true);
919 emit mEditor->selectedFramesChanged();
924 currentLayer->extendSelectionTo(frameNumber);
925 emit mEditor->selectedFramesChanged();
930 currentLayer->toggleFrameSelected(frameNumber,
false);
931 emit mEditor->selectedFramesChanged();
938 showCameraMenu(event->
pos());
947 showCameraMenu(event->
pos());
950 mCanMoveFrame =
true;
953 if (currentLayer->hasAnySelectedFrames()) {
954 emit selectionChanged();
957 mTimeLine->updateContent();
963 if (mEditor->playback()->isPlaying())
965 mEditor->playback()->stop();
967 if (mEditor->playback()->getSoundScrubActive() && mLastScrubFrame != frameNumber)
969 mEditor->playback()->playScrub(frameNumber);
970 mLastScrubFrame = frameNumber;
973 mEditor->scrubTo(frameNumber);
975 mTimeLine->scrubbing =
true;
976 qDebug(
"Scrub to %d frame", frameNumber);
985void TimeLineCells::mouseMoveEvent(
QMouseEvent* event)
987 mMouseMoveX =
event->pos().x();
988 mFramePosMoveX = getFrameNumber(mMouseMoveX);
989 mLayerPosMoveY = getLayerNumber(event->
pos().
y());
991 if (mType == TIMELINE_CELL_TYPE::Layers)
994 mEndY =
event->pos().y();
995 emit mouseMovedY(mEndY - mStartY);
998 else if (mType == TIMELINE_CELL_TYPE::Tracks)
1002 mFrameOffset = qMin(qMax(0, mFrameLength -
width() / getFrameSize()), qMax(0, mFrameOffset + mLastFrameNumber - mFramePosMoveX));
1004 emit offsetChanged(mFrameOffset);
1008 if (mTimeLine->scrubbing)
1010 if (mEditor->playback()->getSoundScrubActive() && mLastScrubFrame != mFramePosMoveX)
1012 mEditor->playback()->playScrub(mFramePosMoveX);
1013 mLastScrubFrame = mFramePosMoveX;
1015 mEditor->scrubTo(mFramePosMoveX);
1020 if (mStartLayerNumber != -1 && mStartLayerNumber < mEditor->
object()->getLayerCount())
1022 Layer *currentLayer = mEditor->object()->getLayer(mStartLayerNumber);
1025 if (mCanMoveFrame) {
1028 mMovingFrames =
true;
1030 else if (mCanBoxSelect)
1033 mBoxSelecting =
true;
1035 currentLayer->deselectAll();
1036 currentLayer->setFrameSelected(mStartFrameNumber,
true);
1037 currentLayer->extendSelectionTo(mFramePosMoveX);
1038 emit mEditor->selectedFramesChanged();
1040 mLastFrameNumber = mFramePosMoveX;
1050void TimeLineCells::mouseReleaseEvent(
QMouseEvent* event)
1052 if (event->
button() != primaryButton)
return;
1054 int frameNumber = getFrameNumber(event->
pos().
x());
1055 if (frameNumber < 1) frameNumber = 1;
1056 int layerNumber = getLayerNumber(event->
pos().
y());
1058 if (mType == TIMELINE_CELL_TYPE::Tracks && mCurrentLayerNumber != -1 && primaryButton !=
Qt::MiddleButton)
1061 Layer* currentLayer = mEditor->layers()->getLayer(mCurrentLayerNumber);
1062 Q_ASSERT(currentLayer);
1066 int posUnderCursor = getFrameNumber(mMousePressX);
1067 int offset = frameNumber - posUnderCursor;
1070 SAVESTATE_ID saveStateId = mEditor->undoRedo()->
createState(UndoRedoRecordType::KEYFRAME_MOVE);
1073 mEditor->undoRedo()->
addUserState(saveStateId, userState);
1075 currentLayer->moveSelectedFrames(offset);
1076 mEditor->undoRedo()->
record(saveStateId,
tr(
"Move Frames"));
1082 else if (!mTimeLine->scrubbing && !mMovingFrames && !mClickSelecting && !mBoxSelecting)
1088 currentLayer->toggleFrameSelected(frameNumber, multipleSelection);
1089 emit mEditor->selectedFramesChanged();
1093 if (mType == TIMELINE_CELL_TYPE::Layers && !mScrollingVertically && layerNumber != mStartLayerNumber && mStartLayerNumber != -1 && layerNumber != -1)
1095 mToLayer = getInbetweenLayerNumber(event->
pos().
y());
1096 if (mToLayer != mFromLayer && mToLayer > -1 && mToLayer < mEditor->layers()->count())
1099 if (mToLayer < mFromLayer)
1101 for (
int i = mFromLayer - 1; i >= mToLayer; i--)
1102 mEditor->swapLayers(i, i + 1);
1106 for (
int i = mFromLayer + 1; i <= mToLayer; i++)
1107 mEditor->swapLayers(i, i - 1);
1114 emit mouseMovedY(0);
1119 mTimeLine->scrubbing =
false;
1120 mMovingFrames =
false;
1123void TimeLineCells::mouseDoubleClickEvent(
QMouseEvent* event)
1125 int frameNumber = getFrameNumber(event->
pos().
x());
1126 int layerNumber = getLayerNumber(event->
pos().
y());
1129 if (event->
pos().
y() < 20 && (mType != TIMELINE_CELL_TYPE::Layers || event->
pos().
x() >= 15))
1131 mPrefs->set(SETTING::SHORT_SCRUB, !mbShortScrub);
1135 Layer* layer = mEditor->object()->getLayer(layerNumber);
1138 if (mType == TIMELINE_CELL_TYPE::Tracks && (layerNumber != -1) && (frameNumber > 0) && layerNumber < mEditor->
object()->getLayerCount())
1140 if (!layer->keyExistsWhichCovers(frameNumber))
1142 mEditor->scrubTo(frameNumber);
1147 layer->setFrameSelected(frameNumber,
true);
1149 else if (mType == TIMELINE_CELL_TYPE::Layers && event->
pos().
x() >= 15)
1151 editLayerProperties(layer);
1157void TimeLineCells::editLayerProperties(
Layer *layer)
const
1159 if (layer->type() != Layer::CAMERA)
1161 editLayerName(layer);
1165 auto cameraLayer =
dynamic_cast<LayerCamera*
>(layer);
1166 Q_ASSERT(cameraLayer);
1167 editLayerProperties(cameraLayer);
1170void TimeLineCells::editLayerProperties(
LayerCamera* cameraLayer)
const
1175 cameraLayer->getViewRect().
height());
1184 mEditor->layers()->renameLayer(cameraLayer, name);
1187 settings.setValue(SETTING_FIELD_W, dialog.getWidth());
1188 settings.setValue(SETTING_FIELD_H, dialog.getHeight());
1189 cameraLayer->setViewRect(
QRect(-dialog.getWidth() / 2, -dialog.getHeight() / 2, dialog.getWidth(), dialog.getHeight()));
1190 mEditor->view()->forceUpdateViewTransform();
1193void TimeLineCells::editLayerName(
Layer* layer)
const
1200 layer->name(), &ok);
1207 mEditor->layers()->renameLayer(layer, name);
1210void TimeLineCells::hScrollChange(
int x)
1216void TimeLineCells::vScrollChange(
int x)
1219 mScrollingVertically =
true;
1223void TimeLineCells::onScrollingVerticallyStopped()
1225 mScrollingVertically =
false;
1228void TimeLineCells::setMouseMoveY(
int x)
1234bool TimeLineCells::trackScrubber()
1236 if (mType != TIMELINE_CELL_TYPE::Tracks ||
1237 (mPrevFrame == mEditor->currentFrame() && !mEditor->playback()->isPlaying()))
1241 mPrevFrame = mEditor->currentFrame();
1243 if (mEditor->currentFrame() <= mFrameOffset)
1246 mFrameOffset = mEditor->currentFrame() - 1;
1247 emit offsetChanged(mFrameOffset);
1250 else if (
width() < (mEditor->currentFrame() - mFrameOffset + 1) * mFrameSize)
1253 if (mEditor->playback()->isPlaying())
1254 mFrameOffset = mFrameOffset + ((mEditor->currentFrame() - mFrameOffset) / 2);
1256 mFrameOffset = mEditor->currentFrame() -
width() / mFrameSize;
1257 emit offsetChanged(mFrameOffset);
1263void TimeLineCells::onDidLeaveWidget()
void framesModified()
This should be emitted after modifying multiple frames.
void frameModified(int frameNumber)
This should be emitted after modifying the frame content.
QList< int > selectedKeyFramesPositions() const
Get selected keyframe positions sorted by position.
bool canMoveSelectedFramesToOffset(int offset) const
Predetermines whether the frames can be moved to a new position depending on the offset.
void notifyAnimationLengthChanged()
This should be emitted whenever the animation length frames, eg.
void addUserState(SAVESTATE_ID SaveStateId, const UserSaveState &userState)
Adds userState to the saveState found at SaveStateId If no record is found matching the id,...
void record(SAVESTATE_ID SaveStateId, const QString &description)
Records the given save state.
SAVESTATE_ID createState(UndoRedoRecordType recordType)
Prepares and returns an save state with common data.
QEvent::Type type() const const
QString getText(QWidget *parent, const QString &title, const QString &label, QLineEdit::EchoMode mode, const QString &text, bool *ok, Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints)
bool contains(const T &value) const const
QString tr(const char *sourceText, const char *disambiguation, int n)
void drawEllipse(const QRectF &rectangle)
void drawLine(const QLineF &line)
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
void drawRect(const QRectF &rectangle)
void drawText(const QPointF &position, const QString &text)
void setBrush(const QBrush &brush)
void setCompositionMode(QPainter::CompositionMode mode)
void setPen(const QColor &color)
void setRenderHint(QPainter::RenderHint hint, bool on)
bool isNull() const const
void setBottomRight(const QPoint &position)
void setTopLeft(const QPoint &position)
bool isEmpty() const const
QString number(int n, int base)
QString & replace(int position, int n, QChar after)
Use this struct to store user related data that will later be added to the backup This struct is mean...