1/****************************************************************************
2**
3** Copyright (C) 2017 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtWaylandCompositor module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QWAYLANDQUICKEXTENSION_H
41#define QWAYLANDQUICKEXTENSION_H
42
43#include <QtWaylandCompositor/QWaylandCompositorExtension>
44#include <QtQml/QQmlParserStatus>
45#include <QtQml/QQmlListProperty>
46
47QT_BEGIN_NAMESPACE
48
49#define Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(className) \
50 class Q_WAYLAND_COMPOSITOR_EXPORT className##QuickExtension : public className, public QQmlParserStatus \
51 { \
52/* qmake ignore Q_OBJECT */ \
53 Q_OBJECT \
54 Q_PROPERTY(QQmlListProperty<QObject> data READ data DESIGNABLE false) \
55 Q_CLASSINFO("DefaultProperty", "data") \
56 Q_INTERFACES(QQmlParserStatus) \
57 public: \
58 QQmlListProperty<QObject> data() \
59 { \
60 return QQmlListProperty<QObject>(this, m_objects); \
61 } \
62 void classBegin() override {} \
63 void componentComplete() override { if (!isInitialized()) initialize(); } \
64 private: \
65 QList<QObject *> m_objects; \
66 };
67
68#define Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CONTAINER_CLASS(className) \
69 class Q_WAYLAND_COMPOSITOR_EXPORT className##QuickExtensionContainer : public className \
70 { \
71/* qmake ignore Q_OBJECT */ \
72 Q_OBJECT \
73 Q_PROPERTY(QQmlListProperty<QWaylandCompositorExtension> extensions READ extensions) \
74 Q_PROPERTY(QQmlListProperty<QObject> data READ data DESIGNABLE false) \
75 Q_CLASSINFO("DefaultProperty", "data") \
76 public: \
77 QQmlListProperty<QObject> data() \
78 { \
79 return QQmlListProperty<QObject>(this, m_objects); \
80 } \
81 QQmlListProperty<QWaylandCompositorExtension> extensions() \
82 { \
83 return QQmlListProperty<QWaylandCompositorExtension>(this, this, \
84 &className##QuickExtensionContainer::append_extension, \
85 &className##QuickExtensionContainer::countFunction, \
86 &className##QuickExtensionContainer::atFunction, \
87 &className##QuickExtensionContainer::clearFunction); \
88 } \
89 static int countFunction(QQmlListProperty<QWaylandCompositorExtension> *list) \
90 { \
91 return static_cast<className##QuickExtensionContainer *>(list->data)->extension_vector.size(); \
92 } \
93 static QWaylandCompositorExtension *atFunction(QQmlListProperty<QWaylandCompositorExtension> *list, int index) \
94 { \
95 return static_cast<className##QuickExtensionContainer *>(list->data)->extension_vector.at(index); \
96 } \
97 static void append_extension(QQmlListProperty<QWaylandCompositorExtension> *list, QWaylandCompositorExtension *extension) \
98 { \
99 className##QuickExtensionContainer *quickExtObj = static_cast<className##QuickExtensionContainer *>(list->data); \
100 extension->setExtensionContainer(quickExtObj); \
101 } \
102 static void clearFunction(QQmlListProperty<QWaylandCompositorExtension> *list) \
103 { \
104 static_cast<className##QuickExtensionContainer *>(list->data)->extension_vector.clear(); \
105 } \
106 private: \
107 QList<QObject *> m_objects; \
108 };
109
110QT_END_NAMESPACE
111
112#endif /*QWAYLANDQUICKEXTENSION_H*/
113