# 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:
```swift
struct CustomText: Widget { }
```
You can add properties to the widget:
```swift
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:
```swift
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.

```swift
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](https://meta.aparoksha.dev/documentation/meta/createbackend).
