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. palette is 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

ControlType / defaultWhat 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.

Edit this page on GitHub →