File: objects.rst

package info (click to toggle)
blueprint-compiler 0.18.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,140 kB
  • sloc: python: 8,504; sh: 31; makefile: 6
file content (190 lines) | stat: -rw-r--r-- 6,450 bytes parent folder | download
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
=======
Objects
=======


.. _Syntax Object:

Objects
-------

.. rst-class:: grammar-block

   Object = :ref:`TypeName<Syntax TypeName>` <id::ref:`IDENT<Syntax IDENT>`>? ObjectContent
   ObjectContent = '{' (:ref:`Signal<Syntax Signal>` | :ref:`Property<Syntax Property>` | :ref:`Extension<Syntax Extension>` | :ref:`Child<Syntax Child>`)* '}'

Objects are the basic building blocks of a GTK user interface. Your widgets are all objects, as are some other features such as list models.

Optionally, objects may have an ID to provide a handle for other parts of the blueprint and your code to access objects.

.. note::

   Object IDs must be unique within their scope. The document root is a scope, but :ref:`sub-templates<Syntax ExtListItemFactory>` have their own, isolated scope.

Example
~~~~~~~

.. code-block:: blueprint

   Label label1 {
     label: "Hello, world!";
   }
   Label label2 {
     label: bind-property file.name;
   }


.. _Syntax TypeName:

Type Names
----------

.. rst-class:: grammar-block

   TypeName = TypeNameFull | TypeNameExternal | TypeNameShort
   TypeNameFull = <namespace::ref:`IDENT<Syntax IDENT>`> '.' <name::ref:`IDENT<Syntax IDENT>`>
   TypeNameExternal = '$' <name::ref:`IDENT<Syntax IDENT>`>
   TypeNameShort = <name::ref:`IDENT<Syntax IDENT>`>

There are three forms of type names: full, short, and external. Full type names take the form ``{namespace}.{name}``, e.g. ``Gtk.ApplicationWindow`` or ``Adw.Leaflet``. Because GTK types are so common, the Gtk namespace may be omitted, shortening ``Gtk.ApplicationWindow`` to just ``ApplicationWindow``.

External type names refer to types defined in your application. They are prefixed with ``$`` and do not have a dot between the namespace and class name. In fact, anywhere a ``$`` is used in a blueprint, it refers to something that must be defined in your application code.


.. _Syntax Property:

Properties
----------

.. rst-class:: grammar-block

   Property = <name::ref:`IDENT<Syntax IDENT>`> ':' ( :ref:`Binding<Syntax Binding>` | :ref:`ExprValue<Syntax ExprValue>` | :ref:`Menu<Syntax Menu>` | :ref:`ObjectValue<Syntax ObjectValue>` | :ref:`Value<Syntax Value>` ) ';'

Properties specify the details of each object, like a label's text, an image's icon name, or the margins on a container.

Most properties are static and directly specified in the blueprint, but properties can also be bound to a data model using the ``bind`` or ``bind-property`` keywords.

A property's value can be another object, either inline or referenced by ID.

Example
~~~~~~~

.. code-block:: blueprint

   Label {
     label: "text";
   }

   Button {
     /* Inline object value. Notice the semicolon after the object. */
     child: Image {
       /* ... */
     };
   }


.. _Syntax Signal:

Signal Handlers
---------------

.. rst-class:: grammar-block

   Signal = <name::ref:`IDENT<Syntax IDENT>`> ('::' <detail::ref:`IDENT<Syntax IDENT>`>)? '=>' '$' <handler::ref:`IDENT<Syntax IDENT>`> '(' <object::ref:`IDENT<Syntax IDENT>`>? ')' (SignalFlag)* ';'
   SignalFlag = 'after' | 'swapped' | 'not-swapped'

Signals are one way to respond to user input (another is `actions <https://docs.gtk.org/gtk4/actions.html>`_, which use the `action-name property <https://docs.gtk.org/gtk4/property.Actionable.action-name.html>`_).

Signals provide a handle for your code to listen to events in the UI. The handler name is prefixed with ``$`` to indicate that it's an external symbol which needs to be provided by your code; if it isn't, things might not work correctly, or at all.

Optionally, you can provide an object ID to use when connecting the signal.

The ``swapped`` flag is used to swap the order of the object and userdata arguments in C applications. If an object argument is specified, then this is the default behavior, so the ``not-swapped`` flag can be used to prevent the swap.

Example
~~~~~~~

.. code-block:: blueprint

   Button {
     clicked => $on_button_clicked();
   }

.. _Syntax Child:

Children
--------

.. rst-class:: grammar-block

   Child = ChildAnnotation? :ref:`Object<Syntax Object>`
   ChildAnnotation = '[' ( ChildInternal | :ref:`ChildExtension<Syntax ChildExtension>` | ChildType ) ']'
   ChildInternal = 'internal-child' <internal-child::ref:`IDENT<Syntax IDENT>`>
   ChildType = <child_type::ref:`IDENT<Syntax IDENT>`>

Some objects can have children. This defines the hierarchical structure of a user interface: containers contain widgets, which can be other containers, and so on.

Child annotations are defined by the parent widget. Some widgets, such as `HeaderBar <https://docs.gtk.org/gtk4/class.HeaderBar.html>`_, have "child types" which allow different child objects to be treated in different ways. Some, such as `Dialog <https://docs.gtk.org/gtk4/class.Dialog.html>`_ and `InfoBar <https://docs.gtk.org/gtk4/class.InfoBar.html>`_, define child :ref:`extensions<Syntax ChildExtension>`, which provide more detailed information about the child.

Internal children are a special case. Rather than creating a new object, children marked with ``[internal-child <name>]`` modify an existing object provided by the parent. This is used, for example, for the ``content_area`` of a `Dialog <https://docs.gtk.org/gtk4/class.Dialog.html>`_.

.. note::

   The objects at the root of a blueprint cannot have child annotations, since there is no root widget for them to be a child of.

.. note::

   Some widgets, like `Button <https://docs.gtk.org/gtk4/class.Button.html>`_, use a property to set their child instead. Widgets added in this way don't have child annotations.

Examples
~~~~~~~~

Add children to a container
+++++++++++++++++++++++++++

.. code-block:: blueprint

   Button {
     Image {}
   }

Child types
+++++++++++

.. code-block:: blueprint

   HeaderBar {
     [start]
     Label {
     }

     [end]
     Button {
     }
   }

Child extensions
++++++++++++++++

.. code-block:: blueprint

   Dialog {
     // Here, a child extension annotation defines the button's response.
     [action response=cancel]
     Button {}
   }

Internal children
+++++++++++++++++

.. code-block:: blueprint

   Dialog {
     [internal-child content_area]
     Box {
       // Unlike most objects in a blueprint, this internal-child widget
       // represents the properties, signal handlers, children, and extensions
       // of an existing Box created by the Dialog, not a new Box created by
       // the blueprint.
     }
   }