X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fbuffertreemodel.cpp;h=568f7e6c3b9fecaee47f8456e3794131edbf7a33;hp=3f0a2adba90dda46beb597b70edb2c2f36407d02;hb=017582b02dcf25ed4027c54fbcd652004b103f91;hpb=0ac9ce4d7cf768d13993d6aa1d6b791c4149a843 diff --git a/src/client/buffertreemodel.cpp b/src/client/buffertreemodel.cpp index 3f0a2adb..568f7e6c 100644 --- a/src/client/buffertreemodel.cpp +++ b/src/client/buffertreemodel.cpp @@ -20,9 +20,12 @@ #include // FIXME Dependency on QtGui! -#include "clientproxy.h" #include "buffertreemodel.h" +#include "bufferinfo.h" +#include "client.h" +#include "signalproxy.h" + /***************************************** * Fancy Buffer Items *****************************************/ @@ -31,6 +34,10 @@ BufferTreeItem::BufferTreeItem(Buffer *buffer, TreeItem *parent) : TreeItem(pare activity = Buffer::NoActivity; } +uint BufferTreeItem::id() const { + return buf->bufferInfo().uid(); +} + void BufferTreeItem::setActivity(const Buffer::ActivityLevel &level) { activity = level; } @@ -75,19 +82,44 @@ QVariant BufferTreeItem::data(int column, int role) const { return buf->bufferType(); case BufferTreeModel::BufferActiveRole: return buf->isActive(); - case BufferTreeModel::BufferIdRole: - return buf->bufferId().uid(); + case BufferTreeModel::BufferInfoRole: + return buf->bufferInfo().uid(); default: return QVariant(); } } +Qt::ItemFlags BufferTreeItem::flags() const { + Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled; + if(buf->bufferType() == Buffer::QueryBuffer) + flags |= Qt::ItemIsDropEnabled; + + return flags; +} + +/***************************************** +* Network Items +*****************************************/ +NetworkTreeItem::NetworkTreeItem(const QString &network, TreeItem *parent) : TreeItem(parent) { + net = network; + itemData << net << ""; +} + +uint NetworkTreeItem::id() const { + return qHash(net); +} + +Qt::ItemFlags NetworkTreeItem::flags() const { + return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled; +} + /***************************************** * BufferTreeModel *****************************************/ -BufferTreeModel::BufferTreeModel(QObject *parent) : TreeModel(BufferTreeModel::defaultHeader(), parent) { - connect(this, SIGNAL(fakeUserInput(BufferId, QString)), - ClientProxy::instance(), SLOT(gsUserInput(BufferId, QString))); +BufferTreeModel::BufferTreeModel(QObject *parent) + : TreeModel(BufferTreeModel::defaultHeader(), parent) +{ + Client::signalProxy()->attachSignal(this, SIGNAL(fakeUserInput(BufferInfo, QString)), SIGNAL(sendInput(BufferInfo, QString))); } QListBufferTreeModel::defaultHeader() { @@ -96,25 +128,8 @@ QListBufferTreeModel::defaultHeader() { return data; } - -Qt::ItemFlags BufferTreeModel::flags(const QModelIndex &index) const { - if(!index.isValid()) - return Qt::ItemIsDropEnabled; - //return 0; - - // I think this is pretty ugly.. - if(isBufferIndex(index)) { - Buffer *buffer = getBufferByIndex(index); - if(buffer->bufferType() == Buffer::QueryBuffer) - return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; - else - return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled; - } else { - return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled; - } -} - bool BufferTreeModel::isBufferIndex(const QModelIndex &index) const { + // not so purdy... return parent(index) != QModelIndex(); } @@ -125,49 +140,44 @@ Buffer *BufferTreeModel::getBufferByIndex(const QModelIndex &index) const { QModelIndex BufferTreeModel::getOrCreateNetworkItemIndex(Buffer *buffer) { QString net = buffer->networkName(); - - if(networkItem.contains(net)) { - return index(networkItem[net]->row(), 0); - } else { - QList data; - data << net << ""; - + TreeItem *networkItem; + + if(!(networkItem = rootItem->childById(qHash(net)))) { int nextRow = rootItem->childCount(); + networkItem = new NetworkTreeItem(net, rootItem); beginInsertRows(QModelIndex(), nextRow, nextRow); - rootItem->appendChild(new TreeItem(data, rootItem)); + rootItem->appendChild(networkItem); endInsertRows(); - - networkItem[net] = rootItem->child(nextRow); - return index(nextRow, 0); } + + Q_ASSERT(networkItem); + return index(networkItem->row(), 0); } QModelIndex BufferTreeModel::getOrCreateBufferItemIndex(Buffer *buffer) { QModelIndex networkItemIndex = getOrCreateNetworkItemIndex(buffer); + NetworkTreeItem *networkItem = static_cast(networkItemIndex.internalPointer()); + TreeItem *bufferItem; - if(bufferItem.contains(buffer)) { - return index(bufferItem[buffer]->row(), 0, networkItemIndex); - } else { - // first we determine the parent of the new Item - TreeItem *networkItem = static_cast(networkItemIndex.internalPointer()); - + if(!(bufferItem = networkItem->childById(buffer->bufferInfo().uid()))) { int nextRow = networkItem->childCount(); - + bufferItem = new BufferTreeItem(buffer, networkItem); + beginInsertRows(networkItemIndex, nextRow, nextRow); - networkItem->appendChild(new BufferTreeItem(buffer, networkItem)); + networkItem->appendChild(bufferItem); endInsertRows(); - - bufferItem[buffer] = static_cast(networkItem->child(nextRow)); - return index(nextRow, 0, networkItemIndex); } + + Q_ASSERT(bufferItem); + return index(bufferItem->row(), 0, networkItemIndex); } 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; } @@ -178,25 +188,25 @@ 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; } bool BufferTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction /*action*/, int /*row*/, int /*column*/, const QModelIndex &parent) { - if(!(data->hasFormat("application/Quassel/BufferItem/row") - && data->hasFormat("application/Quassel/BufferItem/network") - && data->hasFormat("application/Quassel/BufferItem/bufferId"))) - return false; // whatever the drop is... it's not a buffer... - + foreach(QString mimeType, mimeTypes()) { + if(!(data->hasFormat(mimeType))) + return false; // whatever the drop is... it's not a buffer... + } + int sourcerow = data->data("application/Quassel/BufferItem/row").toInt(); QString network = QString::fromUtf8(data->data("application/Quassel/BufferItem/network")); - Q_ASSERT(networkItem.contains(network)); + Q_ASSERT(rootItem->childById(qHash(network))); if(parent == QModelIndex()) // can't be a query... return false; - Buffer *sourceBuffer = static_cast(networkItem[network]->child(sourcerow))->buffer(); + 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 @@ -205,16 +215,8 @@ bool BufferTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction /*actio if(sourceBuffer == targetBuffer) // we won't merge with ourself :) return false; - /* - if(QMessageBox::warning(static_cast(QObject::parent()), - tr("Merge Buffers?"), - tr("Do you really want to merge the following Buffers?
%1.%2
%3.%4").arg(sourceBuffer->networkName()).arg(sourceBuffer->bufferName()).arg(targetBuffer->networkName()).arg(targetBuffer->bufferName()), - QMessageBox::Yes|QMessageBox::No) == QMessageBox::No) - return false; - - */ + // TODO: warn user about buffermerge! qDebug() << "merging" << sourceBuffer->bufferName() << "with" << targetBuffer->bufferName(); - bufferItem.remove(getBufferByIndex(parent)); removeRow(parent.row(), BufferTreeModel::parent(parent)); return true; @@ -241,19 +243,21 @@ 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 fakeUserInput(buffer->bufferInfo(), QString("/join " + buffer->bufferName())); } } void BufferTreeModel::bufferActivity(Buffer::ActivityLevel level, Buffer *buffer) { - if(bufferItem.contains(buffer) and buffer != currentBuffer) - bufferItem[buffer]->setActivity(level); + BufferTreeItem *bufferItem = static_cast(getOrCreateBufferItemIndex(buffer).internalPointer()); + if(buffer != currentBuffer) + bufferItem->setActivity(level); else - bufferItem[buffer]->setActivity(Buffer::NoActivity); + bufferItem->setActivity(Buffer::NoActivity); bufferUpdated(buffer); } void BufferTreeModel::selectBuffer(Buffer *buffer) { QModelIndex index = getOrCreateBufferItemIndex(buffer); - emit selectionChanged(index); + //emit selectionChanged(index); + changeCurrent(index, QModelIndex()); }