ChatScene speed improvement. This might even fix the dreaded CPU bug!
[quassel.git] / src / qtui / chatscene.h
index 5f8057a..66026c1 100644 (file)
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
-#ifndef _CHATSCENE_H_
-#define _CHATSCENE_H_
+#ifndef CHATSCENE_H_
+#define CHATSCENE_H_
 
 #include <QAbstractItemModel>
 #include <QGraphicsScene>
+#include <QSet>
+
+#include "columnhandleitem.h"
+
 
 class AbstractUiMsg;
-class Buffer;
 class ChatItem;
 class ChatLine;
+
 class QGraphicsSceneMouseEvent;
 
 class ChatScene : public QGraphicsScene {
   Q_OBJECT
 
-  public:
-    ChatScene(QAbstractItemModel *model, QObject *parent);
-    virtual ~ChatScene();
+public:
+  ChatScene(QAbstractItemModel *model, const QString &idString, qreal width, QObject *parent);
+  virtual ~ChatScene();
+
+  inline QAbstractItemModel *model() const { return _model; }
+  inline QString idString() const { return _idString; }
+
+  int sectionByScenePos(int x);
+  inline int sectionByScenePos(const QPoint &pos) { return sectionByScenePos(pos.x()); }
+  inline bool isSingleBufferScene() const { return _singleBufferScene; }
+  inline ChatLine *chatLine(int row) { return (row < _lines.count()) ? _lines[row] : 0; }
+
+  inline ColumnHandleItem *firstColumnHandle() const { return firstColHandle; }
+  inline ColumnHandleItem *secondColumnHandle() const { return secondColHandle; }
+
+public slots:
+  void setWidth(qreal, bool forceReposition = false);
+
+  // these are used by the chatitems to notify the scene and manage selections
+  void setSelectingItem(ChatItem *item);
+  ChatItem *selectingItem() const { return _selectingItem; }
+  void startGlobalSelection(ChatItem *item, const QPointF &itemPos);
+  void putToClipboard(const QString &);
+
+  void requestBacklog();
+
+signals:
+  void sceneHeightChanged(qreal dh);
+
+protected:
+  virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent);
+  virtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);
+  virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent);
+
+protected slots:
+  void rowsInserted(const QModelIndex &, int, int);
+  void rowsAboutToBeRemoved(const QModelIndex &, int, int);
 
-    Buffer *buffer() const;
-    inline QAbstractItemModel *model() const { return _model; }
+private slots:
+  void handlePositionChanged(qreal xpos);
 
-  public slots:
-    void setWidth(int);
+private:
+  void setHandleXLimits();
+  void updateSelection(const QPointF &pos);
+  QString selectionToString() const;
 
-  signals:
-    void heightChanged(int height);
+  QString _idString;
+  QAbstractItemModel *_model;
+  QList<ChatLine *> _lines;
+  bool _singleBufferScene;
 
-  protected slots:
-    void rowsInserted(const QModelIndex &, int, int);
-    void mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent );
+  ColumnHandleItem *firstColHandle, *secondColHandle;
+  qreal firstColHandlePos, secondColHandlePos;
 
-  private:
-    int _width, _height;
-    int _timestampWidth, _senderWidth;
-    QAbstractItemModel *_model;
-    QList<ChatLine *> _lines;
+  ChatItem *_selectingItem;
+  int _selectionStartCol, _selectionMinCol;
+  int _selectionStart;
+  int _selectionEnd;
+  int _firstSelectionRow, _lastSelectionRow;
+  bool _isSelecting;
 
+  int _lastBacklogSize;
 };
 
 #endif