mirror of
https://gitlab.gnome.org/jwestman/blueprint-compiler.git
synced 2025-05-04 15:59:08 -04:00
Tutorial: Fixed .rst rendering issues
This commit is contained in:
parent
14d1892254
commit
0fe58ffc37
1 changed files with 45 additions and 21 deletions
|
@ -8,17 +8,18 @@ Read this if you want to learn how to use Blueprint and never used
|
||||||
the XML syntax that can be read by GtkBuilder.
|
the XML syntax that can be read by GtkBuilder.
|
||||||
|
|
||||||
For compatibility with Blueprint IDE extensions, blueprint files
|
For compatibility with Blueprint IDE extensions, blueprint files
|
||||||
should end with `.blp`.
|
should end with ``.blp``.
|
||||||
|
|
||||||
|
|
||||||
Namespaces
|
Namespaces
|
||||||
----------
|
----------
|
||||||
|
|
||||||
Blueprint needs the widget library to be imported. These include Gtk,
|
Blueprint needs the widget library to be imported. These include Gtk,
|
||||||
Libadwaita, Shumate, etc. To import a namespace, write `using` followed
|
Libadwaita, Shumate, etc. To import a namespace, write ``using`` followed
|
||||||
by the library and version number.
|
by the library and version number.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
using Gtk 4.0;
|
using Gtk 4.0;
|
||||||
using Adw 1;
|
using Adw 1;
|
||||||
|
|
||||||
|
@ -32,6 +33,7 @@ Comments
|
||||||
Blueprint has inline or multi-line comments
|
Blueprint has inline or multi-line comments
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
// This is an inline comment
|
// This is an inline comment
|
||||||
/* This is
|
/* This is
|
||||||
a multiline
|
a multiline
|
||||||
|
@ -42,6 +44,7 @@ will interpret the inner comment's closing token as the outer comment's
|
||||||
closing token. For example, the following will not compile:
|
closing token. For example, the following will not compile:
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
// Bad comment below:
|
// Bad comment below:
|
||||||
/* Outer comment
|
/* Outer comment
|
||||||
/* Inner comment */
|
/* Inner comment */
|
||||||
|
@ -54,6 +57,7 @@ Widgets
|
||||||
Create widgets in the following format:
|
Create widgets in the following format:
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Namespace.WidgetClass {
|
Namespace.WidgetClass {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -62,6 +66,7 @@ The Gtk namespace is implied for widgets, so you can just write the
|
||||||
widget class
|
widget class
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Box {
|
Box {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -69,6 +74,7 @@ widget class
|
||||||
Other namespaces must be written explicitly.
|
Other namespaces must be written explicitly.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Adw.Leaflet {
|
Adw.Leaflet {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -84,13 +90,14 @@ Widgets can be given **name/ID**s so that they can be referenced by other
|
||||||
widgets in the blueprint.
|
widgets in the blueprint.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Namespace.WidgetClass widget_id {
|
Namespace.WidgetClass widget_id {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Any time you want to use this widget as a property (more about that in the
|
Any time you want to use this widget as a property (more about that in the
|
||||||
next section) or something else, write the widget's **ID** (e.g.
|
next section) or something else, write the widget's **ID** (e.g.
|
||||||
`main_window`).
|
``main_window``).
|
||||||
|
|
||||||
|
|
||||||
Properties
|
Properties
|
||||||
|
@ -102,6 +109,7 @@ For example, the Libadwaita documentation lists the
|
||||||
Write properties inside the curly brackets of a widget:
|
Write properties inside the curly brackets of a widget:
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Namespace.WidgetClass {
|
Namespace.WidgetClass {
|
||||||
property-name: value;
|
property-name: value;
|
||||||
}
|
}
|
||||||
|
@ -113,14 +121,14 @@ Property Types
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
These are the **types** of values that can be used in properties:
|
These are the **types** of values that can be used in properties:
|
||||||
- Booleans: `true`, `false`
|
- Booleans: ``true``, ``false``
|
||||||
- Numbers: e.g. `1`, `1.5`, `-2`, `-2.5`
|
- Numbers: e.g. ``1``, ``1.5``, ``-2``, ``-2.5``
|
||||||
- Strings (single- or double-quoted): e.g. `"a string"`, `'another string'`
|
- Strings (single- or double-quoted): e.g. ``"a string"``, ``'another string'``
|
||||||
- Enums
|
- Enums
|
||||||
- Widgets
|
- Widgets
|
||||||
|
|
||||||
Properties are **strongly typed**, so you can't use, for example, a string
|
Properties are **strongly typed**, so you can't use, for example, a string
|
||||||
for the orientation property, which requires an `Orientation` enum
|
for the orientation property, which requires an ``Orientation`` enum
|
||||||
vartiant as its value.
|
vartiant as its value.
|
||||||
|
|
||||||
Enum Properties
|
Enum Properties
|
||||||
|
@ -138,6 +146,7 @@ In the blueprint, you would only write the *variant* part of the enum in
|
||||||
*lowercase*, just like you would in the XML.
|
*lowercase*, just like you would in the XML.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Box {
|
Box {
|
||||||
orientation: horizontal;
|
orientation: horizontal;
|
||||||
}
|
}
|
||||||
|
@ -146,11 +155,12 @@ Widget Properties
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Some widgets take other widgets as properties. For example, the
|
Some widgets take other widgets as properties. For example, the
|
||||||
`Gtk.StackSidebar` has a stack property which takes a `Gtk.Stack` widget.
|
``Gtk.StackSidebar`` has a stack property which takes a ``Gtk.Stack`` widget.
|
||||||
You can create a new widget for the value, or you can reference another
|
You can create a new widget for the value, or you can reference another
|
||||||
widget by its **ID**.
|
widget by its **ID**.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
StackSidebar {
|
StackSidebar {
|
||||||
stack: Stack { };
|
stack: Stack { };
|
||||||
}
|
}
|
||||||
|
@ -158,6 +168,7 @@ widget by its **ID**.
|
||||||
OR
|
OR
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
StackSidebar {
|
StackSidebar {
|
||||||
stack: my_stack;
|
stack: my_stack;
|
||||||
}
|
}
|
||||||
|
@ -174,12 +185,13 @@ Property Bindings
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
If you want a widget's property to have the same value as another widget's
|
If you want a widget's property to have the same value as another widget's
|
||||||
property (without hard-coding the value), you could `bind` two widgets'
|
property (without hard-coding the value), you could ``bind`` two widgets'
|
||||||
properties of the same type. Bindings must reference a *source* widget by
|
properties of the same type. Bindings must reference a *source* widget by
|
||||||
**ID**. As long as the two properties have the same type, you can bind
|
**ID**. As long as the two properties have the same type, you can bind
|
||||||
properties of different names and of widgets with different widget classes.
|
properties of different names and of widgets with different widget classes.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Box my_box {
|
Box my_box {
|
||||||
halign: fill; // Source
|
halign: fill; // Source
|
||||||
}
|
}
|
||||||
|
@ -197,6 +209,7 @@ changed to the *Source*'s value when the binding is created and when the
|
||||||
*Source* value changes.
|
*Source* value changes.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Box my_box {
|
Box my_box {
|
||||||
hexpand: true; // Source
|
hexpand: true; // Source
|
||||||
}
|
}
|
||||||
|
@ -214,13 +227,13 @@ no-sync-create
|
||||||
bidirectional
|
bidirectional
|
||||||
When either the *Source* or *Target* value is modified, the other's
|
When either the *Source* or *Target* value is modified, the other's
|
||||||
value will be updated. For example, if the logic of the program
|
value will be updated. For example, if the logic of the program
|
||||||
changes the Button's vexpand value to `false`, then the Box's halign
|
changes the Button's vexpand value to ``false``, then the Box's halign
|
||||||
value will also be updated to `false`.
|
value will also be updated to ``false``.
|
||||||
|
|
||||||
inverted
|
inverted
|
||||||
If the property is a boolean, the value of the bind can be negated
|
If the property is a boolean, the value of the bind can be negated
|
||||||
with this flag. For example, if the Box's hexpand property is `true`,
|
with this flag. For example, if the Box's hexpand property is ``true``,
|
||||||
the Button's vexpand property will be `false` in the code above.
|
the Button's vexpand property will be ``false`` in the code above.
|
||||||
|
|
||||||
|
|
||||||
Signals
|
Signals
|
||||||
|
@ -239,6 +252,7 @@ To register a handler with the application, consult the documentation for
|
||||||
your language's bindings of Gtk.
|
your language's bindings of Gtk.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
WidgetClass {
|
WidgetClass {
|
||||||
event_name => handler_name() flags;
|
event_name => handler_name() flags;
|
||||||
}
|
}
|
||||||
|
@ -251,6 +265,7 @@ widget that is passed to the handler by referencing its **id** inside the
|
||||||
parenthesis.
|
parenthesis.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Label my_label {
|
Label my_label {
|
||||||
label: "Hide me";
|
label: "Hide me";
|
||||||
}
|
}
|
||||||
|
@ -265,7 +280,7 @@ Custom Widget Classes
|
||||||
|
|
||||||
Some programs have custom widgets defined in their logic, and so blueprint
|
Some programs have custom widgets defined in their logic, and so blueprint
|
||||||
won't know that they exist. Writing widgets not defined in the GIR will
|
won't know that they exist. Writing widgets not defined in the GIR will
|
||||||
result in an error. Prepend a custom widget with a `.` to prevent the
|
result in an error. Prepend a custom widget with a ``.`` to prevent the
|
||||||
compiler from trying to validate the widget. This is essentially leaving
|
compiler from trying to validate the widget. This is essentially leaving
|
||||||
out the *namespace*.
|
out the *namespace*.
|
||||||
|
|
||||||
|
@ -273,6 +288,7 @@ To register a custom widget with the application consult the documentation
|
||||||
for your language's bindings of Gtk.
|
for your language's bindings of Gtk.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
.MyCustomWidget {
|
.MyCustomWidget {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -291,6 +307,7 @@ Widgets can be given style classes that can be used with your CSS or
|
||||||
in libraries like Libadwaita.
|
in libraries like Libadwaita.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
label: "Click me";
|
label: "Click me";
|
||||||
styles ["my-style", "pill"]
|
styles ["my-style", "pill"]
|
||||||
|
@ -309,9 +326,10 @@ Some widgets will have elements which are not properties, but they sort
|
||||||
of act like properties. Most of the time they will be specific only to a
|
of act like properties. Most of the time they will be specific only to a
|
||||||
certain widget. *Styles* is one of these elements, except that styles can
|
certain widget. *Styles* is one of these elements, except that styles can
|
||||||
be used for any widget. Similarly to how every widget has styles,
|
be used for any widget. Similarly to how every widget has styles,
|
||||||
`Gtk.ComboBoxText` has *items*:
|
``Gtk.ComboBoxText`` has *items*:
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Gtk.ComboBoxText {
|
Gtk.ComboBoxText {
|
||||||
items [
|
items [
|
||||||
item1: "Item 1",
|
item1: "Item 1",
|
||||||
|
@ -329,17 +347,18 @@ Menus
|
||||||
|
|
||||||
Menus are usually the widgets that are placed along the top-bar of a
|
Menus are usually the widgets that are placed along the top-bar of a
|
||||||
window, or pop up when you right-click some other widget. In Blueprint a
|
window, or pop up when you right-click some other widget. In Blueprint a
|
||||||
`menu` is a `Gio.MenuModel` that can be shown by MenuButtons or other
|
``menu`` is a ``Gio.MenuModel`` that can be shown by MenuButtons or other
|
||||||
widgets.
|
widgets.
|
||||||
|
|
||||||
In Blueprint, `menu`s have *items*, *sections*, and *submenus*.
|
In Blueprint, ``menu``s have *items*, *sections*, and *submenus*.
|
||||||
Like widgets, `menu`s can also be given a **ID**.
|
Like widgets, ``menu``s can also be given a **ID**.
|
||||||
The `Menu Model section of the Gtk.PopoverMenu documentation <https://docs.gtk.org/gtk4/class.PopoverMenu.html#menu-models>`_
|
The `Menu Model section of the Gtk.PopoverMenu documentation <https://docs.gtk.org/gtk4/class.PopoverMenu.html#menu-models>`_
|
||||||
has complete details on the menu model.
|
has complete details on the menu model.
|
||||||
|
|
||||||
Here is an example of a menu:
|
Here is an example of a menu:
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
menu my_menu {
|
menu my_menu {
|
||||||
section {
|
section {
|
||||||
label: "File";
|
label: "File";
|
||||||
|
@ -368,16 +387,18 @@ There is a shorthand for *items*. Items require at least a label. The
|
||||||
action and icon-name are optional.
|
action and icon-name are optional.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
menu {
|
menu {
|
||||||
item ( "Item 2" )
|
item ( "Item 2" )
|
||||||
item ( "Item 2", "app.action", "icon-name" )
|
item ( "Item 2", "app.action", "icon-name" )
|
||||||
}
|
}
|
||||||
|
|
||||||
A widget that uses a `menu` is `Gtk.MenuButton`. It has the *menu-model*
|
A widget that uses a ``menu`` is ``Gtk.MenuButton``. It has the *menu-model*
|
||||||
property, which takes a menu. Write the menu at the root of the blueprint
|
property, which takes a menu. Write the menu at the root of the blueprint
|
||||||
(meaning not inside any widgets) and reference it by **ID**.
|
(meaning not inside any widgets) and reference it by **ID**.
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
MenuButton {
|
MenuButton {
|
||||||
menu-model: my_menu;
|
menu-model: my_menu;
|
||||||
}
|
}
|
||||||
|
@ -398,6 +419,7 @@ the child the type is for.
|
||||||
The following blueprint code...
|
The following blueprint code...
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
HeaderBar {
|
HeaderBar {
|
||||||
[start]
|
[start]
|
||||||
Button {
|
Button {
|
||||||
|
@ -414,6 +436,7 @@ The following blueprint code...
|
||||||
And the following blueprint code...
|
And the following blueprint code...
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
HeaderBar {
|
HeaderBar {
|
||||||
[end]
|
[end]
|
||||||
Button {
|
Button {
|
||||||
|
@ -431,15 +454,16 @@ And the following blueprint code...
|
||||||
Translatable Strings
|
Translatable Strings
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
Mark any string as translatable using this syntax: `_("...")`.
|
Mark any string as translatable using this syntax: ``_("...")``.
|
||||||
|
|
||||||
Two strings that are the same in English could be translated in different
|
Two strings that are the same in English could be translated in different
|
||||||
ways in other languages because of different *contexts*. Translatable
|
ways in other languages because of different *contexts*. Translatable
|
||||||
strings with context look like this: `C_("context", "...")`. An example
|
strings with context look like this: ``C_("context", "...")``. An example
|
||||||
where a context is needed is the word "have", which in Spanish could
|
where a context is needed is the word "have", which in Spanish could
|
||||||
translate to "tener" or "haber".
|
translate to "tener" or "haber".
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
label: C_("1st have", "have");
|
label: C_("1st have", "have");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue