More fixes, save state correctly, test state of checkboxes correctly
[quassel.git] / src / qtui / settingspages / chatmonitorsettingspage.cpp
index 54b5347..c833dd8 100644 (file)
@@ -3,16 +3,16 @@
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU Blank Public License as published by  *
+ *   it under the terms of the GNU Blank Public License as published by    *
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
  *   This program is distributed in the hope that it will be useful,       *
  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU Blank Public License for more details.                          *
+ *   GNU Blank Public License for more details.                            *
  *                                                                         *
- *   You should have received a copy of the GNU Blank Public License     *
+ *   You should have received a copy of the GNU Blank Public License       *
  *   along with this program; if not, write to the                         *
  *   Free Software Foundation, Inc.,                                       *
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 #include <QVariant>
 
 ChatMonitorSettingsPage::ChatMonitorSettingsPage(QWidget *parent)
-  : SettingsPage(tr("Behaviour"), tr("ChatMonitor"), parent) {
+  : SettingsPage(tr("General"), tr("Chat Monitor"), parent) {
   ui.setupUi(this);
 
   ui.activateBuffer->setIcon(SmallIcon("go-next"));
   ui.deactivateBuffer->setIcon(SmallIcon("go-previous"));
-  // initialize pointers
-  configAvailable = 0;
-  configActive = 0;
+
+  // setup available buffers config (for the bufferview on the left)
+  _configAvailable = new BufferViewConfig(-667, this);
+  _configAvailable->setBufferViewName("tmpChatMonitorAvailableBuffers");
+  _configAvailable->setSortAlphabetically(true);
+  _configAvailable->setDisableDecoration(true);
+  _configAvailable->setNetworkId(NetworkId());
+  _configAvailable->setInitialized();
+
+  // setup active buffers config (for the bufferview on the right)
+  _configActive = new BufferViewConfig(-666, this);
+  _configActive->setBufferViewName("tmpChatMonitorActiveBuffers");
+  _configActive->setSortAlphabetically(true);
+  _configActive->setDisableDecoration(true);
+  _configActive->setNetworkId(NetworkId());
+  _configActive->setInitialized();
 
   // fill combobox with operation modes
-  ui.operationMode->addItem("Opt-In", ChatViewSettings::OptIn);
-  ui.operationMode->addItem("Opt-Out", ChatViewSettings::OptOut);
+  ui.operationMode->addItem(tr("Opt In"), ChatViewSettings::OptIn);
+  ui.operationMode->addItem(tr("Opt Out"), ChatViewSettings::OptOut);
 
   // connect slots
-  connect(ui.operationMode, SIGNAL(currentIndexChanged(int)), this, SLOT(switchOperationMode(int)));
+  connect(ui.operationMode, SIGNAL(currentIndexChanged(int)), SLOT(switchOperationMode(int)));
+  connect(ui.showHighlights, SIGNAL(toggled(bool)), SLOT(widgetHasChanged()));
+  connect(ui.showOwnMessages, SIGNAL(toggled(bool)), SLOT(widgetHasChanged()));
 }
 
 bool ChatMonitorSettingsPage::hasDefaults() const {
@@ -55,7 +70,8 @@ bool ChatMonitorSettingsPage::hasDefaults() const {
 
 void ChatMonitorSettingsPage::defaults() {
   settings["OperationMode"] = ChatViewSettings::OptOut;
-  settings["HighlightAlways"] = false;
+  settings["ShowHighlights"] = false;
+  settings["ShowOwnMsgs"] = false;
   settings["Buffers"] = QVariant();
   settings["Default"] = true;
   load();
@@ -63,32 +79,16 @@ void ChatMonitorSettingsPage::defaults() {
 }
 
 void ChatMonitorSettingsPage::load() {
-  delete configAvailable;
-  delete configActive;
-
-  if (settings.contains("Default"))
+  if(settings.contains("Default"))
     settings.remove("Default");
   else
     loadSettings();
 
   ui.operationMode->setCurrentIndex(settings["OperationMode"].toInt() - 1);
-  ui.highlightAlways->setChecked(settings["HighlightAlways"].toBool());
-
-  // setup available buffers config (for the bufferview on the left)
-  configAvailable = new BufferViewConfig(-667);
-  configAvailable->setBufferViewName("tmpChatMonitorAvailableBuffers");
-  configAvailable->sortAlphabetically();
-  configAvailable->setNetworkId(NetworkId());
-  configAvailable->setInitialized();
-
-  // setup active buffers config (for the bufferview on the right)
-  configActive = new BufferViewConfig(-666);
-  configActive->setBufferViewName("tmpChatMonitorActiveBuffers");
-  configActive->setSortAlphabetically(true);
-  configActive->setNetworkId(NetworkId());
-  configActive->setInitialized();
+  ui.showHighlights->setChecked(settings["ShowHighlights"].toBool());
+  ui.showOwnMessages->setChecked(settings["ShowOwnMsgs"].toBool());
 
-  //   get all available buffer Ids
+  // get all available buffer Ids
   QList<BufferId> allBufferIds = Client::networkModel()->allBufferIds();
 
   if(!settings["Buffers"].toList().isEmpty()) {
@@ -96,14 +96,16 @@ void ChatMonitorSettingsPage::load() {
     // remove all active buffers from the available config
     foreach(QVariant v, settings["Buffers"].toList()) {
       bufferIdsFromConfig << v.value<BufferId>();
-      allBufferIds.removeOne(v.value<BufferId>());
+      allBufferIds.removeAll(v.value<BufferId>());
     }
-    configActive->initSetBufferList(bufferIdsFromConfig);
+    qSort(bufferIdsFromConfig.begin(), bufferIdsFromConfig.end(), bufferIdLessThan);
+    _configActive->initSetBufferList(bufferIdsFromConfig);
   }
-  ui.activeBuffers->setFilteredModel(Client::bufferModel(), configActive);
+  ui.activeBuffers->setFilteredModel(Client::bufferModel(), _configActive);
 
-  configAvailable->initSetBufferList(allBufferIds);
-  ui.availableBuffers->setFilteredModel(Client::bufferModel(), configAvailable);
+  qSort(allBufferIds.begin(), allBufferIds.end(), bufferIdLessThan);
+  _configAvailable->initSetBufferList(allBufferIds);
+  ui.availableBuffers->setFilteredModel(Client::bufferModel(), _configAvailable);
 
   setChangedState(false);
 }
@@ -113,23 +115,25 @@ void ChatMonitorSettingsPage::loadSettings() {
   settings["OperationMode"] = static_cast<ChatViewSettings::OperationMode>(chatViewSettings.value("OperationMode", QVariant()).toInt());
 
   // Load default behavior if no or invalid settings found
-  if (settings["OperationMode"] == ChatViewSettings::InvalidMode) {
+  if(settings["OperationMode"] == ChatViewSettings::InvalidMode) {
     switchOperationMode(ui.operationMode->findData(ChatViewSettings::OptOut));
     settings["OperationMode"] == ChatViewSettings::OptOut;
   }
-  settings["HighlightAlways"] = chatViewSettings.value("HighlightAlways", false);
+  settings["ShowHighlights"] = chatViewSettings.value("ShowHighlights", false);
+  settings["ShowOwnMsgs"] = chatViewSettings.value("ShowOwnMsgs", false);
   settings["Buffers"] = chatViewSettings.value("Buffers", QVariantList());
 }
 
 void ChatMonitorSettingsPage::save() {
   ChatViewSettings chatViewSettings("ChatMonitor");
   // save operation mode
-  chatViewSettings.setValue("OperationMode", settings["OperationMode"]);
-  chatViewSettings.setValue("HighlightAlways", settings["HighlightAlways"]);
+  chatViewSettings.setValue("OperationMode", ui.operationMode->currentIndex() + 1);
+  chatViewSettings.setValue("ShowHighlights", ui.showHighlights->isChecked());
+  chatViewSettings.setValue("ShowOwnMsgs", ui.showOwnMessages->isChecked());
 
   // save list of active buffers
-  QVariantList saveableBufferIdList; 
-  foreach(BufferId id, configActive->bufferList()) {
+  QVariantList saveableBufferIdList;
+  foreach(BufferId id, _configActive->bufferList()) {
     saveableBufferIdList << QVariant::fromValue<BufferId>(id);
   }
 
@@ -144,7 +148,23 @@ void ChatMonitorSettingsPage::widgetHasChanged() {
 }
 
 bool ChatMonitorSettingsPage::testHasChanged() {
-  if (configAvailable != configActive) return true;
+  if(settings["OperationMode"] != ui.operationMode->itemData(ui.operationMode->currentIndex()))
+    return true;
+  if(settings["ShowHighlights"].toBool() != ui.showHighlights->isChecked())
+    return true;
+  if(settings["ShowOwnMsgs"].toBool() != ui.showOwnMessages->isChecked())
+    return true;
+
+  if(_configActive->bufferList().count() != settings["Buffers"].toList().count())
+    return true;
+
+  QSet<BufferId> uiBufs = _configActive->bufferList().toSet();
+  QSet<BufferId> settingsBufs;
+  foreach(QVariant v, settings["Buffers"].toList())
+    settingsBufs << v.value<BufferId>();
+  if(uiBufs != settingsBufs)
+    return true;
+
   return false;
 }
 
@@ -159,13 +179,13 @@ void ChatMonitorSettingsPage::toggleBuffers(BufferView *inView, BufferViewConfig
 
   // Fill QMap with selected items ordered by selection row
   QMap<int, QList<BufferId> > selectedBuffers;
-  foreach (QModelIndex index, inView->selectionModel()->selectedIndexes()) {
+  foreach(QModelIndex index, inView->selectionModel()->selectedIndexes()) {
     BufferId inBufferId = index.data(NetworkModel::BufferIdRole).value<BufferId>();
     if(index.data(NetworkModel::ItemTypeRole) == NetworkModel::NetworkItemType) {
-      // TODO: 
+      // TODO:
       //  If item is a network: move over all children and skip other selected items of this node
     }
-    else if (index.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType) {
+    else if(index.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType) {
       selectedBuffers[index.parent().row()] << inBufferId;
     }
   }
@@ -198,24 +218,18 @@ void ChatMonitorSettingsPage::toggleBuffers(BufferView *inView, BufferViewConfig
 
 void ChatMonitorSettingsPage::on_activateBuffer_clicked() {
   if (ui.availableBuffers->currentIndex().isValid() && ui.availableBuffers->selectionModel()->hasSelection()) {
-    toggleBuffers(ui.availableBuffers, configAvailable, ui.activeBuffers, configActive);
+    toggleBuffers(ui.availableBuffers, _configAvailable, ui.activeBuffers, _configActive);
     widgetHasChanged();
   }
 }
 
 void ChatMonitorSettingsPage::on_deactivateBuffer_clicked() {
   if (ui.activeBuffers->currentIndex().isValid() && ui.activeBuffers->selectionModel()->hasSelection()) {
-    toggleBuffers(ui.activeBuffers, configActive, ui.availableBuffers, configAvailable);
+    toggleBuffers(ui.activeBuffers, _configActive, ui.availableBuffers, _configAvailable);
     widgetHasChanged();
   }
 }
 
-void ChatMonitorSettingsPage::on_highlightAlways_toggled(bool state)
-{
-  settings["HighlightAlways"] = state;
-  widgetHasChanged();
-}
-
 /*
   switchOperationMode gets called on combobox signal currentIndexChanged.
   modeIndex is the row id in combobox itemlist
@@ -225,13 +239,9 @@ void ChatMonitorSettingsPage::switchOperationMode(int modeIndex) {
 
   if(newMode == ChatViewSettings::OptIn) {
     ui.labelActiveBuffers->setText(tr("Show:"));
-  } 
+  }
   else if(newMode == ChatViewSettings::OptOut) {
     ui.labelActiveBuffers->setText(tr("Ignore:"));
   }
-
-  if(settings["OperationMode"] != newMode) {
-    setChangedState(true);
-  }
-  settings["OperationMode"] = newMode;
+  widgetHasChanged();
 }