X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagemodel.cpp;h=183274e3b7989bc1d66a917df635733018e25ca9;hp=5269d0ad3b30b9910a5ca0850eeb4f673d785236;hb=17fa448705597f9cd7f24a03a630f0cad69d29ee;hpb=46ddb293c61aeb90295fa1a14be71e8896f34ade diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 5269d0ad..183274e3 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -32,6 +32,14 @@ public: 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.setTimeSpec(Qt::LocalTime); + _dayChangeTimer.setInterval(QDateTime::currentDateTime().secsTo(_nextDayChange) * 1000); + _dayChangeTimer.start(); + connect(&_dayChangeTimer, SIGNAL(timeout()), this, SLOT(changeOfDay())); } QVariant MessageModel::data(const QModelIndex &index, int role) const { @@ -79,22 +87,18 @@ void MessageModel::insertMessages(const QList &msglist) { if(msglist.isEmpty()) return; -// if(_messageList.isEmpty()) { -// insertMessageGroup(msglist); -// } else { - int processedMsgs = insertMessagesGracefully(msglist); - int remainingMsgs = msglist.count() - processedMsgs; - if(remainingMsgs > 0) { - if(msglist.first().msgId() < msglist.last().msgId()) { - // in Order - _messageBuffer << msglist.mid(0, remainingMsgs); - } else { - _messageBuffer << msglist.mid(processedMsgs); - } - qSort(_messageBuffer); - QCoreApplication::postEvent(this, new ProcessBufferEvent()); + int processedMsgs = insertMessagesGracefully(msglist); + int remainingMsgs = msglist.count() - processedMsgs; + if(remainingMsgs > 0) { + if(msglist.first().msgId() < msglist.last().msgId()) { + // in Order + _messageBuffer << msglist.mid(0, remainingMsgs); + } else { + _messageBuffer << msglist.mid(processedMsgs); } -// } + qSort(_messageBuffer); + QCoreApplication::postEvent(this, new ProcessBufferEvent()); + } } void MessageModel::insertMessageGroup(const QList &msglist) { @@ -110,11 +114,35 @@ void MessageModel::insertMessageGroup(const QList &msglist) { idx--; } } - beginInsertRows(QModelIndex(), idx, idx+msglist.count()-1); + int start = idx; + int end = idx + msglist.count() - 1; + + Message dayChangeMsg; + bool needsDayChangeMsg = false; + if(idx < _messageList.count() && _messageList[idx]->msgType() != Message::DayChange) { + QDateTime nextTs = _messageList[idx]->timeStamp(); + 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; + if(nextDay != prevDay) { + nextTs.setTime_t(nextDay * 86400); + nextTs.setTimeSpec(Qt::LocalTime); + dayChangeMsg = Message::ChangeOfDay(nextTs); + dayChangeMsg.setMsgId(msglist.last().msgId()); + needsDayChangeMsg = true; + end++; + } + } + beginInsertRows(QModelIndex(), start, end); foreach(Message msg, msglist) { _messageList.insert(idx, createMessageModelItem(msg)); idx++; } + if(needsDayChangeMsg) { + _messageList.insert(idx, createMessageModelItem(dayChangeMsg)); + } endInsertRows(); } @@ -190,7 +218,20 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { if((*iter).msgId() != dupeId) { if(!grouplist.isEmpty()) { - qWarning() << "copy day change check"; + QDateTime nextTs = grouplist.value(0).timestamp(); + QDateTime prevTs = (*iter).timestamp(); + nextTs.setTimeSpec(Qt::UTC); + prevTs.setTimeSpec(Qt::UTC); + uint nextDay = nextTs.toTime_t() / 86400; + uint prevDay = prevTs.toTime_t() / 86400; + if(nextDay != prevDay) { + nextTs.setTime_t(nextDay * 86400); + nextTs.setTimeSpec(Qt::LocalTime); + Message dayChangeMsg = Message::ChangeOfDay(nextTs); + dayChangeMsg.setMsgId((*iter).msgId()); + grouplist.prepend(dayChangeMsg); + dupeCount--; + } } grouplist.prepend(*iter); } else { @@ -252,6 +293,23 @@ int MessageModel::indexForId(MsgId id) { } } +void MessageModel::changeOfDay() { + _dayChangeTimer.setInterval(86400000); + qDebug() << _nextDayChange; + if(!_messageList.isEmpty()) { + int idx = _messageList.count(); + while(idx > 0 && _messageList[idx - 1]->timeStamp() > _nextDayChange) { + idx--; + } + beginInsertRows(QModelIndex(), idx, idx); + Message dayChangeMsg = Message::ChangeOfDay(_nextDayChange); + dayChangeMsg.setMsgId(_messageList[idx - 1]->msgId()); + _messageList.insert(idx, createMessageModelItem(dayChangeMsg)); + endInsertRows(); + } + _nextDayChange = _nextDayChange.addSecs(86400); +} + /**********************************************************************************/ MessageModelItem::MessageModelItem(const Message &msg) :