X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagemodel.cpp;h=fcd7acbc692beefc73a612b99c6bba92e96cbf01;hp=b09a456dc684788c56a147c92e483275a409b20c;hb=a8ab790b2218d6131f12b622b1373ba62958f3ef;hpb=4a5065255e652dd0c301bac0db41b7afb777ef49 diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index b09a456d..fcd7acbc 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 by the Quassel Project * + * Copyright (C) 2005-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -23,35 +23,36 @@ #include #include "backlogsettings.h" -#include "clientbacklogmanager.h" #include "client.h" +#include "clientbacklogmanager.h" #include "message.h" #include "networkmodel.h" class ProcessBufferEvent : public QEvent { public: - inline ProcessBufferEvent() : QEvent(QEvent::User) {} + inline ProcessBufferEvent() + : QEvent(QEvent::User) + {} }; - -MessageModel::MessageModel(QObject *parent) +MessageModel::MessageModel(QObject* parent) : QAbstractItemModel(parent) { QDateTime now = QDateTime::currentDateTime(); now.setTimeSpec(Qt::UTC); _nextDayChange.setTimeSpec(Qt::UTC); - _nextDayChange.setTime_t(((now.toTime_t() / 86400) + 1) * 86400); + _nextDayChange.setMSecsSinceEpoch(((now.toMSecsSinceEpoch() / DAY_IN_MSECS) + 1) * DAY_IN_MSECS); _nextDayChange.setTimeSpec(Qt::LocalTime); _dayChangeTimer.setInterval(QDateTime::currentDateTime().secsTo(_nextDayChange) * 1000); _dayChangeTimer.start(); - connect(&_dayChangeTimer, SIGNAL(timeout()), this, SLOT(changeOfDay())); + connect(&_dayChangeTimer, &QTimer::timeout, this, &MessageModel::changeOfDay); } - -QVariant MessageModel::data(const QModelIndex &index, int role) const +QVariant MessageModel::data(const QModelIndex& index, int role) const { - int row = index.row(); int column = index.column(); + int row = index.row(); + int column = index.column(); if (row < 0 || row >= messageCount() || column < 0) return QVariant(); @@ -62,8 +63,7 @@ QVariant MessageModel::data(const QModelIndex &index, int role) const // return _messageList[row]->data(index.column(), role); } - -bool MessageModel::setData(const QModelIndex &index, const QVariant &value, int role) +bool MessageModel::setData(const QModelIndex& index, const QVariant& value, int role) { int row = index.row(); if (row < 0 || row >= messageCount()) @@ -76,12 +76,11 @@ bool MessageModel::setData(const QModelIndex &index, const QVariant &value, int return false; } - -bool MessageModel::insertMessage(const Message &msg, bool fakeMsg) +bool MessageModel::insertMessage(const Message& msg, bool fakeMsg) { MsgId id = msg.msgId(); int idx = indexForId(id); - if (!fakeMsg && idx < messageCount()) { // check for duplicate + if (!fakeMsg && idx < messageCount()) { // check for duplicate if (messageItemAt(idx)->msgId() == id) return false; } @@ -90,8 +89,7 @@ bool MessageModel::insertMessage(const Message &msg, bool fakeMsg) return true; } - -void MessageModel::insertMessages(const QList &msglist) +void MessageModel::insertMessages(const QList& msglist) { if (msglist.isEmpty()) return; @@ -107,22 +105,21 @@ void MessageModel::insertMessages(const QList &msglist) else { _messageBuffer = msglist.mid(processedMsgs); } - qSort(_messageBuffer); + std::sort(_messageBuffer.begin(), _messageBuffer.end()); QCoreApplication::postEvent(this, new ProcessBufferEvent()); } } else { _messageBuffer << msglist; - qSort(_messageBuffer); + std::sort(_messageBuffer.begin(), _messageBuffer.end()); } } - -void MessageModel::insertMessageGroup(const QList &msglist) +void MessageModel::insertMessageGroup(const QList& msglist) { - Q_ASSERT(!msglist.isEmpty()); // the msglist can be assumed to be non empty -// int last = msglist.count() - 1; -// Q_ASSERT(0 == last || msglist.at(0).msgId() != msglist.at(last).msgId() || msglist.at(last).type() == Message::DayChange); + Q_ASSERT(!msglist.isEmpty()); // the msglist can be assumed to be non empty + // int last = msglist.count() - 1; + // Q_ASSERT(0 == last || msglist.at(0).msgId() != msglist.at(last).msgId() || msglist.at(last).type() == Message::DayChange); int start = indexForId(msglist.first().msgId()); int end = start + msglist.count() - 1; Message dayChangeMsg; @@ -131,8 +128,7 @@ void MessageModel::insertMessageGroup(const QList &msglist) // check if the preceeding msg is a daychange message and if so if // we have to drop or relocate it at the end of this chunk int prevIdx = start - 1; - if (messageItemAt(prevIdx)->msgType() == Message::DayChange - && messageItemAt(prevIdx)->timestamp() > msglist.at(0).timestamp()) { + if (messageItemAt(prevIdx)->msgType() == Message::DayChange && messageItemAt(prevIdx)->timestamp() > msglist.at(0).timestamp()) { beginRemoveRows(QModelIndex(), prevIdx, prevIdx); Message oldDayChangeMsg = takeMessageAt(prevIdx); if (msglist.last().timestamp() < oldDayChangeMsg.timestamp()) { @@ -158,10 +154,10 @@ void MessageModel::insertMessageGroup(const QList &msglist) QDateTime prevTs = msglist.last().timestamp(); nextTs.setTimeSpec(Qt::UTC); prevTs.setTimeSpec(Qt::UTC); - uint nextDay = nextTs.toTime_t() / 86400; - uint prevDay = prevTs.toTime_t() / 86400; + qint64 nextDay = nextTs.toMSecsSinceEpoch() / DAY_IN_MSECS; + qint64 prevDay = prevTs.toMSecsSinceEpoch() / DAY_IN_MSECS; if (nextDay != prevDay) { - nextTs.setTime_t(nextDay * 86400); + nextTs.setMSecsSinceEpoch(nextDay * DAY_IN_MSECS); nextTs.setTimeSpec(Qt::LocalTime); dayChangeMsg = Message::ChangeOfDay(nextTs); dayChangeMsg.setMsgId(msglist.last().msgId()); @@ -179,13 +175,13 @@ void MessageModel::insertMessageGroup(const QList &msglist) insertMessage__(start + msglist.count(), dayChangeMsg); endInsertRows(); - Q_ASSERT(start == end || messageItemAt(start)->msgId() != messageItemAt(end)->msgId() || messageItemAt(end)->msgType() == Message::DayChange); + Q_ASSERT(start == end || messageItemAt(start)->msgId() != messageItemAt(end)->msgId() + || messageItemAt(end)->msgType() == Message::DayChange); Q_ASSERT(start == 0 || messageItemAt(start - 1)->msgId() < messageItemAt(start)->msgId()); Q_ASSERT(end + 1 == messageCount() || messageItemAt(end)->msgId() < messageItemAt(end + 1)->msgId()); } - -int MessageModel::insertMessagesGracefully(const QList &msglist) +int MessageModel::insertMessagesGracefully(const QList& msglist) { /* short description: * 1) first we check where the message with the highest msgId from msglist would be inserted @@ -200,13 +196,13 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) QList grouplist; MsgId minId; MsgId dupeId; - int processedMsgs = 1; // we know the list isn't empty, so we at least process one message + int processedMsgs = 1; // we know the list isn't empty, so we at least process one message int idx; bool fastForward = false; QList::const_iterator iter; if (inOrder) { iter = msglist.constEnd(); - iter--; // this op is safe as we've allready passed an empty check + --iter; // this op is safe as we've allready passed an empty check } else { iter = msglist.constBegin(); @@ -229,17 +225,17 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) } if (!inOrder) - iter++; + ++iter; if (inOrder) { while (iter != msglist.constBegin()) { - iter--; + --iter; if (!fastForward && (*iter).msgId() <= minId) break; processedMsgs++; - if (grouplist.isEmpty()) { // as long as we don't have a starting point, we have to update the dupeId + if (grouplist.isEmpty()) { // as long as we don't have a starting point, we have to update the dupeId idx = indexForId((*iter).msgId()); if (idx >= 0 && !messagesIsEmpty()) dupeId = messageItemAt(idx)->msgId(); @@ -250,10 +246,10 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) QDateTime prevTs = (*iter).timestamp(); nextTs.setTimeSpec(Qt::UTC); prevTs.setTimeSpec(Qt::UTC); - uint nextDay = nextTs.toTime_t() / 86400; - uint prevDay = prevTs.toTime_t() / 86400; + qint64 nextDay = nextTs.toMSecsSinceEpoch() / DAY_IN_MSECS; + qint64 prevDay = prevTs.toMSecsSinceEpoch() / DAY_IN_MSECS; if (nextDay != prevDay) { - nextTs.setTime_t(nextDay * 86400); + nextTs.setMSecsSinceEpoch(nextDay * DAY_IN_MSECS); nextTs.setTimeSpec(Qt::LocalTime); Message dayChangeMsg = Message::ChangeOfDay(nextTs); dayChangeMsg.setMsgId((*iter).msgId()); @@ -271,7 +267,7 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) break; processedMsgs++; - if (grouplist.isEmpty()) { // as long as we don't have a starting point, we have to update the dupeId + if (grouplist.isEmpty()) { // as long as we don't have a starting point, we have to update the dupeId idx = indexForId((*iter).msgId()); if (idx >= 0 && !messagesIsEmpty()) dupeId = messageItemAt(idx)->msgId(); @@ -282,10 +278,10 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) QDateTime prevTs = (*iter).timestamp(); nextTs.setTimeSpec(Qt::UTC); prevTs.setTimeSpec(Qt::UTC); - uint nextDay = nextTs.toTime_t() / 86400; - uint prevDay = prevTs.toTime_t() / 86400; + qint64 nextDay = nextTs.toMSecsSinceEpoch() / DAY_IN_MSECS; + qint64 prevDay = prevTs.toMSecsSinceEpoch() / DAY_IN_MSECS; if (nextDay != prevDay) { - nextTs.setTime_t(nextDay * 86400); + nextTs.setMSecsSinceEpoch(nextDay * DAY_IN_MSECS); nextTs.setTimeSpec(Qt::LocalTime); Message dayChangeMsg = Message::ChangeOfDay(nextTs); dayChangeMsg.setMsgId((*iter).msgId()); @@ -295,7 +291,7 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) dupeId = (*iter).msgId(); grouplist.prepend(*iter); } - iter++; + ++iter; } } @@ -304,8 +300,7 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) return processedMsgs; } - -void MessageModel::customEvent(QEvent *event) +void MessageModel::customEvent(QEvent* event) { if (event->type() != QEvent::User) return; @@ -325,7 +320,6 @@ void MessageModel::customEvent(QEvent *event) QCoreApplication::postEvent(this, new ProcessBufferEvent()); } - void MessageModel::clear() { _messagesWaiting.clear(); @@ -336,7 +330,6 @@ void MessageModel::clear() } } - // returns index of msg with given Id or of the next message after that (i.e., the index where we'd insert this msg) int MessageModel::indexForId(MsgId id) { @@ -347,20 +340,22 @@ int MessageModel::indexForId(MsgId id) return messageCount(); // binary search - int start = 0; int end = messageCount() - 1; - while (1) { + int start = 0; + int end = messageCount() - 1; + while (true) { if (end - start == 1) return end; int pivot = (end + start) / 2; - if (id <= messageItemAt(pivot)->msgId()) end = pivot; - else start = pivot; + if (id <= messageItemAt(pivot)->msgId()) + end = pivot; + else + start = pivot; } } - void MessageModel::changeOfDay() { - _dayChangeTimer.setInterval(86400000); + _dayChangeTimer.setInterval(DAY_IN_MSECS); if (!messagesIsEmpty()) { int idx = messageCount(); while (idx > 0 && messageItemAt(idx - 1)->timestamp() > _nextDayChange) { @@ -372,24 +367,22 @@ void MessageModel::changeOfDay() insertMessage__(idx, dayChangeMsg); endInsertRows(); } - _nextDayChange = _nextDayChange.addSecs(86400); + _nextDayChange = _nextDayChange.addMSecs(DAY_IN_MSECS); } - -void MessageModel::insertErrorMessage(BufferInfo bufferInfo, const QString &errorString) +void MessageModel::insertErrorMessage(BufferInfo bufferInfo, const QString& errorString) { int idx = messageCount(); beginInsertRows(QModelIndex(), idx, idx); Message msg(bufferInfo, Message::Error, errorString); if (!messagesIsEmpty()) - msg.setMsgId(messageItemAt(idx-1)->msgId()); + msg.setMsgId(messageItemAt(idx - 1)->msgId()); else msg.setMsgId(0); insertMessage__(idx, msg); endInsertRows(); } - void MessageModel::requestBacklog(BufferId bufferId) { if (_messagesWaiting.contains(bufferId)) @@ -402,16 +395,15 @@ void MessageModel::requestBacklog(BufferId bufferId) if (messageItemAt(i)->bufferId() == bufferId) { _messagesWaiting[bufferId] = requestCount; Client::backlogManager()->emitMessagesRequested(tr("Requesting %1 messages from backlog for buffer %2:%3") - .arg(requestCount) - .arg(Client::networkModel()->networkName(bufferId)) - .arg(Client::networkModel()->bufferName(bufferId))); + .arg(requestCount) + .arg(Client::networkModel()->networkName(bufferId)) + .arg(Client::networkModel()->bufferName(bufferId))); Client::backlogManager()->requestBacklog(bufferId, -1, messageItemAt(i)->msgId(), requestCount); return; } } } - void MessageModel::messagesReceived(BufferId bufferId, int count) { if (!_messagesWaiting.contains(bufferId)) @@ -424,7 +416,6 @@ void MessageModel::messagesReceived(BufferId bufferId, int count) } } - void MessageModel::buffersPermanentlyMerged(BufferId bufferId1, BufferId bufferId2) { for (int i = 0; i < messageCount(); i++) { @@ -436,7 +427,6 @@ void MessageModel::buffersPermanentlyMerged(BufferId bufferId1, BufferId bufferI } } - // ======================================== // MessageModelItem // ======================================== @@ -465,8 +455,7 @@ QVariant MessageModelItem::data(int column, int role) const } } - -bool MessageModelItem::setData(int column, const QVariant &value, int role) +bool MessageModelItem::setData(int column, const QVariant& value, int role) { Q_UNUSED(column); @@ -479,38 +468,32 @@ bool MessageModelItem::setData(int column, const QVariant &value, int role) } } - // Stuff for later -bool MessageModelItem::lessThan(const MessageModelItem *m1, const MessageModelItem *m2) +bool MessageModelItem::lessThan(const MessageModelItem* m1, const MessageModelItem* m2) { return (*m1) < (*m2); } - -bool MessageModelItem::operator<(const MessageModelItem &other) const +bool MessageModelItem::operator<(const MessageModelItem& other) const { return msgId() < other.msgId(); } - -bool MessageModelItem::operator==(const MessageModelItem &other) const +bool MessageModelItem::operator==(const MessageModelItem& other) const { return msgId() == other.msgId(); } - -bool MessageModelItem::operator>(const MessageModelItem &other) const +bool MessageModelItem::operator>(const MessageModelItem& other) const { return msgId() > other.msgId(); } - -QDebug operator<<(QDebug dbg, const MessageModelItem &msgItem) +QDebug operator<<(QDebug dbg, const MessageModelItem& msgItem) { - dbg.nospace() << qPrintable(QString("MessageModelItem(MsgId:")) << msgItem.msgId() - << qPrintable(QString(",")) << msgItem.timestamp() - << qPrintable(QString(", Type:")) << msgItem.msgType() - << qPrintable(QString(", Flags:")) << msgItem.msgFlags() << qPrintable(QString(")")) - << msgItem.data(1, Qt::DisplayRole).toString() << ":" << msgItem.data(2, Qt::DisplayRole).toString(); + dbg.nospace() << qPrintable(QString("MessageModelItem(MsgId:")) << msgItem.msgId() << qPrintable(QString(",")) << msgItem.timestamp() + << qPrintable(QString(", Type:")) << msgItem.msgType() << qPrintable(QString(", Flags:")) << msgItem.msgFlags() + << qPrintable(QString(")")) << msgItem.data(1, Qt::DisplayRole).toString() << ":" + << msgItem.data(2, Qt::DisplayRole).toString(); return dbg; }