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 layer->foreachKeyFrame([&](
KeyFrame* key)
450 int framePos = key->pos();
451 int recWidth = standardWidth;
452 int recLeft = getFrameX(framePos) - recWidth;
454 if (key->length() > 1)
467 if (key->isSelected()) {
476 if (!key->isSelected()) {
477 painter.
drawRect(recLeft, recTop, recWidth, recHeight);
482void TimeLineCells::paintCurrentFrameBorder(
QPainter &painter,
int recLeft,
int recTop,
int recWidth,
int recHeight)
const
487 painter.
drawRect(recLeft, recTop, recWidth, recHeight);
491void TimeLineCells::paintFrameCursorOnCurrentLayer(
QPainter &painter,
int recTop,
int recWidth,
int recHeight)
const
493 int recLeft = getFrameX(mFramePosMoveX) - recWidth;
503 painter.
drawRect(recLeft, recTop, recWidth, recHeight);
507void TimeLineCells::paintHighlightedFrame(
QPainter& painter,
int framePos,
int recTop,
int recWidth,
int recHeight)
const
509 int recLeft = getFrameX(framePos) - recWidth;
517 painter.
drawRect(recLeft+1, recTop+1, recWidth-1, recHeight-1);
521void TimeLineCells::paintSelectedFrames(
QPainter& painter,
const Layer* layer,
const int layerIndex)
const
523 int mouseX = mMouseMoveX;
524 int posUnderCursor = getFrameNumber(mMousePressX);
525 int standardWidth = mFrameSize - 2;
526 int recWidth = standardWidth;
527 int recHeight = mLayerHeight - 4;
528 int recTop = getLayerY(layerIndex) + 1;
531 for (
int framePos : layer->getSelectedFramesByPos()) {
533 KeyFrame* key = layer->getKeyFrameAt(framePos);
534 if (key->length() > 1)
538 recWidth = mFrameSize * key->length();
544 int frameX = getFrameX(framePos);
546 int offset = (framePos - posUnderCursor) + mFrameOffset;
547 int newFrameX = getFrameX(getFrameNumber(getFrameX(offset)+mouseX)) - standardWidth;
549 painter.
drawRect(newFrameX, recTop-4, recWidth, recHeight);
552 int currentFrameX = frameX - standardWidth;
553 painter.
drawRect(currentFrameX, recTop, recWidth, recHeight);
559void TimeLineCells::paintLabel(
QPainter& painter,
const Layer* layer,
560 int x,
int y,
int width,
int height,
561 bool selected, LayerVisibility layerVisibility)
const
576 if (!layer->visible())
582 if ((layerVisibility == LayerVisibility::ALL) || selected)
586 else if (layerVisibility == LayerVisibility::CURRENTONLY)
590 else if (layerVisibility == LayerVisibility::RELATED)
609 if (layer->type() == Layer::BITMAP) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-bitmap.svg"));
610 if (layer->type() == Layer::VECTOR) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-vector.svg"));
611 if (layer->type() == Layer::SOUND) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-sound.svg"));
612 if (layer->type() == Layer::CAMERA) painter.
drawPixmap(
QPoint(22,
y - 1),
QPixmap(
":icons/themes/playful/timeline/cell-camera.svg"));
625void TimeLineCells::paintSelection(
QPainter& painter,
int x,
int y,
int width,
int height)
const
628 linearGrad.setColorAt(0,
QColor(0, 0, 0, 255));
629 linearGrad.setColorAt(1,
QColor(255, 255, 255, 0));
638void TimeLineCells::paintLayerGutter(
QPainter& painter)
const
641 if (mMouseMoveY > mLayerDetachThreshold)
643 painter.
drawRect(0, getLayerY(getInbetweenLayerNumber(mEndY))+mLayerHeight,
width(), 2);
647 painter.
drawRect(0, getLayerY(getInbetweenLayerNumber(mEndY)),
width(), 2);
651void TimeLineCells::paintOnionSkin(
QPainter& painter)
const
653 Layer* layer = mEditor->layers()->currentLayer();
654 if (layer ==
nullptr) {
return; }
656 int frameNumber = mEditor->currentFrame();
658 int prevOnionSkinCount = mEditor->preference()->getInt(SETTING::ONION_PREV_FRAMES_NUM);
659 int nextOnionSkinCount = mEditor->preference()->getInt(SETTING::ONION_NEXT_FRAMES_NUM);
661 bool isAbsolute = (mEditor->preference()->getString(SETTING::ONION_TYPE) ==
"absolute");
663 if (mEditor->preference()->isOn(SETTING::PREV_ONION) && prevOnionSkinCount > 0)
665 int onionFrameNumber = frameNumber;
668 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber+1,
true);
670 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber, isAbsolute);
671 int onionPosition = 0;
673 while (onionPosition < prevOnionSkinCount && onionFrameNumber > 0)
683 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber, isAbsolute);
688 if (mEditor->preference()->isOn(SETTING::NEXT_ONION) && nextOnionSkinCount > 0) {
690 int onionFrameNumber = layer->getNextFrameNumber(frameNumber, isAbsolute);
691 int onionPosition = 0;
693 while (onionPosition < nextOnionSkinCount && onionFrameNumber > 0)
703 onionFrameNumber = layer->getNextFrameNumber(onionFrameNumber, isAbsolute);
714 bool isPlaying = mEditor->playback()->isPlaying();
715 if (mCache ==
nullptr || mRedrawContent || trackScrubber())
724 if (mType == TIMELINE_CELL_TYPE::Tracks)
727 paintOnionSkin(painter);
730 int currentFrame = mEditor->currentFrame();
731 Layer* currentLayer = mEditor->layers()->currentLayer();
732 KeyFrame* keyFrame = currentLayer->getKeyFrameWhichCovers(currentFrame);
733 if (keyFrame !=
nullptr && !keyFrame->isSelected())
735 int recWidth = keyFrame->length() == 1 ? mFrameSize - 2 : mFrameSize * keyFrame->length();
736 int recLeft = getFrameX(keyFrame->pos()) - (mFrameSize - 2);
737 paintCurrentFrameBorder(painter, recLeft, getLayerY(mEditor->currentLayerIndex()) + 1, recWidth, mLayerHeight - 4);
740 if (!mMovingFrames && mLayerPosMoveY != -1 && mLayerPosMoveY == mEditor->currentLayerIndex())
743 int recTop = getLayerY(mLayerPosMoveY) + 1;
744 int standardWidth = mFrameSize - 2;
745 int recHeight = mLayerHeight - 4;
747 if (mHighlightFrameEnabled)
749 paintHighlightedFrame(painter, mHighlightedFrame, recTop, standardWidth, recHeight);
751 if (currentLayer->visible())
753 paintFrameCursorOnCurrentLayer(painter, recTop, standardWidth, recHeight);
758 if (currentFrame > mFrameOffset)
765 int currentFrameStartX = getFrameX(currentFrame - 1) + 1;
766 int currentFrameEndX = getFrameX(currentFrame);
776 bool mouseUnderScrubber = currentFrame == mFramePosMoveX;
777 if (mouseUnderScrubber) {
779 QPen pen = scrubColor;
789 int incr = (currentFrame < 10) ? 4 : 0;
801 emit lengthChanged(getFrameLength());
804bool TimeLineCells::event(
QEvent* event)
813void TimeLineCells::mousePressEvent(
QMouseEvent* event)
815 int frameNumber = getFrameNumber(event->
pos().
x());
816 int layerNumber = getLayerNumber(event->
pos().
y());
817 mCurrentLayerNumber = layerNumber;
819 mMousePressX =
event->pos().x();
820 mFromLayer = mToLayer = layerNumber;
822 mStartY =
event->pos().y();
823 mStartLayerNumber = layerNumber;
824 mEndY =
event->pos().y();
826 mStartFrameNumber = frameNumber;
827 mLastFrameNumber = mStartFrameNumber;
829 mCanMoveFrame =
false;
830 mMovingFrames =
false;
832 mCanBoxSelect =
false;
833 mBoxSelecting =
false;
835 mClickSelecting =
false;
837 primaryButton =
event->button();
841 case TIMELINE_CELL_TYPE::Layers:
842 if (layerNumber != -1 && layerNumber < mEditor->
object()->getLayerCount())
844 if (event->
pos().
x() < 15)
846 mEditor->switchVisibilityOfLayer(layerNumber);
848 else if (mEditor->currentLayerIndex() != layerNumber)
850 mEditor->layers()->setCurrentLayer(layerNumber);
851 mEditor->layers()->currentLayer()->deselectAll();
854 if (layerNumber == -1)
856 if (event->
pos().
x() < 15)
859 mEditor->increaseLayerVisibilityIndex();
861 mEditor->decreaseLayerVisibilityIndex();
866 case TIMELINE_CELL_TYPE::Tracks:
869 mLastFrameNumber = getFrameNumber(event->
pos().
x());
873 if (frameNumber == mEditor->currentFrame() && mStartY < 20)
875 if (mEditor->playback()->isPlaying())
877 mEditor->playback()->stop();
879 mTimeLine->scrubbing =
true;
883 if ((layerNumber != -1) && layerNumber < mEditor->
object()->getLayerCount())
885 int previousLayerNumber = mEditor->layers()->currentLayerIndex();
887 if (previousLayerNumber != layerNumber)
889 Layer *previousLayer = mEditor->object()->getLayer(previousLayerNumber);
890 previousLayer->deselectAll();
891 emit mEditor->selectedFramesChanged();
892 mEditor->layers()->setCurrentLayer(layerNumber);
895 Layer *currentLayer = mEditor->object()->getLayer(layerNumber);
901 mClickSelecting =
true;
902 mCanMoveFrame =
true;
904 currentLayer->selectAllFramesAfter(frameNumber);
905 emit mEditor->selectedFramesChanged();
908 else if (!currentLayer->isFrameSelected(frameNumber))
911 mCanBoxSelect =
true;
912 mClickSelecting =
true;
919 currentLayer->toggleFrameSelected(frameNumber,
true);
920 emit mEditor->selectedFramesChanged();
925 currentLayer->extendSelectionTo(frameNumber);
926 emit mEditor->selectedFramesChanged();
931 currentLayer->toggleFrameSelected(frameNumber,
false);
932 emit mEditor->selectedFramesChanged();
939 showCameraMenu(event->
pos());
948 showCameraMenu(event->
pos());
951 mCanMoveFrame =
true;
954 if (currentLayer->hasAnySelectedFrames()) {
955 emit selectionChanged();
958 mTimeLine->updateContent();
964 if (mEditor->playback()->isPlaying())
966 mEditor->playback()->stop();
968 if (mEditor->playback()->getSoundScrubActive() && mLastScrubFrame != frameNumber)
970 mEditor->playback()->playScrub(frameNumber);
971 mLastScrubFrame = frameNumber;
974 mEditor->scrubTo(frameNumber);
976 mTimeLine->scrubbing =
true;
977 qDebug(
"Scrub to %d frame", frameNumber);
986void TimeLineCells::mouseMoveEvent(
QMouseEvent* event)
988 mMouseMoveX =
event->pos().x();
989 mFramePosMoveX = getFrameNumber(mMouseMoveX);
990 mLayerPosMoveY = getLayerNumber(event->
pos().
y());
992 if (mType == TIMELINE_CELL_TYPE::Layers)
995 mEndY =
event->pos().y();
996 emit mouseMovedY(mEndY - mStartY);
999 else if (mType == TIMELINE_CELL_TYPE::Tracks)
1003 mFrameOffset = qMin(qMax(0, mFrameLength -
width() / getFrameSize()), qMax(0, mFrameOffset + mLastFrameNumber - mFramePosMoveX));
1005 emit offsetChanged(mFrameOffset);
1009 if (mTimeLine->scrubbing)
1011 if (mEditor->playback()->getSoundScrubActive() && mLastScrubFrame != mFramePosMoveX)
1013 mEditor->playback()->playScrub(mFramePosMoveX);
1014 mLastScrubFrame = mFramePosMoveX;
1016 mEditor->scrubTo(mFramePosMoveX);
1021 if (mStartLayerNumber != -1 && mStartLayerNumber < mEditor->
object()->getLayerCount())
1023 Layer *currentLayer = mEditor->object()->getLayer(mStartLayerNumber);
1026 if (mCanMoveFrame) {
1029 mMovingFrames =
true;
1031 else if (mCanBoxSelect)
1034 mBoxSelecting =
true;
1036 currentLayer->deselectAll();
1037 currentLayer->setFrameSelected(mStartFrameNumber,
true);
1038 currentLayer->extendSelectionTo(mFramePosMoveX);
1039 emit mEditor->selectedFramesChanged();
1041 mLastFrameNumber = mFramePosMoveX;
1051void TimeLineCells::mouseReleaseEvent(
QMouseEvent* event)
1053 if (event->
button() != primaryButton)
return;
1055 int frameNumber = getFrameNumber(event->
pos().
x());
1056 if (frameNumber < 1) frameNumber = 1;
1057 int layerNumber = getLayerNumber(event->
pos().
y());
1059 if (mType == TIMELINE_CELL_TYPE::Tracks && mCurrentLayerNumber != -1 && primaryButton !=
Qt::MiddleButton)
1062 Layer* currentLayer = mEditor->layers()->getLayer(mCurrentLayerNumber);
1063 Q_ASSERT(currentLayer);
1067 int posUnderCursor = getFrameNumber(mMousePressX);
1068 int offset = frameNumber - posUnderCursor;
1070 currentLayer->moveSelectedFrames(offset);
1076 else if (!mTimeLine->scrubbing && !mMovingFrames && !mClickSelecting && !mBoxSelecting)
1082 currentLayer->toggleFrameSelected(frameNumber, multipleSelection);
1083 emit mEditor->selectedFramesChanged();
1087 if (mType == TIMELINE_CELL_TYPE::Layers && !mScrollingVertically && layerNumber != mStartLayerNumber && mStartLayerNumber != -1 && layerNumber != -1)
1089 mToLayer = getInbetweenLayerNumber(event->
pos().
y());
1090 if (mToLayer != mFromLayer && mToLayer > -1 && mToLayer < mEditor->layers()->count())
1093 if (mToLayer < mFromLayer)
1095 for (
int i = mFromLayer - 1; i >= mToLayer; i--)
1096 mEditor->swapLayers(i, i + 1);
1100 for (
int i = mFromLayer + 1; i <= mToLayer; i++)
1101 mEditor->swapLayers(i, i - 1);
1108 emit mouseMovedY(0);
1113 mTimeLine->scrubbing =
false;
1114 mMovingFrames =
false;
1117void TimeLineCells::mouseDoubleClickEvent(
QMouseEvent* event)
1119 int frameNumber = getFrameNumber(event->
pos().
x());
1120 int layerNumber = getLayerNumber(event->
pos().
y());
1123 if (event->
pos().
y() < 20 && (mType != TIMELINE_CELL_TYPE::Layers || event->
pos().
x() >= 15))
1125 mPrefs->set(SETTING::SHORT_SCRUB, !mbShortScrub);
1129 Layer* layer = mEditor->object()->getLayer(layerNumber);
1132 if (mType == TIMELINE_CELL_TYPE::Tracks && (layerNumber != -1) && (frameNumber > 0) && layerNumber < mEditor->
object()->getLayerCount())
1134 if (!layer->keyExistsWhichCovers(frameNumber))
1136 mEditor->scrubTo(frameNumber);
1137 emit insertNewKeyFrame();
1142 layer->setFrameSelected(frameNumber,
true);
1144 else if (mType == TIMELINE_CELL_TYPE::Layers && event->
pos().
x() >= 15)
1146 editLayerProperties(layer);
1152void TimeLineCells::editLayerProperties(
Layer *layer)
const
1154 if (layer->type() != Layer::CAMERA)
1156 editLayerName(layer);
1160 auto cameraLayer =
dynamic_cast<LayerCamera*
>(layer);
1161 Q_ASSERT(cameraLayer);
1162 editLayerProperties(cameraLayer);
1165void TimeLineCells::editLayerProperties(
LayerCamera* cameraLayer)
const
1170 cameraLayer->getViewRect().
height());
1179 mEditor->layers()->renameLayer(cameraLayer, name);
1182 settings.setValue(SETTING_FIELD_W, dialog.getWidth());
1183 settings.setValue(SETTING_FIELD_H, dialog.getHeight());
1184 cameraLayer->setViewRect(
QRect(-dialog.getWidth() / 2, -dialog.getHeight() / 2, dialog.getWidth(), dialog.getHeight()));
1185 mEditor->view()->forceUpdateViewTransform();
1188void TimeLineCells::editLayerName(
Layer* layer)
const
1195 layer->name(), &ok);
1202 mEditor->layers()->renameLayer(layer, name);
1205void TimeLineCells::hScrollChange(
int x)
1211void TimeLineCells::vScrollChange(
int x)
1214 mScrollingVertically =
true;
1218void TimeLineCells::onScrollingVerticallyStopped()
1220 mScrollingVertically =
false;
1223void TimeLineCells::setMouseMoveY(
int x)
1229bool TimeLineCells::trackScrubber()
1231 if (mType != TIMELINE_CELL_TYPE::Tracks ||
1232 (mPrevFrame == mEditor->currentFrame() && !mEditor->playback()->isPlaying()))
1236 mPrevFrame = mEditor->currentFrame();
1238 if (mEditor->currentFrame() <= mFrameOffset)
1241 mFrameOffset = mEditor->currentFrame() - 1;
1242 emit offsetChanged(mFrameOffset);
1245 else if (
width() < (mEditor->currentFrame() - mFrameOffset + 1) * mFrameSize)
1248 if (mEditor->playback()->isPlaying())
1249 mFrameOffset = mFrameOffset + ((mEditor->currentFrame() - mFrameOffset) / 2);
1251 mFrameOffset = mEditor->currentFrame() -
width() / mFrameSize;
1252 emit offsetChanged(mFrameOffset);
1258void 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)
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)