#include "signalproxy.h"
#include "network.h"
#include "ircchannel.h"
-#include "ircuser.h"
#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)
+{
+ setFlags(Qt::ItemIsEnabled);
+}
+
+QVariant NetworkItem::data(int column, int role) const {
+ switch(role) {
+ case NetworkModel::NetworkIdRole:
+ return qVariantFromValue(_networkId);
+ case NetworkModel::ItemTypeRole:
+ return NetworkModel::NetworkItemType;
+ case NetworkModel::ItemActiveRole:
+ return isActive();
+ default:
+ return PropertyMapItem::data(column, role);
+ }
+}
+
+quint64 NetworkItem::id() const {
+ return qHash(_networkId);
+}
+
+bool NetworkItem::isActive() const {
+ if(_network)
+ return _network->isConnected();
+ else
+ return false;
+}
+
+QString NetworkItem::networkName() const {
+ if(_network)
+ return _network->networkName();
+ else
+ return QString();
+}
+
+QString NetworkItem::currentServer() const {
+ if(_network)
+ return _network->currentServer();
+ else
+ return QString();
+}
+
+int NetworkItem::nickCount() const {
+ if(_network)
+ return _network->ircUsers().count();
+ else
+ return 0;
+}
+
+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(QString)),
+ this, SLOT(attachIrcChannel(QString)));
+ connect(network, SIGNAL(connectedSet(bool)),
+ this, SIGNAL(dataChanged()));
+ connect(network, SIGNAL(destroyed()),
+ this, SIGNAL(dataChanged()));
+
+ emit dataChanged();
+}
+
+void NetworkItem::attachIrcChannel(const QString &channelName) {
+ IrcChannel *ircChannel = _network->ircChannel(channelName);
+ if(!ircChannel) {
+ qWarning() << "NetworkItem::attachIrcChannel(): unkown Channel" << channelName;
+ return;
+ }
+
+ BufferItem *bufferItem;
+ for(int i = 0; i < childCount(); i++) {
+ bufferItem = qobject_cast<BufferItem *>(child(i));
+ if(bufferItem->bufferName().toLower() == ircChannel->name().toLower()) {
+ 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);
+}
+
+
+QString NetworkItem::toolTip(int column) const {
+ Q_UNUSED(column);
+
+ QStringList toolTip(QString("<b>%1</b>").arg(networkName()));
+ toolTip.append(QString("Server: %1").arg(currentServer()));
+ toolTip.append(QString("Users: %1").arg(nickCount()));
+
+ return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
+}
/*****************************************
* Fancy Buffer Items
return qobject_cast<NetworkItem *>(parent())->isActive();
}
-bool BufferItem::setActivityLevel(Buffer::ActivityLevel level) {
- _activity = level;
- emit dataChanged();
- return true;
+void BufferItem::setActivityLevel(Buffer::ActivityLevel level) {
+ if(_activity != level) {
+ _activity = level;
+ emit dataChanged();
+ }
}
void BufferItem::updateActivityLevel(Buffer::ActivityLevel level) {
}
bool BufferItem::setData(int column, const QVariant &value, int role) {
+ qDebug() << "BufferItem::setData(int column, const QVariant &value, int role):" << this << column << value << role;
switch(role) {
case NetworkModel::BufferActivityRole:
- return setActivityLevel((Buffer::ActivityLevel)value.toInt());
+ setActivityLevel((Buffer::ActivityLevel)value.toInt());
+ return true;
default:
return PropertyMapItem::setData(column, value, role);
}
Q_ASSERT(_ircChannel);
QHash<UserCategoryItem *, QList<IrcUser *> > categories;
+
+ int categoryId = -1;
+ UserCategoryItem *categoryItem = 0;
+
foreach(IrcUser *ircUser, ircUsers) {
- UserCategoryItem *categoryItem;
- int categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser));
- if(!(categoryItem = qobject_cast<UserCategoryItem *>(childById(qHash(categoryId))))) {
+ categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser));
+ categoryItem = qobject_cast<UserCategoryItem *>(childById(qHash(categoryId)));
+ if(!categoryItem) {
categoryItem = new UserCategoryItem(categoryId, this);
categories[categoryItem] = QList<IrcUser *>();
newChild(categoryItem);
return;
}
- bool success = false;
UserCategoryItem *categoryItem = 0;
for(int i = 0; i < childCount(); i++) {
categoryItem = qobject_cast<UserCategoryItem *>(child(i));
- if(success = categoryItem->removeUser(ircUser)) {
+ if(categoryItem->removeUser(ircUser)) {
if(categoryItem->childCount() == 0)
removeChild(i);
break;
}
}
-
- if(!success) {
- qDebug() << "didn't find User:" << ircUser << qHash(ircUser);
- qDebug() << "==== Childlist for Item:" << this << id() << bufferName() << "====";
- for(int i = 0; i < childCount(); i++) {
- categoryItem = qobject_cast<UserCategoryItem *>(child(i));
- categoryItem->dumpChildList();
- }
- qDebug() << "==== End Of Childlist for Item:" << this << id() << bufferName() << "====";
- }
- Q_ASSERT(success);
}
void BufferItem::userModeChanged(IrcUser *ircUser) {
Q_ASSERT(_ircChannel);
- UserCategoryItem *categoryItem;
int categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser));
- if((categoryItem = qobject_cast<UserCategoryItem *>(childById(qHash(categoryId)))) && categoryItem->childById(qHash(ircUser)))
+ UserCategoryItem *categoryItem = qobject_cast<UserCategoryItem *>(childById(qHash(categoryId)));
+
+ if(categoryItem && categoryItem->childById(qHash(ircUser)))
return; // already in the right category;
-
- removeUserFromCategory(ircUser);
- addUserToCategory(ircUser);
+
+ // find the item that needs reparenting
+ IrcUserItem *ircUserItem = 0;
+ for(int i = 0; i < childCount(); i++) {
+ UserCategoryItem *categoryItem = qobject_cast<UserCategoryItem *>(child(i));
+ IrcUserItem *userItem = qobject_cast<IrcUserItem *>(categoryItem->childById(qHash(ircUser)));
+ if(userItem) {
+ ircUserItem = userItem;
+ break;
+ }
+ }
+
+ if(!ircUserItem) {
+ qWarning() << "BufferItem::userModeChanged(IrcUser *): unable to determine old category of" << ircUser;
+ return;
+ }
+ ircUserItem->reParent(categoryItem);
}
QString BufferItem::toolTip(int column) const {
toolTip.append(tr("<b>Topic:</b> %1").arg(_topic));
}
}
+ if(_ircChannel) {
+ QString channelMode = _ircChannel->channelModeString(); // channelModeString is compiled on the fly -> thus cache the result
+ if(!channelMode.isEmpty())
+ toolTip.append(tr("<b>Mode:</b> %1").arg(channelMode));
+ }
} else {
toolTip.append(tr("Not active <br /> Double-click to join"));
}
return _lastSeen;
}
*/
-/*****************************************
-* Network Items
-*****************************************/
-NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent)
- : PropertyMapItem(QList<QString>() << "networkName" << "currentServer" << "nickCount", parent),
- _networkId(netid)
-{
- setFlags(Qt::ItemIsEnabled);
-}
-
-QVariant NetworkItem::data(int column, int role) const {
- switch(role) {
- case NetworkModel::NetworkIdRole:
- return qVariantFromValue(_networkId);
- case NetworkModel::ItemTypeRole:
- return NetworkModel::NetworkItemType;
- case NetworkModel::ItemActiveRole:
- return isActive();
- default:
- return PropertyMapItem::data(column, role);
- }
-}
-
-quint64 NetworkItem::id() const {
- return qHash(_networkId);
-}
-
-bool NetworkItem::isActive() const {
- if(_network)
- return _network->isConnected();
- else
- return false;
-}
-
-QString NetworkItem::networkName() const {
- if(_network)
- return _network->networkName();
- else
- return QString();
-}
-
-QString NetworkItem::currentServer() const {
- if(_network)
- return _network->currentServer();
- else
- return QString();
-}
-
-int NetworkItem::nickCount() const {
- if(_network)
- return _network->ircUsers().count();
- else
- return 0;
-}
-
-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(QString)),
- this, SLOT(attachIrcChannel(QString)));
- connect(network, SIGNAL(connectedSet(bool)),
- this, SIGNAL(dataChanged()));
- connect(network, SIGNAL(destroyed()),
- this, SIGNAL(dataChanged()));
-
- emit dataChanged();
-}
-
-void NetworkItem::attachIrcChannel(const QString &channelName) {
- IrcChannel *ircChannel = _network->ircChannel(channelName);
- if(!ircChannel) {
- qWarning() << "NetworkItem::attachIrcChannel(): unkown Channel" << channelName;
- return;
- }
-
- BufferItem *bufferItem;
- for(int i = 0; i < childCount(); i++) {
- bufferItem = qobject_cast<BufferItem *>(child(i));
- if(bufferItem->bufferName().toLower() == ircChannel->name().toLower()) {
- 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);
-}
-
-
-QString NetworkItem::toolTip(int column) const {
- Q_UNUSED(column);
-
- QStringList toolTip(QString("<b>%1</b>").arg(networkName()));
- toolTip.append(QString("Server: %1").arg(currentServer()));
- toolTip.append(QString("Users: %1").arg(nickCount()));
-
- return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
-}
/*****************************************
: PropertyMapItem(QStringList() << "categoryName", parent),
_category(category)
{
-
}
// caching this makes no sense, since we display the user number dynamically
foreach(IrcUser *ircUser, ircUsers)
userItems << new IrcUserItem(ircUser, this);
newChilds(userItems);
+ emit dataChanged(0);
}
bool UserCategoryItem::removeUser(IrcUser *ircUser) {
- return removeChildById(qHash(ircUser));
+ bool success = removeChildById(qHash(ircUser));
+ if(success)
+ emit dataChanged(0);
+ return success;
}
int UserCategoryItem::categoryFromModes(const QString &modes) {
return false;
}
-IrcUser *IrcUserItem::ircUser() {
- return _ircUser;
-}
-
-quint64 IrcUserItem::id() const {
- return _id;
-}
-
QVariant IrcUserItem::data(int column, int role) const {
switch(role) {
case NetworkModel::ItemActiveRole: