X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fhighlightrulemanager.h;h=5a2d4a87b36e7390f9446ad1c77eb78870550ca1;hp=cabf0d25e82c1718d84d867c8b50af363cce1fce;hb=3a3e844f9fcfd12235a0086af75ecd503b621ef4;hpb=74226102118400b228618f7373137a4a01e7d85f diff --git a/src/common/highlightrulemanager.h b/src/common/highlightrulemanager.h index cabf0d25..5a2d4a87 100644 --- a/src/common/highlightrulemanager.h +++ b/src/common/highlightrulemanager.h @@ -20,6 +20,8 @@ #pragma once +#include "common-export.h" + #include #include @@ -29,12 +31,13 @@ #include "expressionmatch.h" #include "message.h" +#include "nickhighlightmatcher.h" #include "syncableobject.h" -class HighlightRuleManager : public SyncableObject +class COMMON_EXPORT HighlightRuleManager : public SyncableObject { - SYNCABLE_OBJECT Q_OBJECT + SYNCABLE_OBJECT Q_PROPERTY(int highlightNick READ highlightNick WRITE setHighlightNick) Q_PROPERTY(bool nicksCaseSensitive READ nicksCaseSensitive WRITE setNicksCaseSensitive) @@ -52,7 +55,7 @@ public: /** * Individual highlight rule */ - class HighlightRule + class COMMON_EXPORT HighlightRule { public: /** @@ -74,8 +77,8 @@ public: */ HighlightRule(int id, QString contents, bool isRegEx, bool isCaseSensitive, bool isEnabled, bool isInverse, QString sender, QString chanName) - : _id(id), _contents(contents), _isRegEx(isRegEx), _isCaseSensitive(isCaseSensitive), - _isEnabled(isEnabled), _isInverse(isInverse), _sender(sender), _chanName(chanName) + : _id(id), _contents(std::move(contents)), _isRegEx(isRegEx), _isCaseSensitive(isCaseSensitive), + _isEnabled(isEnabled), _isInverse(isInverse), _sender(std::move(sender)), _chanName(std::move(chanName)) { _cacheInvalid = true; // Cache expression matches on construction @@ -364,7 +367,10 @@ public slots: inline void setHighlightNick(int highlightNick) { _highlightNick = static_cast(highlightNick); - _cacheNickConfigInvalid = true; + // Convert from HighlightRuleManager::HighlightNickType to + // NickHighlightMatcher::HighlightNickType + _nickMatcher.setHighlightMode( + static_cast(_highlightNick)); } virtual inline void requestSetNicksCaseSensitive(bool nicksCaseSensitive) @@ -374,49 +380,42 @@ public slots: inline void setNicksCaseSensitive(bool nicksCaseSensitive) { _nicksCaseSensitive = nicksCaseSensitive; - _cacheNickConfigInvalid = true; + // Update nickname matcher, too + _nickMatcher.setCaseSensitive(nicksCaseSensitive); + } + + /** + * Network removed from system + * + * Handles cleaning up cache from stale networks. + * + * @param id Network ID of removed network + */ + inline void networkRemoved(NetworkId id) { + // Clean up nickname matching cache + _nickMatcher.removeNetwork(id); } protected: void setHighlightRuleList(const QList &HighlightRuleList) { _highlightRuleList = HighlightRuleList; } - bool match(const QString &msgContents, + bool match(const NetworkId &netId, + const QString &msgContents, const QString &msgSender, Message::Type msgType, Message::Flags msgFlags, const QString &bufferName, const QString ¤tNick, - const QStringList identityNicks); + const QStringList &identityNicks); signals: void ruleAdded(QString name, bool isRegEx, bool isCaseSensitive, bool isEnabled, bool isInverse, QString sender, QString chanName); private: - /** - * Update internal cache of expression matching if needed - */ - void determineNickExpressions(const QString ¤tNick, - const QStringList identityNicks) const; + HighlightRuleList _highlightRuleList = {}; ///< Custom highlight rule list + NickHighlightMatcher _nickMatcher = {}; ///< Nickname highlight matcher - /** - * Check if nickname matching cache is invalid - * @param currentNick - * @param identityNicks - * @return - */ - bool cacheNickInvalid(const QString ¤tNick, const QStringList identityNicks) const { - if (_cacheNickConfigInvalid) return true; - if (_cachedNickCurrent != currentNick) return true; - if (_cachedIdentityNicks != identityNicks) return true; - } - - HighlightRuleList _highlightRuleList; + /// Nickname highlighting mode HighlightNickType _highlightNick = HighlightNickType::CurrentNick; - bool _nicksCaseSensitive = false; - - // These represent internal cache and should be safe to mutate in 'const' functions - mutable bool _cacheNickConfigInvalid = true; ///< If true, nick match cache needs redone - mutable QString _cachedNickCurrent = {}; ///< Last cached current nick - mutable QStringList _cachedIdentityNicks = {}; ///< Last cached identity nicks - mutable ExpressionMatch _cachedNickMatcher = {}; ///< Expression match cache for nicks + bool _nicksCaseSensitive = false; ///< If true, match nicknames with exact case };