Add buffer filtering support.
[quassel.git] / src / uisupport / bufferview.cpp
index e01ca09..2127bcc 100644 (file)
@@ -28,6 +28,7 @@
 #include <QMenu>
 #include <QMessageBox>
 #include <QSet>
+#include <QVBoxLayout>
 
 #include "action.h"
 #include "buffermodel.h"
@@ -210,13 +211,14 @@ void BufferView::joinChannel(const QModelIndex &index)
     Client::userInput(bufferInfo, QString("/JOIN %1").arg(bufferInfo.bufferName()));
 }
 
+
 void BufferView::keyPressEvent(QKeyEvent *event)
 {
     if (event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) {
         event->accept();
         removeSelectedBuffers();
     }
-       TreeViewTouch::keyPressEvent(event);
+    TreeViewTouch::keyPressEvent(event);
 }
 
 
@@ -287,7 +289,7 @@ void BufferView::removeSelectedBuffers(bool permanently)
 
 void BufferView::rowsInserted(const QModelIndex &parent, int start, int end)
 {
-       TreeViewTouch::rowsInserted(parent, start, end);
+    TreeViewTouch::rowsInserted(parent, start, end);
 
     // ensure that newly inserted network nodes are expanded per default
     if (parent.data(NetworkModel::ItemTypeRole) != NetworkModel::NetworkItemType)
@@ -375,11 +377,11 @@ void BufferView::setExpandedState(const QModelIndex &networkIdx)
 #if QT_VERSION < 0x050000
 void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
 {
-       TreeViewTouch::dataChanged(topLeft, bottomRight);
+    TreeViewTouch::dataChanged(topLeft, bottomRight);
 #else
 void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
 {
-       TreeViewTouch::dataChanged(topLeft, bottomRight, roles);
+    TreeViewTouch::dataChanged(topLeft, bottomRight, roles);
 #endif
 
     // determine how many items have been changed and if any of them is a networkitem
@@ -547,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
 {
@@ -630,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())
 {
@@ -638,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);
 }
 
 
@@ -649,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)
 {
@@ -690,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)));
+}