Columns are now moveable!
authorManuel Nickschas <sputnick@quassel-irc.org>
Fri, 25 Jul 2008 22:35:07 +0000 (00:35 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sat, 2 Aug 2008 13:17:11 +0000 (15:17 +0200)
src/qtui/chatitem.cpp
src/qtui/chatscene.cpp
src/qtui/chatscene.h
src/qtui/columnhandleitem.cpp
src/qtui/columnhandleitem.h

index 487c2f2..235868d 100644 (file)
@@ -135,8 +135,6 @@ void ChatItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
   Q_UNUSED(option); Q_UNUSED(widget);
   if(!haveLayout()) updateLayout();
   _layout->draw(painter, QPointF(0,0), QVector<QTextLayout::FormatRange>(), boundingRect());
   Q_UNUSED(option); Q_UNUSED(widget);
   if(!haveLayout()) updateLayout();
   _layout->draw(painter, QPointF(0,0), QVector<QTextLayout::FormatRange>(), boundingRect());
-  //painter->drawRect(boundingRect());
-
 }
 
 /*
 }
 
 /*
index 6eb07a9..581377d 100644 (file)
@@ -47,6 +47,9 @@ ChatScene::ChatScene(QAbstractItemModel *model, QObject *parent) : QGraphicsScen
   firstColHandle = new ColumnHandleItem(QtUi::style()->firstColumnSeparator()); addItem(firstColHandle);
   secondColHandle = new ColumnHandleItem(QtUi::style()->secondColumnSeparator()); addItem(secondColHandle);
 
   firstColHandle = new ColumnHandleItem(QtUi::style()->firstColumnSeparator()); addItem(firstColHandle);
   secondColHandle = new ColumnHandleItem(QtUi::style()->secondColumnSeparator()); addItem(secondColHandle);
 
+  connect(firstColHandle, SIGNAL(positionChanged(qreal)), this, SLOT(handlePositionChanged(qreal)));
+  connect(secondColHandle, SIGNAL(positionChanged(qreal)), this, SLOT(handlePositionChanged(qreal)));
+
   firstColHandle->setXPos(firstColHandlePos);
   firstColHandle->setXLimits(0, secondColHandlePos);
   secondColHandle->setXPos(secondColHandlePos);
   firstColHandle->setXPos(firstColHandlePos);
   firstColHandle->setXLimits(0, secondColHandlePos);
   secondColHandle->setXPos(secondColHandlePos);
@@ -103,3 +106,19 @@ void ChatScene::rectChanged(const QRectF &rect) {
   firstColHandle->sceneRectChanged(rect);
   secondColHandle->sceneRectChanged(rect);
 }
   firstColHandle->sceneRectChanged(rect);
   secondColHandle->sceneRectChanged(rect);
 }
+
+void ChatScene::handlePositionChanged(qreal xpos) {
+  bool first = (sender() == firstColHandle);
+  qreal oldx;
+  if(first) {
+    oldx = firstColHandlePos;
+    firstColHandlePos = xpos;
+  } else {
+    oldx = secondColHandlePos;
+    secondColHandlePos = xpos;
+  }
+  setWidth(width());  // readjust all chatlines
+  // we get ugly redraw errors if we don't update this explicitly... :(
+  // width() should be the same for both handles, so just use firstColHandle regardless
+  update(qMin(oldx, xpos) - firstColHandle->width()/2, 0, qMax(oldx, xpos) + firstColHandle->width()/2, height());
+}
index 9d8a565..a1a32d1 100644 (file)
@@ -47,6 +47,7 @@ class ChatScene : public QGraphicsScene {
 
   private slots:
     void rectChanged(const QRectF &);
 
   private slots:
     void rectChanged(const QRectF &);
+    void handlePositionChanged(qreal xpos);
 
   signals:
     void heightChanged(qreal height);
 
   signals:
     void heightChanged(qreal height);
index e8dd97e..3631168 100644 (file)
@@ -87,6 +87,7 @@ void ColumnHandleItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
   if(_moving) {
     _moving = false;
     setCursor(QCursor(Qt::OpenHandCursor));
   if(_moving) {
     _moving = false;
     setCursor(QCursor(Qt::OpenHandCursor));
+    emit positionChanged(x() + width()/2);
     event->accept();
   } else {
     event->ignore();
     event->accept();
   } else {
     event->ignore();
index f9d1f7a..1ed4c46 100644 (file)
 class ColumnHandleItem : public QObject, public QGraphicsItem {
   Q_OBJECT
 
 class ColumnHandleItem : public QObject, public QGraphicsItem {
   Q_OBJECT
 
-public:
-  ColumnHandleItem(qreal width, QGraphicsItem *parent = 0);
-
-  inline qreal width() const { return _width; }
-  inline QRectF boundingRect() const { return QRectF(0, 0, _width, scene()->height()); }
-  void setXPos(qreal xpos);
-
-  void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
-
-  void sceneRectChanged(const QRectF &);
-  void setXLimits(qreal min, qreal max);
-
-protected:
-  void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
-  void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
-  void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
-  void mousePressEvent(QGraphicsSceneMouseEvent *event);
-  void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
-
-private slots:
-  void hoverChanged(qreal value);
-
-private:
-  qreal _width;
-  qreal _hover;
-  bool _moving;
-  qreal _minXPos, _maxXPos;
-  QTimeLine _timeLine;
+  public:
+    ColumnHandleItem(qreal width, QGraphicsItem *parent = 0);
+
+    inline qreal width() const { return _width; }
+    inline QRectF boundingRect() const { return QRectF(0, 0, _width, scene()->height()); }
+    void setXPos(qreal xpos);
+
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
+
+    void sceneRectChanged(const QRectF &);
+    void setXLimits(qreal min, qreal max);
+
+  protected:
+    void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
+    void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+
+  signals:
+    void positionChanged(qreal x);
+
+  private slots:
+    void hoverChanged(qreal value);
+
+  private:
+    qreal _width;
+    qreal _hover;
+    bool _moving;
+    qreal _minXPos, _maxXPos;
+    QTimeLine _timeLine;
 };
 
 #endif
 };
 
 #endif