Files
qt-creator/src/plugins/qmldesigner/components/curveeditor/curveeditor.cpp
Knud Dollereder 185ce52561 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 <thomas.hartmann@qt.io>
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
2023-08-25 08:30:01 +00:00

176 lines
5.0 KiB
C++

// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "curveeditor.h"
#include "curveeditormodel.h"
#include "curveeditortoolbar.h"
#include "detail/curveitem.h"
#include "detail/graphicsview.h"
#include "detail/treeview.h"
#include <designermcumanager.h>
#include <utils/fileutils.h>
#include <QDoubleSpinBox>
#include <QLabel>
#include <QScrollArea>
#include <QSplitter>
#include <QVBoxLayout>
namespace QmlDesigner {
CurveEditor::CurveEditor(CurveEditorModel *model, QWidget *parent)
: QWidget(parent)
, m_infoText(nullptr)
, m_statusLine(nullptr)
, m_toolbar(new CurveEditorToolBar(model, this))
, m_tree(new TreeView(model, this))
, m_view(new GraphicsView(model, this))
{
const QString labelText = tr(
"This file does not contain a timeline. <br><br>"
"To create an animation, add a timeline by clicking the + button in the \"Timeline\" view."
);
m_infoText = new QLabel(labelText);
setContentsMargins(0, 0, 0, 0);
m_toolbar->setStyleSheet(Theme::replaceCssColors(
QString::fromUtf8(Utils::FileReader::fetchQrc(":/qmldesigner/stylesheet.css"))));
auto *splitter = new QSplitter;
splitter->addWidget(m_tree);
splitter->addWidget(m_view);
splitter->setStretchFactor(1, 2);
QScrollArea* area = new QScrollArea;
area->setWidget(splitter);
area->setWidgetResizable(true);
area->setContentsMargins(0, 0, 0, 0);
m_statusLine = new QLabel();
auto *box = new QVBoxLayout;
box->setContentsMargins(0, 0, 0, 0);
box->addWidget(m_infoText);
box->addWidget(m_toolbar);
box->addWidget(area);
box->addWidget(m_statusLine);
setLayout(box);
connect(m_toolbar, &CurveEditorToolBar::unifyClicked, [this]() {
m_view->toggleUnified();
});
connect(m_toolbar, &CurveEditorToolBar::interpolationClicked, [this](Keyframe::Interpolation ipol) {
m_view->setInterpolation(ipol);
});
connect(m_toolbar, &CurveEditorToolBar::startFrameChanged, [this, model](int frame) {
model->setMinimumTime(frame);
m_view->viewport()->update();
});
connect(m_toolbar, &CurveEditorToolBar::endFrameChanged, [this, model](int frame) {
model->setMaximumTime(frame);
m_view->viewport()->update();
});
connect(m_toolbar, &CurveEditorToolBar::currentFrameChanged, [this, model](int frame) {
model->setCurrentFrame(frame);
updateStatusLine();
m_view->viewport()->update();
});
connect(m_toolbar, &CurveEditorToolBar::zoomChanged, [this](double zoom) {
const bool wasBlocked = m_view->blockSignals(true);
m_view->setZoomX(zoom);
m_view->blockSignals(wasBlocked);
m_view->viewport()->update();
});
connect(
m_view, &GraphicsView::currentFrameChanged,
m_toolbar, &CurveEditorToolBar::setCurrentFrame);
connect(m_tree, &TreeView::treeItemLocked, model, &CurveEditorModel::setLocked);
connect(m_tree, &TreeView::treeItemPinned, model, &CurveEditorModel::setPinned);
connect(
m_tree->selectionModel(), &SelectionModel::curvesSelected,
m_view, &GraphicsView::updateSelection);
connect(m_view, &GraphicsView::zoomChanged, [this](double x, double y) {
Q_UNUSED(y);
m_toolbar->setZoom(x);
});
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();
m_tree->show();
m_view->show();
m_infoText->hide();
} else {
m_toolbar->hide();
m_tree->hide();
m_view->hide();
m_infoText->show();
}
};
connect(model, &CurveEditorModel::timelineChanged, this, updateTimeline);
connect(model, &CurveEditorModel::setStatusLineMsg, m_statusLine, &QLabel::setText);
}
bool CurveEditor::dragging() const
{
return m_view->dragging();
}
void CurveEditor::zoomX(double zoom)
{
m_view->setZoomX(zoom);
}
void CurveEditor::zoomY(double zoom)
{
m_view->setZoomY(zoom);
}
void CurveEditor::clearCanvas()
{
m_view->reset({});
}
void CurveEditor::showEvent(QShowEvent *event)
{
emit viewEnabledChanged(true);
QWidget::showEvent(event);
}
void CurveEditor::hideEvent(QHideEvent *event)
{
emit viewEnabledChanged(false);
QWidget::hideEvent(event);
}
void CurveEditor::updateStatusLine()
{
int currentFrame = m_view->model()->currentFrame();
QString currentText = QString("Playhead frame %1").arg(currentFrame);
m_statusLine->setText(currentText);
}
void CurveEditor::updateMcuState()
{
bool isMcu = DesignerMcuManager::instance().isMCUProject();
m_toolbar->setIsMcuProject(isMcu);
m_view->setIsMcu(isMcu);
}
} // End namespace QmlDesigner.