X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferview.cpp;h=18289284fe3b90817c79eb5047441f1c65151be1;hp=8debe24010da9c06169311e7bc741aa40589315b;hb=3ff1ec5b699a38e4a03deec4ea9576fade54cbbe;hpb=deba2421d87cbdea05c925cb3425042559d6ba21 diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 8debe240..18289284 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-2010 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -40,7 +40,6 @@ #include "network.h" #include "networkmodel.h" #include "contextmenuactionprovider.h" -#include "uisettings.h" /***************************************** * The TreeView showing the Buffers @@ -59,10 +58,6 @@ BufferView::BufferView(QWidget *parent) BufferViewDelegate *tristateDelegate = new BufferViewDelegate(this); setItemDelegate(tristateDelegate); delete oldDelegate; - - UiStyleSettings s("QtUiStyle/Fonts"); // li'l dirty here, but fonts are stored in QtUiStyle :/ - s.notify("BufferView", this, SLOT(setCustomFont(QVariant))); - setCustomFont(s.value("BufferView", QFont())); } void BufferView::init() { @@ -70,9 +65,17 @@ void BufferView::init() { hideColumn(1); hideColumn(2); setIndentation(10); + expandAll(); - setAnimated(true); + header()->hide(); // nobody seems to use this anyway + + // breaks with Qt 4.8 + if(QString("4.8.0") > qVersion()) // FIXME breaks with Qt versions >= 4.10! + setAnimated(true); + + // FIXME This is to workaround bug #663 + setUniformRowHeights(true); #ifndef QT_NO_DRAGANDDROP setDragEnabled(true); @@ -194,13 +197,6 @@ void BufferView::setRootIndexForNetworkId(const NetworkId &networkId) { } } -void BufferView::setCustomFont(const QVariant &v) { - QFont font = v.value(); - if(font.family().isEmpty()) - font = QApplication::font(); - setFont(font); -} - void BufferView::joinChannel(const QModelIndex &index) { BufferInfo::Type bufferType = (BufferInfo::Type)index.data(NetworkModel::BufferTypeRole).value(); @@ -253,8 +249,8 @@ void BufferView::dropEvent(QDropEvent *event) { return QTreeView::dropEvent(event); int res = QMessageBox::question(0, tr("Merge buffers permanently?"), - tr("Do you want to merge the buffer \"%1\" permanently into buffer \"%2\"?\n This cannot be reversed!").arg(Client::networkModel()->bufferName(bufferId2)).arg(Client::networkModel()->bufferName(bufferId1)), - QMessageBox::Yes|QMessageBox::No, QMessageBox::No); + tr("Do you want to merge the buffer \"%1\" permanently into buffer \"%2\"?\n This cannot be reversed!").arg(Client::networkModel()->bufferName(bufferId2)).arg(Client::networkModel()->bufferName(bufferId1)), + QMessageBox::Yes|QMessageBox::No, QMessageBox::No); if(res == QMessageBox::Yes) { Client::mergeBuffersPermanently(bufferId1, bufferId2); } @@ -415,7 +411,7 @@ void BufferView::addFilterActions(QMenu *contextMenu, const QModelIndex &index) if(!filterActions.isEmpty()) { contextMenu->addSeparator(); foreach(QAction *action, filterActions) { - contextMenu->addAction(action); + contextMenu->addAction(action); } } } @@ -435,31 +431,78 @@ void BufferView::menuActionTriggered(QAction *result) { } } -void BufferView::wheelEvent(QWheelEvent* event) { - if(UiSettings().value("MouseWheelChangesBuffers", QVariant(true)).toBool() == (bool)(event->modifiers() & Qt::AltModifier)) - return QTreeView::wheelEvent(event); +void BufferView::nextBuffer() { + changeBuffer(Forward); +} - int rowDelta = ( event->delta() > 0 ) ? -1 : 1; +void BufferView::previousBuffer() { + changeBuffer(Backward); +} + +void BufferView::changeBuffer(Direction direction) { QModelIndex currentIndex = selectionModel()->currentIndex(); QModelIndex resultingIndex; - if( model()->hasIndex( currentIndex.row() + rowDelta, currentIndex.column(), currentIndex.parent() ) ) - { - resultingIndex = currentIndex.sibling( currentIndex.row() + rowDelta, currentIndex.column() ); + + if(currentIndex.parent().isValid()) { + //If we are a child node just switch among siblings unless it's the first/last child + resultingIndex = currentIndex.sibling(currentIndex.row() + direction, 0); + + if(!resultingIndex.isValid()) { + QModelIndex parent = currentIndex.parent(); + if(direction == Backward) + resultingIndex = parent; + else + resultingIndex = parent.sibling(parent.row() + direction, 0); } - else //if we scroll into a the parent node... - { - QModelIndex parent = currentIndex.parent(); - QModelIndex aunt = parent.sibling( parent.row() + rowDelta, parent.column() ); - if( rowDelta == -1 ) - resultingIndex = aunt.child( model()->rowCount( aunt ) - 1, 0 ); - else - resultingIndex = aunt.child( 0, 0 ); - if( !resultingIndex.isValid() ) - return; - } + } else { + //If we have a toplevel node, try and get an adjacent child + if(direction == Backward) { + QModelIndex newParent = currentIndex.sibling(currentIndex.row() - 1, 0); + if(model()->hasChildren(newParent)) + resultingIndex = newParent.child(model()->rowCount(newParent) - 1, 0); + else + resultingIndex = newParent; + } else { + if(model()->hasChildren(currentIndex)) + resultingIndex = currentIndex.child(0, 0); + else + resultingIndex = currentIndex.sibling(currentIndex.row() + 1, 0); + } + } + + if(!resultingIndex.isValid()) + return; + selectionModel()->setCurrentIndex( resultingIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows ); selectionModel()->select( resultingIndex, QItemSelectionModel::ClearAndSelect ); +} + +void BufferView::wheelEvent(QWheelEvent* event) { + if(ItemViewSettings().mouseWheelChangesBuffer() == (bool)(event->modifiers() & Qt::AltModifier)) + return QTreeView::wheelEvent(event); + int rowDelta = ( event->delta() > 0 ) ? -1 : 1; + changeBuffer((Direction)rowDelta); +} + +void BufferView::hideCurrentBuffer() { + QModelIndex index = selectionModel()->currentIndex(); + if(index.data(NetworkModel::ItemTypeRole) != NetworkModel::BufferItemType) + return; + + BufferId bufferId = index.data(NetworkModel::BufferIdRole).value(); + + //The check above means we won't be looking at a network, which should always be the first row, so we can just go backwards. + changeBuffer(Backward); + + /*if(removedRows.contains(bufferId)) + continue; + + removedRows << bufferId;*/ + /*if(permanently) + config()->requestRemoveBufferPermanently(bufferId); + else*/ + config()->requestRemoveBuffer(bufferId); } QSize BufferView::sizeHint() const { @@ -535,16 +578,36 @@ bool BufferViewDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, c // BufferView Dock // ============================== BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent) - : QDockWidget(config->bufferViewName(), parent) + : QDockWidget(parent), + _active(false), + _title(config->bufferViewName()) { setObjectName("BufferViewDock-" + QString::number(config->bufferViewId())); toggleViewAction()->setData(config->bufferViewId()); setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea); connect(config, SIGNAL(bufferViewNameSet(const QString &)), this, SLOT(bufferViewRenamed(const QString &))); + updateTitle(); +} + +void BufferViewDock::updateTitle() { + QString title = _title; + if(isActive()) + title.prepend(QString::fromUtf8("• ")); + setWindowTitle(title); +} + +void BufferViewDock::setActive(bool active) { + if(active != isActive()) { + _active = active; + updateTitle(); + if(active) + raise(); // for tabbed docks + } } void BufferViewDock::bufferViewRenamed(const QString &newName) { - setWindowTitle(newName); + _title = newName; + updateTitle(); toggleViewAction()->setText(newName); }