src/ui/panes/track_info_pane.rs (2510B)
1 use crossterm::event::{KeyCode, KeyEvent, MouseEvent, MouseEventKind};
2 use ratatui::layout::Rect;
3 use ratatui::style::Style;
4 use ratatui::widgets::{Block, Borders};
5 use ratatui::Frame;
6
7 use crate::app::{App, AppAction};
8 use crate::ui::pane::Pane;
9 use crate::ui::theme::Theme;
10 use crate::ui::widgets::info_pane;
11
12 /// The bottom-right pane. It renders track metadata, not lyrics — the name is
13 /// left over from a feature that was removed.
14 pub struct TrackInfoPane {
15 pub scroll_offset: u16,
16 }
17
18 impl TrackInfoPane {
19 pub fn new() -> Self {
20 Self { scroll_offset: 0 }
21 }
22 }
23
24 impl Pane for TrackInfoPane {
25 fn render(&mut self, frame: &mut Frame, area: Rect, focused: bool, app: &App, theme: &Theme) {
26 let border_color = if focused {
27 theme.border_focused
28 } else {
29 theme.border_unfocused
30 };
31
32 let block = Block::default()
33 .borders(Borders::ALL)
34 .border_style(Style::default().fg(border_color));
35
36 let inner = block.inner(area);
37 frame.render_widget(block, area);
38
39 info_pane::render_track_info(frame, inner, app, theme, self.scroll_offset);
40 }
41
42 fn handle_key(&mut self, key: KeyEvent, _app: &App) -> Option<AppAction> {
43 match key.code {
44 KeyCode::Char('j') | KeyCode::Down => {
45 self.scroll_offset = self.scroll_offset.saturating_add(1);
46 None
47 }
48 KeyCode::Char('k') | KeyCode::Up => {
49 self.scroll_offset = self.scroll_offset.saturating_sub(1);
50 None
51 }
52 KeyCode::Home | KeyCode::Char('g') => {
53 self.scroll_offset = 0;
54 None
55 }
56 _ => None,
57 }
58 }
59
60 fn handle_mouse(&mut self, event: MouseEvent, _area: Rect, _app: &App) -> Option<AppAction> {
61 match event.kind {
62 MouseEventKind::ScrollDown => {
63 self.scroll_offset = self.scroll_offset.saturating_add(3);
64 None
65 }
66 MouseEventKind::ScrollUp => {
67 self.scroll_offset = self.scroll_offset.saturating_sub(3);
68 None
69 }
70 _ => None,
71 }
72 }
73
74 fn handle_scroll(&mut self, up: bool, _app: &App) -> Option<AppAction> {
75 if up {
76 self.scroll_offset = self.scroll_offset.saturating_sub(3);
77 } else {
78 self.scroll_offset = self.scroll_offset.saturating_add(3);
79 }
80 None
81 }
82 }