use gtk4 as gtk; #[allow(unused)] use gtk::{ prelude::{BoxExt, IsA}, Box, Orientation, Stack, StackSidebar, StackSwitcher, StackTransitionType, Widget, }; use crate::view::components::builder_traits::{Builder, Product}; pub type Page<'a> = (&'a str, &'a str, &'a Box); pub struct Pages { wrapper: Box, } pub struct PagesBuilder { pages_content: Stack, } impl Product for Pages { fn builder() -> PagesBuilder { PagesBuilder { pages_content: Stack::new(), } } fn get(self) -> Box { self.wrapper } } impl Builder, i32> for PagesBuilder { fn build(&self, build_param: i32) -> Pages { let stack_sidebar = StackSidebar::new(); let stack_switcher = StackSwitcher::new(); stack_sidebar.set_stack(&self.pages_content); stack_switcher.set_stack(Some(&self.pages_content)); let wrapper = Box::new(Orientation::Horizontal, build_param); wrapper.append(&stack_sidebar); wrapper.append(&self.pages_content); Pages { wrapper } } fn append_item(self, item: Page) -> Self { self.append_page_private(item); self } fn append_items(self, items: Vec) -> Self { for item in items { self.append_page_private(item); } self } } impl PagesBuilder { fn append_page_private(&self, item: Page) { self.pages_content.add_titled(item.2, Some(item.1), item.0); } pub fn set_transition(self, type_transition: StackTransitionType, duration: u32) -> Self { self.pages_content.set_transition_type(type_transition); self.pages_content.set_transition_duration(duration); self } }