Provide a contextmenu for the ignore list
[quassel.git] / src / qtui / settingspages / ignorelistsettingspage.cpp
index 62dfc88..61f0864 100644 (file)
@@ -27,7 +27,7 @@
 #include <QMessageBox>
 #include <QString>
 #include <QEvent>
-
+#include <QDebug>
 #include "iconloader.h"
 
 IgnoreListSettingsPage::IgnoreListSettingsPage(QWidget *parent)
@@ -72,6 +72,8 @@ IgnoreListSettingsPage::~IgnoreListSettingsPage() {
 void IgnoreListSettingsPage::load() {
   if(_ignoreListModel.configChanged())
     _ignoreListModel.revert();
+  ui.ignoreListView->selectionModel()->reset();
+  ui.editIgnoreRuleButton->setEnabled(false);
 }
 
 void IgnoreListSettingsPage::defaults() {
@@ -82,6 +84,8 @@ void IgnoreListSettingsPage::save() {
   if(_ignoreListModel.configChanged()) {
     _ignoreListModel.commit();
   }
+  ui.ignoreListView->selectionModel()->reset();
+  ui.editIgnoreRuleButton->setEnabled(false);
 }
 
 void IgnoreListSettingsPage::enableDialog(bool enabled) {
@@ -102,8 +106,18 @@ void IgnoreListSettingsPage::deleteSelectedIgnoreRule() {
   _ignoreListModel.removeIgnoreRule(ui.ignoreListView->selectionModel()->selectedIndexes()[0].row());
 }
 
-void IgnoreListSettingsPage::newIgnoreRule() {
-  IgnoreListEditDlg *dlg = new IgnoreListEditDlg(-1, IgnoreListManager::IgnoreListItem(), this);
+void IgnoreListSettingsPage::newIgnoreRule(QString rule) {
+  IgnoreListManager::IgnoreListItem newItem = IgnoreListManager::IgnoreListItem();
+  newItem.isActive = true;
+  bool enableOkButton = false;
+  if(!rule.isEmpty()) {
+    // we're called from contextmenu
+    newItem.ignoreRule = rule;
+    enableOkButton = true;
+  }
+
+  IgnoreListEditDlg *dlg = new IgnoreListEditDlg(newItem, this, enableOkButton);
+  dlg->enableOkButton(enableOkButton);
 
   while(dlg->exec() == QDialog::Accepted) {
     if(!_ignoreListModel.newIgnoreRule(dlg->ignoreListItem())) {
@@ -117,7 +131,7 @@ void IgnoreListSettingsPage::newIgnoreRule() {
 
       IgnoreListManager::IgnoreListItem item = dlg->ignoreListItem();
       delete dlg;
-      dlg = new IgnoreListEditDlg(-1, item, this);
+      dlg = new IgnoreListEditDlg(item, this);
     }
     else {
       break;
@@ -130,13 +144,24 @@ void IgnoreListSettingsPage::editSelectedIgnoreRule() {
   if(!ui.ignoreListView->selectionModel()->hasSelection())
     return;
   int row = ui.ignoreListView->selectionModel()->selectedIndexes()[0].row();
-  IgnoreListEditDlg dlg(row, _ignoreListModel.ignoreListItemAt(row), this);
+  IgnoreListEditDlg dlg(_ignoreListModel.ignoreListItemAt(row), this);
   dlg.setAttribute(Qt::WA_DeleteOnClose, false);
   if(dlg.exec() == QDialog::Accepted) {
     _ignoreListModel.setIgnoreListItemAt(row, dlg.ignoreListItem());
   }
 }
 
+void IgnoreListSettingsPage::editIgnoreRule(const QString &ignoreRule) {
+  ui.ignoreListView->selectionModel()->select(_ignoreListModel.indexOf(ignoreRule), QItemSelectionModel::Select);
+  if(ui.ignoreListView->selectionModel()->hasSelection())// && ui.ignoreListView->selectionModel()->selectedIndexes()[0].row() != -1)
+    editSelectedIgnoreRule();
+  else
+    newIgnoreRule(ignoreRule);
+}
+
+/*
+  IgnoreListDelegate
+*/
 void IgnoreListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
   if(index.column() == 0) {
     QStyle *style = QApplication::style();
@@ -155,12 +180,41 @@ void IgnoreListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op
     QStyledItemDelegate::paint(painter, option, index);
 }
 
-IgnoreListEditDlg::IgnoreListEditDlg(int row, const IgnoreListManager::IgnoreListItem &item, QWidget *parent)
-    : QDialog(parent), _selectedRow(row), _ignoreListItem(item), _hasChanged(false) {
+// provide interactivity for the checkboxes
+bool IgnoreListDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
+                                     const QStyleOptionViewItem &option, const QModelIndex &index) {
+  Q_UNUSED(option)
+  switch(event->type()) {
+    case QEvent::MouseButtonRelease:
+      model->setData(index, !index.data().toBool());
+      return true;
+      // don't show the default editor for the column
+    case QEvent::MouseButtonDblClick:
+      return true;
+    default:
+      return false;
+  }
+}
+
+/*
+  IgnoreListEditDlg
+*/
+IgnoreListEditDlg::IgnoreListEditDlg(const IgnoreListManager::IgnoreListItem &item, QWidget *parent, bool enabled)
+    : QDialog(parent), _ignoreListItem(item), _hasChanged(enabled) {
   ui.setupUi(this);
   setAttribute(Qt::WA_DeleteOnClose, false);
   setModal(true);
 
+  // setup buttongroups
+  // this could be moved to .ui file with qt4.5
+  _typeButtonGroup.addButton(ui.senderTypeButton, 0);
+  _typeButtonGroup.addButton(ui.messageTypeButton, 1);
+  _strictnessButtonGroup.addButton(ui.dynamicStrictnessButton, 0);
+  _strictnessButtonGroup.addButton(ui.permanentStrictnessButton, 1);
+  _scopeButtonGroup.addButton(ui.globalScopeButton, 0);
+  _scopeButtonGroup.addButton(ui.networkScopeButton, 1);
+  _scopeButtonGroup.addButton(ui.channelScopeButton, 2);
+
   ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
 
   ui.ignoreRuleLineEdit->setText(item.ignoreRule);
@@ -199,11 +253,9 @@ IgnoreListEditDlg::IgnoreListEditDlg(int row, const IgnoreListManager::IgnoreLis
 
   connect(ui.ignoreRuleLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(widgetHasChanged()));
   connect(ui.scopeRuleTextEdit, SIGNAL(textChanged()), this, SLOT(widgetHasChanged()));
-  connect(ui.typeButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(widgetHasChanged()));
-  connect(ui.strictnessButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(widgetHasChanged()));
-  connect(ui.scopeButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(widgetHasChanged()));
-  connect(ui.typeButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(widgetHasChanged()));
-  connect(ui.isRegExCheckBox, SIGNAL(stateChanged(int)), this, SLOT(widgetHasChanged()));
+  connect(&_typeButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(widgetHasChanged()));
+  connect(&_strictnessButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(widgetHasChanged()));
+  connect(&_scopeButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(widgetHasChanged()));
   connect(ui.isRegExCheckBox, SIGNAL(stateChanged(int)), this, SLOT(widgetHasChanged()));
   connect(ui.isActiveCheckBox, SIGNAL(stateChanged(int)), this, SLOT(widgetHasChanged()));
 
@@ -257,18 +309,6 @@ void IgnoreListEditDlg::widgetHasChanged() {
   ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(_hasChanged);
 }
 
-// provide interactivity for the checkboxes
-bool IgnoreListDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
-                                     const QStyleOptionViewItem &option, const QModelIndex &index) {
-  Q_UNUSED(option)
-  switch(event->type()) {
-    case QEvent::MouseButtonRelease:
-      model->setData(index, !index.data().toBool());
-      return true;
-      // don't show the default editor for the column
-    case QEvent::MouseButtonDblClick:
-      return true;
-    default:
-      return false;
-  }
+void IgnoreListEditDlg::enableOkButton(bool state) {
+  ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(state);
 }