X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fbuffertreemodel.cpp;h=865c4a45a41906573997ef47a8fe3cbbfe0cd0a9;hp=e433519c7ed38ae5a016141724cdb1ef48bc10a9;hb=788fd0058595c815dc42597e9956c02aea45261f;hpb=1f83867af2efc7be65d60f7c3dfe59774122a883 diff --git a/src/client/buffertreemodel.cpp b/src/client/buffertreemodel.cpp index e433519c..865c4a45 100644 --- a/src/client/buffertreemodel.cpp +++ b/src/client/buffertreemodel.cpp @@ -28,12 +28,15 @@ #include "bufferinfo.h" #include "client.h" #include "signalproxy.h" +#include "networkinfo.h" +#include "ircchannel.h" +#include "ircuser.h" /***************************************** * Fancy Buffer Items *****************************************/ -BufferTreeItem::BufferTreeItem(Buffer *buffer, TreeItem *parent) - : TreeItem(parent), +BufferItem::BufferItem(Buffer *buffer, AbstractTreeItem *parent) + : PropertyMapItem(QStringList() << "bufferName" << "topic" << "nickCount", parent), buf(buffer), activity(Buffer::NoActivity) { @@ -43,26 +46,15 @@ BufferTreeItem::BufferTreeItem(Buffer *buffer, TreeItem *parent) setFlags(flags); } -quint64 BufferTreeItem::id() const { +quint64 BufferItem::id() const { return buf->bufferInfo().uid(); } -void BufferTreeItem::setActivity(const Buffer::ActivityLevel &level) { +void BufferItem::setActivity(const Buffer::ActivityLevel &level) { activity = level; } -QString BufferTreeItem::text(int column) const { - switch(column) { - case 0: - return buf->name(); - case 1: - return buf->networkName(); - default: - return QString(); - } -} - -QColor BufferTreeItem::foreground(int column) const { +QColor BufferItem::foreground(int column) const { Q_UNUSED(column) // for the time beeing we ignore the column :) if(activity & Buffer::Highlight) { @@ -79,58 +71,198 @@ QColor BufferTreeItem::foreground(int column) const { } } - -QVariant BufferTreeItem::data(int column, int role) const { +QVariant BufferItem::data(int column, int role) const { switch(role) { - case Qt::DisplayRole: - return text(column); - case Qt::ForegroundRole: - return foreground(column); - case BufferTreeModel::BufferTypeRole: - return int(buf->bufferType()); - case BufferTreeModel::BufferActiveRole: - return buf->isActive(); - case BufferTreeModel::BufferUidRole: + case NetworkModel::ItemTypeRole: + return NetworkModel::BufferItemType; + case NetworkModel::BufferUidRole: return buf->bufferInfo().uid(); - case BufferTreeModel::NetworkIdRole: + case NetworkModel::NetworkIdRole: return buf->bufferInfo().networkId(); - + case NetworkModel::BufferTypeRole: + return int(buf->bufferType()); + case NetworkModel::BufferActiveRole: + return buf->isActive(); + case Qt::ForegroundRole: + return foreground(column); default: - return TreeItem::data(column, role); + return PropertyMapItem::data(column, role); } } +void BufferItem::attachIrcChannel(IrcChannel *ircChannel) { + if(!ircChannel) + return; + + _ircChannel = ircChannel; + + connect(ircChannel, SIGNAL(topicSet(QString)), + this, SLOT(setTopic(QString))); + connect(ircChannel, SIGNAL(ircUserJoined(IrcUser *)), + this, SLOT(join(IrcUser *))); + connect(ircChannel, SIGNAL(ircUserParted(IrcUser *)), + this, SLOT(part(IrcUser *))); +} + +QString BufferItem::bufferName() const { + return buf->name(); +} + +QString BufferItem::topic() const { + if(_ircChannel) + return _ircChannel->topic(); + else + return QString(); +} + +int BufferItem::nickCount() const { + if(_ircChannel) + return _ircChannel->ircUsers().count(); + else + return 0; +} + +void BufferItem::setTopic(const QString &topic) { + Q_UNUSED(topic); + emit dataChanged(1); +} + +void BufferItem::join(IrcUser *ircUser) { +// emit newChild(new IrcUserItem(ircUser, this)); +// emit dataChanged(2); +} + +void BufferItem::part(IrcUser *ircUser) { + Q_UNUSED(ircUser); + emit dataChanged(2); +} + /***************************************** * Network Items *****************************************/ -NetworkTreeItem::NetworkTreeItem(const uint &netid, const QString &network, TreeItem *parent) - : TreeItem(parent), +NetworkItem::NetworkItem(const uint &netid, const QString &network, AbstractTreeItem *parent) + : PropertyMapItem(QList() << "networkName" << "currentServer" << "nickCount", parent), _networkId(netid), - net(network) + _networkName(network) { - net = network; - itemData << net << ""; setFlags(Qt::ItemIsEnabled); } -QVariant NetworkTreeItem::data(int column, int role) const { +QVariant NetworkItem::data(int column, int role) const { switch(role) { - case BufferTreeModel::NetworkIdRole: + case NetworkModel::NetworkIdRole: return _networkId; + case NetworkModel::ItemTypeRole: + return NetworkModel::NetworkItemType; default: - return TreeItem::data(column, role); + return PropertyMapItem::data(column, role); } } -quint64 NetworkTreeItem::id() const { +quint64 NetworkItem::id() const { return _networkId; } +QString NetworkItem::networkName() const { + if(_networkInfo) + return _networkInfo->networkName(); + else + return _networkName; +} + +QString NetworkItem::currentServer() const { + if(_networkInfo) + return _networkInfo->currentServer(); + else + return QString(); +} + +int NetworkItem::nickCount() const { + BufferItem *bufferItem; + int count = 0; + for(int i = 0; i < childCount(); i++) { + bufferItem = qobject_cast(child(i)); + if(!bufferItem) + continue; + count += bufferItem->nickCount(); + } + return count; +} + +void NetworkItem::attachNetworkInfo(NetworkInfo *networkInfo) { + if(!networkInfo) + return; + + _networkInfo = networkInfo; + + connect(networkInfo, SIGNAL(networkNameSet(QString)), + this, SLOT(setNetworkName(QString))); + connect(networkInfo, SIGNAL(currentServerSet(QString)), + this, SLOT(setCurrentServer(QString))); + connect(networkInfo, SIGNAL(ircChannelAdded(QString)), + this, SLOT(attachIrcChannel(QString))); + // FIXME: connect this and that... +} + +void NetworkItem::attachIrcChannel(const QString &channelName) { + IrcChannel *ircChannel = _networkInfo->ircChannel(channelName); + if(!ircChannel) { + qWarning() << "NetworkItem::attachIrcChannel(): unkown Channel" << channelName; + return; + } + + BufferItem *bufferItem; + for(int i = 0; i < childCount(); i++) { + bufferItem = qobject_cast(child(i)); + if(bufferItem->bufferName() == ircChannel->name()) { + bufferItem->attachIrcChannel(ircChannel); + break; + } + } +} + +void NetworkItem::setNetworkName(const QString &networkName) { + Q_UNUSED(networkName); + emit dataChanged(0); +} + +void NetworkItem::setCurrentServer(const QString &serverName) { + Q_UNUSED(serverName); + emit dataChanged(1); +} + +/***************************************** +* Irc User Items +*****************************************/ +IrcUserItem::IrcUserItem(IrcUser *ircUser, AbstractTreeItem *parent) + : PropertyMapItem(QStringList() << "nickName", parent), + _ircUser(ircUser) +{ + connect(ircUser, SIGNAL(destroyed()), + this, SLOT(ircUserDestroyed())); + + connect(ircUser, SIGNAL(nickSet(QString)), + this, SLOT(setNick(QString))); +} + +QString IrcUserItem::nickName() { + return _ircUser->nick(); +} + +void IrcUserItem::setNick(QString newNick) { + Q_UNUSED(newNick); + emit dataChanged(0); +} +void IrcUserItem::ircUserDestroyed() { + deleteLater(); +} + + /***************************************** - * BufferTreeModel + * NetworkModel *****************************************/ -BufferTreeModel::BufferTreeModel(QObject *parent) - : TreeModel(BufferTreeModel::defaultHeader(), parent), +NetworkModel::NetworkModel(QObject *parent) + : TreeModel(NetworkModel::defaultHeader(), parent), _selectionModelSynchronizer(new SelectionModelSynchronizer(this)), _propertyMapper(new ModelPropertyMapper(this)) { @@ -145,17 +277,17 @@ BufferTreeModel::BufferTreeModel(QObject *parent) this, SLOT(setCurrentIndex(QModelIndex, QItemSelectionModel::SelectionFlags))); } -QListBufferTreeModel::defaultHeader() { +QListNetworkModel::defaultHeader() { QList data; - data << tr("Buffer") << tr("Network"); + data << tr("Buffer") << tr("Topic") << tr("Nick Count"); return data; } -void BufferTreeModel::synchronizeSelectionModel(MappedSelectionModel *selectionModel) { +void NetworkModel::synchronizeSelectionModel(MappedSelectionModel *selectionModel) { selectionModelSynchronizer()->addSelectionModel(selectionModel); } -void BufferTreeModel::synchronizeView(QAbstractItemView *view) { +void NetworkModel::synchronizeView(QAbstractItemView *view) { MappedSelectionModel *mappedSelectionModel = new MappedSelectionModel(view->model()); selectionModelSynchronizer()->addSelectionModel(mappedSelectionModel); Q_ASSERT(mappedSelectionModel); @@ -163,57 +295,75 @@ void BufferTreeModel::synchronizeView(QAbstractItemView *view) { view->setSelectionModel(mappedSelectionModel); } -void BufferTreeModel::mapProperty(int column, int role, QObject *target, const QByteArray &property) { +void NetworkModel::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(); +bool NetworkModel::isBufferIndex(const QModelIndex &index) const { + return index.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType; } -Buffer *BufferTreeModel::getBufferByIndex(const QModelIndex &index) const { - BufferTreeItem *item = static_cast(index.internalPointer()); +Buffer *NetworkModel::getBufferByIndex(const QModelIndex &index) const { + BufferItem *item = static_cast(index.internalPointer()); + // FIXME get rid of this + Q_ASSERT(item->buffer() == Client::instance()->buffer(item->id())); return item->buffer(); } -QModelIndex BufferTreeModel::getOrCreateNetworkItemIndex(Buffer *buffer) { - QString net = buffer->networkName(); - uint netId = buffer->networkId(); - TreeItem *networkItem; - if(!(networkItem = rootItem->childById(netId))) { - int nextRow = rootItem->childCount(); - networkItem = new NetworkTreeItem(netId, net, rootItem); - - beginInsertRows(QModelIndex(), nextRow, nextRow); - rootItem->appendChild(networkItem); - endInsertRows(); +// experimental stuff :) +QModelIndex NetworkModel::networkIndex(uint networkId) { + return indexById(networkId); +} + +NetworkItem *NetworkModel::network(uint networkId) { + return qobject_cast(rootItem->childById(networkId)); +} + +NetworkItem *NetworkModel::newNetwork(uint networkId, const QString &networkName) { + NetworkItem *networkItem = network(networkId); + + if(networkItem == 0) { + networkItem = new NetworkItem(networkId, networkName, rootItem); + appendChild(rootItem, networkItem); } Q_ASSERT(networkItem); - return index(networkItem->row(), 0); + return networkItem; } -QModelIndex BufferTreeModel::getOrCreateBufferItemIndex(Buffer *buffer) { - QModelIndex networkItemIndex = getOrCreateNetworkItemIndex(buffer); - NetworkTreeItem *networkItem = static_cast(networkItemIndex.internalPointer()); - TreeItem *bufferItem; - - if(!(bufferItem = networkItem->childById(buffer->bufferInfo().uid()))) { - int nextRow = networkItem->childCount(); - bufferItem = new BufferTreeItem(buffer, networkItem); - - beginInsertRows(networkItemIndex, nextRow, nextRow); - networkItem->appendChild(bufferItem); - endInsertRows(); +QModelIndex NetworkModel::bufferIndex(BufferInfo bufferInfo) { + QModelIndex networkIdx = networkIndex(bufferInfo.networkId()); + if(!networkIdx.isValid()) + return QModelIndex(); + else + return indexById(bufferInfo.uid(), networkIdx); +} + +BufferItem *NetworkModel::buffer(BufferInfo bufferInfo) { + QModelIndex bufferIdx = bufferIndex(bufferInfo); + if(bufferIdx.isValid()) + return static_cast(bufferIdx.internalPointer()); + else + return 0; +} + +BufferItem *NetworkModel::newBuffer(BufferInfo bufferInfo) { + BufferItem *bufferItem = buffer(bufferInfo); + if(bufferItem == 0) { + NetworkItem *networkItem = newNetwork(bufferInfo.networkId(), bufferInfo.network()); + + // FIXME: get rid of the buffer pointer + Buffer *buffer = Client::instance()->buffer(bufferInfo.uid()); + bufferItem = new BufferItem(buffer, networkItem); + appendChild(networkItem, bufferItem); } Q_ASSERT(bufferItem); - return index(bufferItem->row(), 0, networkItemIndex); + return bufferItem; } -QStringList BufferTreeModel::mimeTypes() const { +QStringList NetworkModel::mimeTypes() const { // mimetypes we accept for drops QStringList types; // comma separated list of colon separated pairs of networkid and bufferid @@ -222,11 +372,11 @@ QStringList BufferTreeModel::mimeTypes() const { return types; } -bool BufferTreeModel::mimeContainsBufferList(const QMimeData *mimeData) { +bool NetworkModel::mimeContainsBufferList(const QMimeData *mimeData) { return mimeData->hasFormat("application/Quassel/BufferItemList"); } -QList< QPair > BufferTreeModel::mimeDataToBufferList(const QMimeData *mimeData) { +QList< QPair > NetworkModel::mimeDataToBufferList(const QMimeData *mimeData) { QList< QPair > bufferList; if(!mimeContainsBufferList(mimeData)) @@ -245,7 +395,7 @@ QList< QPair > BufferTreeModel::mimeDataToBufferList(const QMimeData } -QMimeData *BufferTreeModel::mimeData(const QModelIndexList &indexes) const { +QMimeData *NetworkModel::mimeData(const QModelIndexList &indexes) const { QMimeData *mimeData = new QMimeData(); QStringList bufferlist; @@ -263,7 +413,7 @@ QMimeData *BufferTreeModel::mimeData(const QModelIndexList &indexes) const { return mimeData; } -bool BufferTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { +bool NetworkModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { Q_UNUSED(action) Q_UNUSED(row) Q_UNUSED(column) @@ -272,7 +422,7 @@ bool BufferTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, return false; // target must be a query - Buffer::Type targetType = (Buffer::Type)parent.data(BufferTreeModel::BufferTypeRole).toInt(); + Buffer::Type targetType = (Buffer::Type)parent.data(NetworkModel::BufferTypeRole).toInt(); if(targetType != Buffer::QueryType) return false; @@ -304,14 +454,23 @@ bool BufferTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, return true; } -void BufferTreeModel::bufferUpdated(Buffer *buffer) { - QModelIndex itemindex = getOrCreateBufferItemIndex(buffer); - emit invalidateFilter(); +void NetworkModel::attachNetworkInfo(NetworkInfo *networkInfo) { + NetworkItem *networkItem = network(networkInfo->networkId()); + if(!networkItem) { + qWarning() << "NetworkModel::attachNetworkInfo(): network is unknown!"; + return; + } + networkItem->attachNetworkInfo(networkInfo); +} + +void NetworkModel::bufferUpdated(Buffer *buffer) { + BufferItem *bufferItem = newBuffer(buffer->bufferInfo()); + QModelIndex itemindex = indexByItem(bufferItem); emit dataChanged(itemindex, itemindex); } // This Slot indicates that the user has selected a different buffer in the gui -void BufferTreeModel::setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) { +void NetworkModel::setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) { Q_UNUSED(command) Buffer *newCurrentBuffer; if(isBufferIndex(index) && currentBuffer != (newCurrentBuffer = getBufferByIndex(index))) { @@ -322,17 +481,26 @@ void BufferTreeModel::setCurrentIndex(const QModelIndex &index, QItemSelectionMo } } -void BufferTreeModel::bufferActivity(Buffer::ActivityLevel level, Buffer *buffer) { - BufferTreeItem *bufferItem = static_cast(getOrCreateBufferItemIndex(buffer).internalPointer()); - if(buffer != currentBuffer) +void NetworkModel::bufferActivity(Buffer::ActivityLevel level, Buffer *buf) { + BufferItem *bufferItem = buffer(buf->bufferInfo()); + if(!bufferItem) { + qWarning() << "NetworkModel::bufferActivity(): received Activity Info for uknown Buffer"; + return; + } + + if(buf != currentBuffer) bufferItem->setActivity(level); else bufferItem->setActivity(Buffer::NoActivity); - bufferUpdated(buffer); + bufferUpdated(buf); } -void BufferTreeModel::selectBuffer(Buffer *buffer) { - QModelIndex index = getOrCreateBufferItemIndex(buffer); +void NetworkModel::selectBuffer(Buffer *buffer) { + QModelIndex index = bufferIndex(buffer->bufferInfo()); + if(!index.isValid()) { + qWarning() << "NetworkModel::selectBuffer(): unknown Buffer has been selected."; + return; + } // SUPER UGLY! setCurrentIndex(index, 0); }