X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fuisupport%2Fbufferview.cpp;h=30cf217b729c5d97d1e30b2994be9497daa45d0c;hb=f84a3fd303cbea73a7c9b3839e417862fea43baa;hp=e01ca09aea8123bca3b70b12ee276a4e82def792;hpb=de2c1a4f9bbae7070cf8fd8247db765a23d28a9c;p=quassel.git diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index e01ca09a..30cf217b 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" @@ -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 &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 @@ -515,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) { @@ -547,6 +573,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 { @@ -630,6 +666,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()) { @@ -637,7 +676,22 @@ BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent) toggleViewAction()->setData(config->bufferViewId()); setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea); connect(config, SIGNAL(bufferViewNameSet(const QString &)), this, SLOT(bufferViewRenamed(const QString &))); + connect(config, SIGNAL(configChanged()), SLOT(configChanged())); updateTitle(); + + _widget->setLayout(new QVBoxLayout); + _widget->layout()->setSpacing(0); + _widget->layout()->setContentsMargins(0, 0, 0, 0); + + // 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); } @@ -649,17 +703,74 @@ void BufferViewDock::updateTitle() setWindowTitle(title); } +void BufferViewDock::configChanged() +{ + if (_filterEdit->isVisible() != config()->showSearch()) { + _filterEdit->setVisible(config()->showSearch()); + _filterEdit->clear(); + } +} + +void BufferViewDock::onFilterReturnPressed() +{ + if (_oldFocusItem) { + _oldFocusItem->setFocus(); + _oldFocusItem.clear(); + } + + if (!config()->showSearch()) { + _filterEdit->setVisible(false); + } + + BufferView *view = bufferView(); + if (!view || _filterEdit->text().isEmpty()) { + return; + } + + view->selectFirstBuffer(); + _filterEdit->clear(); +} 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) { @@ -690,3 +801,22 @@ 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))); +} + +void BufferViewDock::activateFilter() +{ + if (!_filterEdit->isVisible()) { + _filterEdit->setVisible(true); + } + + _oldFocusItem = qApp->focusWidget(); + + _filterEdit->setFocus(); +}