rsproject/src/components/app.rs
2024-02-25 10:56:24 +08:00

179 lines
5.0 KiB
Rust

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<NewPageModel>,
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<Self>,
) -> ComponentParts<Self> {
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<Self>,
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<Self>,
root: &Self::Root,
) {
match message {
_ => {
println!("test");
}
}
}
}