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:
Thomas Hartmann
2022-09-09 16:34:24 +02:00
parent f5b3b5c88e
commit af0728e530
2 changed files with 21 additions and 0 deletions

View File

@@ -37,6 +37,8 @@
#include <utils/qtcassert.h>
#include <QScopeGuard>
using namespace QmlDesigner;
static const int propertyNameRole = Qt::UserRole + 1;
@@ -315,12 +317,21 @@ void DynamicPropertyRow::setupBackendValue()
void DynamicPropertyRow::commitValue(const QVariant &value)
{
if (m_lock)
return;
if (m_row < 0)
return;
auto propertiesModel = m_model->dynamicPropertiesModel();
VariantProperty variantProperty = propertiesModel->variantPropertyForRow(m_row);
if (!Internal::DynamicPropertiesModel::isValueType(variantProperty.dynamicTypeName()))
return;
m_lock = true;
auto unlock = qScopeGuard([this] { m_lock = false; });
auto view = propertiesModel->view();
RewriterTransaction transaction = view->beginRewriterTransaction(
QByteArrayLiteral("DynamicPropertiesModel::commitValue"));
@@ -335,6 +346,15 @@ void DynamicPropertyRow::commitValue(const QVariant &value)
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();
BindingProperty bindingProperty = propertiesModel->bindingPropertyForRow(m_row);

View File

@@ -105,6 +105,7 @@ private:
PropertyEditorValue *m_backendValue = nullptr;
DynamicPropertiesProxyModel *m_model = nullptr;
QList<PropertyEditorValue *> m_proxyBackendValues;
bool m_lock = false;
};
QML_DECLARE_TYPE(DynamicPropertyRow)