+
+ IrcUser *ircUser = net->ircUser(bufferInfo.bufferName());
+ setIrcUser(ircUser);
+}
+
+QVariant QueryBufferItem::data(int column, int role) const {
+ switch(role) {
+ case Qt::EditRole:
+ return BufferItem::data(column, Qt::DisplayRole);
+ case NetworkModel::IrcUserRole:
+ return QVariant::fromValue<QObject *>(_ircUser);
+ case NetworkModel::UserAwayRole:
+ return (bool)_ircUser ? _ircUser->isAway() : false;
+ default:
+ return BufferItem::data(column, role);
+ }
+}
+
+bool QueryBufferItem::setData(int column, const QVariant &value, int role) {
+ if(column != 0)
+ return BufferItem::setData(column, value, role);
+
+ switch(role) {
+ case Qt::EditRole:
+ {
+ QString newName = value.toString();
+ if(!newName.isEmpty()) {
+ Client::renameBuffer(bufferId(), newName);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ break;
+ default:
+ return BufferItem::setData(column, value, role);
+ }
+}
+
+void QueryBufferItem::setBufferName(const QString &name) {
+ BufferItem::setBufferName(name);
+ NetworkId netId = data(0, NetworkModel::NetworkIdRole).value<NetworkId>();
+ 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);
+ QStringList toolTip;
+
+ toolTip.append(tr("<b>Query with %1</b>").arg(bufferName()));
+
+ if(_ircUser) {
+ if(_ircUser->userModes() != "") toolTip[0].append(QString(" (%1)").arg(_ircUser->userModes()));
+ if(_ircUser->isAway()) {
+ toolTip[0].append(QString(" (away%1)").arg(!_ircUser->awayMessage().isEmpty() ? (QString(" ") + _ircUser->awayMessage()) : QString()));
+ }
+ if(!_ircUser->realName().isEmpty()) toolTip.append(_ircUser->realName());
+ if(!_ircUser->ircOperator().isEmpty()) toolTip.append(QString("%1 %2").arg(_ircUser->nick()).arg(_ircUser->ircOperator()));
+ if(!_ircUser->suserHost().isEmpty()) toolTip.append(_ircUser->suserHost());
+ if(!_ircUser->whoisServiceReply().isEmpty()) toolTip.append(_ircUser->whoisServiceReply());
+
+ toolTip.append(_ircUser->hostmask().remove(0, _ircUser->hostmask().indexOf("!")+1));
+
+ if(_ircUser->idleTime().isValid()) {
+ QDateTime now = QDateTime::currentDateTime();
+ QDateTime idle = _ircUser->idleTime();
+ int idleTime = idle.secsTo(now);
+ toolTip.append(tr("idling since %1").arg(secondsToString(idleTime)));
+ }
+ if(_ircUser->loginTime().isValid()) {
+ toolTip.append(tr("login time: %1").arg(_ircUser->loginTime().toString()));
+ }
+
+ if(!_ircUser->server().isEmpty()) toolTip.append(tr("server: %1").arg(_ircUser->server()));
+ }
+
+ return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
+}
+
+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;
+ emit dataChanged();
+}
+
+void QueryBufferItem::removeIrcUser() {
+ _ircUser = 0;
+ emit dataChanged();
+}
+
+/*****************************************
+* ChannelBufferItem
+*****************************************/
+ChannelBufferItem::ChannelBufferItem(const BufferInfo &bufferInfo, AbstractTreeItem *parent)
+ : BufferItem(bufferInfo, parent),
+ _ircChannel(0)
+{
+}
+
+QVariant ChannelBufferItem::data(int column, int role) const {
+ switch(role) {
+ case NetworkModel::IrcChannelRole:
+ return QVariant::fromValue<QObject *>(_ircChannel);
+ default:
+ return BufferItem::data(column, role);
+ }
+}
+
+QString ChannelBufferItem::toolTip(int column) const {
+ Q_UNUSED(column);
+ QStringList toolTip;
+
+ toolTip.append(tr("<b>Channel %1</b>").arg(Qt::escape(bufferName())));
+ if(isActive()) {
+ //TODO: add channel modes
+ toolTip.append(tr("<b>Users:</b> %1").arg(nickCount()));
+ 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));
+ }
+
+ ItemViewSettings s;
+ bool showTopic = s.displayTopicInTooltip();
+ if(showTopic) {
+ QString _topic = topic();
+ if(_topic != "") {
+ _topic = stripFormatCodes(_topic);
+ _topic = Qt::escape(_topic);
+ toolTip.append(QString("<font size='-2'> </font>"));
+ toolTip.append(tr("<b>Topic:</b> %1").arg(_topic));
+ }
+ }
+ } else {
+ toolTip.append(tr("Not active <br /> Double-click to join"));
+ }
+
+ return tr("<p> %1 </p>").arg(toolTip.join("<br />"));
+}
+
+void ChannelBufferItem::attachIrcChannel(IrcChannel *ircChannel) {
+ Q_ASSERT(!_ircChannel && ircChannel);
+