From aaf564cab7cbb0a79c37098bd9642a72cef9a9ba Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Fri, 16 Oct 2020 16:45:44 +0200 Subject: CurveEditor: Fix bounding rect computation for the graphicsscene MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QDS-2957 Change-Id: I0019d538e7460e923b35024bd02f7186e1935f6b Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../components/curveeditor/curveeditormodel.cpp | 6 ++--- .../components/curveeditor/curveeditormodel.h | 2 +- .../components/curveeditor/curveeditorstyle.h | 9 +++++++- .../components/curveeditor/curveeditorview.cpp | 4 ++-- .../components/curveeditor/detail/curveitem.cpp | 10 ++++++++ .../curveeditor/detail/graphicsscene.cpp | 27 +++++++++++++++++++++- .../components/curveeditor/detail/graphicsscene.h | 4 ++++ .../components/curveeditor/detail/graphicsview.cpp | 4 ++-- 8 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp index db58ce4dbb..56b91d0af6 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp @@ -39,10 +39,10 @@ namespace DesignTools { -CurveEditorModel::CurveEditorModel(double minTime, double maxTime, QObject *parent) +CurveEditorModel::CurveEditorModel(QObject *parent) : TreeModel(parent) - , m_minTime(minTime) - , m_maxTime(maxTime) + , m_minTime(CurveEditorStyle::defaultTimeMin) + , m_maxTime(CurveEditorStyle::defaultTimeMax) {} CurveEditorModel::~CurveEditorModel() {} diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h index 952dc46c63..cf7575ca5c 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h @@ -57,7 +57,7 @@ signals: void curveChanged(PropertyTreeItem *item); public: - CurveEditorModel(double minTime, double maxTime, QObject *parent = nullptr); + CurveEditorModel(QObject *parent = nullptr); ~CurveEditorModel() override; diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h b/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h index 6d6acebc51..854fabff23 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h @@ -105,6 +105,13 @@ struct Shortcuts struct CurveEditorStyle { + static constexpr double defaultTimeMin = 0.0; + static constexpr double defaultTimeMax = 100.0; + static constexpr double defaultValueMin = -1.0; + static constexpr double defaultValueMax = 1.0; + + static double defaultValueRange() { return std::abs(defaultValueMin - defaultValueMax); } + Shortcuts shortcuts; QBrush backgroundBrush = QBrush(QColor(5, 0, 100)); @@ -124,7 +131,7 @@ struct CurveEditorStyle double valueAxisWidth = 60.0; double valueOffsetTop = 10.0; double valueOffsetBottom = 10.0; - double labelDensityY = 1.5; + double labelDensityY = 2.0; HandleItemStyleOption handleStyle; KeyframeItemStyleOption keyframeStyle; diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp index 9d858d684c..b84d386f8e 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp @@ -42,7 +42,7 @@ namespace QmlDesigner { CurveEditorView::CurveEditorView(QObject *parent) : AbstractView(parent) , m_block(false) - , m_model(new DesignTools::CurveEditorModel(0., 500.)) + , m_model(new DesignTools::CurveEditorModel()) , m_editor(new DesignTools::CurveEditor(m_model)) { Q_UNUSED(parent); @@ -267,7 +267,7 @@ ModelNode getTargetNode1(DesignTools::PropertyTreeItem *item, const QmlTimeline QString targetId = nodeItem->name(); if (timeline.isValid()) { for (auto &&target : timeline.allTargets()) { - if (target.displayName() == targetId) + if (target.isValid() && target.displayName() == targetId) return target; } } diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp index 86aae0b2cc..90818be74b 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp @@ -87,6 +87,16 @@ QRectF CurveItem::boundingRect() const for (auto *item : m_keyframes) bbox(bounds, item->keyframe()); + if (auto *s = qobject_cast(scene())) { + bounds.setLeft(s->animationRangeMin()); + bounds.setRight(s->animationRangeMax()); + } + + if (qFuzzyCompare(bounds.height(), 0.0)) { + auto tmp = CurveEditorStyle::defaultValueRange() / 2.0; + bounds.adjust(0.0, -tmp, 0.0, tmp); + } + return m_transform.mapRect(bounds); } diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp index aca41b4d6d..e9f9050f62 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp @@ -114,9 +114,29 @@ double GraphicsScene::maximumValue() const return limits().top(); } +double GraphicsScene::animationRangeMin() const +{ + if (GraphicsView *gview = graphicsView()) + return gview->minimumTime(); + + return minimumTime(); +} + +double GraphicsScene::animationRangeMax() const +{ + if (GraphicsView *gview = graphicsView()) + return gview->maximumTime(); + + return maximumTime(); +} + QRectF GraphicsScene::rect() const { - return sceneRect(); + QRectF rect; + for (auto *curve : curves()) + rect |= curve->boundingRect(); + + return rect; } QVector GraphicsScene::curves() const @@ -410,6 +430,11 @@ QRectF GraphicsScene::limits() const } m_limits = QRectF(QPointF(min.x(), max.y()), QPointF(max.x(), min.y())); + if (qFuzzyCompare(m_limits.height(), 0.0)) { + auto tmp = CurveEditorStyle::defaultValueRange() / 2.0; + m_limits.adjust(0.0, tmp, 0.0, -tmp); + } + m_dirty = false; } return m_limits; diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h index 9443130b3e..c19f72b130 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h @@ -67,6 +67,10 @@ public: double maximumValue() const; + double animationRangeMin() const; + + double animationRangeMax() const; + QRectF rect() const; QVector curves() const; diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp index 9fec8b2fc5..c162b5fd90 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp @@ -126,12 +126,12 @@ double GraphicsView::maximumTime() const double GraphicsView::minimumValue() const { - return m_scene->empty() ? -1.0 : m_scene->minimumValue(); + return m_scene->empty() ? CurveEditorStyle::defaultValueMin : m_scene->minimumValue(); } double GraphicsView::maximumValue() const { - return m_scene->empty() ? 1.0 : m_scene->maximumValue(); + return m_scene->empty() ? CurveEditorStyle::defaultValueMax : m_scene->maximumValue(); } double GraphicsView::zoomX() const -- cgit v1.2.3