This commit is contained in:
Uwe Rathmann 2020-11-11 08:50:40 +01:00
commit b53eaaaa95
3 changed files with 53 additions and 13 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 );

View File

@ -7,6 +7,7 @@
#include "QskAnimationHint.h"
#include "QskAspect.h"
#include "QskIntervalF.h"
#include "QskEvent.h"
QSK_SUBCONTROL( QskSlider, Panel )
QSK_SUBCONTROL( QskSlider, Groove )
@ -24,15 +25,6 @@ static inline QskAspect::Aspect qskAspectPosition( const QskSlider* slider )
return slider->effectiveSubcontrol( QskSlider::Handle ) | Position | Metric;
}
static inline QPointF qskMousePosition( const QMouseEvent* event )
{
#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 )
return event->position();
#else
return event->localPos();
#endif
}
class QskSlider::PrivateData
{
public: