diff --git a/src/plugins/coreplugin/core.qrc b/src/plugins/coreplugin/core.qrc index 20e9cfb9a851d2b2bd567ad533d7353ea65d3d70..a06cdbf3c8985069b97b0c02c672a906beec843e 100644 --- a/src/plugins/coreplugin/core.qrc +++ b/src/plugins/coreplugin/core.qrc @@ -65,5 +65,6 @@ <file>images/category_cpp.png</file> <file>images/category_vcs.png</file> <file>images/category_qml.png</file> + <file>images/filtericon.png</file> </qresource> </RCC> diff --git a/src/plugins/projectexplorer/images/filtericon.png b/src/plugins/coreplugin/images/filtericon.png similarity index 100% rename from src/plugins/projectexplorer/images/filtericon.png rename to src/plugins/coreplugin/images/filtericon.png diff --git a/src/plugins/cppeditor/cppoutline.cpp b/src/plugins/cppeditor/cppoutline.cpp index 146b060ae68d4629ecfd92533afb2d80ec8c1f0d..4e9fcfdbdaf6ed21b44cd7f1ae81b3c62a841e2d 100644 --- a/src/plugins/cppeditor/cppoutline.cpp +++ b/src/plugins/cppeditor/cppoutline.cpp @@ -81,6 +81,11 @@ CppOutlineWidget::CppOutlineWidget(CPPEditor *editor) : this, SLOT(updateSelectionInText(QItemSelection))); } +QList<QAction*> CppOutlineWidget::filterMenuActions() const +{ + return QList<QAction*>(); +} + void CppOutlineWidget::setCursorSynchronization(bool syncWithCursor) { m_enableCursorSync = syncWithCursor; diff --git a/src/plugins/cppeditor/cppoutline.h b/src/plugins/cppeditor/cppoutline.h index 3eea8b3c65fb5a77e5b0dbe6553d2575e1a9fa21..d007b9689de001d03db487328b17d2ecbe317f4d 100644 --- a/src/plugins/cppeditor/cppoutline.h +++ b/src/plugins/cppeditor/cppoutline.h @@ -37,6 +37,7 @@ public: CppOutlineWidget(CPPEditor *editor); // IOutlineWidget + virtual QList<QAction*> filterMenuActions() const; virtual void setCursorSynchronization(bool syncWithCursor); private slots: diff --git a/src/plugins/projectexplorer/projectexplorer.qrc b/src/plugins/projectexplorer/projectexplorer.qrc index 68c6d21728d505ade9be04f58174fa2769f7e8bd..09cb165d5693a061935776d35c35bfdcb4382716 100644 --- a/src/plugins/projectexplorer/projectexplorer.qrc +++ b/src/plugins/projectexplorer/projectexplorer.qrc @@ -6,7 +6,6 @@ <file>images/closetab.png</file> <file>images/debugger_start.png</file> <file>images/debugger_start_small.png</file> - <file>images/filtericon.png</file> <file>images/projectexplorer.png</file> <file>images/rebuild.png</file> <file>images/rebuild_small.png</file> diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index 65179a5180416140f2c9412a025d0f9dc4f6d314..56495cf6394352f86f0812e78d2ec13e947f035e 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -396,7 +396,7 @@ Core::NavigationView ProjectTreeWidgetFactory::createWidget() n.widget = ptw; QToolButton *filter = new QToolButton; - filter->setIcon(QIcon(":/projectexplorer/images/filtericon.png")); + filter->setIcon(QIcon(":/core/images/filtericon.png")); filter->setToolTip(tr("Filter tree")); filter->setPopupMode(QToolButton::InstantPopup); QMenu *filterMenu = new QMenu(filter); diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index e654f842c2824d8acf63afc128f420fd4f3c9303..f71f3cb23fd946335835853828d142a77fd6f67f 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -560,7 +560,7 @@ TaskWindow::TaskWindow(TaskHub *taskhub) : d(new TaskWindowPrivate) connect(d->m_categoriesMenu, SIGNAL(triggered(QAction*)), this, SLOT(filterCategoryTriggered(QAction*))); d->m_categoriesButton = new QToolButton; - d->m_categoriesButton->setIcon(QIcon(":/projectexplorer/images/filtericon.png")); + d->m_categoriesButton->setIcon(QIcon(":/core/images/filtericon.png")); d->m_categoriesButton->setToolTip(tr("Filter by categories")); d->m_categoriesButton->setAutoRaise(true); d->m_categoriesButton->setPopupMode(QToolButton::InstantPopup); diff --git a/src/plugins/qmljseditor/qmljsoutline.cpp b/src/plugins/qmljseditor/qmljsoutline.cpp index 4c018a5b6ede49d868eeb57ebe465efd45952a2f..7831670eec72410e9e11e836cd9f15de773b3708 100644 --- a/src/plugins/qmljseditor/qmljsoutline.cpp +++ b/src/plugins/qmljseditor/qmljsoutline.cpp @@ -3,6 +3,7 @@ #include <coreplugin/ifile.h> #include <coreplugin/editormanager/editormanager.h> +#include <QtGui/QAction> #include <QtGui/QVBoxLayout> #include <QDebug> @@ -29,18 +30,57 @@ QmlJSOutlineTreeView::QmlJSOutlineTreeView(QWidget *parent) : setExpandsOnDoubleClick(false); } +QmlJSOutlineFilterModel::QmlJSOutlineFilterModel(QObject *parent) : + QSortFilterProxyModel(parent) +{ +} + +bool QmlJSOutlineFilterModel::filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const +{ + if (m_filterBindings) { + QModelIndex sourceIndex = sourceModel()->index(sourceRow, 0, sourceParent); + if (sourceIndex.data(QmlOutlineModel::ItemTypeRole) == QmlOutlineModel::PropertyType) { + return false; + } + } + return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); +} + +bool QmlJSOutlineFilterModel::filterBindings() const +{ + return m_filterBindings; +} + +void QmlJSOutlineFilterModel::setFilterBindings(bool filterBindings) +{ + if (m_filterBindings != filterBindings) { + m_filterBindings = filterBindings; + invalidateFilter(); + } +} + QmlJSOutlineWidget::QmlJSOutlineWidget(QWidget *parent) : TextEditor::IOutlineWidget(parent), m_treeView(new QmlJSOutlineTreeView(this)), + m_filterModel(new QmlJSOutlineFilterModel(this)), m_enableCursorSync(true), m_blockCursorSync(false) { + m_treeView->setModel(m_filterModel); + QVBoxLayout *layout = new QVBoxLayout; layout->setMargin(0); layout->setSpacing(0); layout->addWidget(m_treeView); + m_showBindingsAction = new QAction(this); + m_showBindingsAction->setText(tr("Show bindings")); + m_showBindingsAction->setCheckable(true); + m_showBindingsAction->setChecked(true); + connect(m_showBindingsAction, SIGNAL(triggered(bool)), this, SLOT(setShowBindings(bool))); + setLayout(layout); } @@ -48,7 +88,7 @@ void QmlJSOutlineWidget::setEditor(QmlJSTextEditor *editor) { m_editor = editor; - m_treeView->setModel(m_editor.data()->outlineModel()); + m_filterModel->setSourceModel(m_editor.data()->outlineModel()); modelUpdated(); connect(m_treeView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), @@ -60,6 +100,13 @@ void QmlJSOutlineWidget::setEditor(QmlJSTextEditor *editor) this, SLOT(modelUpdated())); } +QList<QAction*> QmlJSOutlineWidget::filterMenuActions() const +{ + QList<QAction*> list; + list.append(m_showBindingsAction); + return list; +} + void QmlJSOutlineWidget::setCursorSynchronization(bool syncWithCursor) { m_enableCursorSync = syncWithCursor; @@ -78,7 +125,7 @@ void QmlJSOutlineWidget::updateSelectionInTree(const QModelIndex &index) return; m_blockCursorSync = true; - m_treeView->selectionModel()->select(index, QItemSelectionModel::ClearAndSelect); + m_treeView->selectionModel()->select(m_filterModel->mapFromSource(index), QItemSelectionModel::ClearAndSelect); m_treeView->scrollTo(index); m_blockCursorSync = false; } @@ -105,6 +152,12 @@ void QmlJSOutlineWidget::updateSelectionInText(const QItemSelection &selection) } } +void QmlJSOutlineWidget::setShowBindings(bool showBindings) +{ + m_filterModel->setFilterBindings(!showBindings); + modelUpdated(); +} + bool QmlJSOutlineWidget::syncCursor() { return m_enableCursorSync && !m_blockCursorSync; diff --git a/src/plugins/qmljseditor/qmljsoutline.h b/src/plugins/qmljseditor/qmljsoutline.h index c42685dd8d68a5c62cc54ee6b1f188684eaed69a..15221210cb94e211e351c529708597ffd31b5220 100644 --- a/src/plugins/qmljseditor/qmljsoutline.h +++ b/src/plugins/qmljseditor/qmljsoutline.h @@ -6,6 +6,7 @@ #include <texteditor/ioutlinewidget.h> #include <QtGui/QTreeView> +#include <QtGui/QSortFilterProxyModel> namespace Core { class IEditor; @@ -25,6 +26,21 @@ public: QmlJSOutlineTreeView(QWidget *parent = 0); }; +class QmlJSOutlineFilterModel : public QSortFilterProxyModel +{ + Q_OBJECT +public: + QmlJSOutlineFilterModel(QObject *parent); + // QSortFilterProxyModel + bool filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const; + + bool filterBindings() const; + void setFilterBindings(bool filterBindings); +private: + bool m_filterBindings; +}; + class QmlJSOutlineWidget : public TextEditor::IOutlineWidget { Q_OBJECT @@ -34,20 +50,25 @@ public: void setEditor(QmlJSTextEditor *editor); // IOutlineWidget + virtual QList<QAction*> filterMenuActions() const; virtual void setCursorSynchronization(bool syncWithCursor); private slots: void modelUpdated(); void updateSelectionInTree(const QModelIndex &index); void updateSelectionInText(const QItemSelection &selection); + void setShowBindings(bool showBindings); private: bool syncCursor(); private: QmlJSOutlineTreeView *m_treeView; + QmlJSOutlineFilterModel *m_filterModel; QWeakPointer<QmlJSTextEditor> m_editor; + QAction *m_showBindingsAction; + bool m_enableCursorSync; bool m_blockCursorSync; }; diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index ef2c8380136c09fd903e678058c2125caedf2524..7e38084d4596652df1c140e09df0a2584c31e60c 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -201,6 +201,22 @@ private: int indent; }; +class OutlineItem : public QStandardItem +{ + int type() const + { + return QStandardItem::UserType + 1; + } + + QVariant data(int role = Qt::UserRole + 1) const + { + if (role == Qt::ToolTipRole) { + + } + return QStandardItem::data(role); + } +}; + QmlOutlineModel::QmlOutlineModel(QObject *parent) : QStandardItemModel(parent) { @@ -238,6 +254,7 @@ QModelIndex QmlOutlineModel::enterElement(const QString &type, const QString &id } item->setIcon(icon); item->setToolTip(type); + item->setData(ElementType, ItemTypeRole); return item->index(); } @@ -255,6 +272,7 @@ QModelIndex QmlOutlineModel::enterProperty(const QString &name, bool isCustomPro } else { item->setIcon(m_icons->scriptBindingIcon()); } + item->setData(PropertyType, ItemTypeRole); return item->index(); } diff --git a/src/plugins/qmljseditor/qmloutlinemodel.h b/src/plugins/qmljseditor/qmloutlinemodel.h index 6b22538ed80ce579f6ac12060ecd814e2655d93b..1363ef9b27e6e9ef1a9cdcfd6f5cfb04c3b1aa10 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.h +++ b/src/plugins/qmljseditor/qmloutlinemodel.h @@ -14,7 +14,13 @@ class QmlOutlineModel : public QStandardItemModel Q_OBJECT public: enum CustomRoles { - SourceLocationRole = Qt::UserRole + 1 + SourceLocationRole = Qt::UserRole + 1, + ItemTypeRole = SourceLocationRole + 1 + }; + + enum ItemTypes { + ElementType, + PropertyType }; QmlOutlineModel(QObject *parent = 0); diff --git a/src/plugins/texteditor/ioutlinewidget.h b/src/plugins/texteditor/ioutlinewidget.h index 1242b8535619d89a40fc11cdda2bb68d7fa42fdd..1ac85f80740be7368beb02af962e6d84317e1220 100644 --- a/src/plugins/texteditor/ioutlinewidget.h +++ b/src/plugins/texteditor/ioutlinewidget.h @@ -16,6 +16,7 @@ class TEXTEDITOR_EXPORT IOutlineWidget : public QWidget public: IOutlineWidget(QWidget *parent = 0) : QWidget(parent) {} + virtual QList<QAction*> filterMenuActions() const = 0; virtual void setCursorSynchronization(bool syncWithCursor) = 0; }; diff --git a/src/plugins/texteditor/outlinefactory.cpp b/src/plugins/texteditor/outlinefactory.cpp index f280458ce6f60844f643202fbef65304a314110f..dac2e6b8c674f3bfb8571ebff22702d37876de37 100644 --- a/src/plugins/texteditor/outlinefactory.cpp +++ b/src/plugins/texteditor/outlinefactory.cpp @@ -1,4 +1,5 @@ #include "outlinefactory.h" +#include <coreplugin/icore.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/ieditor.h> #include <QVBoxLayout> @@ -31,6 +32,14 @@ OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) : m_toggleSync->setToolTip(tr("Synchronize with Editor")); connect(m_toggleSync, SIGNAL(clicked(bool)), this, SLOT(toggleCursorSynchronization())); + m_filterButton = new QToolButton; + m_filterButton->setIcon(QIcon(":/core/images/filtericon.png")); + m_filterButton->setToolTip(tr("Filter tree")); + m_filterButton->setPopupMode(QToolButton::InstantPopup); + m_filterMenu = new QMenu(m_filterButton); + m_filterButton->setMenu(m_filterMenu); + connect(m_filterMenu, SIGNAL(aboutToShow()), this, SLOT(updateFilterMenu())); + Core::EditorManager *editorManager = Core::EditorManager::instance(); connect(editorManager, SIGNAL(currentEditorChanged(Core::IEditor*)), this, SLOT(updateCurrentEditor(Core::IEditor*))); @@ -46,6 +55,11 @@ QToolButton *OutlineWidgetStack::toggleSyncButton() return m_toggleSync; } +QToolButton *OutlineWidgetStack::filterButton() +{ + return m_filterButton; +} + bool OutlineWidgetStack::isCursorSynchronized() const { return m_syncWithEditor; @@ -58,6 +72,16 @@ void OutlineWidgetStack::toggleCursorSynchronization() outlineWidget->setCursorSynchronization(m_syncWithEditor); } +void OutlineWidgetStack::updateFilterMenu() +{ + m_filterMenu->clear(); + if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget())) { + foreach (QAction *filterAction, outlineWidget->filterMenuActions()) { + m_filterMenu->addAction(filterAction); + } + } +} + void OutlineWidgetStack::updateCurrentEditor(Core::IEditor *editor) { IOutlineWidget *newWidget = 0; @@ -121,6 +145,7 @@ Core::NavigationView OutlineFactory::createWidget() OutlineWidgetStack *placeHolder = new OutlineWidgetStack(this); n.widget = placeHolder; n.dockToolBarWidgets.append(placeHolder->toggleSyncButton()); + n.dockToolBarWidgets.append(placeHolder->filterButton()); return n; } diff --git a/src/plugins/texteditor/outlinefactory.h b/src/plugins/texteditor/outlinefactory.h index c3b7b440c193896519f727818c5e246e672dbedc..360ccbdd28079188138d43fc69a71c77761184b6 100644 --- a/src/plugins/texteditor/outlinefactory.h +++ b/src/plugins/texteditor/outlinefactory.h @@ -4,6 +4,7 @@ #include <texteditor/ioutlinewidget.h> #include <coreplugin/inavigationwidgetfactory.h> #include <QtGui/QStackedWidget> +#include <QtGui/QMenu> namespace Core { class IEditor; @@ -22,6 +23,7 @@ public: ~OutlineWidgetStack(); QToolButton *toggleSyncButton(); + QToolButton *filterButton(); private: bool isCursorSynchronized() const; @@ -29,12 +31,15 @@ private: private slots: void toggleCursorSynchronization(); + void updateFilterMenu(); void updateCurrentEditor(Core::IEditor *editor); private: QStackedWidget *m_widgetStack; OutlineFactory *m_factory; QToolButton *m_toggleSync; + QToolButton *m_filterButton; + QMenu *m_filterMenu; bool m_syncWithEditor; };