Skip to content

Blueprint contextual tooltips ​

Tooltips present short contextual information without moving CommonUI focus away from an action. The standalone RTS and RPG action entries pass their own presentation models to a saved custom tooltip. All classes and nodes below are public InterfaceForge features; command execution stays in the example adapters.

Add a tooltip to your own button ​

  1. Create a Widget Blueprint with parent IFButton. Put InterfaceForge Tooltip Anchor at the root of its Designer tree and name it TooltipAnchor. Place your existing button content inside the anchor. Optional FocusBorder, LabelWidget, and AvailabilityWidget names keep the normal button presentation contracts.
  2. Set the anchor's Tooltip Entry Class to your tooltip Widget Blueprint. It must implement IFEntry. You can leave the native IFTooltipCard default for a title, description and unavailable reason. Placement defaults to Menu Left; the engine also provides above/below/right placements. Preferred Width is in player UI units, before the engine's DPI/user scale.
  3. Create or receive an IFPresentationData object. Set Title, Detail, bEnabled and Unavailable Reason, then call Set Tooltip Data on the button. Its normal hover/focus callbacks request or hide the tooltip through the owning local player.

Expected result: meaningful pointer hover or keyboard/controller navigation focus opens the tooltip after the UI preference's Tooltip Delay (default 0.35 seconds). A parked mouse pointer does not compete with navigation focus. Unavailable actions remain focusable and can explain their restriction. No gameplay action is executed by opening a tooltip.

The native IFButton already contains an anchor. Existing custom button trees need the named component; Set Tooltip Data safely does nothing if it is absent. Clearing data with Set Tooltip Data → None closes the tooltip and drops the button's data reference.

Author the content entirely in Blueprint ​

WBP_ForgeTooltip in /Game/UI/Blueprint has parent IFEntryWidget. Its Designer uses an InterfaceForge Surface and three InterfaceForge Text widgets: HintTitle (Accent, 13), HintDetail (Body, 11), HintReason (Caption, 10). These follow the current local-player theme and text-size preferences.

Its real graph is:

flowchart LR
  R[On Entry Refreshed] --> C[Cast Entry Data to IFPresentationData]
  C --> T[Set Text: HintTitle from Title]
  T --> D[Set Text: HintDetail from Detail]
  D --> U[Set Text: HintReason from Unavailable Reason]
  E[On Entry Released] --> X[Set all three texts empty]

Change your model's fields together and call Notify Data Changed once. IFEntryWidget refreshes its subscribed content without rebuilding the button or tooltip. Call Set Tooltip Data to replace the entire source object. For your own data type, implement IFEntry directly or use IFEntryWidget and bind/unbind your events in On Entry Initialized / On Entry Released. A custom UObject is supported; generic-model subscription is only a convenience.

The tooltip is passive and Hit Test Invisible. Keep its body concise. Put long documents, interactive actions or scrollable details in a contextual screen/dialog; tooltip content does not take keyboard focus or accept scrolling. Its width is bounded to the lesser of Preferred Width (120–600) and 60% of the current player's root width. The engine fits the resulting popup to the window. This is not a guarantee that arbitrarily long prose or a custom fixed-size tree will fit vertically; test your actual translated content and use a panel when needed.

Plain custom widgets and touch gestures ​

A plain Widget Blueprint can wrap its content in InterfaceForge Tooltip Anchor without deriving from IFButton. Use the anchor's Set Tooltip Data, Request Tooltip and Hide Tooltip nodes from your own hover, navigation or gesture events. Request Tooltip → Use Delay false supports an explicit touch long-press or another deliberate gesture. InterfaceForge does not implement gesture recognition or consume touch presses on your behalf. Automatic touch activation and physical touch-device behavior remain unverified.

Use these InterfaceForge request/hide nodes instead of the inherited low-level Menu Anchor Open/Toggle Open functions so the local-player delay and competing-tooltip policy run. Request Tooltip returns false for missing data, invalid/abstract/non-entry classes, another player's anchor, a missing root/top screen, or a screen transition/covered screen.

Lifetime, screens and customization ​

Create the owning player's root using Get Local Player Subsystem (IFLocalPlayerSubsystem) → Create Root. A custom IFRootLayout Blueprint registers its HUD/Menu/Modal CommonUI stacks through Register Layer. The inherited root tick advances one tooltip delay per player even when the game world is paused. No timer or population scan is added to each entry.

Only one pending/open tooltip exists per local player. Switching sources closes the old popup and calls Release Entry before creating the new content. Modal pushes, screen transitions, layer clears and root removal close active/pending tooltips. Covered IFScreen content cannot reopen a tooltip. Custom widgets with no enclosing IFScreen are scoped to the current top screen when requested; hide them when your own context ends.

Set Tooltip Entry Class in the Designer to replace the whole body. Change IFText roles/Base Size, surface tokens, spacing and the local-player theme to customize it. The anchor adds a width bound around the entry tree, uses the engine's Menu Anchor placement and opens in the existing player window without taking focus. It does not copy Game Master's visual design or use reference assets.

Source and cooked runtime evidence, exact engine/device scope, captures and retained failed checks are recorded in Evidence/TOOLTIP_RUNTIME.md. Physical controller/touch, split-screen and localized long-text acceptance are still separate gates.

Engine foundation ​

Epic documents Menu Anchor's placement, Fit in Window, content creation callbacks and application-stack lifetime options in Using Menu Anchors. InterfaceForge uses that engine placement/lifetime foundation with a passive current-window popup and a local-player policy. It avoids continuously positioning an independent canvas from potentially stale Get Cached Geometry values. Cached geometry in the runtime fixture measures the previous rendered frame for verification; it is not the placement implementation.

Input-aware placement ​

The anchor's Use Navigation Placement defaults off. Enable it and choose Navigation Placement for keyboard/controller focus; normal Placement remains the pointer/touch choice. Get Resolved Placement reads the current local-player intent. After changing options while open, call Refresh Tooltip Placement; this preserves the entry and source focus. IFButton's existing input callbacks also refresh an active request. This adds no widget-specific device detector.

The samples choose Above for pointer and Centered Above for navigation, Preferred Width400. Their saved tooltip uses padding10,4-unit gaps, Wrap Text At350 and Auto Wrap Text; the final Set Text of HintReason branches through Text Is Empty → Set Visibility (Collapsed / Hit Test Invisible). Tune those properties for your own width and translations. These values were verified at two sizes, not every layout.

InterfaceForge buttons now default Apply Alpha On Disable off. Semantic unavailable colors still apply, CommonUI still blocks activation and preserves navigation, and the tooltip avoids a second inherited0.5fade. Existing projects may explicitly retain their chosen CommonUI property. Keep it off for readable tooltip/cooldown layers.

Current placement evidence covers18source/cooked results and strict independent core builds on5.6/5.7/5.8. Passive readout/notification overlap, physical devices and broad polish remain open.

Reserved navigation descriptions ​

An IFScreen can now call Register Navigation Hint Host for an empty owned Content Widget and any IFEntry body. With Use Navigation Hint Host enabled on the anchor, keyboard/controller focus uses that body while pointer hover retains its popup. Is Tooltip Shown includes both; Is Open remains popup-only. Navigation hint recipe documents actual Designer/entry/registration nodes, result reading priority and lifetime. The saved RTS/RPG examples use this to keep focus descriptions out of their essential HUD panels.

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

Enlarged documentation image

Enlarged documentation image