forked from qt-creator/qt-creator
QmlDesigner: Add early return for invalid row
Also avoiding reflection by locking during the write to the model. Change-Id: I290ae8fa38aae510454d3fa1af020d579881ff9c Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
@@ -37,6 +37,8 @@
|
|||||||
|
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
|
#include <QScopeGuard>
|
||||||
|
|
||||||
using namespace QmlDesigner;
|
using namespace QmlDesigner;
|
||||||
|
|
||||||
static const int propertyNameRole = Qt::UserRole + 1;
|
static const int propertyNameRole = Qt::UserRole + 1;
|
||||||
@@ -315,12 +317,21 @@ void DynamicPropertyRow::setupBackendValue()
|
|||||||
|
|
||||||
void DynamicPropertyRow::commitValue(const QVariant &value)
|
void DynamicPropertyRow::commitValue(const QVariant &value)
|
||||||
{
|
{
|
||||||
|
if (m_lock)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_row < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
auto propertiesModel = m_model->dynamicPropertiesModel();
|
auto propertiesModel = m_model->dynamicPropertiesModel();
|
||||||
VariantProperty variantProperty = propertiesModel->variantPropertyForRow(m_row);
|
VariantProperty variantProperty = propertiesModel->variantPropertyForRow(m_row);
|
||||||
|
|
||||||
if (!Internal::DynamicPropertiesModel::isValueType(variantProperty.dynamicTypeName()))
|
if (!Internal::DynamicPropertiesModel::isValueType(variantProperty.dynamicTypeName()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
m_lock = true;
|
||||||
|
auto unlock = qScopeGuard([this] { m_lock = false; });
|
||||||
|
|
||||||
auto view = propertiesModel->view();
|
auto view = propertiesModel->view();
|
||||||
RewriterTransaction transaction = view->beginRewriterTransaction(
|
RewriterTransaction transaction = view->beginRewriterTransaction(
|
||||||
QByteArrayLiteral("DynamicPropertiesModel::commitValue"));
|
QByteArrayLiteral("DynamicPropertiesModel::commitValue"));
|
||||||
@@ -335,6 +346,15 @@ void DynamicPropertyRow::commitValue(const QVariant &value)
|
|||||||
|
|
||||||
void DynamicPropertyRow::commitExpression(const QString &expression)
|
void DynamicPropertyRow::commitExpression(const QString &expression)
|
||||||
{
|
{
|
||||||
|
if (m_lock)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_row < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_lock = true;
|
||||||
|
auto unlock = qScopeGuard([this] { m_lock = false; });
|
||||||
|
|
||||||
auto propertiesModel = m_model->dynamicPropertiesModel();
|
auto propertiesModel = m_model->dynamicPropertiesModel();
|
||||||
BindingProperty bindingProperty = propertiesModel->bindingPropertyForRow(m_row);
|
BindingProperty bindingProperty = propertiesModel->bindingPropertyForRow(m_row);
|
||||||
|
|
||||||
|
@@ -105,6 +105,7 @@ private:
|
|||||||
PropertyEditorValue *m_backendValue = nullptr;
|
PropertyEditorValue *m_backendValue = nullptr;
|
||||||
DynamicPropertiesProxyModel *m_model = nullptr;
|
DynamicPropertiesProxyModel *m_model = nullptr;
|
||||||
QList<PropertyEditorValue *> m_proxyBackendValues;
|
QList<PropertyEditorValue *> m_proxyBackendValues;
|
||||||
|
bool m_lock = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
QML_DECLARE_TYPE(DynamicPropertyRow)
|
QML_DECLARE_TYPE(DynamicPropertyRow)
|
||||||
|
Reference in New Issue
Block a user