commit 9b1491cebb7ee8335dde93105a225432880be39f Author: Tsuki Date: Wed Feb 21 20:48:51 2024 +0800 init diff --git a/src/components/app.rs b/src/components/app.rs new file mode 100644 index 0000000..b91bd49 --- /dev/null +++ b/src/components/app.rs @@ -0,0 +1,157 @@ +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}, +}; + +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 |_| { + 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"] + gtk::Stack{ + set_transition_type:gtk::StackTransitionType::SlideUp, + set_transition_duration:300, + set_hexpand:true, + set_vexpand:true, + }, + } + } + }, + home_page = 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{ + set_text: "Rayshon Radar Project Tools" + }, + gtk::Button { + set_icon_name: "add-filled", + connect_clicked[sender] => move |_| { + sender.input(AppMsg::NewProject); + }, + }, + } + }, + home_stack_page = stack.add_titled(&home_page, Some("home"), "Home") -> gtk::StackPage{}, + new_project_page = stack.add_titled(model.new_page_model.widget(),Some("new_page"), "New") -> gtk::StackPage{}, + } + + 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"); + } + } + } + + fn update_cmd( + &mut self, + message: Self::CommandOutput, + sender: ComponentSender, + root: &Self::Root, + ) { + match message { + _ => { + println!("test"); + } + } + } +} diff --git a/src/components/history_list.rs b/src/components/history_list.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/components/mod.rs b/src/components/mod.rs new file mode 100644 index 0000000..01513b7 --- /dev/null +++ b/src/components/mod.rs @@ -0,0 +1,8 @@ +mod app; +mod history_list; +mod new_project; +mod setting_item; + +pub use app::*; +pub use new_project::*; +pub use setting_item::*; \ No newline at end of file diff --git a/src/components/new_project.rs b/src/components/new_project.rs new file mode 100644 index 0000000..ceaf8cc --- /dev/null +++ b/src/components/new_project.rs @@ -0,0 +1,78 @@ +use adw::prelude::*; +use gtk::glib::clone; +use gtk::prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, ToggleButtonExt}; +use relm4::{prelude::*, view}; +use std::path::PathBuf; +use std::rc::Rc; +use gtk::ResponseType::No; +use gtk::Widget; +use relm4::factory::FactoryVecDeque; +use crate::components::setting_item::{SettingItem, SettingType}; + +#[derive(Debug)] +pub struct NewPageModel { +} + +#[relm4::component(pub)] +impl SimpleComponent for NewPageModel { + type Init = (); + type Output = (); + type Input = (); + + view! { + #[root] + adw::NavigationSplitView{ + set_hexpand: true, + set_vexpand: true, + #[wrap(Some)] + set_sidebar = &adw::NavigationPage{ + #[wrap(Some)] + set_child=>k::StackSidebar{ + set_stack: &stack + } + }, + #[wrap(Some)] + set_content = &adw::NavigationPage{ + #[wrap(Some)] + #[name="stack"] + set_child=>k::Stack { + set_hexpand: true, + set_vexpand: true + } + } + }, + + common_setting = gtk::Box{ + set_orientation: gtk::Orientation::Vertical, + adw::PreferencesPage{ + set_title: "Common", + add=&adw::PreferencesGroup{ + #[iterate] + add:widgets.iter() + } + } + }, + algorithm_setting = gtk::Box{}, + stack.add_titled(&common_setting, Some("Common"), "Common"), + stack.add_titled(&algorithm_setting, Some("Algorithm"), "Algorithm"), + } + fn init( + init: Self::Init, + root: &Self::Root, + sender: relm4::ComponentSender, + ) -> relm4::ComponentParts { + let mut common_settings = Vec::new(); + common_settings.push(SettingItem::new("Name".to_string(), SettingType::Entry(None, None))); + common_settings.push(SettingItem::new("Name".to_string(), SettingType::Entry(None, None))); + common_settings.push(SettingItem::new("Name".to_string(), SettingType::Entry(None, None))); + let widgets:Vec<_> = common_settings.iter_mut().map(|setting: &mut SettingItem| { + setting.to_widget() + }).collect(); + + let model = NewPageModel {}; + + let widgets = view_output!(); + ComponentParts { model, widgets } + } + fn update(&mut self, msg: Self::Input, _sender: ComponentSender) {} +} diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..b107544 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,32 @@ +use std::collections::HashMap; +use crate::components::{SettingItem, SettingType}; + +#[derive(Clone, Debug)] +pub struct CommonConfig{ + pub name: String, + pub version: String, + pub radars: Vec, + pub algorithms: Vec, +} + +#[derive( Clone, Debug)] +pub struct RadarConfig{ + pub name: String, + pub _type: String, + loc: [f64;3], + az_beam_width: f64, + el_beam_width: f64, + azs_method: usize, + els_method: usize, + r_limit: f64, +} + +#[derive( Clone, Debug)] +pub struct AlgorithmConfig { + name: String, + version: String, + info: HashMap +} + +pub fn default_common_items() { +} \ No newline at end of file