homescreens/folio: Block propagation if edit mode is active to avoid widget to trigger event

Fixes https://invent.kde.org/plasma/plasma-mobile/-/issues/387 and https://invent.kde.org/plasma/plasma-mobile/-/issues/353

I can't only block the touch events because it blocks also MouseEvent.
> I think because it's used to convert it by QT into Mouse Event with source == MouseEventSynthesizedByQt or MouseEventSynthesizedBySystem.

So the solution, it's to check if mouse event is a synthetized event and if edit mode has been triggered to block or not the event propagation

Test:

- On VM with kwin_wayland command
- On mobile
This commit is contained in:
Florian RICHER (aka MrDev023) 2025-06-18 11:53:15 +02:00 committed by Devin Lin
parent 3f3f4c9630
commit 43672a5ec5
2 changed files with 36 additions and 0 deletions

View file

@ -57,6 +57,11 @@ bool WidgetContainer::childMouseEventFilter(QQuickItem *item, QEvent *event)
switch (event->type()) {
case QEvent::MouseButtonPress: {
QMouseEvent *me = static_cast<QMouseEvent *>(event);
if (!validMouseEvent(me)) {
return true;
}
if (me->buttons() & Qt::LeftButton) {
mousePressEvent(me);
}
@ -64,11 +69,21 @@ bool WidgetContainer::childMouseEventFilter(QQuickItem *item, QEvent *event)
}
case QEvent::MouseMove: {
QMouseEvent *me = static_cast<QMouseEvent *>(event);
if (!validMouseEvent(me)) {
return true;
}
mouseMoveEvent(me);
break;
}
case QEvent::MouseButtonRelease: {
QMouseEvent *me = static_cast<QMouseEvent *>(event);
if (!validMouseEvent(me)) {
return true;
}
mouseReleaseEvent(me);
break;
}
@ -129,3 +144,22 @@ void WidgetContainer::onActiveFocusChanged(bool activeFocus)
setEditMode(false);
}
}
bool WidgetContainer::validMouseEvent(QMouseEvent *event)
{
bool synthesized = event->source() == Qt::MouseEventSynthesizedByQt || event->source() == Qt::MouseEventSynthesizedBySystem;
// Don't need to block propagated events
if (!synthesized || event->type() != QEvent::MouseButtonRelease) {
return true;
}
// If edit mode is not enabled, let the event propagate
if (!m_editMode) {
return true;
} else {
// If edit mode is enabled, block the event propagation and handle it only on the WidgetContainer
mouseReleaseEvent(event);
return false;
}
}

View file

@ -37,6 +37,8 @@ private Q_SLOTS:
void onActiveFocusChanged(bool activeFocus);
private:
bool validMouseEvent(QMouseEvent *event);
bool m_pressed{false};
bool m_editMode{false};
QTimer *m_pressAndHoldTimer{nullptr};