diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml index 77af9247cf5..db877b65cd7 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml @@ -99,10 +99,19 @@ Rectangle { showButtons: false fixedSize: true + property bool blockEditingFinished: false + onEditingFinished: { + if (typeLineEdit.blockEditingFinished) + return + + typeLineEdit.blockEditingFinished = true + if (visible) changeTypeName(typeLineEdit.text.trim()) visible = false + + typeLineEdit.blockEditingFinished = false } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ExpressionTextField.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ExpressionTextField.qml index 6209325e7e3..e0de0d3b88f 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ExpressionTextField.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ExpressionTextField.qml @@ -132,7 +132,7 @@ StudioControls.TextField { event.accepted = true; - if (list.length == 1) + if (list.length === 1) textField.commitCompletion() } else { diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index a479dfeba0b..524debfe176 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -180,7 +181,6 @@ void PropertyEditorContextObject::toogleExportAlias() void PropertyEditorContextObject::changeTypeName(const QString &typeName) { - QTC_ASSERT(m_model && m_model->rewriterView(), return); /* Ideally we should not missuse the rewriterView @@ -189,19 +189,59 @@ void PropertyEditorContextObject::changeTypeName(const QString &typeName) QTC_ASSERT(!rewriterView->selectedModelNodes().isEmpty(), return); - rewriterView->executeInTransaction("PropertyEditorContextObject:changeTypeName", [this, rewriterView, typeName](){ + try { + auto transaction = RewriterTransaction(rewriterView, "PropertyEditorContextObject:changeTypeName"); + ModelNode selectedNode = rewriterView->selectedModelNodes().constFirst(); NodeMetaInfo metaInfo = m_model->metaInfo(typeName.toLatin1()); if (!metaInfo.isValid()) { - Core::AsynchronousMessageBox::warning(tr("Invalid Type"), tr("%1 is an invalid type.").arg(typeName)); + Core::AsynchronousMessageBox::warning(tr("Invalid Type"), tr("%1 is an invalid type.").arg(typeName)); return; } + + QList incompatibleProperties; + for (auto property : selectedNode.properties()) { + if (!metaInfo.propertyNames().contains(property.name())) + incompatibleProperties.append(property.name()); + } + + if (!incompatibleProperties.empty()) { + QString detailedText = QString("Incompatible properties:
"); + + for (auto p : incompatibleProperties) + detailedText.append("- " + QString::fromUtf8(p) + "
"); + + detailedText.chop(QString("
").size()); + + QMessageBox msgBox; + msgBox.setTextFormat(Qt::RichText); + msgBox.setIcon(QMessageBox::Question); + msgBox.setWindowTitle("Change Type"); + msgBox.setText(QString("Changing the type from %1 to %2 can't be done without removing incompatible properties.

%3") + .arg(selectedNode.simplifiedTypeName()) + .arg(typeName) + .arg(detailedText)); + msgBox.setInformativeText("Do you want to continue by removing incompatible properties?"); + msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Ok); + + if (msgBox.exec() == QMessageBox::Cancel) + return; + + for (auto p : incompatibleProperties) + selectedNode.removeProperty(p); + } + if (selectedNode.isRootNode()) rewriterView->changeRootNodeType(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); else selectedNode.changeType(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); - }); + + transaction.commit(); + } catch (const Exception &e) { + e.showException(); + } } void PropertyEditorContextObject::insertKeyframe(const QString &propertyName)