diff options
Diffstat (limited to 'src/plugins/qmljseditor')
-rw-r--r-- | src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp | 15 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljscomponentnamedialog.cpp | 2 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljseditor.cpp | 9 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljseditor.h | 2 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljseditordocument.cpp | 7 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljseditorplugin.cpp | 7 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljsoutline.cpp | 37 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljsoutline.h | 8 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmloutlinemodel.cpp | 38 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmloutlinemodel.h | 2 |
10 files changed, 96 insertions, 31 deletions
diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index 9ed886246b..34931e037d 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -217,15 +217,16 @@ public: Core::IVersionControl *versionControl = Core::VcsManager::findVersionControlForDirectory(path); if (versionControl && versionControl->supportsOperation(Core::IVersionControl::AddOperation)) { - const QMessageBox::StandardButton button = - QMessageBox::question(Core::ICore::mainWindow(), - Core::VcsManager::msgAddToVcsTitle(), - Core::VcsManager::msgPromptToAddToVcs(QStringList(newFileName), versionControl), - QMessageBox::Yes | QMessageBox::No); + const QMessageBox::StandardButton button = QMessageBox::question( + Core::ICore::dialogParent(), + Core::VcsManager::msgAddToVcsTitle(), + Core::VcsManager::msgPromptToAddToVcs(QStringList(newFileName), versionControl), + QMessageBox::Yes | QMessageBox::No); if (button == QMessageBox::Yes && !versionControl->vcsAdd(newFileName)) { - QMessageBox::warning(Core::ICore::mainWindow(), + QMessageBox::warning(Core::ICore::dialogParent(), Core::VcsManager::msgAddToVcsFailedTitle(), - Core::VcsManager::msgToAddToVcsFailed(QStringList(newFileName), versionControl)); + Core::VcsManager::msgToAddToVcsFailed(QStringList(newFileName), + versionControl)); } } } diff --git a/src/plugins/qmljseditor/qmljscomponentnamedialog.cpp b/src/plugins/qmljseditor/qmljscomponentnamedialog.cpp index 1f486a8265..0be9d8ee24 100644 --- a/src/plugins/qmljseditor/qmljscomponentnamedialog.cpp +++ b/src/plugins/qmljseditor/qmljscomponentnamedialog.cpp @@ -87,7 +87,7 @@ bool ComponentNameDialog::go(QString *proposedName, if (QDialog::Accepted == d.exec()) { *proposedName = d.ui->componentNameEdit->text(); - *proposedPath = d.ui->pathEdit->path(); + *proposedPath = d.ui->pathEdit->filePath().toString(); if (d.ui->checkBox->isChecked()) *proposedSuffix = "ui.qml"; diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 16aaa6ec47..f2de0347b8 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -844,7 +844,7 @@ void QmlJSEditorWidget::findUsages() m_findReferences->findUsages(textDocument()->filePath().toString(), textCursor().position()); } -void QmlJSEditorWidget::renameUsages() +void QmlJSEditorWidget::renameSymbolUnderCursor() { m_findReferences->renameUsages(textDocument()->filePath().toString(), textCursor().position()); } @@ -1098,9 +1098,10 @@ QmlJSEditorFactory::QmlJSEditorFactory(Core::Id _id) setCompletionAssistProvider(new QmlJSCompletionAssistProvider); setEditorActionHandlers(TextEditorActionHandler::Format - | TextEditorActionHandler::UnCommentSelection - | TextEditorActionHandler::UnCollapseAll - | TextEditorActionHandler::FollowSymbolUnderCursor); + | TextEditorActionHandler::UnCommentSelection + | TextEditorActionHandler::UnCollapseAll + | TextEditorActionHandler::FollowSymbolUnderCursor + | TextEditorActionHandler::RenameSymbol); } void QmlJSEditorFactory::decorateEditor(TextEditorWidget *editor) diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index cb5265e66e..f13415f7f4 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -74,7 +74,7 @@ public: void inspectElementUnderCursor() const; void findUsages() override; - void renameUsages(); + void renameSymbolUnderCursor() override; void showContextPane(); signals: diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index b600af61c0..b6edc2fd89 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -36,13 +36,14 @@ #include "qmloutlinemodel.h" #include <coreplugin/coreconstants.h> -#include <coreplugin/infobar.h> #include <coreplugin/modemanager.h> #include <qmljstools/qmljsindenter.h> #include <qmljstools/qmljsmodelmanager.h> #include <qmljstools/qmljsqtstylecodeformatter.h> +#include <utils/infobar.h> + #include <QDebug> const char QML_UI_FILE_WARNING[] = "QmlJSEditor.QmlUiFileWarning"; @@ -692,8 +693,8 @@ void QmlJSEditorDocument::setIsDesignModePreferred(bool value) d->m_isDesignModePreferred = value; if (value) { if (infoBar()->canInfoBeAdded(QML_UI_FILE_WARNING)) { - Core::InfoBarEntry info(QML_UI_FILE_WARNING, - tr("This file should only be edited in <b>Design</b> mode.")); + Utils::InfoBarEntry info(QML_UI_FILE_WARNING, + tr("This file should only be edited in <b>Design</b> mode.")); info.setCustomButtonInfo(tr("Switch Mode"), []() { Core::ModeManager::activateMode(Core::Constants::MODE_DESIGN); }); diff --git a/src/plugins/qmljseditor/qmljseditorplugin.cpp b/src/plugins/qmljseditor/qmljseditorplugin.cpp index 4853c6840d..83e7e2ef48 100644 --- a/src/plugins/qmljseditor/qmljseditorplugin.cpp +++ b/src/plugins/qmljseditor/qmljseditorplugin.cpp @@ -162,10 +162,7 @@ QmlJSEditorPluginPrivate::QmlJSEditorPluginPrivate() contextMenu->addAction(cmd); qmlToolsMenu->addAction(cmd); - QAction *renameUsagesAction = new QAction(QmlJSEditorPlugin::tr("Rename Symbol Under Cursor"), this); - cmd = ActionManager::registerAction(renameUsagesAction, "QmlJSEditor.RenameUsages", context); - cmd->setDefaultKeySequence(QKeySequence(QmlJSEditorPlugin::tr("Ctrl+Shift+R"))); - connect(renameUsagesAction, &QAction::triggered, this, &QmlJSEditorPluginPrivate::renameUsages); + cmd = ActionManager::command(TextEditor::Constants::RENAME_SYMBOL); contextMenu->addAction(cmd); qmlToolsMenu->addAction(cmd); @@ -247,7 +244,7 @@ QuickToolBar *QmlJSEditorPlugin::quickToolBar() void QmlJSEditorPluginPrivate::renameUsages() { if (auto editor = qobject_cast<QmlJSEditorWidget*>(EditorManager::currentEditor()->widget())) - editor->renameUsages(); + editor->renameSymbolUnderCursor(); } void QmlJSEditorPluginPrivate::reformatFile() diff --git a/src/plugins/qmljseditor/qmljsoutline.cpp b/src/plugins/qmljseditor/qmljsoutline.cpp index 0fcac6e60a..29352c39f7 100644 --- a/src/plugins/qmljseditor/qmljsoutline.cpp +++ b/src/plugins/qmljseditor/qmljsoutline.cpp @@ -53,6 +53,14 @@ QmlJSOutlineFilterModel::QmlJSOutlineFilterModel(QObject *parent) : setDynamicSortFilter(true); } +Qt::ItemFlags QmlJSOutlineFilterModel::flags(const QModelIndex &index) const +{ + Qt::ItemFlags f = sourceModel()->flags(index); + if (m_sorted) + f.setFlag(Qt::ItemIsDropEnabled, false); + return f; +} + bool QmlJSOutlineFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { @@ -65,6 +73,15 @@ bool QmlJSOutlineFilterModel::filterAcceptsRow(int sourceRow, return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); } +bool QmlJSOutlineFilterModel::lessThan(const QModelIndex &sourceLeft, + const QModelIndex &sourceRight) const +{ + if (!m_sorted) + return sourceLeft.row() > sourceRight.row(); + + return sourceLeft.data().toString() > sourceRight.data().toString(); +} + QVariant QmlJSOutlineFilterModel::data(const QModelIndex &index, int role) const { if (role == QmlOutlineModel::AnnotationRole) { @@ -93,6 +110,12 @@ void QmlJSOutlineFilterModel::setFilterBindings(bool filterBindings) invalidateFilter(); } +void QmlJSOutlineFilterModel::setSorted(bool sorted) +{ + m_sorted = sorted; + invalidate(); +} + QmlJSOutlineWidget::QmlJSOutlineWidget(QWidget *parent) : TextEditor::IOutlineWidget(parent) , m_treeView(new QmlJSOutlineTreeView(this)) @@ -101,6 +124,8 @@ QmlJSOutlineWidget::QmlJSOutlineWidget(QWidget *parent) m_filterModel->setFilterBindings(false); m_treeView->setModel(m_filterModel); + m_treeView->setSortingEnabled(true); + setFocusProxy(m_treeView); auto layout = new QVBoxLayout; @@ -158,15 +183,25 @@ void QmlJSOutlineWidget::setCursorSynchronization(bool syncWithCursor) m_editor->updateOutlineIndexNow(); } +void QmlJSOutlineWidget::setSorted(bool sorted) +{ + m_sorted = sorted; + m_filterModel->setSorted(m_sorted); +} + void QmlJSOutlineWidget::restoreSettings(const QVariantMap &map) { bool showBindings = map.value(QString::fromLatin1("QmlJSOutline.ShowBindings"), true).toBool(); m_showBindingsAction->setChecked(showBindings); + setSorted(map.value(QString("QmlJSOutline.Sort"), false).toBool()); } QVariantMap QmlJSOutlineWidget::settings() const { - return {{QLatin1String("QmlJSOutline.ShowBindings"), m_showBindingsAction->isChecked()}}; + return { + {QString("QmlJSOutline.ShowBindings"), m_showBindingsAction->isChecked()}, + {QString("QmlJSOutline.Sort"), m_sorted} + }; } void QmlJSOutlineWidget::updateSelectionInTree(const QModelIndex &index) diff --git a/src/plugins/qmljseditor/qmljsoutline.h b/src/plugins/qmljseditor/qmljsoutline.h index b81e9f39ce..4e08353002 100644 --- a/src/plugins/qmljseditor/qmljsoutline.h +++ b/src/plugins/qmljseditor/qmljsoutline.h @@ -51,15 +51,19 @@ class QmlJSOutlineFilterModel : public QSortFilterProxyModel public: QmlJSOutlineFilterModel(QObject *parent); // QSortFilterProxyModel + Qt::ItemFlags flags(const QModelIndex &index) const override; bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; + bool lessThan(const QModelIndex &sourceLeft, const QModelIndex &sourceRight) const override; QVariant data(const QModelIndex &index, int role) const override; Qt::DropActions supportedDragActions() const override; bool filterBindings() const; void setFilterBindings(bool filterBindings); + void setSorted(bool sorted); private: bool m_filterBindings = false; + bool m_sorted = false; }; class QmlJSOutlineWidget : public TextEditor::IOutlineWidget @@ -73,6 +77,8 @@ public: // IOutlineWidget QList<QAction*> filterMenuActions() const override; void setCursorSynchronization(bool syncWithCursor) override; + bool isSorted() const override { return m_sorted; }; + void setSorted(bool sorted) override; void restoreSettings(const QVariantMap &map) override; QVariantMap settings() const override; @@ -93,6 +99,7 @@ private: bool m_enableCursorSync = true; bool m_blockCursorSync = false; + bool m_sorted = false; }; class QmlJSOutlineWidgetFactory : public TextEditor::IOutlineWidgetFactory @@ -100,6 +107,7 @@ class QmlJSOutlineWidgetFactory : public TextEditor::IOutlineWidgetFactory Q_OBJECT public: bool supportsEditor(Core::IEditor *editor) const override; + bool supportsSorting() const override { return true; } TextEditor::IOutlineWidget *createWidget(Core::IEditor *editor) override; }; diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index 0cda207b51..c9853fbe91 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -120,7 +120,7 @@ QString QmlOutlineItem::prettyPrint(const Value *value, const ContextPtr &contex class ObjectMemberParentVisitor : public AST::Visitor { public: - QHash<AST::UiObjectMember*,AST::UiObjectMember*> operator()(Document::Ptr doc) { + QHash<AST::Node *,AST::UiObjectMember *> operator()(Document::Ptr doc) { parent.clear(); if (doc && doc->ast()) doc->ast()->accept(this); @@ -128,7 +128,7 @@ public: } private: - QHash<AST::UiObjectMember*,AST::UiObjectMember*> parent; + QHash<AST::Node *, AST::UiObjectMember *> parent; QList<AST::UiObjectMember *> stack; bool preVisit(AST::Node *node) override @@ -144,6 +144,9 @@ private: stack.removeLast(); if (!stack.isEmpty()) parent.insert(objMember, stack.last()); + } else if (AST::FunctionExpression *funcMember = node->asFunctionDefinition()) { + if (!stack.isEmpty()) + parent.insert(funcMember, stack.last()); } } @@ -497,6 +500,7 @@ QModelIndex QmlOutlineModel::enterObjectDefinition(AST::UiObjectDefinition *objD } else { // it's a grouped propery like 'anchors' data.insert(ItemTypeRole, NonElementBindingType); + data.insert(AnnotationRole, QString()); // clear possible former annotation icon = Icons::scriptBindingIcon(); } @@ -516,6 +520,7 @@ QModelIndex QmlOutlineModel::enterObjectBinding(AST::UiObjectBinding *objBinding bindingData.insert(Qt::DisplayRole, asString(objBinding->qualifiedId)); bindingData.insert(ItemTypeRole, ElementBindingType); + bindingData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *bindingItem = enterNode(bindingData, objBinding, objBinding->qualifiedId, Icons::scriptBindingIcon()); @@ -545,6 +550,7 @@ QModelIndex QmlOutlineModel::enterArrayBinding(AST::UiArrayBinding *arrayBinding bindingData.insert(Qt::DisplayRole, asString(arrayBinding->qualifiedId)); bindingData.insert(ItemTypeRole, ElementBindingType); + bindingData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item = enterNode(bindingData, arrayBinding, arrayBinding->qualifiedId, Icons::scriptBindingIcon()); @@ -617,6 +623,7 @@ QModelIndex QmlOutlineModel::enterFunctionDeclaration(AST::FunctionDeclaration * objectData.insert(Qt::DisplayRole, functionDisplayName(functionDeclaration->name, functionDeclaration->formals)); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item = enterNode(objectData, functionDeclaration, nullptr, Icons::functionDeclarationIcon()); @@ -648,6 +655,7 @@ QModelIndex QmlOutlineModel::enterFieldMemberExpression(AST::FieldMemberExpressi objectData.insert(Qt::DisplayRole, display); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item = enterNode(objectData, expression, nullptr, m_icons->functionDeclarationIcon()); @@ -666,6 +674,7 @@ QModelIndex QmlOutlineModel::enterTestCase(AST::ObjectPattern *objectLiteral) objectData.insert(Qt::DisplayRole, QLatin1String("testcase")); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item = enterNode(objectData, objectLiteral, nullptr, Icons::objectDefinitionIcon()); @@ -686,6 +695,7 @@ QModelIndex QmlOutlineModel::enterTestCaseProperties(AST::PatternPropertyList *p if (auto propertyName = AST::cast<const AST::IdentifierPropertyName *>(assignment->name)) { objectData.insert(Qt::DisplayRole, propertyName->id.toString()); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item; if (assignment->initializer->kind == AST::Node::Kind_FunctionExpression) item = enterNode(objectData, assignment, nullptr, Icons::functionDeclarationIcon()); @@ -702,6 +712,7 @@ QModelIndex QmlOutlineModel::enterTestCaseProperties(AST::PatternPropertyList *p if (auto propertyName = AST::cast<const AST::IdentifierPropertyName *>(getterSetter->name)) { objectData.insert(Qt::DisplayRole, propertyName->id.toString()); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item; item = enterNode(objectData, getterSetter, nullptr, Icons::functionDeclarationIcon()); @@ -840,9 +851,14 @@ void QmlOutlineModel::reparentNodes(QmlOutlineItem *targetItem, int row, QList<Q for (auto outlineItem : itemsToMove) { AST::UiObjectMember *sourceObjectMember = m_itemToNode.value(outlineItem)->uiObjectMemberCast(); - if (!sourceObjectMember) - return; + AST::FunctionExpression *functionMember = nullptr; + if (!sourceObjectMember) { + functionMember = m_itemToNode.value(outlineItem)->asFunctionDefinition(); + if (!functionMember) + return; + } + m_itemToNode.value(outlineItem)->asFunctionDefinition(); bool insertionOrderSpecified = true; AST::UiObjectMember *memberToInsertAfter = nullptr; { @@ -858,6 +874,9 @@ void QmlOutlineModel::reparentNodes(QmlOutlineItem *targetItem, int row, QList<Q if (sourceObjectMember) moveObjectMember(sourceObjectMember, targetObjectMember, insertionOrderSpecified, memberToInsertAfter, &changeSet, &range); + else if (functionMember) + moveObjectMember(functionMember, targetObjectMember, insertionOrderSpecified, + memberToInsertAfter, &changeSet, &range); changedRanges << range; } @@ -870,7 +889,7 @@ void QmlOutlineModel::reparentNodes(QmlOutlineItem *targetItem, int row, QList<Q file->apply(); } -void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove, +void QmlOutlineModel::moveObjectMember(AST::Node *toMove, AST::UiObjectMember *newParent, bool insertionOrderSpecified, AST::UiObjectMember *insertAfter, @@ -881,7 +900,7 @@ void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove, Q_ASSERT(newParent); Q_ASSERT(changeSet); - QHash<AST::UiObjectMember*, AST::UiObjectMember*> parentMembers; + QHash<AST::Node *, AST::UiObjectMember *> parentMembers; { ObjectMemberParentVisitor visitor; parentMembers = visitor(m_semanticInfo.document); @@ -891,8 +910,11 @@ void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove, Q_ASSERT(oldParent); // make sure that target parent is actually a direct ancestor of target sibling - if (insertAfter) - newParent = parentMembers.value(insertAfter); + if (insertAfter) { + auto objMember = parentMembers.value(insertAfter); + Q_ASSERT(objMember); + newParent = objMember; + } const QString documentText = m_semanticInfo.document->source(); diff --git a/src/plugins/qmljseditor/qmloutlinemodel.h b/src/plugins/qmljseditor/qmloutlinemodel.h index 626b5f3be4..f4cb500efa 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.h +++ b/src/plugins/qmljseditor/qmloutlinemodel.h @@ -131,7 +131,7 @@ private: void leaveNode(); void reparentNodes(QmlOutlineItem *targetItem, int targetRow, QList<QmlOutlineItem*> itemsToMove); - void moveObjectMember(QmlJS::AST::UiObjectMember *toMove, QmlJS::AST::UiObjectMember *newParent, + void moveObjectMember(QmlJS::AST::Node *toMove, QmlJS::AST::UiObjectMember *newParent, bool insertionOrderSpecified, QmlJS::AST::UiObjectMember *insertAfter, Utils::ChangeSet *changeSet, Utils::ChangeSet::Range *addedRange); |