X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fbuffertreemodel.cpp;h=93c9063b025733009bba41b033fdcb481d4d003d;hp=54ef7a876cec79d383380178714ecbc5c0134e59;hb=ef0e65458bf4e1cbc01399fe0e025a5b4fd327dc;hpb=0555b01cbb4789122de7bc0a5325c664fbed87cd diff --git a/src/client/buffertreemodel.cpp b/src/client/buffertreemodel.cpp index 54ef7a87..93c9063b 100644 --- a/src/client/buffertreemodel.cpp +++ b/src/client/buffertreemodel.cpp @@ -20,9 +20,15 @@ #include // FIXME Dependency on QtGui! -#include "clientproxy.h" #include "buffertreemodel.h" +#include "mappedselectionmodel.h" +#include + +#include "bufferinfo.h" +#include "client.h" +#include "signalproxy.h" + /***************************************** * Fancy Buffer Items *****************************************/ @@ -32,7 +38,7 @@ BufferTreeItem::BufferTreeItem(Buffer *buffer, TreeItem *parent) : TreeItem(pare } uint BufferTreeItem::id() const { - return buf->bufferId().uid(); + return buf->bufferInfo().uid(); } void BufferTreeItem::setActivity(const Buffer::ActivityLevel &level) { @@ -76,11 +82,11 @@ QVariant BufferTreeItem::data(int column, int role) const { case BufferTreeModel::BufferNameRole: return buf->bufferName(); case BufferTreeModel::BufferTypeRole: - return buf->bufferType(); + return int(buf->bufferType()); case BufferTreeModel::BufferActiveRole: return buf->isActive(); - case BufferTreeModel::BufferIdRole: - return buf->bufferId().uid(); + case BufferTreeModel::BufferUidRole: + return buf->bufferInfo().uid(); default: return QVariant(); } @@ -88,7 +94,7 @@ QVariant BufferTreeItem::data(int column, int role) const { Qt::ItemFlags BufferTreeItem::flags() const { Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled; - if(buf->bufferType() == Buffer::QueryBuffer) + if(buf->bufferType() == Buffer::QueryType) flags |= Qt::ItemIsDropEnabled; return flags; @@ -114,10 +120,19 @@ Qt::ItemFlags NetworkTreeItem::flags() const { * BufferTreeModel *****************************************/ BufferTreeModel::BufferTreeModel(QObject *parent) - : TreeModel(BufferTreeModel::defaultHeader(), parent) + : TreeModel(BufferTreeModel::defaultHeader(), parent), + _selectionModelSynchronizer(new SelectionModelSynchronizer(this)), + _propertyMapper(new ModelPropertyMapper(this)) { - connect(this, SIGNAL(fakeUserInput(BufferId, QString)), - ClientProxy::instance(), SLOT(gsUserInput(BufferId, QString))); + rootItem->setFlags(rootItem->flags() | Qt::ItemIsDropEnabled); + _propertyMapper->setModel(this); + delete _propertyMapper->selectionModel(); + MappedSelectionModel *mappedSelectionModel = new MappedSelectionModel(this); + _propertyMapper->setSelectionModel(mappedSelectionModel); + synchronizeSelectionModel(mappedSelectionModel); + + connect(_selectionModelSynchronizer, SIGNAL(setCurrentIndex(QModelIndex, QItemSelectionModel::SelectionFlags)), + this, SLOT(setCurrentIndex(QModelIndex, QItemSelectionModel::SelectionFlags))); } QListBufferTreeModel::defaultHeader() { @@ -126,6 +141,22 @@ QListBufferTreeModel::defaultHeader() { return data; } +void BufferTreeModel::synchronizeSelectionModel(MappedSelectionModel *selectionModel) { + selectionModelSynchronizer()->addSelectionModel(selectionModel); +} + +void BufferTreeModel::synchronizeView(QAbstractItemView *view) { + MappedSelectionModel *mappedSelectionModel = new MappedSelectionModel(view->model()); + selectionModelSynchronizer()->addSelectionModel(mappedSelectionModel); + Q_ASSERT(mappedSelectionModel); + delete view->selectionModel(); + view->setSelectionModel(mappedSelectionModel); +} + +void BufferTreeModel::mapProperty(int column, int role, QObject *target, const QByteArray &property) { + propertyMapper()->addMapping(column, role, target, property); +} + bool BufferTreeModel::isBufferIndex(const QModelIndex &index) const { // not so purdy... return parent(index) != QModelIndex(); @@ -140,7 +171,7 @@ QModelIndex BufferTreeModel::getOrCreateNetworkItemIndex(Buffer *buffer) { QString net = buffer->networkName(); TreeItem *networkItem; - if(not(networkItem = rootItem->childById(qHash(net)))) { + if(!(networkItem = rootItem->childById(qHash(net)))) { int nextRow = rootItem->childCount(); networkItem = new NetworkTreeItem(net, rootItem); @@ -158,7 +189,7 @@ QModelIndex BufferTreeModel::getOrCreateBufferItemIndex(Buffer *buffer) { NetworkTreeItem *networkItem = static_cast(networkItemIndex.internalPointer()); TreeItem *bufferItem; - if(not(bufferItem = networkItem->childById(buffer->bufferId().uid()))) { + if(!(bufferItem = networkItem->childById(buffer->bufferInfo().uid()))) { int nextRow = networkItem->childCount(); bufferItem = new BufferTreeItem(buffer, networkItem); @@ -175,7 +206,7 @@ QStringList BufferTreeModel::mimeTypes() const { QStringList types; types << "application/Quassel/BufferItem/row" << "application/Quassel/BufferItem/network" - << "application/Quassel/BufferItem/bufferId"; + << "application/Quassel/BufferItem/bufferInfo"; return types; } @@ -186,7 +217,7 @@ QMimeData *BufferTreeModel::mimeData(const QModelIndexList &indexes) const { mimeData->setData("application/Quassel/BufferItem/row", QByteArray::number(index.row())); mimeData->setData("application/Quassel/BufferItem/network", getBufferByIndex(index)->networkName().toUtf8()); - mimeData->setData("application/Quassel/BufferItem/bufferId", QByteArray::number(getBufferByIndex(index)->bufferId().uid())); + mimeData->setData("application/Quassel/BufferItem/bufferInfo", QByteArray::number(getBufferByIndex(index)->bufferInfo().uid())); return mimeData; } @@ -207,7 +238,7 @@ bool BufferTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction /*actio Buffer *sourceBuffer = static_cast(rootItem->childById(qHash(network))->child(sourcerow))->buffer(); Buffer *targetBuffer = getBufferByIndex(parent); - if(!(sourceBuffer->bufferType() & targetBuffer->bufferType() & Buffer::QueryBuffer)) // only queries can be merged + if(!(sourceBuffer->bufferType() & targetBuffer->bufferType() & Buffer::QueryType)) // only queries can be merged return false; if(sourceBuffer == targetBuffer) // we won't merge with ourself :) @@ -227,21 +258,13 @@ void BufferTreeModel::bufferUpdated(Buffer *buffer) { } // This Slot indicates that the user has selected a different buffer in the gui -void BufferTreeModel::changeCurrent(const QModelIndex ¤t, const QModelIndex &/*previous*/) { - if(isBufferIndex(current)) { - currentBuffer = getBufferByIndex(current); +void BufferTreeModel::setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) { + Q_UNUSED(command) + if(isBufferIndex(index)) { + currentBuffer = getBufferByIndex(index); bufferActivity(Buffer::NoActivity, currentBuffer); emit bufferSelected(currentBuffer); - emit selectionChanged(current); - } -} - -// we received a double click on a buffer, so we're going to join it -void BufferTreeModel::doubleClickReceived(const QModelIndex &clicked) { - if(isBufferIndex(clicked)) { - Buffer *buffer = getBufferByIndex(clicked); - if(!buffer->isStatusBuffer()) - emit fakeUserInput(buffer->bufferId(), QString("/join " + buffer->bufferName())); + emit selectionChanged(index); } } @@ -256,7 +279,6 @@ void BufferTreeModel::bufferActivity(Buffer::ActivityLevel level, Buffer *buffer void BufferTreeModel::selectBuffer(Buffer *buffer) { QModelIndex index = getOrCreateBufferItemIndex(buffer); - emit selectionChanged(index); + // SUPER UGLY! + setCurrentIndex(index, 0); } - -