mirror of https://github.com/Nheko-Reborn/nheko
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-44902fix-touch-scrolling
parent
0629ea5932
commit
f7ea4c604c
File diff suppressed because it is too large
Load Diff
@ -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; |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <QQuickItem> |
||||||
|
|
||||||
|
class NhekoEventObserver : public QQuickItem |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
Q_PROPERTY(bool wasTouched READ wasTouched NOTIFY wasTouchedChanged) |
||||||
|
|
||||||
|
public: |
||||||
|
explicit NhekoEventObserver(QQuickItem *parent = 0); |
||||||
|
|
||||||
|
bool childMouseEventFilter(QQuickItem *item, QEvent *event) override; |
||||||
|
|
||||||
|
private: |
||||||
|
bool wasTouched() { return wasTouched_; } |
||||||
|
|
||||||
|
bool wasTouched_ = false; |
||||||
|
|
||||||
|
signals: |
||||||
|
void wasTouchedChanged(); |
||||||
|
}; |
Loading…
Reference in new issue