Cache ChatLine layout data for visible chatlines
[quassel.git] / src / qtui / columnhandleitem.cpp
index 2b0231c..f79019c 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
-*   Copyright (C) 2005-08 by the Quassel IRC Team                         *
+*   Copyright (C) 2005-09 by the Quassel Project                          *
 *   devel@quassel-irc.org                                                 *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
 
+#include "columnhandleitem.h"
+
+#include <QApplication>
 #include <QCursor>
 #include <QGraphicsScene>
 #include <QGraphicsSceneHoverEvent>
 #include <QPainter>
+#include <QPalette>
 
 #include <QDebug>
 
-#include "columnhandleitem.h"
-
 ColumnHandleItem::ColumnHandleItem(qreal w, QGraphicsItem *parent)
   : QGraphicsItem(parent),
     _width(w),
+    _boundingRect(-_width/2, 0, _width, 0),
     _hover(0),
-    _timeLine(150),
     _moving(false),
     _minXPos(0),
-    _maxXPos(0)
+    _maxXPos(0),
+    _timeLine(350),
+    _rulerColor(QApplication::palette().windowText().color())
 {
+  _timeLine.setUpdateInterval(20);
+
   setAcceptsHoverEvents(true);
   setZValue(10);
   setCursor(QCursor(Qt::OpenHandCursor));
@@ -44,7 +50,10 @@ ColumnHandleItem::ColumnHandleItem(qreal w, QGraphicsItem *parent)
 }
 
 void ColumnHandleItem::setXPos(qreal xpos) {
-  setPos(xpos - width()/2, 0);
+  setPos(xpos, 0);
+  QRectF sceneBRect = _boundingRect.translated(x(), 0);
+  _sceneLeft = sceneBRect.left();
+  _sceneRight = sceneBRect.right();
 }
 
 void ColumnHandleItem::setXLimits(qreal min, qreal max) {
@@ -55,8 +64,8 @@ void ColumnHandleItem::setXLimits(qreal min, qreal max) {
 }
 
 void ColumnHandleItem::sceneRectChanged(const QRectF &rect) {
-  if(rect.height() != boundingRect().height())
-    prepareGeometryChange();
+  prepareGeometryChange();
+  _boundingRect = QRectF(-_width/2, rect.y(), _width, rect.height());
 }
 
 void ColumnHandleItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
@@ -87,7 +96,10 @@ void ColumnHandleItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
   if(_moving) {
     _moving = false;
     setCursor(QCursor(Qt::OpenHandCursor));
-    emit positionChanged(x() + width()/2);
+    QRectF sceneBRect = _boundingRect.translated(x(), 0);
+    _sceneLeft = sceneBRect.left();
+    _sceneRight = sceneBRect.right();
+    emit positionChanged(x());
     event->accept();
   } else {
     event->ignore();
@@ -119,10 +131,13 @@ void ColumnHandleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *
   Q_UNUSED(option);
   Q_UNUSED(widget);
 
-  QLinearGradient gradient(0, 0, width(), 0);
-  gradient.setColorAt(0.25, Qt::transparent);
-  gradient.setColorAt(0.5, QColor(0, 0, 0, _hover * 200));
-  gradient.setColorAt(0.75, Qt::transparent);
+  QLinearGradient gradient(boundingRect().topLeft(), boundingRect().topRight());
+  QColor _rulerColor = QApplication::palette().windowText().color();
+  _rulerColor.setAlphaF(_hover);
+  gradient.setColorAt(0, Qt::transparent);
+  gradient.setColorAt(0.4, _rulerColor);
+  gradient.setColorAt(0.6, _rulerColor);
+  gradient.setColorAt(1, Qt::transparent);
   painter->fillRect(boundingRect(), gradient);
 }