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); }