Add buffer filtering support.
authorMartin T. H. Sandsmark <martin.sandsmark@kde.org>
Sun, 14 Jun 2015 01:49:20 +0000 (03:49 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Mon, 5 Sep 2016 16:59:38 +0000 (18:59 +0200)
src/qtui/mainwin.cpp
src/uisupport/bufferview.cpp
src/uisupport/bufferview.h
src/uisupport/bufferviewfilter.cpp
src/uisupport/bufferviewfilter.h

index 640b09c..b732a2c 100644 (file)
@@ -722,7 +722,7 @@ BufferView *MainWin::activeBufferView() const
     if (_activeBufferViewIndex < 0 || _activeBufferViewIndex >= _bufferViews.count())
         return 0;
     BufferViewDock *dock = _bufferViews.at(_activeBufferViewIndex);
     if (_activeBufferViewIndex < 0 || _activeBufferViewIndex >= _bufferViews.count())
         return 0;
     BufferViewDock *dock = _bufferViews.at(_activeBufferViewIndex);
-    return dock->isActive() ? qobject_cast<BufferView *>(dock->widget()) : 0;
+    return dock->isActive() ? dock->bufferView() : 0;
 }
 
 
 }
 
 
@@ -731,9 +731,8 @@ void MainWin::changeActiveBufferView(int bufferViewId)
     if (bufferViewId < 0)
         return;
 
     if (bufferViewId < 0)
         return;
 
-    BufferView *current = activeBufferView();
-    if (current) {
-        qobject_cast<BufferViewDock *>(current->parent())->setActive(false);
+    if (_activeBufferViewIndex >= 0 && _activeBufferViewIndex < _bufferViews.count()) {
+        _bufferViews[_activeBufferViewIndex]->setActive(false);
         _activeBufferViewIndex = -1;
     }
 
         _activeBufferViewIndex = -1;
     }
 
@@ -768,9 +767,9 @@ void MainWin::showPasswordChangeDlg()
 
 void MainWin::changeActiveBufferView(bool backwards)
 {
 
 void MainWin::changeActiveBufferView(bool backwards)
 {
-    BufferView *current = activeBufferView();
-    if (current)
-        qobject_cast<BufferViewDock *>(current->parent())->setActive(false);
+    if (_activeBufferViewIndex >= 0 && _activeBufferViewIndex < _bufferViews.count()) {
+        _bufferViews[_activeBufferViewIndex]->setActive(false);
+    }
 
     if (!_bufferViews.count())
         return;
 
     if (!_bufferViews.count())
         return;
index da7d037..2127bcc 100644 (file)
@@ -28,6 +28,7 @@
 #include <QMenu>
 #include <QMessageBox>
 #include <QSet>
 #include <QMenu>
 #include <QMessageBox>
 #include <QSet>
+#include <QVBoxLayout>
 
 #include "action.h"
 #include "buffermodel.h"
 
 #include "action.h"
 #include "buffermodel.h"
@@ -548,6 +549,16 @@ void BufferView::hideCurrentBuffer()
     config()->requestRemoveBuffer(bufferId);
 }
 
     config()->requestRemoveBuffer(bufferId);
 }
 
+void BufferView::filterTextChanged(QString filterString)
+{
+    BufferViewFilter *filter = qobject_cast<BufferViewFilter *>(model());
+    if (!filter) {
+        return;
+    }
+    filter->setFilterString(filterString);
+    on_configChanged(); // make sure collapsation is correct
+}
+
 
 QSize BufferView::sizeHint() const
 {
 
 QSize BufferView::sizeHint() const
 {
@@ -631,6 +642,9 @@ bool BufferViewDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, c
 // ==============================
 BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent)
     : QDockWidget(parent),
 // ==============================
 BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent)
     : QDockWidget(parent),
+    _childWidget(0),
+    _widget(new QWidget(parent)),
+    _filterEdit(new QLineEdit(parent)),
     _active(false),
     _title(config->bufferViewName())
 {
     _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();
     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);
 }
 
     setWindowTitle(title);
 }
 
+void BufferViewDock::configChanged()
+{
+    _filterEdit->setVisible(config()->showSearch());
+
+    if (!_filterEdit->isVisible()) {
+        _filterEdit->setText(QLatin1String(""));
+    }
+}
 
 void BufferViewDock::setActive(bool active)
 {
 
 void BufferViewDock::setActive(bool active)
 {
@@ -691,3 +721,11 @@ BufferViewConfig *BufferViewDock::config() const
     else
         return view->config();
 }
     else
         return view->config();
 }
+
+void BufferViewDock::setWidget(QWidget *newWidget)
+{
+    _widget->layout()->addWidget(newWidget);
+    _childWidget = newWidget;
+
+    connect(_filterEdit, SIGNAL(textChanged(QString)), bufferView(), SLOT(filterTextChanged(QString)));
+}
index 444f018..a06c1f0 100644 (file)
@@ -66,6 +66,7 @@ public slots:
     void nextBuffer();
     void previousBuffer();
     void hideCurrentBuffer();
     void nextBuffer();
     void previousBuffer();
     void hideCurrentBuffer();
+    void filterTextChanged(QString filterString);
 
 signals:
     void removeBuffer(const QModelIndex &);
 
 signals:
     void removeBuffer(const QModelIndex &);
@@ -141,6 +142,8 @@ public :
     BufferViewConfig *config() const;
     inline BufferView *bufferView() const { return qobject_cast<BufferView *>(widget()); }
     inline bool isActive() const { return _active; }
     BufferViewConfig *config() const;
     inline BufferView *bufferView() const { return qobject_cast<BufferView *>(widget()); }
     inline bool isActive() const { return _active; }
+    void setWidget(QWidget *newWidget);
+    QWidget *widget() const { return _childWidget; }
 
 public slots:
     void setActive(bool active = true);
 
 public slots:
     void setActive(bool active = true);
@@ -150,7 +153,9 @@ private slots:
     void updateTitle();
 
 private:
     void updateTitle();
 
 private:
-
+    QWidget *_childWidget;
+    QWidget *_widget;
+    QLineEdit *_filterEdit;
     bool _active;
     QString _title;
 };
     bool _active;
     QString _title;
 };
index 189e177..81f03d3 100644 (file)
@@ -137,6 +137,14 @@ QList<QAction *> BufferViewFilter::actions(const QModelIndex &index)
     return actionList;
 }
 
     return actionList;
 }
 
+void BufferViewFilter::setFilterString(const QString string)
+{
+    beginResetModel();
+    _filterString = string;
+    endResetModel();
+    enableEditMode(!string.isEmpty());
+}
+
 
 void BufferViewFilter::enableEditMode(bool enable)
 {
 
 void BufferViewFilter::enableEditMode(bool enable)
 {
@@ -346,6 +354,16 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex)
         return false;
     }
 
         return false;
     }
 
+    if (!_filterString.isEmpty()) {
+        const BufferInfo info = qvariant_cast<BufferInfo>(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<BufferId>())
     // 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<BufferId>())
index 38aa793..af6860a 100644 (file)
@@ -69,6 +69,8 @@ public:
 
     QList<QAction *> actions(const QModelIndex &index);
 
 
     QList<QAction *> 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;
 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<BufferId> _toAdd;
     QSet<BufferId> _toTempRemove;
     QSet<BufferId> _toRemove;
     QSet<BufferId> _toAdd;
     QSet<BufferId> _toTempRemove;
     QSet<BufferId> _toRemove;
+    QString _filterString;
 
     bool filterAcceptBuffer(const QModelIndex &) const;
     bool filterAcceptNetwork(const QModelIndex &) const;
 
     bool filterAcceptBuffer(const QModelIndex &) const;
     bool filterAcceptNetwork(const QModelIndex &) const;