Networks can now be removed even when they're connected.
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 12 Feb 2008 18:08:00 +0000 (18:08 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 12 Feb 2008 18:08:00 +0000 (18:08 +0000)
src/common/network.cpp
src/common/network.h
src/core/coresession.cpp
src/core/coresession.h
src/qtui/settingspages/networkssettingspage.cpp
version.inc

index fa87a30..0d367af 100644 (file)
@@ -51,6 +51,7 @@ Network::Network(const NetworkId &networkid, QObject *parent) : SyncableObject(p
 // I think this is unnecessary since IrcUsers have us as their daddy :)
 
 Network::~Network() {
 // I think this is unnecessary since IrcUsers have us as their daddy :)
 
 Network::~Network() {
+  emit aboutToBeDestroyed();
 //  QHashIterator<QString, IrcUser *> ircuser(_ircUsers);
 //  while (ircuser.hasNext()) {
 //    ircuser.next();
 //  QHashIterator<QString, IrcUser *> ircuser(_ircUsers);
 //  while (ircuser.hasNext()) {
 //    ircuser.next();
index b86b51e..b9a2236 100644 (file)
@@ -173,6 +173,7 @@ private slots:
   void ircChannelInitDone();
 
 signals:
   void ircChannelInitDone();
 
 signals:
+  void aboutToBeDestroyed();
   void networkNameSet(const QString &networkName);
   void currentServerSet(const QString &currentServer);
   void connectedSet(bool isConnected);
   void networkNameSet(const QString &networkName);
   void currentServerSet(const QString &currentServer);
   void connectedSet(bool isConnected);
index 17820f9..e89f821 100644 (file)
@@ -430,6 +430,23 @@ void CoreSession::updateNetwork(const NetworkInfo &info) {
 }
 
 void CoreSession::removeNetwork(NetworkId id) {
 }
 
 void CoreSession::removeNetwork(NetworkId id) {
+  // Make sure the network is disconnected!
+  NetworkConnection *conn = _connections.value(id, 0);
+  if(conn) {
+    if(conn->connectionState() != Network::Disconnected) {
+      connect(conn, SIGNAL(disconnected(NetworkId)), this, SLOT(destroyNetwork(NetworkId)));
+      conn->disconnectFromIrc();
+    } else {
+      _connections.take(id)->deleteLater();  // TODO make this saner
+      destroyNetwork(id);
+    }
+  } else {
+    destroyNetwork(id);
+  }
+}
+
+void CoreSession::destroyNetwork(NetworkId id) {
+  Q_ASSERT(!_connections.contains(id));
   Network *net = _networks.take(id);
   if(net && Core::removeNetwork(user(), id)) {
     emit networkRemoved(id);
   Network *net = _networks.take(id);
   if(net && Core::removeNetwork(user(), id)) {
     emit networkRemoved(id);
index 06f7ee6..51c14a7 100644 (file)
@@ -137,6 +137,8 @@ private slots:
   void networkConnected(NetworkId networkid);
   void networkDisconnected(NetworkId networkid);
 
   void networkConnected(NetworkId networkid);
   void networkDisconnected(NetworkId networkid);
 
+  void destroyNetwork(NetworkId);
+
   //! Called when storage updated a BufferInfo.
   /** This emits bufferInfoUpdated() via SignalProxy, iff it's one of our buffers.
    *  \param user       The buffer's owner (not necessarily us)
   //! Called when storage updated a BufferInfo.
   /** This emits bufferInfoUpdated() via SignalProxy, iff it's one of our buffers.
    *  \param user       The buffer's owner (not necessarily us)
@@ -155,6 +157,7 @@ private:
   SignalProxy *_signalProxy;
   QHash<NetworkId, NetworkConnection *> _connections;
   QHash<NetworkId, Network *> _networks;
   SignalProxy *_signalProxy;
   QHash<NetworkId, NetworkConnection *> _connections;
   QHash<NetworkId, Network *> _networks;
+  QHash<NetworkId, Network *> _networksToRemove;
   QHash<IdentityId, Identity *> _identities;
 
   QScriptEngine *scriptEngine;
   QHash<IdentityId, Identity *> _identities;
 
   QScriptEngine *scriptEngine;
index 4fb60da..ff58261 100644 (file)
@@ -178,7 +178,7 @@ void NetworksSettingsPage::setWidgetStates() {
 }
 
 void NetworksSettingsPage::setItemState(NetworkId id, QListWidgetItem *item) {
 }
 
 void NetworksSettingsPage::setItemState(NetworkId id, QListWidgetItem *item) {
-  if(!item) item = networkItem(id);
+  if(!item && !(item = networkItem(id))) return;
   const Network *net = Client::network(id);
   if(!net || net->isInitialized()) item->setFlags(item->flags() | Qt::ItemIsEnabled);
   else item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
   const Network *net = Client::network(id);
   if(!net || net->isInitialized()) item->setFlags(item->flags() | Qt::ItemIsEnabled);
   else item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
@@ -190,19 +190,22 @@ void NetworksSettingsPage::setItemState(NetworkId id, QListWidgetItem *item) {
     item->setIcon(disconnectedIcon);
   }
   if(net) {
     item->setIcon(disconnectedIcon);
   }
   if(net) {
+    bool select = false;
     // check if we already have another net of this name in the list, and replace it
     QList<QListWidgetItem *> items = ui.networkList->findItems(net->networkName(), Qt::MatchExactly);
     if(items.count()) {
       foreach(QListWidgetItem *i, items) {
         NetworkId oldid = i->data(Qt::UserRole).value<NetworkId>();
         if(oldid > 0) continue;  // only locally created nets should be replaced
     // check if we already have another net of this name in the list, and replace it
     QList<QListWidgetItem *> items = ui.networkList->findItems(net->networkName(), Qt::MatchExactly);
     if(items.count()) {
       foreach(QListWidgetItem *i, items) {
         NetworkId oldid = i->data(Qt::UserRole).value<NetworkId>();
         if(oldid > 0) continue;  // only locally created nets should be replaced
-        if(oldid == currentId) item->setSelected(true);
-        delete ui.networkList->takeItem(ui.networkList->row(i));
+        if(oldid == currentId) select = true;
+        int row = ui.networkList->row(i);
+        if(row >= 0) delete ui.networkList->takeItem(row);
         networkInfos.remove(oldid);
         break;
       }
     }
     item->setText(net->networkName());
         networkInfos.remove(oldid);
         break;
       }
     }
     item->setText(net->networkName());
+    if(select) item->setSelected(true);
   }
 }
 
   }
 }
 
index 67e84fd..7e125b6 100644 (file)
@@ -5,7 +5,7 @@
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-12";
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-12";
-  quasselBuild = 509;
+  quasselBuild = 510;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 509;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 509;