pub mod column;
pub mod grid;
mod iterator;
pub mod list;
mod selection_ext;
pub use self::selection_ext::RelmSelectionExt;
use gtk::{glib, prelude::Cast};
use std::{
cell::{Ref, RefMut},
cmp::Ordering,
marker::PhantomData,
};
pub use self::iterator::TypedIterator;
pub type OrdFn<T> = Option<Box<dyn Fn(&T, &T) -> Ordering>>;
struct Filter {
filter: gtk::CustomFilter,
model: gtk::FilterListModel,
}
#[derive(Debug, Clone)]
pub struct TypedListItem<T> {
inner: glib::BoxedAnyObject,
_ty: PhantomData<*const T>,
}
impl<T: 'static> TypedListItem<T> {
fn new(inner: glib::BoxedAnyObject) -> Self {
Self {
inner,
_ty: PhantomData,
}
}
#[must_use]
pub fn borrow(&self) -> Ref<'_, T> {
self.inner.borrow()
}
#[must_use]
pub fn borrow_mut(&self) -> RefMut<'_, T> {
self.inner.borrow_mut()
}
}
fn get_value<T: 'static>(obj: &glib::Object) -> Ref<'_, T> {
let wrapper = obj.downcast_ref::<glib::BoxedAnyObject>().unwrap();
wrapper.borrow()
}
fn get_mut_value<T: 'static>(obj: &glib::Object) -> RefMut<'_, T> {
let wrapper = obj.downcast_ref::<glib::BoxedAnyObject>().unwrap();
wrapper.borrow_mut()
}