From bc77491a09c15f5170d4c1eb9608d5da75e81697 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Tue, 1 Dec 2009 08:54:39 +0100 Subject: [PATCH] =?utf8?q?Replace=20fugly=20w=C3=BCrgaround=20for=20QTBUG-?= =?utf8?q?6322=20with=20a=20longer=20and=20even=20more=20fugly=20one?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Well, at least the new version seems to work without a hardcoded ChatView margin, and hence even with a current Oxygen style. Let's hope it doesn't break elsewhere. --- src/qtui/chatscene.cpp | 8 +++---- src/qtui/chatview.cpp | 47 ++++++++++++++++++++++++++++++++++++------ src/qtui/chatview.h | 2 +- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index f111781b..5072e384 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -882,7 +882,7 @@ void ChatScene::loadWebPreview(ChatItem *parentItem, const QUrl &url, const QRec // prepare to load a different URL if(webPreview.previewItem) { if(webPreview.previewItem->scene()) - removeItem(webPreview.previewItem); + removeItem(webPreview.previewItem); delete webPreview.previewItem; webPreview.previewItem = 0; } @@ -930,10 +930,10 @@ void ChatScene::webPreviewNextStep() { qreal previewY = webPreview.urlRect.bottom(); qreal previewX = webPreview.urlRect.x(); if(previewY + webPreview.previewItem->boundingRect().height() > sceneRect().bottom()) - previewY = webPreview.urlRect.y() - webPreview.previewItem->boundingRect().height(); + previewY = webPreview.urlRect.y() - webPreview.previewItem->boundingRect().height(); if(previewX + webPreview.previewItem->boundingRect().width() > sceneRect().width()) - previewX = sceneRect().right() - webPreview.previewItem->boundingRect().width(); + previewX = sceneRect().right() - webPreview.previewItem->boundingRect().width(); webPreview.previewItem->setPos(previewX, previewY); } @@ -968,7 +968,7 @@ void ChatScene::clearWebPreview(ChatItem *parentItem) { case WebPreview::ShowPreview: if(parentItem == 0 || webPreview.parentItem == parentItem) { if(webPreview.previewItem && webPreview.previewItem->scene()) - removeItem(webPreview.previewItem); + removeItem(webPreview.previewItem); } // fall through into to set hidden state case WebPreview::DelayPreview: diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index e7386efc..c8116a27 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -57,6 +57,7 @@ ChatView::ChatView(MessageFilter *filter, QWidget *parent) void ChatView::init(MessageFilter *filter) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); setAlignment(Qt::AlignBottom); setInteractive(true); //setOptimizationFlags(QGraphicsView::DontClipPainter | QGraphicsView::DontAdjustForAntialiasing); @@ -69,8 +70,8 @@ void ChatView::init(MessageFilter *filter) { _scrollTimer.setSingleShot(true); connect(&_scrollTimer, SIGNAL(timeout()), SLOT(scrollTimerTimeout())); - _scene = new ChatScene(filter, filter->idString(), viewport()->width() - 4, this); // see below: resizeEvent() - connect(_scene, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(sceneRectChanged(const QRectF &))); + _scene = new ChatScene(filter, filter->idString(), viewport()->width(), this); + connect(_scene, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(adjustSceneRect())); connect(_scene, SIGNAL(lastLineChanged(QGraphicsItem *, qreal)), this, SLOT(lastLineChanged(QGraphicsItem *, qreal))); connect(_scene, SIGNAL(mouseMoveWhileSelecting(const QPointF &)), this, SLOT(mouseMoveWhileSelecting(const QPointF &))); setScene(_scene); @@ -119,15 +120,49 @@ void ChatView::resizeEvent(QResizeEvent *event) { // we can reduce viewport updates if we scroll to the bottom allready at the beginning verticalScrollBar()->setValue(verticalScrollBar()->maximum()); - - // FIXME: without the hardcoded -4 Qt reserves space for a horizontal scrollbar even though it's disabled permanently. - // this does only occur on QtX11 (at least not on Qt for Mac OS). Seems like a Qt Bug. - scene()->updateForViewport(viewport()->width() - 4, viewport()->height()); + scene()->updateForViewport(viewport()->width(), viewport()->height()); + adjustSceneRect(); _lastScrollbarPos = verticalScrollBar()->maximum(); verticalScrollBar()->setValue(verticalScrollBar()->maximum()); } +// Workaround for QTBUG-6322 +// The viewport rect gets some margins where it shouldn't, resulting in scrollbars to appear +void ChatView::adjustSceneRect() { + static qreal voffset = 0; + static bool offsetStable = false; + + QRectF rect = scene()->sceneRect(); + if(rect.height() <= viewport()->height()) { + setSceneRect(rect); + return; + } + if(offsetStable && rect.height() > viewport()->height()) + setSceneRect(rect.adjusted(0, 0, 0, voffset)); + else { + setSceneRect(rect); + + QScrollBar *vbar = verticalScrollBar(); + qreal sceneHeight = rect.height(); + qreal viewHeight = vbar->maximum() + viewport()->height() - vbar->minimum(); + if(sceneHeight != viewHeight) { + voffset = sceneHeight - viewHeight; + // qDebug() << "Adjusting ChatView offset to" << voffset << "(QTBUG-6322)"; + if(sceneHeight + voffset <= viewport()->height()) { + setSceneRect(rect.adjusted(0, -voffset, 0, 0)); + offsetStable = false; + return; + } else + setSceneRect(rect.adjusted(0, 0, 0, voffset)); + } + if(vbar->maximum() + viewport()->height() - vbar->minimum() != sceneHeight) + qWarning() << "Workaround for QTBUG-6322 failed!1!!" << vbar->maximum() + viewport()->height() - vbar->minimum() << sceneHeight; + else + offsetStable = true; + } +} + void ChatView::mouseMoveWhileSelecting(const QPointF &scenePos) { int y = (int)mapFromScene(scenePos).y(); _scrollOffset = 0; diff --git a/src/qtui/chatview.h b/src/qtui/chatview.h index d72328a9..3c2eba13 100644 --- a/src/qtui/chatview.h +++ b/src/qtui/chatview.h @@ -61,11 +61,11 @@ protected: virtual void resizeEvent(QResizeEvent *event); protected slots: - virtual inline void sceneRectChanged(const QRectF &rect) { setSceneRect(rect); } virtual void verticalScrollbarChanged(int); private slots: void lastLineChanged(QGraphicsItem *chatLine, qreal offset); + void adjustSceneRect(); void mouseMoveWhileSelecting(const QPointF &scenePos); void scrollTimerTimeout(); void invalidateFilter(); -- 2.20.1