use crate::component::Component;
use crate::widgets::Entry;
use newt_sys::newtComponent;
use crate::private::funcs::newt_entry_set_filter;
pub struct EntryFilter<'a, F: 'a, T: 'a>
where F: FnMut(&Entry, Option<&T>, char, i32) -> char
{
function: F,
entries: Vec<(&'a Entry, Option<T>)>
}
impl<'a, F: 'a, T: 'a> EntryFilter<'a, F, T>
where F: FnMut(&Entry, Option<&T>, char, i32) -> char
{
pub fn new(entry: &'a Entry, data: Option<T>, function: F)
-> Box<EntryFilter<'a, F, T>>
{
unsafe {
let co: newtComponent = entry.co();
let filter = Box::new(EntryFilter {
function,
entries: vec![(entry, data)]
});
newt_entry_set_filter(co, filter.as_ref());
filter
}
}
pub fn add_entry(&mut self, entry: &'a Entry, data: Option<T>) {
unsafe {
let co: newtComponent = entry.co();
self.entries.push((entry, data));
newt_entry_set_filter(co, self);
}
}
pub(crate) fn call(&mut self, co: newtComponent, ch: char, cursor: i32)
-> char
{
for (entry, data) in self.entries.iter() {
if entry.co() == co {
return (self.function)(entry, data.as_ref(), ch, cursor);
}
}
'\0'
}
}