aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmljseditor
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmljseditor')
-rw-r--r--src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp15
-rw-r--r--src/plugins/qmljseditor/qmljscomponentnamedialog.cpp2
-rw-r--r--src/plugins/qmljseditor/qmljseditor.cpp9
-rw-r--r--src/plugins/qmljseditor/qmljseditor.h2
-rw-r--r--src/plugins/qmljseditor/qmljseditordocument.cpp7
-rw-r--r--src/plugins/qmljseditor/qmljseditorplugin.cpp7
-rw-r--r--src/plugins/qmljseditor/qmljsoutline.cpp37
-rw-r--r--src/plugins/qmljseditor/qmljsoutline.h8
-rw-r--r--src/plugins/qmljseditor/qmloutlinemodel.cpp38
-rw-r--r--src/plugins/qmljseditor/qmloutlinemodel.h2
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);