DreamGUI
Diagnostics

DUI3xxx · Meaning

Grammatical, but the tree does not hold together: a duplicate id, an unknown type.

Generated by scripts/diagnostics/sync.py from the plugin's code table (EDreamUIDiagnosticCode); the name on each card is the one the tests assert.

DUI3001

errorcode nameDuplicateNodeId

Two nodes share an id.

How it happens: the id is the node's identity -- its guid, its class member variable, its binding key and its localization key at once -- and ids are compared without case, since each becomes an FName. A duplicate is never silently renamed to OkBtn_1: that would quietly repoint whichever of the two your bindings meant. Slots share the namespace with widgets, so two slots of one name, or a slot named like a widget, are this code too; a host's slot Detail { … } filling a component's slot is not counted.

Widget Root {
    Text Title { Text = "Settings" }
    Text title { Text = "Audio" }
}

How to fix: rename one of them; if a rename caused the collision, use (was: …) so the next compile moves the references.

DUI3002

errorcode nameInvalidNodeId

An id that is not an identifier, starts with a digit, or is a keyword.

How it happens: an id is a C++ identifier -- letters, digits and _, not starting with a digit (characters outside ASCII are letters, so an id may be Chinese). 2ndPanel is refused because the generated class would declare _2ndPanel, and every binding written against the name in the file would resolve to nothing. class, style, resources, slot, for, each, in, was, use, timeline, external and ease are keywords and cannot be a node id or a slot name; an id longer than an FName holds is this code as well.

Widget Root {
    Text 2ndLine { }
    Text external { }
}

How to fix: choose an id that starts with a letter or _ and is not a keyword, such as SecondLine.

DUI3003

errorcode nameUnknownNodeType

A type that is no tag, container, alias, registered widget or path.

How it happens: a node's type is resolved in order: a built-in tag (Text, Image, …), a layout container (VerticalBox, …), a component alias given by use … as, a registry tag (Native.Button, …), an asset path (starting with /). Matching none is this code; for a scoped or namespaced name the message lists what is there.

Widget Root {
    Txt Title { Text = "Settings" }
}

How to fix: fix the spelling; bring a component in with use "…" as Name first, or write its full asset path.

DUI3004

errorcode nameUnknownStyle

: Name naming no style this file sees.

How it happens: a node's style clause, or a style's base, names a style this file neither declares nor brought in with use. A style may be declared below the node that wears it; order does not matter. A namespaced name (nier.Label) whose namespace is not declared is DUI3021 instead.

style Caption { FontSize = 14 }
Text Note : Captoin { Text = "Ready" }

How to fix: fix the style's name, or use the library that declares it.

DUI3005

errorcode nameDuplicateStyle

Two styles of one name in one file.

How it happens: a local style may shadow an imported one of the same name, but with two local styles of one name the builder and the write-back could disagree about which lines a node got, so the second is refused.

style Caption { FontSize = 14 }
style Caption { FontSize = 12 }

Text Note : Caption { Text = "Ready" }

How to fix: merge them or rename one; for a variant of a style, inherit it: style Small : Caption.

DUI3006

errorcode nameUnknownBehaviourClass

+ Name naming nothing a widget can carry.

How it happens: the class after + is looked up with the plugin's prefixes tried (UIButton and Button both find the button behaviour), or written as a full /Script/Module.Class path; resolving to no behaviour, layout container or layout-self object is this code. A style's + lines are held to the same rule.

Widget Confirm {
    + UIButon { TransitionType = None }
}

How to fix: fix the class name, or write its full /Script/… path.

DUI3007

errorcode nameDuplicateSlotName_Retired

Retired; two slots of one name are DUI3001.

DUI3008

warningcode nameShadowedLoopVariable

A loop variable that hides an enclosing loop's (a warning).

How it happens: a nested for or each uses the variable name of the loop around it. It is a warning because shadowing cannot change the tree that gets built. Loops do not nest anyway: the build refuses the inner one with DUI5021 or DUI5012.

VerticalBox Groups {
    for Item in GetGroups() {
        VerticalBox Group {
            for Item in GetEntries() {
                Text Entry { Text <- Item.Name }
            }
        }
    }
}

How to fix: rename the inner variable; more to the point, move the inner loop into a component whose own file has it, and hand it its list through a props entry.

DUI3009

errorcode nameParentRefusedChild

A parent that will not take this child: a full content widget, a named slot filled twice.

How it happens: the node is fine and the parent is fine; only the pair is not. SizeBox, ScaleBox, SafeZone and Border hold one child; a named slot holds one widget, and the same slot cannot be filled twice; circular nesting is refused too. Attaching drops the extra child silently, so without this code you would get a tree quietly missing a subtree you can see in your own file.

SizeBox Box {
    Text A { Text = "One" }
    Text B { Text = "Two" }
}

How to fix: put the children in one container (VerticalBox { … }, for example) and put that in; for a slot that should hold several widgets, give its declaration a layout container.

DUI3010

errorcode nameRenameOldIdStillInUse

(was: X) while X is still an id in the file.

How it happens: you renamed a node away from X and then made a new node called X. "Move everything that pointed at X" would move it away from a node that exists and wants it, so it is refused -- and the whole file's migration with it, because a half-migrated file is worse than an unmigrated one: the next compile no longer starts from what the author wrote.

Widget Root {
    Text Title (was: Heading) { Text = "Settings" }
    Text Heading { Text = "Audio" }
}

How to fix: rename the other node first, or drop the (was: Heading).

DUI3011

errorcode nameDuplicateWasId

Two nodes claim (was: X).

How it happens: one old name cannot become two new ones, and nothing can decide which node inherits X's references, so the file's migration does not run.

Widget Root {
    Text Title (was: Heading) { }
    Text Subtitle (was: Heading) { }
}

How to fix: keep the clause on the node that inherits the references and delete the other.

DUI3012

errorcode nameSelfRename

(was: X) on the node called X.

How it happens: a rename clause says what a node used to be called; a node already called that has nothing to migrate, and it is almost certainly a typo. The file's migration does not run.

Text Title (was: Title) { Text = "Settings" }

How to fix: delete the (was: …); for a rename, write the new id after the type and the old one in (was: …).

DUI3013

warningcode nameRenameGraphReferenceAmbiguous

The old id is also another member's name, so graph references are not moved (a warning).

How it happens: references in Blueprint graphs resolve by name. If the old name is also a variable this Blueprint declares, a member of its parent class, or a local inside some function, rewriting every reference to it would silently repoint code that has nothing to do with the widget, so the graph leg does not run. The binding and animation legs are unambiguous and still run.

How to fix: repoint the graph references by hand, or rename the other thing of that name.

DUI3014

errorcode nameDuplicateResource

Two resource entries of one name.

How it happens: entries accumulate over several resources blocks; with one name declared twice the first wins everywhere, so the second is refused.

resources {
    Color Accent = #FF6600
    Color Accent = #E05A47
}

Text Note { Color = @Accent }

How to fix: delete or rename one of them.

DUI3015

errorcode nameStyleCycle

A style that inherits itself through its bases.

How it happens: style A : B, and following the bases comes back to A. Nothing of it applies, and the node that wears it reports this code.

style Caption : Warning { FontSize = 14 }
style Warning : Caption { Color = #E05A47 }

Text Note : Warning { Text = "Unsaved changes" }

How to fix: break the cycle: make one of them stop inheriting the other.

DUI3016

errorcode nameDuplicateTimeline

Two timelines of one name.

How it happens: a timeline's name is both the animation's display name and a class member variable (the compiler declares one per animation, as UMG does for UWidgetAnimation), so two of them is a variable nobody can address -- refused the same way as two styles of one name.

timeline Pulse external
timeline Pulse { duration = 0.6 }

Widget Root { }

How to fix: rename one of them.

DUI3017

errorcode nameDuplicateComponentAlias

Two use … as lines give one name.

How it happens: the first wins everywhere and the second is refused, so a type name never changes meaning because of a line nowhere near it.

use "UI/Components/Row.dui" as Row
use "UI/Components/NieR_Row.dui" as Row

Widget Root { }

How to fix: give the second one another name.

DUI3018

errorcode nameAliasShadowsBuiltIn

A use … as name that is a tag or a container.

How it happens: a node's type asks the built-in tags and the layout containers before any alias, so an alias called Text or VerticalBox could never be written: an alias cannot change what Text means.

use "UI/Components/Label.dui" as Text

Widget Root { }

How to fix: choose a name that is not a tag or a container, such as Label.

DUI3019

errorcode nameDuplicateProp

Two props lines declare one name.

How it happens: one name is one property; the first line is kept and the second refused.

props {
    Text   Label
    String Label
}

Widget Root { }

How to fix: delete or rename one of the lines.

DUI3020

errorcode nameDuplicateEvent

Two events entries of one name, or one parameter twice.

How it happens: each event becomes an event dispatcher, so its name is unique; the parameter names of one event are unique too.

events {
    Picked(Number Index, Number Index)
    Closed
    Closed
}

Widget Root { }

How to fix: delete or rename the duplicate.

DUI3021

errorcode nameUnknownNamespace

ns.Name whose ns no use … as ns declares.

How it happens: styles, resources and component aliases may be qualified by a namespace (: nier.Label, @nier.Ink, nier.Row), and the namespace has to come from a use "…" as nier. This is the only code reported for it -- not a second "no such style" on top, which would send you looking for a misspelling that is not the mistake.

Text Note : nier.Label { Text = "Ready" }

How to fix: add use "UI/NieR_Common.dui" as nier, or fix the prefix's spelling.

DUI3022

errorcode nameMultipleDefaultSlots

More than one slot … default in one file.

How it happens: content nested without a slot name has one place to go. The first keeps the default role, so the hosts compiled against it still agree.

Widget Root {
    slot Rows default
    slot Footer default
}

How to fix: write default on one slot only.

DUI3023

warningcode nameDuplicateRowKey

Warning. Two rows of a rows table whose first values make the same id; the second's id then moves with the order.

How it happens: each row's id comes from its first value (Page_0__Row_City_Ruins), so inserting or reordering rows leaves every other row's id and localization keys alone. When two rows' keys make the same id, or one makes an id the file already uses, the later row gets a suffix such as _1 -- and that number, with its localization keys, moves when the rows are reordered, which is exactly the instability a key column exists to avoid.

VerticalBox Menu {
    rows Text (Text) {
        "Audio"
        "Audio"
    }
}

How to fix: give the rows distinct first values; a row code needs by name is written as a node of its own.

On this page