diff --git a/src/commands.rs b/src/commands.rs index 80e227e..afb88bd 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -7,6 +7,7 @@ use crate::command::{ }; use crate::config::Config; use crate::events::EventManager; +use crate::ext_traits::CursiveExt; use crate::library::Library; use crate::queue::{Queue, RepeatSetting}; use crate::spotify::{Spotify, VOLUME_PERCENT}; @@ -310,10 +311,7 @@ impl CommandManager { } else if let Some(mut play_track) = s.find_name::("playtrackmenu") { play_track.on_command(s, cmd)? } else { - let mut main = s - .find_name::("main") - .expect("could not find layout"); - main.on_command(s, cmd)? + s.on_layout(|siv, mut l| l.on_command(siv, cmd))? }; if let CommandResult::Consumed(output) = local { diff --git a/src/ext_traits.rs b/src/ext_traits.rs new file mode 100644 index 0000000..74fe6c7 --- /dev/null +++ b/src/ext_traits.rs @@ -0,0 +1,21 @@ +use cursive::views::ViewRef; + +use crate::ui::layout::Layout; + +pub trait CursiveExt { + fn on_layout(&mut self, cb: F) -> R + where + F: FnOnce(&mut cursive::Cursive, ViewRef) -> R; +} + +impl CursiveExt for cursive::Cursive { + fn on_layout(&mut self, cb: F) -> R + where + F: FnOnce(&mut cursive::Cursive, ViewRef) -> R, + { + let layout = self + .find_name::("main") + .expect("Could not find Layout"); + cb(self, layout) + } +} diff --git a/src/main.rs b/src/main.rs index f0d9fba..789dd03 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,6 +23,7 @@ mod command; mod commands; mod config; mod events; +mod ext_traits; mod library; mod model; mod queue; @@ -44,6 +45,7 @@ use crate::command::{Command, JumpMode}; use crate::commands::CommandManager; use crate::config::Config; use crate::events::{Event, EventManager}; +use crate::ext_traits::CursiveExt; use crate::library::Library; use crate::spotify::PlayerEvent; use crate::ui::contextmenu::ContextMenu; @@ -282,10 +284,7 @@ async fn main() -> Result<(), String> { { let ev = event_manager.clone(); layout.cmdline.set_on_submit(move |s, cmd| { - { - let mut main = s.find_name::("main").unwrap(); - main.clear_cmdline(); - } + s.on_layout(|_, mut layout| layout.clear_cmdline()); let cmd_without_prefix = &cmd[1..]; if cmd.strip_prefix('/').is_some() { let command = Command::Jump(JumpMode::Query(cmd_without_prefix.to_string())); @@ -302,8 +301,7 @@ async fn main() -> Result<(), String> { } } Err(err) => { - let mut main = s.find_name::("main").unwrap(); - main.set_result(Err(err.to_string())); + s.on_layout(|_, mut layout| layout.set_result(Err(err.to_string()))); } } }