From 6d32c3e6a04a358789c469948d044715d6fb5aed Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Fri, 13 Mar 2009 00:08:02 +0100 Subject: [PATCH] Move the client's AliasManager into Client Used to be in AliasesModel used by the settingspage, but we also need it for handling input, so we move it into Client proper. Note that existence of the AliasManager is only guaranteed as long as Client::isConnected() == true. --- src/client/client.cpp | 32 +++++++++++++- src/client/client.h | 7 +++ src/client/clientuserinputhandler.cpp | 33 +------------- src/client/clientuserinputhandler.h | 11 +---- src/qtui/settingspages/aliasesmodel.cpp | 43 ++++++++++++------- src/qtui/settingspages/aliasesmodel.h | 3 +- .../settingspages/aliasessettingspage.cpp | 3 ++ 7 files changed, 74 insertions(+), 58 deletions(-) diff --git a/src/client/client.cpp b/src/client/client.cpp index 2f349011..c2a3e165 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -27,6 +27,7 @@ #include "buffersettings.h" #include "buffersyncer.h" #include "bufferviewconfig.h" +#include "clientaliasmanager.h" #include "clientbacklogmanager.h" #include "clientbufferviewmanager.h" #include "clientirclisthelper.h" @@ -76,6 +77,7 @@ Client::Client(QObject *parent) _networkModel(0), _bufferModel(0), _bufferSyncer(0), + _aliasManager(0), _backlogManager(new ClientBacklogManager(this)), _bufferViewManager(0), _ircListHelper(new ClientIrcListHelper(this)), @@ -266,9 +268,21 @@ void Client::coreIdentityRemoved(IdentityId id) { } } -/*** ***/ +/*** User input handling ***/ + void Client::userInput(const BufferInfo &bufferInfo, const QString &message) { - inputHandler()->handleUserInput(bufferInfo, message); + // we need to make sure that AliasManager is ready before processing input + if(aliasManager() && aliasManager()->isInitialized()) + inputHandler()->handleUserInput(bufferInfo, message); + else + instance()-> _userInputBuffer.append(qMakePair(bufferInfo, message)); +} + +void Client::sendBufferedUserInput() { + for(int i = 0; i < _userInputBuffer.count(); i++) + userInput(_userInputBuffer.at(i).first, _userInputBuffer.at(i).second); + + _userInputBuffer.clear(); } /*** core connection stuff ***/ @@ -304,6 +318,12 @@ void Client::setSyncedToCore() { connect(bufferViewManager(), SIGNAL(initDone()), this, SLOT(requestInitialBacklog())); connect(bufferViewManager(), SIGNAL(initDone()), this, SLOT(createDefaultBufferView())); + // create AliasManager + Q_ASSERT(!_aliasManager); + _aliasManager = new ClientAliasManager(this); + connect(aliasManager(), SIGNAL(initDone()), SLOT(sendBufferedUserInput())); + signalProxy()->synchronize(aliasManager()); + _syncedToCore = true; emit connected(); emit coreConnectionStateChanged(true); @@ -352,6 +372,14 @@ void Client::disconnectedFromCore() { _bufferViewManager = 0; } + if(_aliasManager) { + _aliasManager->deleteLater(); + _aliasManager = 0; + } + + // we probably don't want to save pending input for reconnect + _userInputBuffer.clear(); + _messageModel->clear(); _networkModel->clear(); diff --git a/src/client/client.h b/src/client/client.h index 3dd5b6ac..3f5f79dd 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -42,6 +42,7 @@ class AbstractUiMsg; class NetworkModel; class BufferModel; class BufferSyncer; +class ClientAliasManager; class ClientBacklogManager; class ClientBufferViewManager; class ClientIrcListHelper; @@ -101,6 +102,7 @@ public: static inline AbstractMessageProcessor *messageProcessor() { return instance()->_messageProcessor; } static inline SignalProxy *signalProxy() { return instance()->_signalProxy; } + static inline ClientAliasManager *aliasManager() { return instance()->_aliasManager; } static inline ClientBacklogManager *backlogManager() { return instance()->_backlogManager; } static inline ClientIrcListHelper *ircListHelper() { return instance()->_ircListHelper; } static inline ClientBufferViewManager *bufferViewManager() { return instance()->_bufferViewManager; } @@ -186,6 +188,8 @@ private slots: void requestInitialBacklog(); void createDefaultBufferView(); + void sendBufferedUserInput(); + private: Client(QObject *parent = 0); virtual ~Client(); @@ -202,6 +206,7 @@ private: NetworkModel * _networkModel; BufferModel * _bufferModel; BufferSyncer * _bufferSyncer; + ClientAliasManager *_aliasManager; ClientBacklogManager *_backlogManager; ClientBufferViewManager *_bufferViewManager; ClientIrcListHelper *_ircListHelper; @@ -223,6 +228,8 @@ private: QString _debugLogBuffer; QTextStream _debugLog; + QList > _userInputBuffer; + friend class ClientSyncer; }; diff --git a/src/client/clientuserinputhandler.cpp b/src/client/clientuserinputhandler.cpp index c320a418..049b9d3d 100644 --- a/src/client/clientuserinputhandler.cpp +++ b/src/client/clientuserinputhandler.cpp @@ -21,43 +21,18 @@ #include #include "client.h" +#include "clientaliasmanager.h" #include "clientuserinputhandler.h" #include "clientsettings.h" #include "ircuser.h" #include "network.h" ClientUserInputHandler::ClientUserInputHandler(QObject *parent) -: QObject(parent), - _initialized(false) +: QObject(parent) { TabCompletionSettings s; s.notify("CompletionSuffix", this, SLOT(completionSuffixChanged(QVariant))); completionSuffixChanged(s.completionSuffix()); - - // we need this signal for future connects to reset the data; - connect(Client::instance(), SIGNAL(connected()), SLOT(clientConnected())); - connect(Client::instance(), SIGNAL(disconnected()), SLOT(clientDisconnected())); - if(Client::isConnected()) - clientConnected(); -} - -void ClientUserInputHandler::clientConnected() { - _aliasManager = ClientAliasManager(); - Client::signalProxy()->synchronize(&_aliasManager); - connect(&_aliasManager, SIGNAL(initDone()), SLOT(initDone())); -} - -void ClientUserInputHandler::clientDisconnected() { - // clear alias manager - _aliasManager = ClientAliasManager(); - _initialized = false; -} - -void ClientUserInputHandler::initDone() { - _initialized = true; - for(int i = 0; i < _inputBuffer.count(); i++) - handleUserInput(_inputBuffer.at(i).first, _inputBuffer.at(i).second); - _inputBuffer.clear(); } void ClientUserInputHandler::completionSuffixChanged(const QVariant &v) { @@ -69,10 +44,6 @@ void ClientUserInputHandler::completionSuffixChanged(const QVariant &v) { // this would be the place for a client-side hook void ClientUserInputHandler::handleUserInput(const BufferInfo &bufferInfo, const QString &msg) { - if(!_initialized) { // aliases not yet synced - _inputBuffer.append(qMakePair(bufferInfo, msg)); - return; - } if(!msg.startsWith('/')) { if(_nickRx.indexIn(msg) == 0) { diff --git a/src/client/clientuserinputhandler.h b/src/client/clientuserinputhandler.h index f459ac53..21d27578 100644 --- a/src/client/clientuserinputhandler.h +++ b/src/client/clientuserinputhandler.h @@ -21,9 +21,6 @@ #ifndef CLIENTUSERINPUTHANDLER_H_ #define CLIENTUSERINPUTHANDLER_H_ -#include - -#include "clientaliasmanager.h" #include "bufferinfo.h" class ClientUserInputHandler : public QObject { @@ -39,16 +36,12 @@ signals: void sendInput(const BufferInfo &, const QString &); private slots: - void clientConnected(); - void clientDisconnected(); - void initDone(); void completionSuffixChanged(const QVariant &); + void handleExec(const BufferInfo &bufferInfo, const QString &execStr); + private: - bool _initialized; QRegExp _nickRx; - ClientAliasManager _aliasManager; - AliasManager::CommandList _inputBuffer; }; #endif diff --git a/src/qtui/settingspages/aliasesmodel.cpp b/src/qtui/settingspages/aliasesmodel.cpp index d85feedf..ded0600a 100644 --- a/src/qtui/settingspages/aliasesmodel.cpp +++ b/src/qtui/settingspages/aliasesmodel.cpp @@ -28,11 +28,13 @@ AliasesModel::AliasesModel(QObject *parent) : QAbstractItemModel(parent), - _configChanged(false) + _configChanged(false), + _modelReady(false) { // we need this signal for future connects to reset the data; connect(Client::instance(), SIGNAL(connected()), this, SLOT(clientConnected())); connect(Client::instance(), SIGNAL(disconnected()), this, SLOT(clientDisconnected())); + if(Client::isConnected()) clientConnected(); else @@ -40,6 +42,9 @@ AliasesModel::AliasesModel(QObject *parent) } QVariant AliasesModel::data(const QModelIndex &index, int role) const { + if(!_modelReady) + return QVariant(); + if(!index.isValid() || index.row() >= rowCount() || index.column() >= columnCount()) return QVariant(); @@ -81,6 +86,9 @@ QVariant AliasesModel::data(const QModelIndex &index, int role) const { } bool AliasesModel::setData(const QModelIndex &index, const QVariant &value, int role) { + if(!_modelReady) + return false; + if(!index.isValid() || index.row() >= rowCount() || index.column() >= columnCount() || role != Qt::EditRole) return false; @@ -118,6 +126,9 @@ void AliasesModel::newAlias() { } void AliasesModel::loadDefaults() { + if(!_modelReady) + return; + AliasManager &manager = cloneAliasManager(); if(!manager.isEmpty()) { @@ -157,8 +168,8 @@ Qt::ItemFlags AliasesModel::flags(const QModelIndex &index) const { QVariant AliasesModel::headerData(int section, Qt::Orientation orientation, int role) const { QStringList header; header << tr("Alias") - << tr("Expansion"); - + << tr("Expansion"); + if(orientation == Qt::Horizontal && role == Qt::DisplayRole) return header[section]; @@ -178,19 +189,19 @@ const AliasManager &AliasesModel::aliasManager() const { if(_configChanged) return _clonedAliasManager; else - return _aliasManager; + return *Client::aliasManager(); } AliasManager &AliasesModel::aliasManager() { if(_configChanged) return _clonedAliasManager; else - return _aliasManager; + return *Client::aliasManager(); } AliasManager &AliasesModel::cloneAliasManager() { if(!_configChanged) { - _clonedAliasManager = _aliasManager; + _clonedAliasManager = *Client::aliasManager(); _configChanged = true; emit configChanged(true); } @@ -200,7 +211,7 @@ AliasManager &AliasesModel::cloneAliasManager() { void AliasesModel::revert() { if(!_configChanged) return; - + _configChanged = false; emit configChanged(false); reset(); @@ -210,26 +221,28 @@ void AliasesModel::commit() { if(!_configChanged) return; - _aliasManager.requestUpdate(_clonedAliasManager.toVariantMap()); + Client::aliasManager()->requestUpdate(_clonedAliasManager.toVariantMap()); revert(); -} +} void AliasesModel::initDone() { reset(); + _modelReady = true; emit modelReady(true); } void AliasesModel::clientConnected() { - _aliasManager = ClientAliasManager(); - Client::signalProxy()->synchronize(&_aliasManager); - connect(&_aliasManager, SIGNAL(initDone()), this, SLOT(initDone())); - connect(&_aliasManager, SIGNAL(updated(const QVariantMap &)), this, SLOT(revert())); + connect(Client::aliasManager(), SIGNAL(updated(QVariantMap)), SLOT(revert())); + if(Client::aliasManager()->isInitialized()) + initDone(); + else + connect(Client::aliasManager(), SIGNAL(initDone()), SLOT(initDone())); } void AliasesModel::clientDisconnected() { - // clear alias managers - _aliasManager = ClientAliasManager(); + // clear _clonedAliasManager = ClientAliasManager(); reset(); + _modelReady = false; emit modelReady(false); } diff --git a/src/qtui/settingspages/aliasesmodel.h b/src/qtui/settingspages/aliasesmodel.h index 7f7490e4..c6e82951 100644 --- a/src/qtui/settingspages/aliasesmodel.h +++ b/src/qtui/settingspages/aliasesmodel.h @@ -47,6 +47,7 @@ public: inline int columnCount(const QModelIndex &parent = QModelIndex()) const { Q_UNUSED(parent) return 2; } inline bool configChanged() const { return _configChanged; } + inline bool isReady() const { return _modelReady; } public slots: void newAlias(); @@ -60,9 +61,9 @@ signals: void modelReady(bool); private: - ClientAliasManager _aliasManager; ClientAliasManager _clonedAliasManager; bool _configChanged; + bool _modelReady; const AliasManager &aliasManager() const; AliasManager &aliasManager(); diff --git a/src/qtui/settingspages/aliasessettingspage.cpp b/src/qtui/settingspages/aliasessettingspage.cpp index 1b35fb08..8ffd30a4 100644 --- a/src/qtui/settingspages/aliasessettingspage.cpp +++ b/src/qtui/settingspages/aliasessettingspage.cpp @@ -45,6 +45,8 @@ AliasesSettingsPage::AliasesSettingsPage(QWidget *parent) connect(ui.deleteAliasButton, SIGNAL(clicked()), this, SLOT(deleteSelectedAlias())); connect(&_aliasesModel, SIGNAL(configChanged(bool)), this, SLOT(setChangedState(bool))); connect(&_aliasesModel, SIGNAL(modelReady(bool)), this, SLOT(enableDialog(bool))); + + enableDialog(_aliasesModel.isReady()); } void AliasesSettingsPage::load() { @@ -64,6 +66,7 @@ void AliasesSettingsPage::save() { void AliasesSettingsPage::enableDialog(bool enabled) { ui.newAliasButton->setEnabled(enabled); ui.deleteAliasButton->setEnabled(enabled); + setEnabled(enabled); } void AliasesSettingsPage::deleteSelectedAlias() { -- 2.20.1