use crate::components::new_project::NewPageModel; use adw::prelude::*; use gtk::prelude::*; use relm4::actions::RelmActionGroup; use relm4::{actions::*, prelude::*, Component, ComponentParts, ComponentSender}; use std::{ any::Any, borrow::{Borrow, BorrowMut}, cell::RefCell, collections::{BTreeMap, HashMap}, path::PathBuf, rc::Rc, sync::{Arc, Mutex}, }; use gtk::Widget; relm4::new_action_group!(FileActionGroup, "file"); relm4::new_stateless_action!(OpenAction, FileActionGroup, "open"); pub type ElementKey = String; #[derive(Debug)] pub enum AppMsg { NewProject } pub struct AppModel { new_page_model: Controller, tracker: usize, } #[derive(Debug)] pub enum AppCommand { CloseRequest, } #[relm4::component(pub)] impl Component for AppModel { type CommandOutput = AppCommand; type Init = (); type Input = AppMsg; type Output = (); view! { #[root] main_window=adw::ApplicationWindow { set_default_width: 1200, set_default_height: 900, set_focus_on_click:true, connect_close_request[sender] => move |_| { let app = relm4::main_application(); app.quit(); gtk::Inhibit(true) }, gtk::Box{ set_orientation: gtk::Orientation::Vertical, set_valign:gtk::Align::Fill, set_spacing:2, // gtk::HeaderBar{}, gtk::Box{ set_hexpand: true, set_vexpand: true, #[name="stack"] adw::NavigationView{ set_hexpand:true, set_vexpand:true, }, } } }, home_page = adw::NavigationPage{ #[wrap(Some)] set_child=&adw::ToolbarView{ add_top_bar=&adw::HeaderBar{}, #[wrap(Some)] set_content=&adw::Clamp{ set_maximum_size: 1000, gtk::Box{ set_orientation: gtk::Orientation::Vertical, set_hexpand: true, set_vexpand: true, set_valign: gtk::Align::Center, set_halign: gtk::Align::Center, set_spacing: 10, gtk::Label{ add_css_class: "h1", set_text: "Rayshon Radar Project Tools" }, gtk::Button { set_icon_name: "add-filled", connect_clicked[sender] => move |_| { sender.input(AppMsg::NewProject); }, }, } } } }, new_page = adw::NavigationPage{ set_title: "New Project", set_tag: Some("new_page"), #[wrap(Some)] set_child=&adw::ToolbarView{ add_top_bar=&adw::HeaderBar{}, #[wrap(Some)] set_content=model.new_page_model.widget() -> &adw::NavigationSplitView {} } }, stack.add(&home_page), stack.add(&new_page), } menu! { main_menu: { "File" { "Open" => OpenAction, "Open Folder" => OpenAction, }, "Edit" { "New Layer" => OpenAction, "Undo" => OpenAction, "Redo" => OpenAction, }, "Plugins" { "Plugin1" => OpenAction, "Plugin2" => OpenAction, }, } } fn init( params: Self::Init, root: &Self::Root, sender: ComponentSender, ) -> ComponentParts { relm4_icons::initialize_icons(); let app = relm4::main_application(); let new_page_model = NewPageModel::builder() .launch(()) .forward(sender.input_sender(), |a| AppMsg::NewProject); let model = AppModel { new_page_model, tracker: 0, }; let new_project_page = model.new_page_model.widget(); let widgets = view_output!(); ComponentParts { model, widgets } } fn update_with_view( &mut self, widgets: &mut Self::Widgets, msg: Self::Input, _sender: ComponentSender, root: &Self::Root, ) { match msg { AppMsg::NewProject => { // widgets.stack.set_visible_child_name("new_page"); widgets.stack.push_by_tag("new_page"); } } } fn update_cmd( &mut self, message: Self::CommandOutput, sender: ComponentSender, root: &Self::Root, ) { match message { _ => { println!("test"); } } } }