aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/qqmlpermissions_p.h
blob: 6bba2d1c6ab67d49d664362dfee95f948a175564 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#ifndef QQMLPERMISSIONS_P_H
#define QQMLPERMISSIONS_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

#include <private/qqmlglobal_p.h>

#if QT_CONFIG(permissions)

#include <QtQml/qqmlregistration.h>

#include <QtCore/qpermissions.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qproperty.h>
#include <QtCore/qglobal.h>

#include <QtCore/qcoreapplication.h>

QT_BEGIN_NAMESPACE

#define QML_PERMISSION(Permission) \
    Q_OBJECT \
    QML_NAMED_ELEMENT(Permission) \
public: \
    Q_PROPERTY(Qt::PermissionStatus status READ status NOTIFY statusChanged) \
    Qt::PermissionStatus status() const { return qApp->checkPermission(m_permission); } \
    Q_SIGNAL void statusChanged(); \
    Q_INVOKABLE void request() { \
        const auto previousStatus = status(); \
        qApp->requestPermission(m_permission, this, \
            [this, previousStatus](const QPermission &permission) { \
                if (previousStatus != permission.status()) \
                    emit statusChanged(); \
        }); \
    } \
private: \
    Q##Permission m_permission; \
public:

#define QML_PERMISSION_PROPERTY(PropertyType, getterName, setterName) \
    Q_PROPERTY(PropertyType getterName READ getterName WRITE setterName NOTIFY getterName##Changed) \
    PropertyType getterName() const { return m_permission.getterName(); } \
    void setterName(const PropertyType &value) { \
        const auto previousValue = m_permission.getterName(); \
        const auto previousStatus = status(); \
        m_permission.setterName(value); \
        if (m_permission.getterName() != previousValue) { \
            emit getterName##Changed(); \
            if (status() != previousStatus) \
                emit statusChanged(); \
        } \
    } \
    Q_SIGNAL void getterName##Changed();


struct QQmlQLocationPermission : public QObject
{
    QML_PERMISSION(LocationPermission)
    QML_ADDED_IN_VERSION(6, 6)
    QML_EXTENDED_NAMESPACE(QLocationPermission)
    QML_PERMISSION_PROPERTY(QLocationPermission::Availability, availability, setAvailability)
    QML_PERMISSION_PROPERTY(QLocationPermission::Accuracy, accuracy, setAccuracy)
};

struct QQmlCalendarPermission : public QObject
{
    QML_PERMISSION(CalendarPermission)
    QML_ADDED_IN_VERSION(6, 6)
    QML_EXTENDED_NAMESPACE(QCalendarPermission)
    QML_PERMISSION_PROPERTY(QCalendarPermission::AccessMode, accessMode, setAccessMode)
};

struct QQmlContactsPermission : public QObject
{
    QML_PERMISSION(ContactsPermission)
    QML_ADDED_IN_VERSION(6, 6)
    QML_EXTENDED_NAMESPACE(QContactsPermission)
    QML_PERMISSION_PROPERTY(QContactsPermission::AccessMode, accessMode, setAccessMode)
};

struct QQmlBluetoothPermission : public QObject
{
    QML_PERMISSION(BluetoothPermission)
    QML_ADDED_IN_VERSION(6, 6)
    QML_EXTENDED_NAMESPACE(QBluetoothPermission)
    QML_PERMISSION_PROPERTY(QBluetoothPermission::CommunicationModes, communicationModes, setCommunicationModes)
};

struct QQmlCameraPermission : public QObject
{
    QML_PERMISSION(CameraPermission)
    QML_ADDED_IN_VERSION(6, 6)
};

struct QQmlMicrophonePermission : public QObject
{
    QML_PERMISSION(MicrophonePermission)
    QML_ADDED_IN_VERSION(6, 6)
};

QT_END_NAMESPACE

#endif // QT_CONFIG(permissions)

#endif // QQMLPERMISSIONS_P_H