X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fnetworkmodel.cpp;h=752eb1e900fb5c685d53fa1efff1336f7aae4fee;hp=147605c7d31fe52d78d1289d9fb3365f2fcb6585;hb=c1cf157116de7fc3da96203aa6f03c38c7ebb650;hpb=78decd5f8d1a149fc0e62e01bd6b2886e0feadfe diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 147605c7..752eb1e9 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 * @@ -20,38 +20,42 @@ #include "networkmodel.h" +#include + #include #include -#if QT_VERSION < 0x050000 -#include // for Qt::escape() -#endif #include "buffermodel.h" #include "buffersettings.h" +#include "buffersyncer.h" #include "client.h" #include "clientignorelistmanager.h" #include "clientsettings.h" #include "ircchannel.h" #include "network.h" #include "signalproxy.h" -#include "buffersyncer.h" /***************************************** -* Network Items -*****************************************/ -NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent) - : PropertyMapItem(QList() << "networkName" << "currentServer" << "nickCount", parent), - _networkId(netid), - _statusBufferItem(0) + * Network Items + *****************************************/ +NetworkItem::NetworkItem(const NetworkId& netid, AbstractTreeItem* parent) + : PropertyMapItem(parent) + , _networkId(netid) + , _statusBufferItem(nullptr) { // 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))); - connect(this, SIGNAL(beginRemoveChilds(int, int)), this, SLOT(onBeginRemoveChilds(int, int))); + connect(this, &NetworkItem::networkDataChanged, this, &NetworkItem::dataChanged); + connect(this, &NetworkItem::beginRemoveChilds, this, &NetworkItem::onBeginRemoveChilds); } +QStringList NetworkItem::propertyOrder() const +{ + static QStringList order{"networkName", "currentServer", "nickCount"}; + return order; +} QVariant NetworkItem::data(int column, int role) const { @@ -75,38 +79,32 @@ QVariant NetworkItem::data(int column, int role) const } } -QString NetworkItem::escapeHTML(const QString &string, bool useNonbreakingSpaces) +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); } - // FIXME shouldn't we check the bufferItemCache here? -BufferItem *NetworkItem::findBufferItem(BufferId bufferId) +BufferItem* NetworkItem::findBufferItem(BufferId bufferId) { - BufferItem *bufferItem = 0; + BufferItem* bufferItem = nullptr; for (int i = 0; i < childCount(); i++) { - bufferItem = qobject_cast(child(i)); + bufferItem = qobject_cast(child(i)); if (!bufferItem) continue; if (bufferItem->bufferId() == bufferId) return bufferItem; } - return 0; + return nullptr; } - -BufferItem *NetworkItem::bufferItem(const BufferInfo &bufferInfo) +BufferItem* NetworkItem::bufferItem(const BufferInfo& bufferInfo) { - BufferItem *bufferItem = findBufferItem(bufferInfo); + BufferItem* bufferItem = findBufferItem(bufferInfo); if (bufferItem) return bufferItem; @@ -114,9 +112,9 @@ BufferItem *NetworkItem::bufferItem(const BufferInfo &bufferInfo) case BufferInfo::StatusBuffer: _statusBufferItem = new StatusBufferItem(bufferInfo, this); bufferItem = _statusBufferItem; - 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))); + disconnect(this, &NetworkItem::networkDataChanged, this, &NetworkItem::dataChanged); + connect(this, &NetworkItem::networkDataChanged, bufferItem, &BufferItem::dataChanged); + connect(bufferItem, &BufferItem::dataChanged, this, &NetworkItem::dataChanged); break; case BufferInfo::ChannelBuffer: bufferItem = new ChannelBufferItem(bufferInfo, this); @@ -132,57 +130,48 @@ BufferItem *NetworkItem::bufferItem(const BufferInfo &bufferInfo) // postprocess... this is necessary because Qt doesn't seem to like adding children which already have children on their own switch (bufferInfo.type()) { - case BufferInfo::ChannelBuffer: - { - ChannelBufferItem *channelBufferItem = static_cast(bufferItem); + case BufferInfo::ChannelBuffer: { + auto* channelBufferItem = static_cast(bufferItem); if (_network) { - IrcChannel *ircChannel = _network->ircChannel(bufferInfo.bufferName()); + IrcChannel* ircChannel = _network->ircChannel(bufferInfo.bufferName()); if (ircChannel) channelBufferItem->attachIrcChannel(ircChannel); } - } - break; + } break; default: break; } - BufferSyncer *bufferSyncer = Client::bufferSyncer(); - if (bufferSyncer) - bufferItem->addActivity(bufferSyncer->activity(bufferItem->bufferId()), false); + BufferSyncer* bufferSyncer = Client::bufferSyncer(); + if (bufferSyncer) { + bufferItem->addActivity(bufferSyncer->activity(bufferItem->bufferId()), bufferSyncer->highlightCount(bufferItem->bufferId()) > 0); + } return bufferItem; } - -void NetworkItem::attachNetwork(Network *network) +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(IrcChannel *)), - this, SLOT(attachIrcChannel(IrcChannel *))); - connect(network, SIGNAL(ircUserAdded(IrcUser *)), - this, SLOT(attachIrcUser(IrcUser *))); - connect(network, SIGNAL(connectedSet(bool)), - this, SIGNAL(networkDataChanged())); - connect(network, SIGNAL(destroyed()), - this, SLOT(onNetworkDestroyed())); + connect(network, &Network::networkNameSet, this, &NetworkItem::setNetworkName); + connect(network, &Network::currentServerSet, this, &NetworkItem::setCurrentServer); + connect(network, &Network::ircChannelAdded, this, &NetworkItem::attachIrcChannel); + connect(network, &Network::ircUserAdded, this, &NetworkItem::attachIrcUser); + connect(network, &Network::connectedSet, this, [this]() { emit networkDataChanged(); }); + connect(network, &QObject::destroyed, this, &NetworkItem::onNetworkDestroyed); emit networkDataChanged(); } - -void NetworkItem::attachIrcChannel(IrcChannel *ircChannel) +void NetworkItem::attachIrcChannel(IrcChannel* ircChannel) { - ChannelBufferItem *channelItem; + ChannelBufferItem* channelItem; for (int i = 0; i < childCount(); i++) { - channelItem = qobject_cast(child(i)); + channelItem = qobject_cast(child(i)); if (!channelItem) continue; @@ -193,12 +182,11 @@ void NetworkItem::attachIrcChannel(IrcChannel *ircChannel) } } - -void NetworkItem::attachIrcUser(IrcUser *ircUser) +void NetworkItem::attachIrcUser(IrcUser* ircUser) { - QueryBufferItem *queryItem = 0; + QueryBufferItem* queryItem = nullptr; for (int i = 0; i < childCount(); i++) { - queryItem = qobject_cast(child(i)); + queryItem = qobject_cast(child(i)); if (!queryItem) continue; @@ -209,26 +197,23 @@ void NetworkItem::attachIrcUser(IrcUser *ircUser) } } - -void NetworkItem::setNetworkName(const QString &networkName) +void NetworkItem::setNetworkName(const QString& networkName) { Q_UNUSED(networkName); emit networkDataChanged(0); } - -void NetworkItem::setCurrentServer(const QString &serverName) +void NetworkItem::setCurrentServer(const QString& serverName) { Q_UNUSED(serverName); emit networkDataChanged(1); } - QString NetworkItem::toolTip(int column) const { Q_UNUSED(column); QString strTooltip; - QTextStream tooltip( &strTooltip, QIODevice::WriteOnly ); + QTextStream tooltip(&strTooltip, QIODevice::WriteOnly); tooltip << ""; // Function to add a row to the tooltip table @@ -247,45 +232,48 @@ QString NetworkItem::toolTip(int column) const addRow(tr("Lag"), NetworkItem::escapeHTML(tr("%1 msecs").arg(_network->latency()), true), true); tooltip << ""; - } else { + } + else { tooltip << "

" << tr("Not connected") << "

"; } tooltip << "
"; return strTooltip; } - void NetworkItem::onBeginRemoveChilds(int start, int end) { for (int i = start; i <= end; i++) { - StatusBufferItem *statusBufferItem = qobject_cast(child(i)); + auto* statusBufferItem = qobject_cast(child(i)); if (statusBufferItem) { - _statusBufferItem = 0; + _statusBufferItem = nullptr; break; } } } - void NetworkItem::onNetworkDestroyed() { - _network = 0; + _network = nullptr; emit networkDataChanged(); removeAllChilds(); } - /***************************************** -* Fancy Buffer Items -*****************************************/ -BufferItem::BufferItem(const BufferInfo &bufferInfo, AbstractTreeItem *parent) - : PropertyMapItem(QStringList() << "bufferName" << "topic" << "nickCount", parent), - _bufferInfo(bufferInfo), - _activity(BufferInfo::NoActivity) + * Fancy Buffer Items + *****************************************/ +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) { @@ -295,30 +283,29 @@ void BufferItem::setActivityLevel(BufferInfo::ActivityLevel level) } } - void BufferItem::clearActivityLevel() { - if (Client::coreFeatures().testFlag(Quassel::Feature::BufferActivitySync)) { + if (Client::isCoreFeatureEnabled(Quassel::Feature::BufferActivitySync)) { // If the core handles activity sync, clear only the highlight flag _activity &= ~BufferInfo::Highlight; - } else { + } + else { _activity = BufferInfo::NoActivity; } _firstUnreadMsgId = MsgId(); // FIXME remove with core proto v11 - if (!(Client::coreFeatures() & Quassel::SynchronizedMarkerLine)) { + if (!Client::isCoreFeatureEnabled(Quassel::Feature::SynchronizedMarkerLine)) { _markerLineMsgId = _lastSeenMsgId; } emit dataChanged(); } - -void BufferItem::updateActivityLevel(const Message &msg) +void BufferItem::updateActivityLevel(const Message& msg) { // If the core handles activity, and this message is not a highlight, ignore this - if (Client::coreFeatures().testFlag(Quassel::Feature::BufferActivitySync) && !msg.flags().testFlag(Message::Highlight)) { + if (Client::isCoreFeatureEnabled(Quassel::Feature::BufferActivitySync) && !msg.flags().testFlag(Message::Highlight)) { return; } @@ -326,11 +313,10 @@ void BufferItem::updateActivityLevel(const Message &msg) return; } - if (msg.flags() & Message::Self) // don't update activity for our own messages + if (msg.flags() & Message::Self) // don't update activity for our own messages return; - if (Client::ignoreListManager() - && Client::ignoreListManager()->match(msg, qobject_cast(parent())->networkName())) + if (Client::ignoreListManager() && Client::ignoreListManager()->match(msg, qobject_cast(parent())->networkName())) return; if (msg.msgId() <= lastSeenMsgId()) @@ -344,9 +330,10 @@ void BufferItem::updateActivityLevel(const Message &msg) Message::Types type; // If the core handles activities, ignore types - if (Client::coreFeatures().testFlag(Quassel::Feature::BufferActivitySync)) { + if (Client::isCoreFeatureEnabled(Quassel::Feature::BufferActivitySync)) { type = Message::Types(); - } else { + } + else { type = msg.type(); } @@ -355,7 +342,8 @@ void BufferItem::updateActivityLevel(const Message &msg) } } -void BufferItem::setActivity(Message::Types type, bool highlight) { +void BufferItem::setActivity(Message::Types type, bool highlight) +{ BufferInfo::ActivityLevel oldLevel = activityLevel(); _activity &= BufferInfo::Highlight; @@ -366,7 +354,8 @@ void BufferItem::setActivity(Message::Types type, bool highlight) { } } -bool BufferItem::addActivity(Message::Types type, bool highlight) { +bool BufferItem::addActivity(Message::Types type, bool highlight) +{ auto oldActivity = activityLevel(); if (type != Message::Types()) @@ -381,7 +370,6 @@ bool BufferItem::addActivity(Message::Types type, bool highlight) { return oldActivity != _activity; } - QVariant BufferItem::data(int column, int role) const { switch (role) { @@ -408,8 +396,7 @@ QVariant BufferItem::data(int column, int role) const } } - -bool BufferItem::setData(int column, const QVariant &value, int role) +bool BufferItem::setData(int column, const QVariant& value, int role) { switch (role) { case NetworkModel::BufferActivityRole: @@ -421,20 +408,18 @@ bool BufferItem::setData(int column, const QVariant &value, int role) return true; } - -void BufferItem::setBufferName(const QString &name) +void BufferItem::setBufferName(const QString& name) { _bufferInfo = BufferInfo(_bufferInfo.bufferId(), _bufferInfo.networkId(), _bufferInfo.type(), _bufferInfo.groupId(), name); emit dataChanged(0); } - void BufferItem::setLastSeenMsgId(MsgId msgId) { _lastSeenMsgId = msgId; // FIXME remove with core protocol v11 - if (!(Client::coreFeatures() & Quassel::SynchronizedMarkerLine)) { + if (!Client::isCoreFeatureEnabled(Quassel::Feature::SynchronizedMarkerLine)) { if (!isCurrentBuffer()) _markerLineMsgId = msgId; } @@ -442,71 +427,63 @@ void BufferItem::setLastSeenMsgId(MsgId msgId) setActivityLevel(BufferInfo::NoActivity); } - void BufferItem::setMarkerLineMsgId(MsgId msgId) { _markerLineMsgId = msgId; emit dataChanged(); } - bool BufferItem::isCurrentBuffer() const { return _bufferInfo.bufferId() == Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value(); } - QString BufferItem::toolTip(int column) const { Q_UNUSED(column); return tr("

%1 - %2

").arg(bufferInfo().bufferId().toInt()).arg(bufferName()); } - /***************************************** -* StatusBufferItem -*****************************************/ -StatusBufferItem::StatusBufferItem(const BufferInfo &bufferInfo, NetworkItem *parent) + * StatusBufferItem + *****************************************/ +StatusBufferItem::StatusBufferItem(const BufferInfo& bufferInfo, NetworkItem* parent) : BufferItem(bufferInfo, parent) -{ -} - +{} QString StatusBufferItem::toolTip(int column) const { - NetworkItem *networkItem = qobject_cast(parent()); + auto* networkItem = qobject_cast(parent()); if (networkItem) return networkItem->toolTip(column); else return QString(); } - /***************************************** -* QueryBufferItem -*****************************************/ -QueryBufferItem::QueryBufferItem(const BufferInfo &bufferInfo, NetworkItem *parent) - : BufferItem(bufferInfo, parent), - _ircUser(0) + * QueryBufferItem + *****************************************/ +QueryBufferItem::QueryBufferItem(const BufferInfo& bufferInfo, NetworkItem* parent) + : BufferItem(bufferInfo, parent) + , _ircUser(nullptr) { setFlags(flags() | Qt::ItemIsDropEnabled | Qt::ItemIsEditable); - const Network *net = Client::network(bufferInfo.networkId()); + const Network* net = Client::network(bufferInfo.networkId()); if (!net) return; - IrcUser *ircUser = net->ircUser(bufferInfo.bufferName()); + 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(_ircUser); + return QVariant::fromValue(_ircUser); case NetworkModel::UserAwayRole: return (bool)_ircUser ? _ircUser->isAway() : false; default: @@ -514,15 +491,13 @@ QVariant QueryBufferItem::data(int column, int role) const } } - -bool QueryBufferItem::setData(int column, const QVariant &value, int 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: - { + case Qt::EditRole: { QString newName = value.toString(); // Sanity check - buffer names must not contain newlines! @@ -537,30 +512,27 @@ bool QueryBufferItem::setData(int column, const QVariant &value, int role) else { return false; } - } - break; + } break; default: return BufferItem::setData(column, value, role); } } - -void QueryBufferItem::setBufferName(const QString &name) +void QueryBufferItem::setBufferName(const QString& name) { BufferItem::setBufferName(name); NetworkId netId = data(0, NetworkModel::NetworkIdRole).value(); - const Network *net = Client::network(netId); + 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); QString strTooltip; - QTextStream tooltip( &strTooltip, QIODevice::WriteOnly ); + QTextStream tooltip(&strTooltip, QIODevice::WriteOnly); tooltip << ""; // Keep track of whether or not information has been added @@ -572,7 +544,8 @@ QString QueryBufferItem::toolTip(int column) const if (!_ircUser) { // User seems to be offline, let the no information message be added below tooltip << "

"; - } else { + } + else { // Function to add a row to the tooltip table auto addRow = [&](const QString& key, const QString& value, bool condition) { if (condition) { @@ -583,7 +556,7 @@ QString QueryBufferItem::toolTip(int column) const // User information is available if (_ircUser->userModes() != "") { - //TODO Translate user Modes and add them to the table below and in IrcUserItem::toolTip + // TODO Translate user Modes and add them to the table below and in IrcUserItem::toolTip tooltip << " (" << _ircUser->userModes() << ")"; } tooltip << "

"; @@ -598,16 +571,13 @@ QString QueryBufferItem::toolTip(int column) const } addRow(NetworkItem::escapeHTML(tr("Away message"), true), awayMessageHTML, true); } - addRow(tr("Realname"), - NetworkItem::escapeHTML(_ircUser->realName()), - !_ircUser->realName().isEmpty()); + addRow(tr("Realname"), NetworkItem::escapeHTML(_ircUser->realName()), !_ircUser->realName().isEmpty()); // suserHost may return " is available for help", which should be translated. // See https://www.alien.net.au/irc/irc2numerics.html - if(_ircUser->suserHost().endsWith("available for help")) { - addRow(NetworkItem::escapeHTML(tr("Help status"), true), - NetworkItem::escapeHTML(tr("Available for help")), - true); - } else { + if (_ircUser->suserHost().endsWith("available for help")) { + addRow(NetworkItem::escapeHTML(tr("Help status"), true), NetworkItem::escapeHTML(tr("Available for help")), true); + } + else { addRow(NetworkItem::escapeHTML(tr("Service status"), true), NetworkItem::escapeHTML(_ircUser->suserHost()), !_ircUser->suserHost().isEmpty()); @@ -615,7 +585,7 @@ QString QueryBufferItem::toolTip(int column) const // Keep track of whether or not the account information's been added. Don't show it twice. bool accountAdded = false; - if(!_ircUser->account().isEmpty()) { + if (!_ircUser->account().isEmpty()) { // IRCv3 account-notify is supported by the core and IRC server. // Assume logged out (seems to be more common) QString accountHTML = QString("

%1

").arg(tr("Not logged in")); @@ -624,22 +594,19 @@ QString QueryBufferItem::toolTip(int column) const if (_ircUser->account() != "*") { accountHTML = NetworkItem::escapeHTML(_ircUser->account()); } - addRow(NetworkItem::escapeHTML(tr("Account"), true), - accountHTML, - true); + addRow(NetworkItem::escapeHTML(tr("Account"), true), accountHTML, true); // Mark the row as added accountAdded = true; } // whoisServiceReply may return " is identified for this nick", which should be translated. // See https://www.alien.net.au/irc/irc2numerics.html - if(_ircUser->whoisServiceReply().endsWith("identified for this nick")) { - addRow(NetworkItem::escapeHTML(tr("Account"), true), - NetworkItem::escapeHTML(tr("Identified for this nick")), - !accountAdded); + if (_ircUser->whoisServiceReply().endsWith("identified for this nick")) { + addRow(NetworkItem::escapeHTML(tr("Account"), true), 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; - } else { + // Not used further down... + // accountAdded = true; + } + else { addRow(NetworkItem::escapeHTML(tr("Service Reply"), true), NetworkItem::escapeHTML(_ircUser->whoisServiceReply()), !_ircUser->whoisServiceReply().isEmpty()); @@ -675,28 +642,26 @@ QString QueryBufferItem::toolTip(int column) const return strTooltip; } - -void QueryBufferItem::setIrcUser(IrcUser *ircUser) +void QueryBufferItem::setIrcUser(IrcUser* ircUser) { if (_ircUser == ircUser) return; if (_ircUser) { - disconnect(_ircUser, 0, this, 0); + disconnect(_ircUser, nullptr, this, nullptr); } if (ircUser) { - connect(ircUser, SIGNAL(destroyed(QObject*)), SLOT(removeIrcUser())); - connect(ircUser, SIGNAL(quited()), this, SLOT(removeIrcUser())); - connect(ircUser, SIGNAL(awaySet(bool)), this, SIGNAL(dataChanged())); - connect(ircUser, SIGNAL(encryptedSet(bool)), this, SLOT(setEncrypted(bool))); + connect(ircUser, &IrcUser::destroyed, this, &QueryBufferItem::removeIrcUser); + connect(ircUser, &IrcUser::quited, this, &QueryBufferItem::removeIrcUser); + connect(ircUser, &IrcUser::awaySet, this, [this]() { emit dataChanged(); }); + connect(ircUser, &IrcUser::encryptedSet, this, &BufferItem::setEncrypted); } _ircUser = ircUser; emit dataChanged(); } - void QueryBufferItem::removeIrcUser() { if (_ircUser) { @@ -705,10 +670,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 @@ -717,34 +682,31 @@ void QueryBufferItem::removeIrcUser() } } - /***************************************** -* ChannelBufferItem -*****************************************/ -ChannelBufferItem::ChannelBufferItem(const BufferInfo &bufferInfo, AbstractTreeItem *parent) - : BufferItem(bufferInfo, parent), - _ircChannel(0) + * ChannelBufferItem + *****************************************/ +ChannelBufferItem::ChannelBufferItem(const BufferInfo& bufferInfo, AbstractTreeItem* parent) + : BufferItem(bufferInfo, parent) + , _ircChannel(nullptr) { setFlags(flags() | Qt::ItemIsDropEnabled); } - QVariant ChannelBufferItem::data(int column, int role) const { switch (role) { case NetworkModel::IrcChannelRole: - return QVariant::fromValue(_ircChannel); + return QVariant::fromValue(_ircChannel); default: return BufferItem::data(column, role); } } - QString ChannelBufferItem::toolTip(int column) const { Q_UNUSED(column); QString strTooltip; - QTextStream tooltip( &strTooltip, QIODevice::WriteOnly ); + QTextStream tooltip(&strTooltip, QIODevice::WriteOnly); tooltip << ""; // Function to add a row to the tooltip table @@ -762,7 +724,7 @@ QString ChannelBufferItem::toolTip(int column) const addRow(tr("Users"), QString::number(nickCount()), true); if (_ircChannel) { - QString channelMode = _ircChannel->channelModeString(); // channelModeString is compiled on the fly -> thus cache the result + QString channelMode = _ircChannel->channelModeString(); // channelModeString is compiled on the fly -> thus cache the result if (!channelMode.isEmpty()) addRow(tr("Mode"), channelMode, true); } @@ -779,7 +741,8 @@ QString ChannelBufferItem::toolTip(int column) const } tooltip << ""; - } else { + } + else { tooltip << "

" << tr("Not active, double-click to join") << "

"; } @@ -787,34 +750,24 @@ QString ChannelBufferItem::toolTip(int column) const return strTooltip; } - -void ChannelBufferItem::attachIrcChannel(IrcChannel *ircChannel) +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; - connect(ircChannel, SIGNAL(destroyed(QObject*)), - this, SLOT(ircChannelDestroyed())); - connect(ircChannel, SIGNAL(topicSet(QString)), - this, SLOT(setTopic(QString))); - connect(ircChannel, SIGNAL(encryptedSet(bool)), - this, SLOT(setEncrypted(bool))); - connect(ircChannel, SIGNAL(ircUsersJoined(QList )), - this, SLOT(join(QList ))); - connect(ircChannel, SIGNAL(ircUserParted(IrcUser *)), - this, SLOT(part(IrcUser *))); - connect(ircChannel, SIGNAL(parted()), - this, SLOT(ircChannelParted())); - connect(ircChannel, SIGNAL(ircUserModesSet(IrcUser *, QString)), - this, SLOT(userModeChanged(IrcUser *))); - connect(ircChannel, SIGNAL(ircUserModeAdded(IrcUser *, QString)), - this, SLOT(userModeChanged(IrcUser *))); - connect(ircChannel, SIGNAL(ircUserModeRemoved(IrcUser *, QString)), - this, SLOT(userModeChanged(IrcUser *))); + connect(ircChannel, &QObject::destroyed, this, &ChannelBufferItem::ircChannelDestroyed); + connect(ircChannel, &IrcChannel::topicSet, this, &ChannelBufferItem::setTopic); + connect(ircChannel, &IrcChannel::encryptedSet, this, &ChannelBufferItem::setEncrypted); + connect(ircChannel, &IrcChannel::ircUsersJoined, this, &ChannelBufferItem::join); + connect(ircChannel, &IrcChannel::ircUserParted, this, &ChannelBufferItem::part); + connect(ircChannel, &IrcChannel::parted, this, &ChannelBufferItem::ircChannelParted); + connect(ircChannel, &IrcChannel::ircUserModesSet, this, &ChannelBufferItem::userModeChanged); + connect(ircChannel, &IrcChannel::ircUserModeAdded, this, &ChannelBufferItem::userModeChanged); + connect(ircChannel, &IrcChannel::ircUserModeRemoved, this, &ChannelBufferItem::userModeChanged); if (!ircChannel->ircUsers().isEmpty()) join(ircChannel->ircUsers()); @@ -822,7 +775,7 @@ void ChannelBufferItem::attachIrcChannel(IrcChannel *ircChannel) emit dataChanged(); } -QString ChannelBufferItem::nickChannelModes(const QString &nick) const +QString ChannelBufferItem::nickChannelModes(const QString& nick) const { if (!_ircChannel) { qDebug() << Q_FUNC_INFO << "IrcChannel not set, can't get user modes"; @@ -832,97 +785,89 @@ QString ChannelBufferItem::nickChannelModes(const QString &nick) const return _ircChannel->userModes(nick); } - void ChannelBufferItem::ircChannelParted() { Q_CHECK_PTR(_ircChannel); - disconnect(_ircChannel, 0, this, 0); - _ircChannel = 0; + disconnect(_ircChannel, nullptr, this, nullptr); + _ircChannel = nullptr; emit dataChanged(); removeAllChilds(); } - void ChannelBufferItem::ircChannelDestroyed() { if (_ircChannel) { - _ircChannel = 0; + _ircChannel = nullptr; emit dataChanged(); removeAllChilds(); } } - -void ChannelBufferItem::join(const QList &ircUsers) +void ChannelBufferItem::join(const QList& ircUsers) { addUsersToCategory(ircUsers); emit dataChanged(2); } - -UserCategoryItem *ChannelBufferItem::findCategoryItem(int categoryId) +UserCategoryItem* ChannelBufferItem::findCategoryItem(int categoryId) { - UserCategoryItem *categoryItem = 0; + UserCategoryItem* categoryItem = nullptr; for (int i = 0; i < childCount(); i++) { - categoryItem = qobject_cast(child(i)); + categoryItem = qobject_cast(child(i)); if (!categoryItem) continue; if (categoryItem->categoryId() == categoryId) return categoryItem; } - return 0; + return nullptr; } - -void ChannelBufferItem::addUserToCategory(IrcUser *ircUser) +void ChannelBufferItem::addUserToCategory(IrcUser* ircUser) { - addUsersToCategory(QList() << ircUser); + addUsersToCategory(QList() << ircUser); } - -void ChannelBufferItem::addUsersToCategory(const QList &ircUsers) +void ChannelBufferItem::addUsersToCategory(const QList& ircUsers) { Q_ASSERT(_ircChannel); - QHash > categories; + QHash> categories; int categoryId = -1; - UserCategoryItem *categoryItem = 0; + UserCategoryItem* categoryItem = nullptr; - foreach(IrcUser *ircUser, ircUsers) { + foreach (IrcUser* ircUser, ircUsers) { categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser)); categoryItem = findCategoryItem(categoryId); if (!categoryItem) { categoryItem = new UserCategoryItem(categoryId, this); - categories[categoryItem] = QList(); + categories[categoryItem] = QList(); newChild(categoryItem); } categories[categoryItem] << ircUser; } - QHash >::const_iterator catIter = categories.constBegin(); + QHash>::const_iterator catIter = categories.constBegin(); while (catIter != categories.constEnd()) { catIter.key()->addUsers(catIter.value()); ++catIter; } } - -void ChannelBufferItem::part(IrcUser *ircUser) +void ChannelBufferItem::part(IrcUser* ircUser) { if (!ircUser) { qWarning() << bufferName() << "ChannelBufferItem::part(): unknown User" << ircUser; return; } - disconnect(ircUser, 0, this, 0); + disconnect(ircUser, nullptr, this, nullptr); removeUserFromCategory(ircUser); emit dataChanged(2); } - -void ChannelBufferItem::removeUserFromCategory(IrcUser *ircUser) +void ChannelBufferItem::removeUserFromCategory(IrcUser* ircUser) { if (!_ircChannel) { // If we parted the channel there might still be some ircUsers connected. @@ -931,9 +876,9 @@ void ChannelBufferItem::removeUserFromCategory(IrcUser *ircUser) return; } - UserCategoryItem *categoryItem = 0; + UserCategoryItem* categoryItem = nullptr; for (int i = 0; i < childCount(); i++) { - categoryItem = qobject_cast(child(i)); + categoryItem = qobject_cast(child(i)); if (categoryItem->removeUser(ircUser)) { if (categoryItem->childCount() == 0) removeChild(i); @@ -942,17 +887,16 @@ void ChannelBufferItem::removeUserFromCategory(IrcUser *ircUser) } } - -void ChannelBufferItem::userModeChanged(IrcUser *ircUser) +void ChannelBufferItem::userModeChanged(IrcUser* ircUser) { Q_ASSERT(_ircChannel); int categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser)); - UserCategoryItem *categoryItem = findCategoryItem(categoryId); + UserCategoryItem* categoryItem = findCategoryItem(categoryId); if (categoryItem) { if (categoryItem->findIrcUser(ircUser)) { - return; // already in the right category; + return; // already in the right category; } } else { @@ -961,11 +905,11 @@ 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)); + auto* oldCategoryItem = qobject_cast(child(i)); Q_ASSERT(oldCategoryItem); - IrcUserItem *userItem = oldCategoryItem->findIrcUser(ircUser); + IrcUserItem* userItem = oldCategoryItem->findIrcUser(ircUser); if (userItem) { ircUserItem = userItem; break; @@ -979,23 +923,27 @@ void ChannelBufferItem::userModeChanged(IrcUser *ircUser) ircUserItem->reParent(categoryItem); } - /***************************************** -* User Category Items (like @vh etc.) -*****************************************/ + * User Category Items (like @vh etc.) + *****************************************/ // we hardcode this even though we have PREFIX in network... but that wouldn't help with mapping modes to // category strings anyway. const QList UserCategoryItem::categories = QList() << 'q' << 'a' << 'o' << 'h' << 'v'; -UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem *parent) - : PropertyMapItem(QStringList() << "categoryName", parent), - _category(category) +UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem* parent) + : PropertyMapItem(parent) + , _category(category) { setFlags(Qt::ItemIsEnabled); setTreeItemFlags(AbstractTreeItem::DeleteOnLastChildRemoved); setObjectName(parent->data(0, Qt::DisplayRole).toString() + "/" + QString::number(category)); } +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 @@ -1003,50 +951,47 @@ 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* UserCategoryItem::findIrcUser(IrcUser* ircUser) { - IrcUserItem *userItem = 0; + IrcUserItem* userItem = nullptr; for (int i = 0; i < childCount(); i++) { - userItem = qobject_cast(child(i)); + userItem = qobject_cast(child(i)); if (!userItem) continue; if (userItem->ircUser() == ircUser) return userItem; } - return 0; + return nullptr; } - -void UserCategoryItem::addUsers(const QList &ircUsers) +void UserCategoryItem::addUsers(const QList& ircUsers) { - QList userItems; - foreach(IrcUser *ircUser, ircUsers) - userItems << new IrcUserItem(ircUser, this); + QList userItems; + foreach (IrcUser* ircUser, ircUsers) + userItems << new IrcUserItem(ircUser, this); newChilds(userItems); emit dataChanged(0); } - -bool UserCategoryItem::removeUser(IrcUser *ircUser) +bool UserCategoryItem::removeUser(IrcUser* ircUser) { - IrcUserItem *userItem = findIrcUser(ircUser); - bool success = (bool)userItem; + IrcUserItem* userItem = findIrcUser(ircUser); + auto success = (bool)userItem; if (success) { removeChild(userItem); emit dataChanged(0); @@ -1054,8 +999,7 @@ bool UserCategoryItem::removeUser(IrcUser *ircUser) return success; } - -int UserCategoryItem::categoryFromModes(const QString &modes) +int UserCategoryItem::categoryFromModes(const QString& modes) { for (int i = 0; i < categories.count(); i++) { if (modes.contains(categories[i])) @@ -1064,7 +1008,6 @@ int UserCategoryItem::categoryFromModes(const QString &modes) return categories.count(); } - QVariant UserCategoryItem::data(int column, int role) const { switch (role) { @@ -1085,20 +1028,24 @@ QVariant UserCategoryItem::data(int column, int role) const } } - /***************************************** -* Irc User Items -*****************************************/ -IrcUserItem::IrcUserItem(IrcUser *ircUser, AbstractTreeItem *parent) - : PropertyMapItem(QStringList() << "nickName", parent), - _ircUser(ircUser) + * Irc User Items + *****************************************/ +IrcUserItem::IrcUserItem(IrcUser* ircUser, AbstractTreeItem* parent) + : PropertyMapItem(parent) + , _ircUser(ircUser) { setObjectName(ircUser->nick()); - connect(ircUser, SIGNAL(quited()), this, SLOT(ircUserQuited())); - connect(ircUser, SIGNAL(nickSet(QString)), this, SIGNAL(dataChanged())); - connect(ircUser, SIGNAL(awaySet(bool)), this, SIGNAL(dataChanged())); + connect(ircUser, &IrcUser::quited, this, &IrcUserItem::ircUserQuited); + connect(ircUser, &IrcUser::nickSet, this, [this]() { emit dataChanged(); }); + connect(ircUser, &IrcUser::awaySet, this, [this]() { emit dataChanged(); }); } +QStringList IrcUserItem::propertyOrder() const +{ + static QStringList order{"nickName"}; + return order; +} QVariant IrcUserItem::data(int column, int role) const { @@ -1116,7 +1063,7 @@ QVariant IrcUserItem::data(int column, int role) const case NetworkModel::IrcChannelRole: return parent()->data(column, role); case NetworkModel::IrcUserRole: - return QVariant::fromValue(_ircUser.data()); + return QVariant::fromValue(_ircUser.data()); case NetworkModel::UserAwayRole: return (bool)_ircUser ? _ircUser->isAway() : false; default: @@ -1124,12 +1071,11 @@ QVariant IrcUserItem::data(int column, int role) const } } - QString IrcUserItem::toolTip(int column) const { Q_UNUSED(column); QString strTooltip; - QTextStream tooltip( &strTooltip, QIODevice::WriteOnly ); + QTextStream tooltip(&strTooltip, QIODevice::WriteOnly); tooltip << ""; // Keep track of whether or not information has been added @@ -1138,23 +1084,20 @@ QString IrcUserItem::toolTip(int column) const // Use bufferName() for QueryBufferItem, nickName() for IrcUserItem tooltip << "

" << NetworkItem::escapeHTML(nickName(), true); if (_ircUser->userModes() != "") { - //TODO: Translate user Modes and add them to the table below and in QueryBufferItem::toolTip + // TODO: Translate user Modes and add them to the table below and in QueryBufferItem::toolTip tooltip << " (" << _ircUser->userModes() << ")"; } tooltip << "

"; auto addRow = [&](const QString& key, const QString& value, bool condition) { - if (condition) - { + if (condition) { tooltip << "" << key << "" << value << ""; infoAdded = true; } }; tooltip << ""; - addRow(tr("Modes"), - NetworkItem::escapeHTML(channelModes()), - !channelModes().isEmpty()); + addRow(tr("Modes"), NetworkItem::escapeHTML(channelModes()), !channelModes().isEmpty()); if (_ircUser->isAway()) { QString awayMessageHTML = QString("

%1

").arg(tr("Unknown")); @@ -1164,17 +1107,14 @@ QString IrcUserItem::toolTip(int column) const } addRow(NetworkItem::escapeHTML(tr("Away message"), true), awayMessageHTML, true); } - addRow(tr("Realname"), - NetworkItem::escapeHTML(_ircUser->realName()), - !_ircUser->realName().isEmpty()); + addRow(tr("Realname"), NetworkItem::escapeHTML(_ircUser->realName()), !_ircUser->realName().isEmpty()); // suserHost may return " is available for help", which should be translated. // See https://www.alien.net.au/irc/irc2numerics.html - if(_ircUser->suserHost().endsWith("available for help")) { - addRow(NetworkItem::escapeHTML(tr("Help status"), true), - NetworkItem::escapeHTML(tr("Available for help")), - true); - } else { + if (_ircUser->suserHost().endsWith("available for help")) { + addRow(NetworkItem::escapeHTML(tr("Help status"), true), NetworkItem::escapeHTML(tr("Available for help")), true); + } + else { addRow(NetworkItem::escapeHTML(tr("Service status"), true), NetworkItem::escapeHTML(_ircUser->suserHost()), !_ircUser->suserHost().isEmpty()); @@ -1182,7 +1122,7 @@ QString IrcUserItem::toolTip(int column) const // Keep track of whether or not the account information's been added. Don't show it twice. bool accountAdded = false; - if(!_ircUser->account().isEmpty()) { + if (!_ircUser->account().isEmpty()) { // IRCv3 account-notify is supported by the core and IRC server. // Assume logged out (seems to be more common) QString accountHTML = QString("

%1

").arg(tr("Not logged in")); @@ -1191,22 +1131,19 @@ QString IrcUserItem::toolTip(int column) const if (_ircUser->account() != "*") { accountHTML = NetworkItem::escapeHTML(_ircUser->account()); } - addRow(NetworkItem::escapeHTML(tr("Account"), true), - accountHTML, - true); + addRow(NetworkItem::escapeHTML(tr("Account"), true), accountHTML, true); // Mark the row as added accountAdded = true; } // whoisServiceReply may return " is identified for this nick", which should be translated. // See https://www.alien.net.au/irc/irc2numerics.html - if(_ircUser->whoisServiceReply().endsWith("identified for this nick")) { - addRow(NetworkItem::escapeHTML(tr("Account"), true), - NetworkItem::escapeHTML(tr("Identified for this nick")), - !accountAdded); + if (_ircUser->whoisServiceReply().endsWith("identified for this nick")) { + addRow(NetworkItem::escapeHTML(tr("Account"), true), 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; - } else { + // Not used further down... + // accountAdded = true; + } + else { addRow(NetworkItem::escapeHTML(tr("Service Reply"), true), NetworkItem::escapeHTML(_ircUser->whoisServiceReply()), !_ircUser->whoisServiceReply().isEmpty()); @@ -1245,37 +1182,33 @@ QString IrcUserItem::channelModes() const { // IrcUserItems are parented to UserCategoryItem, which are parented to ChannelBufferItem. // We want the channel buffer item in order to get the channel-specific user modes. - UserCategoryItem *category = qobject_cast(parent()); + auto* category = qobject_cast(parent()); if (!category) return QString(); - ChannelBufferItem *channel = qobject_cast(category->parent()); + auto* channel = qobject_cast(category->parent()); if (!channel) return QString(); return channel->nickChannelModes(nickName()); } - /***************************************** * NetworkModel *****************************************/ -NetworkModel::NetworkModel(QObject *parent) +NetworkModel::NetworkModel(QObject* parent) : TreeModel(NetworkModel::defaultHeader(), parent) { - connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), - this, SLOT(checkForNewBuffers(const QModelIndex &, int, int))); - connect(this, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), - this, SLOT(checkForRemovedBuffers(const QModelIndex &, int, int))); + connect(this, &NetworkModel::rowsInserted, this, &NetworkModel::checkForNewBuffers); + connect(this, &NetworkModel::rowsAboutToBeRemoved, this, &NetworkModel::checkForRemovedBuffers); BufferSettings defaultSettings; - defaultSettings.notify("UserNoticesTarget", this, SLOT(messageRedirectionSettingsChanged())); - defaultSettings.notify("ServerNoticesTarget", this, SLOT(messageRedirectionSettingsChanged())); - defaultSettings.notify("ErrorMsgsTarget", this, SLOT(messageRedirectionSettingsChanged())); + defaultSettings.notify("UserNoticesTarget", this, &NetworkModel::messageRedirectionSettingsChanged); + defaultSettings.notify("ServerNoticesTarget", this, &NetworkModel::messageRedirectionSettingsChanged); + defaultSettings.notify("ErrorMsgsTarget", this, &NetworkModel::messageRedirectionSettingsChanged); messageRedirectionSettingsChanged(); } - QList NetworkModel::defaultHeader() { QList data; @@ -1283,18 +1216,16 @@ QList NetworkModel::defaultHeader() return data; } - -bool NetworkModel::isBufferIndex(const QModelIndex &index) const +bool NetworkModel::isBufferIndex(const QModelIndex& index) const { return index.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType; } - 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)); + netItem = qobject_cast(rootItem->child(i)); if (!netItem) continue; if (netItem->networkId() == networkId) @@ -1303,40 +1234,36 @@ int NetworkModel::networkRow(NetworkId networkId) const return -1; } - QModelIndex NetworkModel::networkIndex(NetworkId networkId) { int netRow = networkRow(networkId); if (netRow == -1) - return QModelIndex(); + return {}; else - return indexByItem(qobject_cast(rootItem->child(netRow))); + return indexByItem(qobject_cast(rootItem->child(netRow))); } - -NetworkItem *NetworkModel::findNetworkItem(NetworkId networkId) const +NetworkItem* NetworkModel::findNetworkItem(NetworkId networkId) const { int netRow = networkRow(networkId); if (netRow == -1) - return 0; + return nullptr; else - return qobject_cast(rootItem->child(netRow)); + return qobject_cast(rootItem->child(netRow)); } - -NetworkItem *NetworkModel::networkItem(NetworkId networkId) +NetworkItem* NetworkModel::networkItem(NetworkId networkId) { - NetworkItem *netItem = findNetworkItem(networkId); + NetworkItem* netItem = findNetworkItem(networkId); - if (netItem == 0) { + if (netItem == nullptr) { netItem = new NetworkItem(networkId, rootItem); rootItem->newChild(netItem); } return netItem; } - -void NetworkModel::networkRemoved(const NetworkId &networkId) +void NetworkModel::networkRemoved(const NetworkId& networkId) { int netRow = networkRow(networkId); if (netRow != -1) { @@ -1344,35 +1271,31 @@ void NetworkModel::networkRemoved(const NetworkId &networkId) } } - QModelIndex NetworkModel::bufferIndex(BufferId bufferId) { if (!_bufferItemCache.contains(bufferId)) - return QModelIndex(); + return {}; return indexByItem(_bufferItemCache[bufferId]); } - -BufferItem *NetworkModel::findBufferItem(BufferId bufferId) const +BufferItem* NetworkModel::findBufferItem(BufferId bufferId) const { if (_bufferItemCache.contains(bufferId)) return _bufferItemCache[bufferId]; else - return 0; + return nullptr; } - -BufferItem *NetworkModel::bufferItem(const BufferInfo &bufferInfo) +BufferItem* NetworkModel::bufferItem(const BufferInfo& bufferInfo) { if (_bufferItemCache.contains(bufferInfo.bufferId())) return _bufferItemCache[bufferInfo.bufferId()]; - NetworkItem *netItem = networkItem(bufferInfo.networkId()); + NetworkItem* netItem = networkItem(bufferInfo.networkId()); return netItem->bufferItem(bufferInfo); } - QStringList NetworkModel::mimeTypes() const { // mimetypes we accept for drops @@ -1383,16 +1306,14 @@ QStringList NetworkModel::mimeTypes() const return types; } - -bool NetworkModel::mimeContainsBufferList(const QMimeData *mimeData) +bool NetworkModel::mimeContainsBufferList(const QMimeData* mimeData) { return mimeData->hasFormat("application/Quassel/BufferItemList"); } - -QList > NetworkModel::mimeDataToBufferList(const QMimeData *mimeData) +QList> NetworkModel::mimeDataToBufferList(const QMimeData* mimeData) { - QList > bufferList; + QList> bufferList; if (!mimeContainsBufferList(mimeData)) return bufferList; @@ -1400,7 +1321,7 @@ QList > NetworkModel::mimeDataToBufferList(const QMim QStringList rawBufferList = QString::fromLatin1(mimeData->data("application/Quassel/BufferItemList")).split(","); NetworkId networkId; BufferId bufferUid; - foreach(QString rawBuffer, rawBufferList) { + foreach (QString rawBuffer, rawBufferList) { if (!rawBuffer.contains(":")) continue; networkId = rawBuffer.section(":", 0, 0).toInt(); @@ -1410,14 +1331,13 @@ QList > NetworkModel::mimeDataToBufferList(const QMim return bufferList; } - -QMimeData *NetworkModel::mimeData(const QModelIndexList &indexes) const +QMimeData* NetworkModel::mimeData(const QModelIndexList& indexes) const { - QMimeData *mimeData = new QMimeData(); + auto* mimeData = new QMimeData(); QStringList bufferlist; QString netid, uid, bufferid; - foreach(QModelIndex index, indexes) { + foreach (QModelIndex index, indexes) { netid = QString::number(index.data(NetworkIdRole).value().toInt()); uid = QString::number(index.data(BufferIdRole).value().toInt()); bufferid = QString("%1:%2").arg(netid).arg(uid); @@ -1430,66 +1350,59 @@ QMimeData *NetworkModel::mimeData(const QModelIndexList &indexes) const return mimeData; } - -void NetworkModel::attachNetwork(Network *net) +void NetworkModel::attachNetwork(Network* net) { - NetworkItem *netItem = networkItem(net->networkId()); + NetworkItem* netItem = networkItem(net->networkId()); netItem->attachNetwork(net); } - void NetworkModel::bufferUpdated(BufferInfo bufferInfo) { - BufferItem *bufItem = bufferItem(bufferInfo); + BufferItem* bufItem = bufferItem(bufferInfo); QModelIndex itemindex = indexByItem(bufItem); emit dataChanged(itemindex, itemindex); } - void NetworkModel::removeBuffer(BufferId bufferId) { - BufferItem *buffItem = findBufferItem(bufferId); + BufferItem* buffItem = findBufferItem(bufferId); if (!buffItem) return; buffItem->parent()->removeChild(buffItem); } - MsgId NetworkModel::lastSeenMsgId(BufferId bufferId) const { if (!_bufferItemCache.contains(bufferId)) - return MsgId(); + return {}; return _bufferItemCache[bufferId]->lastSeenMsgId(); } - MsgId NetworkModel::markerLineMsgId(BufferId bufferId) const { if (!_bufferItemCache.contains(bufferId)) - return MsgId(); + return {}; return _bufferItemCache[bufferId]->markerLineMsgId(); } - // FIXME we always seem to use this (expensive) non-const version -MsgId NetworkModel::lastSeenMsgId(const BufferId &bufferId) +MsgId NetworkModel::lastSeenMsgId(const BufferId& bufferId) { - BufferItem *bufferItem = findBufferItem(bufferId); + BufferItem* bufferItem = findBufferItem(bufferId); if (!bufferItem) { qDebug() << "NetworkModel::lastSeenMsgId(): buffer is unknown:" << bufferId; Client::purgeKnownBufferIds(); - return MsgId(); + return {}; } return bufferItem->lastSeenMsgId(); } - -void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId) +void NetworkModel::setLastSeenMsgId(const BufferId& bufferId, const MsgId& msgId) { - BufferItem *bufferItem = findBufferItem(bufferId); + BufferItem* bufferItem = findBufferItem(bufferId); if (!bufferItem) { qDebug() << "NetworkModel::setLastSeenMsgId(): buffer is unknown:" << bufferId; Client::purgeKnownBufferIds(); @@ -1499,10 +1412,9 @@ void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId emit lastSeenMsgSet(bufferId, msgId); } - -void NetworkModel::setMarkerLineMsgId(const BufferId &bufferId, const MsgId &msgId) +void NetworkModel::setMarkerLineMsgId(const BufferId& bufferId, const MsgId& msgId) { - BufferItem *bufferItem = findBufferItem(bufferId); + BufferItem* bufferItem = findBufferItem(bufferId); if (!bufferItem) { qDebug() << "NetworkModel::setMarkerLineMsgId(): buffer is unknown:" << bufferId; Client::purgeKnownBufferIds(); @@ -1512,8 +1424,7 @@ void NetworkModel::setMarkerLineMsgId(const BufferId &bufferId, const MsgId &msg emit markerLineSet(bufferId, msgId); } - -void NetworkModel::updateBufferActivity(Message &msg) +void NetworkModel::updateBufferActivity(Message& msg) { int redirectionTarget = 0; switch (msg.type()) { @@ -1537,8 +1448,8 @@ void NetworkModel::updateBufferActivity(Message &msg) case Message::Plain: 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; + const Network* net = Client::network(msg.bufferInfo().networkId()); + IrcUser* user = net ? net->ircUser(nickFromMask(msg.sender())) : nullptr; if (user) user->setLastChannelActivity(msg.bufferId(), msg.timestamp()); } @@ -1552,7 +1463,7 @@ void NetworkModel::updateBufferActivity(Message &msg) updateBufferActivity(bufferItem(msg.bufferInfo()), msg); if (redirectionTarget & BufferSettings::StatusBuffer) { - const NetworkItem *netItem = findNetworkItem(msg.bufferInfo().networkId()); + const NetworkItem* netItem = findNetworkItem(msg.bufferInfo().networkId()); if (netItem) { updateBufferActivity(netItem->statusBufferItem(), msg); } @@ -1564,8 +1475,7 @@ void NetworkModel::updateBufferActivity(Message &msg) } } - -void NetworkModel::updateBufferActivity(BufferItem *bufferItem, const Message &msg) +void NetworkModel::updateBufferActivity(BufferItem* bufferItem, const Message& msg) { if (!bufferItem) return; @@ -1575,10 +1485,9 @@ void NetworkModel::updateBufferActivity(BufferItem *bufferItem, const Message &m emit requestSetLastSeenMsg(bufferItem->bufferId(), msg.msgId()); } - -void NetworkModel::setBufferActivity(const BufferId &bufferId, BufferInfo::ActivityLevel level) +void NetworkModel::setBufferActivity(const BufferId& bufferId, BufferInfo::ActivityLevel level) { - BufferItem *bufferItem = findBufferItem(bufferId); + BufferItem* bufferItem = findBufferItem(bufferId); if (!bufferItem) { qDebug() << "NetworkModel::setBufferActivity(): buffer is unknown:" << bufferId; return; @@ -1586,10 +1495,9 @@ void NetworkModel::setBufferActivity(const BufferId &bufferId, BufferInfo::Activ bufferItem->setActivityLevel(level); } - -void NetworkModel::clearBufferActivity(const BufferId &bufferId) +void NetworkModel::clearBufferActivity(const BufferId& bufferId) { - BufferItem *bufferItem = findBufferItem(bufferId); + BufferItem* bufferItem = findBufferItem(bufferId); if (!bufferItem) { qDebug() << "NetworkModel::clearBufferActivity(): buffer is unknown:" << bufferId; return; @@ -1597,19 +1505,17 @@ void NetworkModel::clearBufferActivity(const BufferId &bufferId) bufferItem->clearActivityLevel(); } - -const Network *NetworkModel::networkByIndex(const QModelIndex &index) const +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); } - -void NetworkModel::checkForRemovedBuffers(const QModelIndex &parent, int start, int end) +void NetworkModel::checkForRemovedBuffers(const QModelIndex& parent, int start, int end) { if (parent.data(ItemTypeRole) != NetworkItemType) return; @@ -1619,19 +1525,17 @@ void NetworkModel::checkForRemovedBuffers(const QModelIndex &parent, int start, } } - -void NetworkModel::checkForNewBuffers(const QModelIndex &parent, int start, int end) +void NetworkModel::checkForNewBuffers(const QModelIndex& parent, int start, int end) { if (parent.data(ItemTypeRole) != NetworkItemType) return; for (int row = start; row <= end; row++) { QModelIndex child = parent.child(row, 0); - _bufferItemCache[child.data(BufferIdRole).value < BufferId > ()] = static_cast(child.internalPointer()); + _bufferItemCache[child.data(BufferIdRole).value()] = static_cast(child.internalPointer()); } } - QString NetworkModel::bufferName(BufferId bufferId) const { if (!_bufferItemCache.contains(bufferId)) @@ -1640,7 +1544,6 @@ QString NetworkModel::bufferName(BufferId bufferId) const return _bufferItemCache[bufferId]->bufferName(); } - BufferInfo::Type NetworkModel::bufferType(BufferId bufferId) const { if (!_bufferItemCache.contains(bufferId)) @@ -1649,7 +1552,6 @@ BufferInfo::Type NetworkModel::bufferType(BufferId bufferId) const return _bufferItemCache[bufferId]->bufferType(); } - BufferInfo NetworkModel::bufferInfo(BufferId bufferId) const { if (!_bufferItemCache.contains(bufferId)) @@ -1658,52 +1560,48 @@ BufferInfo NetworkModel::bufferInfo(BufferId bufferId) const return _bufferItemCache[bufferId]->bufferInfo(); } - NetworkId NetworkModel::networkId(BufferId bufferId) const { if (!_bufferItemCache.contains(bufferId)) - return NetworkId(); + return {}; - NetworkItem *netItem = qobject_cast(_bufferItemCache[bufferId]->parent()); + auto* netItem = qobject_cast(_bufferItemCache[bufferId]->parent()); if (netItem) return netItem->networkId(); else - return NetworkId(); + return {}; } - QString NetworkModel::networkName(BufferId bufferId) const { if (!_bufferItemCache.contains(bufferId)) return QString(); - NetworkItem *netItem = qobject_cast(_bufferItemCache[bufferId]->parent()); + auto* netItem = qobject_cast(_bufferItemCache[bufferId]->parent()); if (netItem) return netItem->networkName(); else return QString(); } - -BufferId NetworkModel::bufferId(NetworkId networkId, const QString &bufferName, Qt::CaseSensitivity cs) const +BufferId NetworkModel::bufferId(NetworkId networkId, const QString& bufferName, Qt::CaseSensitivity cs) const { - const NetworkItem *netItem = findNetworkItem(networkId); + const NetworkItem* netItem = findNetworkItem(networkId); if (!netItem) - return BufferId(); + return {}; for (int i = 0; i < netItem->childCount(); i++) { - BufferItem *bufferItem = qobject_cast(netItem->child(i)); + auto* bufferItem = qobject_cast(netItem->child(i)); if (bufferItem && !bufferItem->bufferName().compare(bufferName, cs)) return bufferItem->bufferId(); } - return BufferId(); + return {}; } - -void NetworkModel::sortBufferIds(QList &bufferIds) const +void NetworkModel::sortBufferIds(QList& bufferIds) const { - QList bufferItems; - foreach(BufferId bufferId, bufferIds) { + QList bufferItems; + foreach (BufferId bufferId, bufferIds) { if (_bufferItemCache.contains(bufferId)) bufferItems << _bufferItemCache[bufferId]; } @@ -1711,12 +1609,11 @@ void NetworkModel::sortBufferIds(QList &bufferIds) const qSort(bufferItems.begin(), bufferItems.end(), bufferItemLessThan); bufferIds.clear(); - foreach(BufferItem *bufferItem, bufferItems) { + foreach (BufferItem* bufferItem, bufferItems) { bufferIds << bufferItem->bufferId(); } } - QList NetworkModel::allBufferIdsSorted() const { QList bufferIds = allBufferIds(); @@ -1724,8 +1621,7 @@ QList NetworkModel::allBufferIdsSorted() const return bufferIds; } - -bool NetworkModel::bufferItemLessThan(const BufferItem *left, const BufferItem *right) +bool NetworkModel::bufferItemLessThan(const BufferItem* left, const BufferItem* right) { int leftType = left->bufferType(); int rightType = right->bufferType(); @@ -1736,7 +1632,6 @@ bool NetworkModel::bufferItemLessThan(const BufferItem *left, const BufferItem * return QString::compare(left->bufferName(), right->bufferName(), Qt::CaseInsensitive) < 0; } - void NetworkModel::messageRedirectionSettingsChanged() { BufferSettings bufferSettings; @@ -1746,7 +1641,8 @@ void NetworkModel::messageRedirectionSettingsChanged() _errorMsgsTarget = bufferSettings.errorMsgsTarget(); } -void NetworkModel::bufferActivityChanged(BufferId bufferId, const Message::Types activity) { +void NetworkModel::bufferActivityChanged(BufferId bufferId, const Message::Types activity) +{ auto _bufferItem = findBufferItem(bufferId); if (!_bufferItem) { qDebug() << "NetworkModel::bufferActivityChanged(): buffer is unknown:" << bufferId; @@ -1757,3 +1653,13 @@ 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); +}