use gtk;
use gtk::{ContainerExt, IsA, Object, WidgetExt};
use component::Component;
use super::{DisplayVariant, RemoteRelm, create_widget, init_component};
use widget::Widget;
pub trait Container: Widget {
type Container;
fn container(&self) -> &Self::Container;
}
pub trait ContainerWidget {
fn add_widget<CHILDWIDGET, WIDGET: Widget>(&self, relm: &RemoteRelm<WIDGET>,
model_param: CHILDWIDGET::ModelParam) -> Component<CHILDWIDGET>
where CHILDWIDGET: Widget + 'static,
CHILDWIDGET::Model: Clone + Send,
CHILDWIDGET::Msg: Clone + DisplayVariant + Send + 'static,
CHILDWIDGET::Root: IsA<gtk::Widget> + IsA<Object> + WidgetExt;
fn remove_widget<CHILDWIDGET>(&self, component: Component<CHILDWIDGET>)
where CHILDWIDGET: Widget,
CHILDWIDGET::Model: Clone,
CHILDWIDGET::Root: IsA<gtk::Widget>;
}
impl<W: Clone + ContainerExt + IsA<gtk::Widget> + IsA<Object>> ContainerWidget for W {
fn add_widget<CHILDWIDGET, WIDGET: Widget>(&self, relm: &RemoteRelm<WIDGET>,
model_param: CHILDWIDGET::ModelParam) -> Component<CHILDWIDGET>
where CHILDWIDGET: Widget + 'static,
CHILDWIDGET::Model: Clone + Send,
CHILDWIDGET::Msg: Clone + DisplayVariant + Send + 'static,
CHILDWIDGET::Root: IsA<gtk::Widget> + IsA<Object> + WidgetExt,
{
let component = create_widget::<CHILDWIDGET>(&relm.remote, model_param);
self.add(component.widget.root());
component.widget.on_add(self.clone());
init_component::<CHILDWIDGET>(&component, &relm.remote);
Component::new(component)
}
fn remove_widget<WIDGET>(&self, component: Component<WIDGET>)
where WIDGET: Widget,
WIDGET::Model: Clone,
WIDGET::Root: IsA<gtk::Widget>,
{
self.remove(component.widget().root());
}
}
pub trait RelmContainer {
fn add<W: IsA<gtk::Widget>>(&self, widget: &W);
fn add_widget<CHILDWIDGET, WIDGET>(&self, relm: &RemoteRelm<WIDGET>,
model_param: CHILDWIDGET::ModelParam) -> Component<CHILDWIDGET>
where CHILDWIDGET: Widget + 'static,
CHILDWIDGET::Model: Clone + Send,
CHILDWIDGET::Msg: Send,
WIDGET: Widget;
}
impl<WIDGET> RelmContainer for Component<WIDGET>
where WIDGET: Container + Widget,
WIDGET::Container: Clone + ContainerExt + IsA<gtk::Widget> + IsA<Object>,
WIDGET::Model: Clone,
{
fn add<W: IsA<gtk::Widget>>(&self, widget: &W) {
let container = self.widget().container();
container.add(widget);
}
fn add_widget<CHILDWIDGET, PARENTWIDGET>(&self, relm: &RemoteRelm<PARENTWIDGET>,
model_param: CHILDWIDGET::ModelParam) -> Component<CHILDWIDGET>
where CHILDWIDGET: Widget + 'static,
CHILDWIDGET::Model: Clone + Send,
CHILDWIDGET::Msg: Send,
PARENTWIDGET: Widget
{
let component = create_widget::<CHILDWIDGET>(&relm.remote, model_param);
let container = self.widget().container();
container.add(component.widget.root());
component.widget.on_add(container.clone());
init_component::<CHILDWIDGET>(&component, &relm.remote);
Component::new(component)
}
}