Docs Core
PaletteRegistry
Contribute tabs to TouchDesigner's Palette Browser: a tool publishes a native panel COMP and it appears beside the stock Palette tab, sized to the slot and notified on every tab change.
◈ Core
Palette Registry
TouchDesigner's Palette Browser leaves a 32 px strip free above its component list, exactly a folder-tab row. This registry puts a tab strip there: TD's own Palette first, then one tab per contribution, each showing a panel from the tool that published it.
The stock palette stays where it is, as it is. The registry loads TD's own
folderTabs widget into the free row and shows each contributed panel through a
Select COMP mirror; the stock panels only get their display flag toggled while a
contributed tab is in front. /ui is never saved with a project, so the whole
surface is rebuilt on every load.
It ships as its own core package, promoted to /sys (global shortcut
op.FNS_PALETTEREGISTRY), alongside the other surface registries.
With nothing contributed, the palette dialog stays exactly as TouchDesigner ships it. The strip and its mirrors appear with the first registration and disappear with the last.
For tool authors
A tool that wants a palette tab ships a small host copy of this registry, the same shape as a toolbar or navbar entry. The host's Registration page names the tab:
- Tool COMP: the contributing tool (defaults to the host's parent).
- Canonical Name: unique id for the tab; empty uses the tool's name.
paletteis TD's own tab and is rejected. - Tab Panel: the panel COMP to show; defaults to the tool itself.
- Callbacks DAT: optional;
onPaletteTab(canonical, previous)fires on every tab change. - Expose in Palette / Shown in Palette / Tab Label / Tab Order: the usual publishing controls. Shown in Palette is written back to the host, so a hidden tab stays hidden with the tool.
From Python, op.FNS_PALETTEREGISTRY.RegisterTab(comp, 'mytool', panel=panel, label='My Tool', order=20) does the same; Tabs(), SetTabDisplayed(),
ShowTab(), CurrentTab() and UnregisterTab() are the rest of the API.
Your panel is resized while it is registered. A Select COMP cannot push its size into its source, so the registry rewrites the panel's width and height to slot expressions and restores the originals when the tab goes away. Do not re-point them behind its back.
The tool's panel keeps its state across tab switches, a Web Render's browser process included, because mirrors are views of the same panel.
Several tabs from one tool
The Registration pars define the first tab; the Tab sequence on the same page adds one more per block:
- Canonical Name: empty means no tab, which is how a block stays inert (TouchDesigner always keeps at least one block in a sequence).
- Tab Panel: empty reuses the first tab's panel. That is how one panel
serves several tabs: register them all, then route on
onPaletteTab. - Tab Label / Tab Order / Shown in Palette: as above.
A block with a bad or duplicate name is reported in Registration Status and skipped; it never costs the tool its first tab.
Hotkey
SearchPalette's ctrl+shift+f calls
ShowTab('palette') on this registry before focusing its search field; that
field lives in the stock palette list, which a contributed tab hides. Any tool
whose UI is hidden by a contributed tab can do the same.
Get it
Tick it on the install page and it installs with the rest of your setup and stays up to date.
Download FNS_PaletteRegistry.tox Version 3.2.5, the tool on its own. It works in any project, and this copy never updates itself.
Parameters
Registration
| Control | Type / default | What it does |
|---|---|---|
Tool COMPComp |
operator.. | The tool that contributes this tab. Defaults to the parent component (the host lives inside the tool it publishes). |
Canonical NameCanonicalname |
textempty | Unique name of the tab (letters, digits, _ -). Leave empty to use the tool COMP name. "palette" is TD's own tab and cannot be taken. |
Tab PanelPanel |
operatorempty | The panel COMP shown when this tab is selected. Shown in place through a Select COMP, never copied, and sized to the tab slot by the registry (its w/h become slot expressions while registered). Defaults to the tool itself. |
Callbacks DATCallback |
operatorempty | Optional Python DAT. onPaletteTab(canonical, previous) fires on every tab change so the tool can react (e.g. route a shared panel). Raise-contained. |
Expose in PaletteAutoregister |
on / offon | Publish this tab into TouchDesigner's Palette Browser while the component exists. Off = the tool contributes nothing. |
RegisterRegister |
button | Publish once into the Palette Browser, even if Expose is off. |
UnregisterUnregister |
button | Take this tool's contribution back out of the registry and turn Autoregister off, so it stays out. Register puts it back. |
Registration StatusRegstatusread-only |
textempty | Read-only status of this host registration. |
Shown in PaletteDisplayed |
on / offon | Show this tab on the Palette Browser's tab strip. Off keeps it registered but hidden; the registry writes its choice back here so it persists with the tool. |
Tab LabelTablabel |
textempty | What the tab strip shows. Empty = the canonical name. |
Tab OrderTaborder |
number50 | Position on the strip after TD's own Palette tab (always first). Contributions default to 50 and sort by this, then by label. |
Help URLHelpurl |
textempty | The tool's wiki/help page. Informational; leave empty to skip. |
Promote ParametersPromotepars |
on / offon | When on, the host mirrors its key Registration parameters onto the parent tool as a bound Registry page (Pl* pars). Turn off before shipping a tool that should not expose registry controls. |
Pre-Save HealPresaveheal |
on / offon | Before each project save, re-check this registry: update entries whose component moved, drop entries whose component is gone, and republish a host that initialised before the global registry existed. Off skips the sweep for this registry only. |
Extra TabsTab |
sequence0 | Additional tabs published by this one host. The Registration pars above define the FIRST tab; each block here adds one more, so a tool can put several tabs on the strip (optionally over the same panel) without stamping a second host. |
Canonical NameTab0name |
textempty | Unique name of this extra tab (letters, digits, _ -). Required; the block is skipped while it is empty. "palette" is TD's own tab and cannot be taken. |
Tab PanelTab0source |
operatorempty | Panel COMP shown for this tab. Leave empty to reuse the Tab Panel above. That is how one panel serves several tabs, routed by onPaletteTab. |
Tab LabelTab0label |
textempty | What the tab strip shows for this tab. Empty = the canonical name. |
Tab OrderTab0order |
number50 | Position on the strip after TD's own Palette tab. Contributions sort by this, then by label. |
Shown in PaletteTab0shown |
on / offon | Show this tab on the strip. Off keeps it registered but hidden. |