Reference for the Studio activity tree — the entry point for browsing, editing, and authoring every Fixo resource.
Where it lives
FixoStudioActivityis reachable from the Hub utilities menu and the Agent configuration menu. It's aMenuActivitywhose buttons push specific manager activities onto the activity stack. Studio runs Node-independently (it takes aFixoLibrary*and a couple of helpers, not anAgent*) so Hub and Remote can author presets too.
Every Book has a manager. They share a common base (FixoItemManagerActivity) and a uniform UI:
| Manager | Edits | Editor activity |
|---|---|---|
FixoPresetManager |
Presets | FixoPresetEditorActivity |
FixoBoardTypeManager |
Boards | BoardManagerActivity (in libboard) |
FixoActuatorTypeManager |
Actuator types | FixoActuatorTypeEditorActivity |
FixoSensorTypeManager |
Sensor types | FixoSensorTypeEditorActivity |
FixoLobeTypeManager |
Lobe types | FixoLobeTypeEditorActivity |
FixoStanzaTemplateManager |
Stanza templates | (inline edit) |
FixoPresetTemplateManager |
Preset templates | (inline edit) |
| Element | Behaviour |
|---|---|
| List view | Items in FixoBook::list() order. Built-ins greyed out and read-only. |
| New | Auto-numbered name suggestion ("New preset 1", etc.). Calls book->create(). |
| Rename | Disabled for built-ins. Inline edit with collision check. |
| Duplicate | Creates "Copy of X". Always enabled — duplicate-to-edit is the workflow for editing built-ins. |
| Delete | Disabled for built-ins. Confirmation dialog. |
| Import | File picker; calls book->importFile(). |
| Export | Writes the selected item via book->exportFile(). |
| From template | Visible only on FixoPresetManager. Pushes the preset-template wizard. |
| Done | Pops the manager off the stack. |
| Double-click on item | Opens the matching editor activity. |
Items with builtin: true in their fixo.json are read-only. The manager:
FixoActuatorTypeEditorActivity, FixoSensorTypeEditorActivity, and FixoLobeTypeEditorActivity share a common base (FixoTypeEditorActivity) and look like this:
Common fields
my-custom-servo).hpp filename the firmware generator includes (e.g. my-custom-servo.hpp)CppSyntaxHighlighter and WidgetCodeEditor (line numbers, error squigglies, auto-indent on Enter, Tab indent, Ctrl+Shift+Up/Down to move lines)Per-type fields
| Editor | Extra fields |
|---|---|
| Actuator type | pinCount, pinPurposes, wire valueRep (totalBits, fractionalBits, isSigned, isFloat) |
| Sensor type | pinCount, pinPurposes |
| Lobe type | placement (board-only / native-only / both), inputParameters |
Debounced source change signal
The base class emits sourceDebouncedChanged(QString) 500 ms after the user stops typing in the C++ editor. A status line under the editor reads editing… → changes pending save. The future live-compile path hooks this signal to a background LLVM build that maps compiler diagnostics back to line annotations via WidgetCodeEditor::setLineMessage().
Live error feedback is currently scaffolded but inactive — a type in isolation has no preset context, so the background build needs a Phase 6
FixoRuntimeinstance (or a Phase 4 preset context) to produce meaningful diagnostics. Editing types still works fine; you just don't get inline compile errors yet.
FixoPresetEditorActivity opens when the user double-clicks a preset in FixoPresetManager (or via New / Duplicate / From template). Layout:
| Section | What it edits |
|---|---|
| Name | Free-text id |
| Board | QComboBox populated from FixoBoardTypeBook. Mandatory. |
| Actuators | Table; one row per actuator with columns: type (combo), name, pin, trim, min, max, reverse. Add / Remove buttons. |
| Sensors | Table; columns: type, name, pin, pinB (for two-pin sensors). Add / Remove buttons. |
| Stanzas | List id — lobeType (N mappings). Add / Edit / Remove. The full per-stanza pose-mapping editor arrives with StanzaEditorActivity. |
| Stanza sets | QLabel summarising derived stanza sets. Recomputed automatically when actuators or stanzas change. |
| Save / Cancel | Save persists via FixoPresetBook::create(); Cancel pops without writing. |
Built-in presets load read-only with all inputs disabled and Save greyed out (tooltip points at Duplicate).
The "Stanza sets" label lists each derived set, e.g.:
Set 1: walk, idle (share leg actuators)
Set 2: drive (uses wheels only)
Two stanzas end up in the same set when they share any actuator. Only one stanza per set can run at a time — the Remote-side stanza picker enforces this with a conflict-disabling combo.
FixoStudioActivity (MenuActivity)
├── Presets
│ ├── FixoPresetManager ─▶ FixoPresetEditorActivity
│ └── FixoPresetTemplateManager ─▶ inline edit / wizard
├── Hardware
│ ├── FixoBoardTypeManager ─▶ BoardManagerActivity (libboard)
│ ├── FixoActuatorTypeManager ─▶ FixoActuatorTypeEditorActivity
│ └── FixoSensorTypeManager ─▶ FixoSensorTypeEditorActivity
├── Control
│ ├── FixoLobeTypeManager ─▶ FixoLobeTypeEditorActivity
│ └── FixoStanzaTemplateManager ─▶ inline edit
└── Build
└── (FixoRuntime view — see fixo-runtime reference)
| Component | Header |
|---|---|
FixoStudioActivity |
libfixo/fixo/studio/FixoStudioActivity.hpp |
FixoItemManagerActivity |
libfixo/fixo/studio/FixoItemManagerActivity.hpp |
FixoPresetManager etc. |
libfixo/fixo/studio/FixoManagers.hpp |
FixoTypeEditorActivity |
libfixo/fixo/type/FixoTypeEditorActivity.hpp |
FixoActuatorTypeEditorActivity |
libfixo/fixo/type/FixoActuatorTypeEditorActivity.hpp |
FixoSensorTypeEditorActivity |
libfixo/fixo/type/FixoSensorTypeEditorActivity.hpp |
FixoLobeTypeEditorActivity |
libfixo/fixo/type/FixoLobeTypeEditorActivity.hpp |
FixoPresetEditorActivity |
libfixo/fixo/studio/FixoPresetEditorActivity.hpp |
FixoPresetTemplateWizardActivity |
libfixo/fixo/studio/FixoPresetTemplateWizardActivity.hpp |