| 1 | #![allow(unused_imports)] |
| 2 | use clap::Parser; |
| 3 | use rmptui::app; |
| 4 | use rmptui::app::App; |
| 5 | use rmptui::app::AppResult; |
| 6 | use rmptui::cli::Args; |
| 7 | use rmptui::cli::Command; |
| 8 | use rmptui::connection::Connection; |
| 9 | use rmptui::event::event::Event; |
| 10 | use rmptui::event::event::EventHandler; |
| 11 | use rmptui::event::handler; |
| 12 | use rmptui::tui; |
| 13 | use std::env; |
| 14 | use std::io; |
| 15 | |
| 16 | use crossterm::event::{self, KeyCode, KeyEvent, KeyEventKind}; |
| 17 | use ratatui::{ |
| 18 | prelude::*, |
| 19 | symbols::border, |
| 20 | widgets::{block::*, *}, |
| 21 | }; |
| 22 | |
| 23 | pub type Result<T> = core::result::Result<T, Error>; |
| 24 | pub type Error = Box<dyn std::error::Error>; |
| 25 | |
| 26 | fn main() -> AppResult<()> { |
| 27 | let args = Args::parse(); |
| 28 | let env_host = env::var("MPD_HOST").unwrap_or_else(|_| "127.0.0.1".to_string()); |
| 29 | let env_port = env::var("MPD_PORT").unwrap_or_else(|_| "6600".to_string()); |
| 30 | let mut app = App::builder(format!("{}:{}", env_host, env_port).as_str())?; |
| 31 | |
| 32 | if !args.tui { |
| 33 | handle_tui(&mut app)?; |
| 34 | } else { |
| 35 | match args.command { |
| 36 | Some(Command::Dmenu) => app.conn.play_dmenu()?, |
| 37 | Some(Command::Fzf) => app.conn.play_fzf().unwrap(), |
| 38 | Some(Command::Status) => app.conn.status(), |
| 39 | Some(Command::Pause) => app.conn.pause(), |
| 40 | Some(Command::Toggle) => app.conn.toggle_pause(), |
| 41 | _ => {} |
| 42 | } |
| 43 | } |
| 44 | Ok(()) |
| 45 | } |
| 46 | |
| 47 | pub fn handle_tui(app: &mut App) -> AppResult<()> { |
| 48 | let backend = CrosstermBackend::new(io::stderr()); |
| 49 | let terminal = Terminal::new(backend)?; |
| 50 | let events = EventHandler::new(1000); |
| 51 | |
| 52 | let mut tui = tui::Tui::new(terminal, events); |
| 53 | tui.init()?; |
| 54 | |
| 55 | // update the directory |
| 56 | app.browser.update_directory(&mut app.conn).unwrap(); |
| 57 | |
| 58 | while app.running { |
| 59 | tui.draw(app)?; |
| 60 | match tui.events.next()? { |
| 61 | Event::Tick => app.tick(), |
| 62 | Event::Key(key_event) => handler::handle_key_events(key_event, app)?, |
| 63 | Event::Mouse(_) => {} |
| 64 | Event::Resize(_, _) => {} |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | Ok(()) |
| 69 | } |