UI¶
53 tools. Back to the index.
add_list_view¶
Additive.
Construct a UListView under the widget BP root and add it to the tree.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_name |
string | yes | /Game path of the Widget Blueprint |
list_view_name |
string | yes | FName of the new UListView widget |
entry_widget_class |
string | no | Optional entry widget class (asset or /Script path) |
Returns: { widget_blueprint_name, list_view_name, list_view_class, already_existed, entry_widget_class, widget_added }
add_tile_view¶
Additive.
Construct a UTileView under the widget BP root and add it to the tree.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_name |
string | yes | /Game path of the Widget Blueprint |
list_view_name |
string | yes | FName of the new UTileView widget |
entry_widget_class |
string | no | Optional entry widget class |
Returns: { widget_blueprint_name, list_view_name, list_view_class, already_existed, entry_widget_class, widget_added }
add_tree_view¶
Additive.
Construct a UTreeView under the widget BP root (or a named parent panel widget) and add it to the tree. HONEST SCOPE: authoring only, same posture as add_list_view/add_tile_view -- constructs the widget + wires EntryWidgetClass. Populating the tree's actual hierarchy (SetTreeItemsSource + the OnGetItemChildren delegate that supplies each node's children) is OUT OF SCOPE: that delegate is a native TSlateDelegates callback, not reflectively assignable -- wire it in the widget BP graph (native C++/BP override) or drive it live in PIE.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_name |
string | yes | /Game path of the Widget Blueprint |
widget_name |
string | yes | FName of the new UTreeView widget |
entry_widget_class |
string | no | Optional entry widget class (asset or /Script path) |
parent_widget_name |
string | no | Optional: name of an existing panel widget (UPanelWidget) in the tree to insert the new UTreeView under. Omitted = same root-insertion behavior as add_list_view/add_tile_view (canvas/panel root, else becomes the tree root). |
Returns: { widget_blueprint_name, widget_name, tree_view_class, already_existed, entry_widget_class, parent_widget_name?, widget_added, saved, save_error?, note }
add_viewmodel¶
Additive.
Append a UMVVMViewModelContext to a Widget BP's MVVM authoring state.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_name |
string | yes | /Game path of the Widget Blueprint asset (string) |
view_model_class |
string | yes | View model class: asset path (/Game/...) or /Script/<Module>.<ClassName> |
context_name |
string | yes | FName identifying this context (idempotency key) |
creation_type |
string | no | Optional (default "CreateInstance"): one of "CreateInstance" | "PropertyPath" | "GlobalViewModelCollection" | "Manual" (EMVVMBlueprintViewModelContextCreationType). |
source_property_path |
string | no | Optional: only used when creation_type="PropertyPath" (required in that case). Sets FMVVMBlueprintViewModelContext::ViewModelPropertyPath. |
global_identifier |
string | no | Optional: only used when creation_type="GlobalViewModelCollection" (required in that case). Sets FMVVMBlueprintViewModelContext::GlobalViewModelIdentifier. |
Returns: { widget_blueprint_name, view_model_class, context_name, creation_type, source_property_path?, global_identifier?, already_existed, view_model_count, has_mvvm_extension }
add_widget_animation¶
Additive.
Add a UWidgetAnimation (with an inner UMovieScene) to a Widget Blueprint. Mirrors the editor's "New Animation" flow: constructs a UWidgetAnimation on the blueprint, gives it an inner UMovieScene (20fps, 0..5s range), sets the display label, appends to WidgetBP->Animations, then compiles and saves.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
animation_name |
string | yes | name/display label for the new animation |
Returns: { widget_bp_path: string, animation_name: string, object_name: string, display_name: string, added: bool, already_existed: bool, has_movie_scene: bool, animation_count: int, saved: bool, save_error: string }
add_widget_animation_keyframe¶
Additive.
Add a keyframe to an existing widget-animation property track's section (call add_widget_animation_track first). Converts time_seconds to an FFrameNumber via the MovieScene's tick resolution, extends the section's range to cover the key if needed, then adds the key on the matching channel(s) via the requested interpolation (AddLinearKey | AddCubicKey | AddConstantKey for float/color's FMovieSceneFloatChannel(s); bool channels have no interpolation concept and always use UpdateOrAddKey).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
animation_name |
string | yes | object name OR display label of the target animation |
widget_name |
string | yes | name of the animated widget |
property_path |
string | yes | the SAME property_path used in add_widget_animation_track |
time_seconds |
number | yes | time (seconds, >= 0) at which to place the key |
value |
any | no | key value: a number for float, a bool for bool, or a [R,G,B,A] (A optional, defaults 1.0) array for color |
interpolation |
string | no | Optional "linear" (default) | "cubic" | "constant" (float/color only; ignored for bool) |
Returns: { widget_bp_path: string, animation_name: string, widget_name: string, property_path: string, track_type: string, time_seconds: float, key_frame: int, keys_added: int, interpolation: string, saved: bool, save_error: string }
add_widget_animation_track¶
Additive.
Add (or reuse) a MovieScene property track for a widget's property inside a UWidgetAnimation: finds/creates a UMovieScenePossessable bound to the named widget (+ matching FWidgetAnimationBinding), resolves property_path to a top-level reflected property on the widget's class, and adds the matching typed track (UMovieSceneFloatTrack | UMovieSceneColorTrack | UMovieSceneBoolTrack) with a full-playback-range section. track_type="auto" infers from the property's reflected type (FFloatProperty/FDoubleProperty->float; FLinearColor or FSlateColor struct->color; FBoolProperty->bool). Call add_widget_animation_keyframe afterward to place keys. Single-level property_path only (not dotted sub-paths).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
animation_name |
string | yes | object name OR display label of the target animation |
widget_name |
string | yes | name of the widget (in the SAME WidgetBP's tree) to animate |
property_path |
string | yes | name of a top-level reflected property on the widget's class (e.g. "RenderOpacity", "ColorAndOpacity") |
track_type |
string | no | Optional "auto" (default) | "float" | "color" | "bool" |
Returns: { widget_bp_path: string, animation_name: string, widget_name: string, property_path: string, track_type: string, possessable_guid: string, binding_reused: bool, track_class: string, track_reused: bool, section_class: string, section_created: bool, saved: bool, save_error: string }
add_widget_extended¶
Additive.
Add an EXTENDED-palette widget to a Widget Blueprint's tree. Same authoring path as add_widget_to_blueprint but supports a wider set of widget types (resolved via /Script/UMG.<Name>), PLUS arbitrary native widget classes and UserWidget (nested Widget Blueprint) instances.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_type |
string | yes | one of TextBlock, Button, Image, VerticalBox, CanvasPanel, ProgressBar, Slider, CheckBox, ComboBoxString, ScrollBox, Border, Overlay, SizeBox, WidgetSwitcher, HorizontalBox, EditableTextBox, Spacer, GridPanel, RichTextBlock, EditableText, MultiLineEditableText, ComboBox, SpinBox, ScaleBox, SafeZone, UniformGridPanel, WrapBox, MenuAnchor (the curated names; see list_widget_types), OR any other native widget class path (e.g. /Script/UMG.Throbber, /Script/UMG.ListView), OR a UserWidget-derived Widget Blueprint to embed as a nested instance, by its /Game asset path (e.g. /Game/UI/WBP_HealthBar) or generated-class path (/Game/UI/WBP_HealthBar.WBP_HealthBar_C) |
widget_name |
string | yes | unique name for the new widget |
parent_name |
string | no | Optional name of a panel widget to host the new child; defaults to the root widget. |
Returns: { widget_bp_path: string, added_widget_name: string, widget_type: string, widget_class: string, parent_name: string, slot_class: string, added: bool, already_existed: bool, saved: bool, save_error: string }
add_widget_property_binding¶
Destructive.
Bind a widget PROPERTY to a function of the Widget Blueprint -- the Designer's "Bind" dropdown, headless. The property then recomputes every frame from that function instead of holding a fixed value (a health bar's Percent, a label's Text, a panel's Visibility). TWO RULES, both enforced by the ENGINE'S OWN validator (FDelegateEditorBinding::IsBindingValid, the same code the UMG compiler runs -- this tool does not second-guess it): the property is bindable only if its widget declares a companion delegate named "<Property>Delegate" (Text -> TextDelegate), and the function must have a COMPATIBLE SIGNATURE (same return type, NO parameters) and be PURE (BlueprintPure or const), because it is called while painting. A refusal names which of the two failed and, when the property is not bindable at all, lists the ones that are. Create the function first with add_blueprint_function + set its return type; one property can hold only ONE binding, so re-binding the same property REPLACES it (reported in replaced_existing).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | Name of the widget in the tree whose property gets bound (must be a direct variable of the UserWidget) |
property_name |
string | yes | Property to bind, e.g. "Text" on a TextBlock, "Percent" on a ProgressBar, "Visibility" on any widget. Must have a companion "<property_name>Delegate" on the widget's class. |
function_name |
string | yes | Name of the function ON THIS Widget Blueprint that supplies the value. Must be pure and take no parameters, returning the property's type. |
save |
boolean | no | Compile + save the Widget Blueprint when done (default true). The compile is what turns the editor binding into the runtime one, so a false here leaves the binding authored but not live. |
Returns: { widget_bp_path: string, widget_name: string, property_name: string, function_name: string, bound: bool, valid: bool, replaced_existing: bool, member_guid: string, validation_messages: [string], bindable_properties?: [string], saved: bool, save_error: string }
add_widget_to_blueprint¶
Additive, idempotent.
Add a widget to the tree of a Widget Blueprint asset as the last child of the panel parent_name (default the root, which must then be a panel), register it as a variable, then compile and save the blueprint; nesting a Widget Blueprint that contains this one is an error. Idempotent by name: a widget already called widget_name with the same class is returned as is (already_existed true), and the blueprint is compiled and saved only when it has unsaved changes; a widget of another class under that name is an error. Refused while PIE runs unless force=true; a failed save is an error. add_widget_extended takes the larger palette of list_widget_types.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_type |
string | yes | one of TextBlock, Button, Image, VerticalBox, CanvasPanel (the curated basic names; see list_widget_types), OR any native widget class path (e.g. /Script/UMG.Throbber), OR a UserWidget-derived Widget Blueprint to embed as a nested instance, by its /Game asset path (e.g. /Game/UI/WBP_HealthBar) or generated-class path (/Game/UI/WBP_HealthBar.WBP_HealthBar_C) |
widget_name |
string | yes | unique name for the new widget |
parent_name |
string | no | Optional name of a panel widget to host the new child; defaults to the root widget. |
Returns: { widget_bp_path: string, added_widget_name: string, widget_type: string, widget_class: string, parent_name: string, slot_class: string, added: bool, already_existed: bool, saved: bool, save_error: string }
apply_widget_style_preset¶
Destructive.
Apply ONE block of style properties to EVERY widget of a Widget Blueprint that matches a filter, in a single pass with ONE compile + ONE save -- the multi-widget companion to set_widget_property's multi-path form. Selection is target_widgets (explicit names, wins over everything) OR target_class (matched with IsA, so subclasses count) AND/OR name_pattern (wildcard). At least one selector is required: to hit every widget in the tree say so explicitly with name_pattern="*". Every value goes through the same honest applier, so the per-widget report distinguishes what landed from what was ignored; dry_run=true resolves the match and reports it WITHOUT writing, which is the cheap way to check a filter before it touches 40 widgets.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
preset |
object | no | Dict of {"<property or dotted path>": <value>} applied to each matched widget, e.g. {"WidgetStyle.Normal.TintColor":"#1B1B1BFF"}. Optional when the source_* params are used; when both are given the inline values WIN, so you can say "the theme, but this one in red". A path that does not exist on a given matched widget lands in that widget's ignored[] instead of failing the whole call. |
source_bp_path |
string | no | THEME MODE: /Game path of a Widget Blueprint holding a REFERENCE widget to copy the style from, instead of writing the values inline. This is what makes one widget the single source of truth rather than scattering the same colour across 40 calls. |
source_widget_name |
string | no | Name of the reference widget inside source_bp_path. Required with source_bp_path. |
source_property_paths |
array | no | Which paths to copy off the reference widget, e.g. ["WidgetStyle.Normal.TintColor","WidgetStyle.NormalPadding"]. A path that does not resolve on the REFERENCE is an error, not a silent skip: an incomplete theme that says nothing is worse than a refusal. Use audit_widget_style with the same reference + paths to find what has drifted before fixing it. |
target_class |
string | no | Class filter matched with IsA: a curated name (Button, TextBlock), a native class path (/Script/UMG.Button) or a Widget Blueprint asset path. Subclasses match too. |
name_pattern |
string | no | Wildcard on the widget's name (Btn_*, *_Title, or * for every widget). Combined with target_class as AND. |
target_widgets |
array | no | Explicit widget names. When present, target_class and name_pattern are IGNORED and only these are touched (reported in selector_used). |
dry_run |
boolean | no | Resolve the match and report it without writing anything (default false). |
save |
boolean | no | Compile + save the Widget Blueprint when done (default true; a dry run never saves). |
Returns: { widget_bp_path: string, selector_used: string, matched: [string], matched_count: int, dry_run: bool, results: [{widget_name, widget_class, applied, ignored, errors, failed_paths, applied_count, all_applied}], widgets_fully_applied: int, widgets_with_failures: int, saved: bool, save_error: string }
bind_widget_to_viewmodel¶
Destructive.
Append an FMVVMBlueprintViewBinding to a Widget BP's MVVM authoring state, with a REAL SourcePath/DestinationPath (resolved via reflection and written through UMVVMEditorSubsystem, then re-read to verify the write actually stuck).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_name |
string | yes | /Game path of the Widget Blueprint asset |
source_path |
string | yes | "ViewModel.Property" (exactly one dot): ViewModel = an existing viewmodel context name (added via add_viewmodel), Property = a reflected property on that viewmodel's class. Multi-segment ("A.B.C") is NOT supported. |
destination_path |
string | yes | "Widget.Property" (exactly one dot): Widget = a widget name in this Widget BP's WidgetTree, Property = a reflected property on that widget's class. Multi-segment is NOT supported. |
binding_mode |
string | no | optional: "OneWay" (default), "TwoWay", "OneTime", "OneWayToSource" |
Returns: { widget_blueprint_name, source_path, destination_path, binding_mode, created, binding_count, binding_id, source_path_verified, destination_path_verified, has_mvvm_extension }
click_pie_widget¶
Destructive.
Fire a LIVE UMG widget's event in the running PIE session (game thread): resolve a UWidget by name among the active viewport UserWidgets (reusing the read_pie_widgets walk) and BROADCAST its named BlueprintAssignable multicast delegate (default OnClicked). Unlike read_pie_widgets (read-only) this MUTATES runtime state -- it runs the exact bound handlers a real click would, including the client->server RPC path, so equip/inventory/craft UI flows can be driven headless instead of by a human (driving them via call_function bypasses that RPC path and yields false negatives). Errors clearly if no Play-In-Editor session is running or the widget/event is not found.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_name |
string | yes | Required. Name of the target UWidget in the live tree (as reported by read_pie_widgets), e.g. "ConfirmButton". Matches a widget inside an active viewport UserWidget's WidgetTree, or a top-level UserWidget by its own name. |
event |
string | no | Optional (default "OnClicked"): BlueprintAssignable multicast delegate to fire (e.g. "OnClicked", "OnPressed", "OnReleased"). |
child_name |
string | no | Optional: after resolving widget_name, drill into a descendant widget with this name (the resolved widget's own WidgetTree if it is a UserWidget, else a named child in its subtree) and fire the event on THAT widget instead. |
player_index |
number | no | Optional (default 0): when set, only consider viewport UserWidgets owned by the local player with this index (single-player PIE resolves globally). |
world |
string | no | Optional world selector: absent/'pie' (default: PlayWorld, else the first PIE context) | 'server' (the PIE world with authority) | 'client' | 'pie:N' | 'game' (alias of 'pie'). In a 2-player PIE session EVERY client has its OWN widgets, so the default may well read the other player's HUD. |
Returns: { success: bool, widget_name, resolved_widget, resolved_class, event, is_bound: bool, fired: bool, player_index, child_name?, world: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number } -- is_bound is false when the delegate exists but has no bound handlers (broadcast is still a safe no-op).
create_common_ui_stack¶
Additive.
Set the WidgetTree root to a UCommonActivatableWidgetStack (creating one if absent). root_class, when given, picks which UCommonActivatableWidgetStack subclass gets constructed (e.g. a project-authored BP subclass) -- an unresolvable or non-subclass value does not fail the call, it honestly falls back to the base stack class with a note (see root_class_note in the response).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_name |
string | yes | /Game path of the Widget Blueprint |
root_class |
string | no | Optional. Asset path (/Game/...) or /Script/<Module>.<ClassName> of a UCommonActivatableWidgetStack subclass. Omitted = base UCommonActivatableWidgetStack. |
Returns: { widget_blueprint_name, root_class?, already_existed, stack_class, root_class_requested, root_class_resolved, root_class_note?, root_changed, root_widget, root_widget_class }
create_widget¶
Additive.
Create a runtime UUserWidget instance of a concrete UserWidget class in a running PIE world (the default while PIE runs) or the editor world, owned by that world's first local PlayerController when there is one, and optionally AddToViewport it. Nothing is saved, and an unreferenced widget is garbage-collected. In the editor world add_to_viewport never adds (no PlayerController): read added_to_viewport. A taken name gets a unique variant, reported in widget_name; a class that does not load, is abstract or is not a UserWidget is an error. To change the asset use add_widget_to_blueprint; remove_widget searches the same worlds.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_class_path |
string | yes | Full path to widget class, e.g. '/Game/UI/MyWidget.MyWidget_C' |
widget_name |
string | yes | Name to assign to the created widget instance (a name another widget already has gets a unique variant, which widget_name in the response reports) |
add_to_viewport |
boolean | no | If true, AddToViewport the widget (optional, default false). It only ever really adds when the target world has a local PlayerController -- check added_to_viewport in the response, and see target_world for when that is possible at all. |
target_world |
string | no | Optional: "editor" | "pie" | "server" (the PIE world with authority) | "client" | "pie:N" | "game" (alias of "pie"). Defaults to "pie" when a Play-In-Editor session is running, else "editor". IMPORTANT: "editor" NEVER has a PlayerController, because GEditor's world is not a game world, so add_to_viewport can never really add there -- that is reported honestly (added_to_viewport stays false), never simulated. "pie" resolves the running PIE world and its first local PlayerController, so add_to_viewport there performs a REAL AddToViewport(). |
Returns: { widget_name: string, widget_class_path: string, widget_class_name: string, target_world: string, added_to_viewport: bool, add_to_viewport_note?: string, widget_valid: bool, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }
create_widget_blueprint¶
Additive.
Create (and save) a new UWidgetBlueprint asset with a CanvasPanel root.
| Parameter | Type | Required | Description |
|---|---|---|---|
package_path |
string | yes | /Game folder to create the asset in (e.g. /Game/UI) |
name |
string | yes | Asset name (no extension) |
parent_class |
string | no | Parent UUserWidget subclass (default "UUserWidget"). |
Returns: { name: string, package_path: string, asset_path: string, parent_class: string, created: bool, already_existed: bool, root_created: bool, root_widget: string, root_widget_class: string, saved: bool, save_error: string }
duplicate_widget¶
Additive.
Duplicate a widget (DuplicateObject<UWidget> outered to the WidgetTree) and add the clone under a target parent panel, copying the source's slot property values onto the new slot when the slot classes match. Refuses (clear error, no partial/broken result) to duplicate a panel widget that currently has children -- UE's object duplication would leave the clone's slots aliasing the SAME original child widgets rather than deep-copying them (see FDuplicateDataWriter); duplicate leaf widgets, or rebuild the panel's children individually with add_widget_extended. Name collisions on new_name are a clear error (not a silent alias of the pre-existing widget at that name).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | name of the widget to duplicate (must not be a panel widget with children) |
new_name |
string | yes | unique name for the duplicate |
target_parent_name |
string | no | Optional name of the panel widget to host the duplicate; defaults to the source widget's own current parent (sibling placement). |
Returns: { widget_bp_path: string, source_widget_name: string, new_widget_name: string, widget_class: string, target_parent_name: string, slot_class: string, slot_class_matched_source: bool, slot_properties_copied: int, duplicated: bool, saved: bool, save_error: string }
get_pie_focused_widget¶
Read-only.
Report which UMG widget currently has FOCUS in the running PIE session -- the assertion that makes gamepad navigation testable instead of eyeballed. Resolves FSlateApplication's focused SWidget and maps it back to the UMG UWidget that created it, by walking up to the owning SObjectWidget and matching cached widgets: the same route the engine's own navigation component uses, and it has to walk up because the widget holding focus is usually an internal SButton, not the one that maps 1:1 to a UWidget. Pair it with inject_key_input route="slate", the only input path that moves focus at all: press Down, read this, assert. Returns has_focus:false as an honest success (not an error) when nothing is focused -- which is itself the finding when a menu opens with no focus and every navigation key then appears to do nothing.
| Parameter | Type | Required | Description |
|---|---|---|---|
user_index |
number | no | Optional Slate user index (default 0). Local co-op players are separate Slate users, so player 2 is user 1. |
Returns: { has_focus: bool, slate_widget_type: string, widget_name: string, widget_class: string, owning_user_widget: string, owning_user_widget_class: string, resolved_to_umg: bool, note? } -- resolved_to_umg:false together with has_focus:true means something in Slate holds focus but it is not a UMG widget (the viewport, a native Slate panel); slate_widget_type still names it.
get_widget_animations¶
Read-only.
List the UWidgetAnimations of a Widget Blueprint asset, each with its object name, display_name and has_movie_scene, plus animation_count and the resolved asset_path. Read-only; add_widget_animation creates one and remove_widget_animation accepts either name.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | Asset path of the Widget Blueprint, e.g. "/Game/UI/WBP_MainMenu"; it must exist. |
Returns: { widget_bp_path: string, asset_path: string, animations: [{name, display_name, has_movie_scene}], animation_count: int }
get_widget_blueprint_tree¶
Read-only.
Return a Widget Blueprint's widget tree as nested {name, class, children[]} AND, on request, the actual VALUES of its widgets and slots -- which is what makes verifying a style a cheap read instead of a PIE session. Off by default (a bare tree is what name-only callers want); three switches turn it on: property_paths reads exact dotted paths ("WidgetStyle.Normal.TintColor") on every node whether or not they still hold the default -- this is the oracle that closes a set_widget_property; include_properties reports only what DIFFERS from each widget's archetype, i.e. what this Widget Blueprint actually changed, instead of the ~120 inherited properties nobody reads; include_slot adds each widget's UPanelSlot class plus its own non-default values (position, anchors, padding, row/column). Values come back as TYPED JSON, not UE export-text. widget_name dumps one subtree instead of the whole asset.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | no | Optional: dump only this widget and its descendants instead of the whole tree. |
property_paths |
array | no | Optional list of property names or dotted paths read on EVERY node, emitted under "properties" even when the value is still the default. A path that does not exist on a given widget is listed in that node's "unresolved_property_paths" (normal: a WidgetStyle has no meaning on a TextBlock), never silently dropped. |
include_properties |
boolean | no | Emit each widget's editable properties that DIFFER from its archetype, under "non_default_properties" (default false). |
include_slot |
boolean | no | Emit each widget's UPanelSlot class and its non-default slot values under "slot" (default false). |
include_navigation |
boolean | no | Emit each widget's six gamepad/keyboard navigation directions under "navigation" (default false). A widget with no authored navigation reports all six as Escape with has_authored_navigation:false -- which is what it will actually do in game, rather than an empty object the caller has to interpret. Author them with set_widget_navigation. |
max_depth |
number | no | Optional recursion limit (-1 = unlimited, the default). A panel cut off by the limit reports "children_omitted" instead of passing for a leaf. |
Returns: { widget_bp_path: string, asset_path: string, widget_count: int, root_widget: string, dumped_root: string, include_properties: bool, include_slot: bool, include_navigation: bool, property_paths: [string], tree: {name, class, properties?, unresolved_property_paths?, non_default_properties?, slot?, children: [...], children_omitted?} }
get_widget_hierarchy¶
Read-only.
Retrieve the widget hierarchy tree including parent, children, and nested structure information.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_name |
string | yes | Name of the widget to query |
Returns: { widget_name: string, hierarchy: { name: string, class: string, depth: number, valid: bool, enabled: bool, visibility: string, size?: { width, height }, position?: { x, y, z }, children: [object], child_count: number }, widget_valid: bool }
get_widget_properties¶
Read-only.
Retrieve detailed properties and state information for a widget by name.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_name |
string | yes | Name of the widget to query |
Returns: { widget_name: string, widget_class: string, widget_valid: bool, widget_visible: bool, visibility: string, size?: { width: number, height: number }, position?: { x: number, y: number, z: number }, rotation?: { pitch: number, yaw: number, roll: number }, scale?: { x: number, y: number, z: number }, parent_widget?: string, parent_class?: string, child_count: number, is_enabled: bool, has_focus: bool }
list_level_widget_components¶
Read-only.
CALL THIS FIRST to discover valid widget_name values instead of guessing: it enumerates ALL UWidgetComponents on ALL actors of the current EDITOR level, which is the EXACT population that get_widget_properties / set_widget_visibility / get_widget_hierarchy search by widget_name (remove_widget searches it too). It reads GEditor's world and never a running PIE session (use read_pie_widgets for that), and it lists every widget component on an actor, not just the first. WARNING: THIS POPULATION IS NOT WIDGET BLUEPRINTS, and that is the trap the name does not warn you about: these are world-space UWidgetComponents hosted on actors. To author the CONTENT of a Widget Blueprint asset -- its tree, styles or layout -- you want get_widget_blueprint_tree / set_widget_property / set_widget_slot_properties instead. In particular ANCHORS live on a UCanvasPanelSlot inside a Widget Blueprint's tree and have no meaning at all on a level UWidgetComponent: set them with set_widget_slot_properties(widget_bp_path, widget_name, anchors=[min_x,min_y,max_x,max_y]).
| Parameter | Type | Required | Description |
|---|---|---|---|
actor_name_filter |
string | no | Optional substring filter on the owning actor's name (Contains match) |
Returns: { components: [{ actor_name: string, widget_component_name: string, widget_name: string|null, widget_class: string|null }], component_count: number, actor_name_filter: string|null }
list_widget_property_bindings¶
Read-only.
List the UMG PROPERTY BINDINGS of a Widget Blueprint -- the "Bind" dropdown next to a property in the Designer's details panel, which makes that property recompute every frame by calling a function instead of holding a fixed value. These live in UWidgetBlueprint::Bindings, NOT in the widget tree and NOT in the event graph, so no other reader sees them; and UWidgetBlueprint::Bindings is NOT exposed to Python either (get_editor_property("bindings") throws), so this is the only headless way to read them. Each entry is re-validated live with the engine's own FDelegateEditorBinding::IsBindingValid, so a binding whose function was renamed or made non-pure comes back valid:false WITH the compiler's reason -- that is the difference between "there is a binding" and "there is a binding that works".
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
include_bindable_properties |
boolean | no | Also list, per widget in the tree, which properties ACCEPT a binding at all (default false). A property is bindable only if its widget declares a companion delegate named "<Property>Delegate" -- this saves guessing. |
Returns: { widget_bp_path: string, binding_count: int, bindings: [{ widget_name, property_name, function_name, kind, member_guid, source_property, valid, validation_messages: [string] }], bindable_properties?: {widget_name: [string]} }
list_widget_types¶
Read-only.
List the CURATED widget_type names accepted by add_widget_to_blueprint (family="basic") / add_widget_extended (family="extended", the default -- a strict superset of basic), with each entry's resolved /Script/UMG.<Name> class path and whether LoadObject actually resolves it in this build (should always be true; reported for honesty rather than assumed). This list is a convenience shortlist, NOT the full set of accepted values -- both tools also accept any native widget class path (/Script/Module.ClassName) and any UserWidget-derived Widget Blueprint's /Game asset path (embeds a nested instance); see custom_class_note in the response.
| Parameter | Type | Required | Description |
|---|---|---|---|
family |
string | no | Optional "basic" | "extended" (default "extended") |
Returns: { family: string, widget_types: [{ widget_type: string, class_path: string, resolvable: bool }], count: int, custom_class_note: string }
play_widget_animation¶
Destructive.
Play a widget animation. REAL playback (UUserWidget::PlayAnimation) when a live PIE instance of this WidgetBP is found in the viewport's active UUserWidgets; falls back to an honest headless gate (played:false, headless:true, requires_pie:true) when no PIE session is running or no live instance is found.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
animation_name |
string | yes | object name OR display label of the animation to play |
start_at_time |
number | no | Optional float seconds to start playback at (default 0). |
num_loops |
number | no | Optional int number of loops (default 1). |
play_mode |
string | no | Optional Forward | Reverse | PingPong (default Forward). |
playback_speed |
number | no | Optional float speed multiplier (default 1.0). |
restore_state |
boolean | no | Optional bool: restore the pre-animation state on finish (default false). |
world |
string | no | Optional world selector: absent/'pie' (default: PlayWorld, else the first PIE context) | 'server' (the PIE world with authority) | 'client' | 'pie:N' | 'game' (alias of 'pie'). In a 2-player PIE session EVERY client has its OWN widgets, so the default may well read the other player's HUD. |
Returns: { widget_bp_path: string, animation_name: string, animation_exists: bool, played: bool, headless: bool, requires_pie: bool, note: string, saved: bool, live_widget_name?: string, live_animation_name?: string, world: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }
pop_common_ui_widget¶
Destructive.
Pop the ACTIVE screen off a live CommonUI stack, or clear the whole stack -- the inverse of push_common_ui_widget and the other half of driving a menu state machine headless (open, go deeper, come back, assert what is on top). WARNING: RUNTIME ONLY, same as the push: with no PIE session there is nothing on any stack. Popping an empty stack is an honest success with popped:false, not an error.
| Parameter | Type | Required | Description |
|---|---|---|---|
stack_widget_name |
string | yes | Name of the live activatable container in the running session. |
clear_all |
boolean | no | Remove EVERY widget instead of just the active one (default false). |
player_index |
number | no | Optional local player index whose viewport widgets are searched (default 0). |
world |
string | no | Optional world selector: absent/'pie' | 'server' | 'client' | 'pie:N'. |
Returns: { stack_widget_name, popped: bool, popped_widget: string, cleared_all: bool, widget_count: int, active_widget: string } -- widget_count and active_widget are read AFTER the operation; popped:false with widget_count:0 means the stack was already empty.
push_common_ui_widget¶
Additive.
Push a screen onto a LIVE CommonUI activatable stack in the running PIE session -- the operation that lets a menu state machine be driven to a specific state and then asserted. create_common_ui_stack only puts the stack in place; its contents are populated at runtime with AddWidget, which this calls headless, so "open the pause menu, then the options page, now check the back button" is reproducible. WARNING: RUNTIME ONLY: the container's widget list and its widget pool are Transient, so with no PIE session there is genuinely nothing to push onto and this says so rather than pretending. The pushed widget is activated by the stack itself; read the result with get_common_ui_stack or read_pie_widgets, and move focus into it with set_pie_widget_focus.
| Parameter | Type | Required | Description |
|---|---|---|---|
stack_widget_name |
string | yes | Name of the live UCommonActivatableWidgetStack (or any activatable container) in the running session. Resolved like click_pie_widget, nested Widget Blueprints included. |
widget_class |
string | yes | The UCommonActivatableWidget class to push: a /Game Widget Blueprint path, its generated-class path, or a native class path. |
player_index |
number | no | Optional local player index whose viewport widgets are searched (default 0). |
world |
string | no | Optional world selector: absent/'pie' | 'server' | 'client' | 'pie:N'. |
Returns: { stack_widget_name, pushed_class, pushed_widget: string, widget_count: int, active_widget: string } -- widget_count and active_widget are read off the stack AFTER the push, so they are evidence rather than an echo.
read_pie_widgets¶
Read-only.
Read LIVE UMG from the running PIE session (game thread): enumerate the active UUserWidgets added to the viewport and walk each widget tree, emitting name/class plus optional visibility/hover/text/value/geometry as a parent/child tree. Reads only game-thread-safe widget-tree state (never the render thread). Errors clearly if no Play-In-Editor session is running. DESCENDS INTO NESTED WIDGET BLUEPRINTS: an AAA screen is a Widget Blueprint composed of Widget Blueprints, so everything interesting sits one level below the first. Cycles are handled with a visited set plus max_depth, and a subtree that IS cut says so in subtree_omitted instead of looking like a leaf. Rich text is read too (URichTextBlock does not derive from UTextBlock). Not implemented: include_bindings, which is accepted and flagged in bindings_note.
| Parameter | Type | Required | Description |
|---|---|---|---|
root_filter |
string | no | Optional case-sensitive substring; only top-level UserWidgets whose object name contains it are returned. |
include_text |
boolean | no | Optional bool (default true): include UTextBlock text. |
include_visibility |
boolean | no | Optional bool (default true): include visibility, is_hovered and has_keyboard_focus per widget. has_keyboard_focus is what tells you whether a navigation key will do anything at all: with nothing focused every key is a no-op, which reads exactly like broken navigation. |
include_bindings |
boolean | no | Optional bool (default false): NOT implemented in this subset; sets bindings_note when true. |
include_values |
boolean | no | Optional bool (default false): include is_enabled + widget-type-specific value (Slider.value / ProgressBar.percent / CheckBox.is_checked / ComboBoxString.selected_option). |
include_geometry |
boolean | no | Optional bool (default false): include GetCachedGeometry()-derived absolute_position/absolute_size, render_opacity, and render_transform. |
max_depth |
number | no | Optional recursion limit (-1 = unlimited, the default). Counts every level including the descent into a nested Widget Blueprint's own tree. A subtree cut by the limit reports subtree_omitted rather than passing for a leaf. |
world |
string | no | Optional world selector: absent/'pie' (default: PlayWorld, else the first PIE context) | 'server' (the PIE world with authority) | 'client' | 'pie:N' | 'game' (alias of 'pie'). In a 2-player PIE session EVERY client has its OWN widgets, so the default may well read the other player's HUD. |
Returns: { widgets: [{ widget_name, class, is_any_animation_playing, visibility?, is_hovered?, children: [{ widget_name, class, visibility?, is_hovered?, text?, is_enabled?, value?, percent?, is_checked?, selected_option?, geometry?, children: [...] }] }], widget_count: int, scanned_viewport_widgets: int, include_text: bool, include_visibility: bool, include_bindings: bool, include_values: bool, include_geometry: bool, bindings_note?: string, world: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }
remove_viewmodel¶
Destructive, idempotent.
Remove a UMVVMViewModelContext (by context name) from a Widget BP's MVVM authoring state. Inverse of add_viewmodel; idempotent (already-absent is an honest success).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_name |
string | yes | /Game path of the Widget Blueprint asset (string) |
context_name |
string | yes | FName identifying the context to remove (idempotency key) |
Returns: { widget_blueprint_name, context_name, already_existed, removed, view_model_count, has_mvvm_extension, saved, save_error? }
remove_widget¶
Destructive.
Detach a runtime UserWidget, found by object name, from the viewport or panel holding it with RemoveFromParent. It searches the worlds create_widget uses: the one target_world names, or without it the running PIE world first and then the editor world; in each, the first widget hosted by a level UWidgetComponent, then any other UserWidget of that world. The object is not deleted, no asset changes and there is no undo. was_in_viewport and had_parent are measured before the call: both false means nothing was detached, as for a component-hosted widget. It never edits a Widget Blueprint asset.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_name |
string | yes | Object name of the runtime widget to detach (case-insensitive), as list_level_widget_components or create_widget report it |
target_world |
string | no | Optional world to search, with the values create_widget takes (editor, pie, server, client, pie:N, game). Omitted: the PIE world while PIE runs, then the editor world. |
Returns: { widget_name: string, target_world: string, was_in_viewport: bool, had_parent: bool, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }
remove_widget_animation¶
Destructive.
Remove a UWidgetAnimation from a Widget Blueprint. Inverse of add_widget_animation: finds the animation by object name or display label, removes it from WidgetBP->Animations, unregisters it as a blueprint variable (OnVariableRemoved), then compiles and saves. If no such animation exists it is an honest no-op (removed:false, already_existed:false, no save).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
animation_name |
string | yes | object name OR display label of the animation to remove |
Returns: { widget_bp_path: string, animation_name: string, object_name: string, removed: bool, already_existed: bool, animation_count: int, saved: bool, save_error: string }
remove_widget_property_binding¶
Destructive, idempotent.
Remove a UMG property binding (the Designer's "Bind" dropdown set back to none), so the property goes back to holding its authored fixed value. Inverse of add_widget_property_binding and idempotent: a property that was not bound is an honest success with removed:false, never an error.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | Name of the widget whose binding to drop |
property_name |
string | yes | The bound property, e.g. "Text". Matching is on widget_name + property_name, which is exactly how UMG identifies a binding (one binding per property, max). |
save |
boolean | no | Compile + save the Widget Blueprint when done (default true). |
Returns: { widget_bp_path: string, widget_name: string, property_name: string, removed: bool, already_absent: bool, remaining_binding_count: int, saved: bool, save_error: string }
rename_widget¶
Destructive.
Rename a widget in a Widget Blueprint's tree (WidgetTree membership, blueprint variable map, bindings, and animation bindings all updated in one call -- the same path as the Designer's F2).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
old_name |
string | yes | current name of the widget in the tree |
new_name |
string | yes | desired new name |
Returns: { widget_bp_path: string, old_name: string, new_name: string, resolved_name: string, renamed: bool, saved: bool, save_error: string }
render_widget_preview¶
Destructive.
Render a Widget Blueprint to a PNG on disk WITHOUT running the game: builds the widget with the editor's own designer flags, draws it through FWidgetRenderer into a render target and writes the file. This is what turns "does this style look right?" from a PIE session someone has to watch into a static read plus one image to LOOK at. HONEST SCOPE: it is a DESIGN preview, the same thing the UMG Designer shows -- not the live HUD. Anything that only exists while the game runs (text filled in NativeConstruct, property bindings, ViewModel data, anything behind an IsDesignTime() guard) renders at its default/empty value. Use read_pie_widgets or capture_pie_screenshot for the running session. Returns rendered:false with a reason (never a blank image) when the editor has no RHI (-nullrhi/headless), because FWidgetRenderer cannot draw there.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset to render |
output_path |
string | no | Optional output file. A bare name lands under <ProjectSaved>/MCP/WidgetPreviews/, an absolute path is used verbatim, and .png is appended when missing. Defaults to the asset's name. |
width |
number | no | Optional render width in pixels. Omit BOTH width and height to render at the widget's own desired size (a Slate prepass measures it). |
height |
number | no | Optional render height in pixels. Omit BOTH width and height to render at the widget's own desired size. |
scale |
number | no | Optional draw scale applied by the renderer (default 1.0), the equivalent of DPI scaling in the Designer. |
opaque_background |
boolean | no | Optional (default false). Force every pixel's alpha to 255 so the PNG is not transparent where the widget did not paint -- the same trick capture_viewport uses. Leave false to keep real transparency. |
Returns: { widget_bp_path: string, rendered: bool, file_path: string, width: int, height: int, scale: number, drew_at_desired_size: bool, byte_size: int, designer_flags: string, preview_note: string, error?: string }
reorder_widget_child¶
Destructive.
Change a widget's index among its parent panel's children via UPanelWidget::ShiftChild (clamps new_index internally; safe with any int). For a CanvasPanel parent, visual stacking is governed by each child's CanvasPanelSlot ZOrder (set_widget_slot_properties z_order), NOT child index -- the index shift is still applied and reported honestly, with a note.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | name of the widget to reorder |
new_index |
number | yes | desired index among its parent's children (clamped to [0, child_count]) |
Returns: { widget_bp_path: string, widget_name: string, parent_name: string, old_index: int, requested_index: int, resolved_index: int, child_count: int, reordered: bool, parent_is_canvas_panel: bool, note?: string, saved: bool, save_error: string }
reparent_widget¶
Destructive.
Move a widget to a new parent panel (optionally at a specific child index), via FWidgetBlueprintOperationUtils::MoveWidget -- the same primitive backing the Designer's drag-and-drop reparent. Validates the new parent is a panel widget and refuses to create a cycle. Optional slot_properties are applied to the widget's NEW slot afterward via the shared reflection setter (e.g. {"Row":1,"Column":2} for a GridSlot). THIS IS ALSO HOW YOU FILL A NAMED SLOT: a UNamedSlot is a UContentWidget (hence a panel), so add one with add_widget_extended widget_type="NamedSlot" and reparent the content into it -- there is no separate SetContentForSlot tool and none is needed (it answers reparented:true, new_slot_class:PanelSlot).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | name of the widget to move |
new_parent_name |
string | yes | name of the panel widget to become the new parent |
target_index |
number | no | Optional int child index to insert at (default: append at the end) |
slot_properties |
object | no | Optional object of {PropertyName: value} applied to the resulting slot via reflection (best-effort; per-field errors are reported, not fatal) |
Returns: { widget_bp_path: string, widget_name: string, old_parent_name: string, new_parent_name: string, new_slot_class: string, resolved_child_index: int, reparented: bool, slot_properties_applied: int, slot_property_errors?: [string], saved: bool, save_error: string }
scaffold_menu_screen¶
Additive.
Build a styled menu screen: create or reuse the Widget Blueprint at package_path/name with a centred panel, optional title and one button per entry bound to an event-graph OnClicked handler, then compile and save. Re-runs reuse widgets and bindings. Returns contrast_ratio_normal_text; the default colors pass audit_widget_accessibility. Layout is not measured (long labels can clip) and text is inline, not String Table.
| Parameter | Type | Required | Description |
|---|---|---|---|
package_path |
string | yes | /Game folder for the new Widget Blueprint (e.g. /Game/MyGame/UI). |
name |
string | yes | Asset name, e.g. WBP_OptionsMenu. |
entries |
array | yes | REQUIRED, the buttons top to bottom. Each item is either a plain string (the label) or an object {label, handler_name?}. handler_name names the generated event-graph function; omitted, it becomes On<Label>Clicked. Order is preserved. |
title |
string | no | Optional heading text above the buttons. Omitted or empty = no title widget at all (not an empty one). |
parent_class |
string | no | Parent UUserWidget subclass (default "UUserWidget"). Pass a CommonUI activatable class here to scaffold a screen for a CommonUI stack. |
background |
boolean | no | Draw the background panel (default true). false leaves the buttons floating on nothing -- which is what makes contrast unjudgeable, so it also drops contrast_ratio_normal_text from the payload. |
panel_color |
string | no | Background panel colour. "#RRGGBBAA", [r,g,b,a] (LINEAR 0..1) or {R,G,B,A}. Default is a near-black panel. |
button_color |
string | no | Button resting colour, same formats. If you override this, you own the contrast: the returned ratio tells you what you got. |
text_color |
string | no | Label colour for title and buttons, same formats. Default white. |
title_font_size |
number | no | Title text size in Slate font points, truncated to a whole number; default 36. Unused when title is empty. |
button_font_size |
number | no | Button label size in Slate font points, truncated to a whole number; default 20. It also sets the contrast floor checked (3:1 at 18 or more, else 4.5:1); under 12 is what audit_widget_accessibility flags as small_text. |
panel_width |
number | no | Panel width in pixels (default 480). |
panel_height |
number | no | Panel height in pixels (default 560). |
bind_events |
boolean | no | Wire each button's OnClicked to a handler in the event graph (default true). false builds the visuals only. |
theme_source_bp |
string | no | Optional /Game path of a Widget Blueprint holding a reference Button whose style is copied onto every generated button INSTEAD of the built-in defaults (same idea as apply_widget_style_preset's theme mode: one widget is the single source of truth). |
theme_source_widget |
string | no | Name of the reference Button inside theme_source_bp. Required with it. |
save |
boolean | no | Compile + save when done (default true). |
Returns: { widget_bp_path, asset_path, created, already_existed, root_widget, panel_widget, box_widget, title_widget, entries: [{label, button_widget, text_widget, handler_name, bound, already_bound, error}], entry_count, buttons_bound, colors: {panel, button, text}, contrast_ratio_normal_text, contrast_required, contrast_passes, contrast_note, theme_source, compiled, saved, save_error }
set_box_slot_properties¶
Destructive, idempotent.
Configure a widget's box-family slot layout (alignment/padding/size). Applies when the widget is parented under a HorizontalBox/VerticalBox/Overlay/Border/SizeBox/ScrollBox; dispatches by the concrete slot type. Size only applies to Horizontal/Vertical/ScrollBox slots -- on the others it is returned as an honest note. For a CanvasPanel child use set_widget_slot_properties; for a GridPanel child use set_grid_slot_properties.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | name of the child widget whose box slot to edit |
horizontal_alignment |
string | no | Optional alignment: Fill | Left | Center | Right |
vertical_alignment |
string | no | Optional alignment: Fill | Top | Center | Bottom |
padding |
array | no | Optional [Left, Top, Right, Bottom] floats (also accepts [uniform] or [horizontal, vertical]). |
size_rule |
string | no | Optional Fill | Auto (Horizontal/Vertical/ScrollBox slots only). |
size_value |
number | no | Optional float fill weight (used with size_rule = Fill; default 1.0). |
Returns: { widget_bp_path: string, widget_name: string, slot_type: string, settings_applied: object, applied_count: int, notes: [string], saved: bool, save_error: string }
set_grid_slot_properties¶
Destructive, idempotent.
Configure a widget's UGridSlot layout (row/column/spans/alignment/padding/layer/nudge). Applies when the widget is parented under a GridPanel (create one with add_widget_extended widget_type="GridPanel"). Setting the same values again is idempotent.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | name of the child widget whose grid slot to edit |
row |
number | no | Optional int row index of the cell |
column |
number | no | Optional int column index of the cell |
row_span |
number | no | Optional int number of rows this slot spans |
column_span |
number | no | Optional int number of columns this slot spans |
horizontal_alignment |
string | no | Optional alignment: Fill | Left | Center | Right |
vertical_alignment |
string | no | Optional alignment: Fill | Top | Center | Bottom |
padding |
array | no | Optional [Left, Top, Right, Bottom] floats. |
layer |
number | no | Optional int draw/hit-test layer offset (positive draws on top). |
nudge |
array | no | Optional [X, Y] content offset. |
Returns: { widget_bp_path: string, widget_name: string, slot_type: string, settings_applied: object, applied_count: int, saved: bool, save_error: string }
set_named_slot_content¶
Destructive, idempotent.
Put a widget into a NAMED SLOT of a NESTED Widget Blueprint instance -- the "template screen with holes" pattern. reparent_widget already fills a UNamedSlot that belongs to your own tree (it is a UContentWidget, so it is just a panel), but the slot of an embedded instance is not a panel in your tree at all: it is an entry in that instance's NamedSlotBindings, and no other tool writes it. WARNING: the engine's SetContentForSlot returns nothing and SILENTLY DROPS the binding when the slot name does not exist, so this re-reads it with GetContentForSlot afterwards and reports the RE-READ, never the call. List what a given instance offers with available_slots in the response, or pass no slot_name at all to just enumerate them.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the OUTER Widget Blueprint (the one that owns both the nested instance and the content). |
host_widget_name |
string | yes | Name of the nested Widget Blueprint instance in the outer tree -- the widget that OWNS the slot. |
slot_name |
string | yes | Name of the named slot to fill. Omit to only enumerate what the host offers (nothing is written, available_slots is still returned). |
content_widget_name |
string | no | Name of the widget in the OUTER tree to place in the slot. It must already exist there (add_widget_extended creates it). Omit together with clear=true to empty the slot. |
clear |
boolean | no | Empty the slot instead of filling it (default false). Mutually exclusive with content_widget_name. |
save |
boolean | no | Compile + save the Widget Blueprint when done (default true). |
Returns: { widget_bp_path, host_widget_name, host_class, available_slots: [string], slot_name, content_widget_name, filled: bool, verified_content: string, saved, save_error } -- verified_content is what GetContentForSlot returns AFTER the write: empty when the engine dropped the binding, which is the only way to tell that from a success.
set_pie_list_view_items¶
Destructive, idempotent.
Populate a LIVE UListView/UTileView in the running PIE session. Resolves widget_name (optionally drilling into child_name) among the active viewport UserWidgets using the same walk click_pie_widget uses, resolves each entry in items[] to a UObject* (an actor name/label in the PIE world, else a /Game asset path via FSoftObjectPath::TryLoad), then calls SetListItems (or AddItems when append=true). Companion to add_list_view/add_tile_view, which only construct an EMPTY view.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_name |
string | yes | Required. Name of the target UListView/UTileView in the live tree (as reported by read_pie_widgets), resolved the same way click_pie_widget resolves widget_name. |
items |
array | yes | Required array of strings. Each entry is either an actor name/label to resolve in the PIE world, or a /Game asset path to load via FSoftObjectPath::TryLoad. |
child_name |
string | no | Optional: after resolving widget_name, drill into a descendant widget with this name and populate THAT widget instead. |
player_index |
number | no | Optional (default 0): restrict widget resolution to viewport UserWidgets owned by this local player index (single-player PIE resolves globally). |
append |
boolean | no | Optional (default false). false = SetListItems (replaces the current item list). true = AddItems (appends). |
refresh |
boolean | no | Optional (default true). Accepted for API symmetry: UListView::SetListItems/AddItems call UListViewBase::RequestRefresh() UNCONDITIONALLY, so refresh=false cannot honestly suppress it -- see refresh_note in the response rather than a silent no-op. |
world |
string | no | Optional world selector: absent/'pie' (default) | 'server' | 'client' | 'pie:N' | 'game' (alias of 'pie'). In a 2-player PIE session each client owns its own widgets. |
Returns: { success, widget_name, resolved_widget, resolved_class, child_name?, player_index, requested_items, resolved_count, unresolved_items[], append, refresh, refresh_note, item_count_after, world: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }
set_pie_widget_focus¶
Destructive, idempotent.
Give keyboard/gamepad FOCUS to a live UMG widget in the running PIE session, so navigation has somewhere to start from. Menus routinely open with nothing focused, and then every navigation key does nothing -- which reads exactly like broken navigation and sends you to debug rules that were fine. Resolves the widget the same way click_pie_widget does (widget_name, optionally drilling in with child_name, nested Widget Blueprints included), then calls UWidget::SetKeyboardFocus. Verify with get_pie_focused_widget and drive from there with inject_key_input route="slate".
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_name |
string | yes | Name of a live UserWidget added to the viewport, or of a widget inside one. |
child_name |
string | no | Optional: after resolving widget_name, drill into this descendant by name (nested Widget Blueprints included). |
player_index |
number | no | Optional local player index whose viewport widgets are searched (default 0). |
world |
string | no | Optional world selector, same rules as read_pie_widgets: absent/'pie' | 'server' | 'client' | 'pie:N'. |
Returns: { focused: bool, widget_name: string, widget_class: string, has_keyboard_focus: bool } -- has_keyboard_focus is RE-READ off the widget after the call, so it is evidence and not an echo: false means Slate refused the focus, and the usual cause is that the widget is not focusable (check IsFocusable and its Visibility -- a HitTestInvisible widget cannot take focus).
set_pie_widget_value¶
Destructive, idempotent.
Set a LIVE PIE input widget's REAL value (companion to click_pie_widget, which only broadcasts a delegate with zero-init params and never touches Slider/CheckBox/EditableTextBox/ComboBoxString state first). Resolves the widget exactly like click_pie_widget (same widget_name/child_name/player_index rules), then calls the widget's real setter: USlider::SetValue, UCheckBox::SetIsChecked, UEditableTextBox::SetText/UEditableText::SetText, UComboBoxString::SetSelectedOption, or UProgressBar::SetPercent. fire_event genuinely gates a manual OnCheckStateChanged/OnTextChanged(+OnTextCommitted) broadcast for CheckBox/EditableText(Box); Slider/ComboBoxString auto-broadcast on the engine side whenever the value actually changes (fire_event cannot suppress that -- see event_fired_note); ProgressBar has no change event at all. Errors clearly if no PIE session is running, the widget is not found, or its class is not one of the supported input types.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_name |
string | yes | Required. Name of the target UWidget in the live tree (as reported by read_pie_widgets). |
value |
object | yes | Required object: {"type":"float"|"bool"|"string", "value": <matching JSON type>}. |
child_name |
string | no | Optional: drill into a descendant widget with this name after resolving widget_name. |
player_index |
number | no | Optional (default 0): filter to viewport UserWidgets owned by this local player index. |
fire_event |
boolean | no | Optional bool (default true): broadcast the widget's change event where the engine does not already do so unconditionally (CheckBox / EditableTextBox / EditableText). |
commit_type |
string | no | Optional "Default" | "OnEnter" | "OnUserMovedFocus": when present (EditableTextBox/EditableText only, and fire_event is true), also broadcasts OnTextCommitted with this commit type. |
world |
string | no | Optional world selector: absent/'pie' (default: PlayWorld, else the first PIE context) | 'server' (the PIE world with authority) | 'client' | 'pie:N' | 'game' (alias of 'pie'). In a 2-player PIE session EVERY client has its OWN widgets, so the default may well read the other player's HUD. |
Returns: { widget_name, resolved_widget, resolved_class, value_type, value, set: bool, event_fired: bool, player_index, child_name?, event_fired_note?, world: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }
set_slot_properties¶
Destructive, idempotent.
Set ANY property of a widget's UPanelSlot BY REFLECTION, whatever the concrete slot class is -- including the 9 of UMG's 17 slot types that no shortcut covers (UButtonSlot, which is every widget inside a Button; UUniformGridSlot, UWrapBoxSlot, UStackBoxSlot, UWidgetSwitcherSlot, USafeZoneSlot, UScaleBoxSlot, UBackgroundBlurSlot, UWindowTitleBarAreaSlot) and any slot type a future engine version adds. Accepts dotted paths into nested slot structs ("Padding.Left", "Size.SizeRule") and reports field by field what landed, same honest contract as set_widget_property: the oracle is applied[]/ignored[]/errors[], not success. For the common cases prefer the validated shortcuts, which also normalise formats this does not guess: set_widget_slot_properties (CanvasPanel anchors/offsets/z-order), set_box_slot_properties (HorizontalBox/VerticalBox/Overlay/Border/SizeBox/ScrollBox alignment+padding+size) and set_grid_slot_properties (GridPanel row/column/spans).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | name of the widget whose slot to edit (its PARENT panel decides the slot class; read it from get_widget_blueprint_tree include_slot=true) |
properties |
object | yes | {"<property or dotted path>": <value>, ...} written onto the slot object, e.g. {"Padding":[8,4,8,4],"HorizontalAlignment":"HAlign_Center"}. Enums accept the short name; FMargin accepts a scalar, [h,v] or [l,t,r,b]. |
save |
boolean | no | Compile + save the Widget Blueprint when done (default true). |
Returns: { widget_bp_path: string, widget_name: string, parent_name: string, slot_class: string, requested_paths: [string], applied: [string], ignored: [string], errors: [{path, error}], failed_paths: [string], applied_count: int, all_applied: bool, current_values: object, saved: bool, save_error: string }
set_viewmodel_field¶
Destructive, idempotent.
Instantiate a UMVVMViewModelBase on a UUserWidget instance and set it via UMVVMBlueprintLibrary::SetViewModelByClass.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_instance_name |
string | yes | Label (Actor label or asset path) used to find an in-world UUserWidget |
view_model_class |
string | yes | VM class: asset path or /Script/<Module>.<ClassName> |
context_name |
string | yes | FName of the target context on the widget |
Returns: { widget_instance_name, view_model_class, context_name, set, instance_class }
set_widget_drag_drop¶
Destructive, idempotent.
Honest gap report: there is no UWidget UPROPERTY that exposes DragDropOperationClass, and OnDragDetected/OnDrop are DECLARE_DYNAMIC delegates (not reflectively assignable). The drag/drop behavior must be configured in the widget BP graph.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_name |
string | yes | /Game path of the Widget Blueprint |
widget_name |
string | yes | FName of the target widget inside the tree |
operation_class |
string | no | /Script/...DragDropOperation or subclass path |
Returns: { widget_blueprint_name, widget_name, operation_class, set: false, has_drag_drop_property: false, note }
set_widget_navigation¶
Destructive, idempotent.
Author a widget's GAMEPAD/KEYBOARD navigation rules -- what gets focus when the player pushes up, down, left, right, Tab or Shift+Tab off this widget. Without this a menu cannot be driven with a pad, and it is NOT reachable through set_widget_property: UWidget::Navigation is an Instanced SUBOBJECT that starts null, so there is no asset path a reflection setter could point at and a dotted path fails on a null segment. Follows the editor's own flow, including the two details that matter: the subobject is created RF_Transactional with template flags propagated, and if all six directions end up on Escape the subobject is DISCARDED (that is what tells "no navigation authored" apart from "navigation authored that happens to be the default", and it is what the Designer does). Read the result back with get_widget_blueprint_tree include_navigation=true.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | Name of the widget in the tree whose navigation to author |
rules |
object | no | Dict of {direction: rule}. Direction is Up|Down|Left|Right|Next|Previous (Next/Previous are Tab/Shift+Tab). The value is either a rule name string ("Wrap", "Stop", "Escape") or an object {"rule":"Explicit","widget_to_focus":"Btn_Confirm"} when the rule needs a target. Rules: Escape (default -- let the search continue outward), Stop (movement dies here), Wrap (cycle inside the container), Explicit (jump to widget_to_focus). |
all_directions |
string | no | Optional rule name applied to ALL SIX directions before rules is processed, so you can say "Stop everywhere, except Down" in one call. Explicit is refused here: it would need six different targets. |
save |
boolean | no | Compile + save the Widget Blueprint when done (default true). |
Returns: { widget_bp_path, widget_name, applied: [{direction, rule, widget_to_focus}], current_navigation: {Up:{rule,widget_to_focus}, ...}, navigation_discarded: bool, saved, save_error } -- navigation_discarded:true means every direction ended on Escape so the subobject was dropped, exactly as the Designer does; current_navigation is then all-Escape.
set_widget_property¶
Destructive, idempotent.
Set ONE or MANY reflected properties on a widget of a Widget Blueprint, addressing NESTED STYLE FIELDS by dotted path ("WidgetStyle.Normal.TintColor", "WidgetStyle.Hovered.OutlineSettings.CornerRadii") and reporting FIELD BY FIELD what actually landed. Two calling shapes over one write path: property_name+value writes a single path; properties writes a whole map with ONE Modify + ONE compile + ONE save (a FButtonStyle is ~30 leaf fields -- one call, not 30 recompiles). WARNING: The oracle is applied[]/ignored[]/errors[], NOT success: a JSON key that matches no reflected field lands in ignored[] and all_applied goes false instead of the silent no-op the engine's converter reports as success. Read the result back with get_widget_blueprint_tree(property_paths=[...]).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | name of the widget in the tree (get_widget_blueprint_tree lists them) |
property_name |
string | no | Single reflected property name ("Text") OR a dotted path into nested structs ("WidgetStyle.Normal.TintColor"); array indices are supported ("Items[0].Label"). Requires value. Omit when using properties. |
value |
any | no | New value for property_name: string, number, bool, JSON object (struct, applied field by field) or JSON array. Colors accept {"R":1,"G":0,"B":0,"A":1}, [r,g,b,a] or "#RRGGBBAA"; FMargin accepts a scalar, [h,v] or [l,t,r,b]; an FSlateBrush accepts a texture/material path string; enums accept the short name ("Box"). |
properties |
object | no | Batch form: {"<dotted path>": <value>, ...}. Every path is written against the SAME widget under one Modify/compile/save. Combinable with property_name+value (both end up in the same map). |
save |
boolean | no | Compile + save the Widget Blueprint when done (default true). Pass false to chain several calls and save once at the end -- the asset stays dirty in memory until something saves it. |
Returns: { widget_bp_path: string, widget_name: string, widget_class: string, requested_paths: [string], applied: [string], ignored: [string], errors: [{path, error}], failed_paths: [string], applied_count: int, all_applied: bool, current_values: object, saved: bool, save_error: string }
set_widget_slot_properties¶
Destructive, idempotent.
Set the CanvasPanelSlot layout of a widget inside a CanvasPanel of a Widget Blueprint asset -- anchors, offsets, position, size, z_order and auto_size, only those passed -- then compile and save the blueprint; the reply reads the whole slot back. position and size write the same fields as offsets (Left/Top and Right/Bottom) and are applied after it, so they win when both are given. A widget not under a CanvasPanel, or a call with none of the six fields, is an error. Refused while PIE runs unless force=true. For other slot types use set_box_slot_properties, set_grid_slot_properties or set_slot_properties.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
widget_name |
string | yes | name of the widget whose canvas slot to edit |
anchors |
array | no | Optional [MinX, MinY, MaxX, MaxY] anchor floats. |
offsets |
array | no | Optional [Left, Top, Right, Bottom] offset floats. |
position |
array | no | Optional [X, Y] position. |
size |
array | no | Optional [X, Y] size. |
z_order |
number | no | Optional int draw/hit-test order (higher draws on top); use with reorder_widget_child's note for CanvasPanel stacking. |
auto_size |
boolean | no | Optional bool: when true, the slot sizes itself to the widget's desired size instead of size. |
Returns: { widget_bp_path: string, widget_name: string, anchors_set: bool, offsets_set: bool, position_set: bool, size_set: bool, z_order_set: bool, auto_size_set: bool, current_anchors: [float], current_offsets: [float], current_position: [float], current_size: [float], current_z_order: int, current_auto_size: bool, saved: bool, save_error: string }
set_widget_visibility¶
Destructive, idempotent.
Set widget visibility state to one of: Visible, Collapsed, Hidden, HitTestInvisible, SelfHitTestInvisible.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_name |
string | yes | Name of the widget to modify |
visibility |
string | yes | Target visibility state: Visible, Collapsed, Hidden, HitTestInvisible, or SelfHitTestInvisible |
Returns: { widget_name: string, visibility_set: bool, previous_visibility: string, requested_visibility: string, actual_visibility: string, widget_valid: bool }
stop_widget_animation¶
Destructive.
Stop a widget animation. REAL stop (UUserWidget::StopAnimation) when a live PIE instance of this WidgetBP is found in the viewport's active UUserWidgets: stopped is true when the animation was playing before the call and is not after it; one that was not playing (stopped or paused) succeeds with stopped:false and a note, and one still playing after the call is an error. Falls back to an honest headless gate (stopped:false, headless:true, requires_pie:true) otherwise.
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_bp_path |
string | yes | /Game path of the Widget Blueprint asset |
animation_name |
string | yes | object name OR display label of the animation to stop |
world |
string | no | Optional world selector: absent/'pie' (default: PlayWorld, else the first PIE context) | 'server' (the PIE world with authority) | 'client' | 'pie:N' | 'game' (alias of 'pie'). In a 2-player PIE session EVERY client has its OWN widgets, so the default may well read the other player's HUD. |
Returns: { widget_bp_path: string, animation_name: string, animation_exists: bool, stopped: bool, headless: bool, requires_pie: bool, note: string, saved: bool, live_widget_name?: string, live_animation_name?: string, world: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }
unbind_widget_from_viewmodel¶
Destructive, idempotent.
Remove an FMVVMBlueprintViewBinding from a Widget BP's MVVM authoring state, by index (primary) or binding GUID. Inverse of bind_widget_to_viewmodel; idempotent (already-absent is an honest success).
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_name |
string | yes | /Game path of the Widget Blueprint asset |
binding_index |
number | no | int index of the binding to remove (primary identifier; one of binding_index / binding_id required) |
binding_id |
string | no | optional GUID string of the binding to remove (alternative to binding_index) |
Returns: { widget_blueprint_name, binding_index?, binding_id?, already_existed, removed, binding_count, has_mvvm_extension, saved, save_error? }