+
+#include "buffersettings.h"
+
+#include "util.h" // get rid of this (needed for isChannelName)
+
+/*****************************************
+* Network Items
+*****************************************/
+NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent)
+ : PropertyMapItem(QList<QString>() << "networkName" << "currentServer" << "nickCount", parent),
+ _networkId(netid)
+{
+ // DO NOT EMIT dataChanged() DIRECTLY IN NetworkItem
+ // use networkDataChanged() instead. Otherwise you will end up in a infinite loop
+ // as we "sync" the dataChanged() signals of NetworkItem and StatusBufferItem
+ setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+ connect(this, SIGNAL(networkDataChanged(int)), this, SIGNAL(dataChanged(int)));
+}
+
+QVariant NetworkItem::data(int column, int role) const {
+ switch(role) {
+ case NetworkModel::BufferIdRole:
+ case NetworkModel::BufferInfoRole:
+ case NetworkModel::BufferTypeRole:
+ case NetworkModel::BufferActivityRole:
+ if(childCount())
+ return child(0)->data(column, role);
+ else
+ return QVariant();
+ case NetworkModel::NetworkIdRole:
+ return qVariantFromValue(_networkId);
+ case NetworkModel::ItemTypeRole:
+ return NetworkModel::NetworkItemType;
+ case NetworkModel::ItemActiveRole:
+ return isActive();
+ default:
+ return PropertyMapItem::data(column, role);
+ }
+}
+
+BufferItem *NetworkItem::findBufferItem(BufferId bufferId) {
+ BufferItem *bufferItem = 0;
+
+ for(int i = 0; i < childCount(); i++) {
+ bufferItem = qobject_cast<BufferItem *>(child(i));
+ if(!bufferItem)
+ continue;
+ if(bufferItem->bufferId() == bufferId)
+ return bufferItem;
+ }
+ return 0;
+}
+
+
+BufferItem *NetworkItem::bufferItem(const BufferInfo &bufferInfo) {
+ BufferItem *bufferItem = findBufferItem(bufferInfo);
+ if(bufferItem)
+ return bufferItem;
+
+ switch(bufferInfo.type()) {
+ case BufferInfo::StatusBuffer:
+ bufferItem = new StatusBufferItem(bufferInfo, this);
+ disconnect(this, SIGNAL(networkDataChanged(int)), this, SIGNAL(dataChanged(int)));
+ connect(this, SIGNAL(networkDataChanged(int)), bufferItem, SIGNAL(dataChanged(int)));
+ connect(bufferItem, SIGNAL(dataChanged(int)), this, SIGNAL(dataChanged(int)));
+ break;
+ case BufferInfo::ChannelBuffer:
+ bufferItem = new ChannelBufferItem(bufferInfo, this);
+ break;
+ case BufferInfo::QueryBuffer:
+ bufferItem = new QueryBufferItem(bufferInfo, this);
+ break;
+ default:
+ bufferItem = new BufferItem(bufferInfo, this);
+ }
+
+ newChild(bufferItem);
+ return bufferItem;
+}
+
+void NetworkItem::attachNetwork(Network *network) {
+ if(!network)
+ return;
+
+ _network = network;
+
+ connect(network, SIGNAL(networkNameSet(QString)),
+ this, SLOT(setNetworkName(QString)));
+ connect(network, SIGNAL(currentServerSet(QString)),
+ this, SLOT(setCurrentServer(QString)));
+ connect(network, SIGNAL(ircChannelAdded(IrcChannel *)),
+ this, SLOT(attachIrcChannel(IrcChannel *)));
+ connect(network, SIGNAL(ircUserAdded(IrcUser *)),
+ this, SLOT(attachIrcUser(IrcUser *)));
+ connect(network, SIGNAL(connectedSet(bool)),
+ this, SIGNAL(networkDataChanged()));
+ connect(network, SIGNAL(destroyed()),
+ this, SIGNAL(networkDataChanged()));
+
+ emit networkDataChanged();
+}
+
+void NetworkItem::attachIrcChannel(IrcChannel *ircChannel) {
+ ChannelBufferItem *channelItem;
+ for(int i = 0; i < childCount(); i++) {
+ channelItem = qobject_cast<ChannelBufferItem *>(child(i));
+ if(!channelItem)
+ continue;
+
+ if(channelItem->bufferName().toLower() == ircChannel->name().toLower()) {
+ channelItem->attachIrcChannel(ircChannel);
+ return;
+ }
+ }
+}
+
+void NetworkItem::attachIrcUser(IrcUser *ircUser) {
+ QueryBufferItem *queryItem = 0;
+ for(int i = 0; i < childCount(); i++) {
+ queryItem = qobject_cast<QueryBufferItem *>(child(i));
+ if(!queryItem)
+ continue;
+
+ if(queryItem->bufferName().toLower() == ircUser->nick().toLower()) {
+ queryItem->setIrcUser(ircUser);
+ break;
+ }
+ }
+}
+
+void NetworkItem::setNetworkName(const QString &networkName) {
+ Q_UNUSED(networkName);
+ emit networkDataChanged(0);
+}
+
+void NetworkItem::setCurrentServer(const QString &serverName) {
+ Q_UNUSED(serverName);
+ emit networkDataChanged(1);
+}
+
+
+QString NetworkItem::toolTip(int column) const {
+ Q_UNUSED(column);
+
+ QStringList toolTip(QString("<b>%1</b>").arg(networkName()));
+ toolTip.append(tr("Server: %1").arg(currentServer()));
+ toolTip.append(tr("Users: %1").arg(nickCount()));
+
+ if(_network) {
+ toolTip.append(tr("Lag: %1 msecs").arg(_network->latency()));
+ }
+
+ return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
+}