+BufferItem *NetworkItem::bufferItem(const BufferInfo &bufferInfo)
+{
+ BufferItem *bufferItem = findBufferItem(bufferInfo);
+ if (bufferItem)
+ return bufferItem;
+
+ switch (bufferInfo.type()) {
+ case BufferInfo::StatusBuffer:
+ _statusBufferItem = new StatusBufferItem(bufferInfo, this);
+ bufferItem = _statusBufferItem;
+ 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);
+
+ // postprocess... this is necessary because Qt doesn't seem to like adding children which already have children on their own
+ switch (bufferInfo.type()) {
+ case BufferInfo::ChannelBuffer:
+ {
+ ChannelBufferItem *channelBufferItem = static_cast<ChannelBufferItem *>(bufferItem);
+ if (_network) {
+ IrcChannel *ircChannel = _network->ircChannel(bufferInfo.bufferName());
+ if (ircChannel)
+ channelBufferItem->attachIrcChannel(ircChannel);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ 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, SLOT(onNetworkDestroyed()));
+
+ 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);
+ QString strTooltip;
+ QTextStream tooltip( &strTooltip, QIODevice::WriteOnly );
+ tooltip << "<qt><style>.bold { font-weight: bold; }</style>";
+
+ // Function to add a row to the tooltip table
+ auto addRow = [&](const QString& key, const QString& value, bool condition) {
+ if (condition) {
+ tooltip << "<tr><td class='bold' align='right'>" << key << "</td><td>" << value << "</td></tr>";
+ }
+ };
+
+ tooltip << "<p class='bold' align='center'>" << NetworkItem::escapeHTML(networkName(), true) << "</p>";
+ tooltip << "<table cellspacing='5' cellpadding='0'>";
+ addRow(tr("Server"), NetworkItem::escapeHTML(currentServer(), true), true);
+
+ addRow(tr("Users"), QString::number(nickCount()), true);
+
+ if (_network)
+ addRow(tr("Lag"), NetworkItem::escapeHTML(tr("%1 msecs").arg(_network->latency()), true), true);
+
+ tooltip << "</table></qt>";
+ return strTooltip;
+}
+
+
+void NetworkItem::onBeginRemoveChilds(int start, int end)
+{
+ for (int i = start; i <= end; i++) {
+ StatusBufferItem *statusBufferItem = qobject_cast<StatusBufferItem *>(child(i));
+ if (statusBufferItem) {
+ _statusBufferItem = 0;
+ break;
+ }
+ }
+}
+
+
+void NetworkItem::onNetworkDestroyed()
+{
+ _network = 0;
+ emit networkDataChanged();
+ removeAllChilds();
+}
+