X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferview.cpp;h=addea42bce7876efb59c6bbf00efcd1e11bcb36d;hp=a1435a6d325ee0f8d81c2b0b7bd525b04c9c1b1b;hb=19eb49e171a5a39e1ba8d6c92fd97256aeb949e1;hpb=75d7f7d582826603236394a37f43feb4cd725bb0 diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index a1435a6d..addea42b 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -36,7 +36,6 @@ #include "buffersyncer.h" #include "client.h" #include "iconloader.h" -#include "mappedselectionmodel.h" #include "network.h" #include "networkmodel.h" #include "networkmodelactionprovider.h" @@ -85,8 +84,8 @@ bool TristateDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, con BufferView::BufferView(QWidget *parent) : QTreeView(parent) { - connect(this, SIGNAL(collapsed(const QModelIndex &)), SLOT(on_collapse(const QModelIndex &))); - connect(this, SIGNAL(expanded(const QModelIndex &)), SLOT(on_expand(const QModelIndex &))); + connect(this, SIGNAL(collapsed(const QModelIndex &)), SLOT(storeExpandedState(const QModelIndex &))); + connect(this, SIGNAL(expanded(const QModelIndex &)), SLOT(storeExpandedState(const QModelIndex &))); setSelectionMode(QAbstractItemView::ExtendedSelection); @@ -334,38 +333,49 @@ void BufferView::on_configChanged() { continue; update(networkIdx); - - bool expandNetwork = false; - if(_expandedState.contains(networkId)) - expandNetwork = _expandedState[networkId]; - else - expandNetwork = model()->data(networkIdx, NetworkModel::ItemActiveRole).toBool(); - - if(expandNetwork) - expand(networkIdx); - else - collapse(networkIdx); + setExpandedState(networkIdx); } - // update selection to current one - MappedSelectionModel *mappedSelectionModel = qobject_cast(selectionModel()); - if(!config() || !mappedSelectionModel) - return; + if(config()) { + // update selection to current one + Client::bufferModel()->synchronizeView(this); + } - mappedSelectionModel->mappedSetCurrentIndex(Client::bufferModel()->standardSelectionModel()->currentIndex(), QItemSelectionModel::Current); - mappedSelectionModel->mappedSelect(Client::bufferModel()->standardSelectionModel()->selection(), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + return; } -void BufferView::on_collapse(const QModelIndex &index) { - storeExpandedState(index.data(NetworkModel::NetworkIdRole).value(), false); -} +void BufferView::storeExpandedState(const QModelIndex &networkIdx) { + NetworkId networkId = model()->data(networkIdx, NetworkModel::NetworkIdRole).value(); + + int oldState = 0; + if(isExpanded(networkIdx)) + oldState |= WasExpanded; + if(model()->data(networkIdx, NetworkModel::ItemActiveRole).toBool()) + oldState |= WasActive; -void BufferView::on_expand(const QModelIndex &index) { - storeExpandedState(index.data(NetworkModel::NetworkIdRole).value(), true); + _expandedState[networkId] = oldState; } -void BufferView::storeExpandedState(NetworkId networkId, bool expanded) { - _expandedState[networkId] = expanded; +void BufferView::setExpandedState(const QModelIndex &networkIdx) { + if(model()->data(networkIdx, NetworkModel::ItemTypeRole) != NetworkModel::NetworkItemType) + return; + + if(model()->rowCount(networkIdx) == 0) + return; + + NetworkId networkId = model()->data(networkIdx, NetworkModel::NetworkIdRole).value(); + + bool networkActive = model()->data(networkIdx, NetworkModel::ItemActiveRole).toBool(); + bool expandNetwork = networkActive; + if(_expandedState.contains(networkId)) { + int oldState = _expandedState[networkId]; + if((bool)(oldState & WasActive) == networkActive) + expandNetwork = (bool)(oldState & WasExpanded); + } + + storeExpandedState(networkIdx); // this call is needed to keep track of the isActive state + if(expandNetwork != isExpanded(networkIdx)) + setExpanded(networkIdx, expandNetwork); } void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { @@ -378,15 +388,7 @@ void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bott for(int i = topLeft.row(); i <= bottomRight.row(); i++) { QModelIndex networkIdx = topLeft.sibling(i, 0); - if(model()->rowCount(networkIdx) == 0) - continue; - - bool isActive = networkIdx.data(NetworkModel::ItemActiveRole).toBool(); -#ifdef SPUTDEV - if(isExpanded(networkIdx) != isActive) setExpanded(networkIdx, true); -#else - if(isExpanded(networkIdx) != isActive) setExpanded(networkIdx, isActive); -#endif + setExpandedState(networkIdx); } } @@ -413,7 +415,12 @@ void BufferView::contextMenuEvent(QContextMenuEvent *event) { } void BufferView::addActionsToMenu(QMenu *contextMenu, const QModelIndex &index) { - Client::mainUi()->actionProvider()->addActions(contextMenu, index, this, "menuActionTriggered", (bool)config()); + QModelIndexList indexList = selectedIndexes(); + // make sure the item we clicked on is first + indexList.removeAll(index); + indexList.prepend(index); + + Client::mainUi()->actionProvider()->addActions(contextMenu, indexList, this, "menuActionTriggered", (bool)config()); } void BufferView::addFilterActions(QMenu *contextMenu, const QModelIndex &index) {