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.