tui: mouse support — click, scroll, drag #112

Closed
opened 2026-04-12 18:10:23 +00:00 by claude-desktop · 0 comments
Collaborator

User story

As a user, I want to click on UI elements, scroll lists with the mouse wheel, and drag to pan images, so that the TUI feels natural alongside keyboard navigation.

Problem

crossterm::EnableMouseCapture is already enabled in terminal::init(), but no Event::Mouse handling exists anywhere in the app. Mouse events are received by the event stream but silently dropped.

Acceptance criteria

Click to select

  • Click on a sidebar item navigates to that screen
  • Click on a gallery grid cell selects it
  • Click on a list item (gallery list, entity list, preset list, model browser results) selects it
  • Click on a form field (settings, generate params) focuses it
  • Click on an overlay button triggers it (confirm yes/no, share submit)
  • Click outside an overlay closes it (where appropriate — not mid-submit)

Scroll

  • Mouse wheel scrolls lists (gallery, entities, presets, model browser, log overlay)
  • Mouse wheel in gallery detail view zooms in/out
  • Mouse wheel in generate screen scrolls numeric fields (steps, cfg, seed)
  • Scroll respects focus — only the hovered widget scrolls

Drag

  • Drag in gallery detail view pans the image
  • Drag in inpaint canvas paints the mask
  • Drag on numeric fields adjusts value (optional, lower priority)

Event plumbing

  • Add Event::Mouse(MouseEvent) variant to event.rs
  • EventStream forwards crossterm mouse events
  • Screen::handle() receives mouse events (screens ignore what they don't handle)
  • Overlay::handle() receives mouse events
  • Hit-testing helper: fn hit_test(rect: Rect, mouse: MouseEvent) -> bool

Configuration

  • tui.toml supports mouse_enabled = true (default) / false
  • When disabled, DisableMouseCapture is used instead and no mouse events are processed

Out of scope

  • Right-click context menus (future enhancement)
  • Middle-click paste
  • Mouse hover tooltips
  • Touch/gesture input

References

  • crates/loom-tui/src/terminal.rsEnableMouseCapture already present
  • crates/loom-tui/src/event.rsEvent enum, EventStream
  • crates/loom-tui/src/app.rsprocess_event() dispatch
  • crossterm mouse events: crossterm::event::MouseEvent, MouseEventKind
## User story As a user, I want to click on UI elements, scroll lists with the mouse wheel, and drag to pan images, so that the TUI feels natural alongside keyboard navigation. ## Problem `crossterm::EnableMouseCapture` is already enabled in `terminal::init()`, but no `Event::Mouse` handling exists anywhere in the app. Mouse events are received by the event stream but silently dropped. ## Acceptance criteria ### Click to select - [ ] Click on a sidebar item navigates to that screen - [ ] Click on a gallery grid cell selects it - [ ] Click on a list item (gallery list, entity list, preset list, model browser results) selects it - [ ] Click on a form field (settings, generate params) focuses it - [ ] Click on an overlay button triggers it (confirm yes/no, share submit) - [ ] Click outside an overlay closes it (where appropriate — not mid-submit) ### Scroll - [ ] Mouse wheel scrolls lists (gallery, entities, presets, model browser, log overlay) - [ ] Mouse wheel in gallery detail view zooms in/out - [ ] Mouse wheel in generate screen scrolls numeric fields (steps, cfg, seed) - [ ] Scroll respects focus — only the hovered widget scrolls ### Drag - [ ] Drag in gallery detail view pans the image - [ ] Drag in inpaint canvas paints the mask - [ ] Drag on numeric fields adjusts value (optional, lower priority) ### Event plumbing - [ ] Add `Event::Mouse(MouseEvent)` variant to `event.rs` - [ ] `EventStream` forwards crossterm mouse events - [ ] `Screen::handle()` receives mouse events (screens ignore what they don't handle) - [ ] `Overlay::handle()` receives mouse events - [ ] Hit-testing helper: `fn hit_test(rect: Rect, mouse: MouseEvent) -> bool` ### Configuration - [ ] `tui.toml` supports `mouse_enabled = true` (default) / `false` - [ ] When disabled, `DisableMouseCapture` is used instead and no mouse events are processed ## Out of scope - Right-click context menus (future enhancement) - Middle-click paste - Mouse hover tooltips - Touch/gesture input ## References - `crates/loom-tui/src/terminal.rs` — `EnableMouseCapture` already present - `crates/loom-tui/src/event.rs` — `Event` enum, `EventStream` - `crates/loom-tui/src/app.rs` — `process_event()` dispatch - crossterm mouse events: `crossterm::event::MouseEvent`, `MouseEventKind`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/loom#112
No description provided.