use std::time::Instant;
use crossterm::event::{KeyEvent, MouseEventKind};
use ratatui::{layout::Rect, DefaultTerminal};
use super::{
overlay_panel::{OverlayPanelFrame, PanelScrollTarget},
App, ComposerMode, PanelOverlay, HISTORY_MOUSE_SCROLL_LINES,
};
impl App {
fn panel_overlay(&self) -> Option<&PanelOverlay> {
match self.input_ui.composer() {
ComposerMode::Panel(panel) => Some(panel),
_ => None,
}
}
pub(super) fn handle_panel_overlay_key(
&mut self,
key: KeyEvent,
terminal: &DefaultTerminal,
) -> bool {
match self.panel_overlay() {
None => false,
Some(PanelOverlay::Limits(_)) => self.handle_limits_overlay_key(key, terminal),
Some(PanelOverlay::Doctor(_)) => self.handle_doctor_overlay_key(key, terminal),
Some(PanelOverlay::Computer(_)) => self.handle_computer_overlay_key(key, terminal),
Some(PanelOverlay::Hooks(_)) => self.handle_hooks_overlay_key(key, terminal),
Some(PanelOverlay::TextView(_)) => self.handle_text_view_overlay_key(key, terminal),
Some(PanelOverlay::Info(_)) => self.handle_info_overlay_key(key, terminal),
}
}
pub(super) fn clamp_panel_overlay_scroll(&mut self, terminal: &DefaultTerminal) {
match self.panel_overlay() {
None => {}
Some(PanelOverlay::Limits(_)) => self.clamp_limits_overlay_scroll(terminal),
Some(PanelOverlay::Doctor(_)) => self.clamp_doctor_overlay_scroll(terminal),
Some(PanelOverlay::Computer(_)) => self.clamp_computer_overlay_scroll(terminal),
Some(PanelOverlay::Hooks(_)) => self.clamp_hooks_overlay_scroll(terminal),
Some(PanelOverlay::TextView(_)) => self.clamp_text_view_overlay_scroll(terminal),
Some(PanelOverlay::Info(_)) => self.clamp_info_overlay_scroll(terminal),
}
}
pub(super) fn panel_overlay_frame(
&self,
area: Rect,
now: Instant,
) -> Option<OverlayPanelFrame> {
match self.panel_overlay()? {
PanelOverlay::Limits(_) => self.limits_overlay_frame(area, now),
PanelOverlay::Doctor(_) => self.doctor_overlay_frame(area, now),
PanelOverlay::Computer(_) => self.computer_overlay_frame(area),
PanelOverlay::Hooks(_) => self.hooks_overlay_frame(area),
PanelOverlay::TextView(_) => self.text_view_overlay_frame(area),
PanelOverlay::Info(_) => self.info_overlay_frame(area),
}
}
pub(super) fn handle_panel_overlay_mouse(
&mut self,
kind: MouseEventKind,
screen: Rect,
column: u16,
row: u16,
now: Instant,
) -> bool {
match self.panel_overlay() {
None => return false,
Some(PanelOverlay::Info(_)) => {
self.handle_info_overlay_mouse(kind, screen, column, row, now);
return true;
}
Some(_) => {}
}
self.clear_selections();
self.clear_hovered_copy_buttons();
self.clear_rail_pointer_state();
self.history.set_scrollbar_drag(None);
let lines = HISTORY_MOUSE_SCROLL_LINES as isize;
let delta = match kind {
MouseEventKind::ScrollUp => -lines,
MouseEventKind::ScrollDown => lines,
_ => return true,
};
self.scroll_panel_overlay(screen, PanelScrollTarget::Delta(delta));
true
}
fn scroll_panel_overlay(&mut self, area: Rect, target: PanelScrollTarget) {
match self.panel_overlay() {
None => {}
Some(PanelOverlay::Limits(_)) => {
self.scroll_limits_overlay(area, target);
}
Some(PanelOverlay::Doctor(_)) => {
self.scroll_doctor_overlay(area, target);
}
Some(PanelOverlay::Computer(_)) => {
self.scroll_computer_overlay(area, target);
}
Some(PanelOverlay::Hooks(_)) => {
self.scroll_hooks_overlay(area, target);
}
Some(PanelOverlay::TextView(_)) => {
self.scroll_text_view_overlay(area, target);
}
Some(PanelOverlay::Info(_)) => {
self.scroll_info_overlay(area, target);
}
}
}
}