forked from qt-creator/qt-creator
QmlOutline: Support reparenting into object array
This commit is contained in:
@@ -175,6 +175,39 @@ UiObjectMemberList *Rewriter::searchMemberToInsertAfter(UiObjectMemberList *memb
|
|||||||
return lastNonObjectDef;
|
return lastNonObjectDef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UiArrayMemberList *Rewriter::searchMemberToInsertAfter(UiArrayMemberList *members,
|
||||||
|
const QStringList &propertyOrder)
|
||||||
|
{
|
||||||
|
const int objectDefinitionInsertionPoint = propertyOrder.indexOf(QString::null);
|
||||||
|
|
||||||
|
UiArrayMemberList *lastObjectDef = 0;
|
||||||
|
UiArrayMemberList *lastNonObjectDef = 0;
|
||||||
|
|
||||||
|
for (UiArrayMemberList *iter = members; iter; iter = iter->next) {
|
||||||
|
UiObjectMember *member = iter->member;
|
||||||
|
int idx = -1;
|
||||||
|
|
||||||
|
if (cast<UiObjectDefinition*>(member))
|
||||||
|
lastObjectDef = iter;
|
||||||
|
else if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member))
|
||||||
|
idx = propertyOrder.indexOf(flatten(arrayBinding->qualifiedId));
|
||||||
|
else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(member))
|
||||||
|
idx = propertyOrder.indexOf(flatten(objectBinding->qualifiedId));
|
||||||
|
else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(member))
|
||||||
|
idx = propertyOrder.indexOf(flatten(scriptBinding->qualifiedId));
|
||||||
|
else if (cast<UiPublicMember*>(member))
|
||||||
|
idx = propertyOrder.indexOf(QLatin1String("property"));
|
||||||
|
|
||||||
|
if (idx < objectDefinitionInsertionPoint)
|
||||||
|
lastNonObjectDef = iter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastObjectDef)
|
||||||
|
return lastObjectDef;
|
||||||
|
else
|
||||||
|
return lastNonObjectDef;
|
||||||
|
}
|
||||||
|
|
||||||
UiObjectMemberList *Rewriter::searchMemberToInsertAfter(UiObjectMemberList *members,
|
UiObjectMemberList *Rewriter::searchMemberToInsertAfter(UiObjectMemberList *members,
|
||||||
const QString &propertyName,
|
const QString &propertyName,
|
||||||
const QStringList &propertyOrder)
|
const QStringList &propertyOrder)
|
||||||
@@ -619,6 +652,29 @@ Rewriter::Range Rewriter::addObject(UiObjectInitializer *ast, const QString &con
|
|||||||
return Range(insertionPoint, insertionPoint);
|
return Range(insertionPoint, insertionPoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rewriter::Range Rewriter::addObject(UiArrayBinding *ast, const QString &content)
|
||||||
|
{
|
||||||
|
UiArrayMemberList *insertAfter = searchMemberToInsertAfter(ast->members, m_propertyOrder);
|
||||||
|
return addObject(ast, content, insertAfter);
|
||||||
|
}
|
||||||
|
|
||||||
|
Rewriter::Range Rewriter::addObject(UiArrayBinding *ast, const QString &content, UiArrayMemberList *insertAfter)
|
||||||
|
{
|
||||||
|
int insertionPoint;
|
||||||
|
QString textToInsert;
|
||||||
|
if (insertAfter && insertAfter->member) {
|
||||||
|
insertionPoint = insertAfter->member->lastSourceLocation().end();
|
||||||
|
textToInsert += QLatin1String("\n");
|
||||||
|
} else {
|
||||||
|
insertionPoint = ast->lbracketToken.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
textToInsert += content;
|
||||||
|
m_changeSet->insert(insertionPoint, QLatin1String("\n") + textToInsert);
|
||||||
|
|
||||||
|
return Range(insertionPoint, insertionPoint);
|
||||||
|
}
|
||||||
|
|
||||||
void Rewriter::removeObjectMember(UiObjectMember *member, UiObjectMember *parent)
|
void Rewriter::removeObjectMember(UiObjectMember *member, UiObjectMember *parent)
|
||||||
{
|
{
|
||||||
int start = member->firstSourceLocation().offset;
|
int start = member->firstSourceLocation().offset;
|
||||||
|
@@ -77,10 +77,13 @@ public:
|
|||||||
|
|
||||||
Range addObject(AST::UiObjectInitializer *ast, const QString &content);
|
Range addObject(AST::UiObjectInitializer *ast, const QString &content);
|
||||||
Range addObject(AST::UiObjectInitializer *ast, const QString &content, AST::UiObjectMemberList *insertAfter);
|
Range addObject(AST::UiObjectInitializer *ast, const QString &content, AST::UiObjectMemberList *insertAfter);
|
||||||
|
Range addObject(AST::UiArrayBinding *ast, const QString &content);
|
||||||
|
Range addObject(AST::UiArrayBinding *ast, const QString &content, AST::UiArrayMemberList *insertAfter);
|
||||||
|
|
||||||
void removeObjectMember(AST::UiObjectMember *member, AST::UiObjectMember *parent);
|
void removeObjectMember(AST::UiObjectMember *member, AST::UiObjectMember *parent);
|
||||||
|
|
||||||
static AST::UiObjectMemberList *searchMemberToInsertAfter(AST::UiObjectMemberList *members, const QStringList &propertyOrder);
|
static AST::UiObjectMemberList *searchMemberToInsertAfter(AST::UiObjectMemberList *members, const QStringList &propertyOrder);
|
||||||
|
static AST::UiArrayMemberList *searchMemberToInsertAfter(AST::UiArrayMemberList *members, const QStringList &propertyOrder);
|
||||||
static AST::UiObjectMemberList *searchMemberToInsertAfter(AST::UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder);
|
static AST::UiObjectMemberList *searchMemberToInsertAfter(AST::UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder);
|
||||||
static QString flatten(AST::UiQualifiedId *first);
|
static QString flatten(AST::UiQualifiedId *first);
|
||||||
|
|
||||||
|
@@ -669,12 +669,9 @@ void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove,
|
|||||||
|
|
||||||
const QString documentText = m_semanticInfo.document->source();
|
const QString documentText = m_semanticInfo.document->source();
|
||||||
|
|
||||||
|
Rewriter rewriter(documentText, changeSet, QStringList());
|
||||||
|
|
||||||
if (AST::UiObjectDefinition *objDefinition = AST::cast<AST::UiObjectDefinition*>(newParent)) {
|
if (AST::UiObjectDefinition *objDefinition = AST::cast<AST::UiObjectDefinition*>(newParent)) {
|
||||||
// target is an element
|
|
||||||
|
|
||||||
Rewriter rewriter(documentText, changeSet, QStringList());
|
|
||||||
rewriter.removeObjectMember(toMove, oldParent);
|
|
||||||
|
|
||||||
AST::UiObjectMemberList *listInsertAfter = 0;
|
AST::UiObjectMemberList *listInsertAfter = 0;
|
||||||
if (insertionOrderSpecified) {
|
if (insertionOrderSpecified) {
|
||||||
if (insertAfter) {
|
if (insertAfter) {
|
||||||
@@ -713,9 +710,36 @@ void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove,
|
|||||||
*addedRange = rewriter.addObject(objDefinition->initializer, strToMove);
|
*addedRange = rewriter.addObject(objDefinition->initializer, strToMove);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else if (AST::UiArrayBinding *arrayBinding = AST::cast<AST::UiArrayBinding*>(newParent)) {
|
||||||
|
AST::UiArrayMemberList *listInsertAfter = 0;
|
||||||
|
if (insertionOrderSpecified) {
|
||||||
|
if (insertAfter) {
|
||||||
|
listInsertAfter = arrayBinding->members;
|
||||||
|
while (listInsertAfter && (listInsertAfter->member != insertAfter))
|
||||||
|
listInsertAfter = listInsertAfter->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QString strToMove;
|
||||||
|
{
|
||||||
|
const int offset = toMove->firstSourceLocation().begin();
|
||||||
|
const int length = toMove->lastSourceLocation().end() - offset;
|
||||||
|
strToMove = documentText.mid(offset, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (insertionOrderSpecified) {
|
||||||
|
*addedRange = rewriter.addObject(arrayBinding, strToMove, listInsertAfter);
|
||||||
|
} else {
|
||||||
|
*addedRange = rewriter.addObject(arrayBinding, strToMove);
|
||||||
|
}
|
||||||
|
} else if (AST::UiObjectBinding *objectBinding = AST::cast<AST::UiObjectBinding*>(newParent)) {
|
||||||
|
qDebug() << "TODO: Reparent to UiObjectBinding";
|
||||||
|
return;
|
||||||
// target is a property
|
// target is a property
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rewriter.removeObjectMember(toMove, oldParent);
|
||||||
}
|
}
|
||||||
|
|
||||||
QStandardItem *QmlOutlineModel::parentItem()
|
QStandardItem *QmlOutlineModel::parentItem()
|
||||||
|
Reference in New Issue
Block a user