How-To: Lists with Mixed Item Types

Goal: one list (or grid) whose items are different UObject types, each rendered by a different entry widget - without a switch statement.

Prerequisites
Item data as UObjects (list views bind UObjects to entry widgets) and one entry widget Blueprint per item type, each implementing IUserObjectListEntry as usual for list views.

1. Use the Crimson list/tile view

In your screen's Designer, add a Crimson List View (UCrimsonListView) or Crimson Tile View (UCrimsonTileView). They are drop-in UCommonListView/UCommonTileView subclasses that add a factory pipeline for entry-class selection.

2. Add factory rules

Select the view; in Details -> Entry Creation -> FactoryRules, add one Crimson Widget Factory Class (UCrimsonWidgetFactory_Class) per item type: DataClass = the item's class (subclasses match too), WidgetClass = the entry widget. Factories are evaluated by their Priority property, highest first - give the most specific rule the highest priority.

Screenshot pendingImages/CrimsonUI/howto-listview-factories.png
CrimsonListView Details -> Entry Creation -> Factory Rules: [0] CrimsonWidgetFactory_Class (Data Class = EquipmentItem, Widget Class = WBP_EquipmentEntry), [1] (Data Class = ConsumableItem, Widget Class = WBP_ConsumableEntry).
Custom matching logic
For matching beyond 'is a subclass of X' (by interface, by property), subclass UCrimsonWidgetFactory (Blueprintable) and override its FindWidgetClassForData BlueprintNativeEvent to return a widget class or null to fall through to the next rule.

3. Feed it items

Screenshot pendingImages/CrimsonUI/howto-listview-setitems-bp.png
Build an Array of Objects mixing both item types -> Set List Items on the Crimson List View. Each row spawns the widget class its factory rule selected.
Verify
A mixed array renders each item with its own entry widget class. An item matching no rule falls back to the view's normal Entry Widget Class.

See also

  • How-To: Build an MVVM Screen - entry ViewModels with a FieldNotify row index.
  • How-To: Drag & Drop - dragging entries between views.