properly saving the layout when using the internal core
authorMarcus Eggenberger <egs@quassel-irc.org>
Thu, 20 Nov 2008 00:21:45 +0000 (01:21 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Thu, 20 Nov 2008 00:21:45 +0000 (01:21 +0100)
src/client/client.cpp
src/client/client.h
src/client/clientsyncer.cpp
src/client/clientsyncer.h
src/qtui/coreconnectdlg.cpp
src/qtui/coreconnectdlg.h

index bac736b..0ccde84 100644 (file)
@@ -259,20 +259,17 @@ void Client::userInput(BufferInfo bufferInfo, QString message) {
 
 /*** core connection stuff ***/
 
-void Client::setConnectedToCore(QIODevice *socket, AccountId id) {
-  // if the socket is an orphan, the signalProxy adopts it.
-  // -> we don't need to care about it anymore
-  socket->setParent(0);
-  signalProxy()->addPeer(socket);
+void Client::setConnectedToCore(AccountId id, QIODevice *socket) {
+  if(socket) { // external core
+    // if the socket is an orphan, the signalProxy adopts it.
+    // -> we don't need to care about it anymore
+    socket->setParent(0);
+    signalProxy()->addPeer(socket);
+  }
   _connectedToCore = true;
   setCurrentCoreAccount(id);
 }
 
-void Client::setConnectedToInternalCore() {
-  _connectedToCore = true;
-  setCurrentCoreAccount(AccountId());
-}
-
 void Client::setSyncedToCore() {
   // create buffersyncer
   Q_ASSERT(!_bufferSyncer);
index 9f881d1..8a68d99 100644 (file)
@@ -174,8 +174,7 @@ private slots:
   void coreNetworkCreated(NetworkId);
   void coreNetworkRemoved(NetworkId);
 
-  void setConnectedToCore(QIODevice *socket, AccountId id);
-  void setConnectedToInternalCore();
+  void setConnectedToCore(AccountId id, QIODevice *socket = 0);
   void setSyncedToCore();
   void setSecuredConnection();
 
index 02c9a20..139f44b 100644 (file)
@@ -169,7 +169,8 @@ void ClientSyncer::coreSocketConnected() {
   SignalProxy::writeDataToDevice(socket, clientInit);
 }
 
-void ClientSyncer::useInternalCore() {
+void ClientSyncer::useInternalCore(AccountId internalAccountId) {
+  coreConnectionInfo["AccountId"] = QVariant::fromValue<AccountId>(internalAccountId);
   emit startInternalCore();
   emit connectToInternalCore(Client::instance()->signalProxy());
 }
@@ -248,7 +249,7 @@ void ClientSyncer::loginToCore(const QString &user, const QString &passwd) {
 void ClientSyncer::internalSessionStateReceived(const QVariant &packedState) {
   QVariantMap state = packedState.toMap();
   emit sessionProgress(1, 1);
-  Client::instance()->setConnectedToInternalCore();
+  Client::instance()->setConnectedToCore(coreConnectionInfo["AccountId"].value<AccountId>());
   syncToCore(state);
 }
 
@@ -256,7 +257,7 @@ void ClientSyncer::sessionStateReceived(const QVariantMap &state) {
   emit sessionProgress(1, 1);
   disconnect(this, SIGNAL(recvPartialItem(quint32, quint32)), this, SIGNAL(sessionProgress(quint32, quint32)));
   disconnect(socket, 0, this, 0);  // rest of communication happens through SignalProxy
-  Client::instance()->setConnectedToCore(socket, coreConnectionInfo["AccountId"].value<AccountId>());
+  Client::instance()->setConnectedToCore(coreConnectionInfo["AccountId"].value<AccountId>(), socket);
   syncToCore(state);
 }
 
index d321451..7f07de3 100644 (file)
@@ -18,8 +18,8 @@
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
-#ifndef _CLIENTSYNCER_H_
-#define _CLIENTSYNCER_H_
+#ifndef CLIENTSYNCER_H_
+#define CLIENTSYNCER_H_
 
 #include <QPointer>
 #include <QString>
@@ -31,6 +31,8 @@
 #  include <QTcpSocket>
 #endif
 
+#include "types.h"
+
 class IrcUser;
 class IrcChannel;
 class SignalProxy;
@@ -68,7 +70,7 @@ public slots:
   void connectToCore(const QVariantMap &);
   void loginToCore(const QString &user, const QString &passwd);
   void disconnectFromCore();
-  void useInternalCore();
+  void useInternalCore(AccountId internalAccountId);
 
 private slots:
   void coreSocketError(QAbstractSocket::SocketError);
index 954be2d..dab92a2 100644 (file)
@@ -32,7 +32,8 @@
 #include "quassel.h"
 
 CoreConnectDlg::CoreConnectDlg(bool autoconnect, QWidget *parent)
-  : QDialog(parent)
+  : QDialog(parent),
+    _internalAccountId(0)
 {
   ui.setupUi(this);
   ui.editAccount->setIcon(SmallIcon("document-properties"));
@@ -65,6 +66,10 @@ CoreConnectDlg::CoreConnectDlg(bool autoconnect, QWidget *parent)
   foreach(AccountId id, s.knownAccounts()) {
     if(!id.isValid()) continue;
     QVariantMap data = s.retrieveAccountData(id);
+    if(data.contains("InternalAccount") && data["InternalAccount"].toBool()) {
+      _internalAccountId = id;
+      continue;
+    }
     data["AccountId"] = QVariant::fromValue<AccountId>(id);
     accounts[id] = data;
     QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList);
@@ -150,14 +155,7 @@ void CoreConnectDlg::on_addAccount_clicked() {
   for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text();
   CoreAccountEditDlg dlg(0, QVariantMap(), existing, this);
   if(dlg.exec() == QDialog::Accepted) {
-    // find free ID
-    AccountId id = accounts.count() + 1;
-    for(AccountId i = 1; i <= accounts.count(); i++) {
-      if(!accounts.keys().contains(i)) {
-        id = i;
-        break;
-      }
-    }
+    AccountId id = findFreeAccountId();
     QVariantMap data = dlg.accountData();
     data["AccountId"] = QVariant::fromValue<AccountId>(id);
     accounts[id] = data;
@@ -221,7 +219,14 @@ void CoreConnectDlg::on_accountButtonBox_accepted() {
 }
 
 void CoreConnectDlg::on_useInternalCore_clicked() {
-  clientSyncer->useInternalCore();
+  if(!_internalAccountId.isValid()) {
+    _internalAccountId = findFreeAccountId();
+    QVariantMap data;
+    data["InternalAccount"] = true;
+    CoreAccountSettings accountSettings;
+    accountSettings.storeAccountData(_internalAccountId, data);
+  }
+  clientSyncer->useInternalCore(_internalAccountId);
   startSync();
 }
 
@@ -450,6 +455,13 @@ void CoreConnectDlg::syncFinished() {
   }
 }
 
+AccountId CoreConnectDlg::findFreeAccountId() {
+  for(AccountId i = 1;; i++) {
+    if(!accounts.contains(i) && i != _internalAccountId)
+      return i;
+  }
+}
+
 /*****************************************************************************************
  * CoreAccountEditDlg
  *****************************************************************************************/
index 7abaac9..3fb8b99 100644 (file)
@@ -86,10 +86,13 @@ private slots:
   void coreNetworksProgress(quint32, quint32);
 
 private:
+  AccountId findFreeAccountId();
+
   Ui::CoreConnectDlg ui;
 
   AccountId autoConnectAccount;
   QHash<AccountId, QVariantMap> accounts;
+  AccountId _internalAccountId;
   QVariantMap accountData;
   AccountId account;