QVariantList isCaseSensitive;
QVariantList isActive;
QVariantList isInverse;
+ QStringList sender;
QStringList channel;
for (int i = 0; i < _highlightRuleList.count(); i++) {
isCaseSensitive << _highlightRuleList[i].isCaseSensitive;
isActive << _highlightRuleList[i].isEnabled;
isInverse << _highlightRuleList[i].isInverse;
+ sender << _highlightRuleList[i].sender;
channel << _highlightRuleList[i].chanName;
}
highlightRuleListMap["isCaseSensitive"] = isCaseSensitive;
highlightRuleListMap["isEnabled"] = isActive;
highlightRuleListMap["isInverse"] = isInverse;
+ highlightRuleListMap["sender"] = sender;
highlightRuleListMap["channel"] = channel;
highlightRuleListMap["highlightNick"] = _highlightNick;
highlightRuleListMap["nicksCaseSensitive"] = _nicksCaseSensitive;
QVariantList isCaseSensitive = highlightRuleList["isCaseSensitive"].toList();
QVariantList isActive = highlightRuleList["isEnabled"].toList();
QVariantList isInverse = highlightRuleList["isInverse"].toList();
+ QStringList sender = highlightRuleList["sender"].toStringList();
QStringList channel = highlightRuleList["channel"].toStringList();
int count = name.count();
- if (count != isRegEx.count() || count != isCaseSensitive.count() ||
- count != isActive.count() || count != channel.count()) {
+ if (count != isRegEx.count() || count != isCaseSensitive.count() || count != isActive.count() ||
+ count != isInverse.count() || count != sender.count() || count != channel.count()) {
qWarning() << "Corrupted HighlightRuleList settings! (Count mismatch)";
return;
}
_highlightRuleList.clear();
for (int i = 0; i < name.count(); i++) {
_highlightRuleList << HighlightRule(name[i], isRegEx[i].toBool(), isCaseSensitive[i].toBool(),
- isActive[i].toBool(), isInverse[i].toBool(), channel[i]);
+ isActive[i].toBool(), isInverse[i].toBool(), sender[i], channel[i]);
}
_highlightNick = HighlightNickType(highlightRuleList["highlightNick"].toInt());
_nicksCaseSensitive = highlightRuleList["nicksCaseSensitive"].toBool();
}
void HighlightRuleManager::addHighlightRule(const QString &name, bool isRegEx, bool isCaseSensitive, bool isActive,
- bool isInverse, const QString &channel)
+ bool isInverse, const QString &sender, const QString &channel)
{
if (contains(name)) {
return;
}
- HighlightRule newItem = HighlightRule(name, isRegEx, isCaseSensitive, isActive, isInverse, channel);
+ HighlightRule newItem = HighlightRule(name, isRegEx, isCaseSensitive, isActive, isInverse, sender, channel);
_highlightRuleList << newItem;
- SYNC(ARG(name), ARG(isRegEx), ARG(isCaseSensitive), ARG(isActive), ARG(isInverse), ARG(channel))
+ SYNC(ARG(name), ARG(isRegEx), ARG(isCaseSensitive), ARG(isActive), ARG(isInverse), ARG(sender), ARG(channel))
}
QRegExp rx;
if (rule.isRegEx) {
rx = QRegExp(rule.name, rule.isCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
- }
- else {
+ } else {
rx = QRegExp("(^|\\W)" + QRegExp::escape(rule.name) + "(\\W|$)", rule.isCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
}
- bool match = (rx.indexIn(stripFormatCodes(msgContents)) >= 0);
- if (match) {
+ bool nameMatch = (rx.indexIn(stripFormatCodes(msgContents)) >= 0);
+
+ bool senderMatch;
+ if (rule.sender.isEmpty()) {
+ senderMatch = true;
+ } else {
+ if (rule.isRegEx) {
+ rx = QRegExp(rule.sender, rule.isCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
+ } else {
+ rx = QRegExp(rule.sender, Qt::CaseInsensitive, QRegExp::Wildcard);
+ }
+ senderMatch = rx.exactMatch(msgSender);
+ }
+
+ if (nameMatch && senderMatch) {
// If an inverse rule matches, then we know that we never want to return a highlight.
if (rule.isInverse) {
return false;
#include <QString>
#include <QRegExp>
+#include <utility>
#include "message.h"
#include "syncableobject.h"
bool isCaseSensitive = false;
bool isEnabled = true;
bool isInverse = false;
+ QString sender;
QString chanName;
HighlightRule() {}
- HighlightRule(const QString &name_, bool isRegEx_, bool isCaseSensitive_,
- bool isEnabled_, bool isInverse_, const QString &chanName_)
- : name(name_), isRegEx(isRegEx_), isCaseSensitive(isCaseSensitive_), isEnabled(isEnabled_),
- isInverse(isInverse_), chanName(chanName_) {
+ HighlightRule(QString name_, bool isRegEx_, bool isCaseSensitive_, bool isEnabled_, bool isInverse_,
+ QString sender_, QString chanName_)
+ : name(std::move(name_)), isRegEx(isRegEx_), isCaseSensitive(isCaseSensitive_), isEnabled(isEnabled_),
+ isInverse(isInverse_), sender(std::move(sender_)), chanName(std::move(chanName_)) {
}
bool operator!=(const HighlightRule &other)
{
isCaseSensitive != other.isCaseSensitive ||
isEnabled != other.isEnabled ||
isInverse != other.isInverse ||
+ sender != other.sender ||
chanName != other.chanName);
}
};
* @param chanName The channel in which the rule should apply
*/
virtual inline void requestAddHighlightRule(const QString &name, bool isRegEx, bool isCaseSensitive, bool isEnabled,
- bool isInverse, const QString &chanName)
+ bool isInverse, const QString &sender, const QString &chanName)
{
- REQUEST(ARG(name), ARG(isRegEx), ARG(isCaseSensitive), ARG(isEnabled), ARG(isInverse), ARG(chanName))
+ REQUEST(ARG(name), ARG(isRegEx), ARG(isCaseSensitive), ARG(isEnabled), ARG(isInverse), ARG(sender), ARG(chanName))
}
- virtual void addHighlightRule(const QString &name, bool isRegEx, bool isCaseSensitive,
- bool isEnabled, bool isInverse, const QString &chanName);
+ virtual void addHighlightRule(const QString &name, bool isRegEx, bool isCaseSensitive, bool isEnabled,
+ bool isInverse, const QString &sender, const QString &chanName);
virtual inline void requestSetHighlightNick(HighlightNickType highlightNick)
{
bool _match(const QString &msgContents, const QString &msgSender, Message::Type msgType, Message::Flags msgFlags, const QString &bufferName, const QString ¤tNick, const QStringList identityNicks);
signals:
- void ruleAdded(QString name, bool isRegEx, bool isCaseSensitive, bool isEnabled, bool isInverse, QString chanName);
+ void ruleAdded(QString name, bool isRegEx, bool isCaseSensitive, bool isEnabled, bool isInverse, QString sender, QString chanName);
private:
HighlightRuleList _highlightRuleList;
public slots:
virtual inline void requestToggleHighlightRule(const QString &highlightRule) { toggleHighlightRule(highlightRule); }
virtual inline void requestRemoveHighlightRule(const QString &highlightRule) { removeHighlightRule(highlightRule); }
- virtual inline void requestAddHighlightRule(const QString &name, bool isRegEx, bool isCaseSensitive,
- bool isEnabled, bool isInverse, const QString &chanName)
+ virtual inline void requestAddHighlightRule(const QString &name, bool isRegEx, bool isCaseSensitive, bool isEnabled,
+ bool isInverse, const QString &sender, const QString &chanName)
{
- addHighlightRule(name, isRegEx, isCaseSensitive, isEnabled, isInverse, chanName);
+ addHighlightRule(name, isRegEx, isCaseSensitive, isEnabled, isInverse, sender, chanName);
}
}
-void CoreHighlightSettingsPage::addNewRow(QString name, bool regex, bool cs, bool enable, bool inverse, QString chanName, bool self)
+void CoreHighlightSettingsPage::addNewRow(const QString &name, bool regex, bool cs, bool enable, bool inverse, const QString &sender,
+ const QString &chanName, bool self)
{
ui.highlightTable->setRowCount(ui.highlightTable->rowCount()+1);
auto *chanNameItem = new QTableWidgetItem(chanName);
+ auto *senderItem = new QTableWidgetItem(sender);
+
int lastRow = ui.highlightTable->rowCount()-1;
ui.highlightTable->setItem(lastRow, CoreHighlightSettingsPage::NameColumn, nameItem);
ui.highlightTable->setItem(lastRow, CoreHighlightSettingsPage::RegExColumn, regexItem);
ui.highlightTable->setItem(lastRow, CoreHighlightSettingsPage::CsColumn, csItem);
ui.highlightTable->setItem(lastRow, CoreHighlightSettingsPage::EnableColumn, enableItem);
ui.highlightTable->setItem(lastRow, CoreHighlightSettingsPage::InverseColumn, inverseItem);
+ ui.highlightTable->setItem(lastRow, CoreHighlightSettingsPage::SenderColumn, senderItem);
ui.highlightTable->setItem(lastRow, CoreHighlightSettingsPage::ChanColumn, chanNameItem);
if (!self)
ui.highlightTable->setCurrentItem(nameItem);
- highlightList << HighlightRuleManager::HighlightRule(name, regex, cs, enable, inverse, chanName);
+ highlightList << HighlightRuleManager::HighlightRule(name, regex, cs, enable, inverse, sender, chanName);
}
case CoreHighlightSettingsPage::InverseColumn:
highlightRule.isInverse = (item->checkState() == Qt::Checked);
break;
+ case CoreHighlightSettingsPage::SenderColumn:
+ if (!item->text().isEmpty() && item->text().trimmed().isEmpty())
+ item->setText("");
+ highlightRule.sender = item->text();
+ break;
case CoreHighlightSettingsPage::ChanColumn:
if (!item->text().isEmpty() && item->text().trimmed().isEmpty())
item->setText("");
auto ruleManager = Client::highlightRuleManager();
for (HighlightRuleManager::HighlightRule rule : ruleManager->highlightRuleList()) {
- addNewRow(rule.name, rule.isRegEx, rule.isCaseSensitive, rule.isEnabled, rule.isInverse, rule.chanName);
+ addNewRow(rule.name, rule.isRegEx, rule.isCaseSensitive, rule.isEnabled, rule.isInverse, rule.sender, rule.chanName);
}
switch (ruleManager->highlightNick())
clonedManager.clear();
for (const HighlightRuleManager::HighlightRule &rule : highlightList) {
- clonedManager.addHighlightRule(rule.name, rule.isRegEx, rule.isCaseSensitive, rule.isEnabled, rule.isInverse, rule.chanName);
+ clonedManager.addHighlightRule(rule.name, rule.isRegEx, rule.isCaseSensitive, rule.isEnabled, rule.isInverse,
+ rule.sender, rule.chanName);
}
HighlightRuleManager::HighlightNickType highlightNickType = HighlightRuleManager::NoNick;
private slots:
void widgetHasChanged();
- void addNewRow(QString name = tr("highlight rule"), bool regex = false, bool cs = false, bool enable = true, bool inverse = false, QString chanName = "", bool self = false);
+ void addNewRow(const QString &name = tr("highlight rule"), bool regex = false, bool cs = false, bool enable = true,
+ bool inverse = false, const QString &sender = "", const QString &chanName = "", bool self = false);
void removeSelectedRows();
void selectRow(QTableWidgetItem *item);
void tableChanged(QTableWidgetItem *item);
CsColumn = 2,
EnableColumn = 3,
InverseColumn = 4,
- ChanColumn = 5,
- ColumnCount = 6
+ SenderColumn = 5,
+ ChanColumn = 6,
+ ColumnCount = 7
};
void emptyTable();
<string>Inverse</string>
</property>
</column>
+ <column>
+ <property name="text">
+ <string>Sender</string>
+ </property>
+ </column>
<column>
<property name="text">
<string>Channel</string>