DUI5xxx · Building the tree
Reflection refused the write, or the target object does not exist.
Generated by scripts/diagnostics/sync.py from the plugin's code table (EDreamUIDiagnosticCode); the name on each card is the one the tests assert.
DUI5001
errorcode nameAssetNotFound
An asset or class path that does not load.
How it happens: an asset path written as a node type or a property value fails to load: misspelt, moved or deleted, or in a plugin that is not enabled.
Widget Root {
/Game/UI/WBP_Rwo Audio { }
}How to fix: copy the asset's path from the Content Browser again; if the asset moved, update the path.
DUI5002
errorcode nameNoVisualForProperty
A property of a visual the node's type does not create.
How it happens: the name is not found on the node, and it is a property of some tag's visual -- FontSize on a Widget, for example, which belongs to the text visual a Text node creates. The message names the tag that has it, so the fix is usually one word.
Widget Title {
FontSize = 14
}How to fix: change the node's type to the tag the message names (Text Title here), or move the line onto such a node.
DUI5003
errorcode nameNoPanelSlotForProperty
A slot line on a node whose parent lays out no panel.
How it happens: @slot and @fill set the panel slot -- how the parent's container places this child. A parent with no layout container (a plain Widget), or a node that is the root, has no panel slot to write; slot lines a style brings count too.
Widget Root {
Text Label {
@slot Padding = (0, 4, 0, 4)
}
}How to fix: give the parent a layout container (VerticalBox Root, or + VerticalBox { }), or drop the slot lines and place the node with AnchorData.
DUI5004
errorcode nameBindingFunctionNotFound
A bound function the class does not have, or one that takes parameters.
How it happens: a binding that only calls a function, Text <- GetTitle(), binds that function directly, so it must be a function of this Blueprint (or its parent) that takes no arguments and returns the bound property's type. A function name longer than an FName holds is this code too.
Text Title {
Text <- GetTitel()
}How to fix: fix the name or add the function to the Blueprint; for arguments, write a no-argument function that passes them.
DUI5005
errorcode nameBindingTargetHasNoSetter
A bound property with no setter.
How it happens: a binding writes through the property's setter at run time: Set and the property's name (a bool's b dropped, so bUseKerning is set by SetUseKerning), one parameter, no return value. A property with no such function cannot be driven. A component's own props are the one exception: Blueprint variables with no setter, which a host may still bind one way with <-.
How to fix: set the property from a function instead; on a C++ class of your own, give it a setter of that shape.
DUI5006
errorcode nameNotAUserWidgetClass
A node typed by a class that is not a concrete DreamUI user widget.
How it happens: a node typed by a class (an alias, @Name, a registry tag, an asset path) is an instance of a component, its contents that class's, so the class must be a UDreamUserWidget subclass that is neither abstract nor deprecated. A texture, a plain UMG widget or any other asset is this code.
Widget Root {
/Game/UI/T_Icon Icon { }
}How to fix: write an asset as a property's value (an Image's Brush.ResourceObject, for example); type nodes only by DreamGUI widget Blueprints or native DreamUI user widget classes.
DUI5007
warningcode nameLoopNotExpanded
A loop built by a caller with nowhere to record it, and skipped (a warning).
How it happens: a for or an each is recorded as a compiled loop binding, and the builder needs its caller to offer somewhere to record it. A Blueprint compile always does; a caller that builds a tree from a raw AST (most tests, a C++ tool of your own) may not, and then the loop and everything under it is skipped while the rest of the file builds.
How to fix: compile the file through its Blueprint; when calling the builder yourself, give it somewhere to record loop bindings.
DUI5008
errorcode nameBindingTargetNotSupported
A binding on something no binding can name: a slot, a container, a field of a struct.
How it happens: a binding can name the widget, its visual and its behaviours (EDreamWidgetBindingTarget), and whole properties only. A @slot property, a container's property on a container-typed node, or a struct field such as AnchorData.SizeDelta has nowhere to be recorded whatever setters it has. It is apart from DUI5005 precisely because writing a setter would not help here.
VerticalBox Column {
Spacing <- GetGap()
AnchorData.SizeDelta <- GetSize()
}How to fix: bind a whole property (an FVector2D one, say), or set these values from a function of the Blueprint.
DUI5009
errorcode nameNothingToBuild
The tree had no root; the parser said why.
How it happens: the AST handed to the builder carries no root node. The parser has already reported the cause (usually DUI2006); this states the outcome.
How to fix: deal with the earlier diagnostic of the same compile.
DUI5010
errorcode nameEventNotFound
X -> … where X is not an event of the destination.
How it happens: the left side of -> is an event of the widget, its visual or a behaviour: a BlueprintAssignable dynamic multicast delegate, or an editable DreamUIEventDelegate. A name that is an ordinary property, a path into a struct, or found on none of them is this code; so is a handler name longer than an FName holds.
Text Title {
OnClick -> HandleClick
}How to fix: write the route where the event lives, in the button behaviour's block for example: + UIButton { OnClick -> HandleClick }.
DUI5011
errorcode nameBindingExpressionUnsupported
An expression the compiler cannot turn into a function.
How it happens: a <- expression richer than a bare call is compiled into a generated Blueprint function. A name that is neither a variable nor a function of the class (as of the previous compile), the wrong number of arguments, a function that returns nothing, an operator with no meaning between its operand types, a type with no conversion to the one needed, a resource in an expression that is not a Number or a String, or an item binding in a loop body that reads more than one member deep (Item.A.B) is this code; the message names which.
Widget Panel {
RenderOpacity <- Fadee() * 0.8
Shown <- GetName() * 2
}How to fix: fix the expression; when the logic gets rich, move it into a real function and bind that.
DUI5012
errorcode nameEachMisplaced
An each at the root, nested, without a list view, or without exactly one template.
How it happens: an each fills the list view of the widget it is written in, so its host needs a + UIListView (or a recyclable scroll view); it is not the root, does not sit in another for or each, and its body is exactly one widget, the template repeated per item.
Widget Inventory {
each Item in GetItems() {
Text Cell { Text <- Item.Name }
}
}How to fix: add + UIListView { } to the host; wrap several widgets in one container; write a nested list as a component whose own file has the inner loop.
DUI5013
errorcode nameNodeReferenceNotFound
A node id written as a value that names no node in the file.
How it happens: a property that holds a widget, a visual or a behaviour may be given a node id, meaning the node of that id in this file; an id that does not exist is this code, with the nearest id suggested. A node that exists and is not the kind of thing the property holds is DUI4003.
Widget Confirm {
+ UIButton { TransitionTarget = Bakground }
Image Background { }
}How to fix: fix the id, or declare the node.
DUI5014
errorcode nameLoopBodyBindingUnsupported
An expression or a <-> inside a loop body.
How it happens: a generated binding function belongs to the class, and a name in a loop body is known only to an iteration, so the body supports the single hop Item.Member, recorded cell by cell. Anything richer used to be dropped: the file compiled and the property was never driven. The expression is fine and the place is not, which is why it is not DUI5011.
VerticalBox Options {
for Option in GetOptions() {
Text { Text <- Option.Label + "!" }
}
}How to fix: move the logic into the item's own class (have it offer a ready member), or bind outside the loop.
DUI5015
errorcode nameTimelineTargetNotFound
A track path that names no node.
How it happens: a track line's path is a chain of node ids (Row/Title), the same display-name path an animation binding resolves through; a path this file's tree does not have is this code. A node that exists without the property is DUI5016.
timeline Pulse {
duration = 0.6
Iocn.RenderScale : 0.0 = (1, 1, 1), 0.3 = (1.25, 1.25, 1)
}
Widget Root {
Image Icon
}How to fix: fix the ids in the path; a track with no path drives the widget the animation lives on.
DUI5016
errorcode nameTimelinePropertyNotAnimatable
A track property no animation track can drive.
How it happens: the property does not exist on the node, its visual or its behaviours; or it is not marked Interp, so the animation editor does not offer it either; or its type has no track -- a timeline drives numbers, 2- to 4-component vectors and colours, and anything else belongs in an external timeline.
timeline Swap {
Title.Text : 0.0 = "A", 1.0 = "B"
}
Widget Root {
Text Title
}How to fix: drive a property the animation editor shows; animate anything else in an external timeline edited in Sequencer.
DUI5017
errorcode nameUnknownEaseName
An ease name the tween library does not have.
How it happens: curve names are EDreamTweenEase's (Linear, InOutQuad, OutCubic, OutBack, …) minus CurveFloat, which names an asset, and a timeline key has nowhere to put one.
timeline Pulse {
Icon.RenderScale : 0.0 = (1, 1, 1), 0.3 = (1.25, 1.25, 1) ease InOutQuadratic
}
Widget Root {
Image Icon
}How to fix: use a name EDreamTweenEase declares, InOutQuad here.
DUI5018
errorcode nameComponentAliasUnresolved
An alias that names no class: no class line and no Blueprint for the file, or a path that loads nothing.
How it happens: use "…" as Row names the class that file compiles into -- the one its class line names, or the Blueprint whose Source File it is. A file with no class line that no Blueprint uses yet, no editor to ask (in a commandlet, say), a class line naming a Blueprint that does not exist yet, or a use /Game/… as path that loads no class is this code.
use "UI/Components/Row.dui" as Row
VerticalBox Root {
Row Audio { Label = "Audio" }
}How to fix: give the component file a class line, or compile it into a Blueprint first; for a class path, fix the path.
DUI5019
errorcode nameSlotFillOutsideComponent
slot Name { … } filling a slot under a node that is not a component instance.
How it happens: a slot Name { … } holding widgets fills a named slot of a component, so it belongs inside a component instance; at the root, or inside a plain widget or a container, there is no slot to fill.
VerticalBox Page {
slot Detail {
Text Note { Text = "A length of wire." }
}
}How to fix: nest the content directly; if you are writing a component and meant to declare a slot, write slot Detail with no widgets.
DUI5020
errorcode nameUnknownSlotToFill
A fill naming a slot the component does not declare.
How it happens: the slot a slot Name { … } fills inside a component instance must be one that component declares; the message lists the slots it has.
ListPage Page_2 {
slot Detials {
Text Note { Text = "A length of wire." }
}
}How to fix: fix the slot's name; content nested without a slot name goes to the component's default slot.
DUI5021
errorcode nameForMisplaced
A for at the root, in another loop, in a host with fixed room, or without exactly one template.
How it happens: a for makes one copy of its template per item inside the widget it is written in, so the host must take any number of children: a SizeBox and the others that hold one cannot. It is not the root, does not sit in another for or each, and its body is exactly one widget.
SizeBox Box {
for Option in GetOptions() {
Text { Text <- Option.Label }
}
}How to fix: put a container such as VerticalBox inside and the for in that; wrap several widgets in one container; write nested repetition as a component whose own file has the inner loop, given its list through one of its props.
DUI5022
errorcode nameSecondLayoutContainer
A second layout container on one node.
How it happens: a widget arranges its children one way. A node whose type is already a container (VerticalBox Column) with a + HorizontalBox on it, or a container from its own + lines and another from its style's, is this code. The second container used to replace the first without a word, taking its values with it.
VerticalBox Column {
+ HorizontalBox { Spacing = 8 }
}How to fix: write the container's properties on the node itself; for another arrangement, nest a child widget.