QmlDesigner: Refactoring ModelNode::setId

Add ModelNode::setIdWithoutRefactoring for changes without rewriter
interaction and change the rewriter to use it.
Rename ModelNode::setId to ModelNode::setIdWithRefactoring and add the
refactoring capabilities.

Change-Id: Ia5fba19bd2eeb034d525e92f39d30954e83fa747
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
This commit is contained in:
Marco Bubke
2014-04-29 12:30:48 +02:00
parent c282884c08
commit 9820894fb2
9 changed files with 24 additions and 12 deletions

View File

@@ -168,7 +168,7 @@ void TabViewDesignerAction::addNewTab()
tabViewModelNode.majorVersion(), tabViewModelNode.majorVersion(),
tabViewModelNode.minorVersion(), tabViewModelNode.minorVersion(),
propertyList); propertyList);
newTabModelNode.setId(newTabModelNode.view()->generateNewId(tabName)); newTabModelNode.setIdWithRefactoring(newTabModelNode.view()->generateNewId(tabName));
tabViewModelNode.defaultNodeAbstractProperty().reparentHere(newTabModelNode); tabViewModelNode.defaultNodeAbstractProperty().reparentHere(newTabModelNode);
} }
} }

View File

@@ -405,7 +405,7 @@ void DesignDocument::copySelected()
node.destroy(); node.destroy();
} }
view.changeRootNodeType("QtQuick.Rectangle", 1, 0); view.changeRootNodeType("QtQuick.Rectangle", 1, 0);
view.rootModelNode().setId("designer__Selection"); view.rootModelNode().setIdWithRefactoring("designer__Selection");
foreach (const ModelNode &selectedNode, selectedNodes) { foreach (const ModelNode &selectedNode, selectedNodes) {
ModelNode newNode(view.insertModel(selectedNode)); ModelNode newNode(view.insertModel(selectedNode));

View File

@@ -365,7 +365,7 @@ void NavigatorTreeModel::handleChangedItem(QStandardItem *item)
if (node.isValidId(item->text()) && !node.view()->modelNodeForId(item->text()).isValid()) { if (node.isValidId(item->text()) && !node.view()->modelNodeForId(item->text()).isValid()) {
if (node.id().isEmpty() || item->text().isEmpty()) { //no id if (node.id().isEmpty() || item->text().isEmpty()) { //no id
try { try {
node.setId(item->text()); node.setIdWithoutRefactoring(item->text());
} catch (InvalidIdException &e) { //better save then sorry } catch (InvalidIdException &e) { //better save then sorry
QMessageBox::warning(Core::ICore::dialogParent(), tr("Invalid Id"), e.description()); QMessageBox::warning(Core::ICore::dialogParent(), tr("Invalid Id"), e.description());
} }

View File

@@ -151,7 +151,7 @@ void PropertyEditorView::changeValue(const QString &name)
if (m_selectedNode.isValidId(newId) && !modelNodeForId(newId).isValid() ) { if (m_selectedNode.isValidId(newId) && !modelNodeForId(newId).isValid() ) {
if (m_selectedNode.id().isEmpty() || newId.isEmpty()) { //no id if (m_selectedNode.id().isEmpty() || newId.isEmpty()) { //no id
try { try {
m_selectedNode.setId(newId); m_selectedNode.setIdWithoutRefactoring(newId);
} catch (InvalidIdException &e) { //better save then sorry } catch (InvalidIdException &e) { //better save then sorry
m_locked = true; m_locked = true;
value->setValue(m_selectedNode.id()); value->setValue(m_selectedNode.id());

View File

@@ -152,7 +152,8 @@ public:
QString id() const; QString id() const;
QString validId(); QString validId();
void setId(const QString &id); void setIdWithRefactoring(const QString &id);
void setIdWithoutRefactoring(const QString &id);
static bool isValidId(const QString &id); static bool isValidId(const QString &id);
Model *model() const; Model *model() const;

View File

@@ -74,7 +74,7 @@ static void syncBindingProperties(ModelNode &outputNode, const ModelNode &inputN
static void syncId(ModelNode &outputNode, const ModelNode &inputNode, const QHash<QString, QString> &idRenamingHash) static void syncId(ModelNode &outputNode, const ModelNode &inputNode, const QHash<QString, QString> &idRenamingHash)
{ {
if (!inputNode.id().isEmpty()) if (!inputNode.id().isEmpty())
outputNode.setId(idRenamingHash.value(inputNode.id())); outputNode.setIdWithoutRefactoring(idRenamingHash.value(inputNode.id()));
} }
static void splitIdInBaseNameAndNumber(const QString &id, QString *baseId, int *number) static void splitIdInBaseNameAndNumber(const QString &id, QString *baseId, int *number)

View File

@@ -140,7 +140,7 @@ QString ModelNode::id() const
QString ModelNode::validId() QString ModelNode::validId()
{ {
if (id().isEmpty()) if (id().isEmpty())
setId(view()->generateNewId(QString::fromUtf8(simplifiedTypeName()))); setIdWithRefactoring(view()->generateNewId(QString::fromUtf8(simplifiedTypeName())));
return id(); return id();
} }
@@ -164,7 +164,18 @@ bool ModelNode::isValidId(const QString &id)
return id.isEmpty() || (!idContainsWrongLetter(id) && !idIsQmlKeyWord(id)); return id.isEmpty() || (!idContainsWrongLetter(id) && !idIsQmlKeyWord(id));
} }
void ModelNode::setId(const QString& id) void ModelNode::setIdWithRefactoring(const QString& id)
{
if (model()->rewriterView()
&& !id.isEmpty()
&& !m_internalNode->id().isEmpty()) { // refactor the id if they are not empty
model()->rewriterView()->renameId(m_internalNode->id(), id);
} else {
setIdWithoutRefactoring(id);
}
}
void ModelNode::setIdWithoutRefactoring(const QString &id)
{ {
Internal::WriteLocker locker(m_model.data()); Internal::WriteLocker locker(m_model.data());
if (!isValid()) { if (!isValid()) {

View File

@@ -500,7 +500,7 @@ QmlItemNode QmlObjectNode::instanceParentItem() const
void QmlObjectNode::setId(const QString &id) void QmlObjectNode::setId(const QString &id)
{ {
modelNode().setId(id); modelNode().setIdWithRefactoring(id);
} }
QString QmlObjectNode::id() const QString QmlObjectNode::id() const

View File

@@ -1243,14 +1243,14 @@ void TextToModelMerger::syncNodeId(ModelNode &modelNode, const QString &astObjec
if (!modelNode.id().isEmpty()) { if (!modelNode.id().isEmpty()) {
ModelNode existingNodeWithId = m_rewriterView->modelNodeForId(astObjectId); ModelNode existingNodeWithId = m_rewriterView->modelNodeForId(astObjectId);
if (existingNodeWithId.isValid()) if (existingNodeWithId.isValid())
existingNodeWithId.setId(QString()); existingNodeWithId.setIdWithoutRefactoring(QString());
differenceHandler.idsDiffer(modelNode, astObjectId); differenceHandler.idsDiffer(modelNode, astObjectId);
} }
} else { } else {
if (modelNode.id() != astObjectId) { if (modelNode.id() != astObjectId) {
ModelNode existingNodeWithId = m_rewriterView->modelNodeForId(astObjectId); ModelNode existingNodeWithId = m_rewriterView->modelNodeForId(astObjectId);
if (existingNodeWithId.isValid()) if (existingNodeWithId.isValid())
existingNodeWithId.setId(QString()); existingNodeWithId.setIdWithoutRefactoring(QString());
differenceHandler.idsDiffer(modelNode, astObjectId); differenceHandler.idsDiffer(modelNode, astObjectId);
} }
} }
@@ -1809,7 +1809,7 @@ void ModelAmender::propertyAbsentFromQml(AbstractProperty &modelProperty)
void ModelAmender::idsDiffer(ModelNode &modelNode, const QString &qmlId) void ModelAmender::idsDiffer(ModelNode &modelNode, const QString &qmlId)
{ {
modelNode.setId(qmlId); modelNode.setIdWithoutRefactoring(qmlId);
} }
void TextToModelMerger::setupComponent(const ModelNode &node) void TextToModelMerger::setupComponent(const ModelNode &node)