use std::ops::Deref; use gtk4 as gtk; use gtk::{ Box, Stack, Widget, Orientation, StackSidebar, StackSwitcher, StackTransitionType, prelude::{BoxExt, IsA}, }; 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 } }