Skip to main content

rusteal_core/
widget.rs

1// Widget creation and WidgetTree management (raw handle versions).
2// Type-safe wrappers live in rusteal-bindings/src/manual/widget_ext.rs.
3
4use rusteal_ffi::{UClassHandle, UObjectHandle};
5
6use crate::error::{check_ffi, RustealError, RustealResult};
7use crate::ffi_dispatch;
8
9/// Create a UMG widget using the C++ `CreateWidget<T>()` template.
10///
11/// - `owning_object`: a PlayerController, World, or GameInstance handle
12/// - `widget_class`: the UClass of the UUserWidget subclass to create
13pub fn create_widget_raw(
14    owning_object: UObjectHandle,
15    widget_class: UClassHandle,
16) -> RustealResult<UObjectHandle> {
17    let result = unsafe {
18        ffi_dispatch::widget_create_widget(owning_object, widget_class)
19    };
20    if result.is_null() {
21        Err(RustealError::InvalidOperation("create_widget returned null".into()))
22    } else {
23        Ok(result)
24    }
25}
26
27/// Set the root widget of a UUserWidget's WidgetTree.
28pub fn set_root_widget_raw(
29    user_widget: UObjectHandle,
30    root_widget: UObjectHandle,
31) -> RustealResult<()> {
32    check_ffi(unsafe {
33        ffi_dispatch::widget_set_root_widget(user_widget, root_widget)
34    })
35}
36
37/// Get the WidgetTree UObject from a UUserWidget.
38pub fn get_widget_tree_raw(
39    user_widget: UObjectHandle,
40) -> RustealResult<UObjectHandle> {
41    let result = unsafe {
42        ffi_dispatch::widget_get_widget_tree(user_widget)
43    };
44    if result.is_null() {
45        Err(RustealError::InvalidOperation("get_widget_tree returned null".into()))
46    } else {
47        Ok(result)
48    }
49}