X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fhighlightsettingspage.cpp;h=af0af1f28615f4990cd0578c7921df1251ba3f09;hp=a915504d0035c9b32935b146d1bd96c972ded5ca;hb=ec747d2e6065e645e2cd768abc84923ef6a19705;hpb=4a5065255e652dd0c301bac0db41b7afb777ef49 diff --git a/src/qtui/settingspages/highlightsettingspage.cpp b/src/qtui/settingspages/highlightsettingspage.cpp index a915504d..af0af1f2 100644 --- a/src/qtui/settingspages/highlightsettingspage.cpp +++ b/src/qtui/settingspages/highlightsettingspage.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 by the Quassel Project * + * Copyright (C) 2005-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -20,54 +20,101 @@ #include "highlightsettingspage.h" -#include "qtui.h" -#include "uisettings.h" +#include #include +#include + +#include "client.h" +#include "icon.h" +#include "qtui.h" +#include "uisettings.h" -HighlightSettingsPage::HighlightSettingsPage(QWidget *parent) - : SettingsPage(tr("Interface"), tr("Highlight"), parent) +HighlightSettingsPage::HighlightSettingsPage(QWidget* parent) + : SettingsPage(tr("Interface"), + // In Monolithic mode, local highlights are replaced by remote highlights + Quassel::runMode() == Quassel::Monolithic ? tr("Legacy Highlights") : tr("Local Highlights"), + parent) { ui.setupUi(this); ui.highlightTable->verticalHeader()->hide(); ui.highlightTable->setShowGrid(false); - ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->setToolTip("RegEx: This option determines if the highlight rule should be interpreted as a regular expression or just as a keyword."); - ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->setWhatsThis("RegEx: This option determines if the highlight rule should be interpreted as a regular expression or just as a keyword."); - - ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->setToolTip("CS: This option determines if the highlight rule should be interpreted case sensitive."); - ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->setWhatsThis("CS: This option determines if the highlight rule should be interpreted case sensitive."); - - ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->setToolTip("Channel: This regular expression determines for which channels the highlight rule works. Leave blank to match any channel. Put ! in the beginning to negate. Case insensitive."); - ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->setWhatsThis("Channel: This regular expression determines for which channels the highlight rule works. Leave blank to match any channel. Put ! in the beginning to negate. Case insensitive."); - - ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::NameColumn, QHeaderView::Stretch); - ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::RegExColumn, QHeaderView::ResizeToContents); - ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::CsColumn, QHeaderView::ResizeToContents); - ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::EnableColumn, QHeaderView::ResizeToContents); - ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::ChanColumn, QHeaderView::ResizeToContents); - - connect(ui.add, SIGNAL(clicked(bool)), this, SLOT(addNewRow())); - connect(ui.remove, SIGNAL(clicked(bool)), this, SLOT(removeSelectedRows())); - //TODO: search for a better signal (one that emits everytime a selection has been changed for one item) - connect(ui.highlightTable, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(selectRow(QTableWidgetItem *))); - - connect(ui.highlightAllNicks, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.highlightCurrentNick, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.highlightNoNick, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.nicksCaseSensitive, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.add, SIGNAL(clicked()), this, SLOT(widgetHasChanged())); - connect(ui.remove, SIGNAL(clicked()), this, SLOT(widgetHasChanged())); - connect(ui.highlightTable, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(tableChanged(QTableWidgetItem *))); -} + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::EnableColumn)->setToolTip(tr("Enable/disable this rule")); + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::EnableColumn) + ->setWhatsThis(ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::EnableColumn)->toolTip()); + + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::NameColumn)->setToolTip(tr("Phrase to match")); + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::NameColumn) + ->setWhatsThis(ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::NameColumn)->toolTip()); + + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn) + ->setToolTip(tr("RegEx: This option determines if the highlight rule and Channel " + "should be interpreted as regular expressions or just as keywords.")); + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn) + ->setWhatsThis(ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->toolTip()); + + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn) + ->setToolTip(tr("CS: This option determines if the highlight rule and Channel " + "should be interpreted case sensitive.")); + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn) + ->setWhatsThis(ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->toolTip()); + + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn) + ->setToolTip(tr("

Channel: Semicolon separated list of channel/query names, leave " + "blank to match any name.

" + "

Example:
" + "#quassel*; #foobar; !#quasseldroid
" + "would match on #foobar and any channel starting with #quassel " + "except for #quasseldroid
" + "

If only inverted names are specified, it will match anything except for " + "what's specified (implicit wildcard).

" + "

Example:
" + "!#quassel*; !#foobar
" + "would match anything except for #foobar or any channel starting with " + "#quassel

")); + ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn) + ->setWhatsThis(ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->toolTip()); + + ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::NameColumn, QHeaderView::Stretch); + ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::RegExColumn, QHeaderView::ResizeToContents); + ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::CsColumn, QHeaderView::ResizeToContents); + ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::EnableColumn, QHeaderView::ResizeToContents); + ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::ChanColumn, QHeaderView::ResizeToContents); + + // Information icon + ui.localHighlightsIcon->setPixmap(icon::get("dialog-information").pixmap(16)); + + // Set up client/monolithic local highlights information + if (Quassel::runMode() == Quassel::Monolithic) { + // We're running in Monolithic mode, core/client version in total sync. Discourage the use + // of local (legacy) highlights as it's identical to setting remote highlights. + ui.localHighlightsLabel->setText(tr("Legacy Highlights are replaced by Highlights")); + } + else { + // We're running in client/split mode, allow for splitting the details. + ui.localHighlightsLabel->setText(tr("Local Highlights apply to this device only")); + } + connect(ui.add, &QAbstractButton::clicked, this, [this]() { addNewRow(); }); + connect(ui.remove, &QAbstractButton::clicked, this, &HighlightSettingsPage::removeSelectedRows); + // TODO: search for a better signal (one that emits everytime a selection has been changed for one item) + connect(ui.highlightTable, &QTableWidget::itemClicked, this, &HighlightSettingsPage::selectRow); + + connect(ui.highlightAllNicks, &QAbstractButton::clicked, this, &HighlightSettingsPage::widgetHasChanged); + connect(ui.highlightCurrentNick, &QAbstractButton::clicked, this, &HighlightSettingsPage::widgetHasChanged); + connect(ui.highlightNoNick, &QAbstractButton::clicked, this, &HighlightSettingsPage::widgetHasChanged); + connect(ui.nicksCaseSensitive, &QAbstractButton::clicked, this, &HighlightSettingsPage::widgetHasChanged); + connect(ui.add, &QAbstractButton::clicked, this, &HighlightSettingsPage::widgetHasChanged); + connect(ui.remove, &QAbstractButton::clicked, this, &HighlightSettingsPage::widgetHasChanged); + connect(ui.highlightTable, &QTableWidget::itemChanged, this, &HighlightSettingsPage::tableChanged); +} bool HighlightSettingsPage::hasDefaults() const { return true; } - void HighlightSettingsPage::defaults() { ui.highlightCurrentNick->setChecked(true); @@ -77,41 +124,59 @@ void HighlightSettingsPage::defaults() widgetHasChanged(); } - void HighlightSettingsPage::addNewRow(QString name, bool regex, bool cs, bool enable, QString chanName, bool self) { - ui.highlightTable->setRowCount(ui.highlightTable->rowCount()+1); + ui.highlightTable->setRowCount(ui.highlightTable->rowCount() + 1); - QTableWidgetItem *nameItem = new QTableWidgetItem(name); + QTableWidgetItem* enableItem = new QTableWidgetItem(""); + if (enable) + enableItem->setCheckState(Qt::Checked); + else + enableItem->setCheckState(Qt::Unchecked); + enableItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + + auto* nameItem = new QTableWidgetItem(name); - QTableWidgetItem *regexItem = new QTableWidgetItem(""); + QTableWidgetItem* regexItem = new QTableWidgetItem(""); if (regex) regexItem->setCheckState(Qt::Checked); else regexItem->setCheckState(Qt::Unchecked); - regexItem->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable); + regexItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - QTableWidgetItem *csItem = new QTableWidgetItem(""); + QTableWidgetItem* csItem = new QTableWidgetItem(""); if (cs) csItem->setCheckState(Qt::Checked); else csItem->setCheckState(Qt::Unchecked); - csItem->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable); - - QTableWidgetItem *enableItem = new QTableWidgetItem(""); - if (enable) - enableItem->setCheckState(Qt::Checked); - else - enableItem->setCheckState(Qt::Unchecked); - enableItem->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable); - - QTableWidgetItem *chanNameItem = new QTableWidgetItem(chanName); - - int lastRow = ui.highlightTable->rowCount()-1; + csItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + + auto* chanNameItem = new QTableWidgetItem(chanName); + + enableItem->setToolTip(tr("Enable/disable this rule")); + nameItem->setToolTip(tr("Phrase to match")); + regexItem->setToolTip(tr("RegEx: This option determines if the highlight rule and Channel " + "should be interpreted as regular expressions or just as keywords.")); + csItem->setToolTip(tr("CS: This option determines if the highlight rule and Channel " + "should be interpreted case sensitive.")); + chanNameItem->setToolTip(tr("

Channel: Semicolon separated list of channel/query names, leave " + "blank to match any name.

" + "

Example:
" + "#quassel*; #foobar; !#quasseldroid
" + "would match on #foobar and any channel starting with #quassel " + "except for #quasseldroid
" + "

If only inverted names are specified, it will match anything except for " + "what's specified (implicit wildcard).

" + "

Example:
" + "!#quassel*; !#foobar
" + "would match anything except for #foobar or any channel starting with " + "#quassel

")); + + int lastRow = ui.highlightTable->rowCount() - 1; + ui.highlightTable->setItem(lastRow, HighlightSettingsPage::EnableColumn, enableItem); ui.highlightTable->setItem(lastRow, HighlightSettingsPage::NameColumn, nameItem); ui.highlightTable->setItem(lastRow, HighlightSettingsPage::RegExColumn, regexItem); ui.highlightTable->setItem(lastRow, HighlightSettingsPage::CsColumn, csItem); - ui.highlightTable->setItem(lastRow, HighlightSettingsPage::EnableColumn, enableItem); ui.highlightTable->setItem(lastRow, HighlightSettingsPage::ChanColumn, chanNameItem); if (!self) @@ -127,17 +192,16 @@ void HighlightSettingsPage::addNewRow(QString name, bool regex, bool cs, bool en highlightList.append(highlightRule); } - void HighlightSettingsPage::removeSelectedRows() { QList selectedRows; - QList selectedItemList = ui.highlightTable->selectedItems(); - foreach(QTableWidgetItem *selectedItem, selectedItemList) { + QList selectedItemList = ui.highlightTable->selectedItems(); + foreach (QTableWidgetItem* selectedItem, selectedItemList) { selectedRows.append(selectedItem->row()); } - qSort(selectedRows.begin(), selectedRows.end(), qGreater()); + std::sort(selectedRows.begin(), selectedRows.end(), std::greater<>()); int lastRow = -1; - foreach(int row, selectedRows) { + foreach (int row, selectedRows) { if (row != lastRow) { ui.highlightTable->removeRow(row); highlightList.removeAt(row); @@ -146,15 +210,13 @@ void HighlightSettingsPage::removeSelectedRows() } } - -void HighlightSettingsPage::selectRow(QTableWidgetItem *item) +void HighlightSettingsPage::selectRow(QTableWidgetItem* item) { int row = item->row(); bool selected = item->isSelected(); - ui.highlightTable->setRangeSelected(QTableWidgetSelectionRange(row, 0, row, HighlightSettingsPage::ColumnCount-1), selected); + ui.highlightTable->setRangeSelected(QTableWidgetSelectionRange(row, 0, row, HighlightSettingsPage::ColumnCount - 1), selected); } - void HighlightSettingsPage::emptyTable() { // ui.highlight and highlightList should have the same size, but just to make sure. @@ -169,16 +231,17 @@ void HighlightSettingsPage::emptyTable() } } - -void HighlightSettingsPage::tableChanged(QTableWidgetItem *item) +void HighlightSettingsPage::tableChanged(QTableWidgetItem* item) { - if (item->row()+1 > highlightList.size()) + if (item->row() + 1 > highlightList.size()) return; QVariantMap highlightRule = highlightList.value(item->row()).toMap(); - switch (item->column()) - { + switch (item->column()) { + case HighlightSettingsPage::EnableColumn: + highlightRule["Enable"] = (item->checkState() == Qt::Checked); + break; case HighlightSettingsPage::NameColumn: if (item->text() == "") item->setText(tr("this shouldn't be empty")); @@ -190,9 +253,6 @@ void HighlightSettingsPage::tableChanged(QTableWidgetItem *item) case HighlightSettingsPage::CsColumn: highlightRule["CS"] = (item->checkState() == Qt::Checked); break; - case HighlightSettingsPage::EnableColumn: - highlightRule["Enable"] = (item->checkState() == Qt::Checked); - break; case HighlightSettingsPage::ChanColumn: if (!item->text().isEmpty() && item->text().trimmed().isEmpty()) item->setText(""); @@ -203,6 +263,37 @@ void HighlightSettingsPage::tableChanged(QTableWidgetItem *item) emit widgetHasChanged(); } +void HighlightSettingsPage::on_localHighlightsDetails_clicked() +{ + // Show information specific to client/monolithic differences + if (Quassel::runMode() == Quassel::Monolithic) { + // We're running in Monolithic mode, core/client version in total sync. Discourage the use + // of local (legacy) highlights as it's identical to setting remote highlights. + QMessageBox::information(this, + tr("Legacy Highlights vs. Highlights"), + QString("

%1


%2


%3

") + .arg(tr("Legacy Highlights are replaced by Highlights"), + tr("These highlights will keep working for now, but you should move to " + "the improved highlight rules when you can."), + tr("Configure the new style of highlights in " + "%1.") + .arg(tr("Highlights")))); + } + else { + // We're running in client/split mode, allow for splitting the details. + QMessageBox::information(this, + tr("Local Highlights vs. Remote Highlights"), + QString("

%1


%2


%3

") + .arg(tr("Local Highlights apply to this device only"), + tr("Highlights configured on this page only apply to your current " + "device."), + tr("Configure highlights for all of your devices in " + "%1.") + .arg(tr("Remote Highlights").replace(" ", " ")))); + // Re-use translations of "Remote Highlights" as this is a word-for-word reference, forcing + // all spaces to be non-breaking + } +} void HighlightSettingsPage::load() { @@ -210,7 +301,7 @@ void HighlightSettingsPage::load() emptyTable(); - foreach(QVariant highlight, notificationSettings.highlightList()) { + foreach (QVariant highlight, notificationSettings.highlightList()) { QVariantMap highlightRule = highlight.toMap(); QString name = highlightRule["Name"].toString(); bool regex = highlightRule["RegEx"].toBool(); @@ -221,8 +312,7 @@ void HighlightSettingsPage::load() addNewRow(name, regex, cs, enable, chanName, true); } - switch (notificationSettings.highlightNick()) - { + switch (notificationSettings.highlightNick()) { case NotificationSettings::NoNick: ui.highlightNoNick->setChecked(true); break; @@ -238,15 +328,12 @@ void HighlightSettingsPage::load() setChangedState(false); } - void HighlightSettingsPage::save() { NotificationSettings notificationSettings; notificationSettings.setHighlightList(highlightList); - NotificationSettings::HighlightNickType highlightNickType; - if (ui.highlightNoNick->isChecked()) - highlightNickType = NotificationSettings::NoNick; + NotificationSettings::HighlightNickType highlightNickType = NotificationSettings::NoNick; if (ui.highlightCurrentNick->isChecked()) highlightNickType = NotificationSettings::CurrentNick; if (ui.highlightAllNicks->isChecked()) @@ -259,30 +346,29 @@ void HighlightSettingsPage::save() setChangedState(false); } - void HighlightSettingsPage::widgetHasChanged() { bool changed = testHasChanged(); - if (changed != hasChanged()) setChangedState(changed); + if (changed != hasChanged()) + setChangedState(changed); } - bool HighlightSettingsPage::testHasChanged() { NotificationSettings notificationSettings; - NotificationSettings::HighlightNickType highlightNickType; - if (ui.highlightNoNick->isChecked()) - highlightNickType = NotificationSettings::NoNick; + NotificationSettings::HighlightNickType highlightNickType = NotificationSettings::NoNick; if (ui.highlightCurrentNick->isChecked()) highlightNickType = NotificationSettings::CurrentNick; if (ui.highlightAllNicks->isChecked()) highlightNickType = NotificationSettings::AllNicks; - if (notificationSettings.highlightNick() != highlightNickType) return true; - if (notificationSettings.nicksCaseSensitive() != ui.nicksCaseSensitive->isChecked()) return true; - - if (notificationSettings.highlightList() != highlightList) return true; + if (notificationSettings.highlightNick() != highlightNickType) + return true; + if (notificationSettings.nicksCaseSensitive() != ui.nicksCaseSensitive->isChecked()) + return true; + if (notificationSettings.highlightList() != highlightList) + return true; return false; }