X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatview.cpp;h=c6e6209502dd5f3dd1b268fb45fe238b011caee9;hp=b40b29009c023b45a75920936c45764e7bdcbecb;hb=d57c91811b8f989bcaa4d5a238c65e9ffcc3b1d4;hpb=777799ecd614503b20c0fc9d31223556ecc6078b diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index b40b2900..c6e62095 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2014 by the Quassel Project * + * Copyright (C) 2005-2016 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -59,6 +59,7 @@ void ChatView::init(MessageFilter *filter) _currentScaleFactor = 1; _invalidateFilter = false; + setAttribute(Qt::WA_AcceptTouchEvents); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); setAlignment(Qt::AlignLeft|Qt::AlignBottom); @@ -80,7 +81,7 @@ void ChatView::init(MessageFilter *filter) setScene(_scene); connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(verticalScrollbarChanged(int))); - _lastScrollbarPos = verticalScrollBar()->value(); + _lastScrollbarPos = verticalScrollBar()->maximum(); connect(Client::networkModel(), SIGNAL(markerLineSet(BufferId, MsgId)), SLOT(markerLineSet(BufferId, MsgId))); @@ -108,7 +109,44 @@ bool ChatView::event(QEvent *event) } } - if (event->type() == QEvent::Wheel) { + if (event->type() == QEvent::TouchBegin) { + // Enable scrolling by draging, disable selecting/clicking content + setDragMode(QGraphicsView::ScrollHandDrag); + setInteractive(false); + // if scrollbar is not visible we need to request backlog below else we need to accept + // the event now (return true) so that we will receive TouchUpdate and TouchEnd/TouchCancel + if (verticalScrollBar()->isVisible()) return true; + } + +#if QT_VERSION >= 0x050000 + if (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) { +#else + if (event->type() == QEvent::TouchEnd) { +#endif + // End scroll and reset settings to default + setDragMode(QGraphicsView::NoDrag); + setInteractive(true); + _firstTouchUpdateHappened = false; + return true; + } + + if (event->type() == QEvent::TouchUpdate) { + if (!_firstTouchUpdateHappened) { + // After the first movement of a Touch-Point, calculate the distance in both axis + // and if the point moved more horizontally abort scroll. + QTouchEvent::TouchPoint p = ((QTouchEvent*)event)->touchPoints().at(0); + double dx = abs (p.lastPos().x() - p.pos().x()); + double dy = abs (p.lastPos().y() - p.pos().y()); + if (dx > dy) { + setDragMode(QGraphicsView::NoDrag); + setInteractive(true); + } + _firstTouchUpdateHappened = true; + } + // Applying the movement happens automatically by the drag-mode + } + + if (event->type() == QEvent::Wheel || event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate) { if (!verticalScrollBar()->isVisible()) { scene()->requestBacklog(); return true; @@ -126,11 +164,26 @@ bool ChatView::event(QEvent *event) void ChatView::resizeEvent(QResizeEvent *event) { + // if view is currently scrolled to bottom, we want it that way after resizing + bool atBottom = (_lastScrollbarPos == verticalScrollBar()->maximum()); + QGraphicsView::resizeEvent(event); + // if scrolling to bottom, do it immediately. + if(atBottom) + { + // we can reduce viewport updates if we scroll to the bottom allready at the beginning + verticalScrollBar()->setValue(verticalScrollBar()->maximum()); + } + scene()->updateForViewport(viewport()->width(), viewport()->height()); adjustSceneRect(); + if(atBottom) + { + _lastScrollbarPos = verticalScrollBar()->maximum(); + verticalScrollBar()->setValue(verticalScrollBar()->maximum()); + } checkChatLineCaches(); }