h-gtk:utils Add a more flexible implementation of lazy_load.

lazy_load_full is meant for siturations that you don't need
the constraisn of passing a single container parent and adding
a sigle widget to it.

Reimplemnted lazy_load on top of lazy_load_full.
This commit is contained in:
Jordan Petridis 2018-04-17 02:33:32 +03:00
parent 2d291a08fc
commit 08365c412a
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6

View File

@ -70,11 +70,26 @@ where
C: ContainerExt + 'static, C: ContainerExt + 'static,
F: FnMut(T::Item) -> W + 'static, F: FnMut(T::Item) -> W + 'static,
W: IsA<Widget>, W: IsA<Widget>,
{
let func = move |x| container.add(&contructor(x));
lazy_load_full(data, func);
}
/// Iterate over `data` and execute `func` using a `glib::idle_add()`.
///
/// This is a more flexible version of `lazy_load` with less constrains.
/// If you just want to lazy add `widgets` to a `container` check if
/// `lazy_load` fits your needs first.
pub fn lazy_load_full<T, F>(data: T, mut func: F)
where
T: IntoIterator + 'static,
T::Item: 'static,
F: FnMut(T::Item) + 'static,
{ {
let mut data = data.into_iter(); let mut data = data.into_iter();
gtk::idle_add(move || { gtk::idle_add(move || {
data.next() data.next()
.map(|x| container.add(&contructor(x))) .map(|x| func(x))
.map(|_| glib::Continue(true)) .map(|_| glib::Continue(true))
.unwrap_or(glib::Continue(false)) .unwrap_or(glib::Continue(false))
}); });