From: Marcus Eggenberger Date: Tue, 4 Nov 2008 23:41:21 +0000 (+0100) Subject: fixing dupe messages X-Git-Tag: 0.3.1~70 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=0480c16e33acc3cc6b1f1b507aa8696a70627bf8 fixing dupe messages --- diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 82fd71b1..13e69007 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -86,22 +86,29 @@ void MessageModel::insertMessages(const QList &msglist) { if(msglist.isEmpty()) return; - int processedMsgs = insertMessagesGracefully(msglist); - int remainingMsgs = msglist.count() - processedMsgs; - if(remainingMsgs > 0) { - if(msglist.first().msgId() < msglist.last().msgId()) { - // in Order - we have just successfully processed "processedMsg" messages from the end of the list - _messageBuffer << msglist.mid(0, remainingMsgs); - } else { - _messageBuffer << msglist.mid(processedMsgs); + if(_messageBuffer.isEmpty()) { + int processedMsgs = insertMessagesGracefully(msglist); + int remainingMsgs = msglist.count() - processedMsgs; + if(remainingMsgs > 0) { + if(msglist.first().msgId() < msglist.last().msgId()) { + // in Order - we have just successfully processed "processedMsg" messages from the end of the list + _messageBuffer = msglist.mid(0, remainingMsgs); + } else { + _messageBuffer = msglist.mid(processedMsgs); + } + qSort(_messageBuffer); + QCoreApplication::postEvent(this, new ProcessBufferEvent()); } + } else { + _messageBuffer << msglist; qSort(_messageBuffer); - QCoreApplication::postEvent(this, new ProcessBufferEvent()); } } 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); int start = indexForId(msglist.first().msgId()); int end = start + msglist.count() - 1; MessageModelItem *dayChangeItem = 0; @@ -165,6 +172,8 @@ void MessageModel::insertMessageGroup(const QList &msglist) { pos++; // needed for the following assert } endInsertRows(); + +// Q_ASSERT(start == end || _messageList.at(start)->msgId() != _messageList.at(end)->msgId() || _messageList.at(end)->msgType() == Message::DayChange); Q_ASSERT(start == 0 || _messageList[start - 1]->msgId() < _messageList[start]->msgId()); Q_ASSERT(end + 1 == _messageList.count() || _messageList[end]->msgId() < _messageList[end + 1]->msgId()); Q_ASSERT(pos - 1 == end); @@ -182,7 +191,7 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { // depending on the order we have to traverse from the front to the back or vice versa QList grouplist; - MsgId id; + MsgId minId; MsgId dupeId; int processedMsgs = 1; // we know the list isn't empty, so we at least process one message int idx; @@ -196,18 +205,20 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { } idx = indexForId((*iter).msgId()); - if(idx >= 0 && !_messageList.isEmpty()) + if(idx < _messageList.count()) dupeId = _messageList[idx]->msgId(); // we always compare to the previous entry... // if there isn't, we can fastforward to the top if(idx - 1 >= 0) - id = _messageList[idx - 1]->msgId(); + minId = _messageList[idx - 1]->msgId(); else fastForward = true; - if((*iter).msgId() != dupeId) + if((*iter).msgId() != dupeId) { grouplist << *iter; + dupeId = (*iter).msgId(); + } if(!inOrder) iter++; @@ -216,7 +227,7 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { while(iter != msglist.constBegin()) { iter--; - if(!fastForward && (*iter).msgId() < id) + if(!fastForward && (*iter).msgId() < minId) break; processedMsgs++; @@ -247,7 +258,7 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { } } else { while(iter != msglist.constEnd()) { - if(!fastForward && (*iter).msgId() < id) + if(!fastForward && (*iter).msgId() < minId) break; processedMsgs++; @@ -299,7 +310,6 @@ void MessageModel::customEvent(QEvent *event) { QList::iterator removeStart = _messageBuffer.begin() + remainingMsgs; QList::iterator removeEnd = _messageBuffer.end(); _messageBuffer.erase(removeStart, removeEnd); - if(!_messageBuffer.isEmpty()) QCoreApplication::postEvent(this, new ProcessBufferEvent()); } diff --git a/src/client/messagemodel.h b/src/client/messagemodel.h index f8ffaa5a..0f25fa8c 100644 --- a/src/client/messagemodel.h +++ b/src/client/messagemodel.h @@ -55,7 +55,7 @@ public: inline QModelIndex index(int row, int column, const QModelIndex &/*parent*/ = QModelIndex()) const { return createIndex(row, column); } inline QModelIndex parent(const QModelIndex &) const { return QModelIndex(); } - inline int rowCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return _messageList.count(); } + inline int rowCount(const QModelIndex &parent = QModelIndex()) const { return parent.isValid() ? 0 : _messageList.count(); } inline int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return 3; } virtual QVariant data(const QModelIndex &index, int role) const; diff --git a/src/qtui/CMakeLists.txt b/src/qtui/CMakeLists.txt index 4a591267..b65c3182 100644 --- a/src/qtui/CMakeLists.txt +++ b/src/qtui/CMakeLists.txt @@ -26,6 +26,7 @@ set(SOURCES coreinfodlg.cpp debugconsole.cpp debuglogwidget.cpp + debugmessagemodelfilter.cpp inputwidget.cpp jumpkeyhandler.cpp mainwin.cpp @@ -64,6 +65,7 @@ set(MOC_HDRS coreinfodlg.h debugconsole.h debuglogwidget.h + debugmessagemodelfilter.h inputwidget.h jumpkeyhandler.h mainwin.h diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 87dfae57..bc628428 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -103,9 +103,25 @@ ChatScene::~ChatScene() { void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { Q_UNUSED(index); -// QModelIndex sidx = model()->index(start, 0); -// QModelIndex eidx = model()->index(end, 0); -// qDebug() << "rowsInserted" << start << end << "-" << sidx.data(MessageModel::MsgIdRole).value() << eidx.data(MessageModel::MsgIdRole).value(); + + +// QModelIndex sidx = model()->index(start, 2); +// QModelIndex eidx = model()->index(end, 2); +// qDebug() << "rowsInserted:"; +// if(start > 0) { +// QModelIndex ssidx = model()->index(start - 1, 2); +// qDebug() << "Start--:" << start - 1 << ssidx.data(MessageModel::MsgIdRole).value() +// << ssidx.data(Qt::DisplayRole).toString(); +// } +// qDebug() << "Start:" << start << sidx.data(MessageModel::MsgIdRole).value() +// << sidx.data(Qt::DisplayRole).toString(); +// qDebug() << "End:" << end << eidx.data(MessageModel::MsgIdRole).value() +// << eidx.data(Qt::DisplayRole).toString(); +// if(end + 1 < model()->rowCount()) { +// QModelIndex eeidx = model()->index(end + 1, 2); +// qDebug() << "End++:" << end + 1 << eeidx.data(MessageModel::MsgIdRole).value() +// << eeidx.data(Qt::DisplayRole).toString(); +// } qreal h = 0; qreal y = 0; diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index e7390ea5..8287dddb 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -35,6 +35,7 @@ #include "coreinfodlg.h" #include "coreconnectdlg.h" #include "debuglogwidget.h" +#include "debugmessagemodelfilter.h" #include "iconloader.h" #include "inputwidget.h" #include "inputline.h" @@ -198,6 +199,8 @@ void MainWin::setupActions() { qApp, SLOT(aboutQt()))); coll->addAction("DebugNetworkModel", new Action(SmallIcon("tools-report-bug"), tr("Debug &NetworkModel"), coll, this, SLOT(on_actionDebugNetworkModel_triggered()))); + coll->addAction("DebugMessageModel", new Action(SmallIcon("tools-report-bug"), tr("Debug &MessageModel"), coll, + this, SLOT(on_actionDebugMessageModel_triggered()))); coll->addAction("DebugLog", new Action(SmallIcon("tools-report-bug"), tr("Debug &Log"), coll, this, SLOT(on_actionDebugLog_triggered()))); } @@ -234,6 +237,7 @@ void MainWin::setupMenus() { _helpMenu->addSeparator(); _helpDebugMenu = _helpMenu->addMenu(SmallIcon("tools-report-bug"), tr("Debug")); _helpDebugMenu->addAction(coll->action("DebugNetworkModel")); + _helpDebugMenu->addAction(coll->action("DebugMessageModel")); _helpDebugMenu->addAction(coll->action("DebugLog")); } @@ -737,6 +741,17 @@ void MainWin::on_actionDebugNetworkModel_triggered() { view->show(); } +void MainWin::on_actionDebugMessageModel_triggered() { + QTableView *view = new QTableView(0); + DebugMessageModelFilter *filter = new DebugMessageModelFilter(view); + filter->setSourceModel(Client::messageModel()); + view->setModel(filter); + view->setAttribute(Qt::WA_DeleteOnClose, true); + view->verticalHeader()->hide(); + view->horizontalHeader()->setStretchLastSection(true); + view->show(); +} + void MainWin::on_actionDebugLog_triggered() { DebugLogWidget *logWidget = new DebugLogWidget(0); logWidget->show(); diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index a2d0bc8b..2a53f752 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -84,6 +84,7 @@ class MainWin : public QMainWindow { void on_actionManageViews_triggered(); void on_actionLockDockPositions_toggled(bool lock); void on_actionDebugNetworkModel_triggered(); + void on_actionDebugMessageModel_triggered(); void on_actionDebugLog_triggered(); void clientNetworkCreated(NetworkId);