diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 81c4d2c3a14ce6652ed0b542be4d5623ff71b350..25908d605c165710f04a27968e0209094a73b54d 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -272,14 +272,9 @@ void NavigatorTreeModel::handleChangedItem(QStandardItem *item) ItemRow itemRow = itemRowForNode(node); if (item == itemRow.idItem) { try { - if (ModelNode::isValidId(item->text())) - node.setId(item->text()); - else { - QMessageBox::warning(0,"Invalid Id",tr("Invalid id.\nOnly alphanumeric characters and underscore allowed.\nIds must begin with a lowercase letter.")); - item->setText(node.id()); - } - } catch (InvalidIdException &) { - QMessageBox::warning(0,"Invalid Id",tr("Item id must be unique.")); + node.setId(item->text()); + } catch (InvalidIdException &e) { + QMessageBox::warning(0, tr("Invalid Id"), e.description()); item->setText(node.id()); } } else if (item == itemRow.visibilityItem) { diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index e5b72e4858fe8ba2fdc9f700ab0c873d23f65b08..e0e0e4c21a5e80e7603404106adda5affc98fc9d 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -166,7 +166,6 @@ void PropertyEditor::NodeType::setValue(const QmlObjectNode & fxObjectNode, cons void PropertyEditor::NodeType::setup(const QmlObjectNode &fxObjectNode, const QString &stateName, const QUrl &qmlSpecificsFile, PropertyEditor *propertyEditor) { if (!fxObjectNode.isValid()) { - qWarning() << "invalid node for setup"; return; } @@ -354,12 +353,10 @@ void PropertyEditor::changeValue(const QString &propertyName) const QString newId = value->value().toString(); try { - if (ModelNode::isValidId(newId)) - m_selectedNode.setId(newId); - else - value->setValue(m_selectedNode.id()); - } catch (InvalidIdException &) { + m_selectedNode.setId(newId); + } catch (InvalidIdException &e) { value->setValue(m_selectedNode.id()); + QMessageBox::warning(0, tr("Invalid Id"), e.description()); } return; diff --git a/src/plugins/qmldesigner/core/exceptions/invalididexception.cpp b/src/plugins/qmldesigner/core/exceptions/invalididexception.cpp index aec0ded7b18145f426527005082a44f7244b8869..467c4720edac652729834656e4b26e2fc1826e5b 100644 --- a/src/plugins/qmldesigner/core/exceptions/invalididexception.cpp +++ b/src/plugins/qmldesigner/core/exceptions/invalididexception.cpp @@ -33,8 +33,10 @@ namespace QmlDesigner { InvalidIdException::InvalidIdException(int line, const QString &function, - const QString &file): - InvalidArgumentException(line, function, file, "id") + const QString &file, + const QString &id, + bool duplicate) : + InvalidArgumentException(line, function, file, "id"), m_id(id), m_duplicate(duplicate) { } @@ -42,4 +44,23 @@ QString InvalidIdException::type() const { return "InvalidIdException"; } + +QString InvalidIdException::description() const +{ + if (m_duplicate) + return duplicateErrorMessage(m_id); + + return invalidErrorMessage(m_id); +} + +QString InvalidIdException::duplicateErrorMessage(const QString &id) +{ + return QObject::tr("Ids have to be unique: ") + id; +} + +QString InvalidIdException::invalidErrorMessage(const QString &id) +{ + return QObject::tr("Invalid Id: ") + id + QObject::tr("\nOnly alphanumeric characters and underscore allowed.\nIds must begin with a lowercase letter."); +} + } diff --git a/src/plugins/qmldesigner/core/include/invalididexception.h b/src/plugins/qmldesigner/core/include/invalididexception.h index 8bb7761ec2c98cc30da23401e0ccae9d31865794..f9e367692ffeb61333c29ca7720c0f5179ca38a8 100644 --- a/src/plugins/qmldesigner/core/include/invalididexception.h +++ b/src/plugins/qmldesigner/core/include/invalididexception.h @@ -39,9 +39,19 @@ class CORESHARED_EXPORT InvalidIdException : public InvalidArgumentException public: InvalidIdException(int line, const QString &function, - const QString &file); + const QString &file, + const QString &id, + bool duplicate = false); QString type() const; + QString description() const; + + static QString duplicateErrorMessage(const QString &id); + static QString invalidErrorMessage(const QString &id); + +private: + QString m_id; + bool m_duplicate; }; diff --git a/src/plugins/qmldesigner/core/model/modelnode.cpp b/src/plugins/qmldesigner/core/model/modelnode.cpp index 16e1a7f82fdd35dc34b813b836431857d7b625de..ec8c6e3651515f604fb235a720c53c221f82fd3c 100644 --- a/src/plugins/qmldesigner/core/model/modelnode.cpp +++ b/src/plugins/qmldesigner/core/model/modelnode.cpp @@ -180,13 +180,13 @@ void ModelNode::setId(const QString& id) } if (!isValidId(id)) - throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__); + throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id); if (id == ModelNode::id()) return; if (view()->hasId(id)) - throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__); + throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id, true); m_model.data()->m_d->changeNodeId(internalNode(), id); }