X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fclient.cpp;h=58725988d57290ae28538ab8eb877ba571dfa028;hp=a2473b17d9bb10f21b78373de590aa6516c7b7e5;hb=f1e45389df014fb5445ee96769bf02dcf34f1e21;hpb=8010224cf5bfe5685dc2cf535e8dc1ec19c4c364 diff --git a/src/client/client.cpp b/src/client/client.cpp index a2473b17..58725988 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -280,10 +280,12 @@ void Client::setConnectedToCore(QIODevice *sock, AccountId id) { } void Client::setSyncedToCore() { - // create buffersyncer + // create buffersyncer Q_ASSERT(!_bufferSyncer); _bufferSyncer = new BufferSyncer(this); connect(bufferSyncer(), SIGNAL(lastSeenSet(BufferId, const QDateTime &)), this, SLOT(updateLastSeen(BufferId, const QDateTime &))); + connect(bufferSyncer(), SIGNAL(bufferRemoved(BufferId)), this, SLOT(bufferRemoved(BufferId))); + connect(bufferSyncer(), SIGNAL(bufferRenamed(BufferId, QString)), this, SLOT(bufferRenamed(BufferId, QString))); signalProxy()->synchronize(bufferSyncer()); _syncedToCore = true; @@ -292,6 +294,9 @@ void Client::setSyncedToCore() { } void Client::disconnectFromCore() { + if(!isConnected()) + return; + if(socket) { socket->close(); socket->deleteLater(); @@ -303,8 +308,10 @@ void Client::disconnectFromCore() { emit coreConnectionStateChanged(false); // Clear internal data. Hopefully nothing relies on it at this point. - _bufferSyncer->deleteLater(); - _bufferSyncer = 0; + if(_bufferSyncer) { + _bufferSyncer->deleteLater(); + _bufferSyncer = 0; + } _networkModel->clear(); QHash::iterator bufferIter = _buffers.begin(); @@ -457,4 +464,31 @@ void Client::setBufferLastSeen(BufferId id, const QDateTime &lastSeen) { bufferSyncer()->requestSetLastSeen(id, lastSeen); } +void Client::removeBuffer(BufferId id) { + if(!bufferSyncer()) return; + bufferSyncer()->requestRemoveBuffer(id); +} +void Client::bufferRemoved(BufferId bufferId) { + QModelIndex current = bufferModel()->currentIndex(); + if(current.data(NetworkModel::BufferIdRole).value() == bufferId) { + // select the status buffer if the currently displayed buffer is about to be removed + QModelIndex newCurrent = current.sibling(0,0); + bufferModel()->standardSelectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + bufferModel()->standardSelectionModel()->select(newCurrent, QItemSelectionModel::ClearAndSelect); + } + + networkModel()->removeBuffer(bufferId); + if(_buffers.contains(bufferId)) { + Buffer *buff = _buffers.take(bufferId); + disconnect(buff, 0, this, 0); + buff->deleteLater(); + } +} + +void Client::bufferRenamed(BufferId bufferId, const QString &newName) { + QModelIndex bufferIndex = networkModel()->bufferIndex(bufferId); + if(bufferIndex.isValid()) { + networkModel()->setData(bufferIndex, newName, Qt::DisplayRole); + } +}