stub help modal; cleanup

This commit is contained in:
🪞👃🪞 2025-04-06 16:22:12 +03:00
parent b157a87647
commit 4619d0ea76
9 changed files with 78 additions and 68 deletions

View file

@ -20,9 +20,10 @@ macro_rules! press {
}; };
} }
mod edit; pub use self::edit::*; mod edit;
mod save; pub use self::save::*; mod save;
mod quit; pub use self::quit::*; mod quit;
mod help;
impl Handle<TuiIn> for Taggart { impl Handle<TuiIn> for Taggart {
fn handle (&mut self, input: &TuiIn) -> Perhaps<bool> { fn handle (&mut self, input: &TuiIn) -> Perhaps<bool> {
@ -30,10 +31,12 @@ impl Handle<TuiIn> for Taggart {
let max = self.offset + self.display.h().saturating_sub(1); let max = self.offset + self.display.h().saturating_sub(1);
let event = &*input.event(); let event = &*input.event();
match &self.mode { match &self.mode {
Some(Mode::Edit { .. }) => self.mode_edit(event), Some(Mode::Edit { .. }) => self.handle_edit(event),
Some(Mode::Save { value }) => self.mode_save(event, *value), Some(Mode::Help { page }) => self.handle_help(event, *page),
Some(Mode::Quit { value }) => self.mode_quit(input, event, *value), Some(Mode::Save { choice }) => self.handle_save(event, *choice),
Some(Mode::Quit { choice }) => self.handle_quit(input, *choice),
None => match event { None => match event {
press!(F(1)) => { self.help_begin() },
press!(Char('q')) => { self.quit_begin(&input) }, press!(Char('q')) => { self.quit_begin(&input) },
press!(Char('w')) => { self.save_begin() }, press!(Char('w')) => { self.save_begin() },
press!(Enter) => { self.edit_begin() }, press!(Enter) => { self.edit_begin() },
@ -48,8 +51,7 @@ impl Handle<TuiIn> for Taggart {
press!(Char('[')) => { self.columns.0[self.column].width = press!(Char('[')) => { self.columns.0[self.column].width =
self.columns.0[self.column].width.saturating_sub(1).max(5); } self.columns.0[self.column].width.saturating_sub(1).max(5); }
_ => {} _ => {}
} },
_ => todo!("{:?}", self.mode)
} }
self.clamp(min, max); self.clamp(min, max);
Ok(None) Ok(None)

View file

@ -1,7 +1,7 @@
use crate::*; use crate::*;
impl Taggart { impl Taggart {
pub fn mode_edit (&mut self, event: &Event) { pub fn handle_edit (&mut self, event: &Event) {
match event { match event {
press!(Char(c)) => self.edit_insert(*c), press!(Char(c)) => self.edit_insert(*c),
press!(Shift-Char(c)) => self.edit_insert(c.to_uppercase().next().unwrap()), press!(Shift-Char(c)) => self.edit_insert(c.to_uppercase().next().unwrap()),

13
src/keys/help.rs Normal file
View file

@ -0,0 +1,13 @@
use crate::*;
impl Taggart {
pub fn handle_help (&mut self, event: &Event, _page: u8) {
match event {
press!(Esc) => { self.mode = None },
_ => {}
}
}
pub fn help_begin (&mut self) {
self.mode = Some(Mode::Help { page: 0 })
}
}

View file

@ -1,23 +1,16 @@
use crate::*; use crate::*;
impl Taggart { impl Taggart {
pub fn quit_begin (&mut self, input: &TuiIn) { pub fn handle_quit (&mut self, input: &TuiIn, choice: u8) {
if self.tasks.len() == 0 { match &*input.event() {
input.done()
} else {
self.mode = Some(Mode::Quit { value: 1 })
}
}
pub fn mode_quit (&mut self, input: &TuiIn, event: &Event, value: u8) {
match event {
press!(Esc) => { self.mode = None }, press!(Esc) => { self.mode = None },
press!(Left) => { self.mode = Some(Mode::Quit { press!(Left) => { self.mode = Some(Mode::Quit {
value: value.overflowing_sub(1).0.min(2) choice: choice.overflowing_sub(1).0.min(2)
}) }, }) },
press!(Right) => { self.mode = Some(Mode::Quit { press!(Right) => { self.mode = Some(Mode::Quit {
value: (value + 1) % 3 choice: (choice + 1) % 3
}) }, }) },
press!(Enter) => match value { press!(Enter) => match choice {
0 => { input.done() }, 0 => { input.done() },
1 => { self.mode = None }, 1 => { self.mode = None },
2 => todo!(), 2 => todo!(),
@ -26,4 +19,11 @@ impl Taggart {
_ => {} _ => {}
} }
} }
pub fn quit_begin (&mut self, input: &TuiIn) {
if self.tasks.len() == 0 {
input.done()
} else {
self.mode = Some(Mode::Quit { choice: 1 })
}
}
} }

View file

@ -1,21 +1,16 @@
use crate::*; use crate::*;
impl Taggart { impl Taggart {
pub fn save_begin (&mut self) { pub fn handle_save (&mut self, event: &Event, choice: u8) {
if self.tasks.len() > 0 {
self.mode = Some(Mode::Save { value: 1 })
}
}
pub fn mode_save (&mut self, event: &Event, value: u8) {
match event { match event {
press!(Esc) => { self.mode = None } press!(Esc) => { self.mode = None }
press!(Left) => { self.mode = Some(Mode::Save { press!(Left) => { self.mode = Some(Mode::Save {
value: value.overflowing_sub(1).0.min(2) choice: choice.overflowing_sub(1).0.min(2)
}) }, }) },
press!(Right) => { self.mode = Some(Mode::Save { press!(Right) => { self.mode = Some(Mode::Save {
value: (value + 1) % 3 choice: (choice + 1) % 3
}) }, }) },
press!(Enter) => match value { press!(Enter) => match choice {
0 => { self.tasks = vec![]; self.mode = None; }, 0 => { self.tasks = vec![]; self.mode = None; },
1 => { self.mode = None }, 1 => { self.mode = None },
2 => todo!(), 2 => todo!(),
@ -24,4 +19,9 @@ impl Taggart {
_ => {} _ => {}
} }
} }
pub fn save_begin (&mut self) {
if self.tasks.len() > 0 {
self.mode = Some(Mode::Save { choice: 1 })
}
}
} }

View file

@ -20,17 +20,10 @@ pub struct Taggart {
#[derive(Debug)] #[derive(Debug)]
pub enum Mode { pub enum Mode {
Help, Help { page: u8 },
Edit { Edit { value: Arc<str>, index: usize, },
value: Arc<str>, Save { choice: u8, },
index: usize, Quit { choice: u8, },
},
Save {
value: u8,
},
Quit {
value: u8,
},
} }
impl Taggart { impl Taggart {

View file

@ -1,13 +1,12 @@
use crate::*; use crate::*;
use std::fs::File; use std::fs::File;
use std::io::{BufReader, Read}; use std::io::{BufReader, Read};
use std::borrow::Borrow;
use byte_unit::{Byte, Unit::MB}; use byte_unit::{Byte, Unit::MB};
use lofty::{ use lofty::{
probe::Probe, probe::Probe,
file::TaggedFileExt, file::TaggedFileExt,
config::{ParseOptions, ParsingMode}, config::{ParseOptions, ParsingMode},
tag::{Accessor, Tag, TagItem, ItemKey, ItemValue, TagType} tag::{Accessor, Tag, TagItem, TagType}
}; };
pub enum Metadata { pub enum Metadata {
@ -139,7 +138,7 @@ macro_rules! music_tag_field {
} }
pub fn $set (&mut self, value: &impl AsRef<str>) -> Option<TagItem> { pub fn $set (&mut self, value: &impl AsRef<str>) -> Option<TagItem> {
let value = value.as_ref().trim(); let value = value.as_ref().trim();
if let &mut Metadata::Music { ref original_tag, ref mut modified_tag, .. } = self { if let &mut Metadata::Music { ref mut modified_tag, .. } = self {
match (value.len(), &modified_tag) { match (value.len(), &modified_tag) {
(0, Some(new_tag)) => { (0, Some(new_tag)) => {
if new_tag.read().unwrap().item_count() <= 1 { if new_tag.read().unwrap().item_count() <= 1 {
@ -184,7 +183,7 @@ macro_rules! music_tag_field {
} }
pub fn $set (&mut self, value: &impl AsRef<str>) -> Option<TagItem> { pub fn $set (&mut self, value: &impl AsRef<str>) -> Option<TagItem> {
let value = value.as_ref().trim(); let value = value.as_ref().trim();
if let &mut Metadata::Music { ref original_tag, ref mut modified_tag, .. } = self if let &mut Metadata::Music { ref mut modified_tag, .. } = self
&& let Ok(numeric_value) = value.parse::<u32>() && let Ok(numeric_value) = value.parse::<u32>()
{ {
match (value.len(), &modified_tag) { match (value.len(), &modified_tag) {

View file

@ -3,8 +3,8 @@ pub(crate) use tengri::tui::ratatui::style::{Color, Modifier};
pub(crate) use pad::PadStr; pub(crate) use pad::PadStr;
mod table; pub use self::table::*; mod table; pub use self::table::*;
mod dialog; pub use self::dialog::*; mod dialog;
mod status; pub use self::status::*; mod status;
impl Content<TuiOut> for Taggart { impl Content<TuiOut> for Taggart {
fn content (&self) -> impl Render<TuiOut> { fn content (&self) -> impl Render<TuiOut> {

View file

@ -10,40 +10,43 @@ impl Taggart {
let bg = |x|Bsp::a(x, Repeat(" ")); let bg = |x|Bsp::a(x, Repeat(" "));
pos(style(border(bg(content)))) pos(style(border(bg(content))))
} }
fn dialog_help (&self) { fn dialog_help (&self, _page: u8) -> impl Content<TuiOut> {
Self::dialog(Bsp::s(
"Help",
"TODO",
))
} }
fn dialog_save (&self, value: u8) { fn dialog_save (&self, choice: u8) -> impl Content<TuiOut> {
let choices = [ let choices = [
if value == 0 { "[ Clear changes ]" } else { " Clear changes " }, if choice == 0 { "[ Clear changes ]" } else { " Clear changes " },
if value == 1 { "[ Continue editing ]" } else { " Continue editing " }, if choice == 1 { "[ Continue editing ]" } else { " Continue editing " },
if value == 2 { "[ Write and continue ]" } else { " Write and continue " }, if choice == 2 { "[ Write and continue ]" } else { " Write and continue " },
]; ];
Self::dialog(Bsp::s( Self::dialog(Bsp::s(
format!("Save {} change(s)?", self.tasks.len()), format!("Save {} change(s)?", self.tasks.len()),
Bsp::s("", Bsp::e(choices[0], Bsp::e(choices[1], choices[2]))))); Bsp::s("", Bsp::e(choices[0], Bsp::e(choices[1], choices[2])))))
} }
fn dialog_quit (&self, value: u8) { fn dialog_quit (&self, choice: u8) -> impl Content<TuiOut> {
let choices = [ let choices = [
if value == 0 { "[ Exit without saving ]" } else { " Exit without saving " }, if choice == 0 { "[ Exit without saving ]" } else { " Exit without saving " },
if value == 1 { "[ Cancel ]" } else { " Cancel " }, if choice == 1 { "[ Cancel ]" } else { " Cancel " },
if value == 2 { "[ Write and exit ]" } else { " Write and exit " }, if choice == 2 { "[ Write and exit ]" } else { " Write and exit " },
]; ];
Self::dialog(Bsp::s( Self::dialog(Bsp::s(
format!("Save {} change(s) before exiting?", self.tasks.len()), format!("Save {} change(s) before exiting?", self.tasks.len()),
Bsp::s("", Bsp::e(choices[0], Bsp::e(choices[1], choices[2]))))); Bsp::s("", Bsp::e(choices[0], Bsp::e(choices[1], choices[2])))))
} }
pub fn render_dialog (&self, to: &mut TuiOut) { pub fn render_dialog (&self, to: &mut TuiOut) {
match self.mode { match self.mode {
Some(Mode::Save { value }) => { Some(Mode::Edit { .. }) => {},
to.tint_all(Color::Rgb(96,96,96), Color::Rgb(48,48,48), Modifier::DIM); Some(_) => to.tint_all(Color::Rgb(96,96,96), Color::Rgb(48,48,48), Modifier::DIM),
Content::render(&self.dialog_save(value), to) _ => {}
}, }
Some(Mode::Quit { value }) => { match self.mode {
to.tint_all(Color::Rgb(96,96,96), Color::Rgb(48,48,48), Modifier::DIM); Some(Mode::Edit { .. }) => {},
Content::render(&self.dialog_quit(value), to) Some(Mode::Save { choice }) => Content::render(&self.dialog_save(choice), to),
}, Some(Mode::Quit { choice }) => Content::render(&self.dialog_quit(choice), to),
Some(Mode::Help { .. }) => { Some(Mode::Help { page }) => Content::render(&self.dialog_help(page), to),
},
_ => {}, _ => {},
} }
} }