Note: this was heavy surgery... please let me know if I did cut the guts or any other innards...
set(SOURCES
abstractmessageprocessor.cpp
- buffer.cpp
+ backlogrequester.cpp
buffermodel.cpp
buffersettings.cpp
client.cpp
set(MOC_HDRS
abstractmessageprocessor.h
- buffer.h
buffermodel.h
client.h
clientbacklogmanager.h
treemodel.h)
set(HEADERS
+ backlogrequester.h
buffersettings.h
clientsettings.h)
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-#include <QDebug>
-#include "buffer.h"
+#include "backlogrequester.h"
-#include "buffersyncer.h"
-#include "client.h"
-#include "networkmodel.h"
-#include "quasselui.h"
-#include "util.h"
+#include <QDebug>
+#include "backlogmanager.h"
-Buffer::Buffer(BufferInfo bufferid, QObject *parent)
- : QObject(parent),
- _bufferInfo(bufferid)
+BacklogRequester::BacklogRequester(BacklogManager *backlogManager)
+ : backlogManager(backlogManager)
{
+ Q_ASSERT(backlogManager);
}
-BufferInfo Buffer::bufferInfo() const {
- // still needed by the gui *sigh* to request the backlogs *sigh*
- return _bufferInfo;
+// FIXED BACKLOG REQUESTER
+const int FixedBacklogRequester::backlogCount(500);
+
+FixedBacklogRequester::FixedBacklogRequester(BacklogManager *backlogManager)
+ : BacklogRequester(backlogManager)
+{
}
+void FixedBacklogRequester::requestBacklog() {
+ foreach(BufferId bufferId, allBufferIds()) {
+ backlogManager->requestBacklog(bufferId, backlogCount, -1);
+ }
+}
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-#ifndef _BUFFER_H_
-#define _BUFFER_H_
+#ifndef BACKLOGREQUESTER_H
+#define BACKLOGREQUESTER_H
-#include <QDateTime>
+#include <QList>
-class AbstractUiMsg;
-class IrcChannel;
-class NickModel;
+#include "client.h"
+#include "networkmodel.h"
+#include "types.h"
-struct BufferState;
+class BacklogManager;
-#include "message.h"
-#include "bufferinfo.h"
+class BacklogRequester {
+public:
+ BacklogRequester(BacklogManager *backlogManger);
+ virtual inline ~BacklogRequester() {}
-/**
- */
-class Buffer : public QObject {
- Q_OBJECT
+ virtual void requestBacklog() = 0;
-public:
- enum Activity {
- NoActivity = 0x00,
- OtherActivity = 0x01,
- NewMessage = 0x02,
- Highlight = 0x40
- };
- Q_DECLARE_FLAGS(ActivityLevel, Activity)
+protected:
+ inline QList<BufferId> allBufferIds() const { return Client::networkModel()->allBufferIds(); }
+ BacklogManager *backlogManager;
+};
- Buffer(BufferInfo, QObject *parent = 0);
- BufferInfo bufferInfo() const;
+class FixedBacklogRequester : public BacklogRequester {
+public:
+ FixedBacklogRequester(BacklogManager *backlogManager);
+
+ virtual void requestBacklog();
private:
- BufferInfo _bufferInfo;
+ static const int backlogCount;
};
-Q_DECLARE_OPERATORS_FOR_FLAGS(Buffer::ActivityLevel)
-#endif
+#endif //BACKLOGREQUESTER_H
#include "networkmodel.h"
#include "mappedselectionmodel.h"
-#include "buffer.h"
#include "global.h"
#include <QAbstractItemView>
_syncedToCore(false)
{
_signalProxy->synchronize(_ircListHelper);
-
- connect(_backlogManager, SIGNAL(backlog(BufferId, const QVariantList &)),
- this, SLOT(receiveBacklog(BufferId, const QVariantList &)));
}
Client::~Client() {
_currentCoreAccount = 0;
_networkModel = new NetworkModel(this);
- connect(this, SIGNAL(bufferUpdated(BufferInfo)),
- _networkModel, SLOT(bufferUpdated(BufferInfo)));
connect(this, SIGNAL(networkRemoved(NetworkId)),
_networkModel, SLOT(networkRemoved(NetworkId)));
p->attachSlot(SIGNAL(displayMsg(const Message &)), this, SLOT(recvMessage(const Message &)));
p->attachSlot(SIGNAL(displayStatusMsg(QString, QString)), this, SLOT(recvStatusMsg(QString, QString)));
- p->attachSlot(SIGNAL(bufferInfoUpdated(BufferInfo)), this, SLOT(updateBufferInfo(BufferInfo)));
+ p->attachSlot(SIGNAL(bufferInfoUpdated(BufferInfo)), _networkModel, SLOT(bufferUpdated(BufferInfo)));
p->attachSignal(this, SIGNAL(sendInput(BufferInfo, QString)));
p->attachSignal(this, SIGNAL(requestNetworkStates()));
_currentCoreAccount = id;
}
-QList<BufferInfo> Client::allBufferInfos() {
- QList<BufferInfo> bufferids;
- foreach(Buffer *buffer, buffers()) {
- bufferids << buffer->bufferInfo();
- }
- return bufferids;
-}
-
-QList<Buffer *> Client::buffers() {
- return instance()->_buffers.values();
-}
-
-
-Buffer *Client::statusBuffer(const NetworkId &networkId) const {
- if(_statusBuffers.contains(networkId))
- return _statusBuffers[networkId];
- else
- return 0;
-}
-
-Buffer *Client::buffer(BufferInfo bufferInfo) {
- Buffer *buff = 0;
- if(instance()->_buffers.contains(bufferInfo.bufferId()))
- buff = instance()->_buffers[bufferInfo.bufferId()];
-
- if(!buff) {
- Client *client = Client::instance();
- buff = new Buffer(bufferInfo, client);
- connect(buff, SIGNAL(destroyed()), client, SLOT(bufferDestroyed()));
- client->_buffers[bufferInfo.bufferId()] = buff;
- if(bufferInfo.type() == BufferInfo::StatusBuffer)
- client->_statusBuffers[bufferInfo.networkId()] = buff;
-
- emit client->bufferUpdated(bufferInfo);
-
- // I don't like this: but currently there isn't really a prettier way:
- if(isSynced()) { // this slows down syncing a lot, so disable it during sync
- QModelIndex bufferIdx = networkModel()->bufferIndex(bufferInfo.bufferId());
- bufferModel()->setCurrentIndex(bufferModel()->mapFromSource(bufferIdx));
- }
- }
- Q_ASSERT(buff);
- return buff;
-}
-
bool Client::isConnected() {
return instance()->_connectedToCore;
}
_messageModel->clear();
_networkModel->clear();
- QHash<BufferId, Buffer *>::iterator bufferIter = _buffers.begin();
- while(bufferIter != _buffers.end()) {
- Buffer *buffer = bufferIter.value();
- disconnect(buffer, SIGNAL(destroyed()), this, 0);
- bufferIter = _buffers.erase(bufferIter);
- buffer->deleteLater();
- }
- Q_ASSERT(_buffers.isEmpty());
-
- _statusBuffers.clear();
-
QHash<NetworkId, Network*>::iterator netIter = _networks.begin();
while(netIter != _networks.end()) {
Network *net = netIter.value();
/*** ***/
-void Client::updateBufferInfo(BufferInfo id) {
- emit bufferUpdated(id);
-}
-
-void Client::bufferDestroyed() {
- Buffer *buffer = static_cast<Buffer *>(sender());
- QHash<BufferId, Buffer *>::iterator iter = _buffers.begin();
- while(iter != _buffers.end()) {
- if(iter.value() == buffer) {
- iter = _buffers.erase(iter);
- break;
- }
- iter++;
- }
-
- QHash<NetworkId, Buffer *>::iterator statusIter = _statusBuffers.begin();
- while(statusIter != _statusBuffers.end()) {
- if(statusIter.value() == buffer) {
- statusIter = _statusBuffers.erase(statusIter);
- break;
- }
- statusIter++;
- }
-}
-
void Client::networkDestroyed() {
Network *net = static_cast<Network *>(sender());
QHash<NetworkId, Network *>::iterator netIter = _networks.begin();
messageProcessor()->process(msg);
}
-void Client::receiveBacklog(BufferId bufferId, const QVariantList &msgs) {
- if(msgs.isEmpty()) return;
- //QTime start = QTime::currentTime();
- QList<Message> msglist;
- foreach(QVariant v, msgs) {
- Message msg = v.value<Message>();
- msg.setFlags(msg.flags() | Message::Backlog);
- msglist << msg;
- }
- messageProcessor()->process(msglist);
- //qDebug() << "processed" << msgs.count() << "backlog lines in" << start.msecsTo(QTime::currentTime());
-}
-
void Client::setBufferLastSeenMsg(BufferId id, const MsgId &msgId) {
if(!bufferSyncer())
return;
}
void Client::bufferRemoved(BufferId bufferId) {
- // first remove the buffer from hash. this prohibits further lastSeenUpdates
- Buffer *buff = 0;
- if(_buffers.contains(bufferId)) {
- buff = _buffers.take(bufferId);
- disconnect(buff, 0, this, 0);
- }
-
- // then we select a sane buffer (status buffer)
+ // select a sane buffer (status buffer)
/* we have to manually select a buffer because otherwise inconsitent changes
* to the model might occur:
* the result of a buffer removal triggers a change in the selection model.
// and remove it from the model
networkModel()->removeBuffer(bufferId);
-
- if(buff)
- buff->deleteLater();
}
void Client::bufferRenamed(BufferId bufferId, const QString &newName) {
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-#ifndef _CLIENT_H_
-#define _CLIENT_H_
+#ifndef CLIENT_H_
+#define CLIENT_H_
#include <QAbstractSocket>
#include <QTcpSocket>
#include <QList>
#include <QPointer>
-#include "buffer.h" // needed for activity lvl
+#include "bufferinfo.h"
+#include "types.h"
-class BufferInfo;
class Message;
class MessageModel;
class AbstractMessageProcessor;
static void destroy();
static void init(AbstractUi *);
- static QList<BufferInfo> allBufferInfos();
- static QList<Buffer *> buffers();
- // static Buffer *buffer(BufferId bufferUid);
- static Buffer *buffer(BufferInfo);
-
static QList<NetworkId> networkIds();
static const Network * network(NetworkId);
signals:
void sendInput(BufferInfo, QString message);
- void showBuffer(Buffer *);
- void bufferUpdated(BufferInfo bufferInfo);
- void backlogReceived(Buffer *, QList<Message>);
- void requestBacklog(BufferInfo, QVariant, QVariant);
void requestNetworkStates();
void showConfigWizard(const QVariantMap &coredata);
void recvMessage(const Message &message);
void recvStatusMsg(QString network, QString message);
- void receiveBacklog(BufferId bufferId, const QVariantList &msgs);
- void updateBufferInfo(BufferInfo);
- void bufferDestroyed();
void networkDestroyed();
void coreIdentityCreated(const Identity &);
void coreIdentityRemoved(IdentityId);
static void setCurrentCoreAccount(AccountId);
static inline BufferSyncer *bufferSyncer() { return instance()->_bufferSyncer; }
- Buffer *statusBuffer(const NetworkId &networkid) const;
-
static QPointer<Client> instanceptr;
QPointer<QIODevice> socket;
bool _connectedToCore, _syncedToCore;
- QHash<BufferId, Buffer *> _buffers;
- QHash<NetworkId, Buffer *> _statusBuffers; // fast lookup
QHash<NetworkId, Network *> _networks;
QHash<IdentityId, Identity *> _identities;
***************************************************************************/
#include "clientbacklogmanager.h"
+
+#include "abstractmessageprocessor.h"
+#include "backlogrequester.h"
#include "client.h"
#include <QDebug>
}
void ClientBacklogManager::receiveBacklog(BufferId bufferId, int lastMsgs, int offset, QVariantList msgs) {
+ Q_UNUSED(bufferId)
Q_UNUSED(lastMsgs)
Q_UNUSED(offset)
- emit backlog(bufferId, msgs);
+
+ if(msgs.isEmpty())
+ return;
+
+ //QTime start = QTime::currentTime();
+ QList<Message> msglist;
+ foreach(QVariant v, msgs) {
+ Message msg = v.value<Message>();
+ msg.setFlags(msg.flags() | Message::Backlog);
+ msglist << msg;
+ }
+ Client::messageProcessor()->process(msglist);
+ //qDebug() << "processed" << msgs.count() << "backlog lines in" << start.msecsTo(QTime::currentTime());
+}
+
+void ClientBacklogManager::requestInitialBacklog() {
+ FixedBacklogRequester backlogRequester(this);
+ backlogRequester.requestBacklog();
}
public slots:
virtual void receiveBacklog(BufferId bufferId, int lastMsgs, int offset, QVariantList msgs);
-
-signals:
- void backlog(BufferId bufferId, const QVariantList &msgs);
+ void requestInitialBacklog();
};
#endif // CLIENTBACKLOGMANAGER_H
#include "ircuser.h"
#include "ircchannel.h"
#include "network.h"
+#include "networkmodel.h"
#include "signalproxy.h"
// create buffers
// FIXME: get rid of this crap
QVariantList bufferinfos = sessionState["BufferInfos"].toList();
+ NetworkModel *networkModel = Client::networkModel();
+ Q_ASSERT(networkModel);
foreach(QVariant vinfo, bufferinfos)
- Client::buffer(vinfo.value<BufferInfo>()); // create Buffers and BufferItems
+ networkModel->bufferUpdated(vinfo.value<BufferInfo>()); // create BufferItems
QVariantList networkids = sessionState["NetworkIds"].toList();
#include <QAbstractItemView>
-#include "bufferinfo.h"
#include "buffermodel.h"
#include "client.h"
#include "signalproxy.h"
BufferItem::BufferItem(const BufferInfo &bufferInfo, AbstractTreeItem *parent)
: PropertyMapItem(QStringList() << "bufferName" << "topic" << "nickCount", parent),
_bufferInfo(bufferInfo),
- _activity(Buffer::NoActivity)
+ _activity(BufferInfo::NoActivity)
{
setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
}
-void BufferItem::setActivityLevel(Buffer::ActivityLevel level) {
+void BufferItem::setActivityLevel(BufferInfo::ActivityLevel level) {
if(_activity != level) {
_activity = level;
emit dataChanged();
}
}
-//void BufferItem::updateActivityLevel(Buffer::ActivityLevel level) {
+//void BufferItem::updateActivityLevel(BufferInfo::ActivityLevel level) {
void BufferItem::updateActivityLevel(const Message &msg) {
if(isCurrentBuffer())
return;
if(lastSeenMsgId() >= msg.msgId())
return;
- Buffer::ActivityLevel oldLevel = activityLevel();
+ BufferInfo::ActivityLevel oldLevel = activityLevel();
- _activity |= Buffer::OtherActivity;
+ _activity |= BufferInfo::OtherActivity;
if(msg.type() & (Message::Plain | Message::Notice | Message::Action))
- _activity |= Buffer::NewMessage;
+ _activity |= BufferInfo::NewMessage;
if(msg.flags() & Message::Highlight)
- _activity |= Buffer::Highlight;
+ _activity |= BufferInfo::Highlight;
if(oldLevel != _activity)
emit dataChanged();
qDebug() << "BufferItem::setData(int column, const QVariant &value, int role):" << this << column << value << role;
switch(role) {
case NetworkModel::BufferActivityRole:
- setActivityLevel((Buffer::ActivityLevel)value.toInt());
+ setActivityLevel((BufferInfo::ActivityLevel)value.toInt());
return true;
default:
return PropertyMapItem::setData(column, value, role);
bufferItem(msg.bufferInfo())->updateActivityLevel(msg);
}
-void NetworkModel::setBufferActivity(const BufferId &bufferId, Buffer::ActivityLevel level) {
+void NetworkModel::setBufferActivity(const BufferId &bufferId, BufferInfo::ActivityLevel level) {
BufferItem *bufferItem = findBufferItem(bufferId);
if(!bufferItem) {
qDebug() << "NetworkModel::setBufferActivity(): buffer is unknown:" << bufferId;
#include <QtCore>
#include "treemodel.h"
-#include "buffer.h"
+#include "bufferinfo.h"
#include <QPointer>
#include "clientsettings.h"
#include "ircchannel.h"
#include "ircuser.h"
+#include "message.h"
#include "network.h"
class MappedSelectionModel;
inline const MsgId &lastSeenMsgId() const { return _lastSeenMsgId; }
inline void setLastSeenMsgId(const MsgId &msgId) { _lastSeenMsgId = msgId; }
- inline Buffer::ActivityLevel activityLevel() const { return _activity; }
- void setActivityLevel(Buffer::ActivityLevel level);
- //void updateActivityLevel(Buffer::ActivityLevel level);
+ inline BufferInfo::ActivityLevel activityLevel() const { return _activity; }
+ void setActivityLevel(BufferInfo::ActivityLevel level);
+ //void updateActivityLevel(BufferInfo::ActivityLevel level);
void updateActivityLevel(const Message &msg);
bool isCurrentBuffer() const;
private:
BufferInfo _bufferInfo;
- Buffer::ActivityLevel _activity;
+ BufferInfo::ActivityLevel _activity;
MsgId _lastSeenMsgId;
};
const Network *networkByIndex(const QModelIndex &index) const;
- Buffer::ActivityLevel bufferActivity(const BufferInfo &buffer) const;
+ BufferInfo::ActivityLevel bufferActivity(const BufferInfo &buffer) const;
QString bufferName(BufferId bufferId);
BufferInfo::Type bufferType(BufferId bufferId);
NetworkId networkId(BufferId bufferId);
QString networkName(BufferId bufferId);
+ inline QList<BufferId> allBufferIds() const { return _bufferItemCache.keys(); }
+
public slots:
void bufferUpdated(BufferInfo bufferInfo);
void removeBuffer(BufferId bufferId);
void setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId);
- void setBufferActivity(const BufferId &bufferId, Buffer::ActivityLevel activity);
+ void setBufferActivity(const BufferId &bufferId, BufferInfo::ActivityLevel activity);
void updateBufferActivity(const Message &msg);
void networkRemoved(const NetworkId &networkId);
GroupBuffer = 0x08
};
+ enum Activity {
+ NoActivity = 0x00,
+ OtherActivity = 0x01,
+ NewMessage = 0x02,
+ Highlight = 0x40
+ };
+ Q_DECLARE_FLAGS(ActivityLevel, Activity)
+
BufferInfo();
BufferInfo(BufferId id, NetworkId networkid, Type type, uint gid = 0, QString buf = QString());
QDebug operator<<(QDebug dbg, const BufferInfo &b);
Q_DECLARE_METATYPE(BufferInfo);
+Q_DECLARE_OPERATORS_FOR_FLAGS(BufferInfo::ActivityLevel)
uint qHash(const BufferInfo &);
#include "chatmonitorfilter.h"
-#include "buffer.h"
#include "client.h"
#include "chatlinemodel.h"
#include "networkmodel.h"
#include <QGraphicsTextItem>
#include <QScrollBar>
-#include "buffer.h"
#include "chatlinemodelitem.h"
#include "chatscene.h"
#include "chatview.h"
else
resize(QSize(800, 500));
- Client::signalProxy()->attachSignal(this, SIGNAL(requestBacklog(BufferInfo, QVariant, QVariant)));
-
connect(QApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(saveLayout()));
connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(clientNetworkCreated(NetworkId)));
connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigDeleted(int)), this, SLOT(removeBufferView(int)));
connect(Client::bufferViewManager(), SIGNAL(initDone()), this, SLOT(loadLayout()));
- foreach(BufferInfo id, Client::allBufferInfos()) {
- Client::backlogManager()->requestBacklog(id.bufferId(), 500, -1);
- }
+ Client::backlogManager()->requestInitialBacklog();
setConnectedState();
}
signals:
void connectToCore(const QVariantMap &connInfo);
void disconnectFromCore();
- void requestBacklog(BufferInfo, QVariant, QVariant);
private:
Ui::MainWin ui;
#include "nicklistwidget.h"
-#include "buffer.h"
#include "nickview.h"
#include "client.h"
#include "networkmodel.h"
QList<BufferId> bufferIds;
if(config->addNewBuffersAutomatically()) {
- foreach(BufferInfo bufferInfo, Client::allBufferInfos()) {
- bufferIds << bufferInfo.bufferId();
- }
+ bufferIds = Client::networkModel()->allBufferIds();
if(config->sortAlphabetically())
qSort(bufferIds.begin(), bufferIds.end(), bufferIdLessThan);
}
if(_newBufferViews.contains(config)) {
QList<BufferId> bufferIds;
if(config->addNewBuffersAutomatically()) {
- foreach(BufferInfo bufferInfo, Client::allBufferInfos()) {
- bufferIds << bufferInfo.bufferId();
- }
+ bufferIds = Client::networkModel()->allBufferIds();
if(config->sortAlphabetically())
qSort(bufferIds.begin(), bufferIds.end(), bufferIdLessThan);
}
_currentBuffer = bufferId;
showChatView(bufferId);
- Client::networkModel()->setBufferActivity(bufferId, Buffer::NoActivity);
+ Client::networkModel()->setBufferActivity(bufferId, BufferInfo::NoActivity);
// Client::setBufferLastSeenMsg(bufferId, _chatViews[bufferId]->lastMsgId());
setFocus();
}
#include <QPalette>
#include <QBrush>
+#include "bufferinfo.h"
#include "buffermodel.h"
#include "client.h"
#include "networkmodel.h"
// add the buffer if...
if(config()->isInitialized() && !config()->removedBuffers().contains(bufferId) // it hasn't been manually removed and either
&& ((config()->addNewBuffersAutomatically() && !config()->temporarilyRemovedBuffers().contains(bufferId)) // is totally unknown to us (a new buffer)...
- || (config()->temporarilyRemovedBuffers().contains(bufferId) && activityLevel > Buffer::OtherActivity))) { // or was just temporarily hidden and has a new message waiting for us.
+ || (config()->temporarilyRemovedBuffers().contains(bufferId) && activityLevel > BufferInfo::OtherActivity))) { // or was just temporarily hidden and has a new message waiting for us.
addBuffer(bufferId);
}
// note: adding the buffer to the valid list does not temper with the following filters ("show only channels" and stuff)
if(!index.data(NetworkModel::ItemActiveRole).toBool())
return _FgColorInactiveActivity;
- Buffer::ActivityLevel activity = (Buffer::ActivityLevel)index.data(NetworkModel::BufferActivityRole).toInt();
+ BufferInfo::ActivityLevel activity = (BufferInfo::ActivityLevel)index.data(NetworkModel::BufferActivityRole).toInt();
- if(activity & Buffer::Highlight)
+ if(activity & BufferInfo::Highlight)
return _FgColorHighlightActivity;
- if(activity & Buffer::NewMessage)
+ if(activity & BufferInfo::NewMessage)
return _FgColorNewMessageActivity;
- if(activity & Buffer::OtherActivity)
+ if(activity & BufferInfo::OtherActivity)
return _FgColorOtherActivity;
return _FgColorNoActivity;