Refactorize settingspages a bit
[quassel.git] / src / qtui / settingspages / coreaccountsettingspage.cpp
index cd488a3..11188ac 100644 (file)
 #include "iconloader.h"
 
 CoreAccountSettingsPage::CoreAccountSettingsPage(QWidget *parent)
-: SettingsPage(tr("Misc"), tr("Core Accounts"), parent),
+: SettingsPage(tr("Remote Cores"), QString(), parent),
 _lastAccountId(0),
-_lastAutoConnectId(0)
+_lastAutoConnectId(0),
+_standalone(false)
 {
   ui.setupUi(this);
   initAutoWidgets();
@@ -37,62 +38,66 @@ _lastAutoConnectId(0)
   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()));
+  connect(ui.autoConnectAccount, SIGNAL(currentIndexChanged(int)), SLOT(widgetHasChanged()));
   setWidgetStates();
 }
 
-void CoreAccountSettingsPage::load() {
-  _model->update(Client::coreAccountModel());
+void CoreAccountSettingsPage::setStandAlone(bool standalone) {
+  _standalone = standalone;
+}
 
+void CoreAccountSettingsPage::load() {
+  model()->update(Client::coreAccountModel());
   SettingsPage::load();
-  ui.accountView->setCurrentIndex(model()->index(0, 0));
-  ui.accountView->selectionModel()->select(model()->index(0, 0), QItemSelectionModel::Select);
-  setWidgetStates();
-}
 
-void CoreAccountSettingsPage::save() {
-  SettingsPage::save();
-  Client::coreAccountModel()->update(_model);
-  Client::coreAccountModel()->save();
   CoreAccountSettings s;
-}
 
-QVariant CoreAccountSettingsPage::loadAutoWidgetValue(const QString &widgetName) {
-  if(widgetName == "autoConnectAccount") {
-    CoreAccountSettings s;
-    AccountId id = s.autoConnectAccount();
-    if(id <= 0)
-      return QVariant();
-    ui.autoConnectAccount->setCurrentIndex(model()->accountIndex(id).row());
-    return id.toInt();
+  if(Quassel::runMode() != Quassel::Monolithic) {
+    // make sure we don't have selected the internal account as autoconnect account
+
+    if(s.autoConnectOnStartup() && s.autoConnectToFixedAccount()) {
+      CoreAccount acc = model()->account(s.autoConnectAccount());
+      if(acc.isInternal())
+        ui.autoConnectOnStartup->setChecked(false);
+    }
   }
-  return SettingsPage::loadAutoWidgetValue(widgetName);
+  ui.accountView->setCurrentIndex(filteredModel()->index(0, 0));
+  ui.accountView->selectionModel()->select(filteredModel()->index(0, 0), QItemSelectionModel::Select);
+
+  QModelIndex idx = filteredModel()->mapFromSource(model()->accountIndex(s.autoConnectAccount()));
+  ui.autoConnectAccount->setCurrentIndex(idx.isValid() ? idx.row() : 0);
+  ui.autoConnectAccount->setProperty("storedValue", ui.autoConnectAccount->currentIndex());
+  setWidgetStates();
 }
 
-void CoreAccountSettingsPage::saveAutoWidgetValue(const QString &widgetName, const QVariant &v) {
+void CoreAccountSettingsPage::save() {
+  SettingsPage::save();
+  Client::coreAccountModel()->update(model());
+  Client::coreAccountModel()->save();
   CoreAccountSettings s;
-  if(widgetName == "autoConnectAccount") {
-    AccountId id = _model->index(ui.autoConnectAccount->currentIndex(), 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
-    s.setAutoConnectAccount(id);
-    return;
-  }
-  SettingsPage::saveAutoWidgetValue(widgetName, v);
+  AccountId id = filteredModel()->index(ui.autoConnectAccount->currentIndex(), 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
+  s.setAutoConnectAccount(id);
+  ui.autoConnectAccount->setProperty("storedValue", ui.autoConnectAccount->currentIndex());
 }
 
 // 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
-  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())
@@ -104,19 +109,32 @@ void CoreAccountSettingsPage::rowsInserted(const QModelIndex &index, int start,
     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)
-    ui.accountView->setCurrentIndex(model()->index(start, 0));
+    ui.accountView->setCurrentIndex(filteredModel()->index(start, 0));
   if(id == _lastAutoConnectId)
     ui.autoConnectAccount->setCurrentIndex(start);
   _lastAccountId = _lastAutoConnectId = 0;
 }
 
+AccountId CoreAccountSettingsPage::selectedAccount() const {
+  QModelIndex index = ui.accountView->currentIndex();
+  if(!index.isValid())
+    return 0;
+  return index.data(CoreAccountModel::AccountIdRole).value<AccountId>();
+}
+
+void CoreAccountSettingsPage::setSelectedAccount(AccountId accId) {
+  QModelIndex index = filteredModel()->mapFromSource(model()->accountIndex(accId));
+  if(index.isValid())
+    ui.accountView->setCurrentIndex(index);
+}
+
 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();
   }
 }
@@ -126,10 +144,17 @@ void CoreAccountSettingsPage::on_editAccountButton_clicked() {
   if(!idx.isValid())
     return;
 
-  CoreAccountEditDlg dlg(_model->account(idx), this);
+  editAccount(idx);
+}
+
+void CoreAccountSettingsPage::editAccount(const QModelIndex &index) {
+  if(!index.isValid())
+    return;
+
+  CoreAccountEditDlg dlg(model()->account(filteredModel()->mapToSource(index)), 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();
   }
 }
@@ -137,6 +162,7 @@ void CoreAccountSettingsPage::on_editAccountButton_clicked() {
 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);
@@ -144,11 +170,22 @@ void CoreAccountSettingsPage::on_deleteAccountButton_clicked() {
   }
 }
 
+void CoreAccountSettingsPage::on_accountView_doubleClicked(const QModelIndex &index) {
+  if(!index.isValid())
+    return;
+
+  if(isStandAlone())
+    emit connectToCore(index.data(CoreAccountModel::AccountIdRole).value<AccountId>());
+  else
+    editAccount(index);
+}
+
 void CoreAccountSettingsPage::setWidgetStates() {
-  bool selected = ui.accountView->selectionModel()->selectedIndexes().count();
+  AccountId accId = selectedAccount();
+  bool editable = accId.isValid() && accId != model()->internalAccount();
 
-  ui.editAccountButton->setEnabled(selected);
-  ui.deleteAccountButton->setEnabled(selected);
+  ui.editAccountButton->setEnabled(editable);
+  ui.deleteAccountButton->setEnabled(editable);
 }
 
 void CoreAccountSettingsPage::widgetHasChanged() {
@@ -157,6 +194,8 @@ void CoreAccountSettingsPage::widgetHasChanged() {
 }
 
 bool CoreAccountSettingsPage::testHasChanged() {
+  if(ui.autoConnectAccount->currentIndex() != ui.autoConnectAccount->property("storedValue").toInt())
+    return true;
   if(!(*model() == *Client::coreAccountModel()))
     return true;
 
@@ -229,3 +268,22 @@ void CoreAccountEditDlg::on_user_textChanged(const QString &text) {
   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>();
+}