summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Maudsley <richard.maudsley@isode.com>2014-07-16 12:37:25 (GMT)
committerSwift Review <review@swift.im>2014-07-29 08:36:54 (GMT)
commit9c5c731845881996f45b32ea6de12e0647f4634d (patch)
tree70331a822814ade469f07231ff0bf6dfbfa1fcde /Swift/QtUI/QtHighlightEditor.cpp
parent690cb7e85ff9dadbfca3e3bc91826161011712f1 (diff)
downloadswift-contrib-9c5c731845881996f45b32ea6de12e0647f4634d.zip
swift-contrib-9c5c731845881996f45b32ea6de12e0647f4634d.tar.bz2
Prevent nick highlight rule highlighting the entire message and remove default highlight colours
Test-Information: Add a nick highlight rule. Verify that it is triggered correctly in MUCs and that only the nick text is highlighted. Added unit tests. Change-Id: I9af1c900f4767383745afd36a5eadbe08f606432
Diffstat (limited to 'Swift/QtUI/QtHighlightEditor.cpp')
-rw-r--r--Swift/QtUI/QtHighlightEditor.cpp45
1 files changed, 17 insertions, 28 deletions
diff --git a/Swift/QtUI/QtHighlightEditor.cpp b/Swift/QtUI/QtHighlightEditor.cpp
index ce07003..8488d7d 100644
--- a/Swift/QtUI/QtHighlightEditor.cpp
+++ b/Swift/QtUI/QtHighlightEditor.cpp
@@ -8,99 +8,97 @@
* Copyright (c) 2014 Kevin Smith and Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#include <cassert>
#include <boost/lexical_cast.hpp>
#include <Swift/QtUI/UserSearch/QtSuggestingJIDInput.h>
#include <Swift/Controllers/HighlightManager.cpp>
#include <Swift/QtUI/QtHighlightEditor.h>
#include <Swift/QtUI/QtSwiftUtil.h>
#include <Swift/QtUI/QtSettingsProvider.h>
#include <QTreeWidgetItem>
#include <QFileDialog>
namespace Swift {
QtHighlightEditor::QtHighlightEditor(QtSettingsProvider* settings, QWidget* parent)
: QWidget(parent), settings_(settings), previousRow_(-1)
{
ui_.setupUi(this);
connect(ui_.listWidget, SIGNAL(currentRowChanged(int)), SLOT(onCurrentRowChanged(int)));
connect(ui_.newButton, SIGNAL(clicked()), SLOT(onNewButtonClicked()));
connect(ui_.deleteButton, SIGNAL(clicked()), SLOT(onDeleteButtonClicked()));
connect(ui_.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), SLOT(onApplyButtonClick()));
connect(ui_.buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), SLOT(onCancelButtonClick()));
connect(ui_.buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), SLOT(onOkButtonClick()));
connect(ui_.noColorRadio, SIGNAL(clicked()), SLOT(colorOtherSelect()));
- connect(ui_.defaultColorRadio, SIGNAL(clicked()), SLOT(colorOtherSelect()));
connect(ui_.customColorRadio, SIGNAL(clicked()), SLOT(colorCustomSelect()));
connect(ui_.noSoundRadio, SIGNAL(clicked()), SLOT(soundOtherSelect()));
connect(ui_.defaultSoundRadio, SIGNAL(clicked()), SLOT(soundOtherSelect()));
connect(ui_.customSoundRadio, SIGNAL(clicked()), SLOT(soundCustomSelect()));
/* replace the static line-edit control with the roster autocompleter */
ui_.dummySenderName->setVisible(false);
jid_ = new QtSuggestingJIDInput(this, settings);
ui_.senderName->addWidget(jid_);
jid_->onUserSelected.connect(boost::bind(&QtHighlightEditor::handleOnUserSelected, this, _1));
/* handle autocomplete */
connect(jid_, SIGNAL(textEdited(QString)), SLOT(handleContactSuggestionRequested(QString)));
/* we need to be notified if any of the state changes so that we can update our textual rule description */
connect(ui_.chatRadio, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.roomRadio, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.nickIsKeyword, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.allMsgRadio, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.senderRadio, SIGNAL(clicked()), SLOT(widgetClick()));
connect(jid_, SIGNAL(textChanged(const QString&)), SLOT(widgetClick()));
connect(ui_.keywordRadio, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.keyword, SIGNAL(textChanged(const QString&)), SLOT(widgetClick()));
connect(ui_.matchPartialWords, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.matchCase, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.noColorRadio, SIGNAL(clicked()), SLOT(widgetClick()));
- connect(ui_.defaultColorRadio, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.customColorRadio, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.noSoundRadio, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.defaultSoundRadio, SIGNAL(clicked()), SLOT(widgetClick()));
connect(ui_.customSoundRadio, SIGNAL(clicked()), SLOT(widgetClick()));
/* allow selection of a custom sound file */
connect(ui_.soundFileButton, SIGNAL(clicked()), SLOT(selectSoundFile()));
/* if these are not needed, then they should be removed */
ui_.moveUpButton->setVisible(false);
ui_.moveDownButton->setVisible(false);
setWindowTitle(tr("Highlight Rules"));
}
QtHighlightEditor::~QtHighlightEditor()
{
}
std::string formatShortDescription(const HighlightRule &rule)
{
const std::string chatOrRoom = (rule.getMatchChat() ? "chat" : "room");
std::vector<std::string> senders = rule.getSenders();
std::vector<std::string> keywords = rule.getKeywords();
if (senders.empty() && keywords.empty() && !rule.getNickIsKeyword()) {
return std::string("All ") + chatOrRoom + " messages.";
}
if (rule.getNickIsKeyword()) {
return std::string("All ") + chatOrRoom + " messages that mention my name.";
}
if (!senders.empty()) {
@@ -273,71 +271,70 @@ void QtHighlightEditor::setChildWidgetStates()
ui_.matchPartialWords->setEnabled(false);
ui_.matchCase->setEnabled(false);
}
if (ui_.chatRadio->isChecked()) {
ui_.allMsgRadio->setText(tr("Apply to all chat messages"));
} else {
ui_.allMsgRadio->setText(tr("Apply to all room messages"));
}
}
void QtHighlightEditor::widgetClick()
{
setChildWidgetStates();
HighlightRule rule = ruleFromDialog();
if (ui_.listWidget->currentItem()) {
ui_.listWidget->currentItem()->setText(P2QSTRING(formatShortDescription(rule)));
}
}
void QtHighlightEditor::disableDialog()
{
ui_.chatRadio->setEnabled(false);
ui_.roomRadio->setEnabled(false);
ui_.allMsgRadio->setEnabled(false);
ui_.nickIsKeyword->setEnabled(false);
ui_.senderRadio->setEnabled(false);
ui_.dummySenderName->setEnabled(false);
ui_.keywordRadio->setEnabled(false);
ui_.keyword->setEnabled(false);
ui_.matchPartialWords->setEnabled(false);
ui_.matchCase->setEnabled(false);
ui_.noColorRadio->setEnabled(false);
- ui_.defaultColorRadio->setEnabled(false);
ui_.customColorRadio->setEnabled(false);
ui_.foregroundColor->setEnabled(false);
ui_.backgroundColor->setEnabled(false);
ui_.noSoundRadio->setEnabled(false);
ui_.defaultSoundRadio->setEnabled(false);
ui_.customSoundRadio->setEnabled(false);
ui_.soundFile->setEnabled(false);
ui_.soundFileButton->setEnabled(false);
}
void QtHighlightEditor::handleContactSuggestionRequested(const QString& text)
{
std::string stdText = Q2PSTRING(text);
onContactSuggestionsRequested(stdText);
}
void QtHighlightEditor::selectSoundFile()
{
QString path = QFileDialog::getOpenFileName(this, tr("Select sound file..."), QString(), "Sounds (*.wav)");
ui_.soundFile->setText(path);
}
void QtHighlightEditor::handleOnUserSelected(const JID& jid) {
/* this might seem like it should be standard behaviour for the suggesting input box, but is not desirable in all cases */
jid_->setText(P2QSTRING(jid.toString()));
}
void QtHighlightEditor::populateList()
{
previousRow_ = -1;
ui_.listWidget->clear();
HighlightRulesListPtr rules = highlightManager_->getRules();
for (size_t i = 0; i < rules->getSize(); ++i) {
const HighlightRule& rule = rules->getRule(i);
QListWidgetItem *item = new QListWidgetItem();
@@ -367,158 +364,150 @@ int QtHighlightEditor::getSelectedRow() const
}
}
return -1;
}
HighlightRule QtHighlightEditor::ruleFromDialog()
{
HighlightRule rule;
if (ui_.chatRadio->isChecked()) {
rule.setMatchChat(true);
rule.setMatchMUC(false);
} else {
rule.setMatchChat(false);
rule.setMatchMUC(true);
}
if (ui_.senderRadio->isChecked()) {
QString senderName = jid_->text();
if (!senderName.isEmpty()) {
std::vector<std::string> senders;
senders.push_back(Q2PSTRING(senderName));
rule.setSenders(senders);
}
}
if (ui_.keywordRadio->isChecked()) {
QString keywordString = ui_.keyword->text();
if (!keywordString.isEmpty()) {
std::vector<std::string> keywords;
keywords.push_back(Q2PSTRING(keywordString));
rule.setKeywords(keywords);
}
}
- rule.setNickIsKeyword(ui_.nickIsKeyword->isChecked());
- rule.setMatchWholeWords(!ui_.matchPartialWords->isChecked());
- rule.setMatchCase(ui_.matchCase->isChecked());
+ if (ui_.nickIsKeyword->isChecked()) {
+ rule.setNickIsKeyword(true);
+ rule.setMatchWholeWords(true);
+ rule.setMatchCase(true);
+ } else {
+ rule.setMatchWholeWords(!ui_.matchPartialWords->isChecked());
+ rule.setMatchCase(ui_.matchCase->isChecked());
+ }
HighlightAction& action = rule.getAction();
if (ui_.noColorRadio->isChecked()) {
- action.setHighlightText(false);
- action.setTextColor("");
- action.setTextBackground("");
- } else if (ui_.defaultColorRadio->isChecked()) {
- action.setHighlightText(true);
action.setTextColor("");
action.setTextBackground("");
} else {
- action.setHighlightText(true);
action.setTextColor(Q2PSTRING(ui_.foregroundColor->getColor().name()));
action.setTextBackground(Q2PSTRING(ui_.backgroundColor->getColor().name()));
}
if (ui_.noSoundRadio->isChecked()) {
action.setPlaySound(false);
} else if (ui_.defaultSoundRadio->isChecked()) {
action.setPlaySound(true);
action.setSoundFile("");
} else {
action.setPlaySound(true);
action.setSoundFile(Q2PSTRING(ui_.soundFile->text()));
}
return rule;
}
void QtHighlightEditor::ruleToDialog(const HighlightRule& rule)
{
ui_.chatRadio->setEnabled(true);
ui_.roomRadio->setEnabled(true);
if (rule.getMatchMUC()) {
ui_.chatRadio->setChecked(false);
ui_.roomRadio->setChecked(true);
} else {
ui_.chatRadio->setChecked(true);
ui_.roomRadio->setChecked(false);
}
ui_.allMsgRadio->setEnabled(true);
ui_.allMsgRadio->setChecked(true); /* this is the default radio button */
jid_->setText("");
ui_.keyword->setText("");
ui_.matchPartialWords->setChecked(false);
ui_.matchCase->setChecked(false);
ui_.nickIsKeyword->setEnabled(true);
if (rule.getNickIsKeyword()) {
ui_.nickIsKeyword->setChecked(true);
}
ui_.senderRadio->setEnabled(true);
std::vector<std::string> senders = rule.getSenders();
if (!senders.empty()) {
ui_.senderRadio->setChecked(true);
jid_->setText(P2QSTRING(senders[0]));
}
ui_.keywordRadio->setEnabled(true);
std::vector<std::string> keywords = rule.getKeywords();
if (!keywords.empty()) {
ui_.keywordRadio->setChecked(true);
ui_.keyword->setText(P2QSTRING(keywords[0]));
ui_.matchPartialWords->setChecked(!rule.getMatchWholeWords());
ui_.matchCase->setChecked(rule.getMatchCase());
}
const HighlightAction& action = rule.getAction();
ui_.noColorRadio->setEnabled(true);
- ui_.defaultColorRadio->setEnabled(true);
ui_.customColorRadio->setEnabled(true);
- if (action.highlightText()) {
- if (action.getTextColor().empty() && action.getTextBackground().empty()) {
- ui_.defaultColorRadio->setChecked(true);
- ui_.foregroundColor->setEnabled(false);
- ui_.backgroundColor->setEnabled(false);
- } else {
- ui_.foregroundColor->setEnabled(true);
- ui_.backgroundColor->setEnabled(true);
- QColor foregroundColor(P2QSTRING(action.getTextColor()));
- ui_.foregroundColor->setColor(foregroundColor);
- QColor backgroundColor(P2QSTRING(action.getTextBackground()));
- ui_.backgroundColor->setColor(backgroundColor);
- ui_.customColorRadio->setChecked(true);
- }
- } else {
+ if (action.getTextColor().empty() && action.getTextBackground().empty()) {
ui_.noColorRadio->setChecked(true);
ui_.foregroundColor->setEnabled(false);
ui_.backgroundColor->setEnabled(false);
+ } else {
+ ui_.foregroundColor->setEnabled(true);
+ ui_.backgroundColor->setEnabled(true);
+ QColor foregroundColor(P2QSTRING(action.getTextColor()));
+ ui_.foregroundColor->setColor(foregroundColor);
+ QColor backgroundColor(P2QSTRING(action.getTextBackground()));
+ ui_.backgroundColor->setColor(backgroundColor);
+ ui_.customColorRadio->setChecked(true);
}
ui_.noSoundRadio->setEnabled(true);
ui_.defaultSoundRadio->setEnabled(true);
ui_.customSoundRadio->setEnabled(true);
ui_.soundFile->setText("");
ui_.soundFile->setEnabled(false);
ui_.soundFileButton->setEnabled(false);
if (action.playSound()) {
if (action.getSoundFile().empty()) {
ui_.defaultSoundRadio->setChecked(true);
} else {
ui_.customSoundRadio->setChecked(true);
ui_.soundFile->setText(P2QSTRING(action.getSoundFile()));
ui_.soundFile->setEnabled(true);
ui_.soundFileButton->setEnabled(true);
}
} else {
ui_.noSoundRadio->setChecked(true);
}
/* set radio button child option states */
setChildWidgetStates();
}
}