Remove the Internal Core from the non-monolithic client's UI
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 24 Nov 2009 23:16:19 +0000 (00:16 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sat, 28 Nov 2009 23:39:41 +0000 (00:39 +0100)
src/qtui/settingspages/coreaccountsettingspage.cpp
src/qtui/settingspages/coreaccountsettingspage.h

index be08cb5..40f0f5e 100644 (file)
@@ -38,11 +38,13 @@ _standalone(false)
   ui.deleteAccountButton->setIcon(SmallIcon("edit-delete"));
 
   _model = new CoreAccountModel(Client::coreAccountModel(), this);
   ui.deleteAccountButton->setIcon(SmallIcon("edit-delete"));
 
   _model = new CoreAccountModel(Client::coreAccountModel(), this);
-  ui.accountView->setModel(_model);
-  ui.autoConnectAccount->setModel(_model);
+  _filteredModel = new FilteredCoreAccountModel(_model, this);
 
 
-  connect(model(), SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), SLOT(rowsAboutToBeRemoved(QModelIndex, int, int)));
-  connect(model(), SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(rowsInserted(QModelIndex, int, int)));
+  ui.accountView->setModel(filteredModel());
+  ui.autoConnectAccount->setModel(filteredModel());
+
+  connect(filteredModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), SLOT(rowsAboutToBeRemoved(QModelIndex, int, int)));
+  connect(filteredModel(), SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(rowsInserted(QModelIndex, int, int)));
 
   connect(ui.accountView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), SLOT(setWidgetStates()));
   setWidgetStates();
 
   connect(ui.accountView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), SLOT(setWidgetStates()));
   setWidgetStates();
@@ -53,7 +55,7 @@ void CoreAccountSettingsPage::setStandAlone(bool standalone) {
 }
 
 void CoreAccountSettingsPage::load() {
 }
 
 void CoreAccountSettingsPage::load() {
-  _model->update(Client::coreAccountModel());
+  model()->update(Client::coreAccountModel());
   SettingsPage::load();
 
   CoreAccountSettings s;
   SettingsPage::load();
 
   CoreAccountSettings s;
@@ -62,22 +64,22 @@ void CoreAccountSettingsPage::load() {
     // make sure we don't have selected the internal account as autoconnect account
 
     if(s.autoConnectOnStartup() && s.autoConnectToFixedAccount()) {
     // make sure we don't have selected the internal account as autoconnect account
 
     if(s.autoConnectOnStartup() && s.autoConnectToFixedAccount()) {
-      CoreAccount acc = _model->account(s.autoConnectAccount());
+      CoreAccount acc = model()->account(s.autoConnectAccount());
       if(acc.isInternal())
         ui.autoConnectOnStartup->setChecked(false);
     }
   }
       if(acc.isInternal())
         ui.autoConnectOnStartup->setChecked(false);
     }
   }
-  ui.accountView->setCurrentIndex(model()->index(0, 0));
-  ui.accountView->selectionModel()->select(model()->index(0, 0), QItemSelectionModel::Select);
+  ui.accountView->setCurrentIndex(filteredModel()->index(0, 0));
+  ui.accountView->selectionModel()->select(filteredModel()->index(0, 0), QItemSelectionModel::Select);
 
 
-  QModelIndex idx = model()->accountIndex(s.autoConnectAccount());
+  QModelIndex idx = filteredModel()->mapFromSource(model()->accountIndex(s.autoConnectAccount()));
   ui.autoConnectAccount->setCurrentIndex(idx.isValid() ? idx.row() : 0);
   setWidgetStates();
 }
 
 void CoreAccountSettingsPage::save() {
   SettingsPage::save();
   ui.autoConnectAccount->setCurrentIndex(idx.isValid() ? idx.row() : 0);
   setWidgetStates();
 }
 
 void CoreAccountSettingsPage::save() {
   SettingsPage::save();
-  Client::coreAccountModel()->update(_model);
+  Client::coreAccountModel()->update(model());
   Client::coreAccountModel()->save();
   CoreAccountSettings s;
 }
   Client::coreAccountModel()->save();
   CoreAccountSettings s;
 }
@@ -96,7 +98,7 @@ QVariant CoreAccountSettingsPage::loadAutoWidgetValue(const QString &widgetName)
 void CoreAccountSettingsPage::saveAutoWidgetValue(const QString &widgetName, const QVariant &v) {
   CoreAccountSettings s;
   if(widgetName == "autoConnectAccount") {
 void CoreAccountSettingsPage::saveAutoWidgetValue(const QString &widgetName, const QVariant &v) {
   CoreAccountSettings s;
   if(widgetName == "autoConnectAccount") {
-    AccountId id = _model->index(ui.autoConnectAccount->currentIndex(), 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
+    AccountId id = filteredModel()->index(ui.autoConnectAccount->currentIndex(), 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
     s.setAutoConnectAccount(id);
     return;
   }
     s.setAutoConnectAccount(id);
     return;
   }
@@ -104,13 +106,14 @@ void CoreAccountSettingsPage::saveAutoWidgetValue(const QString &widgetName, con
 }
 
 // TODO: Qt 4.6 - replace by proper rowsMoved() semantics
 }
 
 // TODO: Qt 4.6 - replace by proper rowsMoved() semantics
+// NOTE: This is the filtered model
 void CoreAccountSettingsPage::rowsAboutToBeRemoved(const QModelIndex &index, int start, int end) {
   _lastAutoConnectId = _lastAccountId = 0;
   if(index.isValid() || start != end)
     return;
 
   // the current index is removed, so remember it in case it's reinserted immediately afterwards
 void CoreAccountSettingsPage::rowsAboutToBeRemoved(const QModelIndex &index, int start, int end) {
   _lastAutoConnectId = _lastAccountId = 0;
   if(index.isValid() || start != end)
     return;
 
   // the current index is removed, so remember it in case it's reinserted immediately afterwards
-  AccountId id = model()->index(start, 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
+  AccountId id = filteredModel()->index(start, 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
   if(start == ui.accountView->currentIndex().row())
     _lastAccountId = id;
   if(start == ui.autoConnectAccount->currentIndex())
   if(start == ui.accountView->currentIndex().row())
     _lastAccountId = id;
   if(start == ui.autoConnectAccount->currentIndex())
@@ -122,9 +125,9 @@ void CoreAccountSettingsPage::rowsInserted(const QModelIndex &index, int start,
     return;
 
   // check if the inserted index was just removed and select it in that case
     return;
 
   // check if the inserted index was just removed and select it in that case
-  AccountId id = model()->index(start, 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
+  AccountId id = filteredModel()->index(start, 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
   if(id == _lastAccountId)
   if(id == _lastAccountId)
-    ui.accountView->setCurrentIndex(model()->index(start, 0));
+    ui.accountView->setCurrentIndex(filteredModel()->index(start, 0));
   if(id == _lastAutoConnectId)
     ui.autoConnectAccount->setCurrentIndex(start);
   _lastAccountId = _lastAutoConnectId = 0;
   if(id == _lastAutoConnectId)
     ui.autoConnectAccount->setCurrentIndex(start);
   _lastAccountId = _lastAutoConnectId = 0;
@@ -138,7 +141,7 @@ AccountId CoreAccountSettingsPage::selectedAccount() const {
 }
 
 void CoreAccountSettingsPage::setSelectedAccount(AccountId accId) {
 }
 
 void CoreAccountSettingsPage::setSelectedAccount(AccountId accId) {
-  QModelIndex index = model()->accountIndex(accId);
+  QModelIndex index = filteredModel()->mapFromSource(model()->accountIndex(accId));
   if(index.isValid())
     ui.accountView->setCurrentIndex(index);
 }
   if(index.isValid())
     ui.accountView->setCurrentIndex(index);
 }
@@ -146,8 +149,8 @@ void CoreAccountSettingsPage::setSelectedAccount(AccountId accId) {
 void CoreAccountSettingsPage::on_addAccountButton_clicked() {
   CoreAccountEditDlg dlg(CoreAccount(), this);
   if(dlg.exec() == QDialog::Accepted) {
 void CoreAccountSettingsPage::on_addAccountButton_clicked() {
   CoreAccountEditDlg dlg(CoreAccount(), this);
   if(dlg.exec() == QDialog::Accepted) {
-    AccountId id =_model->createOrUpdateAccount(dlg.account());
-    ui.accountView->setCurrentIndex(model()->accountIndex(id));
+    AccountId id =model()->createOrUpdateAccount(dlg.account());
+    ui.accountView->setCurrentIndex(filteredModel()->mapFromSource(model()->accountIndex(id)));
     widgetHasChanged();
   }
 }
     widgetHasChanged();
   }
 }
@@ -164,10 +167,10 @@ void CoreAccountSettingsPage::editAccount(const QModelIndex &index) {
   if(!index.isValid())
     return;
 
   if(!index.isValid())
     return;
 
-  CoreAccountEditDlg dlg(_model->account(index), this);
+  CoreAccountEditDlg dlg(model()->account(filteredModel()->mapToSource(index)), this);
   if(dlg.exec() == QDialog::Accepted) {
   if(dlg.exec() == QDialog::Accepted) {
-    AccountId id = _model->createOrUpdateAccount(dlg.account());
-    ui.accountView->setCurrentIndex(model()->accountIndex(id));
+    AccountId id = model()->createOrUpdateAccount(dlg.account());
+    ui.accountView->setCurrentIndex(filteredModel()->mapFromSource(model()->accountIndex(id)));
     widgetHasChanged();
   }
 }
     widgetHasChanged();
   }
 }
@@ -175,6 +178,7 @@ void CoreAccountSettingsPage::editAccount(const QModelIndex &index) {
 void CoreAccountSettingsPage::on_deleteAccountButton_clicked() {
   if(!ui.accountView->selectionModel()->selectedIndexes().count())
     return;
 void CoreAccountSettingsPage::on_deleteAccountButton_clicked() {
   if(!ui.accountView->selectionModel()->selectedIndexes().count())
     return;
+
   AccountId id = ui.accountView->selectionModel()->selectedIndexes().at(0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
   if(id.isValid()) {
     model()->removeAccount(id);
   AccountId id = ui.accountView->selectionModel()->selectedIndexes().at(0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
   if(id.isValid()) {
     model()->removeAccount(id);
@@ -278,3 +282,22 @@ void CoreAccountEditDlg::on_user_textChanged(const QString &text) {
   Q_UNUSED(text)
   setWidgetStates();
 }
   Q_UNUSED(text)
   setWidgetStates();
 }
+
+/*****************************************************************************************
+ * FilteredCoreAccountModel
+ *****************************************************************************************/
+
+FilteredCoreAccountModel::FilteredCoreAccountModel(CoreAccountModel *model, QObject *parent) : QSortFilterProxyModel(parent) {
+  _internalAccount = model->internalAccount();
+  setSourceModel(model);
+}
+
+bool FilteredCoreAccountModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
+  if(Quassel::runMode() == Quassel::Monolithic)
+    return true;
+
+  if(!_internalAccount.isValid())
+    return true;
+
+  return _internalAccount != sourceModel()->index(source_row, 0, source_parent).data(CoreAccountModel::AccountIdRole).value<AccountId>();
+}
index 6948e85..d74f967 100644 (file)
@@ -21,6 +21,8 @@
 #ifndef COREACCOUNTSETTINGSPAGE_H_
 #define COREACCOUNTSETTINGSPAGE_H_
 
 #ifndef COREACCOUNTSETTINGSPAGE_H_
 #define COREACCOUNTSETTINGSPAGE_H_
 
+#include <QSortFilterProxyModel>
+
 #include "settingspage.h"
 
 #include "coreaccount.h"
 #include "settingspage.h"
 
 #include "coreaccount.h"
@@ -29,6 +31,7 @@
 #include "ui_coreaccountsettingspage.h"
 
 class CoreAccountModel;
 #include "ui_coreaccountsettingspage.h"
 
 class CoreAccountModel;
+class FilteredCoreAccountModel;
 
 class CoreAccountSettingsPage : public SettingsPage {
   Q_OBJECT
 
 class CoreAccountSettingsPage : public SettingsPage {
   Q_OBJECT
@@ -67,6 +70,8 @@ signals:
 
     CoreAccountModel *_model;
     inline CoreAccountModel *model() const { return _model; }
 
     CoreAccountModel *_model;
     inline CoreAccountModel *model() const { return _model; }
+    FilteredCoreAccountModel *_filteredModel;
+    inline FilteredCoreAccountModel *filteredModel() const { return _filteredModel; }
 
     AccountId _lastAccountId, _lastAutoConnectId;
     bool _standalone;
 
     AccountId _lastAccountId, _lastAutoConnectId;
     bool _standalone;
@@ -105,4 +110,22 @@ private:
   CoreAccount _account;
 };
 
   CoreAccount _account;
 };
 
+// ========================================
+//  FilteredCoreAccountModel
+// ========================================
+
+//! This filters out the internal account from the non-monolithic client's UI
+class FilteredCoreAccountModel : public QSortFilterProxyModel {
+  Q_OBJECT
+
+public:
+  FilteredCoreAccountModel(CoreAccountModel *model, QObject *parent = 0);
+
+protected:
+  virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
+
+private:
+  AccountId _internalAccount;
+};
+
 #endif
 #endif