summaryrefslogtreecommitdiffhomepage
path: root/compat/qt-signal.hpp
blob: 1b4e94d2a97e865dc0c7b447ddbefcdbac6542ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#pragma once

// this is to avoid dealing with QMetaObject for the time being -sh 20190203

#include "export.hpp"
namespace options { class slider_value; }
#include <QObject>
#include <QList>

namespace _qt_sig_impl {

template<typename t> struct sig;

class OTR_COMPAT_EXPORT sig_void final : public QObject
{
    Q_OBJECT

public:
    template<typename t, typename F>
    sig_void(t* datum, F&& f, Qt::ConnectionType conntype = Qt::AutoConnection) : QObject(datum)
    {
        connect(this, &sig_void::notify, datum, f, conntype);
    }
    sig_void(QObject* parent = nullptr);
    void operator()() const { notify(); }

signals:
    void notify() const;
};

template<> struct sig<void> { using t = sig_void; };

#ifndef OTR_GENERATE_SIGNAL3
#   define OTR_GENERATE_SIGNAL3(x)
#endif
#define OTR_GENERATE_SIGNAL2(type)                                                                              \
    class OTR_COMPAT_EXPORT sig_##type final : public QObject                                               \
    {                                                                                                           \
        Q_OBJECT                                                                                                \
        public:                                                                                                 \
            template<typename t, typename F>                                                                    \
            sig_##type(t* datum, F&& f, Qt::ConnectionType conntype = Qt::AutoConnection) : QObject(datum)  \
            {                                                                                                   \
                connect(this, &sig_##type::notify, datum, f, conntype);                                     \
            }                                                                                                   \
            sig_##type(QObject* parent = nullptr) : QObject(parent) {}                                      \
            void operator()(const type& x) const;                                                               \
        Q_SIGNALS:                                                                                              \
            void notify(const type& x) const;                                                                   \
    };                                                                                                          \
    OTR_GENERATE_SIGNAL3(type)

#   define OTR_GENERATE_SIGNAL(type)                                                \
       OTR_GENERATE_SIGNAL2(type);                                                  \
       using qlist##type = QList<type>;                                             \
       OTR_GENERATE_SIGNAL2(qlist##type);                                           \
       template<> struct sig<type> { using t = sig_##type; };                       \
       template<> struct sig<qlist##type> { using t = qlist##type; }

using slider_value = options::slider_value;

OTR_GENERATE_SIGNAL(int);
OTR_GENERATE_SIGNAL(double);
OTR_GENERATE_SIGNAL(float);
OTR_GENERATE_SIGNAL(bool);
OTR_GENERATE_SIGNAL(QString);
OTR_GENERATE_SIGNAL(slider_value);
OTR_GENERATE_SIGNAL(QPointF);
OTR_GENERATE_SIGNAL(QVariant);

} // namespace _qt_sig_impl

#undef OTR_GENERATE_SIGNAL2
#undef OTR_GENERATE_SIGNAL

template<typename t> using qt_signal = typename _qt_sig_impl::sig<t>::t;