
Einleitung
Ich wollte unsere häufigsten Abläufe schneller erreichbar machen, ohne für jede einzelne Funktion eigene Buttons in der Symbolleiste zu benötigen. Dafür haben wir ein kleines AppleScript gebaut, das ein eigenes Menü öffnet, über das mehrere Aktionsketten strukturiert aufgerufen werden können.
Die Idee dahinter: häufige Leistungen, Diagnosen, Dokumentationstexte und kombinierte Standardabläufe mit einem einzigen Shortcut erreichbar zu machen.
Warum wir das verwenden
Natürlich kann man in tomedo bereits sehr viel über Favoriten lösen.
Man kann:
- Leistungen als Favoriten anlegen
- Diagnosen als Favoriten verwenden
- Aktionsketten direkt in die Symbolleiste legen
Das funktioniert grundsätzlich auch gut. Im Alltag entsteht dabei aber schnell ein Problem: Sobald man mehrere häufige Abläufe hat, wird die Symbolleiste relativ schnell voll.
Wenn man für jede häufige Aktion:
- EKG
- Blutabnahme
- Infusion
- Verbandswechsel
- Vorsorge
- Injektionen
- Dokumentationshilfen
…einen eigenen Button anlegt, verliert man irgendwann die Übersicht.
Zusätzlich sind Favoriten oft trotzdem mehrere Klicks:
- Leistung auswählen
- Diagnose ergänzen
- Text dokumentieren
- weitere Schritte ausführen
Genau dafür verwenden wir die Aktionsketten. Und genau deshalb haben wir das Menü gebaut: Nicht damit eine Aktionskette schneller erreichbar ist, sondern damit viele Aktionsketten strukturiert über ein einziges Menü erreichbar werden.
Der eigentliche Vorteil
Der wichtigste Punkt ist für mich aber eigentlich ein anderer: Die eigentliche Arbeit passiert nicht im AppleScript-Menü, sondern in den Aktionsketten. Das Menü selbst ist nur der Launcher.
Wenn sich ein Ablauf ändert, passt einfach die Aktionskette an. Der Menüpunkt bleibt derselbe. Dadurch kann man Prozesse laufend verbessern, ohne dass sich die Bedienung verändert. Gerade das macht das System langfristig angenehm wartbar.
Workflow in der Ordination
Wir haben das Script zudem als Symbol an zweiter Stelle oben in der Symbolleiste liegen. Dadurch können wir es überall mit:
⌘+2
aufrufen — ohne überhaupt mit der Maus auf das Symbol klicken zu müssen. Das fühlt sich im Alltag fast wie ein globales Shortcut-Menü an.
Aufbau der URLs
Die Menüeinträge starten einfach eine Aktionskette über das tomedo-URL-Schema:
tomedo://aktionskette?NAME_DER_AKTIONSKETTE
Wir haben unsere bewusst mit ASC_ prefixiert:
ASC_EKG
ASC_Labor
ASC_Infusion_Eisen
ASC_Infusion_Andere
Dadurch sind die Aktionsketten: leichter auffindbar, logisch gruppiert und sofort als „vom Script verwendet“ erkennbar. Gerade wenn viele Aktionsketten existieren, ist so eine Struktur lebensnotwendig.
Grundidee des Scripts
Das Script erzeugt dynamisch ein macOS-Menü (NSMenu) mit Untermenüs und Menüeinträgen. Der technische Teil dahinter ist eigentlich nebensächlich.
Interessant ist hauptsächlich:
- wie das Menü aufgebaut wird
- wie man es strukturiert
- und wie man es erweitert
Einfache Menüeinträge
Das hier erzeugt einen normalen Menüpunkt:
my addMenuItem(m, "❤️ EKG", "tomedo://aktionskette?ASC_EKG")
Die drei Teile sind immer gleich aufgebaut:
addMenuItem(
Menü,
"Angezeigter Titel",
"Aktionsketten-URL"
)
Untermenüs erstellen
Für größere Gruppen lohnt sich ein Untermenü.
Beispiel „Infusion“:
set infusionItem to (ca's NSMenuItem's alloc()'s initWithTitle:" Infusion" action:(missing value) keyEquivalent:"")
set infusionMenu to (ca's NSMenu's alloc()'s initWithTitle:"Infusion")
Danach kommen die eigentlichen Einträge:
my addMenuItem(infusionMenu, "Eisen", "tomedo://aktionskette?ASC_Infusion_Eisen")
my addMenuItem(infusionMenu, "Andere", "tomedo://aktionskette?ASC_Infusion_Andere")
Am Ende wird das Untermenü verbunden:
infusionItem's setSubmenu:infusionMenu
m's addItem:infusionItem
Das Prinzip kann man beliebig oft wiederholen. Gerade dadurch bleibt das Menü trotz vieler Funktionen übersichtlich
Trennlinien verwenden
Für bessere Übersicht:
m's addItem:(ca's NSMenuItem's separatorItem())
Gerade bei größeren Menüs macht das einen deutlichen Unterschied.
Emojis im Menü
Die Emojis sind nicht nur Spielerei.
Im hektischen Alltag erkennt man Gruppen visuell deutlich schneller:
- ❤️ EKG
- Infusion
- Injektion
- Wunde
- ✂️ Eingriff
Gerade bei größeren Menüs spart das überraschend viel Zeit. Die Auswahl ist im medizinischen Kontext leider sehr limitiert. Man muss also kreativ werden. Meinen Mitarbeiter:innen gefällt es dadurch auch besser.
Zusammenfassung
Das Script ersetzt keine gute Aktionsketten-Struktur. Aber wenn die Aktionsketten einmal sauber aufgebaut sind, bekommt man damit ein extrem schnelles globales Menü für den Alltag.
Für uns war der größte Vorteil:
- nur ein einziger Toolbar-Button
- beliebig viele Funktionen dahinter
- überall per
⌘2 erreichbar - weniger Klicks
- weniger Sucherei
- konsistentere Dokumentation
- Prozesse zentral in den Aktionsketten wartbar
Das Menü selbst ändert sich kaum. Die eigentliche Weiterentwicklung passiert in den Aktionsketten.
Habt ihr noch andere Ideen für Umsetzungen?
Ich wollte das jedenfalls mal mit euch teilen. Ist doch recht viel arbeit reingeflossen :)
Der Apple Script Code:
Anbei nun noch der Code als ganzes, jedoch zur besseren lesbarkeit sind nicht alle Elemente aus dem Screenshot enthalten.
use AppleScript version "2.5"
use framework "Foundation"
use framework "AppKit"
use scripting additions
property chosenURL : missing value
property cachedMenu : missing value
on run
set chosenURL to missing value
if cachedMenu is missing value then
set cachedMenu to buildMenu()
end if
set ca to current application
set mousePoint to (ca's NSEvent's mouseLocation())
(cachedMenu's popUpMenuPositioningItem:(missing value) atLocation:mousePoint inView:(missing value))
if chosenURL is not missing value then
set theURL to (ca's NSURL's URLWithString:chosenURL)
(ca's NSWorkspace's sharedWorkspace()'s openURL:theURL)
end if
end run
on buildMenu()
set ca to current application
set m to (ca's NSMenu's alloc()'s initWithTitle:"")
m's setAutoenablesItems:false
-- einfache Einträge
my addMenuItem(m, "❤️ EKG", "tomedo://aktionskette?ASC_EKG")
my addMenuItem(m, " Harnstreifen", "tomedo://aktionskette?ASC_Harn")
my addMenuItem(m, " Blutabnahme", "tomedo://aktionskette?ASC_Labor")
-- Infusion
set infusionItem to (ca's NSMenuItem's alloc()'s initWithTitle:" Infusion" action:(missing value) keyEquivalent:"")
set infusionMenu to (ca's NSMenu's alloc()'s initWithTitle:"Infusion")
infusionMenu's setAutoenablesItems:false
my addMenuItem(infusionMenu, "Eisen", "tomedo://aktionskette?ASC_Infusion_Eisen")
my addMenuItem(infusionMenu, "Neodolpasse", "tomedo://aktionskette?ASC_Infusion_Neodolpasse")
my addMenuItem(infusionMenu, "Andere", "tomedo://aktionskette?ASC_Infusion")
infusionItem's setSubmenu:infusionMenu
m's addItem:infusionItem
-- Trennstrich
m's addItem:(ca's NSMenuItem's separatorItem())
-- Injektion
set injItem to (ca's NSMenuItem's alloc()'s initWithTitle:" Injektion" action:(missing value) keyEquivalent:"")
set injMenu to (ca's NSMenu's alloc()'s initWithTitle:"Injektion")
injMenu's setAutoenablesItems:false
my addMenuItem(injMenu, "i.m.\t muskulär", "tomedo://aktionskette?ASC_Inj_IM")
my addMenuItem(injMenu, "s.c.\t subcutan", "tomedo://aktionskette?ASC_Inj_SC")
my addMenuItem(injMenu, "i.v.\t venös", "tomedo://aktionskette?ASC_Inj_IV")
injItem's setSubmenu:injMenu
m's addItem:injItem
return m
end buildMenu
on addMenuItem(theMenu, theTitle, theURL)
set ca to current application
set mi to (ca's NSMenuItem's alloc()'s initWithTitle:theTitle action:"menuPick:" keyEquivalent:"")
mi's setTarget:me
mi's setEnabled:true
mi's setRepresentedObject:theURL
theMenu's addItem:mi
end addMenuItem
on menuPick:sender
set chosenURL to (sender's representedObject()) as text
end menuPick: