diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineconstants.h b/src/plugins/qmldesigner/components/timelineeditor/timelineconstants.h index c2a81373526..622dc366edb 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineconstants.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineconstants.h @@ -54,7 +54,8 @@ const char timelineInsertKeyframesDisplayName[] = QT_TRANSLATE_NOOP("QmlDesigner const char timelineDeleteKeyframesDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Delete All Keyframes"); -const char timelineStatusBarFrameNumber[] = QT_TRANSLATE_NOOP("QmlDesignerTimeline", "Frame %1"); +const char statusBarPlayheadFrame[] = QT_TRANSLATE_NOOP("QmlDesignerTimeline", "Playhead frame %1"); +const char statusBarKeyframe[] = QT_TRANSLATE_NOOP("QmlDesignerTimeline", "Keyframe %1"); const char C_QMLTIMELINE[] = "QmlDesigner::Timeline"; const char C_SETTINGS[] = "QmlDesigner.Settings"; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp index 97ebb7e84d0..7baa6d4dd47 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp @@ -194,7 +194,7 @@ void TimelineGraphicsScene::setCurrentFrame(int frame) invalidateCurrentValues(); - emitStatusBarFrameMessageChanged(frame); + emitStatusBarPlayheadFrameChanged(frame); } void TimelineGraphicsScene::setStartFrame(int frame) @@ -318,7 +318,7 @@ void TimelineGraphicsScene::commitCurrentFrame(qreal frame) setCurrenFrame(timeline, qRound(frame)); invalidateCurrentValues(); } - emitStatusBarFrameMessageChanged(int(frame)); + emitStatusBarPlayheadFrameChanged(int(frame)); } QList TimelineGraphicsScene::selectedKeyframes() const @@ -700,10 +700,10 @@ void TimelineGraphicsScene::emitScrollOffsetChanged() TimelineMovableAbstractItem::emitScrollOffsetChanged(item); } -void TimelineGraphicsScene::emitStatusBarFrameMessageChanged(int frame) +void TimelineGraphicsScene::emitStatusBarPlayheadFrameChanged(int frame) { emit statusBarMessageChanged( - QString(TimelineConstants::timelineStatusBarFrameNumber).arg(frame)); + tr(TimelineConstants::statusBarPlayheadFrame).arg(frame)); } bool TimelineGraphicsScene::event(QEvent *event) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h index b8f93595c44..d03a6a58242 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h @@ -160,7 +160,7 @@ private: ModelNode timelineModelNode() const; void emitScrollOffsetChanged(); - void emitStatusBarFrameMessageChanged(int frame); + void emitStatusBarPlayheadFrameChanged(int frame); QList itemsAt(const QPointF &pos); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.cpp index 0e68a63ff4c..71c76e5f676 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.cpp @@ -100,6 +100,9 @@ void TimelineMoveTool::mouseMoveEvent(TimelineMovableAbstractItem *item, current->setPosition(sourceFrame + deltaFrame); + scene()->statusBarMessageChanged(tr(TimelineConstants::statusBarKeyframe) + .arg(sourceFrame + deltaFrame)); + for (auto *keyframe : scene()->selectedKeyframes()) { if (keyframe != current) { qreal pos = std::round(current->mapFromSceneToFrame(keyframe->rect().center().x())); @@ -125,29 +128,36 @@ void TimelineMoveTool::mouseReleaseEvent(TimelineMovableAbstractItem *item, double start = current->mapFromFrameToScene(scene()->startFrame()); double end = current->mapFromFrameToScene(scene()->endFrame()); - if (mousePos < start) { - scene()->setCurrentFrame(scene()->startFrame()); - scene()->statusBarMessageChanged(QObject::tr("Frame %1").arg(scene()->startFrame())); - return; - } else if (mousePos > end) { - scene()->setCurrentFrame(scene()->endFrame()); - scene()->statusBarMessageChanged(QObject::tr("Frame %1").arg(scene()->endFrame())); + double limitFrame = -999999.; + if (mousePos < start) + limitFrame = scene()->startFrame(); + else if (mousePos > end) + limitFrame = scene()->endFrame(); + + if (limitFrame > -999999.) { + scene()->setCurrentFrame(limitFrame); + scene()->statusBarMessageChanged( + tr(TimelineConstants::statusBarPlayheadFrame).arg(limitFrame)); return; } } - scene()->timelineView()->executeInTransaction("TimelineMoveTool::mouseReleaseEvent", [this, current](){ + scene()->timelineView()->executeInTransaction("TimelineMoveTool::mouseReleaseEvent", + [this, current]() { current->commitPosition(mapToItem(current, current->rect().center())); if (current->asTimelineKeyframeItem()) { double frame = std::round( current->mapFromSceneToFrame(current->rect().center().x())); - scene()->statusBarMessageChanged(QObject::tr("Frame %1").arg(frame)); + scene()->statusBarMessageChanged( + tr(TimelineConstants::statusBarKeyframe).arg(frame)); - for (auto keyframe : scene()->selectedKeyframes()) + const auto selectedKeyframes = scene()->selectedKeyframes(); + for (auto keyframe : selectedKeyframes) { if (keyframe != current) keyframe->commitPosition(mapToItem(current, keyframe->rect().center())); + } } }); } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.h b/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.h index 55b9a394174..b1c12909884 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.h @@ -37,6 +37,8 @@ class TimelineMovableAbstractItem; class TimelineMoveTool : public TimelineAbstractTool { + Q_DECLARE_TR_FUNCTIONS(TimelineMoveTool) + public: explicit TimelineMoveTool(TimelineGraphicsScene *scene, TimelineToolDelegate *delegate); void mousePressEvent(TimelineMovableAbstractItem *item, diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp index 522607f615b..303c761f3c9 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp @@ -405,14 +405,18 @@ void TimelineWidget::contextHelp(const Core::IContext::HelpCallback &callback) c void TimelineWidget::init() { QmlTimeline currentTimeline = m_timelineView->timelineForState(m_timelineView->currentState()); - if (currentTimeline.isValid()) + if (currentTimeline.isValid()) { setTimelineId(currentTimeline.modelNode().id()); - else + m_statusBar->setText(tr(TimelineConstants::statusBarPlayheadFrame) + .arg(getcurrentFrame(currentTimeline))); + } else { setTimelineId({}); + m_statusBar->clear(); + } - invalidateTimelineDuration(graphicsScene()->currentTimeline()); + invalidateTimelineDuration(m_graphicsScene->currentTimeline()); - graphicsScene()->setWidth(m_graphicsView->viewport()->width()); + m_graphicsScene->setWidth(m_graphicsView->viewport()->width()); // setScaleFactor uses QSignalBlocker. m_toolbar->setScaleFactor(0); @@ -442,7 +446,14 @@ void TimelineWidget::invalidateTimelineDuration(const QmlTimeline &timeline) QmlTimeline currentTimeline = graphicsScene()->currentTimeline(); if (currentTimeline.isValid() && currentTimeline == timeline) { graphicsScene()->setTimeline(timeline); - graphicsScene()->setCurrenFrame(timeline, getcurrentFrame(timeline)); + + qreal playHeadFrame = getcurrentFrame(timeline); + if (playHeadFrame < timeline.startKeyframe()) + playHeadFrame = timeline.startKeyframe(); + else if (playHeadFrame > timeline.endKeyframe()) + playHeadFrame = timeline.endKeyframe(); + + graphicsScene()->setCurrentFrame(playHeadFrame); } } }