X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fuisupport%2Fbufferview.cpp;h=969107cd46cef38d4e7437e868b8a595d1885684;hb=3e63cb8a6e83765069a45101b86ae9e21dcc57ad;hp=8387f025942d3b259c8517146ebf64d2af1dd322;hpb=a25f1db4e6c59cdfb82a5d485add8a5597968279;p=quassel.git diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 8387f025..969107cd 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -75,9 +75,7 @@ void BufferView::init() setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - // breaks with Qt 4.8 - if (QString("4.8.0") > qVersion()) // FIXME breaks with Qt versions >= 4.10! - setAnimated(true); + setAnimated(true); // FIXME This is to workaround bug #663 setUniformRowHeights(true); @@ -394,15 +392,9 @@ void BufferView::setExpandedState(const QModelIndex &networkIdx) storeExpandedState(networkIdx); // this call is needed to keep track of the isActive state } -#if QT_VERSION < 0x050000 -void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) -{ - TreeViewTouch::dataChanged(topLeft, bottomRight); -#else void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) { TreeViewTouch::dataChanged(topLeft, bottomRight, roles); -#endif // determine how many items have been changed and if any of them is a networkitem // which just swichted from active to inactive or vice versa @@ -594,7 +586,7 @@ void BufferView::hideCurrentBuffer() config()->requestRemoveBuffer(bufferId); } -void BufferView::filterTextChanged(QString filterString) +void BufferView::filterTextChanged(const QString& filterString) { BufferViewFilter *filter = qobject_cast(model()); if (!filter) { @@ -624,8 +616,63 @@ QSize BufferView::sizeHint() const } +void BufferView::changeHighlight(BufferView::Direction direction) +{ + // If for some weird reason we get a new delegate + BufferViewDelegate *delegate = qobject_cast(itemDelegate(_currentHighlight)); + if (delegate) { + delegate->currentHighlight = QModelIndex(); + } + + QModelIndex newIndex = _currentHighlight; + if (!newIndex.isValid()) { + newIndex = model()->index(0, 0); + } + + if (direction == Backward) { + newIndex = indexBelow(newIndex); + } else { + newIndex = indexAbove(newIndex); + } + + if (!newIndex.isValid()) { + return; + } + + _currentHighlight = newIndex; + + delegate = qobject_cast(itemDelegate(_currentHighlight)); + if (delegate) { + delegate->currentHighlight = _currentHighlight; + } + viewport()->update(); +} + +void BufferView::selectHighlighted() +{ + if (_currentHighlight.isValid()) { + selectionModel()->setCurrentIndex(_currentHighlight, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + selectionModel()->select(_currentHighlight, QItemSelectionModel::ClearAndSelect); + } else { + selectFirstBuffer(); + } + + clearHighlight(); +} + +void BufferView::clearHighlight() +{ + // If for some weird reason we get a new delegate + BufferViewDelegate *delegate = qobject_cast(itemDelegate(_currentHighlight)); + if (delegate) { + delegate->currentHighlight = QModelIndex(); + } + _currentHighlight = QModelIndex(); + viewport()->update(); +} + // **************************************** -// BufferViewDelgate +// BufferViewDelegate // **************************************** class ColorsChangedEvent : public QEvent { @@ -661,11 +708,7 @@ bool BufferViewDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, c if (!value.isValid()) return QStyledItemDelegate::editorEvent(event, model, option, index); -#if QT_VERSION < 0x050000 - QStyleOptionViewItemV4 viewOpt(option); -#else QStyleOptionViewItem viewOpt(option); -#endif initStyleOption(&viewOpt, index); QRect checkRect = viewOpt.widget->style()->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &viewOpt, viewOpt.widget); @@ -756,12 +799,16 @@ void BufferViewDock::onFilterReturnPressed() } BufferView *view = bufferView(); - if (!view || _filterEdit->text().isEmpty()) { + if (!view) { return; } - view->selectFirstBuffer(); - _filterEdit->clear(); + if (!_filterEdit->text().isEmpty()) { + view->selectHighlighted(); + _filterEdit->clear(); + } else { + view->clearHighlight(); + } } void BufferViewDock::setActive(bool active) @@ -788,18 +835,35 @@ bool BufferViewDock::eventFilter(QObject *object, QEvent *event) } } else if (event->type() == QEvent::KeyRelease) { QKeyEvent *keyEvent = static_cast(event); - if (keyEvent->key() != Qt::Key_Escape) { + + BufferView *view = bufferView(); + if (!view) { return false; } - _filterEdit->clear(); + switch (keyEvent->key()) { + case Qt::Key_Escape: { + _filterEdit->clear(); + + if (!_oldFocusItem) { + return false; + } - if (_oldFocusItem) { _oldFocusItem->setFocus(); - _oldFocusItem = 0; + _oldFocusItem = nullptr; + return true; + } + case Qt::Key_Down: + view->changeHighlight(BufferView::Backward); + return true; + case Qt::Key_Up: + view->changeHighlight(BufferView::Forward); + return true; + default: + break; } - return true; + return false; } return false; @@ -853,3 +917,13 @@ void BufferViewDock::activateFilter() _filterEdit->setFocus(); } + + +void BufferViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QStyleOptionViewItem newOption = option; + if (index == currentHighlight) { + newOption.state |= QStyle::State_HasFocus; + } + QStyledItemDelegate::paint(painter, newOption, index); +}