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