Switched client-side account data to using AccountId now rather than the account...
authorManuel Nickschas <sputnick@quassel-irc.org>
Sun, 3 Feb 2008 20:29:38 +0000 (20:29 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sun, 3 Feb 2008 20:29:38 +0000 (20:29 +0000)
You can now derive from CoreAccountSettings to manage settings related to the currently
connected core account (see clientsettings.h).
NOTE: Your existing accounts will NOT be migrated, you'll have to re-enter them!

src/client/client.cpp
src/client/client.h
src/client/clientsettings.cpp
src/client/clientsettings.h
src/client/clientsyncer.cpp
src/common/global.cpp
src/common/types.h
src/qtui/coreconnectdlg.cpp
src/qtui/coreconnectdlg.h
version.inc

index c73e496..9e22ce0 100644 (file)
@@ -34,6 +34,7 @@
 #include "util.h"
 
 QPointer<Client> Client::instanceptr = 0;
 #include "util.h"
 
 QPointer<Client> Client::instanceptr = 0;
+AccountId Client::_currentCoreAccount = 0;
 
 /*** Initialization/destruction ***/
 
 
 /*** Initialization/destruction ***/
 
@@ -71,7 +72,7 @@ Client::~Client() {
 }
 
 void Client::init() {
 }
 
 void Client::init() {
-
+  _currentCoreAccount = 0;
   _networkModel = new NetworkModel(this);
   connect(this, SIGNAL(bufferUpdated(BufferInfo)),
           _networkModel, SLOT(bufferUpdated(BufferInfo)));
   _networkModel = new NetworkModel(this);
   connect(this, SIGNAL(bufferUpdated(BufferInfo)),
           _networkModel, SLOT(bufferUpdated(BufferInfo)));
@@ -116,6 +117,14 @@ void Client::init() {
 
 /*** public static methods ***/
 
 
 /*** public static methods ***/
 
+AccountId Client::currentCoreAccount() {
+  return _currentCoreAccount;
+}
+
+void Client::setCurrentCoreAccount(AccountId id) {
+  _currentCoreAccount = id;
+}
+
 QList<BufferInfo> Client::allBufferInfos() {
   QList<BufferInfo> bufferids;
   foreach(Buffer *buffer, buffers()) {
 QList<BufferInfo> Client::allBufferInfos() {
   QList<BufferInfo> bufferids;
   foreach(Buffer *buffer, buffers()) {
@@ -276,10 +285,11 @@ void Client::userInput(BufferInfo bufferInfo, QString message) {
 
 /*** core connection stuff ***/
 
 
 /*** core connection stuff ***/
 
-void Client::setConnectedToCore(QIODevice *sock) {
+void Client::setConnectedToCore(QIODevice *sock, AccountId id) {
   socket = sock;
   signalProxy()->addPeer(socket);
   _connectedToCore = true;
   socket = sock;
   signalProxy()->addPeer(socket);
   _connectedToCore = true;
+  setCurrentCoreAccount(id);
 }
 
 void Client::setSyncedToCore() {
 }
 
 void Client::setSyncedToCore() {
@@ -295,6 +305,7 @@ void Client::disconnectFromCore() {
   }
   _connectedToCore = false;
   _syncedToCore = false;
   }
   _connectedToCore = false;
   _syncedToCore = false;
+  setCurrentCoreAccount(0);
   emit disconnected();
   emit coreConnectionStateChanged(false);
 
   emit disconnected();
   emit coreConnectionStateChanged(false);
 
index d6ae6c0..40bf332 100644 (file)
@@ -92,6 +92,8 @@ public:
   static BufferModel *bufferModel();
   static SignalProxy *signalProxy();
 
   static BufferModel *bufferModel();
   static SignalProxy *signalProxy();
 
+  static AccountId currentCoreAccount();
+
   static AbstractUiMsg *layoutMsg(const Message &);
 
   static bool isConnected();
   static AbstractUiMsg *layoutMsg(const Message &);
 
   static bool isConnected();
@@ -145,8 +147,6 @@ signals:
 public slots:
   //void selectBuffer(Buffer *);
 
 public slots:
   //void selectBuffer(Buffer *);
 
-  void setConnectedToCore(QIODevice *socket);
-  void setSyncedToCore();
   void disconnectFromCore();
 
   void setCoreConfiguration(const QVariantMap &settings);
   void disconnectFromCore();
 
   void setCoreConfiguration(const QVariantMap &settings);
@@ -171,6 +171,9 @@ private slots:
   void coreNetworkCreated(NetworkId);
   void coreNetworkRemoved(NetworkId);
 
   void coreNetworkCreated(NetworkId);
   void coreNetworkRemoved(NetworkId);
 
+  void setConnectedToCore(QIODevice *socket, AccountId id);
+  void setSyncedToCore();
+
 private:
   Client(QObject *parent = 0);
   virtual ~Client();
 private:
   Client(QObject *parent = 0);
   virtual ~Client();
@@ -178,6 +181,8 @@ private:
 
   static void addNetwork(Network *);
 
 
   static void addNetwork(Network *);
 
+  static void setCurrentCoreAccount(AccountId);
+
   static QPointer<Client> instanceptr;
 
   QPointer<QIODevice> socket;
   static QPointer<Client> instanceptr;
 
   QPointer<QIODevice> socket;
@@ -199,6 +204,8 @@ private:
   QTimer *layoutTimer;
   QList<Buffer *> layoutQueue;
 
   QTimer *layoutTimer;
   QList<Buffer *> layoutQueue;
 
+  static AccountId _currentCoreAccount;
+
   friend class ClientSyncer;
 };
 
   friend class ClientSyncer;
 };
 
index 1fd1efb..87ad816 100644 (file)
@@ -36,56 +36,55 @@ ClientSettings::~ClientSettings() {
 
 /***********************************************************************************************/
 
 
 /***********************************************************************************************/
 
-CoreAccountSettings::CoreAccountSettings() : ClientSettings("CoreAccounts") {
-
+CoreAccountSettings::CoreAccountSettings(const QString &subgroup) : ClientSettings("CoreAccounts") {
+  _subgroup = subgroup;
 
 }
 
 
 }
 
-QStringList CoreAccountSettings::knownAccounts() {
-  return localChildKeys("Accounts");
+QList<AccountId> CoreAccountSettings::knownAccounts() {
+  QList<AccountId> ids;
+  foreach(QString key, localChildGroups()) {
+    ids << key.toInt();
+  }
+  return ids;
 }
 
 }
 
-QString CoreAccountSettings::lastAccount() {
-  return localValue("LastAccount", "").toString();
+AccountId CoreAccountSettings::lastAccount() {
+  return localValue("LastAccount", 0).toInt();
 }
 
 }
 
-void CoreAccountSettings::setLastAccount(const QString &account) {
-  setLocalValue("LastAccount", account);
+void CoreAccountSettings::setLastAccount(AccountId account) {
+  setLocalValue("LastAccount", account.toInt());
 }
 
 }
 
-QString CoreAccountSettings::autoConnectAccount() {
-  return localValue("AutoConnectAccount", "").toString();
+AccountId CoreAccountSettings::autoConnectAccount() {
+  return localValue("AutoConnectAccount", 0).toInt();
 }
 
 }
 
-void CoreAccountSettings::setAutoConnectAccount(const QString &account) {
-  setLocalValue("AutoConnectAccount", account);
+void CoreAccountSettings::setAutoConnectAccount(AccountId account) {
+  setLocalValue("AutoConnectAccount", account.toInt());
 }
 
 }
 
-void CoreAccountSettings::storeAccount(const QString name, const QVariantMap &data) {
-  setLocalValue(QString("Accounts/%2").arg(name), data);
+void CoreAccountSettings::storeAccountData(AccountId id, const QVariantMap &data) {
+  setLocalValue(QString("%1/Connection").arg(id.toInt()), data);
 }
 
 }
 
-QVariantMap CoreAccountSettings::retrieveAccount(const QString &name) {
-  return localValue(QString("Accounts/%2").arg(name), QVariant()).toMap();
+QVariantMap CoreAccountSettings::retrieveAccountData(AccountId id) {
+  return localValue(QString("%1/Connection").arg(id.toInt()), QVariant()).toMap();
 }
 
 }
 
-void CoreAccountSettings::storeAllAccounts(const QHash<QString, QVariantMap> accounts) {
-  removeLocalKey(QString("Accounts"));
-  foreach(QString name, accounts.keys()) {
-    storeAccount(name, accounts[name]);
-  }
+void CoreAccountSettings::setAccountValue(const QString &key, const QVariant &value) {
+  if(!Client::currentCoreAccount().isValid()) return;
+  setLocalValue(QString("%1/%2/%3").arg(Client::currentCoreAccount().toInt()).arg(_subgroup).arg(key), value);
 }
 
 }
 
-QHash<QString, QVariantMap> CoreAccountSettings::retrieveAllAccounts() {
-  QHash<QString, QVariantMap> accounts;
-  foreach(QString name, knownAccounts()) {
-    accounts[name] = retrieveAccount(name);
-  }
-  return accounts;
+QVariant CoreAccountSettings::accountValue(const QString &key, const QVariant &def) {
+  if(!Client::currentCoreAccount().isValid()) return QVariant();
+  return localValue(QString("%1/%2/%3").arg(Client::currentCoreAccount().toInt()).arg(_subgroup).arg(key), def);
 }
 
 }
 
-void CoreAccountSettings::removeAccount(const QString &account) {
-  removeLocalKey(QString("Accounts/%1").arg(account));
+void CoreAccountSettings::removeAccount(AccountId id) {
+  removeLocalKey(QString("%1").arg(id.toInt()));
 }
 
 
 }
 
 
index 3b03c4c..9a93597 100644 (file)
@@ -22,6 +22,7 @@
 #define _CLIENTSETTINGS_H_
 
 #include "settings.h"
 #define _CLIENTSETTINGS_H_
 
 #include "settings.h"
+#include "types.h"
 
 class ClientSettings : public Settings {
 
 
 class ClientSettings : public Settings {
 
@@ -33,25 +34,35 @@ class ClientSettings : public Settings {
 
 };
 
 
 };
 
-// TODO accountid, account-specific settings
+// Deriving from CoreAccountSettings:
+// MySettings() : CoreAccountSettings("MyGroup") {};
+// Then use accountValue() / setAccountValue() to retrieve/store data associated to the currently
+// connected account. This is stored in CoreAccounts/$ACCID/MyGroup/$KEY) then.
+//
+// Note that you'll get invalid data (and setting is ignored) if you are not connected to a core!
 
 class CoreAccountSettings : public ClientSettings {
 
   public:
 
 class CoreAccountSettings : public ClientSettings {
 
   public:
-    CoreAccountSettings();
+    // stores account-specific data in CoreAccounts/$ACCID/$SUBGROUP/$KEY)
+    CoreAccountSettings(const QString &subgroup = "General");
 
 
-    QStringList knownAccounts();
-    QString lastAccount();
-    void setLastAccount(const QString &account);
-    QString autoConnectAccount();
-    void setAutoConnectAccount(const QString &account);
+    QList<AccountId> knownAccounts();
+    AccountId lastAccount();
+    void setLastAccount(AccountId);
+    AccountId autoConnectAccount();
+    void setAutoConnectAccount(AccountId);
 
 
-    void storeAccount(const QString name, const QVariantMap &data);
-    QVariantMap retrieveAccount(const QString &name);
-    void storeAllAccounts(const QHash<QString, QVariantMap> accounts);
-    QHash<QString, QVariantMap> retrieveAllAccounts();
-    void removeAccount(const QString &account);
+    void storeAccountData(AccountId id, const QVariantMap &data);
+    QVariantMap retrieveAccountData(AccountId);
+    void removeAccount(AccountId);
 
 
+  protected:
+    void setAccountValue(const QString &key, const QVariant &data);
+    QVariant accountValue(const QString &key, const QVariant &def = QVariant());
+
+  private:
+    QString _subgroup;
 };
 
 #endif
 };
 
 #endif
index d77e7af..b8cf4b2 100644 (file)
@@ -107,7 +107,6 @@ void ClientSyncer::connectToCore(const QVariantMap &conn) {
   //  emit coreConnectionError(tr("Already connected to Core!"));
   //  return;
   // }
   //  emit coreConnectionError(tr("Already connected to Core!"));
   //  return;
   // }
-
   if(socket != 0) {
     socket->deleteLater();
     socket = 0;
   if(socket != 0) {
     socket->deleteLater();
     socket = 0;
@@ -193,7 +192,7 @@ void ClientSyncer::sessionStateReceived(const QVariantMap &state) {
   disconnect(this, SIGNAL(recvPartialItem(quint32, quint32)), this, SIGNAL(sessionProgress(quint32, quint32)));
   disconnect(socket, 0, this, 0);  // rest of communication happens through SignalProxy
   //Client::signalProxy()->addPeer(socket);
   disconnect(this, SIGNAL(recvPartialItem(quint32, quint32)), this, SIGNAL(sessionProgress(quint32, quint32)));
   disconnect(socket, 0, this, 0);  // rest of communication happens through SignalProxy
   //Client::signalProxy()->addPeer(socket);
-  Client::instance()->setConnectedToCore(socket);
+  Client::instance()->setConnectedToCore(socket, coreConnectionInfo["AccountId"].value<AccountId>());
   syncToCore(state);
 }
 
   syncToCore(state);
 }
 
index edf795e..95f43e7 100644 (file)
@@ -87,11 +87,13 @@ void Global::registerMetaTypes() {
   qRegisterMetaType<BufferId>("BufferId");
   qRegisterMetaType<NetworkId>("NetworkId");
   qRegisterMetaType<UserId>("UserId");
   qRegisterMetaType<BufferId>("BufferId");
   qRegisterMetaType<NetworkId>("NetworkId");
   qRegisterMetaType<UserId>("UserId");
+  qRegisterMetaType<AccountId>("AccountId");
 
   qRegisterMetaTypeStreamOperators<IdentityId>("IdentityId");
   qRegisterMetaTypeStreamOperators<BufferId>("BufferId");
   qRegisterMetaTypeStreamOperators<NetworkId>("NetworkId");
   qRegisterMetaTypeStreamOperators<UserId>("UserId");
 
   qRegisterMetaTypeStreamOperators<IdentityId>("IdentityId");
   qRegisterMetaTypeStreamOperators<BufferId>("BufferId");
   qRegisterMetaTypeStreamOperators<NetworkId>("NetworkId");
   qRegisterMetaTypeStreamOperators<UserId>("UserId");
+  qRegisterMetaTypeStreamOperators<AccountId>("AccountId");
 
 }
 
 
 }
 
index 551bd13..949306b 100644 (file)
@@ -79,11 +79,16 @@ struct IdentityId : public SignedId {
   //inline operator QVariant() const { return QVariant::fromValue<IdentityId>(*this); }
 };
 
   //inline operator QVariant() const { return QVariant::fromValue<IdentityId>(*this); }
 };
 
+struct AccountId : public SignedId {
+  inline AccountId(int _id = 0) : SignedId(_id) {};
+};
+
 Q_DECLARE_METATYPE(UserId);
 Q_DECLARE_METATYPE(MsgId);
 Q_DECLARE_METATYPE(BufferId);
 Q_DECLARE_METATYPE(NetworkId);
 Q_DECLARE_METATYPE(IdentityId);
 Q_DECLARE_METATYPE(UserId);
 Q_DECLARE_METATYPE(MsgId);
 Q_DECLARE_METATYPE(BufferId);
 Q_DECLARE_METATYPE(NetworkId);
 Q_DECLARE_METATYPE(IdentityId);
+Q_DECLARE_METATYPE(AccountId);
 
 //! Base class for exceptions.
 struct Exception {
 
 //! Base class for exceptions.
 struct Exception {
index 93a1d7c..250c008 100644 (file)
@@ -40,12 +40,18 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(pare
   ui.accountButtonBox->button(QDialogButtonBox::Ok)->setDefault(true);
 
   CoreAccountSettings s;
   ui.accountButtonBox->button(QDialogButtonBox::Ok)->setDefault(true);
 
   CoreAccountSettings s;
-  QString lastacc = s.lastAccount();
+  AccountId lastacc = s.lastAccount();
   autoConnectAccount = s.autoConnectAccount();
   autoConnectAccount = s.autoConnectAccount();
-  accounts = s.retrieveAllAccounts();
-  ui.accountList->addItems(accounts.keys());
-  QList<QListWidgetItem *> l = ui.accountList->findItems(lastacc, Qt::MatchExactly);
-  if(l.count()) ui.accountList->setCurrentItem(l[0]);
+  QListWidgetItem *currentItem = 0;
+  foreach(AccountId id, s.knownAccounts()) {
+    if(!id.isValid()) continue;
+    QVariantMap data = s.retrieveAccountData(id);
+    accounts[id] = data;
+    QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList);
+    item->setData(Qt::UserRole, QVariant::fromValue<AccountId>(id));
+    if(id == lastacc) currentItem = item;
+  }
+  if(currentItem) ui.accountList->setCurrentItem(currentItem);
   else ui.accountList->setCurrentRow(0);
 
   setAccountWidgetStates();
   else ui.accountList->setCurrentRow(0);
 
   setAccountWidgetStates();
@@ -68,7 +74,8 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(pare
   connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull()));
   connect(ui.syncButtonBox->button(QDialogButtonBox::Abort), SIGNAL(clicked()), this, SLOT(restartPhaseNull()));
 
   connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull()));
   connect(ui.syncButtonBox->button(QDialogButtonBox::Abort), SIGNAL(clicked()), this, SLOT(restartPhaseNull()));
 
-  if(autoconnect && ui.accountList->count() && !autoConnectAccount.isEmpty() && autoConnectAccount == ui.accountList->currentItem()->text()) {
+  if(autoconnect && ui.accountList->count() && autoConnectAccount.isValid()
+     && autoConnectAccount == ui.accountList->currentItem()->data(Qt::UserRole).value<AccountId>()) {
     doingAutoConnect = true;
     on_accountButtonBox_accepted();
   }
     doingAutoConnect = true;
     on_accountButtonBox_accepted();
   }
@@ -77,7 +84,7 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(pare
 CoreConnectDlg::~CoreConnectDlg() {
   if(ui.accountList->selectedItems().count()) {
     CoreAccountSettings s;
 CoreConnectDlg::~CoreConnectDlg() {
   if(ui.accountList->selectedItems().count()) {
     CoreAccountSettings s;
-    s.setLastAccount(ui.accountList->selectedItems()[0]->text());
+    s.setLastAccount(ui.accountList->selectedItems()[0]->data(Qt::UserRole).value<AccountId>());
   }
 }
 
   }
 }
 
@@ -96,19 +103,20 @@ void CoreConnectDlg::setAccountWidgetStates() {
   ui.deleteAccount->setEnabled(selectedItems.count());
   ui.autoConnect->setEnabled(selectedItems.count());
   if(selectedItems.count()) {
   ui.deleteAccount->setEnabled(selectedItems.count());
   ui.autoConnect->setEnabled(selectedItems.count());
   if(selectedItems.count()) {
-    ui.autoConnect->setChecked(selectedItems[0]->text() == autoConnectAccount);
+    ui.autoConnect->setChecked(selectedItems[0]->data(Qt::UserRole).value<AccountId>() == autoConnectAccount);
   }
   }
+  ui.accountButtonBox->button(QDialogButtonBox::Ok)->setEnabled(ui.accountList->count());
 }
 
 void CoreConnectDlg::on_autoConnect_clicked(bool state) {
   if(!state) {
 }
 
 void CoreConnectDlg::on_autoConnect_clicked(bool state) {
   if(!state) {
-    autoConnectAccount = QString();
+    autoConnectAccount = 0;
   } else {
     if(ui.accountList->selectedItems().count()) {
   } else {
     if(ui.accountList->selectedItems().count()) {
-      autoConnectAccount = ui.accountList->selectedItems()[0]->text();
+      autoConnectAccount = ui.accountList->selectedItems()[0]->data(Qt::UserRole).value<AccountId>();
     } else {
       qWarning() << "Checked auto connect without an enabled item!";  // should never happen!
     } else {
       qWarning() << "Checked auto connect without an enabled item!";  // should never happen!
-      autoConnectAccount = QString();
+      autoConnectAccount = 0;
     }
   }
   setAccountWidgetStates();
     }
   }
   setAccountWidgetStates();
@@ -117,43 +125,50 @@ void CoreConnectDlg::on_autoConnect_clicked(bool state) {
 void CoreConnectDlg::on_addAccount_clicked() {
   QStringList existing;
   for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text();
 void CoreConnectDlg::on_addAccount_clicked() {
   QStringList existing;
   for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text();
-  CoreAccountEditDlg dlg(QString(), QVariantMap(), existing, this);
+  CoreAccountEditDlg dlg(0, QVariantMap(), existing, this);
   if(dlg.exec() == QDialog::Accepted) {
   if(dlg.exec() == QDialog::Accepted) {
-    accounts[dlg.accountName()] = dlg.accountData();
-    ui.accountList->addItem(dlg.accountName());
-    ui.accountList->setCurrentItem(ui.accountList->findItems(dlg.accountName(), Qt::MatchExactly)[0]);
+    // find free ID
+    AccountId id = accounts.count() + 1;
+    for(AccountId i = 1; i <= accounts.count(); i++) {
+      if(!accounts.keys().contains(i)) {
+        id = i;
+        break;
+      }
+    }
+    QVariantMap data = dlg.accountData();
+    data["AccountId"] = QVariant::fromValue<AccountId>(id);
+    accounts[id] = data;
+    QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList);
+    item->setData(Qt::UserRole, QVariant::fromValue<AccountId>(id));
+    ui.accountList->setCurrentItem(item);
   }
 }
 
 void CoreConnectDlg::on_editAccount_clicked() {
   QStringList existing;
   for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text();
   }
 }
 
 void CoreConnectDlg::on_editAccount_clicked() {
   QStringList existing;
   for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text();
-  QString current = ui.accountList->currentItem()->text();
-  QVariantMap acct = accounts[current];
-  CoreAccountEditDlg dlg(current, acct, existing, this);
+  AccountId id = ui.accountList->currentItem()->data(Qt::UserRole).value<AccountId>();
+  QVariantMap acct = accounts[id];
+  CoreAccountEditDlg dlg(id, acct, existing, this);
   if(dlg.exec() == QDialog::Accepted) {
   if(dlg.exec() == QDialog::Accepted) {
-    if(current != dlg.accountName()) {
-      if(autoConnectAccount == current) autoConnectAccount = dlg.accountName();
-      accounts.remove(current);
-      current = dlg.accountName();
-      ui.accountList->currentItem()->setText(current);
-    }
-    accounts[current] = dlg.accountData();
+    QVariantMap data = dlg.accountData();
+    ui.accountList->currentItem()->setText(data["AccountName"].toString());
+    accounts[id] = data;
   }
   }
-  //ui.accountList->setCurrent
 }
 
 void CoreConnectDlg::on_deleteAccount_clicked() {
 }
 
 void CoreConnectDlg::on_deleteAccount_clicked() {
-  QString current = ui.accountList->currentItem()->text();
+  AccountId id = ui.accountList->currentItem()->data(Qt::UserRole).value<AccountId>();
   int ret = QMessageBox::question(this, tr("Remove Account Settings"),
                                   tr("Do you really want to remove your local settings for this Quassel Core account?<br>"
                                   "Note: This will <em>not</em> remove or change any data on the Core itself!"),
                                   QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
   if(ret == QMessageBox::Yes) {
     int idx = ui.accountList->currentRow();
   int ret = QMessageBox::question(this, tr("Remove Account Settings"),
                                   tr("Do you really want to remove your local settings for this Quassel Core account?<br>"
                                   "Note: This will <em>not</em> remove or change any data on the Core itself!"),
                                   QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
   if(ret == QMessageBox::Yes) {
     int idx = ui.accountList->currentRow();
-    delete ui.accountList->item(idx);
-    ui.accountList->setCurrentRow(qMin(idx, ui.accountList->count()));
-    accounts.remove(current);
+    delete ui.accountList->takeItem(idx);
+    ui.accountList->setCurrentRow(qMin(idx, ui.accountList->count()-1));
+    accounts[id]["Delete"] = true;  // we only flag this here, actual deletion happens on accept!
+    setAccountWidgetStates();
   }
 }
 
   }
 }
 
@@ -165,13 +180,20 @@ void CoreConnectDlg::on_accountList_itemDoubleClicked(QListWidgetItem *item) {
 void CoreConnectDlg::on_accountButtonBox_accepted() {
   // save accounts
   CoreAccountSettings s;
 void CoreConnectDlg::on_accountButtonBox_accepted() {
   // save accounts
   CoreAccountSettings s;
-  s.storeAllAccounts(accounts);
+  foreach(QVariantMap acct, accounts.values()) {
+    AccountId id = acct["AccountId"].value<AccountId>();
+    if(acct.contains("Delete")) {
+      s.removeAccount(id);
+    } else {
+      s.storeAccountData(id, acct);
+    }
+  }
   s.setAutoConnectAccount(autoConnectAccount);
 
   ui.stackedWidget->setCurrentWidget(ui.loginPage);
   s.setAutoConnectAccount(autoConnectAccount);
 
   ui.stackedWidget->setCurrentWidget(ui.loginPage);
-  accountName = ui.accountList->currentItem()->text();
-  account = s.retrieveAccount(accountName);
-  s.setLastAccount(accountName);
+  account = ui.accountList->currentItem()->data(Qt::UserRole).value<AccountId>();
+  accountData = accounts[account];
+  s.setLastAccount(account);
   connectToCore();
 }
 
   connectToCore();
 }
 
@@ -183,7 +205,7 @@ void CoreConnectDlg::on_accountButtonBox_accepted() {
 
 void CoreConnectDlg::connectToCore() {
   ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/actions/network-disconnect")));
 
 void CoreConnectDlg::connectToCore() {
   ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/actions/network-disconnect")));
-  ui.connectLabel->setText(tr("Connect to %1").arg(account["Host"].toString()));
+  ui.connectLabel->setText(tr("Connect to %1").arg(accountData["Host"].toString()));
   ui.coreInfoLabel->setText("");
   ui.loginStack->setCurrentWidget(ui.loginEmptyPage);
   ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
   ui.coreInfoLabel->setText("");
   ui.loginStack->setCurrentWidget(ui.loginEmptyPage);
   ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
@@ -194,14 +216,14 @@ void CoreConnectDlg::connectToCore() {
 
 
   //connect(Client::instance(), SIGNAL(coreConnectionPhaseOne(const QVariantMap &)), this, SLOT(phaseOneFinished
 
 
   //connect(Client::instance(), SIGNAL(coreConnectionPhaseOne(const QVariantMap &)), this, SLOT(phaseOneFinished
-  clientSyncer->connectToCore(account);
+  clientSyncer->connectToCore(accountData);
 }
 
 void CoreConnectDlg::initPhaseError(const QString &error) {
   doingAutoConnect = false;
   ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/status/dialog-error")));
   //ui.connectLabel->setBrush(QBrush("red"));
 }
 
 void CoreConnectDlg::initPhaseError(const QString &error) {
   doingAutoConnect = false;
   ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/status/dialog-error")));
   //ui.connectLabel->setBrush(QBrush("red"));
-  ui.connectLabel->setText(tr("<div style=color:red;>Connection to %1 failed!</div>").arg(account["Host"].toString()));
+  ui.connectLabel->setText(tr("<div style=color:red;>Connection to %1 failed!</div>").arg(accountData["Host"].toString()));
   ui.coreInfoLabel->setText(error);
   ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Retry|QDialogButtonBox::Cancel);
   ui.loginButtonBox->button(QDialogButtonBox::Retry)->setDefault(true);
   ui.coreInfoLabel->setText(error);
   ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Retry|QDialogButtonBox::Cancel);
   ui.loginButtonBox->button(QDialogButtonBox::Retry)->setDefault(true);
@@ -216,7 +238,7 @@ void CoreConnectDlg::initPhaseMsg(const QString &msg) {
 
 void CoreConnectDlg::initPhaseSocketState(QAbstractSocket::SocketState state) {
   QString s;
 
 void CoreConnectDlg::initPhaseSocketState(QAbstractSocket::SocketState state) {
   QString s;
-  QString host = account["Host"].toString();
+  QString host = accountData["Host"].toString();
   switch(state) {
     case QAbstractSocket::UnconnectedState: s = tr("Not connected to %1.").arg(host); break;
     case QAbstractSocket::HostLookupState: s = tr("Looking up %1...").arg(host); break;
   switch(state) {
     case QAbstractSocket::UnconnectedState: s = tr("Not connected to %1.").arg(host); break;
     case QAbstractSocket::HostLookupState: s = tr("Looking up %1...").arg(host); break;
@@ -243,10 +265,10 @@ void CoreConnectDlg::startLogin() {
   ui.loginStack->setMinimumSize(ui.loginStack->sizeHint()); ui.loginStack->updateGeometry();
   ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
   ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDefault(true);
   ui.loginStack->setMinimumSize(ui.loginStack->sizeHint()); ui.loginStack->updateGeometry();
   ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
   ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDefault(true);
-  if(!account["User"].toString().isEmpty()) {
-    ui.user->setText(account["User"].toString());
-    if(account["RememberPasswd"].toBool()) {
-      ui.password->setText(account["Password"].toString());
+  if(!accountData["User"].toString().isEmpty()) {
+    ui.user->setText(accountData["User"].toString());
+    if(accountData["RememberPasswd"].toBool()) {
+      ui.password->setText(accountData["Password"].toString());
       ui.rememberPasswd->setChecked(true);
       ui.loginButtonBox->setFocus();
     } else {
       ui.rememberPasswd->setChecked(true);
       ui.loginButtonBox->setFocus();
     } else {
@@ -266,12 +288,12 @@ void CoreConnectDlg::doLogin() {
   ui.password->setDisabled(true);
   ui.rememberPasswd->setDisabled(true);
   ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDisabled(true);
   ui.password->setDisabled(true);
   ui.rememberPasswd->setDisabled(true);
   ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDisabled(true);
-  account["User"] = ui.user->text();
-  account["RememberPasswd"] = ui.rememberPasswd->isChecked();
-  if(ui.rememberPasswd->isChecked()) account["Password"] = ui.password->text();
-  else account.remove("Password");
+  accountData["User"] = ui.user->text();
+  accountData["RememberPasswd"] = ui.rememberPasswd->isChecked();
+  if(ui.rememberPasswd->isChecked()) accountData["Password"] = ui.password->text();
+  else accountData.remove("Password");
   CoreAccountSettings s;
   CoreAccountSettings s;
-  s.storeAccount(accountName, account);
+  s.storeAccountData(account, accountData);
   clientSyncer->loginToCore(ui.user->text(), ui.password->text());
 }
 
   clientSyncer->loginToCore(ui.user->text(), ui.password->text());
 }
 
@@ -361,26 +383,23 @@ void CoreConnectDlg::coreIrcUsersProgress(quint32 val, quint32 max) {
  * CoreAccountEditDlg
  *****************************************************************************************/
 
  * CoreAccountEditDlg
  *****************************************************************************************/
 
-CoreAccountEditDlg::CoreAccountEditDlg(const QString &name, const QVariantMap &acct, const QStringList &_existing, QWidget *parent) : QDialog(parent) {
+CoreAccountEditDlg::CoreAccountEditDlg(AccountId id, const QVariantMap &acct, const QStringList &_existing, QWidget *parent) : QDialog(parent) {
   ui.setupUi(this);
   existing = _existing;
   account = acct;
   ui.setupUi(this);
   existing = _existing;
   account = acct;
-  if(!name.isEmpty()) {
-    existing.removeAll(name);
+  if(id.isValid()) {
+    existing.removeAll(acct["AccountName"].toString());
     ui.host->setText(acct["Host"].toString());
     ui.port->setValue(acct["Port"].toUInt());
     ui.useInternal->setChecked(acct["UseInternal"].toBool());
     ui.host->setText(acct["Host"].toString());
     ui.port->setValue(acct["Port"].toUInt());
     ui.useInternal->setChecked(acct["UseInternal"].toBool());
-    ui.accountName->setText(name);
+    ui.accountName->setText(acct["AccountName"].toString());
   } else {
     setWindowTitle(tr("Add Core Account"));
   }
 }
 
   } else {
     setWindowTitle(tr("Add Core Account"));
   }
 }
 
-QString CoreAccountEditDlg::accountName() const {
-  return ui.accountName->text();
-}
-
 QVariantMap CoreAccountEditDlg::accountData() {
 QVariantMap CoreAccountEditDlg::accountData() {
+  account["AccountName"] = ui.accountName->text();
   account["Host"] = ui.host->text();
   account["Port"] = ui.port->value();
   account["UseInternal"] = ui.useInternal->isChecked();
   account["Host"] = ui.host->text();
   account["Port"] = ui.port->value();
   account["UseInternal"] = ui.useInternal->isChecked();
@@ -388,7 +407,7 @@ QVariantMap CoreAccountEditDlg::accountData() {
 }
 
 void CoreAccountEditDlg::setWidgetStates() {
 }
 
 void CoreAccountEditDlg::setWidgetStates() {
-  bool ok = !accountName().isEmpty() && !existing.contains(accountName()) && (ui.useInternal->isChecked() || !ui.host->text().isEmpty());
+  bool ok = !ui.accountName->text().isEmpty() && !existing.contains(ui.accountName->text()) && (ui.useInternal->isChecked() || !ui.host->text().isEmpty());
   ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok);
 }
 
   ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok);
 }
 
index 4714a01..69e3839 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <QAbstractSocket>
 
 
 #include <QAbstractSocket>
 
+#include "types.h"
+
 #include "ui_coreconnectdlg.h"
 #include "ui_coreaccounteditdlg.h"
 
 #include "ui_coreconnectdlg.h"
 #include "ui_coreaccounteditdlg.h"
 
@@ -77,10 +79,10 @@ class CoreConnectDlg : public QDialog {
   private:
     Ui::CoreConnectDlg ui;
 
   private:
     Ui::CoreConnectDlg ui;
 
-    QString autoConnectAccount;
-    QHash<QString, QVariantMap> accounts;
-    QVariantMap account;
-    QString accountName;
+    AccountId autoConnectAccount;
+    QHash<AccountId, QVariantMap> accounts;
+    QVariantMap accountData;
+    AccountId account;
 
     bool doingAutoConnect;
 
 
     bool doingAutoConnect;
 
@@ -91,9 +93,8 @@ class CoreAccountEditDlg : public QDialog {
   Q_OBJECT
 
   public:
   Q_OBJECT
 
   public:
-    CoreAccountEditDlg(const QString &name, const QVariantMap &data, const QStringList &existing = QStringList(), QWidget *parent = 0);
+    CoreAccountEditDlg(AccountId id, const QVariantMap &data, const QStringList &existing = QStringList(), QWidget *parent = 0);
 
 
-    QString accountName() const;
     QVariantMap accountData();
 
   private slots:
     QVariantMap accountData();
 
   private slots:
index 4868ad6..ead22e7 100644 (file)
@@ -5,7 +5,7 @@
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-03";
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-03";
-  quasselBuild = 453;
+  quasselBuild = 454;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 437;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 437;