====== Toolbar, QuickBar & ActionBar ====== Die Shell stellt mehrere Leistentypen bereit, in die Add-ins Buttons einbringen können. Jede Leiste hat einen eigenen Zweck und ein eigenes Merge-Verhalten, aber alle verwenden dasselbe Grundprinzip: Ein Button verweist auf einen [[commands|Command]], der Host ordnet die Buttons nach Gruppe und Priorität an, und ''when''-Ausdrücke steuern die Sichtbarkeit. Zurück zur [[start|Contributions-Übersicht]] oder zur [[..:start|Hauptübersicht]]. ===== Die drei Leistentypen ===== ==== Haupt-Toolbar ==== Die Haupt-Toolbar ist die primäre Leiste unterhalb der Menüleiste. Sie enthält die am häufigsten verwendeten Aktionen. Add-ins platzieren Buttons hier über die ''toolbarId'' ''"main"''. Die Haupt-Toolbar ist für globale, kontextunabhängige Aktionen gedacht: Dokument öffnen, Speichern, Rückgängig. Aktionen, die nur in bestimmten Kontexten relevant sind, sollten stattdessen in der ActionBar oder in der [[menus|View-Titelleiste]] platziert werden. ==== QuickBar (Quick Access Bar) ==== Die QuickBar ist eine schmale Leiste mit häufig genutzten Schnellzugriffen. Sie enthält typischerweise kompaktere Buttons ohne Text — nur Icons. Add-ins platzieren Buttons hier über ''toolbarId'' ''"quickbar"''. Der Benutzer kann die QuickBar anpassen: Buttons hinzufügen, entfernen und umsortieren. Der Host speichert diese Anpassungen in den Benutzer-Einstellungen. Die vom Add-in deklarierten Buttons sind die Standardvorgabe, die der Benutzer überschreiben kann. ==== ActionBar ==== Die ActionBar erscheint kontextabhängig, typischerweise am oberen Rand eines Dokument-Tabs oder einer View. Sie zeigt Aktionen, die zum gerade aktiven Inhalt passen. Add-ins platzieren Buttons hier über ''toolbarId'' ''"actionbar"''. Der Vorteil der ActionBar gegenüber der Haupt-Toolbar: Buttons in der ActionBar erscheinen nur, wenn ihr Kontext aktiv ist. Das hält die Oberfläche aufgeräumt. Wenn der Benutzer zu einem anderen Dokumenttyp wechselt, verschwinden die ActionBar-Buttons des vorherigen Typs und die des neuen erscheinen. ===== Manifest-Deklaration ===== "contributes": { "toolbar": [ { "toolbarId": "main", "command": "assets.list", "icon": "media/asset-list.svg", "tooltip": "Anlageliste öffnen", "when": "" }, { "toolbarId": "quickbar", "command": "assets.open", "icon": "media/asset-open.svg", "tooltip": "Anlage öffnen", "when": "" }, { "toolbarId": "actionbar", "command": "assets.save", "icon": "media/save.svg", "tooltip": "Anlage speichern", "when": "activeDocument == assets.editor" } ] } | **Feld** | **Pflicht** | **Beschreibung** | | ''toolbarId'' | ja | Zielleiste: ''"main"'', ''"quickbar"'', ''"actionbar"'' oder eine benutzerdefinierte Id. | | ''command'' | ja | Referenz auf einen deklarierten [[commands|Command]]. Der Button löst diesen Command aus. | | ''icon'' | ja | Relativer Pfad zum Button-Icon (SVG oder PNG). Toolbar-Buttons zeigen in der Regel nur das Icon, keinen Text. | | ''tooltip'' | nein | Tooltip-Text, der beim Überfahren mit der Maus erscheint. Wenn das Feld fehlt, verwendet der Host den Command-Titel. | | ''when'' | nein | Kontextausdruck für bedingte Sichtbarkeit. Leerer String oder fehlendes Feld bedeutet: immer sichtbar. | ===== Merge-Verfahren ===== Der Host sammelt alle Toolbar-Contributions aus allen installierten Add-ins und gruppiert sie nach ''toolbarId''. Innerhalb jeder Toolbar werden die Buttons nach denselben Regeln sortiert wie [[menus|Menüpunkte]]: - Buttons mit ''group''-Angabe werden gruppiert (alphabetisch nach Gruppenname) - Innerhalb der Gruppe sortiert nach ''order'' (numerisch aufsteigend) - Zwischen Gruppen fügt der Host einen visuellen Trenner ein (schmaler Strich oder Abstand) Wenn kein ''group''-Feld angegeben ist, verwendet der Host eine Standardgruppe. Buttons ohne explizite Gruppe landen alle in derselben Sektion. ===== Beispiel: Merge aus drei Add-ins ===== **Add-in A (Assets):** "toolbar": [ { "toolbarId": "main", "command": "assets.list", "icon": "...", "group": "modules", "order": 1 } ] **Add-in B (Berichte):** "toolbar": [ { "toolbarId": "main", "command": "reports.dashboard", "icon": "...", "group": "modules", "order": 2 } ] **Add-in C (Export):** "toolbar": [ { "toolbarId": "main", "command": "export.pdf", "icon": "...", "group": "actions", "order": 1 } ] Das Ergebnis in der Haupt-Toolbar: [ Export-PDF ] | [ Assets-Liste ] [ Berichte-Dashboard ] (actions) | (modules) Die ''actions''-Gruppe steht vor ''modules'' (alphabetisch). Innerhalb der ''modules''-Gruppe stehen Assets vor Berichte (order 1 < 2). Der vertikale Strich ist der Gruppentrenner. ===== Kontextabhängige Buttons ===== Die ActionBar ist besonders nützlich für kontextabhängige Aktionen. Der ''when''-Ausdruck stellt sicher, dass Buttons nur erscheinen, wenn ihr Kontext aktiv ist: "toolbar": [ { "toolbarId": "actionbar", "command": "assets.save", "icon": "media/save.svg", "when": "activeDocument == assets.editor && isDirty" }, { "toolbarId": "actionbar", "command": "assets.print", "icon": "media/print.svg", "when": "activeDocument == assets.editor" } ] In diesem Beispiel erscheint der Speichern-Button nur, wenn ein Asset-Editor aktiv ist und ungespeicherte Änderungen vorliegen. Der Drucken-Button erscheint immer, wenn ein Asset-Editor aktiv ist. Wechselt der Benutzer zu einem anderen Dokumenttyp, verschwinden beide Buttons. ==== Dynamische Re-Evaluation ==== Der Host wertet ''when''-Ausdrücke auf Toolbar-Buttons **dynamisch** aus — genau wie bei [[menus|Menüpunkten]]. Sobald sich ein Kontextwert ändert (z.B. beim Tab-Wechsel), durchläuft der Host alle Toolbar-Buttons mit ''when''-Klausel und aktualisiert deren Sichtbarkeit sofort. Buttons ohne ''when''-Klausel bleiben immer sichtbar. Das bedeutet: Wenn zwei Add-ins Toolbar-Buttons für verschiedene Dokumenttypen deklarieren, sieht der Benutzer nur die Buttons, die zum gerade aktiven Dokument passen. Beim Tab-Wechsel verschwinden die Buttons des vorherigen Typs und die des neuen erscheinen — ohne Flackern und ohne dass das Add-in aktiv eingreifen muss. Die Kette ist: - ''DoActivate'' im Frame setzt den Kontextwert (z.B. ''activeDocument'') - Der Host erkennt die Änderung über ''IContextKeyService'' - ''ReEvaluateToolbarVisibility'' wertet alle ''when''-Klauseln neu aus - Buttons mit ''Visible := False'' werden ausgeblendet, das Layout wird aktualisiert Das Add-in muss dafür den Kontextwert ''activeDocument'' setzen. Das geschieht typischerweise in der ''DoActivate''-Methode des [[..:sdk:document-frame|TWvdSDocumentFrame]]: procedure TAssetEditorFrame.DoActivate; begin FHost.Context.SetContext('activeDocument', 'assets.editor'); end; procedure TAssetEditorFrame.DoDeactivate; begin FHost.Context.SetContext('activeDocument', ''); end; ===== Programmatische Registrierung ===== Für dynamische Szenarien bietet ''IToolbarService'' die Laufzeit-Registrierung: AContext.Subscribe( FHost.Toolbar.AddToolbarItem('actionbar', 'assets.custom-action', 'media/custom.svg', 'Benutzerdefinierte Aktion', 'activeDocument == assets.editor') ); Dynamisch registrierte Buttons werden identisch zu statischen gemergt und dargestellt. Weiter zu [[sidebarviews|Sidebar-Views]] oder zurück zur [[start|Contributions-Übersicht]].