QskShortcutMap::invoke added

This commit is contained in:
Uwe Rathmann 2020-11-09 14:17:54 +01:00
parent 774a34a6b8
commit 650204292c
2 changed files with 52 additions and 4 deletions

View File

@ -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 );

View File

@ -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 );