From 50a33d5d9aa9f25b6aa7a81a3748d41df38e3bb0 Mon Sep 17 00:00:00 2001 From: Valentin Bruch Date: Fri, 2 Sep 2022 20:45:35 +0200 Subject: [PATCH] allow global keyboard shortcuts in all widgets by default Master filters events in all widgets. For key press events, it is checked whether the widget handles the event itself. If not, Master handles it. --- src/gui/thumbnailbutton.cpp | 2 +- src/master.cpp | 19 ++++++++++++++----- src/master.h | 8 ++++---- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/gui/thumbnailbutton.cpp b/src/gui/thumbnailbutton.cpp index 652988b7..b63f4638 100644 --- a/src/gui/thumbnailbutton.cpp +++ b/src/gui/thumbnailbutton.cpp @@ -27,7 +27,7 @@ void ThumbnailButton::mouseReleaseEvent(QMouseEvent *event) void ThumbnailButton::focusInEvent(QFocusEvent*) { - setFrameStyle(QFrame::Panel); + setFrameStyle(QFrame::Panel | QFrame::Plain); setLineWidth(2); QPalette palette; palette.setColor(QPalette::WindowText, Qt::red); diff --git a/src/master.cpp b/src/master.cpp index a2d54fb6..53dee5cb 100644 --- a/src/master.cpp +++ b/src/master.cpp @@ -475,7 +475,6 @@ QWidget* Master::createWidget(QJsonObject &object, QWidget *parent) // Mute slides by default, except if they are marked as master. if (!object.value("mute").toBool(!object.value("master").toBool(false))) scene->flags() &= ~SlideScene::MuteSlide; - connect(slide, &SlideView::sendKeyEvent, this, &Master::receiveKeyEvent); connect(slide, &SlideView::sendAction, this, &Master::handleAction); connect(scene, &SlideScene::navigationToViews, slide, &SlideView::pageChanged, Qt::DirectConnection); widget = slide; @@ -605,6 +604,7 @@ QWidget* Master::createWidget(QJsonObject &object, QWidget *parent) } if (widget) { + widget->installEventFilter(this); // Add keyboard shortcut. if (object.contains("keys")) { @@ -641,17 +641,24 @@ void Master::showAll() const } } -void Master::receiveKeyEvent(const QKeyEvent* event) +bool Master::eventFilter(QObject *obj, QEvent *event) { + if (event->type() != QEvent::KeyPress) + return QObject::eventFilter(obj, event); + event->ignore(); + obj->event(event); + if (event->isAccepted()) + return true; + const auto *kevent = static_cast(event); #if (QT_VERSION_MAJOR >= 6) - const QKeySequence key_code(event->keyCombination()); + const QKeySequence key_code(kevent->keyCombination()); #else - const quint32 key_code = event->key() | (event->modifiers() & ~Qt::KeypadModifier); + const quint32 key_code = kevent->key() | (kevent->modifiers() & ~Qt::KeypadModifier); #endif // Search shortcuts for given key sequence. { QWidget* widget = shortcuts.value(key_code); - debug_msg(DebugKeyInput, "Key action:" << widget << event << (event->key() | (event->modifiers() & ~Qt::KeypadModifier))); + debug_msg(DebugKeyInput, "Key action:" << widget << kevent << (kevent->key() | (kevent->modifiers() & ~Qt::KeypadModifier))); if (widget) { widget->show(); @@ -692,6 +699,8 @@ void Master::receiveKeyEvent(const QKeyEvent* event) setTool(new Tool(*tool)); } } + event->accept(); + return true; } void Master::nextSlide() const noexcept diff --git a/src/master.h b/src/master.h index dfdfa7d2..96fc0720 100644 --- a/src/master.h +++ b/src/master.h @@ -99,11 +99,11 @@ class Master : public QObject /// Get open file name from QFileDialog static QString getOpenFileName(); -public slots: - /// Handle key events collected by any other object. - /// By default all key events are redirected to this and handled here. - void receiveKeyEvent(const QKeyEvent* event); +protected: + /// Filter key input events from other widgets + bool eventFilter(QObject *obj, QEvent *event) override; +public slots: /// Read memory size restriction from preferences and distribute memory to pixcaches. void distributeMemory();