mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-11 05:25:32 +03:00
Base: Document new GML usage method
This is now preferred over the old one.
This commit is contained in:
parent
8ec9b26bba
commit
54eab251f6
Notes:
sideshowbarker
2024-07-16 21:34:08 +09:00
Author: https://github.com/kleinesfilmroellchen Commit: https://github.com/SerenityOS/serenity/commit/54eab251f6 Pull-request: https://github.com/SerenityOS/serenity/pull/17373 Reviewed-by: https://github.com/ADKaster Reviewed-by: https://github.com/BenWiederhake ✅ Reviewed-by: https://github.com/alimpfard Reviewed-by: https://github.com/linusg Reviewed-by: https://github.com/me-minus Reviewed-by: https://github.com/timschumi
@ -6,43 +6,47 @@ GML Usage
|
||||
|
||||
How to use GML in SerenityOS C++ applications
|
||||
|
||||
## Note
|
||||
|
||||
This manpage describes the new method of loading GML files via generated C++ code. There also is the runtime `load_from_gml` function which has the same behavior. The runtime method should not be used except for specific use cases such as [GMLPlayground](help://man/1/Applications/GMLPlayground).
|
||||
|
||||
## CMake
|
||||
|
||||
Include `stringify_gml()` your applications CMake file. The header file name and GML string name are not fixed but must follow this convention.
|
||||
Include `compile_gml()` your application's CMake file. The generated source file name is not fixed, but should follow this convention.
|
||||
|
||||
```cmake
|
||||
stringify_gml(MyApp.gml MyAppGML.h my_app_gml)
|
||||
compile_gml(MyApp.gml MyAppGML.cpp)
|
||||
```
|
||||
|
||||
Include the name of the header file that will be compiled from your GML file in your `SOURCES`.
|
||||
Include the name of the source file that will be compiled from your GML file in your `SOURCES`.
|
||||
|
||||
```cmake
|
||||
set(SOURCES
|
||||
MyAppGML.h
|
||||
MyAppGML.cpp
|
||||
)
|
||||
```
|
||||
|
||||
## C++
|
||||
|
||||
You can then reference the variable you set (e.g. `my_app_gml`) in your main C++ file using `load_from_gml()`.
|
||||
The C++ source file that is generated will provide an implementation for the `ErrorOr<NonnullRefPtr<MyApp::Widget>> MyApp::Widget::try_create()` function, given that the root widget of the GML file is `MyApp::Widget`. For this to work, you have to add a declaration for this function in the header of the `MyApp::Widget` class. (The function will not collide with functions provided by `Core::Object`, do not worry.) Additionally, there must be a no-argument constructor in `MyApp::Widget`, which is used by the `try_create` implementation.
|
||||
|
||||
```cpp
|
||||
load_from_gml(my_app_gml);
|
||||
```
|
||||
Calling the `try_create` function directly or indirectly (e.g. `Window::try_set_main_widget`) will now automatically load the structure defined in GML.
|
||||
|
||||
From there, you can use `find_descendant_of_type_named` to select widgets from your GML by their `name` property.
|
||||
|
||||
```gml
|
||||
@GUI::Button {
|
||||
name: "mem_add_button"
|
||||
text: "M+"
|
||||
fixed_width: 35
|
||||
fixed_height: 28
|
||||
foreground_color: "red"
|
||||
@MyApp::Widget {
|
||||
@GUI::Button {
|
||||
name: "mem_add_button"
|
||||
text: "M+"
|
||||
fixed_width: 35
|
||||
fixed_height: 28
|
||||
foreground_color: "red"
|
||||
}
|
||||
}
|
||||
```
|
||||
Is referenced using...
|
||||
|
||||
```cpp
|
||||
load_from_gml(calculator_gml);
|
||||
// MyApp::Widget::foo_bar
|
||||
m_mem_add_button = *find_descendant_of_type_named<GUI::Button>("mem_add_button");
|
||||
```
|
||||
|
Loading…
Reference in New Issue
Block a user