179 lines
5.0 KiB
Rust
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");
|
|
}
|
|
}
|
|
}
|
|
}
|