/****************************************************************************** * QSkinny - Copyright (C) 2016 Uwe Rathmann * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ #include "Invoker.h" #include Invoker::Invoker( QObject* parent ): QObject( parent ) { } void Invoker::addCallback( const QObject* object, const QskMetaFunction& function ) { m_callbacks.append( QskMetaCallback( object, function ) ); } void Invoker::invoke( qreal realValue, int intValue, Qt::ConnectionType connectionType ) { for ( auto& callback : m_callbacks ) { void* args[3] = { nullptr }; const auto types = callback.parameterTypes(); int i = 1; for ( auto type : types ) { switch ( type ) { case QMetaType::Int: { args[i++] = reinterpret_cast< void* >( &intValue ); break; } case QMetaType::Double: { args[i++] = reinterpret_cast< void* >( &realValue ); break; } default: break; } } callback.setConnectionType( connectionType ); const int callType = connectionType & 0x3; switch( callType ) { case Qt::DirectConnection: { callback.invoke( args ); break; } case Qt::QueuedConnection: { if ( callback.object() ) callback.invoke( args ); break; } case Qt::BlockingQueuedConnection: { const auto receiver = callback.object(); if ( receiver && receiver->thread() != QThread::currentThread() ) callback.invoke( args ); break; } } } }