Reworking highlighting a bit
authorManuel Nickschas <sputnick@quassel-irc.org>
Mon, 20 Oct 2008 15:24:38 +0000 (17:24 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Mon, 20 Oct 2008 15:36:32 +0000 (17:36 +0200)
* Adding an option to match nicks case-insensitive
* Fix bugs in NotificationsSettingsPage
* Simplify regexps
* No testing (yet)

src/client/clientsettings.cpp
src/client/clientsettings.h
src/qtui/qtuimessageprocessor.cpp
src/qtui/qtuimessageprocessor.h
src/qtui/settingspages/highlightsettingspage.cpp
src/qtui/settingspages/highlightsettingspage.ui

index 980bb2f..3120078 100644 (file)
@@ -126,3 +126,11 @@ void NotificationSettings::setHighlightNick(NotificationSettings::HighlightNickT
 NotificationSettings::HighlightNickType NotificationSettings::highlightNick() {
   return (NotificationSettings::HighlightNickType) localValue("highlightNick", CurrentNick).toInt();
 }
 NotificationSettings::HighlightNickType NotificationSettings::highlightNick() {
   return (NotificationSettings::HighlightNickType) localValue("highlightNick", CurrentNick).toInt();
 }
+
+void NotificationSettings::setNicksCaseSensitive(bool cs) {
+  setLocalValue("Highlights/NicksCaseSensitive", cs);
+}
+
+bool NotificationSettings::nicksCaseSensitive() {
+  return localValue("Highlights/NicksCaseSensitive", true).toBool();
+}
index 6c7c6db..01353d7 100644 (file)
@@ -78,16 +78,19 @@ class NotificationSettings : public ClientSettings {
     };
 
     NotificationSettings();
     };
 
     NotificationSettings();
-    
+
     inline void setValue(const QString &key, const QVariant &data) { setLocalValue(key, data); }
     inline QVariant value(const QString &key, const QVariant &def = QVariant()) { return localValue(key, def); }
     inline void remove(const QString &key) { removeLocalKey(key); }
     inline void setValue(const QString &key, const QVariant &data) { setLocalValue(key, data); }
     inline QVariant value(const QString &key, const QVariant &def = QVariant()) { return localValue(key, def); }
     inline void remove(const QString &key) { removeLocalKey(key); }
-      
+
     void setHighlightList(const QVariantList &highlightList);
     QVariantList highlightList();
 
     void setHighlightNick(HighlightNickType);
     HighlightNickType highlightNick();
 
     void setHighlightList(const QVariantList &highlightList);
     QVariantList highlightList();
 
     void setHighlightNick(HighlightNickType);
     HighlightNickType highlightNick();
 
+    void setNicksCaseSensitive(bool);
+    bool nicksCaseSensitive();
+
 };
 #endif
 };
 #endif
index 9399d1f..e7fa198 100644 (file)
@@ -36,11 +36,13 @@ QtUiMessageProcessor::QtUiMessageProcessor(QObject *parent)
     _msgCount(0)
 {
   NotificationSettings notificationSettings;
     _msgCount(0)
 {
   NotificationSettings notificationSettings;
+  _nicksCaseSensitive = notificationSettings.nicksCaseSensitive();
   _highlightNick = notificationSettings.highlightNick();
   highlightListChanged(notificationSettings.highlightList());
   _highlightNick = notificationSettings.highlightNick();
   highlightListChanged(notificationSettings.highlightList());
+  notificationSettings.notify("Highlights/NicksCaseSensitive", this, SLOT(nicksCaseSensitiveChanged(const QVariant &)));
   notificationSettings.notify("highlightList", this, SLOT(highlightListChanged(const QVariant &)));
   notificationSettings.notify("highlightNick", this, SLOT(highlightNickChanged(const QVariant &)));
   notificationSettings.notify("highlightList", this, SLOT(highlightListChanged(const QVariant &)));
   notificationSettings.notify("highlightNick", this, SLOT(highlightNickChanged(const QVariant &)));
-  
+
   _processTimer.setInterval(0);
   connect(&_processTimer, SIGNAL(timeout()), this, SLOT(processNextMessage()));
 }
   _processTimer.setInterval(0);
   connect(&_processTimer, SIGNAL(timeout()), this, SLOT(processNextMessage()));
 }
@@ -71,7 +73,7 @@ void QtUiMessageProcessor::process(QList<Message> &msgs) {
   Client::messageModel()->insertMessages(msgs);
   return;
 
   Client::messageModel()->insertMessages(msgs);
   return;
 
-  
+
   if(msgs.isEmpty()) return;
   _processQueue.append(msgs);
   _msgCount += msgs.count();
   if(msgs.isEmpty()) return;
   _processQueue.append(msgs);
   _msgCount += msgs.count();
@@ -124,7 +126,7 @@ void QtUiMessageProcessor::checkForHighlight(Message &msg) {
   if(!((msg.type() & (Message::Plain | Message::Notice | Message::Action)) && !(msg.flags() & Message::Self)))
     return;
 
   if(!((msg.type() & (Message::Plain | Message::Notice | Message::Action)) && !(msg.flags() & Message::Self)))
     return;
 
-  //NotificationSettings notificationSettings;
+  // TODO: Cache this (per network)
   const Network *net = Client::network(msg.bufferInfo().networkId());
   if(net && !net->myNick().isEmpty()) {
     QStringList nickList;
   const Network *net = Client::network(msg.bufferInfo().networkId());
   if(net && !net->myNick().isEmpty()) {
     QStringList nickList;
@@ -136,23 +138,24 @@ void QtUiMessageProcessor::checkForHighlight(Message &msg) {
         nickList = myIdentity->nicks();
     }
     foreach(QString nickname, nickList) {
         nickList = myIdentity->nicks();
     }
     foreach(QString nickname, nickList) {
-      QRegExp nickRegExp("^(.*\\W)?" + QRegExp::escape(nickname) + "(\\W.*)?$");
-      if(nickRegExp.exactMatch(msg.contents())) {
+      QRegExp nickRegExp("\\b" + QRegExp::escape(nickname) + "\\b",
+                          _nicksCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
+      if(nickRegExp.indexIn(msg.contents()) >= 0) {
         msg.setFlags(msg.flags() | Message::Highlight);
         return;
       }
     }
 
     for(int i = 0; i < _highlightRules.count(); i++) {
         msg.setFlags(msg.flags() | Message::Highlight);
         return;
       }
     }
 
     for(int i = 0; i < _highlightRules.count(); i++) {
-      const HighlightRule &rule = _highlightRules[i];
+      const HighlightRule &rule = _highlightRules.at(i);
       if(!rule.isEnabled)
        continue;
 
       QRegExp userRegExp;
       if(rule.isRegExp) {
       if(!rule.isEnabled)
        continue;
 
       QRegExp userRegExp;
       if(rule.isRegExp) {
-        userRegExp = QRegExp(rule.name, rule.caseSensitive);
+        userRegExp = QRegExp(rule.name, rule.caseSensitive? Qt::CaseSensitive : Qt::CaseInsensitive);
       } else {
       } else {
-        userRegExp = QRegExp("^(.*\\W)?" + QRegExp::escape(rule.name) + "(\\W.*)?$", rule.caseSensitive);
+        userRegExp = QRegExp("\\b" + QRegExp::escape(rule.name) + "\\b", rule.caseSensitive? Qt::CaseSensitive : Qt::CaseInsensitive);
       }
       if(userRegExp.exactMatch(msg.contents())) {
         msg.setFlags(msg.flags() | Message::Highlight);
       }
       if(userRegExp.exactMatch(msg.contents())) {
         msg.setFlags(msg.flags() | Message::Highlight);
@@ -162,6 +165,10 @@ void QtUiMessageProcessor::checkForHighlight(Message &msg) {
   }
 }
 
   }
 }
 
+void QtUiMessageProcessor::nicksCaseSensitiveChanged(const QVariant &variant) {
+  _nicksCaseSensitive = variant.toBool();
+}
+
 void QtUiMessageProcessor::highlightListChanged(const QVariant &variant) {
   QVariantList varList = variant.toList();
 
 void QtUiMessageProcessor::highlightListChanged(const QVariant &variant) {
   QVariantList varList = variant.toList();
 
@@ -171,9 +178,9 @@ void QtUiMessageProcessor::highlightListChanged(const QVariant &variant) {
   while(iter != iterEnd) {
     QVariantMap rule;
     _highlightRules << HighlightRule(rule["name"].toString(),
   while(iter != iterEnd) {
     QVariantMap rule;
     _highlightRules << HighlightRule(rule["name"].toString(),
-                                    rule["enable"].toBool(),
-                                    rule["cs"].toBool() ? Qt::CaseSensitive : Qt::CaseInsensitive,
-                                    rule["regex"].toBool());
+                                     rule["enable"].toBool(),
+                                     rule["cs"].toBool() ? Qt::CaseSensitive : Qt::CaseInsensitive,
+                                     rule["regex"].toBool());
     iter++;
   }
 }
     iter++;
   }
 }
index 57ed9bc..de2d88c 100644 (file)
@@ -48,6 +48,7 @@ public slots:
 
 private slots:
   void processNextMessage();
 
 private slots:
   void processNextMessage();
+  void nicksCaseSensitiveChanged(const QVariant &variant);
   void highlightListChanged(const QVariant &variant);
   void highlightNickChanged(const QVariant &variant);
 
   void highlightListChanged(const QVariant &variant);
   void highlightNickChanged(const QVariant &variant);
 
@@ -69,11 +70,13 @@ private:
     bool isEnabled;
     Qt::CaseSensitivity caseSensitive;
     bool isRegExp;
     bool isEnabled;
     Qt::CaseSensitivity caseSensitive;
     bool isRegExp;
-    inline HighlightRule(const QString &name, bool enabled, Qt::CaseSensitivity cs, bool regExp) : name(name), isEnabled(enabled), caseSensitive(cs), isRegExp(regExp) {}
+    inline HighlightRule(const QString &name, bool enabled, Qt::CaseSensitivity cs, bool regExp)
+    : name(name), isEnabled(enabled), caseSensitive(cs), isRegExp(regExp) {}
   };
   };
-  
+
   QList<HighlightRule> _highlightRules;
   NotificationSettings::HighlightNickType _highlightNick;
   QList<HighlightRule> _highlightRules;
   NotificationSettings::HighlightNickType _highlightNick;
+  bool _nicksCaseSensitive;
 };
 
 #endif
 };
 
 #endif
index 9c290af..45567d1 100644 (file)
@@ -39,9 +39,9 @@ HighlightSettingsPage::HighlightSettingsPage(QWidget *parent)
   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->horizontalHeader()->setResizeMode(HighlightSettingsPage::NameColumn, QHeaderView::Stretch);
   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->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::RegExColumn, QHeaderView::ResizeToContents);
+  ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::CsColumn, QHeaderView::ResizeToContents);
+  ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::EnableColumn, QHeaderView::ResizeToContents);
 
   connect(ui.add, SIGNAL(clicked(bool)), this, SLOT(addNewRow()));
   connect(ui.remove, SIGNAL(clicked(bool)), this, SLOT(removeSelectedRows()));
 
   connect(ui.add, SIGNAL(clicked(bool)), this, SLOT(addNewRow()));
   connect(ui.remove, SIGNAL(clicked(bool)), this, SLOT(removeSelectedRows()));
@@ -51,6 +51,7 @@ HighlightSettingsPage::HighlightSettingsPage(QWidget *parent)
   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.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 *)));
   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 *)));
@@ -62,6 +63,7 @@ bool HighlightSettingsPage::hasDefaults() const {
 
 void HighlightSettingsPage::defaults() {
   ui.highlightCurrentNick->setChecked(true);
 
 void HighlightSettingsPage::defaults() {
   ui.highlightCurrentNick->setChecked(true);
+  ui.nicksCaseSensitive->setChecked(true);
   emptyTable();
 
   widgetHasChanged();
   emptyTable();
 
   widgetHasChanged();
@@ -145,7 +147,7 @@ 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();
     return;
 
   QVariantMap highlightRule = highlightList.value(item->row()).toMap();
@@ -198,6 +200,7 @@ void HighlightSettingsPage::load() {
       ui.highlightAllNicks->setChecked(true);
       break;
   }
       ui.highlightAllNicks->setChecked(true);
       break;
   }
+  ui.nicksCaseSensitive->setChecked(notificationSettings.nicksCaseSensitive());
 
   setChangedState(false);
 }
 
   setChangedState(false);
 }
@@ -207,14 +210,15 @@ void HighlightSettingsPage::save() {
   notificationSettings.setHighlightList(highlightList);
 
   NotificationSettings::HighlightNickType highlightNickType;
   notificationSettings.setHighlightList(highlightList);
 
   NotificationSettings::HighlightNickType highlightNickType;
-  if(ui.highlightNoNick->isChecked()) 
+  if(ui.highlightNoNick->isChecked())
     highlightNickType = NotificationSettings::NoNick;
     highlightNickType = NotificationSettings::NoNick;
-  if(ui.highlightCurrentNick->isChecked()) 
+  if(ui.highlightCurrentNick->isChecked())
     highlightNickType = NotificationSettings::CurrentNick;
     highlightNickType = NotificationSettings::CurrentNick;
-  if(ui.highlightAllNicks->isChecked()) 
+  if(ui.highlightAllNicks->isChecked())
     highlightNickType = NotificationSettings::AllNicks;
 
   notificationSettings.setHighlightNick(highlightNickType);
     highlightNickType = NotificationSettings::AllNicks;
 
   notificationSettings.setHighlightNick(highlightNickType);
+  notificationSettings.setNicksCaseSensitive(ui.nicksCaseSensitive->isChecked());
 
   load();
   setChangedState(false);
 
   load();
   setChangedState(false);
@@ -229,20 +233,17 @@ bool HighlightSettingsPage::testHasChanged() {
   NotificationSettings notificationSettings;
 
   NotificationSettings::HighlightNickType highlightNickType;
   NotificationSettings notificationSettings;
 
   NotificationSettings::HighlightNickType highlightNickType;
-  if(ui.highlightNoNick->isChecked()) 
+  if(ui.highlightNoNick->isChecked())
     highlightNickType = NotificationSettings::NoNick;
     highlightNickType = NotificationSettings::NoNick;
-  if(ui.highlightCurrentNick->isChecked()) 
+  if(ui.highlightCurrentNick->isChecked())
     highlightNickType = NotificationSettings::CurrentNick;
     highlightNickType = NotificationSettings::CurrentNick;
-  if(ui.highlightAllNicks->isChecked()) 
+  if(ui.highlightAllNicks->isChecked())
     highlightNickType = NotificationSettings::AllNicks;
 
   if(notificationSettings.highlightNick() != highlightNickType) return true;
     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.highlightList() != highlightList) return true;
 
-  return true;
+  return false;
 }
 }
-
-
-
-
index ea21020..1929460 100644 (file)
@@ -16,7 +16,7 @@
    <item>
     <widget class="QGroupBox" name="groupBox" >
      <property name="title" >
    <item>
     <widget class="QGroupBox" name="groupBox" >
      <property name="title" >
-      <string>Highlight list</string>
+      <string>Custom Highlights</string>
      </property>
      <layout class="QGridLayout" >
       <item rowspan="3" row="0" column="0" >
      </property>
      <layout class="QGridLayout" >
       <item rowspan="3" row="0" column="0" >
@@ -25,7 +25,7 @@
          <string/>
         </property>
         <property name="styleSheet" >
          <string/>
         </property>
         <property name="styleSheet" >
-         <string/>
+         <string notr="true" />
         </property>
         <column>
          <property name="text" >
         </property>
         <column>
          <property name="text" >
@@ -68,7 +68,7 @@
         <property name="orientation" >
          <enum>Qt::Vertical</enum>
         </property>
         <property name="orientation" >
          <enum>Qt::Vertical</enum>
         </property>
-        <property name="sizeHint" >
+        <property name="sizeHint" stdset="0" >
          <size>
           <width>20</width>
           <height>40</height>
          <size>
           <width>20</width>
           <height>40</height>
@@ -82,7 +82,7 @@
    <item>
     <widget class="QGroupBox" name="groupBox_2" >
      <property name="title" >
    <item>
     <widget class="QGroupBox" name="groupBox_2" >
      <property name="title" >
-      <string>Highlight nicks</string>
+      <string>Highlight Nicks</string>
      </property>
      <layout class="QVBoxLayout" >
       <item>
      </property>
      <layout class="QVBoxLayout" >
       <item>
         </property>
        </widget>
       </item>
         </property>
        </widget>
       </item>
+      <item>
+       <widget class="QCheckBox" name="nicksCaseSensitive" >
+        <property name="text" >
+         <string>Case sensitive</string>
+        </property>
+        <property name="checked" >
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
   </layout>
  </widget>
  <resources/>
      </layout>
     </widget>
    </item>
   </layout>
  </widget>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>highlightNoNick</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>nicksCaseSensitive</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>64</x>
+     <y>350</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>69</x>
+     <y>381</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
 </ui>
 </ui>