Extract minibuffer
This commit is contained in:
parent
52b730f5a9
commit
3596dac800
76
src/tui/ui/minibuffer.rs
Normal file
76
src/tui/ui/minibuffer.rs
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
use ratatui::{layout::Alignment, widgets::Paragraph};
|
||||||
|
|
||||||
|
use crate::tui::{
|
||||||
|
app::{AppPublicState, AppState},
|
||||||
|
ui::UiDisplay,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct Minibuffer<'a> {
|
||||||
|
pub paragraphs: Vec<Paragraph<'a>>,
|
||||||
|
pub columns: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Minibuffer<'_> {
|
||||||
|
pub fn paragraphs(state: &AppPublicState) -> Self {
|
||||||
|
let columns = 3;
|
||||||
|
let mut mb = match state {
|
||||||
|
AppState::Browse(_) => Minibuffer {
|
||||||
|
paragraphs: vec![
|
||||||
|
Paragraph::new("m: show info overlay"),
|
||||||
|
Paragraph::new("g: show reload menu"),
|
||||||
|
Paragraph::new("ctrl+s: search artist"),
|
||||||
|
Paragraph::new("f: fetch musicbrainz"),
|
||||||
|
],
|
||||||
|
columns,
|
||||||
|
},
|
||||||
|
AppState::Info(_) => Minibuffer {
|
||||||
|
paragraphs: vec![Paragraph::new("m: hide info overlay")],
|
||||||
|
columns,
|
||||||
|
},
|
||||||
|
AppState::Reload(_) => Minibuffer {
|
||||||
|
paragraphs: vec![
|
||||||
|
Paragraph::new("g: hide reload menu"),
|
||||||
|
Paragraph::new("d: reload database"),
|
||||||
|
Paragraph::new("l: reload library"),
|
||||||
|
],
|
||||||
|
columns,
|
||||||
|
},
|
||||||
|
AppState::Search(ref s) => Minibuffer {
|
||||||
|
paragraphs: vec![
|
||||||
|
Paragraph::new(format!("I-search: {s}")),
|
||||||
|
Paragraph::new("ctrl+s: search next".to_string()).alignment(Alignment::Center),
|
||||||
|
Paragraph::new("ctrl+g: cancel search".to_string())
|
||||||
|
.alignment(Alignment::Center),
|
||||||
|
],
|
||||||
|
columns,
|
||||||
|
},
|
||||||
|
AppState::Matches(public) => Minibuffer {
|
||||||
|
paragraphs: vec![
|
||||||
|
Paragraph::new(UiDisplay::display_matching_info(public.matching)),
|
||||||
|
Paragraph::new("q: abort"),
|
||||||
|
],
|
||||||
|
columns: 2,
|
||||||
|
},
|
||||||
|
AppState::Error(_) => Minibuffer {
|
||||||
|
paragraphs: vec![Paragraph::new(
|
||||||
|
"Press any key to dismiss the error message...",
|
||||||
|
)],
|
||||||
|
columns: 0,
|
||||||
|
},
|
||||||
|
AppState::Critical(_) => Minibuffer {
|
||||||
|
paragraphs: vec![Paragraph::new("Press ctrl+c to terminate the program...")],
|
||||||
|
columns: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
if !state.is_search() {
|
||||||
|
mb.paragraphs = mb
|
||||||
|
.paragraphs
|
||||||
|
.into_iter()
|
||||||
|
.map(|p| p.alignment(Alignment::Center))
|
||||||
|
.collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
mb
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,8 @@
|
|||||||
|
mod minibuffer;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use minibuffer::Minibuffer;
|
||||||
use musichoard::collection::{
|
use musichoard::collection::{
|
||||||
album::{Album, AlbumDate, AlbumPrimaryType, AlbumSecondaryType, AlbumSeq, AlbumStatus},
|
album::{Album, AlbumDate, AlbumPrimaryType, AlbumSecondaryType, AlbumSeq, AlbumStatus},
|
||||||
artist::Artist,
|
artist::Artist,
|
||||||
@ -490,87 +493,6 @@ impl<'a, 'b> TrackState<'a, 'b> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Minibuffer<'a> {
|
|
||||||
paragraphs: Vec<Paragraph<'a>>,
|
|
||||||
columns: u16,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Minibuffer<'_> {
|
|
||||||
fn paragraphs(state: &AppPublicState) -> Self {
|
|
||||||
let columns = 3;
|
|
||||||
let mut mb = match state {
|
|
||||||
AppState::Browse(_) => Minibuffer {
|
|
||||||
paragraphs: vec![
|
|
||||||
Paragraph::new("m: show info overlay"),
|
|
||||||
Paragraph::new("g: show reload menu"),
|
|
||||||
Paragraph::new("ctrl+s: search artist"),
|
|
||||||
Paragraph::new("f: fetch musicbrainz"),
|
|
||||||
],
|
|
||||||
columns,
|
|
||||||
},
|
|
||||||
AppState::Info(_) => Minibuffer {
|
|
||||||
paragraphs: vec![Paragraph::new("m: hide info overlay")],
|
|
||||||
columns,
|
|
||||||
},
|
|
||||||
AppState::Reload(_) => Minibuffer {
|
|
||||||
paragraphs: vec![
|
|
||||||
Paragraph::new("g: hide reload menu"),
|
|
||||||
Paragraph::new("d: reload database"),
|
|
||||||
Paragraph::new("l: reload library"),
|
|
||||||
],
|
|
||||||
columns,
|
|
||||||
},
|
|
||||||
AppState::Search(ref s) => Minibuffer {
|
|
||||||
paragraphs: vec![
|
|
||||||
Paragraph::new(format!("I-search: {s}")),
|
|
||||||
Paragraph::new("ctrl+s: search next".to_string()).alignment(Alignment::Center),
|
|
||||||
Paragraph::new("ctrl+g: cancel search".to_string())
|
|
||||||
.alignment(Alignment::Center),
|
|
||||||
],
|
|
||||||
columns,
|
|
||||||
},
|
|
||||||
AppState::Matches(public) => Minibuffer {
|
|
||||||
paragraphs: vec![
|
|
||||||
Paragraph::new(Minibuffer::display_matching_info(public.matching)),
|
|
||||||
Paragraph::new("q: abort"),
|
|
||||||
],
|
|
||||||
columns: 2,
|
|
||||||
},
|
|
||||||
AppState::Error(_) => Minibuffer {
|
|
||||||
paragraphs: vec![Paragraph::new(
|
|
||||||
"Press any key to dismiss the error message...",
|
|
||||||
)],
|
|
||||||
columns: 0,
|
|
||||||
},
|
|
||||||
AppState::Critical(_) => Minibuffer {
|
|
||||||
paragraphs: vec![Paragraph::new("Press ctrl+c to terminate the program...")],
|
|
||||||
columns: 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
if !state.is_search() {
|
|
||||||
mb.paragraphs = mb
|
|
||||||
.paragraphs
|
|
||||||
.into_iter()
|
|
||||||
.map(|p| p.alignment(Alignment::Center))
|
|
||||||
.collect();
|
|
||||||
}
|
|
||||||
|
|
||||||
mb
|
|
||||||
}
|
|
||||||
|
|
||||||
fn display_matching_info(matching: Option<&Album>) -> String {
|
|
||||||
match matching {
|
|
||||||
Some(matching) => format!(
|
|
||||||
"Matching: {} | {}",
|
|
||||||
AlbumState::display_album_date(&matching.date),
|
|
||||||
&matching.id.title
|
|
||||||
),
|
|
||||||
None => String::from("Matching: nothing"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ReloadMenu;
|
struct ReloadMenu;
|
||||||
|
|
||||||
impl ReloadMenu {
|
impl ReloadMenu {
|
||||||
@ -856,7 +778,7 @@ impl Ui {
|
|||||||
frame: &mut Frame,
|
frame: &mut Frame,
|
||||||
) {
|
) {
|
||||||
let area = OverlayBuilder::default().build(frame.size());
|
let area = OverlayBuilder::default().build(frame.size());
|
||||||
let matching_string = Minibuffer::display_matching_info(matching);
|
let matching_string = UiDisplay::display_matching_info(matching);
|
||||||
let list = matches.map(|m| Ui::build_match_list(m)).unwrap_or_default();
|
let list = matches.map(|m| Ui::build_match_list(m)).unwrap_or_default();
|
||||||
Self::render_overlay_list_widget(&matching_string, list, state, true, area, frame)
|
Self::render_overlay_list_widget(&matching_string, list, state, true, area, frame)
|
||||||
}
|
}
|
||||||
@ -907,6 +829,21 @@ impl IUi for Ui {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct UiDisplay;
|
||||||
|
|
||||||
|
impl UiDisplay {
|
||||||
|
fn display_matching_info(matching: Option<&Album>) -> String {
|
||||||
|
match matching {
|
||||||
|
Some(matching) => format!(
|
||||||
|
"Matching: {} | {}",
|
||||||
|
AlbumState::display_album_date(&matching.date),
|
||||||
|
&matching.id.title
|
||||||
|
),
|
||||||
|
None => String::from("Matching: nothing"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use musichoard::collection::{album::AlbumId, artist::ArtistId};
|
use musichoard::collection::{album::AlbumId, artist::ArtistId};
|
||||||
|
Loading…
Reference in New Issue
Block a user