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"
38#include "cameracontextmenu.h"
40TimeLineCells::TimeLineCells(
TimeLine* parent,
Editor* editor, TIMELINE_CELL_TYPE type) :
QWidget(parent)
44 mPrefs = editor->preference();
47 mFrameLength = mPrefs->getInt(SETTING::TIMELINE_SIZE);
48 mFontSize = mPrefs->getInt(SETTING::LABEL_FONT_SIZE);
49 mFrameSize = mPrefs->getInt(SETTING::FRAME_SIZE);
50 mbShortScrub = mPrefs->isOn(SETTING::SHORT_SCRUB);
51 mDrawFrameNumber = mPrefs->isOn(SETTING::DRAW_LABEL);
53 setMinimumSize(500, 4 * mLayerHeight);
56 setMouseTracking(
true);
58 connect(mPrefs, &PreferenceManager::optionChanged,
this, &TimeLineCells::loadSetting);
61TimeLineCells::~TimeLineCells()
66void TimeLineCells::loadSetting(SETTING setting)
70 case SETTING::TIMELINE_SIZE:
71 mFrameLength = mPrefs->getInt(SETTING::TIMELINE_SIZE);
72 mTimeLine->updateLength();
74 case SETTING::LABEL_FONT_SIZE:
75 mFontSize = mPrefs->getInt(SETTING::LABEL_FONT_SIZE);
77 case SETTING::FRAME_SIZE:
78 mFrameSize = mPrefs->getInt(SETTING::FRAME_SIZE);
79 mTimeLine->updateLength();
81 case SETTING::SHORT_SCRUB:
82 mbShortScrub = mPrefs->isOn(SETTING::SHORT_SCRUB);
84 case SETTING::DRAW_LABEL:
85 mDrawFrameNumber = mPrefs->isOn(SETTING::DRAW_LABEL);
94int TimeLineCells::getFrameNumber(
int x)
const
96 return mFrameOffset + 1 + (
x - mOffsetX) / mFrameSize;
99int TimeLineCells::getFrameX(
int frameNumber)
const
101 return mOffsetX + (frameNumber - mFrameOffset) * mFrameSize;
104void TimeLineCells::setFrameSize(
int size)
107 mPrefs->set(SETTING::FRAME_SIZE, mFrameSize);
111int TimeLineCells::getLayerNumber(
int y)
const
113 int layerNumber = mLayerOffset + (
y - mOffsetY) / mLayerHeight;
115 int totalLayerCount = mEditor->object()->getLayerCount();
119 if (layerNumber <= totalLayerCount)
120 layerNumber = (totalLayerCount - 1) - layerNumber;
129 if (layerNumber >= totalLayerCount)
131 layerNumber = totalLayerCount;
136 if (layerNumber < -1)
143int TimeLineCells::getInbetweenLayerNumber(
int y)
const {
144 int layerNumber = getLayerNumber(
y);
146 if(layerNumber != mFromLayer) {
147 if(mMouseMoveY > 0 &&
y < getLayerY(layerNumber) + mLayerHeight / 2) {
150 else if(mMouseMoveY < 0 && y > getLayerY(layerNumber) + mLayerHeight / 2) {
157int TimeLineCells::getLayerY(
int layerNumber)
const
159 return mOffsetY + (mEditor->object()->getLayerCount() - 1 - layerNumber - mLayerOffset)*mLayerHeight;
162void TimeLineCells::updateFrame(
int frameNumber)
164 int x = getFrameX(frameNumber);
168void TimeLineCells::updateContent()
170 mRedrawContent =
true;
174bool TimeLineCells::didDetachLayer()
const {
175 return abs(mMouseMoveY) > mLayerDetachThreshold;
178void TimeLineCells::showCameraMenu(
QPoint pos)
180 int frameNumber = getFrameNumber(
pos.x());
182 const Layer* curLayer = mEditor->layers()->currentLayer();
186 if (curLayer->type() != Layer::CAMERA || !curLayer->keyExists(frameNumber))
191 mHighlightFrameEnabled =
true;
192 mHighlightedFrame = frameNumber;
197 mHighlightFrameEnabled =
false;
198 mHighlightedFrame = -1;
201 KeyFrame* key = curLayer->getKeyFrameAt(frameNumber);
202 if (key->isModified()) {
213void TimeLineCells::drawContent()
215 if (mCache ==
nullptr)
233 const int widgetWidth =
width();
236 const Object*
object = mEditor->object();
237 Q_ASSERT(
object !=
nullptr);
238 for (
int i = 0; i <
object->getLayerCount(); i++)
240 if (i == mEditor->layers()->currentLayerIndex())
244 const Layer* layeri =
object->getLayer(i);
246 if (layeri !=
nullptr)
248 const int layerY = getLayerY(i);
251 case TIMELINE_CELL_TYPE::Tracks:
252 paintTrack(painter, layeri, mOffsetX,
253 layerY, widgetWidth - mOffsetX,
254 mLayerHeight,
false, mFrameSize);
257 case TIMELINE_CELL_TYPE::Layers:
258 paintLabel(painter, layeri, 0,
259 layerY, widgetWidth - 1,
260 mLayerHeight,
false, mEditor->layerVisibility());
267 const Layer* currentLayer = mEditor->layers()->currentLayer();
268 if (didDetachLayer())
270 int layerYMouseMove = getLayerY(mEditor->layers()->currentLayerIndex()) + mMouseMoveY;
271 if (mType == TIMELINE_CELL_TYPE::Tracks)
273 paintTrack(painter, currentLayer,
274 mOffsetX, layerYMouseMove,
275 widgetWidth - mOffsetX, mLayerHeight,
278 else if (mType == TIMELINE_CELL_TYPE::Layers)
280 paintLabel(painter, currentLayer,
282 widgetWidth - 1, mLayerHeight,
true, mEditor->layerVisibility());
284 paintLayerGutter(painter);
289 if (mType == TIMELINE_CELL_TYPE::Tracks)
294 getLayerY(mEditor->layers()->currentLayerIndex()),
295 widgetWidth - mOffsetX,
300 else if (mType == TIMELINE_CELL_TYPE::Layers)
305 getLayerY(mEditor->layers()->currentLayerIndex()),
309 mEditor->layerVisibility());
316 painter.drawRect(
QRect(0, 0,
width() - 1, mOffsetY - 1));
320 painter.drawLine(0, mOffsetY - 2,
width() - 1, mOffsetY - 2);
322 if (mType == TIMELINE_CELL_TYPE::Layers)
326 if (mEditor->layerVisibility() == LayerVisibility::CURRENTONLY)
330 else if (mEditor->layerVisibility() == LayerVisibility::RELATED)
334 painter.setBrush(color);
336 else if (mEditor->layerVisibility() == LayerVisibility::ALL)
341 painter.drawEllipse(6, 4, 9, 9);
344 else if (mType == TIMELINE_CELL_TYPE::Tracks)
348 for (
int i = 0; i <
object->getLayerCount(); i++) {
349 paintSelectedFrames(painter, object->getLayer(i), i);
352 mRedrawContent =
false;
355void TimeLineCells::paintTicks(
QPainter& painter,
const QPalette& palette)
const
359 int fps = mEditor->playback()->fps();
360 for (
int i = mFrameOffset; i < mFrameOffset + (
width() - mOffsetX) / mFrameSize; i++)
363 const int lineX = getFrameX(i) + 1;
364 if (i + 1 >= mTimeLine->getRangeLower() && i < mTimeLine->getRangeUpper())
369 painter.
drawRect(lineX, 1, mFrameSize + 1, 2);
376 if (i % fps == 0 || i % fps == fps / 2)
378 painter.
drawLine(lineX, 1, lineX, 5);
382 painter.
drawLine(lineX, 1, lineX, 3);
384 if (i == 0 || i % fps == fps - 1)
386 int incr = (i < 9) ? 4 : 0;
392void TimeLineCells::paintTrack(
QPainter& painter,
const Layer* layer,
393 int x,
int y,
int width,
int height,
394 bool selected,
int frameSize)
const
399 if (layer->type() == Layer::BITMAP) col =
QColor(51, 155, 252);
400 if (layer->type() == Layer::VECTOR) col =
QColor(70, 205, 123);
401 if (layer->type() == Layer::SOUND) col =
QColor(255, 141, 112);
402 if (layer->type() == Layer::CAMERA) col =
QColor(253, 202, 92);
404 if (!layer->visible()) col.
setAlpha(64);
411 if (!layer->visible())
426 linearGrad.setColorAt(0,
QColor(255,255,255,150));
427 linearGrad.setColorAt(1,
QColor(0,0,0,0));
439void TimeLineCells::paintFrames(
QPainter& painter,
QColor trackCol,
const Layer* layer,
int y,
int height,
bool selected,
int frameSize)
const
446 int recHeight =
height - 4;
448 const QList<int> selectedFrames = layer->getSelectedFramesByPos();
449 layer->foreachKeyFrame([&](
KeyFrame* key)
451 int framePos = key->pos();
452 int recWidth = standardWidth;
453 int recLeft = getFrameX(framePos) - recWidth;
456 if (selectedFrames.
contains(framePos)) {
460 if (key->length() > 1)
476 painter.
drawRect(recLeft, recTop, recWidth, recHeight);
480void TimeLineCells::paintCurrentFrameBorder(
QPainter &painter,
int recLeft,
int recTop,
int recWidth,
int recHeight)
const
485 painter.
drawRect(recLeft, recTop, recWidth, recHeight);
489void TimeLineCells::paintFrameCursorOnCurrentLayer(
QPainter &painter,
int recTop,
int recWidth,
int recHeight)
const
491 int recLeft = getFrameX(mFramePosMoveX) - recWidth;
501 painter.
drawRect(recLeft, recTop, recWidth, recHeight);
505void TimeLineCells::paintHighlightedFrame(
QPainter& painter,
int framePos,
int recTop,
int recWidth,
int recHeight)
const
507 int recLeft = getFrameX(framePos) - recWidth;
515 painter.
drawRect(recLeft+1, recTop+1, recWidth-1, recHeight-1);
519void TimeLineCells::paintSelectedFrames(
QPainter& painter,
const Layer* layer,
const int layerIndex)
const
521 int mouseX = mMouseMoveX;
522 int posUnderCursor = getFrameNumber(mMousePressX);
523 int standardWidth = mFrameSize - 2;
524 int recWidth = standardWidth;
525 int recHeight = mLayerHeight - 4;
526 int recTop = getLayerY(layerIndex) + 1;
529 for (
int framePos : layer->getSelectedFramesByPos()) {
531 KeyFrame* key = layer->getKeyFrameAt(framePos);
532 if (key->length() > 1)
536 recWidth = mFrameSize * key->length();
542 int frameX = getFrameX(framePos);
544 int offset = (framePos - posUnderCursor) + mFrameOffset;
545 int newFrameX = getFrameX(getFrameNumber(getFrameX(offset)+mouseX)) - standardWidth;
547 painter.
drawRect(newFrameX, recTop-4, recWidth, recHeight);
550 int currentFrameX = frameX - standardWidth;
551 painter.
drawRect(currentFrameX, recTop, recWidth, recHeight);
557void TimeLineCells::paintLabel(
QPainter& painter,
const Layer* layer,
558 int x,
int y,
int width,
int height,
559 bool selected, LayerVisibility layerVisibility)
const
574 if (!layer->visible())
580 if ((layerVisibility == LayerVisibility::ALL) || selected)
584 else if (layerVisibility == LayerVisibility::CURRENTONLY)
588 else if (layerVisibility == LayerVisibility::RELATED)
607 if (layer->type() == Layer::BITMAP) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-bitmap.svg"));
608 if (layer->type() == Layer::VECTOR) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-vector.svg"));
609 if (layer->type() == Layer::SOUND) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-sound.svg"));
610 if (layer->type() == Layer::CAMERA) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-camera.svg"));
623void TimeLineCells::paintSelection(
QPainter& painter,
int x,
int y,
int width,
int height)
const
626 linearGrad.setColorAt(0,
QColor(0, 0, 0, 255));
627 linearGrad.setColorAt(1,
QColor(255, 255, 255, 0));
636void TimeLineCells::paintLayerGutter(
QPainter& painter)
const
639 if (mMouseMoveY > mLayerDetachThreshold)
641 painter.
drawRect(0, getLayerY(getInbetweenLayerNumber(mEndY))+mLayerHeight,
width(), 2);
645 painter.
drawRect(0, getLayerY(getInbetweenLayerNumber(mEndY)),
width(), 2);
649void TimeLineCells::paintOnionSkin(
QPainter& painter)
const
651 Layer* layer = mEditor->layers()->currentLayer();
652 if (layer ==
nullptr) {
return; }
654 int frameNumber = mEditor->currentFrame();
656 int prevOnionSkinCount = mEditor->preference()->getInt(SETTING::ONION_PREV_FRAMES_NUM);
657 int nextOnionSkinCount = mEditor->preference()->getInt(SETTING::ONION_NEXT_FRAMES_NUM);
659 bool isAbsolute = (mEditor->preference()->getString(SETTING::ONION_TYPE) ==
"absolute");
661 if (mEditor->preference()->isOn(SETTING::PREV_ONION) && prevOnionSkinCount > 0)
663 int onionFrameNumber = frameNumber;
666 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber+1,
true);
668 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber, isAbsolute);
669 int onionPosition = 0;
671 while (onionPosition < prevOnionSkinCount && onionFrameNumber > 0)
681 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber, isAbsolute);
686 if (mEditor->preference()->isOn(SETTING::NEXT_ONION) && nextOnionSkinCount > 0) {
688 int onionFrameNumber = layer->getNextFrameNumber(frameNumber, isAbsolute);
689 int onionPosition = 0;
691 while (onionPosition < nextOnionSkinCount && onionFrameNumber > 0)
701 onionFrameNumber = layer->getNextFrameNumber(onionFrameNumber, isAbsolute);
712 bool isPlaying = mEditor->playback()->isPlaying();
713 if (mCache ==
nullptr || mRedrawContent || trackScrubber())
722 if (mType == TIMELINE_CELL_TYPE::Tracks)
725 paintOnionSkin(painter);
728 int currentFrame = mEditor->currentFrame();
729 Layer* currentLayer = mEditor->layers()->currentLayer();
730 KeyFrame* keyFrame = currentLayer->getKeyFrameWhichCovers(currentFrame);
731 if (keyFrame !=
nullptr)
733 int recWidth = keyFrame->length() == 1 ? mFrameSize - 2 : mFrameSize * keyFrame->length();
734 int recLeft = getFrameX(keyFrame->pos()) - (mFrameSize - 2);
735 paintCurrentFrameBorder(painter, recLeft, getLayerY(mEditor->currentLayerIndex()) + 1, recWidth, mLayerHeight - 4);
738 if (!mMovingFrames && mLayerPosMoveY != -1 && mLayerPosMoveY == mEditor->currentLayerIndex())
741 int recTop = getLayerY(mLayerPosMoveY) + 1;
742 int standardWidth = mFrameSize - 2;
743 int recHeight = mLayerHeight - 4;
745 if (mHighlightFrameEnabled)
747 paintHighlightedFrame(painter, mHighlightedFrame, recTop, standardWidth, recHeight);
749 if (currentLayer->visible())
751 paintFrameCursorOnCurrentLayer(painter, recTop, standardWidth, recHeight);
756 if (currentFrame > mFrameOffset)
763 int currentFrameStartX = getFrameX(currentFrame - 1) + 1;
764 int currentFrameEndX = getFrameX(currentFrame);
774 bool mouseUnderScrubber = currentFrame == mFramePosMoveX;
775 if (mouseUnderScrubber) {
777 QPen pen = scrubColor;
787 int incr = (currentFrame < 10) ? 4 : 0;
799 emit lengthChanged(getFrameLength());
802bool TimeLineCells::event(
QEvent* event)
811void TimeLineCells::mousePressEvent(
QMouseEvent* event)
813 int frameNumber = getFrameNumber(event->
pos().
x());
814 int layerNumber = getLayerNumber(event->
pos().
y());
815 mCurrentLayerNumber = layerNumber;
817 mMousePressX =
event->pos().x();
818 mFromLayer = mToLayer = layerNumber;
820 mStartY =
event->pos().y();
821 mStartLayerNumber = layerNumber;
822 mEndY =
event->pos().y();
824 mStartFrameNumber = frameNumber;
825 mLastFrameNumber = mStartFrameNumber;
827 mCanMoveFrame =
false;
828 mMovingFrames =
false;
830 mCanBoxSelect =
false;
831 mBoxSelecting =
false;
833 mClickSelecting =
false;
835 primaryButton =
event->button();
839 case TIMELINE_CELL_TYPE::Layers:
840 if (layerNumber != -1 && layerNumber < mEditor->
object()->getLayerCount())
842 if (event->
pos().
x() < 15)
844 mEditor->switchVisibilityOfLayer(layerNumber);
846 else if (mEditor->currentLayerIndex() != layerNumber)
848 mEditor->layers()->setCurrentLayer(layerNumber);
849 mEditor->layers()->currentLayer()->deselectAll();
852 if (layerNumber == -1)
854 if (event->
pos().
x() < 15)
857 mEditor->increaseLayerVisibilityIndex();
859 mEditor->decreaseLayerVisibilityIndex();
864 case TIMELINE_CELL_TYPE::Tracks:
867 mLastFrameNumber = getFrameNumber(event->
pos().
x());
871 if (frameNumber == mEditor->currentFrame() && mStartY < 20)
873 if (mEditor->playback()->isPlaying())
875 mEditor->playback()->stop();
877 mTimeLine->scrubbing =
true;
881 if ((layerNumber != -1) && layerNumber < mEditor->
object()->getLayerCount())
883 int previousLayerNumber = mEditor->layers()->currentLayerIndex();
885 if (previousLayerNumber != layerNumber)
887 Layer *previousLayer = mEditor->object()->getLayer(previousLayerNumber);
888 previousLayer->deselectAll();
889 emit mEditor->selectedFramesChanged();
890 mEditor->layers()->setCurrentLayer(layerNumber);
893 Layer *currentLayer = mEditor->object()->getLayer(layerNumber);
899 mClickSelecting =
true;
900 mCanMoveFrame =
true;
902 currentLayer->selectAllFramesAfter(frameNumber);
903 emit mEditor->selectedFramesChanged();
906 else if (!currentLayer->isFrameSelected(frameNumber))
909 mCanBoxSelect =
true;
910 mClickSelecting =
true;
917 currentLayer->toggleFrameSelected(frameNumber,
true);
918 emit mEditor->selectedFramesChanged();
923 currentLayer->extendSelectionTo(frameNumber);
924 emit mEditor->selectedFramesChanged();
929 currentLayer->toggleFrameSelected(frameNumber,
false);
930 emit mEditor->selectedFramesChanged();
937 showCameraMenu(event->
pos());
946 showCameraMenu(event->
pos());
949 mCanMoveFrame =
true;
952 if (currentLayer->hasAnySelectedFrames()) {
953 emit selectionChanged();
956 mTimeLine->updateContent();
962 if (mEditor->playback()->isPlaying())
964 mEditor->playback()->stop();
966 if (mEditor->playback()->getSoundScrubActive() && mLastScrubFrame != frameNumber)
968 mEditor->playback()->playScrub(frameNumber);
969 mLastScrubFrame = frameNumber;
972 mEditor->scrubTo(frameNumber);
974 mTimeLine->scrubbing =
true;
975 qDebug(
"Scrub to %d frame", frameNumber);
984void TimeLineCells::mouseMoveEvent(
QMouseEvent* event)
986 mMouseMoveX =
event->pos().x();
987 mFramePosMoveX = getFrameNumber(mMouseMoveX);
988 mLayerPosMoveY = getLayerNumber(event->
pos().
y());
990 if (mType == TIMELINE_CELL_TYPE::Layers)
993 mEndY =
event->pos().y();
994 emit mouseMovedY(mEndY - mStartY);
997 else if (mType == TIMELINE_CELL_TYPE::Tracks)
1001 mFrameOffset = qMin(qMax(0, mFrameLength -
width() / getFrameSize()), qMax(0, mFrameOffset + mLastFrameNumber - mFramePosMoveX));
1003 emit offsetChanged(mFrameOffset);
1007 if (mTimeLine->scrubbing)
1009 if (mEditor->playback()->getSoundScrubActive() && mLastScrubFrame != mFramePosMoveX)
1011 mEditor->playback()->playScrub(mFramePosMoveX);
1012 mLastScrubFrame = mFramePosMoveX;
1014 mEditor->scrubTo(mFramePosMoveX);
1019 if (mStartLayerNumber != -1 && mStartLayerNumber < mEditor->
object()->getLayerCount())
1021 Layer *currentLayer = mEditor->object()->getLayer(mStartLayerNumber);
1024 if (mCanMoveFrame) {
1027 mMovingFrames =
true;
1029 else if (mCanBoxSelect)
1032 mBoxSelecting =
true;
1034 currentLayer->deselectAll();
1035 currentLayer->setFrameSelected(mStartFrameNumber,
true);
1036 currentLayer->extendSelectionTo(mFramePosMoveX);
1037 emit mEditor->selectedFramesChanged();
1039 mLastFrameNumber = mFramePosMoveX;
1049void TimeLineCells::mouseReleaseEvent(
QMouseEvent* event)
1051 if (event->
button() != primaryButton)
return;
1053 int frameNumber = getFrameNumber(event->
pos().
x());
1054 if (frameNumber < 1) frameNumber = 1;
1055 int layerNumber = getLayerNumber(event->
pos().
y());
1057 if (mType == TIMELINE_CELL_TYPE::Tracks && mCurrentLayerNumber != -1 && primaryButton !=
Qt::MiddleButton)
1060 Layer* currentLayer = mEditor->layers()->getLayer(mCurrentLayerNumber);
1061 Q_ASSERT(currentLayer);
1065 int posUnderCursor = getFrameNumber(mMousePressX);
1066 int offset = frameNumber - posUnderCursor;
1068 currentLayer->moveSelectedFrames(offset);
1074 else if (!mTimeLine->scrubbing && !mMovingFrames && !mClickSelecting && !mBoxSelecting)
1080 currentLayer->toggleFrameSelected(frameNumber, multipleSelection);
1081 emit mEditor->selectedFramesChanged();
1085 if (mType == TIMELINE_CELL_TYPE::Layers && !mScrollingVertically && layerNumber != mStartLayerNumber && mStartLayerNumber != -1 && layerNumber != -1)
1087 mToLayer = getInbetweenLayerNumber(event->
pos().
y());
1088 if (mToLayer != mFromLayer && mToLayer > -1 && mToLayer < mEditor->layers()->count())
1091 if (mToLayer < mFromLayer)
1093 for (
int i = mFromLayer - 1; i >= mToLayer; i--)
1094 mEditor->swapLayers(i, i + 1);
1098 for (
int i = mFromLayer + 1; i <= mToLayer; i++)
1099 mEditor->swapLayers(i, i - 1);
1106 emit mouseMovedY(0);
1111 mTimeLine->scrubbing =
false;
1112 mMovingFrames =
false;
1115void TimeLineCells::mouseDoubleClickEvent(
QMouseEvent* event)
1117 int frameNumber = getFrameNumber(event->
pos().
x());
1118 int layerNumber = getLayerNumber(event->
pos().
y());
1121 if (event->
pos().
y() < 20 && (mType != TIMELINE_CELL_TYPE::Layers || event->
pos().
x() >= 15))
1123 mPrefs->set(SETTING::SHORT_SCRUB, !mbShortScrub);
1127 Layer* layer = mEditor->object()->getLayer(layerNumber);
1130 if (mType == TIMELINE_CELL_TYPE::Tracks && (layerNumber != -1) && (frameNumber > 0) && layerNumber < mEditor->
object()->getLayerCount())
1132 if (!layer->keyExistsWhichCovers(frameNumber))
1134 mEditor->scrubTo(frameNumber);
1139 layer->setFrameSelected(frameNumber,
true);
1141 else if (mType == TIMELINE_CELL_TYPE::Layers && event->
pos().
x() >= 15)
1143 editLayerProperties(layer);
1149void TimeLineCells::editLayerProperties(
Layer *layer)
const
1151 if (layer->type() != Layer::CAMERA)
1153 editLayerName(layer);
1157 auto cameraLayer =
dynamic_cast<LayerCamera*
>(layer);
1158 Q_ASSERT(cameraLayer);
1159 editLayerProperties(cameraLayer);
1162void TimeLineCells::editLayerProperties(
LayerCamera* cameraLayer)
const
1167 cameraLayer->getViewRect().
height());
1176 mEditor->layers()->renameLayer(cameraLayer, name);
1179 settings.setValue(SETTING_FIELD_W, dialog.getWidth());
1180 settings.setValue(SETTING_FIELD_H, dialog.getHeight());
1181 cameraLayer->setViewRect(
QRect(-dialog.getWidth() / 2, -dialog.getHeight() / 2, dialog.getWidth(), dialog.getHeight()));
1182 mEditor->view()->forceUpdateViewTransform();
1185void TimeLineCells::editLayerName(
Layer* layer)
const
1192 layer->name(), &ok);
1199 mEditor->layers()->renameLayer(layer, name);
1202void TimeLineCells::hScrollChange(
int x)
1208void TimeLineCells::vScrollChange(
int x)
1211 mScrollingVertically =
true;
1215void TimeLineCells::onScrollingVerticallyStopped()
1217 mScrollingVertically =
false;
1220void TimeLineCells::setMouseMoveY(
int x)
1226bool TimeLineCells::trackScrubber()
1228 if (mType != TIMELINE_CELL_TYPE::Tracks ||
1229 (mPrevFrame == mEditor->currentFrame() && !mEditor->playback()->isPlaying()))
1233 mPrevFrame = mEditor->currentFrame();
1235 if (mEditor->currentFrame() <= mFrameOffset)
1238 mFrameOffset = mEditor->currentFrame() - 1;
1239 emit offsetChanged(mFrameOffset);
1242 else if (
width() < (mEditor->currentFrame() - mFrameOffset + 1) * mFrameSize)
1245 if (mEditor->playback()->isPlaying())
1246 mFrameOffset = mFrameOffset + ((mEditor->currentFrame() - mFrameOffset) / 2);
1248 mFrameOffset = mEditor->currentFrame() -
width() / mFrameSize;
1249 emit offsetChanged(mFrameOffset);
1255void 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.
void notifyAnimationLengthChanged()
This should be emitted whenever the animation length frames, eg.
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)