From 650204292c3c719bf6fa788b667ab76afb381ed3 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 9 Nov 2020 14:17:54 +0100 Subject: [PATCH] QskShortcutMap::invoke added --- src/controls/QskShortcutMap.cpp | 52 ++++++++++++++++++++++++++++++--- src/controls/QskShortcutMap.h | 4 +++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/controls/QskShortcutMap.cpp b/src/controls/QskShortcutMap.cpp index ee52d23b..53e14f69 100644 --- a/src/controls/QskShortcutMap.cpp +++ b/src/controls/QskShortcutMap.cpp @@ -35,6 +35,7 @@ class QskShortcutHandler final : public QObject void setAutoRepeat( int id, bool repeat ); bool eventFilter( QObject*, QEvent* ) override; + bool invoke( QQuickItem*, const QKeySequence& ); private: void cleanUp( QObject* ); @@ -48,6 +49,16 @@ class QskShortcutHandler final : public QObject { } + void invoke() const + { + auto that = const_cast< InvokeData* >( this ); + auto object = const_cast< QObject* >( receiver ); + + void* args[] = { nullptr }; + that->invokable.invoke( object, args, Qt::AutoConnection ); + } + + QKeySequence sequence; QQuickItem* item; const QObject* receiver; QskMetaInvokable invokable; @@ -132,6 +143,7 @@ int QskShortcutHandler::insert( auto& data = m_invokeDataMap[ id ]; + data.sequence = sequence; data.item = item; data.receiver = receiver; data.invokable = invokable; @@ -240,10 +252,7 @@ bool QskShortcutHandler::eventFilter( QObject* object, QEvent* event ) Q_ASSERT( data.item == nullptr || data.item == object ); - auto receiver = const_cast< QObject* >( data.receiver ); - void* args[] = { nullptr }; - - data.invokable.invoke( receiver, args, Qt::AutoConnection ); + data.invoke( ); return true; } @@ -252,6 +261,24 @@ bool QskShortcutHandler::eventFilter( QObject* object, QEvent* event ) return false; } +bool QskShortcutHandler::invoke( QQuickItem* item, const QKeySequence& sequence ) +{ + bool found = false; + + for ( const auto& entry : qskAsConst( m_invokeDataMap ) ) + { + auto& data = entry.second; + + if ( ( data.item == item ) && ( data.sequence == sequence ) ) + { + data.invoke(); + found = true; + } + } + + return found; +} + int QskShortcutMap::addMethod( QQuickItem* item, const QKeySequence& sequence, bool autoRepeat, const QObject* receiver, const char* method ) { @@ -279,6 +306,23 @@ int QskShortcutMap::addFunction( QQuickItem* item, const QKeySequence& sequence, item, sequence, autoRepeat, receiver, function ); } +bool QskShortcutMap::invokeCallback( const QKeySequence& sequence ) +{ + QQuickItem* item = nullptr; + return qskShortcutHandler->invoke( item, sequence ); +} + +bool QskShortcutMap::invokeCallback( QQuickWindow* window, const QKeySequence& sequence ) +{ + auto item = window ? window->contentItem() : nullptr; + return qskShortcutHandler->invoke( item, sequence ); +} + +bool QskShortcutMap::invokeCallback( QQuickItem* item, const QKeySequence& sequence ) +{ + return qskShortcutHandler->invoke( item, sequence ); +} + void QskShortcutMap::setAutoRepeat( int id, bool on ) { qskShortcutHandler->setAutoRepeat( id, on ); diff --git a/src/controls/QskShortcutMap.h b/src/controls/QskShortcutMap.h index e22675a0..8cc352ee 100644 --- a/src/controls/QskShortcutMap.h +++ b/src/controls/QskShortcutMap.h @@ -64,6 +64,10 @@ class QSK_EXPORT QskShortcutMap static int addShortcut( QQuickWindow*, const QKeySequence&, bool autoRepeat, const typename QtPrivate::FunctionPointer< T >::Object* receiver, T function ); + // calling the registered callbacks manually + static bool invokeCallback( const QKeySequence& ); + static bool invokeCallback( QQuickWindow*, const QKeySequence& ); + static bool invokeCallback( QQuickItem*, const QKeySequence& ); static bool contextMatcher( const QQuickItem*, Qt::ShortcutContext );