#include "bufferview.h"
+#include "buffermodel.h"
#include "bufferviewfilter.h"
#include "buffersyncer.h"
#include "client.h"
+#include "mappedselectionmodel.h"
#include "network.h"
#include "networkmodel.h"
void BufferView::setModel(QAbstractItemModel *model) {
delete selectionModel();
+ if(QTreeView::model()) {
+ disconnect(QTreeView::model(), SIGNAL(layoutChanged()), this, SLOT(layoutChanged()));
+ }
+
QTreeView::setModel(model);
init();
- if(!model)
- return;
-
// remove old Actions
QList<QAction *> oldactions = header()->actions();
foreach(QAction *action, oldactions) {
action->deleteLater();
}
+ if(!model)
+ return;
+
+ connect(model, SIGNAL(layoutChanged()), this, SLOT(layoutChanged()));
+
QString sectionName;
QAction *showSection;
for(int i = 1; i < model->columnCount(); i++) {
} 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<BufferViewFilter *>(model());
+ if(filter) {
+ connect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)),
+ filter, SLOT(checkPreviousCurrentForRemoval(QModelIndex, QModelIndex)));
+ }
+}
+
void BufferView::setConfig(BufferViewConfig *config) {
if(_config == config)
return;
}
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);
- if(model()->rowCount(parent) == 1 && parent.data(NetworkModel::ItemTypeRole) == NetworkModel::NetworkItemType
- && parent.data(NetworkModel::ItemActiveRole) == true) {
+
+ // ensure that newly inserted network nodes are expanded per default
+ if(parent.data(NetworkModel::ItemTypeRole) != NetworkModel::NetworkItemType)
+ return;
+
+ if(model()->rowCount(parent) == 1 && parent.data(NetworkModel::ItemActiveRole) == true) {
// without updating the parent the expand will have no effect... Qt Bug?
update(parent);
expand(parent);
}
}
+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<MappedSelectionModel *>(selectionModel());
+ if(!config() || !mappedSelectionModel)
+ return;
+
+ mappedSelectionModel->mappedSetCurrentIndex(Client::bufferModel()->standardSelectionModel()->currentIndex(), QItemSelectionModel::Current);
+ mappedSelectionModel->mappedSelect(Client::bufferModel()->standardSelectionModel()->selection(), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
+}
+
void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) {
QTreeView::dataChanged(topLeft, bottomRight);