diff options
Diffstat (limited to 'src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp')
-rw-r--r-- | src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp | 60 |
1 files changed, 53 insertions, 7 deletions
diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp index 036fe173f5..c080a49314 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp @@ -104,9 +104,9 @@ TransitionEditorGraphicsScene::TransitionEditorGraphicsScene(TransitionEditorWid auto changeScale = [this](int factor) { transitionEditorWidget()->changeScaleFactor(factor); - setRulerScaling(qreal(factor)); + setZoom(factor); }; - connect(m_layout, &TransitionEditorGraphicsLayout::scaleFactorChanged, changeScale); + connect(m_layout, &TransitionEditorGraphicsLayout::zoomChanged, changeScale); } TransitionEditorGraphicsScene::~TransitionEditorGraphicsScene() @@ -125,7 +125,7 @@ void TransitionEditorGraphicsScene::invalidateScrollbar() void TransitionEditorGraphicsScene::onShow() { - emit m_layout->scaleFactorChanged(0); + emit m_layout->zoomChanged(0); } void TransitionEditorGraphicsScene::setTransition(const ModelNode &transition) @@ -157,7 +157,12 @@ void TransitionEditorGraphicsScene::setDuration(int duration) m_transition.setAuxiliaryData("transitionDuration", duration); m_layout->setDuration(duration); qreal scaling = m_layout->rulerScaling(); - setRulerScaling(scaling); + setZoom(scaling); +} + +int TransitionEditorGraphicsScene::zoom() const +{ + return m_layout->zoom(); } qreal TransitionEditorGraphicsScene::rulerScaling() const @@ -199,9 +204,9 @@ qreal TransitionEditorGraphicsScene::mapFromScene(qreal x) const return xPosOffset / rulerScaling() + startFrame(); } -void TransitionEditorGraphicsScene::setRulerScaling(int scaleFactor) +void TransitionEditorGraphicsScene::setZoom(int scaleFactor) { - m_layout->setRulerScaleFactor(scaleFactor); + m_layout->setZoom(scaleFactor); setScrollOffset(0); invalidateSections(); @@ -209,6 +214,35 @@ void TransitionEditorGraphicsScene::setRulerScaling(int scaleFactor) update(); } +void TransitionEditorGraphicsScene::setZoom(int scaling, double pivot) +{ + const qreal oldOffset = scrollOffset(); + const qreal oldScaling = m_layout->rulerScaling(); + const qreal oldPosition = mapToScene(pivot); + m_layout->setZoom(scaling); + + const qreal newScaling = m_layout->rulerScaling(); + const qreal newPosition = mapToScene(pivot); + + const qreal newOffset = oldOffset + (newPosition - oldPosition); + + if (std::isinf(oldScaling) || std::isinf(newScaling)) + setScrollOffset(0); + else { + setScrollOffset(std::round(newOffset)); + + const qreal start = mapToScene(startFrame()); + const qreal head = TimelineConstants::sectionWidth + TimelineConstants::timelineLeftOffset; + + if (start - head > 0) + setScrollOffset(0); + } + + invalidateSections(); + invalidateScrollbar(); + update(); +} + void TransitionEditorGraphicsScene::invalidateSectionForTarget(const ModelNode &target) { if (!target.isValid()) @@ -218,7 +252,7 @@ void TransitionEditorGraphicsScene::invalidateSectionForTarget(const ModelNode & const QList<QGraphicsItem *> items = m_layout->childItems(); for (auto child : items) - TimelineSectionItem::updateDataForTarget(child, target, &found); + TransitionEditorSectionItem::updateDataForTarget(child, target, &found); if (!found) invalidateScene(); @@ -227,6 +261,18 @@ void TransitionEditorGraphicsScene::invalidateSectionForTarget(const ModelNode & invalidateLayout(); } +void TransitionEditorGraphicsScene::invalidateHeightForTarget(const ModelNode &target) +{ + if (!target.isValid()) + return; + + const auto children = m_layout->childItems(); + for (auto child : children) + TransitionEditorSectionItem::updateHeightForTarget(child, target); + + invalidateLayout(); +} + void TransitionEditorGraphicsScene::invalidateScene() { invalidateScrollbar(); |