diff --git a/README.md b/README.md index f6fe5e9..d886d91 100755 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ rmptui is a minimal tui mpd client made with rust. | `p` | Toggle pause | | `+`/`=` | Increase volume | | `-` | Decrease volume | +| `m` | Toggle Mute | | `D` | Get dmenu prompt | | `j`/`Down` | Scroll down | | `k`/`Up` | Scroll up | diff --git a/src/app.rs b/src/app.rs index baea0a2..9b2d2fd 100755 --- a/src/app.rs +++ b/src/app.rs @@ -429,7 +429,7 @@ impl App { } } - pub fn handle_mouse_left_click(&mut self, x: u16, y: u16) -> AppResult<()> { + pub fn handle_mouse_left_click(&mut self, _x: u16, _y: u16) -> AppResult<()> { Ok(()) } } diff --git a/src/connection.rs b/src/connection.rs index c31c346..d3ff3a5 100755 --- a/src/connection.rs +++ b/src/connection.rs @@ -5,6 +5,12 @@ use mpd::{Client, State}; use simple_dmenu::dmenu; use std::time::Duration; +#[derive(Debug)] +pub enum VolumeStatus { + Muted(i8), + Unmuted, +} + #[derive(Debug)] /// struct storing the mpd Client related stuff pub struct Connection { @@ -16,6 +22,7 @@ pub struct Connection { pub current_song: Song, pub stats: mpd::Stats, pub status: mpd::Status, + pub volume_status: VolumeStatus, } impl Connection { @@ -41,6 +48,13 @@ impl Connection { .currentsong() .unwrap_or_else(|_| Some(empty_song.clone())) .unwrap_or(empty_song); + + let volume_status = if status.volume == 0 { + VolumeStatus::Muted(status.volume) + } else { + VolumeStatus::Unmuted + }; + Ok(Self { conn, songs_filenames, @@ -50,6 +64,7 @@ impl Connection { current_song, stats, status, + volume_status, }) } @@ -207,6 +222,7 @@ impl Connection { pub fn inc_volume(&mut self, v: i8) { let cur = self.status.volume; if cur + v <= 100 { + self.volume_status = VolumeStatus::Unmuted; self.conn.volume(cur + v).unwrap(); } } @@ -215,6 +231,7 @@ impl Connection { pub fn dec_volume(&mut self, v: i8) { let cur = self.status.volume; if cur - v >= 0 { + self.volume_status = VolumeStatus::Unmuted; self.conn.volume(cur - v).unwrap(); } } diff --git a/src/event/handler.rs b/src/event/handler.rs index fcd1416..02bdb14 100755 --- a/src/event/handler.rs +++ b/src/event/handler.rs @@ -1,5 +1,6 @@ use crate::{ app::{App, AppResult, SelectedTab}, + connection::VolumeStatus, ui::InputMode, }; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers, MouseEvent, MouseEventKind}; @@ -138,6 +139,22 @@ pub fn handle_key_events(key_event: KeyEvent, app: &mut App) -> AppResult<()> { app.conn.update_status(); } + // Toggle Mute + KeyCode::Char('m') => { + match app.conn.volume_status { + VolumeStatus::Muted(v) => { + app.conn.conn.volume(v)?; + app.conn.volume_status = VolumeStatus::Unmuted; + } + VolumeStatus::Unmuted => { + let current_volume = app.conn.status.volume; + app.conn.conn.volume(0)?; + app.conn.volume_status = VolumeStatus::Muted(current_volume); + } + } + app.conn.update_status(); + } + // Update MPD database KeyCode::Char('U') => { app.conn.conn.rescan()?;