Checking in WiP on the MessageModel. More cleanly separated code and compiling of...
authorManuel Nickschas <sputnick@quassel-irc.org>
Fri, 25 Apr 2008 00:23:52 +0000 (00:23 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Fri, 25 Apr 2008 00:23:52 +0000 (00:23 +0000)
chatwidget (via #ifdef SPUTDEV). Allows me to b0rk code in the new files without breaking compiling
for the non-SPUTDEV users.

12 files changed:
src/client/client.cpp
src/client/client.pri
src/client/messagemodel.cpp
src/client/messagemodel.h
src/client/quasselui.h
src/common/types.h
src/qtui/chatlinemodel.cpp [new file with mode: 0644]
src/qtui/chatlinemodel.h [new file with mode: 0644]
src/qtui/mainwin.cpp
src/qtui/qtui.cpp
src/qtui/qtui.h
src/qtui/qtui.pri

index 8d5e71b..64092dd 100644 (file)
@@ -95,7 +95,7 @@ void Client::init() {
 
   _bufferModel = new BufferModel(_networkModel);
 #ifdef SPUTDEV
-  _messageModel = new MessageModel(this);
+  _messageModel = mainUi->createMessageModel(this);
 #endif
   SignalProxy *p = signalProxy();
 
@@ -435,6 +435,7 @@ void Client::networkDestroyed() {
   }
 }
 
+#ifndef SPUTDEV
 void Client::recvMessage(const Message &message) {
   Message msg = message;
   Buffer *b;
@@ -445,7 +446,6 @@ void Client::recvMessage(const Message &message) {
 
   // TODO: make redirected messages show up in the correct buffer!
 
-#ifndef SPUTDEV
   if(msg.flags() & Message::Redirected) {
     BufferSettings bufferSettings;
     bool inStatus = bufferSettings.value("UserMessagesInStatusBuffer", QVariant(true)).toBool();
@@ -489,12 +489,8 @@ void Client::recvMessage(const Message &message) {
     b = buffer(msg.bufferInfo());
     b->appendMsg(msg);
   }
-#endif
-  
   //bufferModel()->updateBufferActivity(msg);
 
-  // monitor buffer goes away
-#ifndef SPUTDEV
   if(msg.type() == Message::Plain || msg.type() == Message::Notice || msg.type() == Message::Action) {
     const Network *net = network(msg.bufferInfo().networkId());
     QString networkName = net != 0
@@ -504,10 +500,16 @@ void Client::recvMessage(const Message &message) {
     Message mmsg = Message(msg.timestamp(), msg.bufferInfo(), msg.type(), msg.text(), sender, msg.flags());
     monitorBuffer()->appendMsg(mmsg);
   }
-#endif
-
   emit messageReceived(msg);
 }
+#else
+
+void Client::recvMessage(const Message &msg) {
+
+
+}
+
+#endif /* SPUTDEV */
 
 void Client::recvStatusMsg(QString /*net*/, QString /*msg*/) {
   //recvMessage(net, Message::server("", QString("[STATUS] %1").arg(msg)));
@@ -520,7 +522,6 @@ void Client::receiveBacklog(BufferId bufferId, const QVariantList &msgs) {
     qWarning() << "Client::recvBacklogData(): received Backlog for unknown Buffer:" << bufferId;
     return;
   }
-#endif
 
   if(msgs.isEmpty())
     return; // no work to be done...
@@ -541,6 +542,7 @@ void Client::receiveBacklog(BufferId bufferId, const QVariantList &msgs) {
   if(!layoutTimer->isActive()) {
     layoutTimer->start();
   }
+#endif
 }
 
 void Client::layoutMsg() {
index d16cec3..0945919 100644 (file)
@@ -1,7 +1,13 @@
 DEPMOD = common
 QT_MOD = core network gui
 
-SRCS += buffer.cpp buffersettings.cpp clientbacklogmanager.cpp treemodel.cpp networkmodel.cpp buffermodel.cpp client.cpp clientsettings.cpp clientsyncer.cpp \
-        mappedselectionmodel.cpp selectionmodelsynchronizer.cpp
-HDRS += buffer.h buffersettings.h clientbacklogmanager.h treemodel.h networkmodel.h buffermodel.h client.h clientsettings.h clientsyncer.h quasselui.h \
-        mappedselectionmodel.h selectionmodelsynchronizer.h
+SRCS += buffer.cpp buffersettings.cpp clientbacklogmanager.cpp treemodel.cpp networkmodel.cpp buffermodel.cpp \
+        client.cpp clientsettings.cpp clientsyncer.cpp mappedselectionmodel.cpp selectionmodelsynchronizer.cpp
+HDRS += buffer.h buffersettings.h clientbacklogmanager.h treemodel.h networkmodel.h buffermodel.h \
+        client.h clientsettings.h clientsyncer.h quasselui.h mappedselectionmodel.h selectionmodelsynchronizer.h
+
+sputdev {
+  SRCS += messagemodel.cpp
+  HDRS += messagemodel.h
+}
+
index 11cd024..d53449e 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "messagemodel.h"
 
+#include "message.h"
+
 MessageModel::MessageModel(QObject *parent) : QAbstractItemModel(parent) {
   
   
@@ -40,7 +42,7 @@ QVariant MessageModel::data(const QModelIndex &index, int role) const {
 bool MessageModel::setData(const QModelIndex &index, const QVariant &value, int role) {
   int row = index.row();
   if(row < 0 || row >= _messageList.count()) return false;
-  if(_messageList[row]->setData(index.column(), role)) {
+  if(_messageList[row]->setData(index.column(), value, role)) {
     emit dataChanged(index, index); // FIXME make msg emit this (too)
     return true;
   }
@@ -49,22 +51,32 @@ bool MessageModel::setData(const QModelIndex &index, const QVariant &value, int
 
 void MessageModel::insertMessage(const Message &msg) {
   MsgId id = msg.msgId();
+  int idx = indexForId(id); qDebug() << "inserting at" << idx << msg.text();
   MessageItem *item = createMessageItem(msg);
-  if(id > )
-    
+  beginInsertRows(QModelIndex(), idx, idx);
+  _messageList.insert(idx, item);
+  endInsertRows();
+}
+
+void MessageModel::insertMessages(const QList<Message> &msglist) {
+  if(msglist.isEmpty()) return;
+  // FIXME make this more efficient by grouping msgs
+  foreach(Message msg, msglist) insertMessage(msg);
+
 }
 
 // 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) {
-  if(!_messageList.count() || id <= _messageList[0]->data(0, MsgIdRole).value<MsgId>()) return 0;
+  if(_messageList.isEmpty() || id <= _messageList[0]->data(0, MsgIdRole).value<MsgId>()) return 0;
   if(id > _messageList.last()->data(0, MsgIdRole).value<MsgId>()) return _messageList.count();
   // binary search
   int start = 0; int end = _messageList.count()-1;
-  int idx;
   while(1) {
-    if(start == end) return start;
-    idx = (end + start) / 2;
-    
+    if(end - start == 1) return end;
+    int pivot = (end + start) / 2;
+    if(id <= _messageList[pivot]->data(0, MsgIdRole).value<MsgId>()) end = pivot;
+    else start = pivot;
+  }
 }
 
 /**********************************************************************************/
index 32e4438..1a41f26 100644 (file)
@@ -23,7 +23,9 @@
 
 #include <QAbstractItemModel>
 
+class Message;
 class MessageItem;
+class MsgId;
 
 class MessageModel : public QAbstractItemModel {
   Q_OBJECT
@@ -41,10 +43,10 @@ class MessageModel : public QAbstractItemModel {
     MessageModel(QObject *parent);
     virtual ~MessageModel();
 
-    inline QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const { return createIndex(row, column); }
-    inline QModelIndex parent(const QModelIndex &index) const { return QModelIndex(); }
-    inline int rowCount(const QModelIndex &parent = QModelIndex()) const { return _messageList.count(); }
-    inline int columnCount(const QModelIndex &parent = QModelIndex()) const { return 3; }
+    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 columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return 3; }
 
     virtual QVariant data(const QModelIndex &index, int role) const;
     virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
@@ -60,6 +62,8 @@ class MessageModel : public QAbstractItemModel {
   private:
     QList<MessageItem *> _messageList;
 
+    int indexForId(MsgId);
+
 };
 
 class MessageItem {
index 747d8b8..bcb512b 100644 (file)
@@ -24,6 +24,8 @@
 #include <QObject>
 #include "message.h"
 
+class MessageModel;
+
 class AbstractUiMsg {
 
   public:
@@ -42,6 +44,7 @@ class AbstractUi : public QObject {
 
   public:
     virtual void init() {};  // called after the client is initialized
+    virtual MessageModel *createMessageModel(QObject *parent = 0) = 0;
     virtual AbstractUiMsg *layoutMsg(const Message &) = 0;
 
   protected slots:
index 381c5d6..0154247 100644 (file)
@@ -37,6 +37,7 @@ class SignedId {
     inline bool operator==(const SignedId &other) const { return id == other.id; }
     inline bool operator!=(const SignedId &other) const { return id != other.id; }
     inline bool operator<(const SignedId &other) const { return id < other.id; }
+    inline bool operator<=(const SignedId &other) const { return id <= other.id; }
     inline bool operator>(const SignedId &other) const { return id > other.id; }
     inline bool operator>=(const SignedId &other) const { return id >= other.id; }
     inline bool operator==(int i) const { return id == i; }
diff --git a/src/qtui/chatlinemodel.cpp b/src/qtui/chatlinemodel.cpp
new file mode 100644 (file)
index 0000000..9d640d8
--- /dev/null
@@ -0,0 +1,36 @@
+/***************************************************************************
+ *   Copyright (C) 2005-08 by the Quassel IRC Team                         *
+ *   devel@quassel-irc.org                                                 *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) version 3.                                           *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "chatlinemodel.h"
+
+ChatlineModel::ChatlineModel(QObject *parent) : MessageModel(parent) {
+
+
+}
+
+ChatlineModel::~ChatlineModel() {
+
+}
+
+
+MessageItem *ChatlineModel::createMessageItem(const Message &msg) {
+  return 0;
+
+}
diff --git a/src/qtui/chatlinemodel.h b/src/qtui/chatlinemodel.h
new file mode 100644 (file)
index 0000000..da4a541
--- /dev/null
@@ -0,0 +1,39 @@
+/***************************************************************************
+ *   Copyright (C) 2005-08 by the Quassel IRC Team                         *
+ *   devel@quassel-irc.org                                                 *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) version 3.                                           *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef CHATLINEMODEL_H_
+#define CHATLINEMODEL_H_
+
+#include "messagemodel.h"
+
+class ChatlineModel : public MessageModel {
+  Q_OBJECT
+
+  public:
+    ChatlineModel(QObject *parent = 0);
+    virtual ~ChatlineModel();
+
+  protected:
+    virtual MessageItem *createMessageItem(const Message &);
+
+};
+
+#endif
+
index e705654..8c77f4c 100644 (file)
@@ -274,6 +274,7 @@ void MainWin::setupNickWidget() {
 }
 
 void MainWin::setupChatMonitor() {
+#ifndef SPUTDEV
   VerticalDock *dock = new VerticalDock(tr("Chat Monitor"), this);
   dock->setObjectName("ChatMonitorDock");
 
@@ -292,6 +293,7 @@ void MainWin::setupChatMonitor() {
 
   addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical);
   ui.menuViews->addAction(dock->toggleViewAction());
+#endif /* SPUTDEV */
 }
 
 void MainWin::setupInputWidget() {
index a799359..46c657c 100644 (file)
@@ -20,6 +20,9 @@
 
 #include "qtui.h"
 
+#ifdef SPUTDEV
+# include "chatlinemodel.h"
+#endif
 #include "mainwin.h"
 
 QtUiStyle *QtUi::_style;
@@ -46,6 +49,15 @@ QtUiStyle *QtUi::style() {
   return _style;
 }
 
+MessageModel *QtUi::createMessageModel(QObject *parent) {
+#ifndef SPUTDEV
+  Q_UNUSED(parent)
+  return 0;
+#else
+  return new ChatlineModel(parent);
+#endif
+}
+
 AbstractUiMsg *QtUi::layoutMsg(const Message &msg) {
   return mainWin->layoutMsg(msg);
 }
index f6f1db5..bbe31f7 100644 (file)
@@ -25,6 +25,7 @@
 #include "quasselui.h"
 
 class MainWin;
+class MessageModel;
 
 //! This class encapsulates Quassel's Qt-based GUI.
 /** This is basically a wrapper around MainWin, which is necessary because we cannot derive MainWin
@@ -37,6 +38,7 @@ class QtUi : public AbstractUi {
     QtUi();
     ~QtUi();
     //void init();
+    MessageModel *createMessageModel(QObject *parent = 0);
     AbstractUiMsg *layoutMsg(const Message &);
 
     static QtUiStyle *style();
index 46b51e9..7f01d41 100644 (file)
@@ -1,16 +1,24 @@
 DEPMOD = client common uisupport
 QT_MOD = core gui network
 
-SRCS += aboutdlg.cpp bufferwidget.cpp chatitem.cpp chatline.cpp chatline-old.cpp chatscene.cpp chatview.cpp chatwidget.cpp \
+SRCS += aboutdlg.cpp bufferwidget.cpp chatline-old.cpp chatwidget.cpp \
         coreconfigwizard.cpp coreconnectdlg.cpp configwizard.cpp debugconsole.cpp inputwidget.cpp \
         mainwin.cpp nicklistwidget.cpp qtui.cpp qtuisettings.cpp qtuistyle.cpp settingsdlg.cpp settingspagedlg.cpp \
         titlesetter.cpp topicbutton.cpp topicwidget.cpp verticaldock.cpp jumpkeyhandler.cpp
 
-HDRS += aboutdlg.h bufferwidget.h chatitem.h chatline.h chatline-old.h chatscene.h chatview.h chatwidget.h \
+HDRS += aboutdlg.h bufferwidget.h chatline-old.h chatwidget.h \
         coreconfigwizard.h configwizard.h debugconsole.h inputwidget.h \
         coreconnectdlg.h mainwin.h nicklistwidget.h qtui.h qtuisettings.h qtuistyle.h settingsdlg.h settingspagedlg.h \
         titlesetter.h topicbutton.h topicwidget.h verticaldock.h jumpkeyhandler.h
 
+# new chatline model stuff
+sputdev {
+  SRCS += chatitem.cpp chatline.cpp chatlinemodel.cpp chatscene.cpp chatview.cpp
+  HDRS += chatitem.h chatline.h chatlinemodel.h chatscene.h chatview.h
+  SRCS -= chatline-old.cpp chatwidget.cpp
+  HDRS -= chatline-old.h chatwidget.h
+}
+
 FORMNAMES = aboutdlg.ui mainwin.ui coreaccounteditdlg.ui coreconnectdlg.ui bufferviewwidget.ui bufferwidget.ui nicklistwidget.ui settingsdlg.ui \
             settingspagedlg.ui topicwidget.ui debugconsole.ui inputwidget.ui \
             coreconfigwizardintropage.ui coreconfigwizardadminuserpage.ui coreconfigwizardstorageselectionpage.ui coreconfigwizardsyncpage.ui