Add CursiveExt trait

For easier usage of shared logic involving the `Cursive` instance.
This commit is contained in:
Henrik Friedrichsen
2022-08-19 00:18:34 +02:00
parent f5bf1d527f
commit 4315cdc077
3 changed files with 27 additions and 10 deletions

View File

@@ -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>("playtrackmenu") {
play_track.on_command(s, cmd)?
} else {
let mut main = s
.find_name::<Layout>("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 {

21
src/ext_traits.rs Normal file
View File

@@ -0,0 +1,21 @@
use cursive::views::ViewRef;
use crate::ui::layout::Layout;
pub trait CursiveExt {
fn on_layout<F, R>(&mut self, cb: F) -> R
where
F: FnOnce(&mut cursive::Cursive, ViewRef<Layout>) -> R;
}
impl CursiveExt for cursive::Cursive {
fn on_layout<F, R>(&mut self, cb: F) -> R
where
F: FnOnce(&mut cursive::Cursive, ViewRef<Layout>) -> R,
{
let layout = self
.find_name::<Layout>("main")
.expect("Could not find Layout");
cb(self, layout)
}
}

View File

@@ -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::<ui::layout::Layout>("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::<ui::layout::Layout>("main").unwrap();
main.set_result(Err(err.to_string()));
s.on_layout(|_, mut layout| layout.set_result(Err(err.to_string())));
}
}
}