From: Manuel Nickschas Date: Tue, 12 Feb 2008 18:08:00 +0000 (+0000) Subject: Networks can now be removed even when they're connected. X-Git-Tag: 0.2.0-alpha1~70 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=5b083e1f67c77ceb7d1d134e976cd6081b70bf12 Networks can now be removed even when they're connected. --- diff --git a/src/common/network.cpp b/src/common/network.cpp index fa87a30b..0d367af2 100644 --- a/src/common/network.cpp +++ b/src/common/network.cpp @@ -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() { + emit aboutToBeDestroyed(); // QHashIterator ircuser(_ircUsers); // while (ircuser.hasNext()) { // ircuser.next(); diff --git a/src/common/network.h b/src/common/network.h index b86b51e7..b9a22363 100644 --- a/src/common/network.h +++ b/src/common/network.h @@ -173,6 +173,7 @@ private slots: void ircChannelInitDone(); signals: + void aboutToBeDestroyed(); void networkNameSet(const QString &networkName); void currentServerSet(const QString ¤tServer); void connectedSet(bool isConnected); diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 17820f99..e89f821a 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -430,6 +430,23 @@ void CoreSession::updateNetwork(const NetworkInfo &info) { } 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); diff --git a/src/core/coresession.h b/src/core/coresession.h index 06f7ee65..51c14a72 100644 --- a/src/core/coresession.h +++ b/src/core/coresession.h @@ -137,6 +137,8 @@ private slots: 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) @@ -155,6 +157,7 @@ private: SignalProxy *_signalProxy; QHash _connections; QHash _networks; + QHash _networksToRemove; QHash _identities; QScriptEngine *scriptEngine; diff --git a/src/qtui/settingspages/networkssettingspage.cpp b/src/qtui/settingspages/networkssettingspage.cpp index 4fb60da2..ff582612 100644 --- a/src/qtui/settingspages/networkssettingspage.cpp +++ b/src/qtui/settingspages/networkssettingspage.cpp @@ -178,7 +178,7 @@ void NetworksSettingsPage::setWidgetStates() { } 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); @@ -190,19 +190,22 @@ void NetworksSettingsPage::setItemState(NetworkId id, QListWidgetItem *item) { 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 items = ui.networkList->findItems(net->networkName(), Qt::MatchExactly); if(items.count()) { foreach(QListWidgetItem *i, items) { NetworkId oldid = i->data(Qt::UserRole).value(); 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()); + if(select) item->setSelected(true); } } diff --git a/version.inc b/version.inc index 67e84fdc..7e125b64 100644 --- a/version.inc +++ b/version.inc @@ -5,7 +5,7 @@ quasselVersion = "0.2.0-pre"; quasselDate = "2008-02-12"; - quasselBuild = 509; + quasselBuild = 510; //! Minimum client build number the core needs clientBuildNeeded = 509;