adwaita.docc/Advanced/CreatingWidgets.md

1.6 KiB

Creating widgets

Widgets are special views that do not provide a collection of other views as a content, but have functions that are called when creating or updating the view. Normally, a widget manages a GTK or Libadwaita widget using the C API.

Recreate the Text widget

In this tutorial, we will recreate the Text widget. A widget conforms to the Widget protocol:

struct CustomText: Widget { }

You can add properties to the widget:

struct CustomText: Widget {

    var text: String

}

This widget can be called in a view body using CustomText(text: "Hello, world!"). Now, add the function required by the protocol:

import CAdw

struct CustomText: Widget {

    var text: String

    func initializeWidget() -> Any {
        gtk_label_new(text)?.opaque()
    }

}

Updates

The widget will be rendered as expected, but updates do not work currently. To mark properties as a widget property, use the Property property wrapper.

import CAdw

struct CustomText: Widget {

    @Property(
        set: { gtk_label_set_label($0, text) },
        pointer: OpaquePointer.self
    )
    var text: String

    func initializeWidget() -> Any {
        gtk_label_new(text)?.opaque()
    }

}

More Complex Widgets

If a property should allow two-way traffic (able to modify inside of the widget, e.g. the isOn property of a checkbox which can be updated when the user clicks the checkbox), use BindingProperty. For views, use ViewProperty.

More help is available here.