Every feature

Everything it does, and the one thing you set to get it.

On the left is the thing you want. On the right is where it lives, which is either a field in the Details panel or a node in a graph.

A table-wide switch takes the gesture away and leaves the node. Turn Allow Column Resize off and the header stops dragging, but Set Column Width carries on working. The header menu is the exception: switched off, it opens from nowhere, its nodes included.

A column's own tick boxes go further. With Sortable off, Cycle Column Sort skips that column too, and with Resizable off, so does Begin Column Resize. Sort By Column and Set Column Width still work on it.

Every default named here is the one it ships with. Anything that is off out of the box says so.

Getting rows in

An array of your objects
Set Items. Builds a model inside the table for you.
A DataTable asset
Set Data Table.
Anything else
Set Model, with a subclass of Smart Table Model.
Add or remove one row
Add Item, Remove Item, Clear Items.
Redraw after your data moved
Notify Item Changed for one, Refresh Items for all.
Rows keep their identity
Override Get Row Id on a model. Without it a selection is keyed on the row number, which only survives a set that grows.

Columns

Declare them
Columns in the panel, or Set Columns from a graph.
Build them from your data
Column Source, then Copy Columns From Source. Item class, DataTable, or a CSV or JSON file on disk. A file inside the project is kept relative to it, so the path works on every machine the project is cloned to.
Bind a column to a field
Binding Name, picked from a dropdown. Empty falls back to Column Id, which is why most columns need nothing here.
Draw one field, order by another
Sort Binding Name.
Fixed or share-of-the-rest
Sizing and Width. Fill is a weight, Fixed is pixels.
Alignment and padding
HAlign, Cell Padding, Header HAlign.
Decimal places
Max Fractional Digits. 2 by default.
Per-column switches
Sortable, Resizable, Hideable, Hidden By Default.
An icon in the header
Show Header Icon, off by default, then Header Icon and Header Icon Spacing.
One header styled differently
Override Header Text Style, off by default, then Header Text Style.
A widget instead of text
Cell Class.
Duplicate ids caught at compile
Automatic. It's an error, so the compile stops.
Bindings checked at compile
Automatic once Column Source names a schema.

Cells

Text
Automatic for a column with no Cell Class.
A text box, number box or tick box
Cell Class set to the built-in editable cell. The model says which one a value gets, and both built-in models read that off its type.
Your own widget
A Widget Blueprint parented to Smart Table Cell, named in Cell Class.
Fill it in
Bind On Cell Assigned. It runs many times on one instance, because cells are pooled.
Clear it out
Bind On Cell Released. Anything held here keeps a row alive that has scrolled away.
Know why it was assigned
The Reason pin: Added, Scrolled, Refreshed or Value Changed. An entrance then plays once and not on every scroll.
Flash on change
Value Changed Animation on the cell. Named Pulse by default. Clear it for a cell that should hold still.
Cells take input first
Interactive Cells. Off by default, because a cell that eats the pointer stops a row being clicked.
Colour a cell or a row
Override Get Cell Color or Get Row Color on a model. Alpha zero hands the decision back to the style.

Sorting and filtering

Click a header to sort
On. Switch: Allow User Sorting.
A second level, shift-click
On. Switch: Allow Secondary Sort.
A third click clears it
On. Switch: Allow Sort None.
Refuse a second level that can move nothing
On. Switch: Allow Dead Secondary Sort, which is off, meaning the refusal is on.
Sort from a graph
Sort By Column, Cycle Column Sort, Set Sort Spec.
Numbers sort as numbers
Automatic for a bound numeric property. Override Get Cell Sort Key when the model builds the value itself.
Natural order
Automatic. A run of digits inside a name reads as a number.
Sort somewhere else entirely
Override Sort Rows, for a server, a query or a load.
Filter across every column
Set Filter Text. The search box is yours to build.
Your own matching
Override Apply Text Filter.
Two different empty states
Empty Text for no rows, No Matches Text Format for a filter that matched none.

Selection and reach

One row, many, or none
Selection Mode. Single by default. Multi gives you ctrl and shift click.
Read it
Get Selected Item, Get Selected Items, Get Selected Rows.
Set it
Set Row Selected, Set Selected Item, Clear Selection. Set Rows Selected and Set Selected Items take a whole set and report it once.
Move the caret
Move Selection, Move Selection By Page, Select First Row, Select Last Row, Activate Selected Row.
Take keyboard focus
Focus Table.
Focus follows a click
On. Switch: Focus On Pointer Interaction.
Aim at a column with a pad
Select Column, Move Column Selection. Held apart from the row selection and named by column, so moving a column can't move the aim.
Selection survives a sort
Automatic. A sort moves no row number. Get Row Id is what keeps it when rows arrive or leave.

Reordering, dragging

Drag a row somewhere else
Allow Row Reorder. Off by default, and it needs a model that owns its own order.
Move rows without a pointer
Move Rows To, Move Selected Rows.
The insert line
Row Insert Marker Brush.
Drag between cells
Allow Cell Drag Drop. Off by default, because every cell would take the pointer before the row does.
What travels
Read Smart Table Cell Drag Drop Op on the drop: row, row id, column, item, table.
What the drag looks like
Drag Visual Class on the column, or override Make Cell Drag Visual.
Source and target marking
On. Switch: Mark Drag Cells. Turn it off and react yourself in On Cell Drag Role Changed.
The header menu
On. Switch: Enabled under Header Menu Options. With a pointer it's the only way back once every column is hidden.
What is in it
5 switches under Header Menu Options: sort, size to content, move, show and hide, reset. Each is separate from the gesture it mirrors.
The row menu
Enabled under Row Menu Options. Off by default, so entries alone give you no menu on a right click. Open Row Menu opens one either way.
Your own entries
Row Menu Entries, then bind On Row Menu Entry Chosen and switch on the id.
Different entries per row
Bind On Row Menu Opening. It fires before the list is read.
Open one without a pointer
Open Header Menu, Open Table Menu, Open Row Menu. A pad button or a key opens what a right click opens.
Add to either menu from C++
On Extend Header Menu, On Extend Row Menu. C++ only, because an FMenuBuilder has no Blueprint form.
Close one from a graph
Close Menu. A hidden table already shuts its own, so this is for closing one yourself.

Layout that comes back

Resize a column
On. Switch: Allow Column Resize. Grip width and minimum come from Project Settings.
Reorder columns
On. Switch: Allow Column Reorder. From a graph: Move Column, Move Column Next To, Set Column Order.
Resize with a stick or a held key
Begin Column Resize, Update Column Resize, End Column Resize.
Hide and show
Set Column Visible, or the header menu.
Size a column to its content
Size Column To Content, or the header menu.
Take up the slack
Stretch Last Column. Off by default.
Keep it between sessions
Table Id, then a Layout Store. Pick the config store and it writes to the game settings ini.
Somewhere else entirely
A Blueprint or C++ class deriving from Smart Table Layout Store: 2 functions, Load and Save.
Into a save game instead
Get Layout and Apply Layout. Every member is SaveGame, so it drops in as one field.
Put it back
Reset Layout, or the header menu entry.

Size, scrolling, row numbers

Row height
Row Height. 24 by default.
Fill the space, or fit the rows
Height Mode, with Max Visible Rows.
No header at all
Show Header off. The Pairs demo is a headless grid.
A number down the left
Show Row Numbers. Off by default.
Scroll to something
Scroll Row Into View, Scroll Item Into View, Scroll To End. Smoothed over Scroll To Row Seconds.
Chat window behaviour
Stick To End and Scroll To Added Row, both on. The view stays at the bottom while the reader is there. Scrolled up, it keeps the rows it shows while new ones come in and old ones go.
Open at the bottom
Start At End. Off by default.
30 columns
Allow Horizontal Scroll. Off by default. With it off, widening one column takes width from its neighbours. With it on, the columns scroll sideways instead.
Reach a far column with a pad
Scroll Columns By, while Allow Horizontal Scroll is on.
Right-drag to pan
On. Switch: Allow Right Click Drag Scroll.

Styling

One asset for the whole look
Style Asset. It wins over the table's own values, and those grey out while it's set.
Every surface
Background, rows, header, scrollbar, menu, and the marks a drag draws. Most sit in the panel under Style, and six under Row Numbers, Empty State, Drag and Drop and Busy.
A project-wide palette
Project Settings, Plugins, Smart Tables. 11 colours and 4 column metrics that every table starts from.
Palette edits land at once
Automatic in the editor. Open tables, style assets and templates all follow, and a brush you already edited is left alone.
Wrap a row in your own widget
Row Widget Class, with the cells going into a named slot. That is what lets a row animate in Sequencer.
An entrance
Arrival Animation on that wrapper. Named In by default.
No art ships
Nothing to enable. The plugin adds no image to your project. Its brushes take the style's colours, and the sort arrows and the menu tick are the engine's own.

Large sets

A million rows
Nothing to enable. Only the rows on screen get widgets. The table keeps a few numbers for every row, and a sort reads a key from each.
Sort off the game thread
Set Work Dispatcher on the model, with one of the two shipped dispatchers. C++ only, and nothing installs one by default, so the shipped behaviour is an inline sort.
A busy overlay
Automatic while a dispatched sort runs. For your own slow work, Set Busy.
How long before it shows
Busy Overlay Delay Seconds, and Block Input While Busy.
A superseded sort is dropped
Automatic once a dispatcher is set.

While you are authoring

Rows in the designer
Preview Row Count. Set it to zero to preview the empty state instead.
Columns written for you
Copy Columns From Source. It only adds, so pressing it again after a new field brings that one in and leaves your edits alone.
A guard on switching source
Automatic. Changing Column Source asks first, because it clears the others.
5 log categories
Console: Log LogSmartTablesSort Verbose and 4 more. One at a time, so the answer to one question isn't buried under the others.

Events

Every one of these has a plus button beside it in the Details panel.

On Selection Changed
The selection moved.
On Row Activated
Double click, or Enter.
On Sort Changed
The sort spec moved.
On Layout Changed
A width, an order, or a hidden column moved.
On Column Selection Changed
The column a pad is aiming at moved.
On Cell Value Changed
A control inside a cell moved.
On Cell Dropped
A drag ended on a cell.
On Rows Dropped
Rows were moved: a row drag ended, or Move Rows To or Move Selected Rows ran.
On Row Menu Opening
Before the row menu reads its entries.
On Row Menu Entry Chosen
One of your entries was picked.

Not built yet

What is not in it today.

Grouping and tree rows
Every row is flat.
Frozen data columns
Only the row-number gutter is pinned.
Cell selection
Selection is per row.
A search box
Set Filter Text is the door.
A filter per column
Override Apply Text Filter on a model.
Dragging through a Widget Interaction Component
It clicks, sorts, resizes a column and opens a menu. It starts no drag of a row, a cell or a header.

Next: Your first table