Chan -> Channel, it's just nicer in user-visible strings
[quassel.git] / src / qtui / settingspages / highlightsettingspage.cpp
index 09887ba..5005b3d 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel IRC Team                         *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 
 
 HighlightSettingsPage::HighlightSettingsPage(QWidget *parent)
-  : SettingsPage(tr("Behaviour"), tr("Highlight"), parent) {
+  : SettingsPage(tr("Interface"), tr("Highlight"), parent) {
   ui.setupUi(this);
   ui.highlightTable->verticalHeader()->hide();
   ui.highlightTable->setShowGrid(false);
-  ui.highlightTable->setColumnWidth( 0, 50 );
-  ui.highlightTable->setColumnWidth( 2, 50 );
-  ui.highlightTable->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed); 
-  ui.highlightTable->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch);
-  ui.highlightTable->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed); 
+
+  ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->setToolTip("<b>RegEx</b>: This option determines if the highlight rule should be interpreted as a <b>regular expression</b> or just as a keyword.");
+  ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->setWhatsThis("<b>RegEx</b>: This option determines if the highlight rule should be interpreted as a <b>regular expression</b> or just as a keyword.");
+
+  ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->setToolTip("<b>CS</b>: This option determines if the highlight rule should be interpreted <b>case sensitive</b>.");
+  ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->setWhatsThis("<b>CS</b>: This option determines if the highlight rule should be interpreted <b>case sensitive</b>.");
+
+  ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->setToolTip("<b>Channel</b>: This regular expression determines for which <b>channels</b> the highlight rule works. Leave blank to match any channel. Put <b>!</b> in the beginning to negate. Case insensitive.");
+  ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->setWhatsThis("<b>Channel</b>: This regular expression determines for which <b>channels</b> the highlight rule works. Leave blank to match any channel. Put <b>!</b> 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 *)));
@@ -54,20 +67,31 @@ bool HighlightSettingsPage::hasDefaults() const {
 
 void HighlightSettingsPage::defaults() {
   ui.highlightCurrentNick->setChecked(true);
+  ui.nicksCaseSensitive->setChecked(false);
   emptyTable();
 
   widgetHasChanged();
 }
 
-void HighlightSettingsPage::addNewRow(bool regex, QString name, bool enable) {
+void HighlightSettingsPage::addNewRow(QString name, bool regex, bool cs, bool enable, QString chanName, bool self) {
   ui.highlightTable->setRowCount(ui.highlightTable->rowCount()+1);
+
+  QTableWidgetItem *nameItem = new QTableWidgetItem(name);
+
   QTableWidgetItem *regexItem = new QTableWidgetItem("");
   if(regex)
     regexItem->setCheckState(Qt::Checked);
   else
     regexItem->setCheckState(Qt::Unchecked);
   regexItem->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
-  QTableWidgetItem *nameItem = new QTableWidgetItem(name);
+
+  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);
@@ -75,15 +99,24 @@ void HighlightSettingsPage::addNewRow(bool regex, QString name, bool enable) {
     enableItem->setCheckState(Qt::Unchecked);
   enableItem->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 
+  QTableWidgetItem *chanNameItem = new QTableWidgetItem(chanName);
+
   int lastRow = ui.highlightTable->rowCount()-1;
-  ui.highlightTable->setItem(lastRow, 0, regexItem);
-  ui.highlightTable->setItem(lastRow, 1, nameItem);
-  ui.highlightTable->setItem(lastRow, 2, 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)
+    ui.highlightTable->setCurrentItem(nameItem);
 
   QVariantMap highlightRule;
-  highlightRule["regex"] = regex;
-  highlightRule["name"] = name;
-  highlightRule["enable"] = enable;
+  highlightRule["Name"] = name;
+  highlightRule["RegEx"] = regex;
+  highlightRule["CS"] = cs;
+  highlightRule["Enable"] = enable;
+  highlightRule["Channel"] = chanName;
 
   highlightList.append(highlightRule);
 }
@@ -108,7 +141,7 @@ void HighlightSettingsPage::removeSelectedRows() {
 void HighlightSettingsPage::selectRow(QTableWidgetItem *item) {
   int row = item->row();
   bool selected = item->isSelected();
-  ui.highlightTable->setRangeSelected(QTableWidgetSelectionRange(row, 0, row, 2), selected);
+  ui.highlightTable->setRangeSelected(QTableWidgetSelectionRange(row, 0, row, HighlightSettingsPage::ColumnCount-1), selected);
 }
 
 void HighlightSettingsPage::emptyTable() {
@@ -125,23 +158,31 @@ void HighlightSettingsPage::emptyTable() {
 }
 
 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())
   {
-    case 0:
-      highlightRule["regex"] = (item->checkState() == Qt::Checked);
-      break;
-    case 1:
-      if(item->text() == "") 
+    case HighlightSettingsPage::NameColumn:
+      if(item->text() == "")
         item->setText(tr("this shouldn't be empty"));
-      highlightRule["name"] = item->text();
+      highlightRule["Name"] = item->text();
+      break;
+    case HighlightSettingsPage::RegExColumn:
+      highlightRule["RegEx"] = (item->checkState() == Qt::Checked);
+      break;
+    case HighlightSettingsPage::CsColumn:
+      highlightRule["CS"] = (item->checkState() == Qt::Checked);
       break;
-    case 2:
-      highlightRule["enable"] = (item->checkState() == Qt::Checked);
+    case HighlightSettingsPage::EnableColumn:
+      highlightRule["Enable"] = (item->checkState() == Qt::Checked);
+      break;
+    case HighlightSettingsPage::ChanColumn:
+      if(!item->text().isEmpty() && item->text().trimmed().isEmpty())
+        item->setText("");
+      highlightRule["Channel"] = item->text();
       break;
   }
   highlightList[item->row()] = highlightRule;
@@ -155,14 +196,28 @@ void HighlightSettingsPage::load() {
 
   foreach(QVariant highlight, notificationSettings.highlightList()) {
     QVariantMap highlightRule = highlight.toMap();
-    bool regex = highlightRule["regex"].toBool();
-    QString name = highlightRule["name"].toString();
-    bool enable = highlightRule["enable"].toBool();
+    QString name = highlightRule["Name"].toString();
+    bool regex = highlightRule["RegEx"].toBool();
+    bool cs = highlightRule["CS"].toBool();
+    bool enable = highlightRule["Enable"].toBool();
+    QString chanName = highlightRule["Channel"].toString();
 
-    addNewRow(regex, name, enable);
+    addNewRow(name, regex, cs, enable, chanName, true);
   }
 
-  ui.highlightCurrentNick->setChecked(notificationSettings.highlightCurrentNick());
+  switch(notificationSettings.highlightNick())
+  {
+    case NotificationSettings::NoNick:
+      ui.highlightNoNick->setChecked(true);
+      break;
+    case NotificationSettings::CurrentNick:
+      ui.highlightCurrentNick->setChecked(true);
+      break;
+    case NotificationSettings::AllNicks:
+      ui.highlightAllNicks->setChecked(true);
+      break;
+  }
+  ui.nicksCaseSensitive->setChecked(notificationSettings.nicksCaseSensitive());
 
   setChangedState(false);
 }
@@ -170,7 +225,17 @@ void HighlightSettingsPage::load() {
 void HighlightSettingsPage::save() {
   NotificationSettings notificationSettings;
   notificationSettings.setHighlightList(highlightList);
-  notificationSettings.setHighlightCurrentNick(ui.highlightCurrentNick->isChecked());
+
+  NotificationSettings::HighlightNickType highlightNickType;
+  if(ui.highlightNoNick->isChecked())
+    highlightNickType = NotificationSettings::NoNick;
+  if(ui.highlightCurrentNick->isChecked())
+    highlightNickType = NotificationSettings::CurrentNick;
+  if(ui.highlightAllNicks->isChecked())
+    highlightNickType = NotificationSettings::AllNicks;
+
+  notificationSettings.setHighlightNick(highlightNickType);
+  notificationSettings.setNicksCaseSensitive(ui.nicksCaseSensitive->isChecked());
 
   load();
   setChangedState(false);
@@ -184,12 +249,18 @@ void HighlightSettingsPage::widgetHasChanged() {
 bool HighlightSettingsPage::testHasChanged() {
   NotificationSettings notificationSettings;
 
-  if(notificationSettings.highlightCurrentNick() != ui.highlightCurrentNick->isChecked()) return true;
-  if(notificationSettings.highlightList() != highlightList) return true;
-
-  return true;
-}
-
+  NotificationSettings::HighlightNickType highlightNickType;
+  if(ui.highlightNoNick->isChecked())
+    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;
 
+  return false;
+}