From 185ce525612d3944bb7866de3d32f1287fd6e71f Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Mon, 26 Jun 2023 15:57:45 +0200 Subject: [PATCH] Disable unsupported properties if qtForMCUs is set When qtForMCUs is enable in the project, disables the action to open the easing curve editor in the timeline and the actions to set an interpolation to anything else than linear in the animation curve editor. Shows the disabled reason in the tooltip and paint non linear curve segments in the error color and without handles. Fixes: QDS-10061 Change-Id: I71b2af0dd6f6c10714fceb75ff3ac16c88504adf Reviewed-by: Thomas Hartmann Reviewed-by: Qt CI Patch Build Bot --- .../components/curveeditor/animationcurve.cpp | 2 +- .../components/curveeditor/curveeditor.cpp | 9 +++++ .../components/curveeditor/curveeditor.h | 1 + .../curveeditor/curveeditortoolbar.cpp | 38 ++++++++++++++----- .../curveeditor/curveeditortoolbar.h | 9 +++++ .../components/curveeditor/curvesegment.cpp | 9 ++++- .../components/curveeditor/curvesegment.h | 2 + .../curveeditor/detail/curveitem.cpp | 19 +++++++--- .../components/curveeditor/detail/curveitem.h | 12 ++++-- .../curveeditor/detail/graphicsscene.cpp | 31 +++++++++++---- .../curveeditor/detail/graphicsscene.h | 16 +++++--- .../curveeditor/detail/graphicsview.cpp | 5 +++ .../curveeditor/detail/graphicsview.h | 2 + .../timelineeditor/timelinetoolbar.cpp | 21 +++++++--- .../timelineeditor/timelinetoolbar.h | 4 ++ .../timelineeditor/timelinewidget.cpp | 2 + 16 files changed, 142 insertions(+), 40 deletions(-) diff --git a/src/plugins/qmldesigner/components/curveeditor/animationcurve.cpp b/src/plugins/qmldesigner/components/curveeditor/animationcurve.cpp index 0886ad42565..712cb32c8da 100644 --- a/src/plugins/qmldesigner/components/curveeditor/animationcurve.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/animationcurve.cpp @@ -47,7 +47,7 @@ AnimationCurve::AnimationCurve( return QPointF(start.x() + slope.x() * pos.x(), start.y() + slope.y() * pos.y()); }; - QVector points = easing.toCubicSpline(); + QList points = easing.toCubicSpline(); int numSegments = points.size() / 3; Keyframe current; diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditor.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditor.cpp index d0452fd6e26..6858cc50888 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditor.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditor.cpp @@ -8,6 +8,7 @@ #include "detail/graphicsview.h" #include "detail/treeview.h" +#include #include #include @@ -106,6 +107,7 @@ CurveEditor::CurveEditor(CurveEditorModel *model, QWidget *parent) auto updateTimeline = [this, model](bool validTimeline) { if (validTimeline) { updateStatusLine(); + updateMcuState(); m_view->setCurrentFrame(m_view->model()->currentFrame(), false); m_toolbar->updateBoundsSilent(model->minimumTime(), model->maximumTime()); m_toolbar->show(); @@ -163,4 +165,11 @@ void CurveEditor::updateStatusLine() m_statusLine->setText(currentText); } +void CurveEditor::updateMcuState() +{ + bool isMcu = DesignerMcuManager::instance().isMCUProject(); + m_toolbar->setIsMcuProject(isMcu); + m_view->setIsMcu(isMcu); +} + } // End namespace QmlDesigner. diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditor.h b/src/plugins/qmldesigner/components/curveeditor/curveeditor.h index 9965d125731..24d2cd5edd9 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditor.h +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditor.h @@ -38,6 +38,7 @@ protected: private: void updateStatusLine(); + void updateMcuState(); QLabel *m_infoText; diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditortoolbar.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditortoolbar.cpp index 27a14968c61..773abe1d904 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditortoolbar.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditortoolbar.cpp @@ -60,7 +60,9 @@ CurveEditorToolBar::CurveEditorToolBar(CurveEditorModel *model, QWidget* parent) , m_startSpin(nullptr) , m_endSpin(nullptr) , m_currentSpin(new QSpinBox) - + , m_stepAction(nullptr) + , m_splineAction(nullptr) + , m_unifyAction(nullptr) { setFloatable(false); setFixedHeight(Theme::toolbarSize()); @@ -68,11 +70,10 @@ CurveEditorToolBar::CurveEditorToolBar(CurveEditorModel *model, QWidget* parent) addSpace(5); - QAction *tangentLinearAction = addAction(Theme::iconFromName(Theme::linear_medium), "Linear"); - QAction *tangentStepAction = addAction(Theme::iconFromName(Theme::step_medium), "Step"); - QAction *tangentSplineAction = addAction(Theme::iconFromName(Theme::bezier_medium), "Spline"); - - QAction *tangentUnifyAction = addAction(Theme::iconFromName(Theme::unify_medium), tr("Unify")); + QAction *tangentLinearAction = addAction(Theme::iconFromName(Theme::linear_medium), tr("Linear")); + m_stepAction = addAction(Theme::iconFromName(Theme::step_medium), tr(m_stepLabel)); + m_splineAction = addAction(Theme::iconFromName(Theme::bezier_medium), tr(m_splineLabel)); + m_unifyAction = addAction(Theme::iconFromName(Theme::unify_medium), tr(m_unifyLabel)); auto setLinearInterpolation = [this]() { emit interpolationClicked(Keyframe::Interpolation::Linear); @@ -88,9 +89,9 @@ CurveEditorToolBar::CurveEditorToolBar(CurveEditorModel *model, QWidget* parent) }; connect(tangentLinearAction, &QAction::triggered, setLinearInterpolation); - connect(tangentStepAction, &QAction::triggered, setStepInterpolation); - connect(tangentSplineAction, &QAction::triggered, setSplineInterpolation); - connect(tangentUnifyAction, &QAction::triggered, toggleUnifyKeyframe); + connect(m_stepAction, &QAction::triggered, setStepInterpolation); + connect(m_splineAction, &QAction::triggered, setSplineInterpolation); + connect(m_unifyAction, &QAction::triggered, toggleUnifyKeyframe); auto validateStart = [this](int val) -> bool { if (m_endSpin==nullptr) @@ -189,6 +190,25 @@ CurveEditorToolBar::CurveEditorToolBar(CurveEditorModel *model, QWidget* parent) addSpace(5); } +void CurveEditorToolBar::setIsMcuProject(bool isMcu) +{ + m_stepAction->setDisabled(isMcu); + m_splineAction->setDisabled(isMcu); + m_unifyAction->setDisabled(isMcu); + + static constexpr const char* notSupportedString = QT_TR_NOOP("Not supported for MCUs"); + + if (isMcu) { + m_stepAction->setText(tr(notSupportedString)); + m_splineAction->setText(tr(notSupportedString)); + m_unifyAction->setText(tr(notSupportedString)); + } else { + m_stepAction->setText(tr(m_stepLabel)); + m_splineAction->setText(tr(m_splineLabel)); + m_unifyAction->setText(tr(m_unifyLabel)); + } +} + void CurveEditorToolBar::setZoom(double zoom) { QSignalBlocker blocker(m_zoomSlider); diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditortoolbar.h b/src/plugins/qmldesigner/components/curveeditor/curveeditortoolbar.h index c7bb6bc8182..5b796b8e004 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditortoolbar.h +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditortoolbar.h @@ -50,6 +50,8 @@ signals: public: CurveEditorToolBar(CurveEditorModel *model, QWidget* parent = nullptr); + void setIsMcuProject(bool isMcu); + void setZoom(double zoom); void setCurrentFrame(int current, bool notify); @@ -65,6 +67,13 @@ private: ValidatableSpinBox *m_endSpin; QSpinBox *m_currentSpin; QSlider *m_zoomSlider; + QAction *m_stepAction; + QAction *m_splineAction; + QAction *m_unifyAction; + + static constexpr const char* m_stepLabel = QT_TR_NOOP("Step"); + static constexpr const char* m_splineLabel = QT_TR_NOOP("Spline"); + static constexpr const char* m_unifyLabel = QT_TR_NOOP("Unify"); }; } // End namespace QmlDesigner. diff --git a/src/plugins/qmldesigner/components/curveeditor/curvesegment.cpp b/src/plugins/qmldesigner/components/curveeditor/curvesegment.cpp index 76fa2a2ffc2..cf90174c999 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curvesegment.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curvesegment.cpp @@ -165,6 +165,13 @@ bool CurveSegment::isLegal() const return ex.size() == 0; } +bool CurveSegment::isLegalMcu() const +{ + if (interpolation() == Keyframe::Interpolation::Linear) + return isValid(); + return false; +} + bool CurveSegment::containsX(double x) const { return m_left.position().x() <= x && m_right.position().x() >= x; @@ -243,7 +250,7 @@ void CurveSegment::extendWithEasingCurve(QPainterPath &path, const QEasingCurve return QPointF(start.x() + slope.x() * pos.x(), start.y() + slope.y() * pos.y()); }; - QVector points = curve.toCubicSpline(); + QList points = curve.toCubicSpline(); int numSegments = points.size() / 3; for (int i = 0; i < numSegments; i++) { QPointF p1 = mapEasing(m_left.position(), m_right.position(), points.at(i * 3)); diff --git a/src/plugins/qmldesigner/components/curveeditor/curvesegment.h b/src/plugins/qmldesigner/components/curveeditor/curvesegment.h index cfb925b2bdc..566cd6f69d8 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curvesegment.h +++ b/src/plugins/qmldesigner/components/curveeditor/curvesegment.h @@ -27,6 +27,8 @@ public: bool isLegal() const; + bool isLegalMcu() const; + bool containsX(double x) const; Keyframe left() const; diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp index 34d811525c1..da59b49884d 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp @@ -23,6 +23,7 @@ CurveItem::CurveItem(unsigned int id, const AnimationCurve &curve, QGraphicsItem , m_component(PropertyTreeItem::Component::Generic) , m_transform() , m_keyframes() + , m_mcu(false) , m_itemDirty(false) { setFlag(QGraphicsItem::ItemIsMovable, false); @@ -96,7 +97,7 @@ void CurveItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidg } else { if (locked()) pen.setColor(m_style.lockedColor); - else if (!segment.isLegal()) + else if (!segment.isLegal() || (m_mcu && !segment.isLegalMcu())) pen.setColor(m_style.errorColor); else if (isUnderMouse()) pen.setColor(m_style.hoverColor); @@ -269,14 +270,14 @@ std::vector CurveItem::curves() const return out; } -QVector CurveItem::keyframes() const +QList CurveItem::keyframes() const { return m_keyframes; } -QVector CurveItem::selectedKeyframes() const +QList CurveItem::selectedKeyframes() const { - QVector out; + QList out; for (auto *frame : m_keyframes) { if (frame->selected()) out.push_back(frame); @@ -284,9 +285,9 @@ QVector CurveItem::selectedKeyframes() const return out; } -QVector CurveItem::handles() const +QList CurveItem::handles() const { - QVector out; + QList out; for (auto *frame : m_keyframes) { if (auto *left = frame->leftHandle()) out.push_back(left); @@ -353,6 +354,12 @@ void CurveItem::setDirty(bool dirty) m_itemDirty = dirty; } +void CurveItem::setIsMcu(bool isMcu) +{ + m_mcu = isMcu; + setHandleVisibility(!m_mcu); +} + void CurveItem::setHandleVisibility(bool visible) { for (auto *frame : std::as_const(m_keyframes)) diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.h b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.h index d028f53404d..eab60023c85 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.h @@ -77,11 +77,11 @@ public: std::vector curves() const; - QVector keyframes() const; + QList keyframes() const; - QVector selectedKeyframes() const; + QList selectedKeyframes() const; - QVector handles() const; + QList handles() const; CurveSegment segment(const KeyframeItem *keyframe, HandleItem::Slot slot) const; @@ -89,6 +89,8 @@ public: void setDirty(bool dirty); + void setIsMcu(bool isMcu); + void setHandleVisibility(bool visible); void setValueType(PropertyTreeItem::ValueType type); @@ -126,7 +128,9 @@ private: QTransform m_transform; - QVector m_keyframes; + QList m_keyframes; + + bool m_mcu; bool m_itemDirty; }; diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp index 49c96ed04d8..d981b9cd183 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp @@ -120,14 +120,14 @@ QRectF GraphicsScene::rect() const return rect; } -QVector GraphicsScene::curves() const +QList GraphicsScene::curves() const { return m_curves; } -QVector GraphicsScene::selectedCurves() const +QList GraphicsScene::selectedCurves() const { - QVector out; + QList out; for (auto *curve : m_curves) { if (curve->hasSelectedKeyframe()) out.push_back(curve); @@ -135,18 +135,18 @@ QVector GraphicsScene::selectedCurves() const return out; } -QVector GraphicsScene::keyframes() const +QList GraphicsScene::keyframes() const { - QVector out; + QList out; for (auto *curve : m_curves) out.append(curve->keyframes()); return out; } -QVector GraphicsScene::selectedKeyframes() const +QList GraphicsScene::selectedKeyframes() const { - QVector out; + QList out; for (auto *curve : m_curves) out.append(curve->selectedKeyframes()); @@ -191,6 +191,13 @@ void GraphicsScene::setDirty(bool dirty) m_dirty = dirty; } +void GraphicsScene::setIsMcu(bool isMcu) +{ + m_isMcu = isMcu; + for (auto* curve : curves()) + curve->setIsMcu(isMcu); +} + void GraphicsScene::reset() { m_curves.clear(); @@ -244,6 +251,9 @@ void GraphicsScene::removeCurveItem(unsigned int id) void GraphicsScene::addCurveItem(CurveItem *item) { + if (!item) + return; + for (auto *curve : std::as_const(m_curves)) { if (curve->id() == item->id()) { delete item; @@ -251,6 +261,7 @@ void GraphicsScene::addCurveItem(CurveItem *item) } } + item->setIsMcu(m_isMcu); item->setDirty(false); item->connect(this); addItem(item); @@ -267,6 +278,9 @@ void GraphicsScene::addCurveItem(CurveItem *item) void GraphicsScene::moveToBottom(CurveItem *item) { + if (!item) + return; + if (m_curves.removeAll(item) > 0) { m_curves.push_front(item); resetZValues(); @@ -275,6 +289,9 @@ void GraphicsScene::moveToBottom(CurveItem *item) void GraphicsScene::moveToTop(CurveItem *item) { + if (!item) + return; + if (m_curves.removeAll(item) > 0) { m_curves.push_back(item); resetZValues(); diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h index 182980f62c3..abbc6658453 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h @@ -54,15 +54,15 @@ public: QRectF rect() const; - QVector curves() const; + QList curves() const; - QVector selectedCurves() const; + QList selectedCurves() const; - QVector keyframes() const; + QList keyframes() const; - QVector selectedKeyframes() const; + QList selectedKeyframes() const; - QVector handles() const; + QList handles() const; CurveItem *findCurve(unsigned int id) const; @@ -70,6 +70,8 @@ public: void setDirty(bool dirty); + void setIsMcu(bool isMcu); + void reset(); void deleteSelectedKeyframes(); @@ -120,7 +122,7 @@ private: void resetZValues(); - QVector m_curves; + QList m_curves; mutable bool m_dirty; @@ -129,6 +131,8 @@ private: bool m_doNotMoveItems; QElapsedTimer m_usageTimer; + + bool m_isMcu; }; } // End namespace QmlDesigner. diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp index 5127f206042..d41a25c43bb 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp @@ -189,6 +189,11 @@ void GraphicsView::setStyle(const CurveEditorStyle &style) viewport()->update(); } +void GraphicsView::setIsMcu(bool isMcu) +{ + m_scene->setIsMcu(isMcu); +} + void GraphicsView::setLocked(TreeItem *item) { if (item->asNodeItem()) { diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.h b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.h index 120249b605f..60fb8d08d36 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.h @@ -72,6 +72,8 @@ public: QRectF defaultRasterRect() const; + void setIsMcu(bool isMcu); + void setLocked(TreeItem *item); void setPinned(TreeItem *item); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp index b4ab0583c70..1d0c84a3b80 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp @@ -187,6 +187,15 @@ void TimelineToolBar::setPlayState(bool state) m_playing->setChecked(state); } +void TimelineToolBar::setIsMcu(bool isMcu) +{ + m_curvePicker->setDisabled(isMcu); + if (isMcu) + m_curvePicker->setText(tr("Not Supported for MCUs")); + else + m_curvePicker->setText(tr(m_curveEditorName)); +} + void TimelineToolBar::setActionEnabled(const QString &name, bool enabled) { for (auto *action : actions()) @@ -378,14 +387,14 @@ void TimelineToolBar::createCenterControls() addSpacing(10); - auto *curvePicker = createAction(TimelineConstants::C_CURVE_PICKER, + m_curvePicker = createAction(TimelineConstants::C_CURVE_PICKER, Theme::iconFromName(Theme::Icon::curveDesigner_medium), - tr("Easing Curve Editor"), + tr(m_curveEditorName), QKeySequence(Qt::Key_C)); - curvePicker->setObjectName("Easing Curve Editor"); - connect(curvePicker, &QAction::triggered, this, &TimelineToolBar::openEasingCurveEditor); - addAction(curvePicker); + m_curvePicker->setObjectName("Easing Curve Editor"); + connect(m_curvePicker, &QAction::triggered, this, &TimelineToolBar::openEasingCurveEditor); + addAction(m_curvePicker); addSpacing(10); @@ -394,7 +403,7 @@ void TimelineToolBar::createCenterControls() addSpacing(10); - auto *curveEditor = new QAction(TimelineIcons::CURVE_PICKER.icon(), tr("Curve Editor")); + auto *curveEditor = new QAction(TimelineIcons::CURVE_PICKER.icon(), tr(m_curveEditorName)); addAction(curveEditor); #endif } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.h b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.h index ff1b567dfc3..1d5fb9eaebb 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.h @@ -60,6 +60,7 @@ public: void setEndFrame(qreal frame); void setScaleFactor(int factor); void setPlayState(bool state); + void setIsMcu(bool isMcu); void setActionEnabled(const QString &name, bool enabled); void removeTimeline(const QmlTimeline &timeline); @@ -86,7 +87,10 @@ private: QAction *m_playing = nullptr; QAction *m_recording = nullptr; + QAction *m_curvePicker = nullptr; bool m_blockReflection = false; + + static constexpr const char* m_curveEditorName = QT_TR_NOOP("Easing Curve Editor"); }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp index 3bccd598b41..f6e9a3ad27c 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp @@ -21,6 +21,7 @@ #include +#include #include #include #include @@ -478,6 +479,7 @@ void TimelineWidget::init(int zoom) // setScaleFactor uses QSignalBlocker. m_toolbar->setScaleFactor(zoom); + m_toolbar->setIsMcu(DesignerMcuManager::instance().isMCUProject()); m_graphicsScene->setZoom(zoom); }