Add buffer filtering support.
[quassel.git] / src / uisupport / bufferview.cpp
index da7d037..2127bcc 100644 (file)
@@ -28,6 +28,7 @@
 #include <QMenu>
 #include <QMessageBox>
 #include <QSet>
+#include <QVBoxLayout>
 
 #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<BufferViewFilter *>(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)));
+}