X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fnetworkmodel.cpp;h=7b7f5bc458e0e71719e1c7bdc1459f17453b6afe;hp=582b0084e1bd7454851d95eeeefeffb26a26b7c7;hb=3a3e844f9fcfd12235a0086af75ecd503b621ef4;hpb=9f91e0dd3c4eb5c2e2dedfc8d36a068d433d51b1 diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 582b0084..7b7f5bc4 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -22,9 +22,7 @@ #include #include -#if QT_VERSION < 0x050000 -#include // for Qt::escape() -#endif +#include #include "buffermodel.h" #include "buffersettings.h" @@ -40,9 +38,9 @@ * Network Items *****************************************/ NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent) - : PropertyMapItem(QList() << "networkName" << "currentServer" << "nickCount", parent), + : PropertyMapItem(parent), _networkId(netid), - _statusBufferItem(0) + _statusBufferItem(nullptr) { // DO NOT EMIT dataChanged() DIRECTLY IN NetworkItem // use networkDataChanged() instead. Otherwise you will end up in a infinite loop @@ -53,6 +51,13 @@ NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent) } +QStringList NetworkItem::propertyOrder() const +{ + static QStringList order{"networkName", "currentServer", "nickCount"}; + return order; +} + + QVariant NetworkItem::data(int column, int role) const { switch (role) { @@ -79,11 +84,7 @@ QString NetworkItem::escapeHTML(const QString &string, bool useNonbreakingSpaces { // QString.replace() doesn't guarantee the source string will remain constant. // Use a local variable to avoid compiler errors. -#if QT_VERSION < 0x050000 - QString formattedString = Qt::escape(string); -#else QString formattedString = string.toHtmlEscaped(); -#endif return (useNonbreakingSpaces ? formattedString.replace(" ", " ") : formattedString); } @@ -91,7 +92,7 @@ QString NetworkItem::escapeHTML(const QString &string, bool useNonbreakingSpaces // FIXME shouldn't we check the bufferItemCache here? BufferItem *NetworkItem::findBufferItem(BufferId bufferId) { - BufferItem *bufferItem = 0; + BufferItem *bufferItem = nullptr; for (int i = 0; i < childCount(); i++) { bufferItem = qobject_cast(child(i)); @@ -100,7 +101,7 @@ BufferItem *NetworkItem::findBufferItem(BufferId bufferId) if (bufferItem->bufferId() == bufferId) return bufferItem; } - return 0; + return nullptr; } @@ -147,8 +148,12 @@ BufferItem *NetworkItem::bufferItem(const BufferInfo &bufferInfo) } BufferSyncer *bufferSyncer = Client::bufferSyncer(); - if (bufferSyncer) - bufferItem->addActivity(bufferSyncer->activity(bufferItem->bufferId()), false); + if (bufferSyncer) { + bufferItem->addActivity( + bufferSyncer->activity(bufferItem->bufferId()), + bufferSyncer->highlightCount(bufferItem->bufferId()) > 0 + ); + } return bufferItem; } @@ -196,7 +201,7 @@ void NetworkItem::attachIrcChannel(IrcChannel *ircChannel) void NetworkItem::attachIrcUser(IrcUser *ircUser) { - QueryBufferItem *queryItem = 0; + QueryBufferItem *queryItem = nullptr; for (int i = 0; i < childCount(); i++) { queryItem = qobject_cast(child(i)); if (!queryItem) @@ -260,7 +265,7 @@ void NetworkItem::onBeginRemoveChilds(int start, int end) for (int i = start; i <= end; i++) { StatusBufferItem *statusBufferItem = qobject_cast(child(i)); if (statusBufferItem) { - _statusBufferItem = 0; + _statusBufferItem = nullptr; break; } } @@ -269,7 +274,7 @@ void NetworkItem::onBeginRemoveChilds(int start, int end) void NetworkItem::onNetworkDestroyed() { - _network = 0; + _network = nullptr; emit networkDataChanged(); removeAllChilds(); } @@ -278,15 +283,22 @@ void NetworkItem::onNetworkDestroyed() /***************************************** * Fancy Buffer Items *****************************************/ -BufferItem::BufferItem(const BufferInfo &bufferInfo, AbstractTreeItem *parent) - : PropertyMapItem(QStringList() << "bufferName" << "topic" << "nickCount", parent), - _bufferInfo(bufferInfo), +BufferItem::BufferItem(BufferInfo bufferInfo, AbstractTreeItem *parent) + : PropertyMapItem(parent), + _bufferInfo(std::move(bufferInfo)), _activity(BufferInfo::NoActivity) { setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); } +QStringList BufferItem::propertyOrder() const +{ + static QStringList order{"bufferName", "topic", "nickCount"}; + return order; +} + + void BufferItem::setActivityLevel(BufferInfo::ActivityLevel level) { if (_activity != level) { @@ -487,7 +499,7 @@ QString StatusBufferItem::toolTip(int column) const *****************************************/ QueryBufferItem::QueryBufferItem(const BufferInfo &bufferInfo, NetworkItem *parent) : BufferItem(bufferInfo, parent), - _ircUser(0) + _ircUser(nullptr) { setFlags(flags() | Qt::ItemIsDropEnabled | Qt::ItemIsEditable); @@ -637,8 +649,8 @@ QString QueryBufferItem::toolTip(int column) const NetworkItem::escapeHTML(tr("Identified for this nick")), !accountAdded); // Don't add the account row again if information's already added via account-notify - // Mark the row as added - accountAdded = true; + // Not used further down... + // accountAdded = true; } else { addRow(NetworkItem::escapeHTML(tr("Service Reply"), true), NetworkItem::escapeHTML(_ircUser->whoisServiceReply()), @@ -682,7 +694,7 @@ void QueryBufferItem::setIrcUser(IrcUser *ircUser) return; if (_ircUser) { - disconnect(_ircUser, 0, this, 0); + disconnect(_ircUser, nullptr, this, nullptr); } if (ircUser) { @@ -705,10 +717,10 @@ void QueryBufferItem::removeIrcUser() // SIGNAL destroyed(QObject*) to SLOT removeIrcUser(). // This fixes removing an active IrcUser if the user had quit then rejoined in a nonstandard // manner (e.g. updateNickFromHost calling newIrcUser, triggered by an away-notify message). - disconnect(_ircUser, 0, this, 0); + disconnect(_ircUser, nullptr, this, nullptr); // Clear IrcUser (only set to 0 if not already 0) - _ircUser = 0; + _ircUser = nullptr; // Only emit dataChanged() if data actually changed. This might serve as a small // optimization, but it can be moved outside the if statement if other behavior depends on @@ -723,7 +735,7 @@ void QueryBufferItem::removeIrcUser() *****************************************/ ChannelBufferItem::ChannelBufferItem(const BufferInfo &bufferInfo, AbstractTreeItem *parent) : BufferItem(bufferInfo, parent), - _ircChannel(0) + _ircChannel(nullptr) { setFlags(flags() | Qt::ItemIsDropEnabled); } @@ -792,7 +804,7 @@ void ChannelBufferItem::attachIrcChannel(IrcChannel *ircChannel) { if (_ircChannel) { qWarning() << Q_FUNC_INFO << "IrcChannel already set; cleanup failed!?"; - disconnect(_ircChannel, 0, this, 0); + disconnect(_ircChannel, nullptr, this, nullptr); } _ircChannel = ircChannel; @@ -836,8 +848,8 @@ QString ChannelBufferItem::nickChannelModes(const QString &nick) const void ChannelBufferItem::ircChannelParted() { Q_CHECK_PTR(_ircChannel); - disconnect(_ircChannel, 0, this, 0); - _ircChannel = 0; + disconnect(_ircChannel, nullptr, this, nullptr); + _ircChannel = nullptr; emit dataChanged(); removeAllChilds(); } @@ -846,7 +858,7 @@ void ChannelBufferItem::ircChannelParted() void ChannelBufferItem::ircChannelDestroyed() { if (_ircChannel) { - _ircChannel = 0; + _ircChannel = nullptr; emit dataChanged(); removeAllChilds(); } @@ -862,7 +874,7 @@ void ChannelBufferItem::join(const QList &ircUsers) UserCategoryItem *ChannelBufferItem::findCategoryItem(int categoryId) { - UserCategoryItem *categoryItem = 0; + UserCategoryItem *categoryItem = nullptr; for (int i = 0; i < childCount(); i++) { categoryItem = qobject_cast(child(i)); @@ -871,7 +883,7 @@ UserCategoryItem *ChannelBufferItem::findCategoryItem(int categoryId) if (categoryItem->categoryId() == categoryId) return categoryItem; } - return 0; + return nullptr; } @@ -888,7 +900,7 @@ void ChannelBufferItem::addUsersToCategory(const QList &ircUsers) QHash > categories; int categoryId = -1; - UserCategoryItem *categoryItem = 0; + UserCategoryItem *categoryItem = nullptr; foreach(IrcUser *ircUser, ircUsers) { categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser)); @@ -916,7 +928,7 @@ void ChannelBufferItem::part(IrcUser *ircUser) return; } - disconnect(ircUser, 0, this, 0); + disconnect(ircUser, nullptr, this, nullptr); removeUserFromCategory(ircUser); emit dataChanged(2); } @@ -931,7 +943,7 @@ void ChannelBufferItem::removeUserFromCategory(IrcUser *ircUser) return; } - UserCategoryItem *categoryItem = 0; + UserCategoryItem *categoryItem = nullptr; for (int i = 0; i < childCount(); i++) { categoryItem = qobject_cast(child(i)); if (categoryItem->removeUser(ircUser)) { @@ -961,7 +973,7 @@ void ChannelBufferItem::userModeChanged(IrcUser *ircUser) } // find the item that needs reparenting - IrcUserItem *ircUserItem = 0; + IrcUserItem *ircUserItem = nullptr; for (int i = 0; i < childCount(); i++) { UserCategoryItem *oldCategoryItem = qobject_cast(child(i)); Q_ASSERT(oldCategoryItem); @@ -988,7 +1000,7 @@ void ChannelBufferItem::userModeChanged(IrcUser *ircUser) const QList UserCategoryItem::categories = QList() << 'q' << 'a' << 'o' << 'h' << 'v'; UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem *parent) - : PropertyMapItem(QStringList() << "categoryName", parent), + : PropertyMapItem(parent), _category(category) { setFlags(Qt::ItemIsEnabled); @@ -997,30 +1009,37 @@ UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem *parent) } +QStringList UserCategoryItem::propertyOrder() const +{ + static QStringList order{"categoryName"}; + return order; +} + + // caching this makes no sense, since we display the user number dynamically QString UserCategoryItem::categoryName() const { int n = childCount(); switch (_category) { case 0: - return tr("%n Owner(s)", 0, n); + return tr("%n Owner(s)", "", n); case 1: - return tr("%n Admin(s)", 0, n); + return tr("%n Admin(s)", "", n); case 2: - return tr("%n Operator(s)", 0, n); + return tr("%n Operator(s)", "", n); case 3: - return tr("%n Half-Op(s)", 0, n); + return tr("%n Half-Op(s)", "", n); case 4: - return tr("%n Voiced", 0, n); + return tr("%n Voiced", "", n); default: - return tr("%n User(s)", 0, n); + return tr("%n User(s)", "", n); } } IrcUserItem *UserCategoryItem::findIrcUser(IrcUser *ircUser) { - IrcUserItem *userItem = 0; + IrcUserItem *userItem = nullptr; for (int i = 0; i < childCount(); i++) { userItem = qobject_cast(child(i)); @@ -1029,7 +1048,7 @@ IrcUserItem *UserCategoryItem::findIrcUser(IrcUser *ircUser) if (userItem->ircUser() == ircUser) return userItem; } - return 0; + return nullptr; } @@ -1090,7 +1109,7 @@ QVariant UserCategoryItem::data(int column, int role) const * Irc User Items *****************************************/ IrcUserItem::IrcUserItem(IrcUser *ircUser, AbstractTreeItem *parent) - : PropertyMapItem(QStringList() << "nickName", parent), + : PropertyMapItem(parent), _ircUser(ircUser) { setObjectName(ircUser->nick()); @@ -1100,6 +1119,13 @@ IrcUserItem::IrcUserItem(IrcUser *ircUser, AbstractTreeItem *parent) } +QStringList IrcUserItem::propertyOrder() const +{ + static QStringList order{"nickName"}; + return order; +} + + QVariant IrcUserItem::data(int column, int role) const { switch (role) { @@ -1204,8 +1230,8 @@ QString IrcUserItem::toolTip(int column) const NetworkItem::escapeHTML(tr("Identified for this nick")), !accountAdded); // Don't add the account row again if information's already added via account-notify - // Mark the row as added - accountAdded = true; + // Not used further down... + // accountAdded = true; } else { addRow(NetworkItem::escapeHTML(tr("Service Reply"), true), NetworkItem::escapeHTML(_ircUser->whoisServiceReply()), @@ -1292,7 +1318,7 @@ bool NetworkModel::isBufferIndex(const QModelIndex &index) const int NetworkModel::networkRow(NetworkId networkId) const { - NetworkItem *netItem = 0; + NetworkItem *netItem = nullptr; for (int i = 0; i < rootItem->childCount(); i++) { netItem = qobject_cast(rootItem->child(i)); if (!netItem) @@ -1318,7 +1344,7 @@ NetworkItem *NetworkModel::findNetworkItem(NetworkId networkId) const { int netRow = networkRow(networkId); if (netRow == -1) - return 0; + return nullptr; else return qobject_cast(rootItem->child(netRow)); } @@ -1328,7 +1354,7 @@ NetworkItem *NetworkModel::networkItem(NetworkId networkId) { NetworkItem *netItem = findNetworkItem(networkId); - if (netItem == 0) { + if (netItem == nullptr) { netItem = new NetworkItem(networkId, rootItem); rootItem->newChild(netItem); } @@ -1359,7 +1385,7 @@ BufferItem *NetworkModel::findBufferItem(BufferId bufferId) const if (_bufferItemCache.contains(bufferId)) return _bufferItemCache[bufferId]; else - return 0; + return nullptr; } @@ -1538,7 +1564,7 @@ void NetworkModel::updateBufferActivity(Message &msg) case Message::Action: if (bufferType(msg.bufferId()) == BufferInfo::ChannelBuffer) { const Network *net = Client::network(msg.bufferInfo().networkId()); - IrcUser *user = net ? net->ircUser(nickFromMask(msg.sender())) : 0; + IrcUser *user = net ? net->ircUser(nickFromMask(msg.sender())) : nullptr; if (user) user->setLastChannelActivity(msg.bufferId(), msg.timestamp()); } @@ -1602,7 +1628,7 @@ const Network *NetworkModel::networkByIndex(const QModelIndex &index) const { QVariant netVariant = index.data(NetworkIdRole); if (!netVariant.isValid()) - return 0; + return nullptr; NetworkId networkId = netVariant.value(); return Client::network(networkId); @@ -1757,3 +1783,12 @@ void NetworkModel::bufferActivityChanged(BufferId bufferId, const Message::Types auto activityVisibleTypesIntersection = activity & visibleTypes; _bufferItem->setActivity(activityVisibleTypesIntersection, false); } + +void NetworkModel::highlightCountChanged(BufferId bufferId, int count) { + auto _bufferItem = findBufferItem(bufferId); + if (!_bufferItem) { + qDebug() << "NetworkModel::highlightCountChanged(): buffer is unknown:" << bufferId; + return; + } + _bufferItem->addActivity(Message::Types{}, count > 0); +}