Skip to main content

stakpak_tui/
lib.rs

1mod app;
2mod constants;
3mod event;
4mod event_loop;
5mod terminal;
6mod view;
7
8pub mod utils;
9
10pub use app::{AppState, InputEvent, LoadingOperation, OutputEvent, SessionInfo};
11pub use event_loop::{RulebookConfig, run_tui};
12pub use ratatui::style::Color;
13
14mod services;
15
16use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
17use crossterm::execute;
18pub use event::map_crossterm_event_to_input_event;
19use ratatui::style::Style;
20use std::io;
21pub use terminal::TerminalGuard;
22pub use view::view;
23
24use crate::services::message::{Message, invalidate_message_lines_cache};
25
26pub fn toggle_mouse_capture(state: &mut AppState) -> io::Result<()> {
27    state.mouse_capture_enabled = !state.mouse_capture_enabled;
28
29    if state.mouse_capture_enabled {
30        execute!(std::io::stdout(), EnableMouseCapture)?;
31    } else {
32        execute!(std::io::stdout(), DisableMouseCapture)?;
33    }
34
35    let status = if state.mouse_capture_enabled {
36        "enabled"
37    } else {
38        "disabled . Ctrl+L to enable"
39    };
40
41    let color = if state.mouse_capture_enabled {
42        Color::LightGreen
43    } else {
44        Color::LightRed
45    };
46    state.messages.push(Message::info("SPACING_MARKER", None));
47    state.messages.push(Message::info(
48        format!("Mouse capture {}", status),
49        Some(Style::default().fg(color)),
50    ));
51    state.messages.push(Message::info("SPACING_MARKER", None));
52
53    // Invalidate cache so the new messages are rendered
54    invalidate_message_lines_cache(state);
55
56    Ok(())
57}