QVariant NetworkItem::data(int column, int role) const {
switch(role) {
case NetworkModel::BufferIdRole:
+ case NetworkModel::BufferInfoRole:
+ case NetworkModel::BufferTypeRole:
if(childCount())
return child(0)->data(column, role);
else
BufferItem *NetworkItem::findBufferItem(BufferId bufferId) {
BufferItem *bufferItem = 0;
-
+
for(int i = 0; i < childCount(); i++) {
bufferItem = qobject_cast<BufferItem *>(child(i));
if(!bufferItem)
BufferItem *bufferItem = findBufferItem(bufferInfo);
if(bufferItem)
return bufferItem;
-
+
switch(bufferInfo.type()) {
case BufferInfo::StatusBuffer:
bufferItem = new StatusBufferItem(bufferInfo, this);
void NetworkItem::attachNetwork(Network *network) {
if(!network)
return;
-
+
_network = network;
connect(network, SIGNAL(networkNameSet(QString)),
this, SIGNAL(dataChanged()));
connect(network, SIGNAL(destroyed()),
this, SIGNAL(dataChanged()));
-
+
emit dataChanged();
}
}
}
+void BufferItem::clearActivityLevel() {
+ _activity = BufferInfo::NoActivity;
+ _lastSeenMarkerMsgId = _lastSeenMsgId;
+ emit dataChanged();
+}
+
void BufferItem::updateActivityLevel(const Message &msg) {
- if(isCurrentBuffer())
+ if(isCurrentBuffer()) {
return;
+ }
if(msg.flags() & Message::Self) // don't update activity for our own messages
return;
void BufferItem::setLastSeenMsgId(const MsgId &msgId) {
_lastSeenMsgId = msgId;
- setActivityLevel(BufferInfo::NoActivity);
+ if(!isCurrentBuffer()) {
+ _lastSeenMarkerMsgId = msgId;
+ }
+ setActivityLevel(BufferInfo::NoActivity);
}
bool BufferItem::isCurrentBuffer() const {
}
QString QueryBufferItem::toolTip(int column) const {
- // pretty much code duplication of IrcUserItem::toolTip() but inheritance won't solve this...
+ // pretty much code duplication of IrcUserItem::toolTip() but inheritance won't solve this...
Q_UNUSED(column);
QStringList toolTip;
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();
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()));
}
toolTip.append(tr("<b>Channel %1</b>").arg(bufferName()));
if(isActive()) {
- //TODO: add channel modes
+ //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));
+ toolTip.append(tr("<b>Mode:</b> %1").arg(channelMode));
}
-
+
BufferSettings s;
bool showTopic = s.value("DisplayTopicInTooltip", QVariant(false)).toBool();
if(showTopic) {
QString _topic = topic();
if(_topic != "") {
- _topic.replace(QString("<"), QString("<"));
- _topic.replace(QString(">"), QString(">"));
- toolTip.append(QString("<font size='-2'> </font>"));
- toolTip.append(tr("<b>Topic:</b> %1").arg(_topic));
+ _topic = stripFormatCodes(_topic);
+ _topic.replace(QString("<"), QString("<"));
+ _topic.replace(QString(">"), QString(">"));
+ 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 />"));
+ return tr("<p> %1 </p>").arg(toolTip.join("<br />"));
}
void ChannelBufferItem::attachIrcChannel(IrcChannel *ircChannel) {
Q_ASSERT(!_ircChannel && ircChannel);
-
+
_ircChannel = ircChannel;
connect(ircChannel, SIGNAL(topicSet(QString)),
if(!ircChannel->ircUsers().isEmpty())
join(ircChannel->ircUsers());
-
+
emit dataChanged();
}
UserCategoryItem *ChannelBufferItem::findCategoryItem(int categoryId) {
UserCategoryItem *categoryItem = 0;
-
+
for(int i = 0; i < childCount(); i++) {
categoryItem = qobject_cast<UserCategoryItem *>(child(i));
if(!categoryItem)
int categoryId = -1;
UserCategoryItem *categoryItem = 0;
-
+
foreach(IrcUser *ircUser, ircUsers) {
categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser));
categoryItem = findCategoryItem(categoryId);
int categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser));
UserCategoryItem *categoryItem = findCategoryItem(categoryId);
-
+
if(categoryItem) {
if(categoryItem->findIrcUser(ircUser)) {
return; // already in the right category;
: PropertyMapItem(QStringList() << "nickName", parent),
_ircUser(ircUser)
{
- setObjectName(ircUser->nick());
+ setObjectName(ircUser->nick());
connect(ircUser, SIGNAL(destroyed()), this, SLOT(ircUserDestroyed()));
connect(ircUser, SIGNAL(nickSet(QString)), this, SIGNAL(dataChanged()));
connect(ircUser, SIGNAL(awaySet(bool)), this, SIGNAL(dataChanged()));
// no self merges (would kill us)
if(bufferId == parent.data(BufferIdRole).value<BufferId>())
- return false;
+ return false;
NetworkItem *netItem = findNetworkItem(netId);
Q_ASSERT(netItem);
// source must be a query too
if(bufferItem->bufferType() != BufferInfo::QueryBuffer)
return false;
-
+
// TODO: warn user about buffermerge!
qDebug() << "merging" << bufferId << parent.data(BufferIdRole).value<BufferId>();
removeRow(parent.row(), parent.parent());
-
+
return true;
}
buffItem->parent()->removeChild(buffItem);
}
-MsgId NetworkModel::lastSeenMsgId(BufferId bufferId) {
+MsgId NetworkModel::lastSeenMsgId(BufferId bufferId) const {
if(!_bufferItemCache.contains(bufferId))
return MsgId();
return _bufferItemCache[bufferId]->lastSeenMsgId();
}
+MsgId NetworkModel::lastSeenMarkerMsgId(BufferId bufferId) const {
+ if(!_bufferItemCache.contains(bufferId))
+ return MsgId();
+
+ return _bufferItemCache[bufferId]->lastSeenMarkerMsgId();
+}
+
void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId) {
BufferItem *bufferItem = findBufferItem(bufferId);
if(!bufferItem) {
}
void NetworkModel::updateBufferActivity(const Message &msg) {
- bufferItem(msg.bufferInfo())->updateActivityLevel(msg);
+ BufferItem *item = bufferItem(msg.bufferInfo());
+ item->updateActivityLevel(msg);
+ if(item->isCurrentBuffer())
+ emit setLastSeenMsg(item->bufferId(), msg.msgId());
}
void NetworkModel::setBufferActivity(const BufferId &bufferId, BufferInfo::ActivityLevel level) {
bufferItem->setActivityLevel(level);
}
+void NetworkModel::clearBufferActivity(const BufferId &bufferId) {
+ BufferItem *bufferItem = findBufferItem(bufferId);
+ if(!bufferItem) {
+ qDebug() << "NetworkModel::clearBufferActivity(): buffer is unknown:" << bufferId;
+ return;
+ }
+ bufferItem->clearActivityLevel();
+}
+
const Network *NetworkModel::networkByIndex(const QModelIndex &index) const {
QVariant netVariant = index.data(NetworkIdRole);
if(!netVariant.isValid())
void NetworkModel::checkForRemovedBuffers(const QModelIndex &parent, int start, int end) {
if(parent.data(ItemTypeRole) != NetworkItemType)
return;
-
+
for(int row = start; row <= end; row++) {
_bufferItemCache.remove(parent.child(row, 0).data(BufferIdRole).value<BufferId>());
}
}
}
-QString NetworkModel::bufferName(BufferId bufferId) {
+QString NetworkModel::bufferName(BufferId bufferId) const {
if(!_bufferItemCache.contains(bufferId))
return QString();
return _bufferItemCache[bufferId]->bufferName();
}
-BufferInfo::Type NetworkModel::bufferType(BufferId bufferId) {
+BufferInfo::Type NetworkModel::bufferType(BufferId bufferId) const {
if(!_bufferItemCache.contains(bufferId))
return BufferInfo::InvalidBuffer;
return _bufferItemCache[bufferId]->bufferType();
}
-BufferInfo NetworkModel::bufferInfo(BufferId bufferId) {
+BufferInfo NetworkModel::bufferInfo(BufferId bufferId) const {
if(!_bufferItemCache.contains(bufferId))
return BufferInfo();
return _bufferItemCache[bufferId]->bufferInfo();
}
-NetworkId NetworkModel::networkId(BufferId bufferId) {
+NetworkId NetworkModel::networkId(BufferId bufferId) const {
if(!_bufferItemCache.contains(bufferId))
return NetworkId();
return NetworkId();
}
-QString NetworkModel::networkName(BufferId bufferId) {
+QString NetworkModel::networkName(BufferId bufferId) const {
if(!_bufferItemCache.contains(bufferId))
return QString();
else
return QString();
}
+
+BufferId NetworkModel::bufferId(NetworkId networkId, const QString &bufferName) const {
+ foreach(BufferItem *item, _bufferItemCache) {
+ NetworkItem *netItem = qobject_cast<NetworkItem *>(item->parent());
+ if(netItem && netItem->networkId() == networkId && item->bufferName() == bufferName)
+ return item->bufferId();
+ }
+ return BufferId();
+}