summaryrefslogtreecommitdiffstats
path: root/src/shared-main-lib/applicationmanagerwindow.h
blob: 9bfe665acdd3ae3556b15a2d08dfaf52eb0c039e (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
// Copyright (C) 2023 The Qt Company Ltd.
// Copyright (C) 2019 Luxoft Sweden AB
// Copyright (C) 2018 Pelagicore AG
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#pragma once

#include <memory>

#include <QtGui/QColor>
#include <QtGui/QWindow>
#include <QtQml/QQmlParserStatus>
#include <QtQml/QQmlListProperty>
#include <QtQml/QQmlEngine>
#include <QtQuick/QQuickWindow>
#include <QtAppManCommon/global.h>


QT_FORWARD_DECLARE_CLASS(QQmlComponentAttached)
QT_FORWARD_DECLARE_CLASS(QQuickItem)

QT_BEGIN_NAMESPACE_AM

class ApplicationManagerWindowImpl;
class ApplicationManagerWindowAttached;
class ApplicationManagerWindowAttachedImpl;


class ApplicationManagerWindow : public QObject, public QQmlParserStatus
{
    Q_OBJECT
    Q_INTERFACES(QQmlParserStatus)
    QML_ATTACHED(QtAM::ApplicationManagerWindowAttached)
    Q_PROPERTY(bool inProcess READ isInProcess CONSTANT FINAL)
    Q_PROPERTY(QObject *backingObject READ backingObject CONSTANT FINAL)
    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged FINAL)
    Q_PROPERTY(QQuickItem *contentItem READ contentItem CONSTANT FINAL)

    // QWindow properties
    Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged FINAL)
    Q_PROPERTY(int x READ x WRITE setX NOTIFY xChanged FINAL)
    Q_PROPERTY(int y READ y WRITE setY NOTIFY yChanged FINAL)
    Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged FINAL)
    Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightChanged FINAL)
    Q_PROPERTY(int minimumWidth READ minimumWidth WRITE setMinimumWidth NOTIFY minimumWidthChanged FINAL)
    Q_PROPERTY(int minimumHeight READ minimumHeight WRITE setMinimumHeight NOTIFY minimumHeightChanged FINAL)
    Q_PROPERTY(int maximumWidth READ maximumWidth WRITE setMaximumWidth NOTIFY maximumWidthChanged FINAL)
    Q_PROPERTY(int maximumHeight READ maximumHeight WRITE setMaximumHeight NOTIFY maximumHeightChanged FINAL)
    Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL)
    Q_PROPERTY(bool active READ isActive NOTIFY activeChanged FINAL)
    Q_PROPERTY(QWindow::Visibility visibility READ visibility WRITE setVisibility NOTIFY visibilityChanged FINAL)
    Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged FINAL)
    Q_PROPERTY(QQuickItem *activeFocusItem READ activeFocusItem NOTIFY activeFocusItemChanged FINAL)

    Q_PROPERTY(QQmlListProperty<QObject> data READ data NOTIFY dataChanged FINAL)

    Q_CLASSINFO("DefaultProperty", "data")

public:
    explicit ApplicationManagerWindow(QObject *parent = nullptr);
    ~ApplicationManagerWindow() override;

    static ApplicationManagerWindowAttached *qmlAttachedProperties(QObject *object);

    bool isInProcess() const;
    QObject *backingObject() const;

    QQmlListProperty<QObject> data();
    Q_SIGNAL void dataChanged();

    QQuickItem *contentItem();

    void classBegin() override;
    void componentComplete() override;

    QString title() const;
    void setTitle(const QString &title);
    Q_SIGNAL void titleChanged();
    int x() const;
    void setX(int x);
    Q_SIGNAL void xChanged();
    int y() const;
    void setY(int y);
    Q_SIGNAL void yChanged();
    int width() const;
    void setWidth(int w);
    Q_SIGNAL void widthChanged();
    int height() const;
    void setHeight(int h);
    Q_SIGNAL void heightChanged();
    int minimumWidth() const;
    void setMinimumWidth(int minw);
    Q_SIGNAL void minimumWidthChanged();
    int minimumHeight() const;
    void setMinimumHeight(int minh);
    Q_SIGNAL void minimumHeightChanged();
    int maximumWidth() const;
    void setMaximumWidth(int maxw);
    Q_SIGNAL void maximumWidthChanged();
    int maximumHeight() const;
    void setMaximumHeight(int maxh);
    Q_SIGNAL void maximumHeightChanged();
    bool isVisible() const;
    void setVisible(bool visible);
    Q_SIGNAL void visibleChanged();
    qreal opacity() const;
    void setOpacity(qreal opacity);
    Q_SIGNAL void opacityChanged();
    QColor color() const;
    void setColor(const QColor &c);
    Q_SIGNAL void colorChanged();
    bool isActive() const;
    Q_SIGNAL void activeChanged();
    QQuickItem *activeFocusItem() const;
    Q_SIGNAL void activeFocusItemChanged();
    QWindow::Visibility visibility() const;
    void setVisibility(QWindow::Visibility newVisibility);
    Q_SIGNAL void visibilityChanged(QWindow::Visibility newVisibility);

    Q_INVOKABLE bool setWindowProperty(const QString &name, const QVariant &value);
    Q_INVOKABLE QVariant windowProperty(const QString &name) const;
    Q_INVOKABLE QVariantMap windowProperties() const;
    Q_SIGNAL void windowPropertyChanged(const QString &name, const QVariant &value);

    Q_INVOKABLE void close();
    Q_SIGNAL void closing(QQuickCloseEvent *close);
    Q_INVOKABLE void hide();
    Q_INVOKABLE void show();
    Q_INVOKABLE void showFullScreen();
    Q_INVOKABLE void showMinimized();
    Q_INVOKABLE void showMaximized();
    Q_INVOKABLE void showNormal();

    // pass-through signals and slots from/to the actual QQuickWindow
    Q_SIGNAL void frameSwapped();
    Q_SIGNAL void afterAnimating();
    Q_SIGNAL void sceneGraphError(QQuickWindow::SceneGraphError error, const QString &message);

    ApplicationManagerWindowImpl *implementation();

protected:
    std::unique_ptr<ApplicationManagerWindowImpl> m_impl;

private:
    static void data_append(QQmlListProperty<QObject> *property, QObject *object);
    static qsizetype data_count(QQmlListProperty<QObject> *property);
    static QObject *data_at(QQmlListProperty<QObject> *property, qsizetype index);
    static void data_clear(QQmlListProperty<QObject> *property);

    Q_DISABLE_COPY_MOVE(ApplicationManagerWindow)
};

class ApplicationManagerWindowAttached : public QObject
{
    Q_OBJECT
    QML_ADDED_IN_VERSION(2, 7)
    QML_ANONYMOUS
    Q_PROPERTY(QtAM::ApplicationManagerWindow *window READ window NOTIFY windowChanged FINAL)
    Q_PROPERTY(QObject *backingObject READ backingObject NOTIFY backingObjectChanged FINAL)
    Q_PROPERTY(QWindow::Visibility visibility READ visibility NOTIFY visibilityChanged FINAL)
    Q_PROPERTY(bool active READ isActive NOTIFY activeChanged FINAL)
    Q_PROPERTY(QQuickItem *activeFocusItem READ activeFocusItem NOTIFY activeFocusItemChanged FINAL)
    Q_PROPERTY(QQuickItem *contentItem READ contentItem NOTIFY contentItemChanged FINAL)
    Q_PROPERTY(int width READ width NOTIFY widthChanged FINAL)
    Q_PROPERTY(int height READ height NOTIFY heightChanged FINAL)

public:
    explicit ApplicationManagerWindowAttached(QObject *attachee);

    ApplicationManagerWindow *window() const;
    Q_SIGNAL void windowChanged();
    QObject *backingObject() const;
    Q_SIGNAL void backingObjectChanged();
    QWindow::Visibility visibility() const;
    Q_SIGNAL void visibilityChanged();
    bool isActive() const;
    Q_SIGNAL void activeChanged();
    QQuickItem *activeFocusItem() const;
    Q_SIGNAL void activeFocusItemChanged();
    QQuickItem *contentItem() const;
    Q_SIGNAL void contentItemChanged();
    int width() const;
    Q_SIGNAL void widthChanged();
    int height() const;
    Q_SIGNAL void heightChanged();

    QQuickItem *attachee();
    void reconnect(ApplicationManagerWindow *newWin); // callback for implementation

protected:
    std::unique_ptr<ApplicationManagerWindowAttachedImpl> m_impl;
    QPointer<ApplicationManagerWindow> m_amwindow;

private:
    Q_DISABLE_COPY_MOVE(ApplicationManagerWindowAttached)
};


QT_END_NAMESPACE_AM