X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferview.cpp;h=180db0da1c658a6af9384ce0a926872fc44ed571;hp=9887818b8737406cd413f99b102d74bff6678b01;hb=29b3fd2d4ee33d8bc72ef28982e5a6e963892991;hpb=c16309b21ea5aafca07b111567aa17be0f3155ea diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 9887818b..180db0da 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -81,7 +81,7 @@ void BufferView::init() { void BufferView::setModel(QAbstractItemModel *model) { delete selectionModel(); if(QTreeView::model()) { - disconnect(QTreeView::model(), SIGNAL(layoutChanged()), this, SLOT(updateSelection())); + disconnect(QTreeView::model(), SIGNAL(layoutChanged()), this, SLOT(layoutChanged())); } QTreeView::setModel(model); @@ -96,7 +96,7 @@ void BufferView::setModel(QAbstractItemModel *model) { if(!model) return; - connect(model, SIGNAL(layoutChanged()), this, SLOT(updateSelection())); + connect(model, SIGNAL(layoutChanged()), this, SLOT(layoutChanged())); QString sectionName; QAction *showSection; @@ -129,11 +129,25 @@ void BufferView::setFilteredModel(QAbstractItemModel *model_, BufferViewConfig * } else { BufferViewFilter *filter = new BufferViewFilter(model_, config); setModel(filter); - connect(this, SIGNAL(removeBuffer(const QModelIndex &)), filter, SLOT(removeBuffer(const QModelIndex &))); + connect(this, SIGNAL(removeBuffer(const QModelIndex &)), + filter, SLOT(removeBuffer(const QModelIndex &))); } setConfig(config); } +void BufferView::setSelectionModel(QItemSelectionModel *selectionModel) { + if(QTreeView::selectionModel()) + disconnect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), + model(), SIGNAL(checkPreviousCurrentForRemoval(QModelIndex, QModelIndex))); + + QTreeView::setSelectionModel(selectionModel); + BufferViewFilter *filter = qobject_cast(model()); + if(filter) { + connect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), + filter, SLOT(checkPreviousCurrentForRemoval(QModelIndex, QModelIndex))); + } +} + void BufferView::setConfig(BufferViewConfig *config) { if(_config == config) return; @@ -177,19 +191,20 @@ void BufferView::joinChannel(const QModelIndex &index) { } void BufferView::keyPressEvent(QKeyEvent *event) { - if(event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) { + if((event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) && !selectionModel()->selectedIndexes().isEmpty()) { event->accept(); QModelIndex index = selectionModel()->selectedIndexes().first(); - if(index.isValid()) { + if(index.isValid() && index.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType) { emit removeBuffer(index); } } QTreeView::keyPressEvent(event); } -// ensure that newly inserted network nodes are expanded per default void BufferView::rowsInserted(const QModelIndex & parent, int start, int end) { QTreeView::rowsInserted(parent, start, end); + + // ensure that newly inserted network nodes are expanded per default if(parent.data(NetworkModel::ItemTypeRole) != NetworkModel::NetworkItemType) return; @@ -200,9 +215,24 @@ void BufferView::rowsInserted(const QModelIndex & parent, int start, int end) { } } -void BufferView::updateSelection() { +void BufferView::layoutChanged() { + Q_ASSERT(model()); + + // expand all active networks + QModelIndex networkIdx; + for(int row = 0; row < model()->rowCount(); row++) { + networkIdx = model()->index(row, 0); + update(networkIdx); + if(model()->rowCount(networkIdx) > 0 && model()->data(networkIdx, NetworkModel::ItemActiveRole) == true) { + expand(networkIdx); + } else { + collapse(networkIdx); + } + } + + // update selection to current one MappedSelectionModel *mappedSelectionModel = qobject_cast(selectionModel()); - if(!config()) + if(!config() || !mappedSelectionModel) return; mappedSelectionModel->mappedSetCurrentIndex(Client::bufferModel()->standardSelectionModel()->currentIndex(), QItemSelectionModel::Current);