From: Marcus Eggenberger Date: Tue, 24 Jun 2008 12:47:49 +0000 (+0200) Subject: BufferView no longer reacts on layoutChanged() as this is far too often emited. X-Git-Tag: 0.3.0~345 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=609835c5efa606b9eb63739d50c750dba47c1668 BufferView no longer reacts on layoutChanged() as this is far too often emited. QSortFilterProxyModel sends this at least once(!) per dataChanged of the source model if dynamicSortFilter is true. --- diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 0b68c3d2..d2893a8f 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -67,7 +67,6 @@ BufferView::BufferView(QWidget *parent) _hideModeAction(tr("Mode Events"), this) { - // currently no events can be hidden -> disable actions _hideJoinAction.setCheckable(true); _hidePartAction.setCheckable(true); _hideKillAction.setCheckable(true); @@ -80,6 +79,9 @@ BufferView::BufferView(QWidget *parent) _hideQuitAction.setEnabled(false); _hideModeAction.setEnabled(false); + connect(this, SIGNAL(collapsed(const QModelIndex &)), this, SLOT(on_collapse(const QModelIndex &))); + connect(this, SIGNAL(expanded(const QModelIndex &)), this, SLOT(on_expand(const QModelIndex &))); + setSelectionMode(QAbstractItemView::ExtendedSelection); } @@ -111,9 +113,6 @@ void BufferView::init() { void BufferView::setModel(QAbstractItemModel *model) { delete selectionModel(); - if(QTreeView::model()) { - disconnect(QTreeView::model(), SIGNAL(layoutChanged()), this, SLOT(layoutChanged())); - } QTreeView::setModel(model); init(); @@ -127,8 +126,6 @@ void BufferView::setModel(QAbstractItemModel *model) { if(!model) return; - connect(model, SIGNAL(layoutChanged()), this, SLOT(layoutChanged())); - QString sectionName; QAction *showSection; for(int i = 1; i < model->columnCount(); i++) { @@ -153,6 +150,7 @@ void BufferView::setFilteredModel(QAbstractItemModel *model_, BufferViewConfig * if(model()) { disconnect(this, 0, model(), 0); + disconnect(model(), 0, this, 0); } if(!model_) { @@ -160,6 +158,7 @@ void BufferView::setFilteredModel(QAbstractItemModel *model_, BufferViewConfig * } else { BufferViewFilter *filter = new BufferViewFilter(model_, config); setModel(filter); + connect(filter, SIGNAL(configChanged()), this, SLOT(on_configChanged())); } setConfig(config); } @@ -264,17 +263,33 @@ void BufferView::rowsInserted(const QModelIndex & parent, int start, int end) { } } -void BufferView::layoutChanged() { +void BufferView::on_configChanged() { Q_ASSERT(model()); - // expand all active networks + // expand all active networks... collapse inactive ones... unless manually changed QModelIndex networkIdx; + NetworkId networkId; for(int row = 0; row < model()->rowCount(); row++) { networkIdx = model()->index(row, 0); - if(model()->rowCount(networkIdx) > 0 && model()->data(networkIdx, NetworkModel::ItemActiveRole) == true) { - update(networkIdx); + if(model()->rowCount(networkIdx) == 0) + continue; + + networkId = model()->data(networkIdx, NetworkModel::NetworkIdRole).value(); + if(!networkId.isValid()) + 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); } // update selection to current one @@ -286,6 +301,18 @@ void BufferView::layoutChanged() { mappedSelectionModel->mappedSelect(Client::bufferModel()->standardSelectionModel()->selection(), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } +void BufferView::on_collapse(const QModelIndex &index) { + storeExpandedState(index.data(NetworkModel::NetworkIdRole).value(), false); +} + +void BufferView::on_expand(const QModelIndex &index) { + storeExpandedState(index.data(NetworkModel::NetworkIdRole).value(), true); +} + +void BufferView::storeExpandedState(NetworkId networkId, bool expanded) { + _expandedState[networkId] = expanded; +} + void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { QTreeView::dataChanged(topLeft, bottomRight); @@ -308,7 +335,6 @@ void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bott } } - void BufferView::toggleHeader(bool checked) { QAction *action = qobject_cast(sender()); header()->setSectionHidden((action->property("column")).toInt(), !checked); @@ -318,10 +344,6 @@ bool BufferView::checkRequirements(const QModelIndex &index, ItemActiveStates re if(!index.isValid()) return false; -// NetworkModel::itemTypes itemType = static_cast(index.data(NetworkModel::ItemTypeRole).toInt()); -// if(!(itemType & validItemTypes)) -// return false; - ItemActiveStates isActive = index.data(NetworkModel::ItemActiveRole).toBool() ? ActiveState : InactiveState; @@ -377,7 +399,6 @@ QMenu *BufferView::createHideEventsSubMenu(QMenu &menu) { return hideEventsMenu; } -//void BufferView::showContextMenu(const QPoint &pos) { void BufferView::contextMenuEvent(QContextMenuEvent *event) { QModelIndex index = indexAt(event->pos()); if(!index.isValid()) @@ -463,10 +484,6 @@ void BufferView::contextMenuEvent(QContextMenuEvent *event) { QString channelName = QInputDialog::getText(this, tr("Join Channel"), tr("Input channel name:"), QLineEdit::Normal, QString(), &ok); if(ok && !channelName.isEmpty()) { Client::instance()->userInput(BufferInfo::fakeStatusBuffer(index.data(NetworkModel::NetworkIdRole).value()), QString("/J %1").arg(channelName)); -// BufferInfo bufferInfo = index.child(0,0).data(NetworkModel::BufferInfoRole).value(); -// if(bufferInfo.isValid()) { -// Client::instance()->userInput(bufferInfo, QString("/J %1").arg(channelName)); -// } } #endif return; diff --git a/src/uisupport/bufferview.h b/src/uisupport/bufferview.h index cb55e916..8ced577d 100644 --- a/src/uisupport/bufferview.h +++ b/src/uisupport/bufferview.h @@ -37,80 +37,88 @@ * The TreeView showing the Buffers *****************************************/ class BufferView : public QTreeView { - Q_OBJECT - - public: - BufferView(QWidget *parent = 0); - void init(); - - void setModel(QAbstractItemModel *model); - void setFilteredModel(QAbstractItemModel *model, BufferViewConfig *config); - virtual void setSelectionModel(QItemSelectionModel *selectionModel); - - void setConfig(BufferViewConfig *config); - inline BufferViewConfig *config() { return _config; } - - public slots: - void setRootIndexForNetworkId(const NetworkId &networkId); - void removeSelectedBuffers(bool permanently = false); - - signals: - void removeBuffer(const QModelIndex &); - void removeBufferPermanently(const QModelIndex &); - - protected: - virtual void keyPressEvent(QKeyEvent *); - virtual void rowsInserted(const QModelIndex & parent, int start, int end); - virtual void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); - virtual void wheelEvent(QWheelEvent *); - virtual QSize sizeHint() const; - virtual void focusInEvent(QFocusEvent *event) { QAbstractScrollArea::focusInEvent(event); } - virtual void contextMenuEvent(QContextMenuEvent *event); - - private slots: - void joinChannel(const QModelIndex &index); - void toggleHeader(bool checked); - // void showContextMenu(const QPoint &); - void layoutChanged(); - - private: - enum ItemActiveState { - InactiveState = 0x01, - ActiveState = 0x02 - }; - public: - Q_DECLARE_FLAGS(ItemActiveStates, ItemActiveState); - QAction showChannelList; - private: - QPointer _config; - - QAction _connectNetAction; - QAction _disconnectNetAction; - QAction _joinChannelAction; - - QAction _joinBufferAction; - QAction _partBufferAction; - QAction _hideBufferTemporarilyAction; - QAction _hideBufferPermanentlyAction; - QAction _removeBufferAction; - QAction _ignoreListAction; - - QAction _hideJoinAction; - QAction _hidePartAction; - QAction _hideKillAction; - QAction _hideQuitAction; - QAction _hideModeAction; - - bool checkRequirements(const QModelIndex &index, - ItemActiveStates requiredActiveState = QFlags(ActiveState) | QFlags(InactiveState)); - void addItemToMenu(QAction &action, QMenu &menu, const QModelIndex &index, - ItemActiveStates requiredActiveState = QFlags(ActiveState) | QFlags(InactiveState)); - void addItemToMenu(QAction &action, QMenu &menu, bool condition = true); - void addItemToMenu(QMenu &subMenu, QMenu &menu, const QModelIndex &index, - ItemActiveStates requiredActiveState = QFlags(ActiveState) | QFlags(InactiveState)); - void addSeparatorToMenu(QMenu &menu, const QModelIndex &index, - ItemActiveStates requiredActiveState = QFlags(ActiveState) | QFlags(InactiveState)); - QMenu *createHideEventsSubMenu(QMenu &menu); + Q_OBJECT + +public: + BufferView(QWidget *parent = 0); + void init(); + + void setModel(QAbstractItemModel *model); + void setFilteredModel(QAbstractItemModel *model, BufferViewConfig *config); + virtual void setSelectionModel(QItemSelectionModel *selectionModel); + + void setConfig(BufferViewConfig *config); + inline BufferViewConfig *config() { return _config; } + +public slots: + void setRootIndexForNetworkId(const NetworkId &networkId); + void removeSelectedBuffers(bool permanently = false); + +signals: + void removeBuffer(const QModelIndex &); + void removeBufferPermanently(const QModelIndex &); + +protected: + virtual void keyPressEvent(QKeyEvent *); + virtual void rowsInserted(const QModelIndex & parent, int start, int end); + virtual void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); + virtual void wheelEvent(QWheelEvent *); + virtual QSize sizeHint() const; + virtual void focusInEvent(QFocusEvent *event) { QAbstractScrollArea::focusInEvent(event); } + virtual void contextMenuEvent(QContextMenuEvent *event); + +private slots: + void joinChannel(const QModelIndex &index); + void toggleHeader(bool checked); + + void on_collapse(const QModelIndex &index); + void on_expand(const QModelIndex &index); + void on_configChanged(); + +private: + enum ItemActiveState { + InactiveState = 0x01, + ActiveState = 0x02 + }; + +public: + Q_DECLARE_FLAGS(ItemActiveStates, ItemActiveState); + QAction showChannelList; + +private: + QPointer _config; + + QAction _connectNetAction; + QAction _disconnectNetAction; + QAction _joinChannelAction; + + QAction _joinBufferAction; + QAction _partBufferAction; + QAction _hideBufferTemporarilyAction; + QAction _hideBufferPermanentlyAction; + QAction _removeBufferAction; + QAction _ignoreListAction; + + QAction _hideJoinAction; + QAction _hidePartAction; + QAction _hideKillAction; + QAction _hideQuitAction; + QAction _hideModeAction; + + QHash _expandedState; + + void storeExpandedState(NetworkId networkId, bool expanded); + + bool checkRequirements(const QModelIndex &index, + ItemActiveStates requiredActiveState = QFlags(ActiveState) | QFlags(InactiveState)); + void addItemToMenu(QAction &action, QMenu &menu, const QModelIndex &index, + ItemActiveStates requiredActiveState = QFlags(ActiveState) | QFlags(InactiveState)); + void addItemToMenu(QAction &action, QMenu &menu, bool condition = true); + void addItemToMenu(QMenu &subMenu, QMenu &menu, const QModelIndex &index, + ItemActiveStates requiredActiveState = QFlags(ActiveState) | QFlags(InactiveState)); + void addSeparatorToMenu(QMenu &menu, const QModelIndex &index, + ItemActiveStates requiredActiveState = QFlags(ActiveState) | QFlags(InactiveState)); + QMenu *createHideEventsSubMenu(QMenu &menu); }; Q_DECLARE_OPERATORS_FOR_FLAGS(BufferView::ItemActiveStates); @@ -119,14 +127,14 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(BufferView::ItemActiveStates); // BufferView Dock // ============================== class BufferViewDock : public QDockWidget { - Q_OBJECT - - public: - BufferViewDock(BufferViewConfig *config, QWidget *parent); - BufferViewDock(QWidget *parent); - - public slots: - void bufferViewRenamed(const QString &newName); + Q_OBJECT + +public: + BufferViewDock(BufferViewConfig *config, QWidget *parent); + BufferViewDock(QWidget *parent); + +public slots: + void bufferViewRenamed(const QString &newName); }; #endif diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index 0fa57cd7..6a73e7f4 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -105,6 +105,7 @@ void BufferViewFilter::configInitialized() { disconnect(config(), SIGNAL(initDone()), this, SLOT(configInitialized())); invalidate(); + emit configChanged(); } Qt::ItemFlags BufferViewFilter::flags(const QModelIndex &index) const { diff --git a/src/uisupport/bufferviewfilter.h b/src/uisupport/bufferviewfilter.h index 56fa974a..18c32ad6 100644 --- a/src/uisupport/bufferviewfilter.h +++ b/src/uisupport/bufferviewfilter.h @@ -77,6 +77,7 @@ protected: signals: void _dataChanged(const QModelIndex &source_topLeft, const QModelIndex &source_bottomRight); + void configChanged(); private slots: void configInitialized();