/***************************************************************************
- * 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 *
#include "buffermodel.h"
-#include "networkmodel.h"
-#include "mappedselectionmodel.h"
-#include "buffer.h"
#include <QAbstractItemView>
+#include "client.h"
+#include "networkmodel.h"
+#include "quassel.h"
+
BufferModel::BufferModel(NetworkModel *parent)
: QSortFilterProxyModel(parent),
- _selectionModelSynchronizer(this),
- _propertyMapper(this)
+ _selectionModelSynchronizer(this)
{
setSourceModel(parent);
-
- // initialize the Property Mapper
- _propertyMapper.setModel(this);
- _selectionModelSynchronizer.addRegularSelectionModel(_propertyMapper.selectionModel());
- connect(&_selectionModelSynchronizer, SIGNAL(setCurrentIndex(QModelIndex, QItemSelectionModel::SelectionFlags)),
- this, SLOT(setCurrentIndex(QModelIndex, QItemSelectionModel::SelectionFlags)));
-}
-
-BufferModel::~BufferModel() {
+ if(Quassel::isOptionSet("debugbufferswitches")) {
+ connect(_selectionModelSynchronizer.selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
+ this, SLOT(debug_currentChanged(const QModelIndex &, const QModelIndex &)));
+ }
+ connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(newNetwork(NetworkId)));
}
bool BufferModel::filterAcceptsRow(int sourceRow, const QModelIndex &parent) const {
Q_UNUSED(sourceRow);
- // hide childs of buffers and everything below
- if(parent.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType)
- return false;
- else
+ // only networks and buffers are allowed
+ if(!parent.isValid())
return true;
+ if(parent.data(NetworkModel::ItemTypeRole) == NetworkModel::NetworkItemType)
+ return true;
+
+ return false;
}
-void BufferModel::synchronizeSelectionModel(MappedSelectionModel *selectionModel) {
- _selectionModelSynchronizer.addSelectionModel(selectionModel);
+void BufferModel::newNetwork(NetworkId id) {
+ const Network *net = Client::network(id);
+ Q_ASSERT(net);
+ connect(net, SIGNAL(connectionStateSet(Network::ConnectionState)),
+ this, SLOT(networkConnectionChanged(Network::ConnectionState)));
+}
+
+void BufferModel::networkConnectionChanged(Network::ConnectionState state) {
+ switch(state) {
+ case Network::Connecting:
+ case Network::Initializing:
+ if(currentIndex().isValid())
+ return;
+ {
+ Network *net = qobject_cast<Network *>(sender());
+ Q_ASSERT(net);
+ setCurrentIndex(mapFromSource(Client::networkModel()->networkIndex(net->networkId())));
+ }
+ break;
+ default:
+ return;
+ }
}
void BufferModel::synchronizeView(QAbstractItemView *view) {
- MappedSelectionModel *mappedSelectionModel = new MappedSelectionModel(view->model());
- _selectionModelSynchronizer.addSelectionModel(mappedSelectionModel);
- Q_ASSERT(mappedSelectionModel);
- delete view->selectionModel();
- view->setSelectionModel(mappedSelectionModel);
+ _selectionModelSynchronizer.synchronizeSelectionModel(view->selectionModel());
+}
+
+void BufferModel::setCurrentIndex(const QModelIndex &newCurrent) {
+ _selectionModelSynchronizer.selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::Current);
+ _selectionModelSynchronizer.selectionModel()->select(newCurrent, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
}
-void BufferModel::mapProperty(int column, int role, QObject *target, const QByteArray &property) {
- _propertyMapper.addMapping(column, role, target, property);
+void BufferModel::switchToBuffer(const BufferId &bufferId) {
+ QModelIndex source_index = Client::networkModel()->bufferIndex(bufferId);
+ setCurrentIndex(mapFromSource(source_index));
}
-// This Slot indicates that the user has selected a different buffer in the gui
-void BufferModel::setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) {
- Q_UNUSED(command)
- BufferId newCurrentBuffer;
- if(index.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType
- && currentBuffer != (newCurrentBuffer = qVariantValue<BufferId>(index.data(NetworkModel::BufferIdRole)))) {
- currentBuffer = newCurrentBuffer;
- // FIXME: to something like: index.setData(ActivitRole, NoActivity);
- // networkModel->bufferActivity(BufferItem::NoActivity, currentBuffer);
- emit selectionChanged(index);
+void BufferModel::switchToBufferIndex(const QModelIndex &bufferIdx) {
+ // we accept indexes that directly belong to us or our parent - nothing else
+ if(bufferIdx.model() == this) {
+ setCurrentIndex(bufferIdx);
+ return;
+ }
+
+ if(bufferIdx.model() == sourceModel()) {
+ setCurrentIndex(mapFromSource(bufferIdx));
+ return;
}
+
+ qWarning() << "BufferModel::switchToBufferIndex(const QModelIndex &):" << bufferIdx << "does not belong to BufferModel or NetworkModel";
}
-QModelIndex BufferModel::currentIndex() {
- return propertyMapper()->selectionModel()->currentIndex();
+void BufferModel::debug_currentChanged(QModelIndex current, QModelIndex previous) {
+ Q_UNUSED(previous);
+ qDebug() << "Switched current Buffer: " << current << current.data().toString() << "Buffer:" << current.data(NetworkModel::BufferIdRole).value<BufferId>();
}