better column resizing

This commit is contained in:
🪞👃🪞 2025-04-06 19:09:44 +03:00
parent 44a2108585
commit 4de94beafb
9 changed files with 403 additions and 359 deletions

View file

@ -1,11 +1,12 @@
use crate::*;
pub struct Column<G, S> {
pub title: Arc<str>,
pub width: usize,
pub getter: G,
pub setter: Option<S>,
//pub styler: Option<U>,
pub title: Arc<str>,
pub width: usize,
pub collapsed: bool,
pub getter: G,
pub setter: Option<S>,
//pub styler: Option<U>,
}
type Getter<T> = fn(&T)->Option<Arc<str>>;
@ -22,6 +23,7 @@ impl<G, S> Column<Getter<G>, Setter<S>> {
title: title.as_ref().into(),
getter,
setter: None,
collapsed: false,
}
}
fn setter (mut self, setter: Setter<S>) -> Self {
@ -30,32 +32,6 @@ impl<G, S> Column<Getter<G>, Setter<S>> {
}
}
macro_rules! setter {
($name:ident) => {{
fn $name (
state: &mut Taggart,
index: usize,
value: &str
) {
if let Some(entries) = entries_under(&mut state.entries, index) {
for (p, entry) in entries.into_iter() {
if let Some(item) = entry.write().unwrap().$name(&value) {
state.tasks.retain(|t|{(t.path != p) || (t.item.key() != item.key())});
state.tasks.push(Task { path: p, item, });
};
}
} else if let Some(entry) = state.entries.get_mut(index) {
let p = entry.path.clone();
if let Some(item) = entry.$name(&value) {
state.tasks.retain(|t|{(t.path != p) || (t.item.key() != item.key())});
state.tasks.push(Task { path: p, item, });
};
}
}
$name
}}
}
pub(crate) fn entries_under (
entries: &mut [Entry],
index: usize
@ -87,22 +63,52 @@ impl<G, S> Columns<G, S> {
const SCROLL_RIGHT: &'static str = "";
}
macro_rules! setter {
($set:ident) => {{
fn $set (state: &mut Taggart, index: usize, value: &str) {
if let Some(entries) = entries_under(&mut state.entries, index) {
for (_path, entry) in entries.into_iter() {
if entry.write().unwrap().$set(&value) {
state.count_modified();
//state.tasks.retain(|t|{(t.path != p) || (t.item.key() != item.key())});
//state.tasks.push(Task { path: p, item, });
};
}
} else if let Some(entry) = state.entries.get_mut(index) {
//let p = entry.path.clone();
if entry.$set(&value) {
state.count_modified();
//state.tasks.retain(|t|{(t.path != p) || (t.item.key() != item.key())});
//state.tasks.push(Task { path: p, item, });
};
}
}
$set
}}
}
impl Default for Columns<fn(&Entry)->Option<Arc<str>>, fn(&mut Taggart, usize, &str)> {
fn default () -> Self {
Self(vec![
// Computed file hash
Column::new(&"Hash", 8, |entry: &Entry|entry.hash()),
// File size
Column::new(&"Size", 8, |entry: &Entry|entry.size()),
// Selected?
Column::new(&"", 1, |entry: &Entry|Some(" ".into())),
// File name
Column::new(&"File", 80, |entry: &Entry|entry.name()),
Column::new(&"Artist", 30, |entry: &Entry|entry.artist())
.setter(setter!(set_artist)),
Column::new(&"Year", 5, |entry: &Entry|entry.year())
.setter(setter!(set_year)),
Column::new(&"Release", 30, |entry: &Entry|entry.album())
.setter(setter!(set_album)),
Column::new(&"Track", 5, |entry: &Entry|entry.track())
.setter(setter!(set_track)),
Column::new(&"Title", 80, |entry: &Entry|entry.title())
.setter(setter!(set_title)),
// Modified tags?
Column::new(&"~", 1, |entry: &Entry|if entry.is_modified() {
Some("~".into())
} else {
None
}),
Column::new(&"Artist", 30, |entry: &Entry|entry.artist()).setter(setter!(set_artist)),
Column::new(&"Year", 5, |entry: &Entry|entry.year()).setter(setter!(set_year)),
Column::new(&"Release", 30, |entry: &Entry|entry.album()).setter(setter!(set_album)),
Column::new(&"Track", 5, |entry: &Entry|entry.track()).setter(setter!(set_track)),
Column::new(&"Title", 80, |entry: &Entry|entry.title()).setter(setter!(set_title)),
])
}
}