use gtk::prelude::*;
use crate::ContainerChild;
pub trait RelmContainerExt: ContainerChild {
fn container_add(&self, widget: &impl AsRef<Self::Child>);
}
macro_rules! container_add_impl {
($($type:ty),+) => {
$(
impl RelmContainerExt for $type {
fn container_add(&self, widget: &impl AsRef<<$type as ContainerChild>::Child>) {
self.add(widget.as_ref());
}
}
)+
}
}
macro_rules! container_add_replace_impl {
($($type:ty),+) => {
$(
impl RelmContainerExt for $type {
fn container_add(&self, widget: &impl AsRef<<$type as ContainerChild>::Child>) {
let self_container: >k::Container = self.upcast_ref();
let window: >k::Window = self.upcast_ref();
let titlebar = window.titlebar();
for child in self_container.children() {
if titlebar.as_ref().is_some_and(|titlebar| titlebar == &child) {
continue;
}
self_container.remove(&child);
}
self.add(widget.as_ref());
}
}
)+
}
}
container_add_replace_impl! {
gtk::Window,
gtk::ApplicationWindow
}
impl RelmContainerExt for gtk::Dialog {
fn container_add(&self, widget: &impl AsRef<<gtk::Dialog as ContainerChild>::Child>) {
let content = self.content_area();
for child in content.children() {
content.remove(&child);
}
content.add(widget.as_ref());
}
}
container_add_impl! {
gtk::Box,
gtk::Fixed,
gtk::Grid,
gtk::ActionBar,
gtk::Stack,
gtk::HeaderBar,
gtk::InfoBar,
gtk::Button,
gtk::ComboBox,
gtk::FlowBox,
gtk::FlowBoxChild,
gtk::Frame,
gtk::Popover,
gtk::ListBox,
gtk::ListBoxRow,
gtk::ScrolledWindow,
gtk::LinkButton,
gtk::ToggleButton,
gtk::Overlay,
gtk::Revealer,
gtk::Expander,
gtk::AspectFrame,
gtk::SearchBar,
gtk::Viewport,
gtk::MenuButton
}