summaryrefslogtreecommitdiffstats
path: root/src/ui/NhekoEventObserver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/NhekoEventObserver.cpp')
-rw-r--r--src/ui/NhekoEventObserver.cpp61
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;
+}