From: Marcus Eggenberger Date: Mon, 26 Jan 2009 20:51:26 +0000 (+0100) Subject: fixes BR #475 X-Git-Tag: 0.4.0~169 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=19eb49e171a5a39e1ba8d6c92fd97256aeb949e1 fixes BR #475 --- diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 4217d566..addea42b 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -84,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); @@ -333,17 +333,7 @@ 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); } if(config()) { @@ -354,16 +344,38 @@ void BufferView::on_configChanged() { 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(); -void BufferView::on_expand(const QModelIndex &index) { - storeExpandedState(index.data(NetworkModel::NetworkIdRole).value(), true); + int oldState = 0; + if(isExpanded(networkIdx)) + oldState |= WasExpanded; + if(model()->data(networkIdx, NetworkModel::ItemActiveRole).toBool()) + oldState |= WasActive; + + _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) { @@ -376,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); } } diff --git a/src/uisupport/bufferview.h b/src/uisupport/bufferview.h index e7d8fa9a..0732f54b 100644 --- a/src/uisupport/bufferview.h +++ b/src/uisupport/bufferview.h @@ -76,15 +76,20 @@ private slots: void joinChannel(const QModelIndex &index); void toggleHeader(bool checked); - void on_collapse(const QModelIndex &index); - void on_expand(const QModelIndex &index); + void storeExpandedState(const QModelIndex &networkIdx); + void setExpandedState(const QModelIndex &networkIdx); + void on_configChanged(); private: QPointer _config; - QHash _expandedState; - void storeExpandedState(NetworkId networkId, bool expanded); + enum ExpandedState { + WasExpanded = 0x01, + WasActive = 0x02 + }; + QHash _expandedState; + }; // ******************************