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.nodeId = m_rhsAssignmentDelegate.id();
assignmentStatement.rhs.propertyName = m_rhsAssignmentDelegate.name(); assignmentStatement.rhs.propertyName = m_rhsAssignmentDelegate.name();
setupPropertyType();
emit statementChanged(); emit statementChanged();
} }
@@ -1305,6 +1307,7 @@ void ConnectionModelStatementDelegate::setupAssignment()
const auto assignment = std::get<ConnectionEditorStatements::Assignment>(m_statement); const auto assignment = std::get<ConnectionEditorStatements::Assignment>(m_statement);
m_lhsDelegate.setup(assignment.lhs.nodeId, assignment.lhs.propertyName); m_lhsDelegate.setup(assignment.lhs.nodeId, assignment.lhs.propertyName);
m_rhsAssignmentDelegate.setup(assignment.rhs.nodeId, assignment.rhs.propertyName); m_rhsAssignmentDelegate.setup(assignment.rhs.nodeId, assignment.rhs.propertyName);
setupPropertyType();
} }
void ConnectionModelStatementDelegate::setupSetProperty() void ConnectionModelStatementDelegate::setupSetProperty()
@@ -1420,6 +1423,26 @@ void ConnectionModelStatementDelegate::setupPrintMessage()
m_stringArgument.setText(ConnectionEditorStatements::toString(consoleLog.argument)); 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 QString ConnectionModelStatementDelegate::baseStateName() const
{ {
return tr("Base State"); return tr("Base State");

View File

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

View File

@@ -833,6 +833,7 @@ PropertyTreeModelDelegate::PropertyTreeModelDelegate(ConnectionView *parent) : m
void PropertyTreeModelDelegate::setPropertyType(PropertyTreeModel::PropertyTypes type) void PropertyTreeModelDelegate::setPropertyType(PropertyTreeModel::PropertyTypes type)
{ {
m_model.setPropertyType(type); m_model.setPropertyType(type);
setupNameComboBox(m_idCombboBox.currentText(), m_nameCombboBox.currentText(), 0);
} }
void PropertyTreeModelDelegate::setup(const QString &id, const QString &name, bool *nameExists) 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.setModel(idLists);
m_idCombboBox.setCurrentText(id); 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); const auto modelNode = m_model.getModelNodeForId(id);
//m_nameCombboBox //m_nameCombboBox
std::vector<QString> nameVector = Utils::transform(m_model.getProperties(modelNode), std::vector<QString> nameVector = Utils::transform(m_model.getProperties(modelNode),
@@ -889,6 +896,14 @@ void PropertyTreeModelDelegate::handleNameChanged()
// commit data // 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() void PropertyTreeModelDelegate::handleIdChanged()
{ {
const auto id = m_idCombboBox.currentText(); const auto id = m_idCombboBox.currentText();

View File

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