Skip to content

Blueprint journal and reusable list entries ​

The playable Field journal uses WBP_FieldJournal (IFScreen), an ordinary engine List View named JournalList, and WBP_JournalEntry (IFEntryWidget). Open it from the pause menu. Its rows show the active example's presentation models; closing restores the underlying pause screen. These are original InterfaceForge layouts, not Game Master's exclusive design.

Populate a screen ​

Initialize Screen calls the parent with Data, then Clear List Items. Get UI Model retrieves Resources, Selected, Objective, Queue and Notice from the supplied IFDataSource; Add Item adds those model UObjects to JournalList. UI authoring does not implement gameplay rules. Your data source can return different IFPresentationData objects using the same contract.

WBP_AshenPause connects JournalChoice's On Button Base Clicked to Push Screen (Menu layer, WBP_FieldJournal, Screen Data). The screen's On Initialized sets Initial Focus to CloseJournal. That button's On Button Base Clicked calls Request Back, preserving CommonUI stack and focus restoration. The current visible label is Return to pause menu.

Create or replace an entry ​

Create a Widget Blueprint deriving from IFEntryWidget and design its visual tree. Set it as the List View's Entry Widget Class. Implement On Entry Refreshed: read Entry Data, Cast to IFPresentationData, then set your labels from Title and Detail through Set Text. This is the saved journal entry's actual graph. The core invokes refresh on assignment and when the model calls Notify Data Changed. On Entry Initialized also receives the assigned object if you need separate initialization work. The core entry unbinds the old model on reassignment/release and subscribes the assigned presentation model. For another object type, use your own binding and matching cleanup.

The saved journal entry uses On Entry Selection Changed to set title Role to Accent when selected or Body otherwise, change EntrySurface Outline Width to 2 or 1, and call Refresh Appearance on both. On Entry Released clears Title/Detail and restores the unselected role/outline. Reset your own timers, animations, tooltips and custom state as well. A pooled entry belongs to its currently assigned model; never treat a row pointer as the permanent view of an item.

For the IFEntryWidget base, select On Entry Released from InterfaceForge | Entry. Unreal also exposes a similarly named UserListEntry event; that engine event runs after the base has cleared its context. Use the InterfaceForge hook when cleanup needs Entry Data. Do not wire both cleanup paths or call Initialize Entry from inside cleanup; assign the next context through the normal list/source workflow after release. A completely custom User Widget instead wires the engine UserListEntry event to the IFEntry interface implementation, as described in the quick-start recipes.

Initialization with None data is valid for a static/default entry. The lifecycle fix tracks initialization independently of model presence, so Blueprint cleanup runs once and repeated release does not repeat it. Current source/cooked proof confirms None → release → real-model reassignment and pooled-row cleanup on UE5.6.1/5.7.4/5.8.3, alongside full flows/customization/cards and32cleanBPs per engine. Earlier IF3/BI artifacts predate this fix; current EB installation evidence is recorded separately.

Change themes ​

Mineral and Ember buttons use On Button Base Clicked → Set Theme, targeting Get IFLocalPlayerSubsystem from Get Owning Player. The Theme pin references DA_ForgeMineral or DA_ForgeEmber. The same screen and entries remain; theme changes also reach the underlying HUD and pause screen. This example's theme choice is session state, not a persisted preference.

Duplicate the sample screen/entry, change their Designer layout and event graphs, select the copied Entry Widget Class and copied Push Screen class, and supply another IFDataSource as Data. No plugin source edit is required. Watchpost survey constructs BP_WatchpostSource and pushes WBP_WatchpostSurvey through public features; see Blueprint customization.

Keep large collections responsive ​

Use Set List Items to assign an array of stable model UObjects once. Retain each model while changing its fields, then Notify Data Changed once per changed model. Visible entries update immediately; offscreen models have no realized entry subscription and show their latest data when assigned to a recycled row. Avoid Set List Items or Regenerate All Entries for every text/cooldown change.

Keep the List View in a bounded Fill slot instead of creating thousands of children in a Scroll Box. Get Displayed Entry Widgets returns current realized views, not the complete model array. Scroll Index Into View or Navigate To Index reaches a distant item. Set Selected Item changes model selection immediately; row events may follow on the next Slate update. Clear List Items releases subscriptions before replacing the source.

Group each model's field changes before notifying it. The performance fixture deliberately notifies the entire collection to measure a producer burst; it does not recommend whole-population notifications every frame. Filtering, sorting and relevance are data-source decisions. Preserve model identity to retain selection. The UI plugin does not scan an entity population from each widget.

Collection measurements cover the saved journal at 1,000 and 10,000 models, normal/enlarged UI, 16 bulk-update batches, selection/far scroll/stale-source isolation/clear/reset/repopulate/close. Only 3/2 rows are displayed; the observed pool is 6/4 objects. All model UObjects remain retained. Timings describe this host/configuration; whole-scene frame observations include other rendering/work and are not isolated widget benchmarks or cross-device guarantees.

Style the standard List View ​

In an IFScreen Blueprint, add Event On Theme Updated → Apply Theme to List View. Connect your List View variable to List View and the event's Theme to Theme. IFScreen sends the current theme when constructed and again when Set Theme changes the owning player's theme. WBP_FieldJournal contains this actual graph. The thumb, active thumb, track and thickness follow the screen theme while entries and selection remain intact.

For an ordinary User Widget, call the node from Event Construct using your chosen theme and again from your theme-change handler. The node applies once; it does not automatically subscribe a standard List View. For a local override, supply the override theme on every call instead of the event theme. Applying local styling does not change the player theme. A later global-event call can replace it if your graph supplies the global theme.

Theme Muted Text colors the resting thumb; Accent colors hover/drag; Outline at 35% alpha colors the track. Scroll Bar Thickness uses 4–32 Slate units, with 6 for a nonfinite value. DPI/player UI scaling applies normally. The node accepts engine Tile View and Tree View subclasses; their entry classes, data and navigation remain engine-owned. It returns false for a missing view or unsupported live scrollbar structure. No theme uses InterfaceForge defaults. No Regenerate All Entries is required; both preconstruction configuration and constructed engine views are handled.

Live List View styling/recycling is verified in the saved journal. Field overview adds a saved playable Tile View with live selected details and the same provider contracts; current runtime acceptance is recorded separately. Tree View still has preconstruction styling evidence only. Entry layout decisions explains why these flat RTS/RPG workflows use List/Tile examples and how a project can extend the contract to a hierarchy; no completed Tree workflow is advertised. Physical controller/touch and arbitrary third-party entry/Slate classes remain unverified. See entry lifecycle, customization, and the latest milestone record for exact revision scopes.

UIForge v0.1.0 · Blueprint and C++ development documentation.

Enlarged documentation image

Enlarged documentation image