OSDN Git Service

QmlDesigner: fix for duplicate ids
authorThomas Hartmann <Thomas.Hartmann@nokia.com>
Wed, 30 Mar 2011 10:21:06 +0000 (12:21 +0200)
committerThomas Hartmann <Thomas.Hartmann@nokia.com>
Wed, 30 Mar 2011 10:22:30 +0000 (12:22 +0200)
Duplicate ids for not handled 100% correctly in the property editor
and in the navigator.

Reviewed-by: Kai Koehne
src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp

index 7e22888..f9af9ad 100644 (file)
@@ -315,7 +315,7 @@ void NavigatorTreeModel::handleChangedItem(QStandardItem *item)
 
     ItemRow itemRow = itemRowForNode(node);
     if (item == itemRow.idItem) {
-         if (node.isValidId(item->text())) {
+         if (node.isValidId(item->text())  && !node.view()->modelNodeForId(item->text()).isValid()) {
              if (node.id().isEmpty() || item->text().isEmpty()) { //no id
                  try {
                      node.setId(item->text());
@@ -327,8 +327,14 @@ void NavigatorTreeModel::handleChangedItem(QStandardItem *item)
                      node.view()->rewriterView()->renameId(node.id(), item->text());
              }
         } else {
-            QMessageBox::warning(0, tr("Invalid Id"),  tr("%1 is an invalid id").arg(item->text()));
-            item->setText(node.id());
+
+             if (!node.isValidId(item->text()))
+                 QMessageBox::warning(0, tr("Invalid Id"),  tr("%1 is an invalid id").arg(item->text()));
+             else
+                 QMessageBox::warning(0, tr("Invalid Id"),  tr("%1 already exists").arg(item->text()));
+             bool blockSingals = blockItemChangedSignal(true);
+             item->setText(node.id());
+             blockItemChangedSignal(blockSingals);
         }
     } else if (item == itemRow.visibilityItem) {
         bool invisible = (item->checkState() == Qt::Unchecked);
index 8b13aac..d67c8ea 100644 (file)
@@ -368,12 +368,17 @@ void PropertyEditor::changeValue(const QString &propertyName)
         PropertyEditorValue *value = qobject_cast<PropertyEditorValue*>(QDeclarativeMetaType::toQObject(m_currentType->m_backendValuesPropertyMap.value(propertyName)));
         const QString newId = value->value().toString();
 
-        if (m_selectedNode.isValidId(newId)) {
+        if (newId == m_selectedNode.id())
+            return;
+
+        if (m_selectedNode.isValidId(newId)  && !modelNodeForId(newId).isValid() ) {
             if (m_selectedNode.id().isEmpty() || newId.isEmpty()) { //no id
                 try {
                     m_selectedNode.setId(newId);
                 } catch (InvalidIdException &e) { //better save then sorry
+                    m_locked = true;
                     value->setValue(m_selectedNode.id());
+                    m_locked = false;
                     QMessageBox::warning(0, tr("Invalid Id"), e.description());
                 }
             } else { //there is already an id, so we refactor
@@ -381,8 +386,13 @@ void PropertyEditor::changeValue(const QString &propertyName)
                     rewriterView()->renameId(m_selectedNode.id(), newId);
             }
         } else {
+            m_locked = true;
             value->setValue(m_selectedNode.id());
-            QMessageBox::warning(0, tr("Invalid Id"),  tr("%1 is an invalid id").arg(newId));
+            m_locked = false;
+            if (!m_selectedNode.isValidId(newId))
+                QMessageBox::warning(0, tr("Invalid Id"),  tr("%1 is an invalid id").arg(newId));
+            else
+                QMessageBox::warning(0, tr("Invalid Id"),  tr("%1 already exists").arg(newId));
         }
         return;
     }