From edfd69a55e4f52576ab58306da8a82b1df890d5f Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Sun, 18 Jan 2015 20:12:02 +0100
Subject: Add "Reset defaults" button to highlight editor window.

The button is only shown if the current rules are *not* the default
set of rules.

Test-Information:

Tested on Mac OS X 10.9.5.

Change-Id: Ibf1856af04c6bdacf6102d240e6fe5f6071cb46a

diff --git a/Swift/Controllers/HighlightAction.cpp b/Swift/Controllers/HighlightAction.cpp
index 492d4d2..80d9d85 100644
--- a/Swift/Controllers/HighlightAction.cpp
+++ b/Swift/Controllers/HighlightAction.cpp
@@ -4,6 +4,12 @@
  * See Documentation/Licenses/BSD-simplified.txt for more information.
  */
 
+/*
+ * Copyright (c) 2015 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
 #include <Swift/Controllers/HighlightAction.h>
 
 namespace Swift {
@@ -25,4 +31,32 @@ void HighlightAction::setPlaySound(bool playSound)
 	}
 }
 
+bool operator ==(HighlightAction const& a, HighlightAction const& b) {
+	if (a.highlightAllText() != b.highlightAllText()) {
+		return false;
+	}
+
+	if (a.getTextColor() != b.getTextColor()) {
+		return false;
+	}
+
+	if (a.getTextBackground() != b.getTextBackground()) {
+		return false;
+	}
+
+	if (a.playSound() != b.playSound()) {
+		return false;
+	}
+
+	if (a.getSoundFile() != b.getSoundFile()) {
+		return false;
+	}
+
+	return true;
+}
+
+bool operator !=(HighlightAction const& a, HighlightAction const& b) {
+	return !(a == b);
+}
+
 }
diff --git a/Swift/Controllers/HighlightAction.h b/Swift/Controllers/HighlightAction.h
index 8136c62..a9e0cee 100644
--- a/Swift/Controllers/HighlightAction.h
+++ b/Swift/Controllers/HighlightAction.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014 Isode Limited.
+ * Copyright (c) 2014-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -66,6 +66,9 @@ namespace Swift {
 			std::string soundFile_;
 	};
 
+	bool operator ==(HighlightAction const& a, HighlightAction const& b);
+	bool operator !=(HighlightAction const& a, HighlightAction const& b);
+
 	template<class Archive>
 	void HighlightAction::serialize(Archive& ar, const unsigned int /*version*/)
 	{
diff --git a/Swift/Controllers/HighlightManager.cpp b/Swift/Controllers/HighlightManager.cpp
index ee1e9ed..383f5df 100644
--- a/Swift/Controllers/HighlightManager.cpp
+++ b/Swift/Controllers/HighlightManager.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014 Isode Limited.
+ * Copyright (c) 2014-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -75,6 +75,7 @@ std::vector<HighlightRule> HighlightManager::getDefaultRules()
 	HighlightRule r;
 	r.setMatchChat(true);
 	r.getAction().setPlaySound(true);
+	r.setMatchWholeWords(true);
 	rules.push_back(r);
 	return rules;
 }
@@ -136,4 +137,12 @@ Highlighter* HighlightManager::createHighlighter()
 	return new Highlighter(this);
 }
 
+bool HighlightManager::isDefaultRulesList() const {
+	return getDefaultRules() == rules_->list_;
+}
+
+void HighlightManager::resetToDefaultRulesList() {
+	rules_->list_ = getDefaultRules();
+}
+
 }
diff --git a/Swift/Controllers/HighlightManager.h b/Swift/Controllers/HighlightManager.h
index 4d94bd2..d37643d 100644
--- a/Swift/Controllers/HighlightManager.h
+++ b/Swift/Controllers/HighlightManager.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014 Isode Limited.
+ * Copyright (c) 2014-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -48,6 +48,9 @@ namespace Swift {
 
 			boost::shared_ptr<const HighlightManager::HighlightRulesList> getRules() const { return rules_; }
 
+			bool isDefaultRulesList() const;
+			void resetToDefaultRulesList();
+
 			HighlightRule getRule(int index) const;
 			void setRule(int index, const HighlightRule& rule);
 			void insertRule(int index, const HighlightRule& rule);
diff --git a/Swift/Controllers/HighlightRule.cpp b/Swift/Controllers/HighlightRule.cpp
index f1a7cef..40b7560 100644
--- a/Swift/Controllers/HighlightRule.cpp
+++ b/Swift/Controllers/HighlightRule.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014 Isode Limited.
+ * Copyright (c) 2014-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -149,4 +149,40 @@ bool HighlightRule::isEmpty() const
 	return senders_.empty() && keywords_.empty() && !nickIsKeyword_ && !matchChat_ && !matchMUC_ && action_.isEmpty();
 }
 
+bool operator ==(HighlightRule const& a, HighlightRule const& b) {
+	if (a.getSenders() != b.getSenders()) {
+		return false;
+	}
+
+	if (a.getKeywords() != b.getKeywords()) {
+		return false;
+	}
+
+	if (a.getNickIsKeyword() != b.getNickIsKeyword()) {
+		return false;
+	}
+
+	if (a.getMatchChat() != b.getMatchChat()) {
+		return false;
+	}
+
+	if (a.getMatchMUC() != b.getMatchMUC()) {
+		return false;
+	}
+
+	if (a.getMatchCase() != b.getMatchCase()) {
+		return false;
+	}
+
+	if (a.getMatchWholeWords() != b.getMatchWholeWords()) {
+		return false;
+	}
+
+	if (a.getAction() != b.getAction()) {
+		return false;
+	}
+
+	return true;
+}
+
 }
diff --git a/Swift/Controllers/HighlightRule.h b/Swift/Controllers/HighlightRule.h
index fdc6109..02b4864 100644
--- a/Swift/Controllers/HighlightRule.h
+++ b/Swift/Controllers/HighlightRule.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014 Isode Limited.
+ * Copyright (c) 2014-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -84,6 +84,8 @@ namespace Swift {
 			HighlightAction action_;
 	};
 
+	bool operator ==(HighlightRule const& a, HighlightRule const& b);
+
 	template<class Archive>
 	void HighlightRule::serialize(Archive& ar, const unsigned int /*version*/)
 	{
diff --git a/Swift/QtUI/QtHighlightEditor.cpp b/Swift/QtUI/QtHighlightEditor.cpp
index df9f6b2..c6e4319 100644
--- a/Swift/QtUI/QtHighlightEditor.cpp
+++ b/Swift/QtUI/QtHighlightEditor.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014 Isode Limited.
+ * Copyright (c) 2014-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -38,6 +38,7 @@ QtHighlightEditor::QtHighlightEditor(QtSettingsProvider* settings, QWidget* pare
 	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_.buttonBox->button(QDialogButtonBox::RestoreDefaults), SIGNAL(clicked()), SLOT(onResetToDefaultRulesClicked()));
 
 	connect(ui_.noColorRadio, SIGNAL(clicked()), SLOT(colorOtherSelect()));
 	connect(ui_.customColorRadio, SIGNAL(clicked()), SLOT(colorCustomSelect()));
@@ -122,6 +123,8 @@ void QtHighlightEditor::show()
 		selectRow(0);
 	}
 
+	updateResetToDefaultRulesVisibility();
+
 	/* prepare default states */
 	widgetClick();
 
@@ -246,6 +249,8 @@ void QtHighlightEditor::onCurrentRowChanged(int currentRow)
 	}
 
 	previousRow_ = currentRow;
+
+	updateResetToDefaultRulesVisibility();
 }
 
 void QtHighlightEditor::onApplyButtonClick()
@@ -350,6 +355,12 @@ void QtHighlightEditor::selectSoundFile()
 	ui_.soundFile->setText(path);
 }
 
+void QtHighlightEditor::onResetToDefaultRulesClicked() {
+	highlightManager_->resetToDefaultRulesList();
+	populateList();
+	updateResetToDefaultRulesVisibility();
+}
+
 void QtHighlightEditor::handleOnUserSelected(const Contact::ref& contact) {
 	/* this might seem like it should be standard behaviour for the suggesting input box, but is not desirable in all cases */
 	if (contact->jid.isValid()) {
@@ -539,4 +550,8 @@ void QtHighlightEditor::ruleToDialog(const HighlightRule& rule)
 	setChildWidgetStates();
 }
 
+void QtHighlightEditor::updateResetToDefaultRulesVisibility() {
+	ui_.buttonBox->button(QDialogButtonBox::RestoreDefaults)->setVisible(!highlightManager_->isDefaultRulesList());
+}
+
 }
diff --git a/Swift/QtUI/QtHighlightEditor.h b/Swift/QtUI/QtHighlightEditor.h
index ad51820..bcceb72 100644
--- a/Swift/QtUI/QtHighlightEditor.h
+++ b/Swift/QtUI/QtHighlightEditor.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014 Isode Limited.
+ * Copyright (c) 2014-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -51,6 +51,7 @@ namespace Swift {
 			void disableDialog();
 			void handleContactSuggestionRequested(const QString& text);
 			void selectSoundFile();
+			void onResetToDefaultRulesClicked();
 
 		private:
 			void handleOnUserSelected(const Contact::ref& contact);
@@ -59,6 +60,7 @@ namespace Swift {
 			int getSelectedRow() const;
 			HighlightRule ruleFromDialog();
 			void ruleToDialog(const HighlightRule& rule);
+			void updateResetToDefaultRulesVisibility();
 
 			Ui::QtHighlightEditor ui_;
 			QtSettingsProvider* settings_;
diff --git a/Swift/QtUI/QtHighlightEditor.ui b/Swift/QtUI/QtHighlightEditor.ui
index 775771f..6d2338d 100644
--- a/Swift/QtUI/QtHighlightEditor.ui
+++ b/Swift/QtUI/QtHighlightEditor.ui
@@ -444,22 +444,9 @@
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_9">
      <item>
-      <spacer name="horizontalSpacer_4">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
       <widget class="QDialogButtonBox" name="buttonBox">
        <property name="standardButtons">
-        <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+        <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults</set>
        </property>
       </widget>
      </item>
-- 
cgit v0.10.2-6-g49f6