X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fnetworkmodel.cpp;h=6e6397247322d3b3fdf1adc25a331f6c1dfbf1f2;hp=b52ab3a2316f5e6960eace408ececc6064b0df94;hb=f824db0e31b54969e0b7fa0b5405b1e9173d482c;hpb=ff87e964d7bd93f7a851d570c27b97943578a734 diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index b52ab3a2..6e639724 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -39,7 +39,11 @@ NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent) : PropertyMapItem(QList() << "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 { @@ -47,6 +51,7 @@ QVariant NetworkItem::data(int column, int role) const { case NetworkModel::BufferIdRole: case NetworkModel::BufferInfoRole: case NetworkModel::BufferTypeRole: + case NetworkModel::BufferActivityRole: if(childCount()) return child(0)->data(column, role); else @@ -84,6 +89,9 @@ BufferItem *NetworkItem::bufferItem(const BufferInfo &bufferInfo) { 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); @@ -114,11 +122,11 @@ void NetworkItem::attachNetwork(Network *network) { connect(network, SIGNAL(ircUserAdded(IrcUser *)), this, SLOT(attachIrcUser(IrcUser *))); connect(network, SIGNAL(connectedSet(bool)), - this, SIGNAL(dataChanged())); + this, SIGNAL(networkDataChanged())); connect(network, SIGNAL(destroyed()), - this, SIGNAL(dataChanged())); + this, SIGNAL(networkDataChanged())); - emit dataChanged(); + emit networkDataChanged(); } void NetworkItem::attachIrcChannel(IrcChannel *ircChannel) { @@ -143,7 +151,7 @@ void NetworkItem::attachIrcUser(IrcUser *ircUser) { continue; if(queryItem->bufferName().toLower() == ircUser->nick().toLower()) { - queryItem->attachIrcUser(ircUser); + queryItem->setIrcUser(ircUser); break; } } @@ -151,12 +159,12 @@ void NetworkItem::attachIrcUser(IrcUser *ircUser) { void NetworkItem::setNetworkName(const QString &networkName) { Q_UNUSED(networkName); - emit dataChanged(0); + emit networkDataChanged(0); } void NetworkItem::setCurrentServer(const QString &serverName) { Q_UNUSED(serverName); - emit dataChanged(1); + emit networkDataChanged(1); } @@ -282,8 +290,6 @@ QString BufferItem::toolTip(int column) const { StatusBufferItem::StatusBufferItem(const BufferInfo &bufferInfo, NetworkItem *parent) : BufferItem(bufferInfo, parent) { - Q_ASSERT(parent); - connect(parent, SIGNAL(dataChanged()), this, SIGNAL(dataChanged())); } QString StatusBufferItem::toolTip(int column) const { @@ -310,8 +316,7 @@ QueryBufferItem::QueryBufferItem(const BufferInfo &bufferInfo, NetworkItem *pare return; IrcUser *ircUser = net->ircUser(bufferInfo.bufferName()); - if(ircUser) - attachIrcUser(ircUser); + setIrcUser(ircUser); } QVariant QueryBufferItem::data(int column, int role) const { @@ -346,6 +351,14 @@ bool QueryBufferItem::setData(int column, const QVariant &value, int role) { } } +void QueryBufferItem::setBufferName(const QString &name) { + BufferItem::setBufferName(name); + NetworkId netId = data(0, NetworkModel::NetworkIdRole).value(); + const Network *net = Client::network(netId); + if(net) + setIrcUser(net->ircUser(name)); +} + QString QueryBufferItem::toolTip(int column) const { // pretty much code duplication of IrcUserItem::toolTip() but inheritance won't solve this... Q_UNUSED(column); @@ -381,14 +394,24 @@ QString QueryBufferItem::toolTip(int column) const { return QString("

%1

").arg(toolTip.join("
")); } -void QueryBufferItem::attachIrcUser(IrcUser *ircUser) { +void QueryBufferItem::setIrcUser(IrcUser *ircUser) { + if(_ircUser == ircUser) + return; + + if(_ircUser) { + disconnect(_ircUser, 0, this, 0); + } + + if(ircUser) { + connect(ircUser, SIGNAL(quited()), this, SLOT(removeIrcUser())); + connect(ircUser, SIGNAL(awaySet(bool)), this, SIGNAL(dataChanged())); + } + _ircUser = ircUser; - connect(_ircUser, SIGNAL(quited()), this, SLOT(ircUserQuited())); - connect(_ircUser, SIGNAL(awaySet(bool)), this, SIGNAL(dataChanged())); emit dataChanged(); } -void QueryBufferItem::ircUserQuited() { +void QueryBufferItem::removeIrcUser() { _ircUser = 0; emit dataChanged(); }