From 8e6b74cec23a818ee9ed8b1b4ade04eaa4e0a9dd Mon Sep 17 00:00:00 2001 From: unspeaker Date: Wed, 9 Apr 2025 02:06:17 +0300 Subject: [PATCH] 3way merge works! --- src/keys/edit.rs | 1 + src/model/entry.rs | 166 +++++++++++++++++++++++++-------------------- 2 files changed, 94 insertions(+), 73 deletions(-) diff --git a/src/keys/edit.rs b/src/keys/edit.rs index de74ef1..ba4a05c 100644 --- a/src/keys/edit.rs +++ b/src/keys/edit.rs @@ -37,6 +37,7 @@ impl Perch { { setter(self, self.cursor, Some(value.as_ref())); self.mode = None; + self.cursor_select(1); } } pub fn edit_clear (&mut self) { diff --git a/src/model/entry.rs b/src/model/entry.rs index 58637b4..503288a 100644 --- a/src/model/entry.rs +++ b/src/model/entry.rs @@ -174,10 +174,8 @@ impl Metadata { }) } // JPG - if bytes.starts_with(MAGIC_JPG_1) - || bytes.starts_with(MAGIC_JPG_2) - || bytes.starts_with(MAGIC_JPG_3) - || (bytes.starts_with(MAGIC_JPG_4A) && + if bytes.starts_with(MAGIC_JPG_1) || bytes.starts_with(MAGIC_JPG_2) + || bytes.starts_with(MAGIC_JPG_3) || (bytes.starts_with(MAGIC_JPG_4A) && bytes.get(6) == Some(&0x45) && bytes.get(7) == Some(&0x78) && bytes.get(8) == Some(&0x69) && bytes.get(9) == Some(&0x66) && bytes.get(10) == Some(&0x00) && bytes.get(11) == Some(&0x00)) @@ -228,12 +226,13 @@ generated_field!(size = |self|match self { macro_rules! music_tag_field { ( - key = $key:expr, - get = $get:ident, - set = $set:ident, - del = $del:ident, - write = $write:expr, - parse = $parse:expr, + key = $key:expr, + get = $get:ident, + format = $format:expr, + parse = $parse:expr, + read = $read:expr, + set = $set:ident, + del = $del:ident, ) => { impl Entry { pub fn $get (&self) -> Option> { @@ -246,40 +245,44 @@ macro_rules! music_tag_field { impl Metadata { /// Get the metadata value if present. pub fn $get (&self) -> Option> { - let write = $write; + let format = $format; if let Metadata::Music { original_tag, modified_tag, .. } = self { return modified_tag .as_ref() - .map(|tag|tag.read().unwrap().$get().map(|x|write(x))) + .map(|tag|tag.read().unwrap().$get().map(|x|format(x))) .flatten() - .or_else(||original_tag - .as_ref() - .map(|tag|tag.$get().map(|x|write(x))) - .flatten()) + //.or_else(||original_tag + //.as_ref() + //.map(|tag|tag.$get().map(|x|format(x))) + //.flatten()) } None } /// Set or delete the metadata value. /// Return whether the changes should be recounted. - pub fn $set (&mut self, value: Option<&str>) -> bool { + pub fn $set (&mut self, input_value: Option<&str>) -> bool { let parse = $parse; + let read = $read; match self { &mut Metadata::Music { original_tag: Some(ref original), modified_tag: Some(ref modified), .. - } => if let Some(value) = value { - // set new value - let value = parse(value).unwrap(); - let changed = original.$get() != Some(value); - modified.write().unwrap().$set(value); - changed + } => if let Some(input_value) = input_value { + if let Ok(input_value) = parse(input_value) { + // set new value + let changed = original.$get().map(read) != Some(input_value.clone()); + modified.write().unwrap().$set(input_value); + changed + } else { + false + } } else { - let modified = modified.write().unwrap(); + let mut modified = modified.write().unwrap(); if let Some(value) = modified.$get() { // delete modified value modified.$del(); true - } else if let Some(value) = original.$get() { + } else if let Some(value) = original.$get().map(read) { // set to original value modified.$set(value); true @@ -290,13 +293,18 @@ macro_rules! music_tag_field { &mut Metadata::Music { original_tag: Some(ref original), ref mut modified_tag, .. - } => if let Some(input_value) = value { - let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types - new_tag.$set(input_value); - *modified_tag = Some(Arc::new(RwLock::new(new_tag))); - true + } => if let Some(input_value) = input_value { + if let Ok(input_value) = parse(input_value) { + let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types + new_tag.$set(input_value); + *modified_tag = Some(Arc::new(RwLock::new(new_tag))); + true + } else { + false + } } else if let Some(original_value) = original.$get() { // set to original value + let original_value = read(original_value); let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types new_tag.$set(original_value); *modified_tag = Some(Arc::new(RwLock::new(new_tag))); @@ -307,19 +315,22 @@ macro_rules! music_tag_field { &mut Metadata::Music { original_tag: None, modified_tag: Some(ref modified), .. - } => if let Some(value) = value { + } => if let Some(input_value) = input_value { // set new value - let value = parse(value).unwrap(); - let modified = modified.write().unwrap(); - if modified.$get() != Some(value) { - // set modified value - modified.$set(value); - true + if let Ok(input_value) = parse(input_value) { + let mut modified = modified.write().unwrap(); + if modified.$get().map(read) != Some(input_value.clone()) { + // set modified value + modified.$set(input_value); + true + } else { + false + } } else { false } } else { - let modified = modified.write().unwrap(); + let mut modified = modified.write().unwrap(); if modified.$get().is_some() { // remove modified value modified.$del(); @@ -331,11 +342,15 @@ macro_rules! music_tag_field { &mut Metadata::Music { original_tag: None, ref mut modified_tag, .. - } => if let Some(value) = value { - let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types - new_tag.$set(value); - *modified_tag = Some(Arc::new(RwLock::new(new_tag))); - true + } => if let Some(input_value) = input_value { + if let Ok(input_value) = parse(input_value) { + let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types + new_tag.$set(input_value); + *modified_tag = Some(Arc::new(RwLock::new(new_tag))); + true + } else { + false + } } else { false }, @@ -350,46 +365,51 @@ macro_rules! music_tag_field { } music_tag_field! { - key = ItemKey::TrackArtist, - get = artist, - set = set_artist, - del = remove_artist, - write = |value: Cow|value.into(), - parse = |value: &str|Ok::(value.trim()), + key = ItemKey::TrackArtist, + get = artist, + format = |value: Cow|value.into(), + parse = |value: &str|Ok::(value.trim().to_string()), + read = |value: Cow|value.to_string(), + set = set_artist, + del = remove_artist, } music_tag_field! { - key = ItemKey::Year, - get = year, - set = set_year, - del = remove_year, - write = |value: u32|format!("{value}").into(), - parse = |value: &str|value.trim().parse::(), + key = ItemKey::Year, + get = year, + format = |value: u32|format!("{value}").into(), + parse = |value: &str|value.trim().parse::(), + read = |value: u32|value, + set = set_year, + del = remove_year, } music_tag_field! { - key = ItemKey::AlbumTitle, - get = album, - set = set_album, - del = remove_album, - write = |value: Cow|value.into(), - parse = |value: &str|Ok::(value.trim().into()), + key = ItemKey::AlbumTitle, + get = album, + format = |value: Cow|value.into(), + parse = |value: &str|Ok::(value.trim().to_string()), + read = |value: Cow|value.to_string(), + set = set_album, + del = remove_album, } music_tag_field! { - key = ItemKey::TrackNumber, - get = track, - set = set_track, - del = remove_track, - write = |value: u32|format!("{value}").into(), - parse = |value: &str|value.trim().parse::(), + key = ItemKey::TrackNumber, + get = track, + format = |value: u32|format!("{value}").into(), + parse = |value: &str|value.trim().parse::(), + read = |value: u32|value, + set = set_track, + del = remove_track, } music_tag_field! { - key = ItemKey::TrackTitle, - get = title, - set = set_title, - del = remove_title, - write = |value: Cow|value.into(), - parse = |value: &str|Ok::(value.trim().into()), + key = ItemKey::TrackTitle, + get = title, + format = |value: Cow|value.into(), + parse = |value: &str|Ok::(value.trim().to_string()), + read = |value: Cow|value.to_string(), + set = set_title, + del = remove_title, }