1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 22:44:58 +00:00
serenity/Base/usr/share/man/man5/GML/Usage.md
kleines Filmröllchen 54eab251f6 Base: Document new GML usage method
This is now preferred over the old one.
2023-08-11 21:33:48 +02:00

1.8 KiB

Name

GML Usage

Description

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.

CMake

Include compile_gml() your application's CMake file. The generated source file name is not fixed, but should follow this convention.

compile_gml(MyApp.gml MyAppGML.cpp)

Include the name of the source file that will be compiled from your GML file in your SOURCES.

set(SOURCES
    MyAppGML.cpp
)

C++

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.

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.

@MyApp::Widget {
    @GUI::Button {
        name: "mem_add_button"
        text: "M+"
        fixed_width: 35
        fixed_height: 28
        foreground_color: "red"
    }
}
// MyApp::Widget::foo_bar
m_mem_add_button = *find_descendant_of_type_named<GUI::Button>("mem_add_button");