Appearance
Replace a screen, entry, source and root in Blueprint
The standalone sample has an independently authored Watchpost survey. Start an expedition, Pause → Field journal → Watchpost survey. Observe ridge records one observation, updates the count and four segments, and becomes unavailable after four observations. Back returns to the journal; closing the journal returns to Pause. This small local interaction source belongs to the example project. Game Master's exclusive design and inventory systems are absent.
Open WBP_WatchpostSurvey, WBP_WatchpostEntry, BP_WatchpostSource and WBP_ForgeFlowRoot under /Game/UI/Blueprint. They are saved, editable Blueprints. Their runtime graphs call public InterfaceForge and engine nodes; the editor authoring utility is not a packaged dependency. Runtime evidence distinguishes saved Blueprint interaction from synthetic device events and remaining acceptance gates.
A different screen and entry
WBP_WatchpostSurvey derives from IFScreen. Its Designer contains a full-screen scrim, a Scale Box set to Scale To Fit / Down Only, a bounded Size Box, an InterfaceForge Surface, heading, custom entry and Return button. The entry is WBP_WatchpostEntry, parent IFEntryWidget, with themed title/detail/count text, Forge Progress set to Segmented /4, and a reusable custom IFButton.
The screen uses these graphs:
- Event Initialize Screen → Parent: Initialize Screen, forwarding Data → Get UIModel with Model Name
Record→ Initialize Entry on SurveyRecord. The returned object comes from the supplied source, before screen activation. - Set Initial Focus to SurveyRecord's RecordChoice button. This nested button follows the same CommonUI focus/navigation contracts as the menu.
- CloseSurvey On Button Base Clicked → Request Back. Event On Deactivated → Release Entry on SurveyRecord. Release is idempotent and removes its model binding even while CommonUI retains the screen in a pool.
- Event On Input Presentation Updated → set the example's LastInputPresentation variable. Replace that assignment with your own layout/hint rules; keep focus and cursor policy in the containing screen. The service also updates the screen behind a modal.
The entry's Event On Entry Refreshed casts Entry Data to IFPresentationData, reads Title/Detail/Quantity/Fraction/Enabled, sets its text, converts Quantity through To Text (Integer), calls Set Fraction, and calls Set Action Availability. Count and / 4 text disable Auto Wrap Text; prose wraps. Event On Entry Released clears labels and progress. The convenience base owns Notify Data Changed subscriptions; it does not query a gameplay population every frame. Its editable Progress Presentation property and Apply Progress Presentation event now select all five styles through public Configure Progress and normal slot alignment; the progress recipe explains Designer preview and live changes using the same source and entry.
RecordChoice On Button Base Clicked → engine Find Parent Widget Of Type (IFScreen) → Cast to IFScreen → Request UIAction (Record, Context = Entry Data). Find Parent Widget Of Type has execution pins: connect the click through that node before using its returned object. Its result cannot be read from an unexecuted node.
flowchart LR
J[Journal: Watchpost survey click] --> C[Construct Object from Class: BP_WatchpostSource]
C --> P[Push Screen: WBP_WatchpostSurvey, Data = source]
P --> I[Initialize Screen / Get UIModel: Record]
I --> E[Initialize Entry: WBP_WatchpostEntry]
B[Observe ridge] --> A[Request UIAction: Record / Entry Data]
A --> V[Blueprint source validates and edits its model]
V --> N[Notify Data Changed]
N --> R[On Entry Refreshed: count / text / segments / availability]
A Blueprint-only data source
BP_WatchpostSource derives from IFPresentationData and implements IFDataSource in Class Settings. For this one-record example the stable model is the source object itself. Get UIModel returns Self only for Record, and None for unknown keys. It allocates no new model per read.
Request UIAction requires Action Name Record, Context equal to Self, and Quantity below4. The accepted branch increments Quantity, sets Fraction to Quantity×0.25, updates Enabled/completion prose, calls Notify Data Changed, then returns true. The other branch returns false without changing data. These are local demonstration rules, not multiplayer authority or a gameplay system supplied by the UI plugin.
The journal's SurveyChoice graph uses Construct Object from Class, with the journal as Outer, followed by Get Root Layout → Push Screen on Menu. Screen Class is WBP_WatchpostSurvey and Data is the new source. Each new opening gets a new survey session. To use your game, replace that class/data pin with your own object implementing IFDataSource and return your stable observed model. No plugin source changes are required.
Theme replacement and one-widget overrides
The journal's Mineral/Ember buttons call Set Theme on IFLocalPlayerSubsystem from Get Owning Player. The same screen, pooled entries, buttons and underlying HUD receive token changes. These choices are session previews; the example does not persist a theme preference.
Create or duplicate an IFTheme data asset to edit Surface/Text/Accent/Muted Text/Outline, Body Font, button padding/corners, icon roles, feedback sounds and Transition Seconds. Assign it through Set Theme. Use project-owned or distributable assets. Themes change presentation tokens; arbitrary layout or Blueprint animation changes belong in the widget/root.
For one text/button/surface/progress widget set Theme Override in its Blueprint Designer, or set that property in a graph and call Refresh Appearance. Set None to follow the player's theme again. Runtime verification changes only the survey title's override while its screen retains the player theme; this fixture setup is distinct from the actual journal's saved Blueprint theme-button graph. Changing an override does not clone the tree.
A Designer-built root and engine transitions
WBP_ForgeFlowRoot derives from IFRootLayout. Its Designer uses Safe Zone → Overlay, containing HUD and Menu Common Activatable Widget Stacks, a IFNotificationLayer, then the Modal stack. Menu's engine Transition Type is Horizontal; HUD and Modal use Fade Only. Engine Transition Curve remains Cubic In Out. This is a configurable engine preset, not a separately implemented animation system. See Epic's CommonUI transition types.
Event On Initialized calls Register Layer for HUD/Menu/Modal with the Designer stacks, then root Register Notification Layer with Results. Its class defaults choose the saved confirmation/loading classes. The notification layer chooses WBP_ForgeNotification as its body. Root registration handles lifetime: removing the root clears messages and unregisters the presenter. None explicitly unregisters it; a removed root rejects re-registration. Use a presenter owned by the same local player.
Theme Transition Seconds and reduced-motion preference still control all registered stack durations. The engine Designer controls transition type and curve; the root keeps CommonUI's activation, pooling, focus restoration, input guard and transition events. The survey now also includes an editable UMG SurveyArrive timeline and actual activation/preference/deactivation graphs. Blueprint animations explains editing it and restoring its visible baseline on interruption. Arbitrary timelines and custom exit choreography remain separate gates.
From your local PlayerController call Create Root with WBP_ForgeFlowRoot instead of the default root. In the example you can create a Blueprint child of ForgeExamplePlayerController, set its Root Class class default, select it in your Blueprint GameMode's Player Controller Class, and assign that GameMode to the map. The current default maps retain their existing roots. The opt-in runtime fixture replaces the root through the same public Create Root call and runs the existing menu → HUD → pause → journal → survey flow.
Troubleshooting and limits
Missing entry data: call parent Initialize Screen and return the exact requested model key. Stale updates: release/unbind before replacing a model; do not retain an earlier source in a recycled entry. Unusable nested focus: set Initial Focus after supplying context and use a focusable enabled CommonUI button. Empty controls in a package: include your new Blueprint classes through the project's engine Asset Manager/cook rules; the example label lists the owned UI classes. The root must register every stack before pushing screens.
Current evidence is Win64 DX11 at1280×720 and800×600 with150% UI/text. Synthetic gamepad/pointer/keyboard events test shared Blueprint presentation while a modal is open; they do not certify a physical controller, touch device or platform. See the separate animation record for actual timeline playback, interruption and Reduced Motion proof. Arbitrary timelines, tree/tile replacements, long localized strings, safe-area variations, split-screen and full product polish remain separate gates.