use gtk::prelude::{BoxExt, Cast, FlowBoxChildExt, GridExt, ListBoxRowExt, WidgetExt};
use crate::factory::{FactoryView, positions};
impl FactoryView for gtk::Box {
type Children = gtk::Widget;
type ReturnedWidget = gtk::Widget;
type Position = ();
fn factory_remove(&self, widget: &Self::ReturnedWidget) {
self.remove(widget);
}
fn factory_append(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
) -> Self::ReturnedWidget {
self.append(widget.as_ref());
widget.as_ref().clone()
}
fn factory_prepend(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
) -> Self::ReturnedWidget {
self.prepend(widget.as_ref());
widget.as_ref().clone()
}
fn factory_insert_after(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
other: &Self::ReturnedWidget,
) -> Self::ReturnedWidget {
self.insert_child_after(widget.as_ref(), Some(other));
widget.as_ref().clone()
}
fn returned_widget_to_child(returned_widget: &Self::ReturnedWidget) -> Self::Children {
returned_widget.clone()
}
fn factory_move_after(&self, widget: &Self::ReturnedWidget, other: &Self::ReturnedWidget) {
self.reorder_child_after(widget, Some(other));
}
fn factory_move_start(&self, widget: &Self::ReturnedWidget) {
self.reorder_child_after(widget, None::<>k::Widget>);
}
}
impl FactoryView for gtk::Grid {
type Children = gtk::Widget;
type ReturnedWidget = gtk::Widget;
type Position = positions::GridPosition;
fn factory_remove(&self, widget: &Self::ReturnedWidget) {
self.remove(widget);
}
fn factory_append(
&self,
widget: impl AsRef<Self::Children>,
position: &Self::Position,
) -> Self::ReturnedWidget {
self.attach(
widget.as_ref(),
position.column,
position.row,
position.width,
position.height,
);
widget.as_ref().clone()
}
fn factory_prepend(
&self,
widget: impl AsRef<Self::Children>,
position: &Self::Position,
) -> Self::ReturnedWidget {
self.factory_append(widget, position)
}
fn factory_insert_after(
&self,
widget: impl AsRef<Self::Children>,
position: &Self::Position,
_other: &Self::ReturnedWidget,
) -> Self::ReturnedWidget {
self.factory_append(widget, position)
}
fn factory_move_after(&self, _widget: &Self::ReturnedWidget, _other: &Self::ReturnedWidget) {}
fn factory_move_start(&self, _widget: &Self::ReturnedWidget) {}
fn returned_widget_to_child(returned_widget: &Self::ReturnedWidget) -> Self::Children {
returned_widget.clone()
}
fn factory_update_position(&self, widget: &Self::ReturnedWidget, position: &Self::Position) {
self.factory_remove(widget);
self.factory_append(widget, position);
}
}
impl FactoryView for gtk::Stack {
type Children = gtk::Widget;
type ReturnedWidget = gtk::StackPage;
type Position = ();
fn factory_remove(&self, widget: &Self::ReturnedWidget) {
self.remove(&widget.child());
}
fn factory_append(
&self,
widget: impl AsRef<Self::Children>,
_position: &Self::Position,
) -> Self::ReturnedWidget {
self.add_child(widget.as_ref())
}
fn factory_prepend(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
) -> Self::ReturnedWidget {
self.add_child(widget.as_ref())
}
fn factory_insert_after(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
_other: &Self::ReturnedWidget,
) -> Self::ReturnedWidget {
self.add_child(widget.as_ref())
}
fn factory_move_after(&self, _widget: &Self::ReturnedWidget, _other: &Self::ReturnedWidget) {}
fn factory_move_start(&self, _widget: &Self::ReturnedWidget) {}
fn returned_widget_to_child(returned_widget: &Self::ReturnedWidget) -> Self::Children {
returned_widget.child()
}
}
impl FactoryView for gtk::ListBox {
type Children = gtk::Widget;
type ReturnedWidget = gtk::ListBoxRow;
type Position = ();
fn factory_remove(&self, widget: &Self::ReturnedWidget) {
widget.set_child(None::<>k::Widget>);
self.remove(widget);
}
fn factory_append(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
) -> Self::ReturnedWidget {
let widget = widget.as_ref();
self.append(widget);
match widget.downcast_ref::<gtk::ListBoxRow>() {
Some(row) => row.clone(),
None => widget.parent().unwrap().downcast().unwrap(),
}
}
fn factory_prepend(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
) -> Self::ReturnedWidget {
let widget = widget.as_ref();
self.prepend(widget);
match widget.downcast_ref::<gtk::ListBoxRow>() {
Some(row) => row.clone(),
None => widget.parent().unwrap().downcast().unwrap(),
}
}
fn factory_insert_after(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
other: &Self::ReturnedWidget,
) -> Self::ReturnedWidget {
let widget = widget.as_ref();
self.insert(widget, other.index() + 1);
match widget.downcast_ref::<gtk::ListBoxRow>() {
Some(row) => row.clone(),
None => widget.parent().unwrap().downcast().unwrap(),
}
}
fn factory_move_after(&self, widget: &Self::ReturnedWidget, other: &Self::ReturnedWidget) {
self.remove(widget);
self.insert(widget, other.index() + 1);
}
fn factory_move_start(&self, widget: &Self::ReturnedWidget) {
self.remove(widget);
self.prepend(widget);
}
fn returned_widget_to_child(returned_widget: &Self::ReturnedWidget) -> Self::Children {
returned_widget
.child()
.unwrap_or_else(|| returned_widget.upcast_ref::<gtk::Widget>().clone())
}
}
impl FactoryView for gtk::FlowBox {
type Children = gtk::Widget;
type ReturnedWidget = gtk::FlowBoxChild;
type Position = ();
fn factory_remove(&self, widget: &Self::ReturnedWidget) {
widget.set_child(None::<>k::Widget>);
self.remove(widget);
}
fn factory_append(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
) -> Self::ReturnedWidget {
let widget = widget.as_ref();
self.insert(widget, -1);
match widget.downcast_ref::<gtk::FlowBoxChild>() {
Some(child) => child.clone(),
None => widget.parent().unwrap().downcast().unwrap(),
}
}
fn factory_prepend(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
) -> Self::ReturnedWidget {
let widget = widget.as_ref();
self.insert(widget, 0);
match widget.downcast_ref::<gtk::FlowBoxChild>() {
Some(child) => child.clone(),
None => widget.parent().unwrap().downcast().unwrap(),
}
}
fn factory_insert_after(
&self,
widget: impl AsRef<Self::Children>,
_position: &(),
other: &Self::ReturnedWidget,
) -> Self::ReturnedWidget {
let widget = widget.as_ref();
self.insert(widget, other.index() + 1);
match widget.downcast_ref::<gtk::FlowBoxChild>() {
Some(child) => child.clone(),
None => widget.parent().unwrap().downcast().unwrap(),
}
}
fn factory_move_after(&self, widget: &Self::ReturnedWidget, other: &Self::ReturnedWidget) {
self.remove(widget);
self.insert(widget, other.index() + 1);
}
fn factory_move_start(&self, widget: &Self::ReturnedWidget) {
self.remove(widget);
self.insert(widget, 0);
}
fn returned_widget_to_child(returned_widget: &Self::ReturnedWidget) -> Self::Children {
returned_widget
.child()
.unwrap_or_else(|| returned_widget.upcast_ref::<gtk::Widget>().clone())
}
}