From 77a1aecf1adfefc7fb429a0ff00f3025d9f85b59 Mon Sep 17 00:00:00 2001 From: peri4 Date: Mon, 1 Mar 2021 01:34:34 +0300 Subject: [PATCH] add PIQCONNECT, PIQCONNECT_QUEUED and QPICONNECT --- CMakeLists.txt | 4 +- libs/piqt/piqt.h | 1 + libs/piqt/piqt_macros.h | 137 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 libs/piqt/piqt_macros.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 298ac56..f2c6f87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.0) cmake_policy(SET CMP0017 NEW) # need include() with .cmake project(qad) set(qad_MAJOR 1) -set(qad_MINOR 17) -set(qad_REVISION 1) +set(qad_MINOR 18) +set(qad_REVISION 0) set(qad_SUFFIX ) set(qad_COMPANY SHS) set(qad_DOMAIN org.SHS) diff --git a/libs/piqt/piqt.h b/libs/piqt/piqt.h index 71e6493..7454f59 100644 --- a/libs/piqt/piqt.h +++ b/libs/piqt/piqt.h @@ -29,6 +29,7 @@ #if QT_VERSION >= 0x050200 # include "pigeoposition.h" #endif +#include "piqt_macros.h" #include "qad_piqt_export.h" diff --git a/libs/piqt/piqt_macros.h b/libs/piqt/piqt_macros.h new file mode 100644 index 0000000..0f0d0a7 --- /dev/null +++ b/libs/piqt/piqt_macros.h @@ -0,0 +1,137 @@ +/* + PIQt - PIP <-> Qt convertions + + Ivan Pelipenko peri4ko@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef PIQT_MACROS_H +#define PIQT_MACROS_H + +#include +#include +#include "qad_piqt_export.h" + + +/// connect PIP event "event" of object "src" directly to Qt slot "slot" of object "tgt" +/// e.g. PIQCONNECT(&pip_obj, someEvent, &qt_obj, someSlot) +#define PIQCONNECT(src, event, tgt, slot) \ + __piqConnect(src, #event, &(src)->__stat_eh_##event##__, tgt, &decltype(__removePtr__(tgt))::slot); + +/// connect PIP event "event" of object "src" to Qt slot "slot" of object "tgt" via Qt::QueuedConnection +/// Note! All argument types must be registered in Qt meta-system! +/// e.g. PIQCONNECT_QUEUED(&pip_obj, someEvent, &qt_obj, someSlot) +#define PIQCONNECT_QUEUED(src, event, tgt, slot) \ + __piqConnectQ(src, #event, &(src)->__stat_eh_##event##__, tgt, #slot); + + +/// connect Qt signal "sig" of object "src" directly to PIP event handler "handler" of object "tgt" +/// e.g. QPICONNECT(&qt_obj, someSignal, &pip_obj, someHandler) +#define QPICONNECT(src, sig, tgt, handler) \ + __qpiConnect(src, &decltype(__removePtr__(src))::sig, tgt, &(tgt)->__stat_eh_##handler##__); + + +template T __removePtr__(T*) {} + + +template +void __piqConnect(PIObject * source, const char * event, void(*func)(void*), O * target, SR(O::*slot)()) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](){(target->*slot)();}), LOCATION); +} +template +void __piqConnect(PIObject * source, const char * event, void(*func)(void*,T1), O * target, SR(O::*slot)(T1)) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1){(target->*slot)(v1);}), LOCATION); +} +template +void __piqConnect(PIObject * source, const char * event, void(*func)(void*,T1,T2), O * target, SR(O::*slot)(T1, T2)) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2){(target->*slot)(v1, v2);}), LOCATION); +} +template +void __piqConnect(PIObject * source, const char * event, void(*func)(void*,T1,T2,T3), O * target, SR(O::*slot)(T1, T2, T3)) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2, T3 v3){(target->*slot)(v1, v2, v3);}), LOCATION); +} +template +void __piqConnect(PIObject * source, const char * event, void(*func)(void*,T1,T2,T3,T4), O * target, SR(O::*slot)(T1, T2, T3, T4)) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2, T3 v3, T4 v4){(target->*slot)(v1, v2, v3, v4);}), LOCATION); +} + + +inline void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*), QObject * target, const char * slot) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](){ + QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection); + }), LOCATION); +} +template +void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*,T1), QObject * target, const char * slot) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1){ + //QMetaObject::invokeMethod(target, slot, (Qt::ConnectionType)type, QArgument(__PIVariantFunctions__::typeNameHelper().dataAscii(), v1)); + QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, + QArgument(QMetaType::typeName(qMetaTypeId()), v1)); + }), LOCATION); +} +template +void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*,T1,T2), QObject * target, const char * slot) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2){ + QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, + QArgument(QMetaType::typeName(qMetaTypeId()), v1), + QArgument(QMetaType::typeName(qMetaTypeId()), v2)); + }), LOCATION); +} +template +void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*,T1,T2,T3), QObject * target, const char * slot) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2, T3 v3){ + QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, + QArgument(QMetaType::typeName(qMetaTypeId()), v1), + QArgument(QMetaType::typeName(qMetaTypeId()), v2), + QArgument(QMetaType::typeName(qMetaTypeId()), v3)); + }), LOCATION); +} +template +void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*,T1,T2,T3,T4), QObject * target, const char * slot) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2, T3 v3, T4 v4){ + QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, + QArgument(QMetaType::typeName(qMetaTypeId()), v1), + QArgument(QMetaType::typeName(qMetaTypeId()), v2), + QArgument(QMetaType::typeName(qMetaTypeId()), v3), + QArgument(QMetaType::typeName(qMetaTypeId()), v4)); + }), LOCATION); +} + + + + +template +void __qpiConnect(O * source, SR(O::*signal)(), PIObject * target, void(*handler)(void*)) { + QObject::connect(source, signal, source, [target,handler](){handler(target);}); +} +template +void __qpiConnect(O * source, SR(O::*signal)(T1), PIObject * target, void(*handler)(void*,T1)) { + QObject::connect(source, signal, source, [target,handler](T1 v1){handler(target, v1);}); +} +template +void __qpiConnect(O * source, SR(O::*signal)(T1,T2), PIObject * target, void(*handler)(void*,T1,T2)) { + QObject::connect(source, signal, source, [target,handler](T1 v1, T2 v2){handler(target, v1, v2);}); +} +template +void __qpiConnect(O * source, SR(O::*signal)(T1,T2,T3), PIObject * target, void(*handler)(void*,T1,T2,T3)) { + QObject::connect(source, signal, source, [target,handler](T1 v1, T2 v2, T3 v3){handler(target, v1, v2, v3);}); +} +template +void __qpiConnect(O * source, SR(O::*signal)(T1,T2,T3,T4), PIObject * target, void(*handler)(void*,T1,T2,T3,T4)) { + QObject::connect(source, signal, source, [target,handler](T1 v1, T2 v2, T3 v3, T4 v4){handler(target, v1, v2, v3, v4);}); +} + + +#endif // PIQT_MACROS_H