+bool ChatView::event(QEvent* event)
+{
+ if (event->type() == QEvent::KeyPress) {
+ auto* keyEvent = static_cast<QKeyEvent*>(event);
+ switch (keyEvent->key()) {
+ case Qt::Key_Up:
+ case Qt::Key_Down:
+ case Qt::Key_PageUp:
+ case Qt::Key_PageDown:
+ if (!verticalScrollBar()->isVisible()) {
+ scene()->requestBacklog();
+ return true;
+ }
+ default:
+ break;
+ }
+ }
+
+ if (event->type() == QEvent::TouchBegin && ((QTouchEvent*)event)->device()->type() == QTouchDevice::TouchScreen) {
+ // 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 (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) {
+ // 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 = qAbs(p.lastPos().x() - p.pos().x());
+ double dy = qAbs(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 && ((QTouchEvent*)event)->device()->type() == QTouchDevice::TouchScreen)
+ || event->type() == QEvent::TouchUpdate) {
+ if (!verticalScrollBar()->isVisible()) {
+ scene()->requestBacklog();
+ return true;
+ }
+ }
+
+ if (event->type() == QEvent::Show) {
+ if (_invalidateFilter)
+ invalidateFilter();
+ }
+
+ return QGraphicsView::event(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);