mirror of
https://codeberg.org/unspeaker/perch.git
synced 2025-12-06 17:46:42 +01:00
pass whole state to setter, to emit tasks
This commit is contained in:
parent
d26c46d6e1
commit
859da8e5d1
5 changed files with 85 additions and 48 deletions
|
|
@ -1,20 +1,21 @@
|
|||
use crate::*;
|
||||
|
||||
pub struct Columns<G, S>(pub Vec<Column<G, S>>);
|
||||
|
||||
pub struct Column<G, S> {
|
||||
pub title: Arc<str>,
|
||||
pub width: usize,
|
||||
pub title: Arc<str>,
|
||||
pub width: usize,
|
||||
pub getter: G,
|
||||
pub setter: Option<S>,
|
||||
//pub styler: Option<U>,
|
||||
}
|
||||
|
||||
impl<T> Column<fn(&T)->Option<Arc<str>>, fn(&mut [T], usize, &str)> {
|
||||
type Getter<T> = fn(&T)->Option<Arc<str>>;
|
||||
type Setter<T> = fn(&mut T, usize, &str);
|
||||
|
||||
impl<G, S> Column<Getter<G>, Setter<S>> {
|
||||
pub fn new (
|
||||
title: &impl AsRef<str>,
|
||||
width: usize,
|
||||
getter: fn(&T)->Option<Arc<str>>,
|
||||
title: &impl AsRef<str>,
|
||||
width: usize,
|
||||
getter: Getter<G>,
|
||||
) -> Self {
|
||||
Self {
|
||||
width,
|
||||
|
|
@ -23,37 +24,49 @@ impl<T> Column<fn(&T)->Option<Arc<str>>, fn(&mut [T], usize, &str)> {
|
|||
setter: None,
|
||||
}
|
||||
}
|
||||
fn setter (mut self, setter: fn(&mut [T], usize, &str)) -> Self {
|
||||
fn setter (mut self, setter: Setter<S>) -> Self {
|
||||
self.setter = Some(setter);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! setter {
|
||||
($method:ident) => {
|
||||
|entries: &mut [Entry], index: usize, value: &str|{
|
||||
if let Some(entries) = entries_under(entries, index) {
|
||||
($name:ident) => {{
|
||||
fn $name (
|
||||
state: &mut Taggart,
|
||||
index: usize,
|
||||
value: &str
|
||||
) {
|
||||
if let Some(entries) = entries_under(&mut state.entries, index) {
|
||||
for entry in entries.iter() {
|
||||
entry.write().unwrap().$method(&value);
|
||||
entry.write().unwrap().$name(&value);
|
||||
}
|
||||
} else if let Some(entry) = entries.get_mut(index) {
|
||||
entry.$method(&value)
|
||||
} else if let Some(entry) = state.entries.get_mut(index) {
|
||||
entry.$name(&value);
|
||||
}
|
||||
}
|
||||
}
|
||||
$name
|
||||
}}
|
||||
}
|
||||
|
||||
impl Default for Columns<fn(&Entry)->Option<Arc<str>>, fn(&mut [Entry], usize, &str)> {
|
||||
pub struct Columns<G, S>(pub Vec<Column<G, S>>);
|
||||
|
||||
impl Default for Columns<fn(&Entry)->Option<Arc<str>>, fn(&mut Taggart, usize, &str)> {
|
||||
fn default () -> Self {
|
||||
Self(vec![
|
||||
Column::new(&"Hash", 8, |entry: &Entry|entry.hash()),
|
||||
Column::new(&"Size", 8, |entry: &Entry|entry.size()),
|
||||
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)),
|
||||
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)),
|
||||
])
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue