Use ListView without scrollview for messages
That way we can autohide the scollbar if needed, it should fix some
jumping issues, it makes it possible to flick on mobile, etc.
Some related bugs:
https://bugreports.qt.io/browse/QTBUG-75223
https://bugreports.qt.io/browse/QTBUG-44902
1 files changed, 61 insertions, 0 deletions
diff --git a/src/ui/NhekoEventObserver.cpp b/src/ui/NhekoEventObserver.cpp
new file mode 100644
index 00000000..5e67cec4
--- /dev/null
+++ b/src/ui/NhekoEventObserver.cpp
@@ -0,0 +1,61 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+// SPDX-FileCopyrightText: 2022 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "NhekoEventObserver.h"
+
+#include <QMouseEvent>
+
+#include "Logging.h"
+
+NhekoEventObserver::NhekoEventObserver(QQuickItem *parent)
+ : QQuickItem(parent)
+{
+ setFiltersChildMouseEvents(true);
+}
+
+bool
+NhekoEventObserver::childMouseEventFilter(QQuickItem * /*item*/, QEvent *event)
+{
+ // nhlog::ui()->debug("Touched {}", item->metaObject()->className());
+
+ auto setTouched = [this](bool touched) {
+ if (touched != this->wasTouched_) {
+ this->wasTouched_ = touched;
+ emit wasTouchedChanged();
+ }
+ };
+
+ // see
+ // https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quicktemplates2/qquickscrollview.cpp?id=7f29e89c26ae2babc358b1c4e6f965af6ec759f4#n471
+ switch (event->type()) {
+ case QEvent::TouchBegin:
+ case QEvent::TouchEnd:
+ setTouched(true);
+ break;
+
+ case QEvent::MouseButtonPress:
+ if (static_cast<QMouseEvent *>(event)->source() == Qt::MouseEventNotSynthesized) {
+ setTouched(false);
+ }
+ break;
+
+ case QEvent::MouseMove:
+ case QEvent::MouseButtonRelease:
+ if (static_cast<QMouseEvent *>(event)->source() == Qt::MouseEventNotSynthesized)
+ setTouched(false);
+ break;
+
+ case QEvent::HoverEnter:
+ case QEvent::HoverMove:
+ case QEvent::Wheel:
+ setTouched(false);
+ break;
+
+ default:
+ break;
+ }
+
+ return false;
+}
|