From 8e1af07c11c3bfa891703eff6a41ec4a5f291264 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 26 Sep 2017 12:38:38 +0200 Subject: [PATCH] QmlDesigner: Add option in navigator to show only visible items At the moment we show everything in default properties including non visible items. This is a bad default. Instead we provide an option if only visible items or all objects are shown in the navigator. Change-Id: I65b58d949136bcce4b06f1f47f56fb0f210fed5c Reviewed-by: Tim Jenssen --- .../navigator/navigatormodelinterface.h | 2 + .../navigator/navigatortreemodel.cpp | 29 ++++++++- .../components/navigator/navigatortreemodel.h | 3 + .../components/navigator/navigatorview.cpp | 12 ++++ .../components/navigator/navigatorview.h | 1 + .../components/navigator/navigatorwidget.cpp | 63 +++++++++++++------ .../components/navigator/navigatorwidget.h | 1 + src/plugins/qmldesigner/designersettings.cpp | 1 + src/plugins/qmldesigner/designersettings.h | 1 + 9 files changed, 90 insertions(+), 23 deletions(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatormodelinterface.h b/src/plugins/qmldesigner/components/navigator/navigatormodelinterface.h index 243aa489cf0..bedcc2f561a 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatormodelinterface.h +++ b/src/plugins/qmldesigner/components/navigator/navigatormodelinterface.h @@ -43,6 +43,8 @@ public: virtual void notifyModelNodesRemoved(const QList &modelNodes) = 0; virtual void notifyModelNodesInserted(const QList &modelNodes) = 0; virtual void notifyModelNodesMoved(const QList &modelNodes) = 0; + virtual void setFilter(bool showObjects) = 0; + virtual void resetModel() = 0; }; } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 0b6c3cc6ae8..3b78b09de1f 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -246,6 +246,16 @@ Qt::ItemFlags NavigatorTreeModel::flags(const QModelIndex &index) const | Qt::ItemNeverHasChildren; } +QList filteredList(const NodeListProperty &property, bool filter) +{ + if (!filter) + return property.toModelNodeList(); + + return Utils::filtered(property.toModelNodeList(), [] (const ModelNode &arg) { + return QmlItemNode::isValidQmlItemNode(arg); + }); +} + QModelIndex NavigatorTreeModel::index(int row, int column, const QModelIndex &parent) const { @@ -262,7 +272,7 @@ QModelIndex NavigatorTreeModel::index(int row, int column, ModelNode modelNode; if (parentModelNode.defaultNodeListProperty().isValid()) - modelNode = parentModelNode.defaultNodeListProperty().at(row); + modelNode = filteredList(parentModelNode.defaultNodeListProperty(), m_showOnlyVisibleItems).at(row); if (!modelNode.isValid()) return QModelIndex(); @@ -293,7 +303,7 @@ QModelIndex NavigatorTreeModel::parent(const QModelIndex &index) const int row = 0; if (!parentModelNode.isRootNode() && parentModelNode.parentProperty().isNodeListProperty()) - row = parentModelNode.parentProperty().toNodeListProperty().indexOf(parentModelNode); + row = filteredList(parentModelNode.parentProperty().toNodeListProperty(), m_showOnlyVisibleItems).indexOf(parentModelNode); return createIndexFromModelNode(row, 0, parentModelNode); } @@ -313,7 +323,7 @@ int NavigatorTreeModel::rowCount(const QModelIndex &parent) const int rows = 0; if (modelNode.defaultNodeListProperty().isValid()) - rows = modelNode.defaultNodeListProperty().count(); + rows = filteredList(modelNode.defaultNodeListProperty(), m_showOnlyVisibleItems).count(); return rows; } @@ -628,4 +638,17 @@ void NavigatorTreeModel::notifyModelNodesMoved(const QList &modelNode layoutChanged(indexes); } +void NavigatorTreeModel::setFilter(bool showOnlyVisibleItems) +{ + m_showOnlyVisibleItems = showOnlyVisibleItems; + resetModel(); +} + +void NavigatorTreeModel::resetModel() +{ + beginResetModel(); + m_nodeIndexHash.clear(); + endResetModel(); +} + } // QmlDesigner diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h index 9b6e22b114a..92b352fce50 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h @@ -87,6 +87,8 @@ public: void notifyModelNodesRemoved(const QList &modelNodes) override; void notifyModelNodesInserted(const QList &modelNodes) override; void notifyModelNodesMoved(const QList &modelNodes) override; + void setFilter(bool showOnlyVisibleItems) override; + void resetModel() override; private: void moveNodesInteractive(NodeAbstractProperty &parentProperty, const QList &modelNodes, int targetIndex); @@ -97,6 +99,7 @@ private: QPointer m_view; mutable QHash m_nodeIndexHash; + bool m_showOnlyVisibleItems = true; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 4bf00a00e7b..48531cf82eb 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -88,6 +89,7 @@ NavigatorView::NavigatorView(QObject* parent) : connect(m_widget.data(), &NavigatorWidget::rightButtonClicked, this, &NavigatorView::rightButtonClicked); connect(m_widget.data(), &NavigatorWidget::downButtonClicked, this, &NavigatorView::downButtonClicked); connect(m_widget.data(), &NavigatorWidget::upButtonClicked, this, &NavigatorView::upButtonClicked); + connect(m_widget.data(), &NavigatorWidget::filterToggled, this, &NavigatorView::filterToggled); #ifndef QMLDESIGNER_TEST NameItemDelegate *idDelegate = new NameItemDelegate(this); @@ -145,6 +147,9 @@ void NavigatorView::modelAttached(Model *model) { AbstractView::modelAttached(model); + m_currentModelInterface->setFilter( + DesignerSettings::getValue(DesignerSettingsKey::NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS).toBool()); + QTreeView *treeView = treeWidget(); treeView->expandAll(); @@ -400,6 +405,13 @@ void NavigatorView::downButtonClicked() blockSelectionChangedSignal(blocked); } +void NavigatorView::filterToggled(bool flag) +{ + m_currentModelInterface->setFilter(flag); + treeWidget()->expandAll(); + DesignerSettings::setValue(DesignerSettingsKey::NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS, flag); +} + void NavigatorView::changeSelection(const QItemSelection & /*newSelection*/, const QItemSelection &/*deselected*/) { if (m_blockSelectionChangedSignal) diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h index 24c65f2eeb8..d02a0d38fe0 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.h +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h @@ -99,6 +99,7 @@ private: void rightButtonClicked(); void upButtonClicked(); void downButtonClicked(); + void filterToggled(bool); protected: //functions QTreeView *treeWidget() const; diff --git a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp index d9794f6388e..0785e704df2 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp @@ -27,14 +27,17 @@ #include "navigatorview.h" #include "qmldesignerconstants.h" #include "qmldesignericons.h" +#include #include #include #include #include +#include #include #include #include +#include namespace QmlDesigner { @@ -80,29 +83,49 @@ QList NavigatorWidget::createToolBarWidgets() { QList buttons; - buttons.append(new QToolButton()); - buttons.last()->setIcon(Icons::ARROW_LEFT.icon()); - buttons.last()->setToolTip(tr("Become last sibling of parent (CTRL + Left).")); - buttons.last()->setShortcut(QKeySequence(Qt::Key_Left | Qt::CTRL)); - connect(buttons.last(), &QAbstractButton::clicked, this, &NavigatorWidget::leftButtonClicked); - buttons.append(new QToolButton()); - buttons.last()->setIcon(Icons::ARROW_RIGHT.icon()); - buttons.last()->setToolTip(tr("Become child of last sibling (CTRL + Right).")); - buttons.last()->setShortcut(QKeySequence(Qt::Key_Right | Qt::CTRL)); - connect(buttons.last(), &QAbstractButton::clicked, this, &NavigatorWidget::rightButtonClicked); + auto button = new QToolButton(); + button->setIcon(Icons::ARROW_LEFT.icon()); + button->setToolTip(tr("Become last sibling of parent (CTRL + Left).")); + button->setShortcut(QKeySequence(Qt::Key_Left | Qt::CTRL)); + connect(button, &QAbstractButton::clicked, this, &NavigatorWidget::leftButtonClicked); + buttons.append(button); - buttons.append(new QToolButton()); - buttons.last()->setIcon(Icons::ARROW_DOWN.icon()); - buttons.last()->setToolTip(tr("Move down (CTRL + Down).")); - buttons.last()->setShortcut(QKeySequence(Qt::Key_Down | Qt::CTRL)); - connect(buttons.last(), &QAbstractButton::clicked, this, &NavigatorWidget::downButtonClicked); + button = new QToolButton(); + button->setIcon(Icons::ARROW_RIGHT.icon()); + button->setToolTip(tr("Become child of last sibling (CTRL + Right).")); + button->setShortcut(QKeySequence(Qt::Key_Right | Qt::CTRL)); + connect(button, &QAbstractButton::clicked, this, &NavigatorWidget::rightButtonClicked); + buttons.append(button); - buttons.append(new QToolButton()); - buttons.last()->setIcon(Icons::ARROW_UP.icon()); - buttons.last()->setToolTip(tr("Move up (CTRL + Up).")); - buttons.last()->setShortcut(QKeySequence(Qt::Key_Up | Qt::CTRL)); - connect(buttons.last(), &QAbstractButton::clicked, this, &NavigatorWidget::upButtonClicked); + button = new QToolButton(); + button->setIcon(Icons::ARROW_DOWN.icon()); + button->setToolTip(tr("Move down (CTRL + Down).")); + button->setShortcut(QKeySequence(Qt::Key_Down | Qt::CTRL)); + connect(button, &QAbstractButton::clicked, this, &NavigatorWidget::downButtonClicked); + buttons.append(button); + + button = new QToolButton(); + button->setIcon(Icons::ARROW_UP.icon()); + button->setToolTip(tr("Move up (CTRL + Up).")); + button->setShortcut(QKeySequence(Qt::Key_Up | Qt::CTRL)); + connect(button, &QAbstractButton::clicked, this, &NavigatorWidget::upButtonClicked); + buttons.append(button); + + auto filter = new QToolButton; + filter->setIcon(Utils::Icons::FILTER.icon()); + filter->setToolTip(tr("Filter Tree")); + filter->setPopupMode(QToolButton::InstantPopup); + filter->setProperty("noArrow", true); + auto filterMenu = new QMenu(filter); + auto objectAction = new QAction(tr("Show only visible itmes.")); + objectAction->setCheckable(true); + objectAction->setChecked( + DesignerSettings::getValue(DesignerSettingsKey::NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS).toBool()); + connect(objectAction, &QAction::toggled, this, &NavigatorWidget::filterToggled); + filterMenu->addAction(objectAction); + filter->setMenu(filterMenu); + buttons.append(filter); return buttons; } diff --git a/src/plugins/qmldesigner/components/navigator/navigatorwidget.h b/src/plugins/qmldesigner/components/navigator/navigatorwidget.h index 526004cf840..45e8b19c9b5 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorwidget.h +++ b/src/plugins/qmldesigner/components/navigator/navigatorwidget.h @@ -53,6 +53,7 @@ signals: void rightButtonClicked(); void upButtonClicked(); void downButtonClicked(); + void filterToggled(bool); private: // functions NavigatorView *navigatorView() const; diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index c75c98c80bc..026fb51bcfb 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -74,6 +74,7 @@ void DesignerSettings::fromSettings(QSettings *settings) restoreValue(settings, DesignerSettingsKey::FORWARD_PUPPET_OUTPUT, QString()); restoreValue(settings, DesignerSettingsKey::REFORMAT_UI_QML_FILES, true); restoreValue(settings, DesignerSettingsKey::IGNORE_DEVICE_PIXEL_RATIO, false); + restoreValue(settings, DesignerSettingsKey::NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS, true); settings->endGroup(); settings->endGroup(); diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index a3710d278dc..7172c10491e 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -60,6 +60,7 @@ const char PUPPET_KILL_TIMEOUT[] = "PuppetKillTimeout"; const char DEBUG_PUPPET[] = "DebugPuppet"; const char FORWARD_PUPPET_OUTPUT[] = "ForwardPuppetOutput"; const char STATESEDITOR_EXPANDED[] = "StatesEditorExpanded"; +const char NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS[] = "NavigatorShowOnlyVisibleItems"; const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* These settings are not exposed in ui. */ const char IGNORE_DEVICE_PIXEL_RATIO[] = "IgnoreDevicePixelRaio"; /* The settings can be used to turn off the feature, if there are serious issues */ }