From f84a3fd303cbea73a7c9b3839e417862fea43baa Mon Sep 17 00:00:00 2001 From: "Martin T. H. Sandsmark" Date: Tue, 1 Mar 2016 22:11:06 +0100 Subject: [PATCH] Add action/shortcut to use the buffer filter/search --- src/common/bufferviewconfig.cpp | 2 +- src/qtui/mainwin.cpp | 13 +++++ src/qtui/mainwin.h | 1 + src/uisupport/bufferview.cpp | 100 ++++++++++++++++++++++++++++++-- src/uisupport/bufferview.h | 10 ++++ 5 files changed, 120 insertions(+), 6 deletions(-) diff --git a/src/common/bufferviewconfig.cpp b/src/common/bufferviewconfig.cpp index 54edae50..e735e298 100644 --- a/src/common/bufferviewconfig.cpp +++ b/src/common/bufferviewconfig.cpp @@ -33,7 +33,7 @@ BufferViewConfig::BufferViewConfig(int bufferViewId, QObject *parent) _disableDecoration(false), _allowedBufferTypes(BufferInfo::StatusBuffer | BufferInfo::ChannelBuffer | BufferInfo::QueryBuffer | BufferInfo::GroupBuffer), _minimumActivity(0), - _showSearch(true) + _showSearch(false) { setObjectName(QString::number(bufferViewId)); } diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index b732a2c6..747da66a 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -459,6 +459,9 @@ void MainWin::setupActions() coll->addAction("JumpHotBuffer", new Action(tr("Jump to hot chat"), coll, this, SLOT(on_jumpHotBuffer_triggered()), QKeySequence(Qt::META + Qt::Key_A))); + coll->addAction("ActivateBufferFilter", new Action(tr("Activate the buffer search"), coll, + this, SLOT(on_bufferSearch_triggered()), QKeySequence(Qt::CTRL + Qt::Key_S))); + // Jump keys #ifdef Q_OS_MAC const int bindModifier = Qt::ControlModifier | Qt::AltModifier; @@ -1653,6 +1656,16 @@ void MainWin::on_jumpHotBuffer_triggered() Client::bufferModel()->switchToBuffer(_bufferHotList->hottestBuffer()); } +void MainWin::on_bufferSearch_triggered() +{ + if (_activeBufferViewIndex < 0 || _activeBufferViewIndex >= _bufferViews.count()) { + qWarning() << "Tried to activate filter on invalid bufferview:" << _activeBufferViewIndex; + return; + } + + _bufferViews[_activeBufferViewIndex]->activateFilter(); +} + void MainWin::onJumpKey() { diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index 47d3244e..d34c0f55 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -140,6 +140,7 @@ private slots: void on_actionConfigureViews_triggered(); void on_actionLockLayout_toggled(bool lock); void on_jumpHotBuffer_triggered(); + void on_bufferSearch_triggered(); void on_actionDebugNetworkModel_triggered(); void on_actionDebugBufferViewOverlay_triggered(); void on_actionDebugMessageModel_triggered(); diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index f002405c..30cf217b 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -517,6 +517,30 @@ void BufferView::changeBuffer(Direction direction) selectionModel()->select(resultingIndex, QItemSelectionModel::ClearAndSelect); } +void BufferView::selectFirstBuffer() +{ + int networksCount = model()->rowCount(QModelIndex()); + if (networksCount == 0) { + return; + } + + QModelIndex bufferIndex; + for (int row = 0; row < networksCount; row++) { + QModelIndex networkIndex = model()->index(row, 0, QModelIndex()); + int childCount = model()->rowCount(networkIndex); + if (childCount > 0) { + bufferIndex = model()->index(0, 0, networkIndex); + break; + } + } + + if (!bufferIndex.isValid()) { + return; + } + + selectionModel()->setCurrentIndex(bufferIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + selectionModel()->select(bufferIndex, QItemSelectionModel::ClearAndSelect); +} void BufferView::wheelEvent(QWheelEvent *event) { @@ -658,8 +682,14 @@ BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent) _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 + + // We need to potentially hide it early, so it doesn't flicker + _filterEdit->setVisible(config->showSearch()); + _filterEdit->setFocusPolicy(Qt::ClickFocus); + _filterEdit->installEventFilter(this); _filterEdit->setPlaceholderText(tr("Search...")); + connect(_filterEdit, SIGNAL(returnPressed()), SLOT(onFilterReturnPressed())); + _widget->layout()->addWidget(_filterEdit); QDockWidget::setWidget(_widget); } @@ -675,11 +705,30 @@ void BufferViewDock::updateTitle() void BufferViewDock::configChanged() { - _filterEdit->setVisible(config()->showSearch()); + if (_filterEdit->isVisible() != config()->showSearch()) { + _filterEdit->setVisible(config()->showSearch()); + _filterEdit->clear(); + } +} + +void BufferViewDock::onFilterReturnPressed() +{ + if (_oldFocusItem) { + _oldFocusItem->setFocus(); + _oldFocusItem.clear(); + } - if (!_filterEdit->isVisible()) { - _filterEdit->setText(QLatin1String("")); + if (!config()->showSearch()) { + _filterEdit->setVisible(false); } + + BufferView *view = bufferView(); + if (!view || _filterEdit->text().isEmpty()) { + return; + } + + view->selectFirstBuffer(); + _filterEdit->clear(); } void BufferViewDock::setActive(bool active) @@ -687,11 +736,41 @@ void BufferViewDock::setActive(bool active) if (active != isActive()) { _active = active; updateTitle(); - if (active) + if (active) { raise(); // for tabbed docks + } } } +bool BufferViewDock::eventFilter(QObject *object, QEvent *event) +{ + if (object != _filterEdit) { + return false; + } + + if (event->type() == QEvent::FocusOut) { + if (!config()->showSearch() && _filterEdit->text().isEmpty()) { + _filterEdit->setVisible(false); + return true; + } + } else if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + if (keyEvent->key() != Qt::Key_Escape) { + return false; + } + + _filterEdit->clear(); + + if (_oldFocusItem) { + _oldFocusItem->setFocus(); + _oldFocusItem.clear(); + } + + return true; + } + + return false; +} void BufferViewDock::bufferViewRenamed(const QString &newName) { @@ -730,3 +809,14 @@ void BufferViewDock::setWidget(QWidget *newWidget) connect(_filterEdit, SIGNAL(textChanged(QString)), bufferView(), SLOT(filterTextChanged(QString))); } + +void BufferViewDock::activateFilter() +{ + if (!_filterEdit->isVisible()) { + _filterEdit->setVisible(true); + } + + _oldFocusItem = qApp->focusWidget(); + + _filterEdit->setFocus(); +} diff --git a/src/uisupport/bufferview.h b/src/uisupport/bufferview.h index abcd4f5f..9877c0ed 100644 --- a/src/uisupport/bufferview.h +++ b/src/uisupport/bufferview.h @@ -59,6 +59,8 @@ public: void addActionsToMenu(QMenu *menu, const QModelIndex &index); void addFilterActions(QMenu *contextMenu, const QModelIndex &index); + void selectFirstBuffer(); + public slots: void setRootIndexForNetworkId(const NetworkId &networkId); void removeSelectedBuffers(bool permanently = false); @@ -145,17 +147,25 @@ public : void setWidget(QWidget *newWidget); QWidget *widget() const { return _childWidget; } + void activateFilter(); + public slots: void setActive(bool active = true); +protected slots: + virtual bool eventFilter(QObject *object, QEvent *event); + virtual void focusInEvent(QFocusEvent*event) { qDebug() << event; } + private slots: void bufferViewRenamed(const QString &newName); void updateTitle(); void configChanged(); + void onFilterReturnPressed(); private: QWidget *_childWidget; QWidget *_widget; + QPointer _oldFocusItem; // QPointer in case the old item gets deleted QLineEdit *_filterEdit; bool _active; QString _title; -- 2.20.1