ommp.git

ommp

~ Oh My Music Player — a standalone terminal music player built with Rust and ratatui
git clone https://github.com/debuman/ommp.git

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 }