====== Sidebar-Views ======
Die Seitenleiste ist der primäre Ort für navigierende und unterstützende Inhalte: Dateiexplorer, Suchpanels, Navigatorbäume und Übersichtslisten. Add-ins registrieren Views in der Seitenleiste, und der Host bettet sie als Panels ein. Mehrere Views können zu einem Accordion gruppiert werden, sodass verwandte Inhalte visuell zusammengehören.
Zurück zur [[start|Contributions-Übersicht]] oder zur [[..:start|Hauptübersicht]].
===== View-Orte =====
Der Host bietet vier Orte, an denen Views platziert werden können:
| **Ort** | **Schlüssel** | **Beschreibung** |
| Primäre Seitenleiste | ''sidebar'' | Die linke Seitenleiste. Standardort für Navigation und Übersichten. |
| Sekundäre Seitenleiste | ''secondary-sidebar'' | Eine optionale zweite Seitenleiste auf der rechten Seite. Geeignet für ergänzende Informationen. |
| Bottom-Panel | ''panel'' | Das Panel am unteren Rand. Typischerweise für Ausgaben, Terminals und Protokolle. |
| Editor-Bereich | ''editor'' | Innerhalb des Dokument-Bereichs. Selten verwendet, da hierfür der [[..:sdk:document-frame|TWvdSDocumentFrame]] besser geeignet ist. |
===== Manifest-Deklaration =====
"contributes": {
"views": {
"sidebar": [
{
"id": "assets.navigator",
"name": "Assets-Navigator",
"icon": "media/navigator.svg",
"containerId": "assets-explorer"
},
{
"id": "assets.categories",
"name": "Kategorien",
"icon": "media/categories.svg",
"containerId": "assets-explorer"
}
],
"panel": [
{
"id": "assets.log",
"name": "Asset-Protokoll",
"icon": "media/log.svg"
}
]
}
}
| **Feld** | **Pflicht** | **Beschreibung** |
| ''id'' | ja | Eindeutiger Bezeichner der View. Wird in ''view/title''- und ''view/item/context''-Menüs referenziert. |
| ''name'' | ja | Anzeigename, der als Panel-Überschrift erscheint. |
| ''icon'' | nein | Icon für die Activity-Bar (Seitenleiste links) und die Panel-Überschrift. |
| ''containerId'' | nein | Gruppierungs-Id für das Accordion. Views mit demselben ''containerId'' werden in einem gemeinsamen Container zusammengefasst. |
===== Accordion-Gruppierung =====
Wenn mehrere Views dieselbe ''containerId'' haben, fasst der Host sie zu einem Accordion zusammen. Im Beispiel oben bilden ''assets.navigator'' und ''assets.categories'' gemeinsam die Gruppe ''assets-explorer''. In der Seitenleiste erscheint ein einzelner Container mit zwei zusammenklappbaren Sektionen.
Dieses Verhalten ermöglicht es, dass verschiedene Add-ins Views in dieselbe Gruppe einfügen. Ein Basis-Add-in könnte den Navigator bereitstellen und ein Erweiterungs-Add-in eine zusätzliche Kategorie-Ansicht — beide landen im selben Accordion, weil sie dieselbe ''containerId'' verwenden.
Ohne ''containerId'' erhält jede View ihren eigenen Container in der Seitenleiste.
===== View-Inhalt =====
Eine View wird durch einen ''TWvdSDocumentFrame'' dargestellt, der über ''ISidebarService'' registriert wird:
procedure TAssetPlugin.Activate(const AContext: IExtensionContext);
begin
AContext.Subscribe(
FHost.SideBar.RegisterPanel('assets.navigator', 'Assets-Navigator',
'media/navigator.svg', TAssetNavigatorFrame)
);
end;
Der Host erzeugt eine Instanz von ''TAssetNavigatorFrame'', wenn die Seitenleiste die View anzeigt. Die Frame-Klasse muss von ''TWvdSDocumentFrame'' erben.
Alternativ kann eine View über ''ITreeViewService'' mit einem ''ITreeDataProvider'' verbunden werden, wenn ein Baumstruktur-Panel genügt:
AContext.Subscribe(
FHost.TreeViews.RegisterTreeDataProvider('assets.navigator',
TAssetTreeProvider.Create)
);
In diesem Fall erzeugt der Host automatisch ein TreeView-Control und füllt es mit den Daten des Providers.
===== Titelleisten-Aktionen =====
Jede View kann Aktionsbuttons in ihrer Titelleiste haben. Diese werden über den ''view/title''-Ort im [[menus|Menü-Merge]] deklariert:
"menus": {
"view/title": [
{
"command": "assets.refresh",
"when": "view == assets.navigator",
"group": "navigation"
},
{
"command": "assets.add",
"when": "view == assets.navigator",
"group": "navigation"
}
]
}
Der ''when''-Ausdruck ''view == assets.navigator'' stellt sicher, dass die Buttons nur in der Titelleiste der richtigen View erscheinen. Ohne diesen Filter würden sie in jeder View-Titelleiste auftauchen.
===== Welcome-Inhalte =====
Wenn eine View leer ist — etwa weil noch keine Daten geladen wurden —, kann ein Welcome-Inhalt angezeigt werden:
"viewsWelcome": [
{
"viewId": "assets.navigator",
"content": "Noch keine Anlagen vorhanden.\n[Erste Anlage erstellen](command:assets.create)",
"when": "!hasAssets",
"group": "main",
"order": 1
}
]
Der ''content'' unterstützt einfaches Markdown. Links im Format ''[Text](command:command.id)'' werden als Buttons gerendert, die beim Klick den referenzierten [[commands|Command]] auslösen. Der ''when''-Ausdruck bestimmt, ob der Welcome-Inhalt angezeigt wird.
===== Sichtbarkeit steuern =====
Views können programmatisch ein- und ausgeblendet werden:
// View anzeigen
FHost.SideBar.ShowPanel('assets.navigator');
// View verstecken
FHost.SideBar.HidePanel('assets.navigator');
Das ist nützlich, wenn ein Add-in auf ein Ereignis reagieren und die Aufmerksamkeit des Benutzers auf ein bestimmtes Panel lenken möchte.
Weiter zur [[statusbar|StatusBar]] oder zurück zur [[start|Contributions-Übersicht]].