diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 3544cf3f2d33345e9bdc0435b4a6414f1a3e5bca..cc28c720e91478e3b0ce644e3620970717400e4d 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -75,6 +75,7 @@ #include <QtGui/QTextEdit> #include <QtGui/QComboBox> #include <QtGui/QTreeView> +#include <QtGui/QSortFilterProxyModel> using namespace CPlusPlus; using namespace CppEditor::Internal; @@ -243,7 +244,22 @@ void CPPEditor::createToolBar(CPPEditorEditable *editable) m_methodCombo->setMaxVisibleItems(20); m_overviewModel = new OverviewModel(this); - m_methodCombo->setModel(m_overviewModel); + m_proxyModel = new QSortFilterProxyModel(this); + m_proxyModel->setSourceModel(m_overviewModel); + if (CppPlugin::instance()->sortedMethodOverview()) + m_proxyModel->sort(0, Qt::AscendingOrder); + else + m_proxyModel->sort(-1, Qt::AscendingOrder); // don't sort yet, but set column for sortedMethodOverview() + m_proxyModel->setDynamicSortFilter(true); + m_proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); + m_methodCombo->setModel(m_proxyModel); + + m_methodCombo->setContextMenuPolicy(Qt::ActionsContextMenu); + m_sortAction = new QAction(tr("Sort alphabetically"), m_methodCombo); + m_sortAction->setCheckable(true); + m_sortAction->setChecked(sortedMethodOverview()); + connect(m_sortAction, SIGNAL(toggled(bool)), CppPlugin::instance(), SLOT(setSortedMethodOverview(bool))); + m_methodCombo->addAction(m_sortAction); connect(m_methodCombo, SIGNAL(activated(int)), this, SLOT(jumpToMethod(int))); connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(updateMethodBoxIndex())); @@ -366,7 +382,7 @@ void CPPEditor::updateFileName() void CPPEditor::jumpToMethod(int) { - QModelIndex index = m_methodCombo->view()->currentIndex(); + QModelIndex index = m_proxyModel->mapToSource(m_methodCombo->view()->currentIndex()); Symbol *symbol = m_overviewModel->symbolFromIndex(index); if (! symbol) return; @@ -374,6 +390,25 @@ void CPPEditor::jumpToMethod(int) openCppEditorAt(linkToSymbol(symbol)); } +void CPPEditor::setSortedMethodOverview(bool sort) +{ + if (sort != sortedMethodOverview()) { + if (sort) + m_proxyModel->sort(0, Qt::AscendingOrder); + else + m_proxyModel->sort(-1, Qt::AscendingOrder); + bool block = m_sortAction->blockSignals(true); + m_sortAction->setChecked(m_proxyModel->sortColumn() == 0); + m_sortAction->blockSignals(block); + updateMethodBoxIndex(); + } +} + +bool CPPEditor::sortedMethodOverview() const +{ + return (m_proxyModel->sortColumn() == 0); +} + void CPPEditor::updateMethodBoxIndex() { int line = 0, column = 0; @@ -394,7 +429,7 @@ void CPPEditor::updateMethodBoxIndex() if (lastIndex.isValid()) { bool blocked = m_methodCombo->blockSignals(true); - m_methodCombo->setCurrentIndex(lastIndex.row()); + m_methodCombo->setCurrentIndex(m_proxyModel->mapFromSource(lastIndex).row()); updateMethodBoxToolTip(); (void) m_methodCombo->blockSignals(blocked); } diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index ae352b8d6d503e9b7afa6b47ffb4d24ef4be6f84..efae361e0e62b79070839d2c59e34f42a7516c51 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -37,6 +37,7 @@ QT_BEGIN_NAMESPACE class QComboBox; +class QSortFilterProxyModel; QT_END_NAMESPACE namespace CPlusPlus { @@ -86,6 +87,7 @@ public: public slots: virtual void setFontSettings(const TextEditor::FontSettings &); + void setSortedMethodOverview(bool sort); void switchDeclarationDefinition(); void jumpToDefinition(); @@ -94,7 +96,6 @@ public slots: void deleteStartOfToken(); void deleteEndOfToken(); - protected: void contextMenuEvent(QContextMenuEvent *); void mouseMoveEvent(QMouseEvent *); @@ -115,6 +116,7 @@ private slots: void onDocumentUpdated(CPlusPlus::Document::Ptr doc); private: + bool sortedMethodOverview() const; CPlusPlus::Symbol *findDefinition(CPlusPlus::Symbol *symbol); virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar); @@ -161,6 +163,8 @@ private: QList<int> m_contexts; QComboBox *m_methodCombo; CPlusPlus::OverviewModel *m_overviewModel; + QSortFilterProxyModel *m_proxyModel; + QAction *m_sortAction; }; } // namespace Internal diff --git a/src/plugins/cppeditor/cppplugin.cpp b/src/plugins/cppeditor/cppplugin.cpp index 29ad67314517bb22d5a10d5fdd09d2b2c6c03a7f..9e17083c2190fba27b2e796a25074c5a35f48034 100644 --- a/src/plugins/cppeditor/cppplugin.cpp +++ b/src/plugins/cppeditor/cppplugin.cpp @@ -106,7 +106,8 @@ CppPlugin *CppPlugin::m_instance = 0; CppPlugin::CppPlugin() : m_actionHandler(0), - m_factory(0) + m_factory(0), + m_sortedMethodOverview(false) { m_instance = this; } @@ -133,6 +134,20 @@ void CppPlugin::initializeEditor(CPPEditor *editor) // auto completion connect(editor, SIGNAL(requestAutoCompletion(ITextEditable*, bool)), TextEditor::Internal::CompletionSupport::instance(), SLOT(autoComplete(ITextEditable*, bool))); + // method combo box sorting + connect(this, SIGNAL(methodOverviewSortingChanged(bool)), + editor, SLOT(setSortedMethodOverview(bool))); +} + +void CppPlugin::setSortedMethodOverview(bool sorted) +{ + m_sortedMethodOverview = sorted; + emit methodOverviewSortingChanged(sorted); +} + +bool CppPlugin::sortedMethodOverview() const +{ + return m_sortedMethodOverview; } bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage) @@ -194,14 +209,30 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess | TextEditor::TextEditorActionHandler::UnCommentSelection | TextEditor::TextEditorActionHandler::UnCollapseAll); + readSettings(); return true; } +void CppPlugin::readSettings() +{ + m_sortedMethodOverview = Core::ICore::instance()->settings()->value("CppTools/SortedMethodOverview", false).toBool(); +} + +void CppPlugin::writeSettings() +{ + Core::ICore::instance()->settings()->setValue("CppTools/SortedMethodOverview", m_sortedMethodOverview); +} + void CppPlugin::extensionsInitialized() { m_actionHandler->initializeActions(); } +void CppPlugin::shutdown() +{ + writeSettings(); +} + void CppPlugin::switchDeclarationDefinition() { Core::EditorManager *em = Core::EditorManager::instance(); diff --git a/src/plugins/cppeditor/cppplugin.h b/src/plugins/cppeditor/cppplugin.h index 151eda3888532ce4d181b550a53f8d4dce94f2ba..4ad8400342b713de24c5ddebf7f7bf9d58217eb3 100644 --- a/src/plugins/cppeditor/cppplugin.h +++ b/src/plugins/cppeditor/cppplugin.h @@ -58,10 +58,19 @@ public: bool initialize(const QStringList &arguments, QString *error_message = 0); void extensionsInitialized(); + void shutdown(); // Connect editor to settings changed signals. void initializeEditor(CPPEditor *editor); + bool sortedMethodOverview() const; + +signals: + void methodOverviewSortingChanged(bool sort); + +public slots: + void setSortedMethodOverview(bool sorted); + private slots: void switchDeclarationDefinition(); void jumpToDefinition(); @@ -69,11 +78,14 @@ private slots: private: friend class CppEditorFactory; Core::IEditor *createEditor(QWidget *parent); + void writeSettings(); + void readSettings(); static CppPlugin *m_instance; TextEditor::TextEditorActionHandler *m_actionHandler; CppEditorFactory *m_factory; + bool m_sortedMethodOverview; }; class CppEditorFactory : public Core::IEditorFactory