From: Marcus Eggenberger Date: Tue, 19 Feb 2008 18:37:01 +0000 (+0000) Subject: Query buffers are now automatically renamed on nickchanges. X-Git-Tag: 0.2.0-alpha1~23 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=bd1a18355495899b5ce3003599a67e1ea7ca01cc Query buffers are now automatically renamed on nickchanges. You have to be in a channel with the query partner though (this is an IRC limitation). Closing BR #92 --- diff --git a/src/client/client.cpp b/src/client/client.cpp index be2c8940..b9515e78 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -285,6 +285,7 @@ void Client::setSyncedToCore() { _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; @@ -479,3 +480,10 @@ void Client::bufferRemoved(BufferId bufferId) { buff->deleteLater(); } } + +void Client::bufferRenamed(BufferId bufferId, const QString &newName) { + QModelIndex bufferIndex = networkModel()->bufferIndex(bufferId); + if(bufferIndex.isValid()) { + networkModel()->setData(bufferIndex, newName, Qt::DisplayRole); + } +} diff --git a/src/client/client.h b/src/client/client.h index c7e3ae1e..cb6620b5 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -158,6 +158,7 @@ public slots: void setCoreConfiguration(const QVariantMap &settings); void bufferRemoved(BufferId bufferId); + void bufferRenamed(BufferId bufferId, const QString &newName); private slots: //void coreSocketError(QAbstractSocket::SocketError); diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index b10afd06..05340a36 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -37,6 +37,7 @@ BufferItem::BufferItem(BufferInfo bufferInfo, AbstractTreeItem *parent) : PropertyMapItem(QStringList() << "bufferName" << "topic" << "nickCount", parent), _bufferInfo(bufferInfo), + _bufferName(bufferInfo.bufferName()), _activity(Buffer::NoActivity) { Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled; @@ -158,7 +159,15 @@ QString BufferItem::bufferName() const { if(bufferType() == BufferInfo::StatusBuffer) return tr("Status Buffer"); else - return bufferInfo().bufferName(); + return _bufferName; +} + +void BufferItem::setBufferName(const QString &name) { + _bufferName = name; + // as long as we need those bufferInfos, we have to update that one aswell. + // pretty ugly though :/ + _bufferInfo = BufferInfo(_bufferInfo.bufferId(), _bufferInfo.networkId(), _bufferInfo.type(), _bufferInfo.groupId(), _bufferInfo.bufferName()); + emit dataChanged(0); } QString BufferItem::topic() const { diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index 1fd5767f..9cfc7b7a 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -45,7 +45,7 @@ class IrcUser; *****************************************/ class BufferItem : public PropertyMapItem { Q_OBJECT - Q_PROPERTY(QString bufferName READ bufferName) + Q_PROPERTY(QString bufferName READ bufferName WRITE setBufferName) Q_PROPERTY(QString topic READ topic) Q_PROPERTY(int nickCount READ nickCount) @@ -60,6 +60,7 @@ public: void attachIrcChannel(IrcChannel *ircChannel); QString bufferName() const; + void setBufferName(const QString &name); QString topic() const; int nickCount() const; @@ -91,6 +92,7 @@ private slots: private: BufferInfo _bufferInfo; + QString _bufferName; Buffer::ActivityLevel _activity; QPointer _ircChannel; diff --git a/src/common/buffersyncer.cpp b/src/common/buffersyncer.cpp index 227370c2..d4c6918c 100644 --- a/src/common/buffersyncer.cpp +++ b/src/common/buffersyncer.cpp @@ -71,3 +71,7 @@ void BufferSyncer::removeBuffer(BufferId buffer) { _lastSeen.remove(buffer); emit bufferRemoved(buffer); } + +void BufferSyncer::renameBuffer(BufferId buffer, QString newName) { + emit bufferRenamed(buffer, newName); +} diff --git a/src/common/buffersyncer.h b/src/common/buffersyncer.h index a7e78866..aa64118b 100644 --- a/src/common/buffersyncer.h +++ b/src/common/buffersyncer.h @@ -41,12 +41,14 @@ class BufferSyncer : public SyncableObject { void requestSetLastSeen(BufferId buffer, const QDateTime &time); void requestRemoveBuffer(BufferId buffer); void removeBuffer(BufferId buffer); + void renameBuffer(BufferId buffer, QString newName); signals: void lastSeenSet(BufferId buffer, const QDateTime &time); void setLastSeenRequested(BufferId buffer, const QDateTime &time); void removeBufferRequested(BufferId buffer); void bufferRemoved(BufferId buffer); + void bufferRenamed(BufferId buffer, QString newName); private slots: bool setLastSeen(BufferId buffer, const QDateTime &time); diff --git a/src/core/SQL/SQLite/7/update_buffer_name.sql b/src/core/SQL/SQLite/7/update_buffer_name.sql new file mode 100644 index 00000000..14d65e7a --- /dev/null +++ b/src/core/SQL/SQLite/7/update_buffer_name.sql @@ -0,0 +1,3 @@ +UPDATE buffer +SET buffername = :buffername, buffercname = :buffercname +WHERE bufferid = :bufferid diff --git a/src/core/core.cpp b/src/core/core.cpp index 05d020e2..03d22d4c 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -275,6 +275,11 @@ bool Core::removeBuffer(const UserId &user, const BufferId &bufferId) { return instance()->storage->removeBuffer(user, bufferId); } +BufferId Core::renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName) { + QMutexLocker locker(&mutex); + return instance()->storage->renameBuffer(user, networkId, newName, oldName); +} + void Core::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) { QMutexLocker locker(&mutex); return instance()->storage->setBufferLastSeen(user, bufferId, seenDate); diff --git a/src/core/core.h b/src/core/core.h index fb260280..bb1adf01 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -177,6 +177,16 @@ class Core : public QObject { */ static bool removeBuffer(const UserId &user, const BufferId &bufferId); + //! Rename a Buffer + /** \note This method is threadsafe. + * \param user The id of the buffer owner + * \param networkId The id of the network the buffer belongs to + * \param newName The new name of the buffer + * \param oldName The previous name of the buffer + * \return the BufferId of the affected buffer or an invalid BufferId if not successfull + */ + static BufferId renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName); + //! Update the LastSeenDate for a Buffer /** This Method is used to make the LastSeenDate of a Buffer persistent * \note This method is threadsafe. diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index c9891d23..33f094ce 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -75,6 +75,7 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObje connect(_bufferSyncer, SIGNAL(lastSeenSet(BufferId, const QDateTime &)), this, SLOT(storeBufferLastSeen(BufferId, const QDateTime &))); connect(_bufferSyncer, SIGNAL(removeBufferRequested(BufferId)), this, SLOT(removeBufferRequested(BufferId))); connect(this, SIGNAL(bufferRemoved(BufferId)), _bufferSyncer, SLOT(removeBuffer(BufferId))); + connect(this, SIGNAL(bufferRenamed(BufferId, QString)), _bufferSyncer, SLOT(renameBuffer(BufferId, QString))); p->synchronize(_bufferSyncer); // Restore session state @@ -242,6 +243,8 @@ void CoreSession::attachNetworkConnection(NetworkConnection *conn) { this, SLOT(recvMessageFromServer(Message::Type, BufferInfo::Type, QString, QString, QString, quint8))); connect(conn, SIGNAL(displayStatusMsg(QString)), this, SLOT(recvStatusMsgFromServer(QString))); + connect(conn, SIGNAL(nickChanged(const NetworkId &, const QString &, const QString &)), + this, SLOT(renameBuffer(const NetworkId &, const QString &, const QString &))); } void CoreSession::disconnectFromNetwork(NetworkId id) { @@ -500,3 +503,10 @@ void CoreSession::removeBufferRequested(BufferId bufferId) { if(Core::removeBuffer(user(), bufferId)) emit bufferRemoved(bufferId); } + +void CoreSession::renameBuffer(const NetworkId &networkId, const QString &newName, const QString &oldName) { + BufferId bufferId = Core::renameBuffer(user(), networkId, newName, oldName); + if(bufferId.isValid()) { + emit bufferRenamed(bufferId, newName); + } +} diff --git a/src/core/coresession.h b/src/core/coresession.h index 545bf9c6..a52e0399 100644 --- a/src/core/coresession.h +++ b/src/core/coresession.h @@ -106,7 +106,15 @@ public slots: * emits bufferRemoved(bufferId) on success. */ void removeBufferRequested(BufferId bufferId); - + + //! Rename a Buffer for a given network + /* \param networkId The id of the network the buffer belongs to + * \param newName The new name of the buffer + * \param oldName The old name of the buffer + * emits bufferRenamed(bufferId, newName) on success. + */ + void renameBuffer(const NetworkId &networkId, const QString &newName, const QString &oldName); + signals: void initialized(); @@ -138,6 +146,7 @@ signals: void networkCreated(NetworkId); void networkRemoved(NetworkId); void bufferRemoved(BufferId); + void bufferRenamed(BufferId, QString); private slots: void recvStatusMsgFromServer(QString msg); diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 957ef6e4..fd7e0554 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -241,6 +241,8 @@ void IrcServerHandler::handleNick(const QString &prefix, const QList ? newnick : prefix; + + emit nickChanged(newnick, oldnick); foreach(QString channel, ircuser->channels()) emit displayMsg(Message::Nick, BufferInfo::ChannelBuffer, channel, newnick, sender); diff --git a/src/core/ircserverhandler.h b/src/core/ircserverhandler.h index 94e62b15..89289fc0 100644 --- a/src/core/ircserverhandler.h +++ b/src/core/ircserverhandler.h @@ -66,6 +66,9 @@ public slots: void defaultHandler(QString cmd, const QString &prefix, const QList ¶ms); +signals: + void nickChanged(const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend + private: void tryNextNick(const QString &errnick); bool _whois; diff --git a/src/core/networkconnection.cpp b/src/core/networkconnection.cpp index 395f1349..5830d02a 100644 --- a/src/core/networkconnection.cpp +++ b/src/core/networkconnection.cpp @@ -60,6 +60,8 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session, con connect(&socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(socketStateChanged(QAbstractSocket::SocketState))); connect(&socket, SIGNAL(readyRead()), this, SLOT(socketHasData())); + connect(_ircServerHandler, SIGNAL(nickChanged(const QString &, const QString &)), + this, SLOT(nickChanged(const QString &, const QString &))); } NetworkConnection::~NetworkConnection() { @@ -340,6 +342,10 @@ void NetworkConnection::putCmd(const QString &cmd, const QVariantList ¶ms, c putRawLine(msg); } +void NetworkConnection::nickChanged(const QString &newNick, const QString &oldNick) { + emit nickChanged(_network->networkId(), newNick, oldNick); +} + /* Exception classes for message handling */ NetworkConnection::ParseError::ParseError(QString cmd, QString prefix, QStringList params) { Q_UNUSED(prefix); @@ -350,3 +356,4 @@ NetworkConnection::UnknownCmdError::UnknownCmdError(QString cmd, QString prefix, Q_UNUSED(prefix); _msg = QString("Unknown Command: ") + cmd + params.join(" "); } + diff --git a/src/core/networkconnection.h b/src/core/networkconnection.h index ace1e4ea..83dcdec7 100644 --- a/src/core/networkconnection.h +++ b/src/core/networkconnection.h @@ -94,6 +94,7 @@ private slots: void sendPerform(); void autoReconnectSettingsChanged(); void doAutoReconnect(); + void nickChanged(const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend signals: // #void networkState(QString net, QVariantMap data); @@ -110,7 +111,7 @@ signals: void quitRequested(NetworkId networkId); //void queryRequested(QString network, QString nick); - + void nickChanged(const NetworkId &networkId, const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend private slots: void socketHasData(); diff --git a/src/core/sql.qrc b/src/core/sql.qrc index 3474dd75..47886fb6 100644 --- a/src/core/sql.qrc +++ b/src/core/sql.qrc @@ -81,6 +81,7 @@ ./SQL/SQLite/7/setup_080_ircservers.sql ./SQL/SQLite/7/setup_999_version.sql ./SQL/SQLite/7/update_buffer_lastseen.sql + ./SQL/SQLite/7/update_buffer_name.sql ./SQL/SQLite/7/update_network.sql ./SQL/SQLite/7/update_username.sql ./SQL/SQLite/7/update_userpassword.sql diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index ed705a84..be02b385 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -463,6 +463,47 @@ bool SqliteStorage::removeBuffer(const UserId &user, const BufferId &bufferId) { return true; } +BufferId SqliteStorage::renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName) { + // check if such a buffer exists... + QSqlQuery existsQuery(logDb()); + existsQuery.prepare(queryString("select_bufferByName")); + existsQuery.bindValue(":networkid", networkId.toInt()); + existsQuery.bindValue(":userid", user.toInt()); + existsQuery.bindValue(":buffercname", oldName.toLower()); + existsQuery.exec(); + if(!watchQuery(&existsQuery)) + return false; + + if(!existsQuery.first()) + return false; + + const int bufferid = existsQuery.value(0).toInt(); + + Q_ASSERT(!existsQuery.next()); + + // ... and if the new name is still free. + existsQuery.bindValue(":networkid", networkId.toInt()); + existsQuery.bindValue(":userid", user.toInt()); + existsQuery.bindValue(":buffercname", newName.toLower()); + existsQuery.exec(); + if(!watchQuery(&existsQuery)) + return false; + + if(existsQuery.first()) + return false; + + QSqlQuery renameBufferQuery(logDb()); + renameBufferQuery.prepare(queryString("update_buffer_name")); + renameBufferQuery.bindValue(":buffername", newName); + renameBufferQuery.bindValue(":buffercname", newName.toLower()); + renameBufferQuery.bindValue(":bufferid", bufferid); + renameBufferQuery.exec(); + if(watchQuery(&existsQuery)) + return BufferId(bufferid); + else + return BufferId(); +} + void SqliteStorage::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) { QSqlQuery *query = cachedQuery("update_buffer_lastseen"); query->bindValue(":userid", user.toInt()); diff --git a/src/core/sqlitestorage.h b/src/core/sqlitestorage.h index 71fe3922..4c133e6c 100644 --- a/src/core/sqlitestorage.h +++ b/src/core/sqlitestorage.h @@ -62,6 +62,7 @@ public slots: virtual BufferInfo getBufferInfo(UserId user, const BufferId &bufferId); virtual QList requestBuffers(UserId user, QDateTime since = QDateTime()); virtual bool removeBuffer(const UserId &user, const BufferId &bufferId); + virtual BufferId renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName); virtual void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate); virtual QHash bufferLastSeenDates(UserId user); diff --git a/src/core/storage.h b/src/core/storage.h index 3915d090..2c975ca8 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -183,6 +183,15 @@ class Storage : public QObject { * \return true if successfull */ virtual bool removeBuffer(const UserId &user, const BufferId &bufferId) = 0; + + //! Rename a Buffer + /** \param user The id of the buffer owner + * \param networkId The id of the network the buffer belongs to + * \param newName The new name of the buffer + * \param oldName The previous name of the buffer + * \return the BufferId of the affected buffer or an invalid BufferId if not successfull + */ + virtual BufferId renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName) = 0; //! Update the LastSeenDate for a Buffer /** This Method is used to make the LastSeenDate of a Buffer persistent @@ -234,6 +243,8 @@ class Storage : public QObject { signals: //! Sent when a new BufferInfo is created, or an existing one changed somehow. void bufferInfoUpdated(UserId user, const BufferInfo &); + //! Sent when a Buffer was renamed + void bufferRenamed(const QString &newName, const QString &oldName); //! Sent when a new user has been added void userAdded(UserId, const QString &username); //! Sent when a user has been renamed diff --git a/version.inc b/version.inc index e9770bb6..872ce98c 100644 --- a/version.inc +++ b/version.inc @@ -5,7 +5,7 @@ quasselVersion = "0.2.0-pre"; quasselDate = "2008-02-19"; - quasselBuild = 555; + quasselBuild = 557; //! Minimum client build number the core needs clientBuildNeeded = 526;