From: Martin T. H. Sandsmark Date: Sun, 14 Jun 2015 01:49:20 +0000 (+0200) Subject: Add buffer filtering support. X-Git-Tag: travis-deploy-test~467 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=2fd8e1c1d5a04b167ffa73e9c011fd34faebe1fc Add buffer filtering support. --- diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 640b09cc..b732a2c6 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -722,7 +722,7 @@ BufferView *MainWin::activeBufferView() const if (_activeBufferViewIndex < 0 || _activeBufferViewIndex >= _bufferViews.count()) return 0; BufferViewDock *dock = _bufferViews.at(_activeBufferViewIndex); - return dock->isActive() ? qobject_cast(dock->widget()) : 0; + return dock->isActive() ? dock->bufferView() : 0; } @@ -731,9 +731,8 @@ void MainWin::changeActiveBufferView(int bufferViewId) if (bufferViewId < 0) return; - BufferView *current = activeBufferView(); - if (current) { - qobject_cast(current->parent())->setActive(false); + if (_activeBufferViewIndex >= 0 && _activeBufferViewIndex < _bufferViews.count()) { + _bufferViews[_activeBufferViewIndex]->setActive(false); _activeBufferViewIndex = -1; } @@ -768,9 +767,9 @@ void MainWin::showPasswordChangeDlg() void MainWin::changeActiveBufferView(bool backwards) { - BufferView *current = activeBufferView(); - if (current) - qobject_cast(current->parent())->setActive(false); + if (_activeBufferViewIndex >= 0 && _activeBufferViewIndex < _bufferViews.count()) { + _bufferViews[_activeBufferViewIndex]->setActive(false); + } if (!_bufferViews.count()) return; diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index da7d0371..2127bcc6 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "action.h" #include "buffermodel.h" @@ -548,6 +549,16 @@ void BufferView::hideCurrentBuffer() config()->requestRemoveBuffer(bufferId); } +void BufferView::filterTextChanged(QString filterString) +{ + BufferViewFilter *filter = qobject_cast(model()); + if (!filter) { + return; + } + filter->setFilterString(filterString); + on_configChanged(); // make sure collapsation is correct +} + QSize BufferView::sizeHint() const { @@ -631,6 +642,9 @@ bool BufferViewDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, c // ============================== BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent) : QDockWidget(parent), + _childWidget(0), + _widget(new QWidget(parent)), + _filterEdit(new QLineEdit(parent)), _active(false), _title(config->bufferViewName()) { @@ -639,6 +653,14 @@ BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent) setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea); connect(config, SIGNAL(bufferViewNameSet(const QString &)), this, SLOT(bufferViewRenamed(const QString &))); updateTitle(); + + _widget->setLayout(new QVBoxLayout); + _widget->layout()->setSpacing(0); + _widget->layout()->setContentsMargins(0, 0, 0, 0); + _filterEdit->setVisible(config->showSearch()); // hide it here, so we don't flicker or somesuch + _filterEdit->setPlaceholderText(tr("Search...")); + _widget->layout()->addWidget(_filterEdit); + QDockWidget::setWidget(_widget); } @@ -650,6 +672,14 @@ void BufferViewDock::updateTitle() setWindowTitle(title); } +void BufferViewDock::configChanged() +{ + _filterEdit->setVisible(config()->showSearch()); + + if (!_filterEdit->isVisible()) { + _filterEdit->setText(QLatin1String("")); + } +} void BufferViewDock::setActive(bool active) { @@ -691,3 +721,11 @@ BufferViewConfig *BufferViewDock::config() const else return view->config(); } + +void BufferViewDock::setWidget(QWidget *newWidget) +{ + _widget->layout()->addWidget(newWidget); + _childWidget = newWidget; + + connect(_filterEdit, SIGNAL(textChanged(QString)), bufferView(), SLOT(filterTextChanged(QString))); +} diff --git a/src/uisupport/bufferview.h b/src/uisupport/bufferview.h index 444f0185..a06c1f08 100644 --- a/src/uisupport/bufferview.h +++ b/src/uisupport/bufferview.h @@ -66,6 +66,7 @@ public slots: void nextBuffer(); void previousBuffer(); void hideCurrentBuffer(); + void filterTextChanged(QString filterString); signals: void removeBuffer(const QModelIndex &); @@ -141,6 +142,8 @@ public : BufferViewConfig *config() const; inline BufferView *bufferView() const { return qobject_cast(widget()); } inline bool isActive() const { return _active; } + void setWidget(QWidget *newWidget); + QWidget *widget() const { return _childWidget; } public slots: void setActive(bool active = true); @@ -150,7 +153,9 @@ private slots: void updateTitle(); private: - + QWidget *_childWidget; + QWidget *_widget; + QLineEdit *_filterEdit; bool _active; QString _title; }; diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index 189e177c..81f03d33 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -137,6 +137,14 @@ QList BufferViewFilter::actions(const QModelIndex &index) return actionList; } +void BufferViewFilter::setFilterString(const QString string) +{ + beginResetModel(); + _filterString = string; + endResetModel(); + enableEditMode(!string.isEmpty()); +} + void BufferViewFilter::enableEditMode(bool enable) { @@ -346,6 +354,16 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) return false; } + if (!_filterString.isEmpty()) { + const BufferInfo info = qvariant_cast(Client::bufferModel()->data(source_bufferIndex, NetworkModel::BufferInfoRole)); + QString name = info.bufferName(); + if (name.contains(_filterString)) { + return true; + } else { + return false; + } + } + // the following dynamic filters may not trigger if the buffer is currently selected. QModelIndex currentIndex = Client::bufferModel()->standardSelectionModel()->currentIndex(); if (bufferId == Client::bufferModel()->data(currentIndex, NetworkModel::BufferIdRole).value()) diff --git a/src/uisupport/bufferviewfilter.h b/src/uisupport/bufferviewfilter.h index 38aa7930..af6860a7 100644 --- a/src/uisupport/bufferviewfilter.h +++ b/src/uisupport/bufferviewfilter.h @@ -69,6 +69,8 @@ public: QList actions(const QModelIndex &index); + void setFilterString(const QString string); + protected: bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const; @@ -93,6 +95,7 @@ private: QSet _toAdd; QSet _toTempRemove; QSet _toRemove; + QString _filterString; bool filterAcceptBuffer(const QModelIndex &) const; bool filterAcceptNetwork(const QModelIndex &) const;