QmlDesigner: Take property types into account

A boolean property should only take a boolean, number only a number
and so on...

Change-Id: Ibc327390262c93bf262570a0c749cd826d06a678
Reviewed-by: Henning Gründl <henning.gruendl@qt.io>
This commit is contained in:
Thomas Hartmann
2023-08-31 16:32:13 +02:00
parent d10b1fbee9
commit cdf0b83094
4 changed files with 41 additions and 0 deletions

View File

@@ -1168,6 +1168,8 @@ void ConnectionModelStatementDelegate::handleRhsAssignmentChanged()
assignmentStatement.rhs.nodeId = m_rhsAssignmentDelegate.id();
assignmentStatement.rhs.propertyName = m_rhsAssignmentDelegate.name();
setupPropertyType();
emit statementChanged();
}
@@ -1305,6 +1307,7 @@ void ConnectionModelStatementDelegate::setupAssignment()
const auto assignment = std::get<ConnectionEditorStatements::Assignment>(m_statement);
m_lhsDelegate.setup(assignment.lhs.nodeId, assignment.lhs.propertyName);
m_rhsAssignmentDelegate.setup(assignment.rhs.nodeId, assignment.rhs.propertyName);
setupPropertyType();
}
void ConnectionModelStatementDelegate::setupSetProperty()
@@ -1420,6 +1423,26 @@ void ConnectionModelStatementDelegate::setupPrintMessage()
m_stringArgument.setText(ConnectionEditorStatements::toString(consoleLog.argument));
}
void ConnectionModelStatementDelegate::setupPropertyType()
{
PropertyTreeModel::PropertyTypes type = PropertyTreeModel::AllTypes;
const NodeMetaInfo metaInfo = m_rhsAssignmentDelegate.propertyMetaInfo();
if (metaInfo.isBool())
type = PropertyTreeModel::BoolType;
else if (metaInfo.isNumber())
type = PropertyTreeModel::NumberType;
else if (metaInfo.isColor())
type = PropertyTreeModel::ColorType;
else if (metaInfo.isString())
type = PropertyTreeModel::StringType;
else if (metaInfo.isUrl())
type = PropertyTreeModel::UrlType;
m_lhsDelegate.setPropertyType(type);
}
QString ConnectionModelStatementDelegate::baseStateName() const
{
return tr("Base State");

View File

@@ -216,6 +216,7 @@ private:
void setupChangeState();
void setupStates();
void setupPrintMessage();
void setupPropertyType();
QString baseStateName() const;
ActionType m_actionType;

View File

@@ -833,6 +833,7 @@ PropertyTreeModelDelegate::PropertyTreeModelDelegate(ConnectionView *parent) : m
void PropertyTreeModelDelegate::setPropertyType(PropertyTreeModel::PropertyTypes type)
{
m_model.setPropertyType(type);
setupNameComboBox(m_idCombboBox.currentText(), m_nameCombboBox.currentText(), 0);
}
void PropertyTreeModelDelegate::setup(const QString &id, const QString &name, bool *nameExists)
@@ -846,7 +847,13 @@ void PropertyTreeModelDelegate::setup(const QString &id, const QString &name, bo
m_idCombboBox.setModel(idLists);
m_idCombboBox.setCurrentText(id);
setupNameComboBox(id, name, nameExists);
}
void PropertyTreeModelDelegate::setupNameComboBox(const QString &id,
const QString &name,
bool *nameExists)
{
const auto modelNode = m_model.getModelNodeForId(id);
//m_nameCombboBox
std::vector<QString> nameVector = Utils::transform(m_model.getProperties(modelNode),
@@ -889,6 +896,14 @@ void PropertyTreeModelDelegate::handleNameChanged()
// commit data
}
NodeMetaInfo PropertyTreeModelDelegate::propertyMetaInfo() const
{
const auto modelNode = m_model.getModelNodeForId(m_idCombboBox.currentText());
if (modelNode.isValid())
return modelNode.metaInfo().property(m_nameCombboBox.currentText().toUtf8()).propertyType();
return {};
}
void PropertyTreeModelDelegate::handleIdChanged()
{
const auto id = m_idCombboBox.currentText();

View File

@@ -164,8 +164,10 @@ public:
explicit PropertyTreeModelDelegate(ConnectionView *parent = nullptr);
void setPropertyType(PropertyTreeModel::PropertyTypes type);
void setup(const QString &id, const QString &name, bool *nameExists = nullptr);
void setupNameComboBox(const QString &id, const QString &name, bool *nameExists);
QString id() const;
QString name() const;
NodeMetaInfo propertyMetaInfo() const;
signals:
void commitData();