diff options
author | Tim Jenssen <tim.jenssen@qt.io> | 2020-06-26 15:13:07 +0200 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2020-06-26 16:51:22 +0200 |
commit | b8cd87dea027f54957373a10c77a506ec2509b10 (patch) | |
tree | ab7b00b4be9a46c1a0c89afaab7016444a257633 /src/plugins/qmldesigner/components/timelineeditor | |
parent | 97ac63b4012ab55def11a58ee6bd7b6878dc37e1 (diff) | |
parent | 5a06305ffe054287f55cba4c5d860ea73fccf684 (diff) |
Merge remote-tracking branch 'origin/qds-1.59' into 4.13
Conflicts:
src/plugins/clangformat/clangformatplugin.cpp
src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
src/plugins/qmldesigner/qmldesigner.qbs
Change-Id: Ie4a0beeb9fd32ac9683f4e8769988a9c3f3e369a
Diffstat (limited to 'src/plugins/qmldesigner/components/timelineeditor')
19 files changed, 197 insertions, 128 deletions
diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineabstracttool.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineabstracttool.cpp index 485bb8dbb0..f72b7e570c 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineabstracttool.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineabstracttool.cpp @@ -31,12 +31,12 @@ namespace QmlDesigner { -TimelineAbstractTool::TimelineAbstractTool(TimelineGraphicsScene *scene) +TimelineAbstractTool::TimelineAbstractTool(AbstractScrollGraphicsScene *scene) : m_scene(scene) , m_delegate(nullptr) {} -TimelineAbstractTool::TimelineAbstractTool(TimelineGraphicsScene *scene, +TimelineAbstractTool::TimelineAbstractTool(AbstractScrollGraphicsScene *scene, TimelineToolDelegate *delegate) : m_scene(scene) , m_delegate(delegate) @@ -44,7 +44,7 @@ TimelineAbstractTool::TimelineAbstractTool(TimelineGraphicsScene *scene, TimelineAbstractTool::~TimelineAbstractTool() = default; -TimelineGraphicsScene *TimelineAbstractTool::scene() const +AbstractScrollGraphicsScene *TimelineAbstractTool::scene() const { return m_scene; } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineabstracttool.h b/src/plugins/qmldesigner/components/timelineeditor/timelineabstracttool.h index 0411a8d166..7d62ceaffc 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineabstracttool.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineabstracttool.h @@ -36,14 +36,14 @@ namespace QmlDesigner { enum class ToolType { Move, Select }; class TimelineMovableAbstractItem; -class TimelineGraphicsScene; +class AbstractScrollGraphicsScene; class TimelineToolDelegate; class TimelineAbstractTool { public: - explicit TimelineAbstractTool(TimelineGraphicsScene *scene); - explicit TimelineAbstractTool(TimelineGraphicsScene *scene, TimelineToolDelegate *delegate); + explicit TimelineAbstractTool(AbstractScrollGraphicsScene *scene); + explicit TimelineAbstractTool(AbstractScrollGraphicsScene *scene, TimelineToolDelegate *delegate); virtual ~TimelineAbstractTool(); virtual void mousePressEvent(TimelineMovableAbstractItem *item, QGraphicsSceneMouseEvent *event) = 0; @@ -56,7 +56,7 @@ public: virtual void keyPressEvent(QKeyEvent *keyEvent) = 0; virtual void keyReleaseEvent(QKeyEvent *keyEvent) = 0; - TimelineGraphicsScene *scene() const; + AbstractScrollGraphicsScene *scene() const; TimelineToolDelegate *delegate() const; @@ -65,7 +65,7 @@ public: TimelineMovableAbstractItem *currentItem() const; private: - TimelineGraphicsScene *m_scene; + AbstractScrollGraphicsScene *m_scene; TimelineToolDelegate *m_delegate; }; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp index 326fa7d44b..3b87f22c51 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp @@ -91,7 +91,7 @@ QList<QmlTimelineKeyframeGroup> allTimelineFrames(const QmlTimeline &timeline) } TimelineGraphicsScene::TimelineGraphicsScene(TimelineWidget *parent) - : QGraphicsScene(parent) + : AbstractScrollGraphicsScene(parent) , m_parent(parent) , m_layout(new TimelineGraphicsLayout(this)) , m_currentFrameIndicator(new TimelineFrameHandle) @@ -378,17 +378,17 @@ void TimelineGraphicsScene::commitCurrentFrame(qreal frame) } } -QList<TimelineKeyframeItem *> TimelineGraphicsScene::selectedKeyframes() const +QList<TimelineKeyframeItem *> AbstractScrollGraphicsScene::selectedKeyframes() const { return m_selectedKeyframes; } -bool TimelineGraphicsScene::hasSelection() const +bool AbstractScrollGraphicsScene::hasSelection() const { return !m_selectedKeyframes.empty(); } -bool TimelineGraphicsScene::isCurrent(TimelineKeyframeItem *keyframe) const +bool AbstractScrollGraphicsScene::isCurrent(TimelineKeyframeItem *keyframe) const { if (m_selectedKeyframes.empty()) return false; @@ -396,12 +396,12 @@ bool TimelineGraphicsScene::isCurrent(TimelineKeyframeItem *keyframe) const return m_selectedKeyframes.back() == keyframe; } -bool TimelineGraphicsScene::isKeyframeSelected(TimelineKeyframeItem *keyframe) const +bool AbstractScrollGraphicsScene::isKeyframeSelected(TimelineKeyframeItem *keyframe) const { return m_selectedKeyframes.contains(keyframe); } -bool TimelineGraphicsScene::multipleKeyframesSelected() const +bool AbstractScrollGraphicsScene::multipleKeyframesSelected() const { return m_selectedKeyframes.count() > 1; } @@ -456,19 +456,19 @@ void TimelineGraphicsScene::invalidateRecordButtonsStatus() TimelinePropertyItem::updateRecordButtonStatus(item); } -int TimelineGraphicsScene::scrollOffset() const +int AbstractScrollGraphicsScene::scrollOffset() const { return m_scrollOffset; } -void TimelineGraphicsScene::setScrollOffset(int offset) +void AbstractScrollGraphicsScene::setScrollOffset(int offset) { m_scrollOffset = offset; emitScrollOffsetChanged(); update(); } -QGraphicsView *TimelineGraphicsScene::graphicsView() const +QGraphicsView *AbstractScrollGraphicsScene::graphicsView() const { for (auto *v : views()) if (v->objectName() == "SceneView") @@ -477,7 +477,7 @@ QGraphicsView *TimelineGraphicsScene::graphicsView() const return nullptr; } -QGraphicsView *TimelineGraphicsScene::rulerView() const +QGraphicsView *AbstractScrollGraphicsScene::rulerView() const { for (auto *v : views()) if (v->objectName() == "RulerView") @@ -491,7 +491,7 @@ QmlTimeline TimelineGraphicsScene::currentTimeline() const return QmlTimeline(timelineModelNode()); } -QRectF TimelineGraphicsScene::selectionBounds() const +QRectF AbstractScrollGraphicsScene::selectionBounds() const { QRectF bbox; @@ -501,7 +501,7 @@ QRectF TimelineGraphicsScene::selectionBounds() const return bbox; } -void TimelineGraphicsScene::selectKeyframes(const SelectionMode &mode, +void AbstractScrollGraphicsScene::selectKeyframes(const SelectionMode &mode, const QList<TimelineKeyframeItem *> &items) { if (mode == SelectionMode::Remove || mode == SelectionMode::Toggle) { @@ -536,13 +536,14 @@ void TimelineGraphicsScene::selectKeyframes(const SelectionMode &mode, emit selectionChanged(); } -void TimelineGraphicsScene::clearSelection() +void AbstractScrollGraphicsScene::clearSelection() { for (auto *keyframe : m_selectedKeyframes) if (keyframe) keyframe->setHighlighted(false); m_selectedKeyframes.clear(); + emit selectionChanged(); } QList<QGraphicsItem *> TimelineGraphicsScene::itemsAt(const QPointF &pos) @@ -682,7 +683,7 @@ ModelNode TimelineGraphicsScene::timelineModelNode() const void TimelineGraphicsScene::handleKeyframeDeletion() { QList<ModelNode> nodesToBeDeleted; - for (auto keyframe : m_selectedKeyframes) { + for (auto keyframe : selectedKeyframes()) { nodesToBeDeleted.append(keyframe->frameNode()); } deleteKeyframes(nodesToBeDeleted); @@ -711,7 +712,7 @@ void TimelineGraphicsScene::pasteKeyframesToTarget(const ModelNode &targetNode) void TimelineGraphicsScene::copySelectedKeyframes() { TimelineActions::copyKeyframes( - Utils::transform(m_selectedKeyframes, &TimelineKeyframeItem::frameNode)); + Utils::transform(selectedKeyframes(), &TimelineKeyframeItem::frameNode)); } void TimelineGraphicsScene::pasteSelectedKeyframes() @@ -756,7 +757,20 @@ void TimelineGraphicsScene::activateLayout() m_layout->activate(); } -void TimelineGraphicsScene::emitScrollOffsetChanged() +AbstractView *TimelineGraphicsScene::abstractView() const +{ + return timelineView(); +} + +int AbstractScrollGraphicsScene::getScrollOffset(QGraphicsScene *scene) +{ + auto scrollScene = qobject_cast<AbstractScrollGraphicsScene*>(scene); + if (scrollScene) + return scrollScene->scrollOffset(); + return 0; +} + +void AbstractScrollGraphicsScene::emitScrollOffsetChanged() { for (QGraphicsItem *item : items()) TimelineMovableAbstractItem::emitScrollOffsetChanged(item); @@ -783,4 +797,8 @@ bool TimelineGraphicsScene::event(QEvent *event) } } +QmlDesigner::AbstractScrollGraphicsScene::AbstractScrollGraphicsScene(QWidget *parent) + : QGraphicsScene(parent) +{} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h index 4e33ce362e..7413cb1dbb 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h @@ -36,6 +36,7 @@ QT_FORWARD_DECLARE_CLASS(QGraphicsLinearLayout) QT_FORWARD_DECLARE_CLASS(QComboBox) +QT_FORWARD_DECLARE_CLASS(QWidget) namespace QmlDesigner { @@ -51,15 +52,66 @@ class TimelinePlaceholder; class TimelineGraphicsLayout; class TimelineToolBar; -class TimelineGraphicsScene : public QGraphicsScene +class AbstractScrollGraphicsScene : public QGraphicsScene { Q_OBJECT +public: + AbstractScrollGraphicsScene(QWidget *parent); + ; + + int scrollOffset() const; + void setScrollOffset(int offset); + static int getScrollOffset(QGraphicsScene *scene); + + QRectF selectionBounds() const; + + void selectKeyframes(const SelectionMode &mode, const QList<TimelineKeyframeItem *> &items); + virtual void clearSelection(); + QList<TimelineKeyframeItem *> selectedKeyframes() const; + bool hasSelection() const; + bool isCurrent(TimelineKeyframeItem *keyframe) const; + bool isKeyframeSelected(TimelineKeyframeItem *keyframe) const; + bool multipleKeyframesSelected() const; + + virtual qreal rulerScaling() const = 0; + virtual int rulerWidth() const = 0; + virtual qreal rulerDuration() const = 0; + + virtual AbstractView *abstractView() const = 0; + + virtual void setCurrentFrame(int) {} + + virtual qreal startFrame() const = 0; + virtual qreal endFrame() const = 0; + + virtual void invalidateScrollbar() = 0; + + virtual qreal snap(qreal frame, bool snapToPlayhead = true) + { + Q_UNUSED(snapToPlayhead); + return frame; + } + + QGraphicsView *graphicsView() const; + QGraphicsView *rulerView() const; + signals: + void statusBarMessageChanged(const QString &message); void selectionChanged(); - void scroll(const TimelineUtils::Side &side); +private: + void emitScrollOffsetChanged(); + + int m_scrollOffset = 0; + QList<TimelineKeyframeItem *> m_selectedKeyframes; +}; + +class TimelineGraphicsScene : public AbstractScrollGraphicsScene +{ + Q_OBJECT + public: explicit TimelineGraphicsScene(TimelineWidget *parent); @@ -74,7 +126,7 @@ public: void invalidateLayout(); qreal setCurrenFrame(const QmlTimeline &timeline, qreal frame); - void setCurrentFrame(int frame); + void setCurrentFrame(int frame) override; void setStartFrame(int frame); void setEndFrame(int frame); @@ -82,11 +134,12 @@ public: TimelineWidget *timelineWidget() const; TimelineToolBar *toolBar() const; - qreal rulerScaling() const; - int rulerWidth() const; - qreal rulerDuration() const; - qreal startFrame() const; - qreal endFrame() const; + qreal rulerScaling() const override; + int rulerWidth() const override; + qreal rulerDuration() const override; + + qreal startFrame() const override; + qreal endFrame() const override; void updateKeyframePositionsCache(); @@ -97,39 +150,22 @@ public: QVector<qreal> keyframePositions() const; QVector<qreal> keyframePositions(const QmlTimelineKeyframeGroup &frames) const; - qreal snap(qreal frame, bool snapToPlayhead = true); + qreal snap(qreal frame, bool snapToPlayhead = true) override; void setRulerScaling(int scaling); void commitCurrentFrame(qreal frame); - QList<TimelineKeyframeItem *> selectedKeyframes() const; - - bool hasSelection() const; - bool isCurrent(TimelineKeyframeItem *keyframe) const; - bool isKeyframeSelected(TimelineKeyframeItem *keyframe) const; - bool multipleKeyframesSelected() const; - void invalidateSectionForTarget(const ModelNode &modelNode); void invalidateKeyframesForTarget(const ModelNode &modelNode); void invalidateScene(); - void invalidateScrollbar(); + void invalidateScrollbar() override; void invalidateCurrentValues(); void invalidateRecordButtonsStatus(); - int scrollOffset() const; - void setScrollOffset(int offset); - QGraphicsView *graphicsView() const; - QGraphicsView *rulerView() const; - QmlTimeline currentTimeline() const; - QRectF selectionBounds() const; - - void selectKeyframes(const SelectionMode &mode, const QList<TimelineKeyframeItem *> &items); - void clearSelection(); - void handleKeyframeDeletion(); void deleteAllKeyframesForTarget(const ModelNode &targetNode); void insertAllKeyframesForTarget(const ModelNode &targetNode); @@ -143,8 +179,7 @@ public: void activateLayout(); -signals: - void statusBarMessageChanged(const QString &message); + AbstractView *abstractView() const override; protected: bool event(QEvent *event) override; @@ -163,7 +198,6 @@ private: void invalidateSections(); ModelNode timelineModelNode() const; - void emitScrollOffsetChanged(); void emitStatusBarPlayheadFrameChanged(int frame); QList<QGraphicsItem *> itemsAt(const QPointF &pos); @@ -178,12 +212,8 @@ private: TimelineToolDelegate m_tools; - QList<TimelineKeyframeItem *> m_selectedKeyframes; - // sorted, unique cache of keyframes positions, used for snapping QVector<qreal> m_keyframePositionsCache; - - int m_scrollOffset = 0; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineitem.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineitem.cpp index 3b7f8a2fe0..6d7fb55262 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineitem.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineitem.cpp @@ -52,8 +52,7 @@ TimelineItem::TimelineItem(TimelineItem *parent) TimelineGraphicsScene *TimelineItem::timelineScene() const { - return static_cast<TimelineGraphicsScene *>(scene()); - ; + return qobject_cast<TimelineGraphicsScene *>(scene()); } TimelineFrameHandle::TimelineFrameHandle(TimelineItem *parent) @@ -93,7 +92,7 @@ void TimelineFrameHandle::setPosition(qreal frame) void TimelineFrameHandle::setPositionInteractive(const QPointF &position) { - const double width = timelineScene()->width(); + const double width = abstractScrollGraphicsScene()->width(); if (position.x() > width) { callSetClampedXPosition(width - (rect().width() / 2) - 1); @@ -104,7 +103,7 @@ void TimelineFrameHandle::setPositionInteractive(const QPointF &position) } else { callSetClampedXPosition(position.x() - rect().width() / 2); const qreal frame = std::round(mapFromSceneToFrame(rect().center().x())); - timelineScene()->commitCurrentFrame(frame); + timelineGraphicsScene()->commitCurrentFrame(frame); } } @@ -128,6 +127,11 @@ TimelineFrameHandle *TimelineFrameHandle::asTimelineFrameHandle() return this; } +TimelineGraphicsScene *TimelineFrameHandle::timelineGraphicsScene() const +{ + return qobject_cast<TimelineGraphicsScene* >(abstractScrollGraphicsScene()); +} + void TimelineFrameHandle::scrollOffsetChanged() { setPosition(position()); @@ -182,7 +186,7 @@ void TimelineFrameHandle::paint(QPainter *painter, QPointF TimelineFrameHandle::mapFromGlobal(const QPoint &pos) const { - for (auto *view : timelineScene()->views()) { + for (auto *view : abstractScrollGraphicsScene()->views()) { if (view->objectName() == "SceneView") { auto graphicsViewCoords = view->mapFromGlobal(pos); auto sceneCoords = view->mapToScene(graphicsViewCoords); @@ -195,7 +199,7 @@ QPointF TimelineFrameHandle::mapFromGlobal(const QPoint &pos) const int TimelineFrameHandle::computeScrollSpeed() const { const double mouse = mapFromGlobal(QCursor::pos()).x(); - const double width = timelineScene()->width(); + const double width = abstractScrollGraphicsScene()->width(); const double acc = mouse > width ? mouse - width : double(TimelineConstants::sectionWidth) - mouse; @@ -216,7 +220,7 @@ void TimelineFrameHandle::callSetClampedXPosition(double x) const int minimumWidth = TimelineConstants::sectionWidth + TimelineConstants::timelineLeftOffset - rect().width() / 2; const int maximumWidth = minimumWidth - + timelineScene()->rulerDuration() * timelineScene()->rulerScaling() + + abstractScrollGraphicsScene()->rulerDuration() * abstractScrollGraphicsScene()->rulerScaling() - scrollOffset(); setClampedXPosition(x, minimumWidth, maximumWidth); @@ -225,7 +229,7 @@ void TimelineFrameHandle::callSetClampedXPosition(double x) // Auto scroll when dragging playhead out of bounds. void TimelineFrameHandle::scrollOutOfBounds() { - const double width = timelineScene()->width(); + const double width = abstractScrollGraphicsScene()->width(); const double mouse = mapFromGlobal(QCursor::pos()).x(); if (mouse > width) @@ -236,14 +240,14 @@ void TimelineFrameHandle::scrollOutOfBounds() void TimelineFrameHandle::scrollOutOfBoundsMax() { - const double width = timelineScene()->width(); + const double width = abstractScrollGraphicsScene()->width(); if (QApplication::mouseButtons() == Qt::LeftButton) { - const double frameWidth = timelineScene()->rulerScaling(); + const double frameWidth = abstractScrollGraphicsScene()->rulerScaling(); const double upperThreshold = width - frameWidth; if (rect().center().x() > upperThreshold) { - timelineScene()->setScrollOffset(computeScrollSpeed()); - timelineScene()->invalidateScrollbar(); + abstractScrollGraphicsScene()->setScrollOffset(computeScrollSpeed()); + abstractScrollGraphicsScene()->invalidateScrollbar(); } callSetClampedXPosition(width - (rect().width() / 2) - 1); @@ -253,8 +257,8 @@ void TimelineFrameHandle::scrollOutOfBoundsMax() callSetClampedXPosition(width - (rect().width() / 2) - 1); const int frame = std::floor(mapFromSceneToFrame(rect().center().x())); - const int ef = timelineScene()->endFrame(); - timelineScene()->commitCurrentFrame(frame <= ef ? frame : ef); + const int ef = abstractScrollGraphicsScene()->endFrame(); + timelineGraphicsScene()->commitCurrentFrame(frame <= ef ? frame : ef); } } @@ -264,11 +268,11 @@ void TimelineFrameHandle::scrollOutOfBoundsMin() auto offset = computeScrollSpeed(); if (offset >= 0) - timelineScene()->setScrollOffset(offset); + abstractScrollGraphicsScene()->setScrollOffset(offset); else - timelineScene()->setScrollOffset(0); + abstractScrollGraphicsScene()->setScrollOffset(0); - timelineScene()->invalidateScrollbar(); + abstractScrollGraphicsScene()->invalidateScrollbar(); callSetClampedXPosition(TimelineConstants::sectionWidth); m_timer.start(); @@ -278,7 +282,7 @@ void TimelineFrameHandle::scrollOutOfBoundsMin() int frame = mapFromSceneToFrame(rect().center().x()); - const int sframe = timelineScene()->startFrame(); + const int sframe = abstractScrollGraphicsScene()->startFrame(); if (frame != sframe) { const qreal framePos = mapFromFrameToScene(frame); @@ -287,7 +291,7 @@ void TimelineFrameHandle::scrollOutOfBoundsMin() frame++; } - timelineScene()->commitCurrentFrame(frame >= sframe ? frame : sframe); + timelineGraphicsScene()->commitCurrentFrame(frame >= sframe ? frame : sframe); } } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineitem.h b/src/plugins/qmldesigner/components/timelineeditor/timelineitem.h index 9d8bd9493e..22832f0d0d 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineitem.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineitem.h @@ -35,6 +35,8 @@ QT_FORWARD_DECLARE_CLASS(QPainterPath) namespace QmlDesigner { +class TimelineGraphicsScene; + class TimelineItem : public QGraphicsWidget { Q_OBJECT @@ -59,6 +61,8 @@ public: TimelineFrameHandle *asTimelineFrameHandle() override; + TimelineGraphicsScene *timelineGraphicsScene() const; + protected: void scrollOffsetChanged() override; QPainterPath shape() const override; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinemovableabstractitem.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinemovableabstractitem.cpp index 1d700cf063..12345a404e 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinemovableabstractitem.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinemovableabstractitem.cpp @@ -53,7 +53,7 @@ void TimelineMovableAbstractItem::itemDoubleClicked() int TimelineMovableAbstractItem::scrollOffset() const { - return timelineScene()->scrollOffset(); + return abstractScrollGraphicsScene()->scrollOffset(); } int TimelineMovableAbstractItem::xPosScrollOffset(int x) const @@ -63,7 +63,7 @@ int TimelineMovableAbstractItem::xPosScrollOffset(int x) const qreal TimelineMovableAbstractItem::mapFromFrameToScene(qreal x) const { - return TimelineConstants::sectionWidth + (x - timelineScene()->startFrame()) * rulerScaling() + return TimelineConstants::sectionWidth + (x - abstractScrollGraphicsScene()->startFrame()) * rulerScaling() - scrollOffset() + TimelineConstants::timelineLeftOffset; } @@ -71,8 +71,8 @@ qreal TimelineMovableAbstractItem::mapFromSceneToFrame(qreal x) const { return xPosScrollOffset(x - TimelineConstants::sectionWidth - TimelineConstants::timelineLeftOffset) - / timelineScene()->rulerScaling() - + timelineScene()->startFrame(); + / abstractScrollGraphicsScene()->rulerScaling() + + abstractScrollGraphicsScene()->startFrame(); } void TimelineMovableAbstractItem::mousePressEvent(QGraphicsSceneMouseEvent *event) @@ -133,7 +133,7 @@ TimelineKeyframeItem *TimelineMovableAbstractItem::asTimelineKeyframeItem(QGraph qreal TimelineMovableAbstractItem::rulerScaling() const { - return static_cast<TimelineGraphicsScene *>(scene())->rulerScaling(); + return qobject_cast<AbstractScrollGraphicsScene *>(scene())->rulerScaling(); } int TimelineMovableAbstractItem::type() const @@ -141,9 +141,9 @@ int TimelineMovableAbstractItem::type() const return Type; } -TimelineGraphicsScene *TimelineMovableAbstractItem::timelineScene() const +AbstractScrollGraphicsScene *TimelineMovableAbstractItem::abstractScrollGraphicsScene() const { - return static_cast<TimelineGraphicsScene *>(scene()); + return qobject_cast<AbstractScrollGraphicsScene *>(scene()); } TimelineKeyframeItem *TimelineMovableAbstractItem::asTimelineKeyframeItem() diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinemovableabstractitem.h b/src/plugins/qmldesigner/components/timelineeditor/timelinemovableabstractitem.h index cf71397225..199a78ad99 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinemovableabstractitem.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinemovableabstractitem.h @@ -32,7 +32,7 @@ namespace QmlDesigner { -class TimelineGraphicsScene; +class AbstractScrollGraphicsScene; class TimelineKeyframeItem; class TimelineFrameHandle; @@ -75,7 +75,7 @@ protected: void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; void setClampedXPosition(qreal x, qreal min, qreal max); - TimelineGraphicsScene *timelineScene() const; + AbstractScrollGraphicsScene *abstractScrollGraphicsScene() const; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.cpp index b62b64de9d..5dc52bbc9b 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.cpp @@ -61,7 +61,7 @@ QPointF mapToItem(TimelineMovableAbstractItem *item, QGraphicsSceneMouseEvent *e return event->scenePos(); } -TimelineMoveTool::TimelineMoveTool(TimelineGraphicsScene *scene, TimelineToolDelegate *delegate) +TimelineMoveTool::TimelineMoveTool(AbstractScrollGraphicsScene *scene, TimelineToolDelegate *delegate) : TimelineAbstractTool(scene, delegate) {} @@ -155,7 +155,7 @@ void TimelineMoveTool::mouseReleaseEvent(TimelineMovableAbstractItem *item, } } - scene()->timelineView()->executeInTransaction("TimelineMoveTool::mouseReleaseEvent", + scene()->abstractView()->executeInTransaction("TimelineMoveTool::mouseReleaseEvent", [this, current]() { current->commitPosition(mapToItem(current, current->rect().center())); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.h b/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.h index c5c9702c44..144c123b0e 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinemovetool.h @@ -41,7 +41,7 @@ class TimelineMoveTool : public TimelineAbstractTool Q_DECLARE_TR_FUNCTIONS(TimelineMoveTool) public: - explicit TimelineMoveTool(TimelineGraphicsScene *scene, TimelineToolDelegate *delegate); + explicit TimelineMoveTool(AbstractScrollGraphicsScene *scene, TimelineToolDelegate *delegate); void mousePressEvent(TimelineMovableAbstractItem *item, QGraphicsSceneMouseEvent *event) override; void mouseMoveEvent(TimelineMovableAbstractItem *item, QGraphicsSceneMouseEvent *event) override; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp index 1159619dce..9aef430dea 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp @@ -505,7 +505,7 @@ TimelineKeyframeItem::TimelineKeyframeItem(TimelinePropertyItem *parent, const M TimelineKeyframeItem::~TimelineKeyframeItem() { - timelineScene()->selectKeyframes(SelectionMode::Remove, {this}); + abstractScrollGraphicsScene()->selectKeyframes(SelectionMode::Remove, {this}); } void TimelineKeyframeItem::updateFrame() @@ -555,8 +555,8 @@ void TimelineKeyframeItem::commitPosition(const QPointF &point) void TimelineKeyframeItem::itemDoubleClicked() { - std::pair<qreal, qreal> timelineRange = {timelineScene()->currentTimeline().startKeyframe(), - timelineScene()->currentTimeline().endKeyframe()}; + std::pair<qreal, qreal> timelineRange = {timelineGraphicsScene()->currentTimeline().startKeyframe(), + timelineGraphicsScene()->currentTimeline().endKeyframe()}; editValue(m_frame, timelineRange, propertyItem()->propertyName()); } @@ -565,6 +565,11 @@ TimelineKeyframeItem *TimelineKeyframeItem::asTimelineKeyframeItem() return this; } +TimelineGraphicsScene *TimelineKeyframeItem::timelineGraphicsScene() const +{ + return qobject_cast<TimelineGraphicsScene *>(abstractScrollGraphicsScene()); +} + void TimelineKeyframeItem::blockUpdates() { s_blockUpdates = true; @@ -643,21 +648,21 @@ void TimelineKeyframeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *even QMenu mainMenu; QAction *removeAction = mainMenu.addAction(tr("Delete Keyframe")); QObject::connect(removeAction, &QAction::triggered, [this]() { - timelineScene()->handleKeyframeDeletion(); + timelineGraphicsScene()->handleKeyframeDeletion(); }); QAction *editEasingAction = mainMenu.addAction(tr("Edit Easing Curve...")); QObject::connect(editEasingAction, &QAction::triggered, [this]() { - const QList<ModelNode> keys = Utils::transform(timelineScene()->selectedKeyframes(), + const QList<ModelNode> keys = Utils::transform(abstractScrollGraphicsScene()->selectedKeyframes(), &TimelineKeyframeItem::m_frame); - setEasingCurve(timelineScene(), keys); + setEasingCurve(timelineGraphicsScene(), keys); }); QAction *editValueAction = mainMenu.addAction(tr("Edit Keyframe...")); QObject::connect(editValueAction, &QAction::triggered, [this]() { - std::pair<qreal, qreal> timelineRange = {timelineScene()->currentTimeline().startKeyframe(), - timelineScene()->currentTimeline().endKeyframe()}; + std::pair<qreal, qreal> timelineRange = {timelineGraphicsScene()->currentTimeline().startKeyframe(), + timelineGraphicsScene()->currentTimeline().endKeyframe()}; editValue(m_frame, timelineRange, propertyItem()->propertyName()); }); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.h b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.h index 5d6666f4ed..280b3bee54 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.h @@ -67,6 +67,7 @@ public: void itemDoubleClicked() override; TimelineKeyframeItem *asTimelineKeyframeItem() override; + TimelineGraphicsScene *timelineGraphicsScene() const; protected: bool hasManualBezier() const; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp index 7e8bfb6f50..c77d466585 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp @@ -1,4 +1,4 @@ -/**************************************************************************** +/**************************************************************************** ** ** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ @@ -215,15 +215,7 @@ QVector<qreal> TimelineSectionItem::keyframePositions() const return out; } -QTransform rotatationTransform(qreal degrees) -{ - QTransform transform; - transform.rotate(degrees); - - return transform; -} - -QPixmap rotateby90(const QPixmap &pixmap) +static QPixmap rotateby90(const QPixmap &pixmap) { QImage sourceImage = pixmap.toImage(); QImage destImage(pixmap.height(), pixmap.width(), sourceImage.format()); @@ -550,6 +542,13 @@ void TimelineRulerSectionItem::invalidateRulerSize(const QmlTimeline &timeline) m_end = timeline.endKeyframe(); } +void TimelineRulerSectionItem::invalidateRulerSize(const qreal length) +{ + m_duration = length; + m_start = 0; + m_end = length; +} + void TimelineRulerSectionItem::setRulerScaleFactor(int scaling) { qreal blend = qreal(scaling) / 100.0; @@ -627,10 +626,12 @@ void TimelineRulerSectionItem::paint(QPainter *painter, const QStyleOptionGraphi static const QColor highlightColor = Theme::instance()->Theme::qmlDesignerButtonColor(); static const QColor handleColor = Theme::getColor(Theme::QmlDesigner_HighlightColor); + const int scrollOffset = TimelineGraphicsScene::getScrollOffset(scene()); + painter->save(); painter->save(); painter->setRenderHint(QPainter::Antialiasing); - painter->translate(-timelineScene()->scrollOffset(), 0); + painter->translate(-scrollOffset, 0); painter->fillRect(TimelineConstants::sectionWidth, 0, size().width() - TimelineConstants::sectionWidth, @@ -666,11 +667,13 @@ void TimelineRulerSectionItem::paint(QPainter *painter, const QStyleOptionGraphi const int height = size().height() - 1; + + drawLine(painter, - TimelineConstants::sectionWidth + timelineScene()->scrollOffset() + TimelineConstants::sectionWidth + scrollOffset - TimelineConstants::timelineLeftOffset, height, - size().width() + timelineScene()->scrollOffset(), + size().width() + scrollOffset, height); QFont font = painter->font(); @@ -720,9 +723,12 @@ void TimelineRulerSectionItem::paintTicks(QPainter *painter) m_frameTick = qreal(deltaLine); + int scrollOffset = TimelineGraphicsScene::getScrollOffset(scene()); + int height = size().height(); - const int totalWidth = (size().width() + timelineScene()->scrollOffset()) / m_scaling; - for (int i = timelineScene()->scrollOffset() / m_scaling; i < totalWidth; ++i) { + const int totalWidth = (size().width() + scrollOffset) / m_scaling; + + for (int i = scrollOffset / m_scaling; i < totalWidth; ++i) { if ((i % deltaText) == 0) { drawCenteredText(painter, TimelineConstants::sectionWidth + i * m_scaling, @@ -794,11 +800,11 @@ void TimelineBarItem::itemMoved(const QPointF &start, const QPointF &end) qreal min = qreal(TimelineConstants::sectionWidth + TimelineConstants::timelineLeftOffset - scrollOffset()); - qreal max = qreal(timelineScene()->rulerWidth() - TimelineConstants::sectionWidth + qreal max = qreal(abstractScrollGraphicsScene()->rulerWidth() - TimelineConstants::sectionWidth + rect().width()); - const qreal minFrameX = mapFromFrameToScene(timelineScene()->startFrame()); - const qreal maxFrameX = mapFromFrameToScene(timelineScene()->endFrame()); + const qreal minFrameX = mapFromFrameToScene(abstractScrollGraphicsScene()->startFrame() - 1); + const qreal maxFrameX = mapFromFrameToScene(abstractScrollGraphicsScene()->endFrame()+ 1000); if (min < minFrameX) min = minFrameX; @@ -811,7 +817,7 @@ void TimelineBarItem::itemMoved(const QPointF &start, const QPointF &end) else dragHandle(rect(), end, min, max); - timelineScene()->statusBarMessageChanged( + abstractScrollGraphicsScene()->statusBarMessageChanged( tr("Range from %1 to %2") .arg(qRound(mapFromSceneToFrame(rect().x()))) .arg(qRound(mapFromSceneToFrame(rect().width() + rect().x())))); @@ -975,7 +981,7 @@ void TimelineBarItem::dragCenter(QRectF rect, const QPointF &pos, qreal min, qre if (validateBounds(pos.x() - rect.topLeft().x())) { qreal targetX = pos.x() - m_pivot; if (QApplication::keyboardModifiers() & Qt::ShiftModifier) { // snapping - qreal snappedTargetFrame = timelineScene()->snap(mapFromSceneToFrame(targetX)); + qreal snappedTargetFrame = abstractScrollGraphicsScene()->snap(mapFromSceneToFrame(targetX)); targetX = mapFromFrameToScene(snappedTargetFrame); } rect.moveLeft(targetX); @@ -999,7 +1005,7 @@ void TimelineBarItem::dragHandle(QRectF rect, const QPointF &pos, qreal min, qre if (validateBounds(pos.x() - left.topLeft().x())) { qreal targetX = pos.x() - m_pivot; if (QApplication::keyboardModifiers() & Qt::ShiftModifier) { // snapping - qreal snappedTargetFrame = timelineScene()->snap(mapFromSceneToFrame(targetX)); + qreal snappedTargetFrame = abstractScrollGraphicsScene()->snap(mapFromSceneToFrame(targetX)); targetX = mapFromFrameToScene(snappedTargetFrame); } rect.setLeft(targetX); @@ -1015,7 +1021,7 @@ void TimelineBarItem::dragHandle(QRectF rect, const QPointF &pos, qreal min, qre if (validateBounds(pos.x() - right.topRight().x())) { qreal targetX = pos.x() - m_pivot; if (QApplication::keyboardModifiers() & Qt::ShiftModifier) { // snapping - qreal snappedTargetFrame = timelineScene()->snap(mapFromSceneToFrame(targetX)); + qreal snappedTargetFrame = abstractScrollGraphicsScene()->snap(mapFromSceneToFrame(targetX)); targetX = mapFromFrameToScene(snappedTargetFrame); } rect.setRight(targetX); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.h b/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.h index 0cd8817a41..e5403bcb74 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.h @@ -151,6 +151,7 @@ public: static TimelineRulerSectionItem *create(QGraphicsScene *parentScene, TimelineItem *parent); void invalidateRulerSize(const QmlTimeline &timeline); + void invalidateRulerSize(const qreal length); void setRulerScaleFactor(int scaling); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp index a33f844b2e..81d4bab8b3 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp @@ -38,7 +38,7 @@ namespace QmlDesigner { -TimelineSelectionTool::TimelineSelectionTool(TimelineGraphicsScene *scene, +TimelineSelectionTool::TimelineSelectionTool(AbstractScrollGraphicsScene *scene, TimelineToolDelegate *delegate) : TimelineAbstractTool(scene, delegate) , m_selectionRect(new QGraphicsRectItem) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.h b/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.h index 3485e087ec..f635ea0530 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.h @@ -45,7 +45,7 @@ enum class SelectionMode { New, Add, Remove, Toggle }; class TimelineSelectionTool : public TimelineAbstractTool { public: - explicit TimelineSelectionTool(TimelineGraphicsScene *scene, TimelineToolDelegate *delegate); + explicit TimelineSelectionTool(AbstractScrollGraphicsScene *scene, TimelineToolDelegate *delegate); ~TimelineSelectionTool() override; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp index dec61de19f..39874f51b0 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp @@ -56,19 +56,19 @@ namespace QmlDesigner { -bool isSpacer(QObject *object) +static bool isSpacer(QObject *object) { return object->property("spacer_widget").toBool(); } -QWidget *createSpacer() +static QWidget *createSpacer() { QWidget *spacer = new QWidget(); spacer->setProperty("spacer_widget", true); return spacer; } -int controlWidth(QToolBar *bar, QObject *control) +static int controlWidth(QToolBar *bar, QObject *control) { QWidget *widget = nullptr; @@ -84,7 +84,7 @@ int controlWidth(QToolBar *bar, QObject *control) return 0; } -QAction *createAction(const Core::Id &id, +static QAction *createAction(const Core::Id &id, const QIcon &icon, const QString &name, const QKeySequence &shortcut) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinetooldelegate.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinetooldelegate.cpp index cbf1177912..f1b28e8b9f 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinetooldelegate.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinetooldelegate.cpp @@ -38,7 +38,7 @@ namespace QmlDesigner { -TimelineToolDelegate::TimelineToolDelegate(TimelineGraphicsScene *scene) +TimelineToolDelegate::TimelineToolDelegate(AbstractScrollGraphicsScene *scene) : m_scene(scene) , m_start() , m_moveTool(new TimelineMoveTool(scene, this)) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinetooldelegate.h b/src/plugins/qmldesigner/components/timelineeditor/timelinetooldelegate.h index f945c1a61b..0a328386c0 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinetooldelegate.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinetooldelegate.h @@ -38,7 +38,7 @@ class TimelineGraphicsScene; class TimelineToolDelegate { public: - TimelineToolDelegate(TimelineGraphicsScene* scene); + TimelineToolDelegate(AbstractScrollGraphicsScene* scene); QPointF startPoint() const; @@ -65,7 +65,7 @@ private: private: static const int dragDistance = 20; - TimelineGraphicsScene* m_scene; + AbstractScrollGraphicsScene* m_scene; QPointF m_start; |