From: Manuel Nickschas Date: Fri, 4 Dec 2009 17:20:32 +0000 (+0100) Subject: Try to make the QTBUG-6322 workaround work in more cases X-Git-Tag: 0.6-beta1~121 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=a944d240396d5e78086cd9d7b0c6d62b94f9bae7;hp=d6c2a6eeb407266a5d673d46d86a9f3d09edb63d Try to make the QTBUG-6322 workaround work in more cases Should work now with all styles (as far as I could test), but it's even fuglier than before and needs further pounding. Also don't try zooming, it fails spectacularly. --- diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index c8116a27..695b513b 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -37,7 +37,9 @@ ChatView::ChatView(BufferId bufferId, QWidget *parent) AbstractChatView(), _bufferContainer(0), _currentScaleFactor(1), - _invalidateFilter(false) + _invalidateFilter(false), + _verticalOffset(0), + _verticalOffsetStable(false) { QList filterList; filterList.append(bufferId); @@ -58,7 +60,7 @@ ChatView::ChatView(MessageFilter *filter, QWidget *parent) void ChatView::init(MessageFilter *filter) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - setAlignment(Qt::AlignBottom); + setAlignment(Qt::AlignLeft|Qt::AlignBottom); setInteractive(true); //setOptimizationFlags(QGraphicsView::DontClipPainter | QGraphicsView::DontAdjustForAntialiasing); // setOptimizationFlags(QGraphicsView::DontAdjustForAntialiasing); @@ -130,37 +132,46 @@ void ChatView::resizeEvent(QResizeEvent *event) { // 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(); + QRectF rect = scene()->sceneRect(); // qDebug() << "sceneRect" << rect; if(rect.height() <= viewport()->height()) { setSceneRect(rect); return; } - if(offsetStable && rect.height() > viewport()->height()) - setSceneRect(rect.adjusted(0, 0, 0, voffset)); - else { + + if(_verticalOffsetStable && rect.height() > viewport()->height()) + setSceneRect(rect.adjusted(0, 0, 0, _verticalOffset)); + 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)); + QScrollBar *vbar = verticalScrollBar(); + qreal sceneHeight = rect.height(); + qreal viewHeight = vbar->maximum() + viewport()->height() - vbar->minimum(); + if(sceneHeight != viewHeight) { + qreal voffset = sceneHeight - viewHeight; //voffset *= _currentScaleFactor; + // qDebug() << "Adjusting ChatView offset to" << voffset << "(QTBUG-6322)"; + if(sceneHeight + voffset <= viewport()->height()) { + setSceneRect(rect.adjusted(0, -voffset, 0, 0)); + _verticalOffsetStable = false; + return; + } else { + _verticalOffsetStable = true; + _verticalOffset = voffset; + 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; - } + if(vbar->maximum() + viewport()->height() - vbar->minimum() != sceneHeight) { + //qWarning() << "Workaround for QTBUG-6322 failed!1!!" << vbar->maximum() + viewport()->height() - vbar->minimum() << sceneHeight; + _verticalOffsetStable = false; + adjustSceneRect(); + return; + } + if(voffset == _verticalOffset) + _verticalOffsetStable = true; + else { + //if(voffset <= 0) + _verticalOffset = voffset; + } + } //else + //_verticalOffsetStable = true; } void ChatView::mouseMoveWhileSelecting(const QPointF &scenePos) { diff --git a/src/qtui/chatview.h b/src/qtui/chatview.h index 3c2eba13..4e88d95c 100644 --- a/src/qtui/chatview.h +++ b/src/qtui/chatview.h @@ -80,6 +80,10 @@ private: QTimer _scrollTimer; int _scrollOffset; bool _invalidateFilter; + + // workaround for QTBUG-6322 + qreal _verticalOffset; + bool _verticalOffsetStable; };