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
Pulseby 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.
Menus
- 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
Inby 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 Verboseand 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