From 17a68937d25404ddb804f443629313a7c873dbe1 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Wed, 27 Aug 2008 13:51:52 +0200 Subject: [PATCH] Sanitize the handling of ColumnHandleItems --- src/qtui/chatline.cpp | 16 ++++++++-------- src/qtui/chatline.h | 2 +- src/qtui/chatscene.cpp | 20 +++++++++----------- src/qtui/chatscene.h | 7 +++++-- src/qtui/columnhandleitem.cpp | 2 +- src/qtui/columnhandleitem.h | 2 +- 6 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/qtui/chatline.cpp b/src/qtui/chatline.cpp index e55ab14f..c09bdee0 100644 --- a/src/qtui/chatline.cpp +++ b/src/qtui/chatline.cpp @@ -65,18 +65,18 @@ ChatItem &ChatLine::item(ChatLineModel::ColumnType column) { } } -qreal ChatLine::setGeometry(qreal width, qreal firstHandlePos, qreal secondHandlePos) { +qreal ChatLine::setGeometry(qreal width) { if(width != _width) prepareGeometryChange(); - qreal firstSepWidth = QtUi::style()->firstColumnSeparator(); - qreal secondSepWidth = QtUi::style()->secondColumnSeparator(); + QRectF firstColHandleRect = chatScene()->firstColumnHandleRect(); + QRectF secondColHandleRect = chatScene()->secondColumnHandleRect(); - _height = _contentsItem.setGeometry(width - secondHandlePos - secondSepWidth); - _timestampItem.setGeometry(firstHandlePos, _height); - _senderItem.setGeometry(secondHandlePos - firstHandlePos - firstSepWidth, _height); + _height = _contentsItem.setGeometry(width - secondColHandleRect.right()); + _timestampItem.setGeometry(firstColHandleRect.left(), _height); + _senderItem.setGeometry(secondColHandleRect.left() - firstColHandleRect.right(), _height); - _senderItem.setPos(firstHandlePos + firstSepWidth, 0); - _contentsItem.setPos(secondHandlePos + secondSepWidth, 0); + _senderItem.setPos(firstColHandleRect.right(), 0); + _contentsItem.setPos(secondColHandleRect.right(), 0); _width = width; return _height; diff --git a/src/qtui/chatline.h b/src/qtui/chatline.h index c429f02d..d69caa5b 100644 --- a/src/qtui/chatline.h +++ b/src/qtui/chatline.h @@ -44,7 +44,7 @@ public: virtual void paint (QPainter * painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); // returns height - qreal setGeometry(qreal width, qreal firstColPos, qreal secondColPos); + qreal setGeometry(qreal width); void setSelected(bool selected, ChatLineModel::ColumnType minColumn = ChatLineModel::ContentsColumn); void setHighlighted(bool highlighted); diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index b7355fd1..3eacdc4b 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -110,7 +110,7 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { addItem(line); if(_width > 0) { line->setPos(0, y+h); - h += line->setGeometry(_width, firstColHandlePos, secondColHandlePos); + h += line->setGeometry(_width); } } // update existing items @@ -187,7 +187,7 @@ void ChatScene::setWidth(qreal w) { _height = 0; foreach(ChatLine *line, _lines) { line->setPos(0, _height); - _height += line->setGeometry(_width, firstColHandlePos, secondColHandlePos); + _height += line->setGeometry(_width); } setSceneRect(QRectF(0, 0, w, _height)); setHandleXLimits(); @@ -218,14 +218,12 @@ void ChatScene::handlePositionChanged(qreal 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), 0, qMax(oldx, xpos) + firstColHandle->width(), height()); + //update(qMin(oldx, xpos), 0, qMax(oldx, xpos) + firstColHandle->width(), height()); } void ChatScene::setHandleXLimits() { - qreal firstsepwidth = QtUi::style()->firstColumnSeparator(); - qreal secondsepwidth = QtUi::style()->secondColumnSeparator(); - firstColHandle->setXLimits(-firstsepwidth/2, secondColHandlePos - firstsepwidth/2); - secondColHandle->setXLimits(firstColHandlePos + firstsepwidth - secondsepwidth/2, width() - minContentsWidth - secondsepwidth/2); + firstColHandle->setXLimits(0, secondColumnHandleRect().left()); + secondColHandle->setXLimits(firstColumnHandleRect().right(), width() - minContentsWidth); } void ChatScene::setSelectingItem(ChatItem *item) { @@ -244,12 +242,12 @@ void ChatScene::startGlobalSelection(ChatItem *item, const QPointF &itemPos) { void ChatScene::updateSelection(const QPointF &pos) { // This is somewhat hacky... we look at the contents item that is at the cursor's y position (ignoring x), since // it has the full height. From this item, we can then determine the row index and hence the ChatLine. - ChatItem *contentItem = static_cast(itemAt(QPointF(secondColHandlePos + secondColHandle->width(), pos.y()))); + ChatItem *contentItem = static_cast(itemAt(QPointF(secondColumnHandleRect().right() + 1, pos.y()))); if(!contentItem) return; int curRow = contentItem->row(); int curColumn; - if(pos.x() > secondColHandlePos + secondColHandle->width()/2) curColumn = ChatLineModel::ContentsColumn; + if(pos.x() > secondColumnHandleRect().right()) curColumn = ChatLineModel::ContentsColumn; else if(pos.x() > firstColHandlePos) curColumn = ChatLineModel::SenderColumn; else curColumn = ChatLineModel::TimestampColumn; @@ -369,9 +367,9 @@ void ChatScene::requestBacklog() { } int ChatScene::sectionByScenePos(int x) { - if(x < firstColHandlePos + firstColHandle->width()/2) + if(x < firstColHandle->x()) return ChatLineModel::TimestampColumn; - if(x < secondColHandlePos + secondColHandle->width()/2) + if(x < secondColHandle->x()) return ChatLineModel::SenderColumn; return ChatLineModel::ContentsColumn; diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index 30e35646..f97787ea 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -25,12 +25,12 @@ #include #include -#include "types.h" +#include "columnhandleitem.h" + class AbstractUiMsg; class ChatItem; class ChatLine; -class ColumnHandleItem; class QGraphicsSceneMouseEvent; @@ -49,6 +49,9 @@ class ChatScene : public QGraphicsScene { inline bool isSingleBufferScene() const { return _singleBufferScene; } inline ChatLine *chatLine(int row) { return (row < _lines.count()) ? _lines[row] : 0; } + inline QRectF firstColumnHandleRect() const { return firstColHandle->boundingRect().translated(firstColHandle->x(), 0); } + inline QRectF secondColumnHandleRect() const { return secondColHandle->boundingRect().translated(secondColHandle->x(), 0); } + public slots: void setWidth(qreal); diff --git a/src/qtui/columnhandleitem.cpp b/src/qtui/columnhandleitem.cpp index 8f1f9a2e..7a93c4f6 100644 --- a/src/qtui/columnhandleitem.cpp +++ b/src/qtui/columnhandleitem.cpp @@ -119,7 +119,7 @@ void ColumnHandleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * Q_UNUSED(option); Q_UNUSED(widget); - QLinearGradient gradient(0, 0, width(), 0); + QLinearGradient gradient(boundingRect().topLeft(), boundingRect().topRight()); QColor rulerColor = QApplication::palette().windowText().color(); rulerColor.setAlphaF(_hover); gradient.setColorAt(0, Qt::transparent); diff --git a/src/qtui/columnhandleitem.h b/src/qtui/columnhandleitem.h index 1ed4c46d..43ecb475 100644 --- a/src/qtui/columnhandleitem.h +++ b/src/qtui/columnhandleitem.h @@ -33,7 +33,7 @@ class ColumnHandleItem : public QObject, public QGraphicsItem { ColumnHandleItem(qreal width, QGraphicsItem *parent = 0); inline qreal width() const { return _width; } - inline QRectF boundingRect() const { return QRectF(0, 0, _width, scene()->height()); } + inline QRectF boundingRect() const { return QRectF(-_width/2, 0, _width, scene()->height()); } void setXPos(qreal xpos); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- 2.20.1