-
Notifications
You must be signed in to change notification settings - Fork 0
MenuBar
Wire names menubar · menu · menuitem
An application's menu bar. Three types build it: a menubar holds menus,
each menu holds menuitems, and choosing an item raises a command event
naming what was asked for.
mb=new menubar children={
new menu caption="&File" wellknown="file" children={
new menuitem caption="&New" shortcut="^N" action=app.file.new
new menuitem caption="&Open…" shortcut="^O" action=app.file.open
new menuitem separator
new menuitem caption="&Quit" shortcut="^Q" action=app.quit
}
}
This is the part that catches people. A menubar is not placed inside a
window's children. It is built as its own top-level object in the same
request, and the display adopts it as the connection's application chrome —
the same way it adopts a window and a statusbar:
w=new window title="My App" width=480 height=288 main children={
new panel layout=vbox children={ … }
}
mb=new menubar children={ … }
A window takes exactly one content trinket, so anything with several parts goes in a Panel — asking for two is an error that says so.
| Property | Type | Default | Meaning |
|---|---|---|---|
after |
string | — | Place this untagged menu after a well-known slot (e.g. after=file) |
caption |
string | — | Menu title (& marks accelerator) |
wellknown |
string | — | System role tag: app/file/edit/format/view/window/help |
| Property | Type | Default | Meaning |
|---|---|---|---|
action |
word | — | Command id dispatched on activation |
caption |
string | — | Item label (& marks accelerator) |
checkable |
flag | false |
Item can be checked |
checked |
flag | false |
Checked state |
enabled |
flag | true |
Item is enabled |
inplace |
flag | false |
Activation acts in place: the menu stays open. |
separator |
flag | false |
Render as a separator line |
shortcut |
string | — | Keyboard shortcut (e.g. "^N") |
shortcuttext |
string | — | Literal text for the shortcut column, for keys the host handles itself (appended after any shortcut) |
wellknown |
string | — | System item role: cut/copy/paste/selectall - this item BECOMES the standard one |
menubar itself takes no properties; it is a holder.
menu and menuitem are the exception to the usual rule about
common properties: menubar and menuitem are virtual
types and do not take them. That is why menuitem carries its own enabled.
command — The item was chosen. Carries the command it names rather than the item's identity, because a command is what an application binds to and the same one may be reachable from several menus.
| Field | Type | Meaning |
|---|---|---|
action |
word | The command ID the item names. |
Choosing an item raises command carrying the item's action, exactly as a
Button with action= does. That is the point: a client binds
handlers to command IDs and does not care whether a button, a menu item or a
keyboard shortcut reached it.
conn.OnCommand("app.file.new", func() { … })Every item raises command, whether or not you gave it an action=. An
item without one is assigned a generated ID — cmd.auto.5 and the like — and
that is what arrives:
new menuitem caption="Cu&t" wellknown="cut"
-> command with action = "cmd.auto.5"
So an unhandled item is not silent; it reports something your handler table
will not recognise. Give an item an action= if you mean to act on it.
Unlike every other trinket, menu and menuitem parse & in their caption.
The marked letter becomes the accelerator and the & is removed from what is
drawn:
| Caption | Shown |
|---|---|
"&File" |
File |
"Cu&t" |
Cut |
"Save && Close" |
Save & Close |
&& is the escape for a literal ampersand. Assignment is greedy across
siblings, so an item whose marked letter is already taken falls back to
another letter from its label — which is why you can mark the obvious letter
everywhere and let the bar sort itself out.
This markup is menu-only. A Button captioned "&Save" paints
the ampersand.
Three different things can fill an item's shortcut column.
| Property | For |
|---|---|
shortcut |
A key this item binds, written in the key vocabulary — "^N", "s-Q". |
shortcuttext |
Literal text for a key the host handles, which the toolkit does not bind but which still deserves advertising. Appended after any shortcut. |
| (neither) | Nothing shown. |
shortcut="^N" both binds the key and prints it. shortcuttext="F10" prints
only — use it when something else already owns the key.
new menuitem separator # a rule
new menuitem caption="&Word Wrap" checkable checked action=app.view.wrap
new menuitem caption="Not yet" !enabled
new menuitem caption="Stays open" inplace action=app.tweak
separator draws a rule and holds no label.
checkable / checked give the item a check mark. The item still raises
command on activation; the check state is yours to keep in step by setting
checked back.
inplace keeps the menu open after activation instead of dismissing it —
for a run of toggles a user flips several times, like a column chooser.
Escape or a click away still closes it.
!enabled greys the item and refuses activation.
wellknown tags a menu or an item with a standard role, and the desktop
merges it with the host's own chrome rather than showing two of everything.
| On | Values |
|---|---|
menu |
app file edit format view window help
|
menuitem |
cut copy paste selectall
|
A tagged item becomes the standard one — your "Cu&t" with
wellknown="cut" is the Cut command, in the place the platform expects it,
rather than a second Cut beside it.
after= places an untagged menu relative to a tagged slot — after=file
puts your menu just past the File menu — so a custom menu can be positioned
without claiming a role it does not have.
Button — the other way to raise command ·
StatusBar · Desktop ·
Templates and Aliases — for repeated menu shapes
KittyTK — image/tty Trinket Kit · MIT licensed · alpha, 0.1.x
Repository · Issues · Support on ko-fi
Sibling projects: PurfecTerm (terminal emulator) · mew (text editor) · PawScript (language)
Getting Started
Installation Building from Source Running a Display Host Your First Application Examples
Protocol
Protocol Overview Object Model Properties and Values Events Templates and Aliases Common Properties Introspection Transports and Security
Clients
Go Client Python Client C Client
Application Objects
Application · MenuBar · Window · MessageBox
Output Trinkets
Label · ProgressBar · StatusBar
Input Trinkets
TextInput · Editor · Terminal
Button · CheckBox · RadioButton
ListView · ComboBox · TreeView
Layout Trinkets
TabTrinket · Panel
ScrollArea · MDIPane
Separator · Spacer · Splitter
Other Trinkets
Layout Helpers