summaryrefslogtreecommitdiffstats
path: root/examples/applicationmanager/hello-world/doc/src/hello-world.qdoc
blob: 394e213d78637fd14606c820ecae95cf1d85631f (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
/****************************************************************************
**
** Copyright (C) 2019 Luxoft Sweden AB
** Copyright (C) 2018 Pelagicore AG
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Luxoft Application Manager.
**
** $QT_BEGIN_LICENSE:FDL-QTAS$
** Commercial License Usage
** Licensees holding valid commercial Qt Automotive Suite licenses may use
** this file in accordance with the commercial license agreement provided
** with the Software or, alternatively, in accordance with the terms
** contained in a written agreement between you and The Qt Company.  For
** licensing terms and conditions see https://www.qt.io/terms-conditions.
** For further information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!

\example applicationmanager/hello-world
\title "Hello World!" System-UI Example
\image hello-world-example.png The Hello World example with two applications running.
\brief Your first System-UI. Start here.
\ingroup applicationmanager-examples

\section1 Introduction

This example shows a very simple System-UI implementation, in the spirit of "Hello World!" examples,
showcasing the fundamental building blocks of Qt Application Manager. You're able to see icons and names
of the available applications on the left, start and stop them by clicking on their respective icons,
and see their windows in a column layout on the right side.

The applications themselves just display "Hello World!" against a background of a specific color.

\section1 Files and folder structure

This example is comprised of a System-UI and three sample applications ("Hello Red", "Hello Green"
and "Hello Blue"), making for four separate QML applications in total. System-UI is also just a QML
application in the end, albeit a special one.

Each application is put in its own separate directory as described below:

\list
\li \tt{system-ui.qml}
\li \tt{\b{apps}}
    \list
    \li \tt{\b{hello-world.blue}}
        \list
        \li \tt{icon.png}
        \li \tt{info.yaml}
        \li \tt{main.qml}
        \endlist
    \li \tt{\b{hello-world.red}}
        \list
        \li \tt{icon.png}
        \li \tt{info.yaml}
        \li \tt{main.qml}
        \endlist
    \li \tt{\b{hello-world.green}}
        \list
        \li \tt{icon.png}
        \li \tt{info.yaml}
        \li \tt{main.qml}
        \endlist
    \endlist
\endlist

As you can see above, each application, besides its mail QML file, also has an icon and a
\tt{info.yaml}. That YAML file contains the application metadata (it tells System-UI the
name of the application, its icon filename, etc).

\section1 Running

Assuming the \c appman executable is in your path, you can run the System-UI as follows:

\badcode
examples/applicationmanager/hello-world$ appman --builtin-apps-manifest-dir ./apps system-ui.qml
\endcode

The first command line parameter tells \c appman where to find bult-in applications (ie, applications
that come pre-installed and cannot be removed via ApplicationInstaller APIs). In this case, they're in
the \c apps subdirectory. The last parameter is the main QML file of the System-UI.

And this is what you should see:

\image hello-world-launched.png

For information on these and other command line options you can run \tt{appman --help}.

\section1 System-UI implementation

Our Hello World System-UI code starts like any simple QML application, with some imports and a plain
Item at the root. The only difference is that it also imports the \c QtApplicationManager.SystemUI module,
besides \c QtQuick.

\quotefromfile applicationmanager/hello-world/system-ui.qml
\skipto import QtQuick
\printuntil height:

Next we have a Column on the left side of the root Item where we lay out the icons of the available applications
along with their names.

\printto Show windows

As the model we use the \c ApplicationManager singleton which provides a row for each available application.
Each row has, among others, an \c icon role containing the icon URL, a \c name role with the localized application
name, a boolean \c isRunning role that tells whether the application is currently running and a \c application
role containing its ApplicationObject. For information on other roles see the ApplicationManager documentation.

Clicking on an icon will either start its application or stop it in case it's already running.

Next we place a \c Column anchored to the right side of the root \c Item. In that column we lay out the existing
windows from all currently running applications:

\printto /^\}/

This time we use the WindowManager singleton as the model. There's a row for each window, with its
WindowObject in the \c window role.

In order to have a window rendered in our System-UI we have to assign its WindowObject to a WindowItem,
as was above. By default the window will be resized to match the size of the WindowItem rendering it.

\section1 Application implementation

Our Hello World applications just display a "Hello World!" text against a colored background.

\quotefromfile applicationmanager/hello-world/apps/hello-world.blue/main.qml
\skipto import QtQuick
\printuntil /^\}/

The only difference from a plain QML application is that the root element is an ApplicationManagerWindow,
provided by the \c QtApplicationManager.Application module.

\section2 Application metadata

The info.yaml file contains the metadata about an application.

It starts with some boilerplate telling that this file contains Qt Application Manager application metadata.

\quotefromfile applicationmanager/hello-world/apps/hello-world.blue/info.yaml
\printuntil --

Then comes the application id, which uniquely identifies the application. It's recommended to follow a
reverse DNS scheme, although this is not enforced. Here it's the "Blue" application from the "Hello World"
example UI.

\printline id:

Then the icon filename, which is self-explanatory:

\printline icon:

The entry point of the application is specified by the \c code field. For QML applications
this means the filename of the main QML file.

\printline code:

The \c runtime field specifies the runtime used by the application. In this Hello World example, all applications
are written in QML and hence we use the \c 'qml' runtime. Another runtime is \c 'native' for instance, used for compiled,
executable, applications where the \c code entry would point to its binary executable filename.

\printline runtime:

And finally comes the user-visible name of the application in any number of languages (in this example, only English
was provided):

\printuntil

*/