TermUI.Widgets.Menu (TermUI v0.2.0)

View Source

Menu widget for displaying hierarchical actions.

Menu displays a list of items that can be actions, submenus, separators, or checkboxes. Supports keyboard navigation and shortcut display.

Usage

Menu.new(
  items: [
    Menu.action(:new, "New File", shortcut: "Ctrl+N"),
    Menu.action(:open, "Open...", shortcut: "Ctrl+O"),
    Menu.separator(),
    Menu.submenu(:recent, "Recent Files", [
      Menu.action(:file1, "document.txt"),
      Menu.action(:file2, "notes.md")
    ]),
    Menu.separator(),
    Menu.checkbox(:autosave, "Auto Save", checked: true),
    Menu.action(:exit, "Exit", shortcut: "Ctrl+Q")
  ],
  on_select: fn id -> handle_menu_action(id) end
)

Item Types

  • :action - Selectable menu item
  • :submenu - Item with nested menu items
  • :separator - Visual divider
  • :checkbox - Toggleable item with check state

Keyboard Navigation

  • Up/Down: Move between items
  • Enter/Space: Select item or expand submenu
  • Left: Collapse submenu
  • Right: Expand submenu
  • Escape: Close menu

Summary

Functions

Creates an action menu item.

Creates a checkbox item.

Gets checkbox state.

Collapses a submenu by ID.

Expands a submenu by ID.

Checks if a submenu is expanded.

Gets the currently focused item ID.

Creates new Menu widget props.

Creates a separator.

Creates a submenu item.

Types

item_type()

@type item_type() :: :action | :submenu | :separator | :checkbox

Functions

action(id, label, opts \\ [])

@spec action(term(), String.t(), keyword()) :: map()

Creates an action menu item.

checkbox(id, label, opts \\ [])

@spec checkbox(term(), String.t(), keyword()) :: map()

Creates a checkbox item.

checked?(state, item_id)

@spec checked?(map(), term()) :: boolean()

Gets checkbox state.

collapse(state, submenu_id)

@spec collapse(map(), term()) :: map()

Collapses a submenu by ID.

expand(state, submenu_id)

@spec expand(map(), term()) :: map()

Expands a submenu by ID.

expanded?(state, submenu_id)

@spec expanded?(map(), term()) :: boolean()

Checks if a submenu is expanded.

get_cursor(state)

@spec get_cursor(map()) :: term()

Gets the currently focused item ID.

new(opts)

@spec new(keyword()) :: map()

Creates new Menu widget props.

Options

  • :items - List of menu items (required)
  • :on_select - Callback when item is selected
  • :on_toggle - Callback when checkbox is toggled
  • :width - Menu width (default: auto)
  • :item_style - Style for normal items
  • :selected_style - Style for focused item
  • :disabled_style - Style for disabled items

separator()

@spec separator() :: map()

Creates a separator.