diff --git a/Cargo.lock b/Cargo.lock index 063a8e3..5d85032 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -52,6 +61,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "async-trait" +version = "0.1.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +dependencies = [ + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 2.0.29", +] + [[package]] name = "atty" version = "0.2.14" @@ -69,6 +89,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64ct" version = "1.6.0" @@ -255,6 +290,8 @@ dependencies = [ "proj-sys", "proj5", "quadtree_rs", + "relm4", + "relm4-components", "shapefile", "svg", "thiserror", @@ -609,6 +646,27 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.28" @@ -616,6 +674,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -649,7 +708,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2 1.0.63", "quote 1.0.29", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] @@ -670,9 +729,13 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ + "futures-channel", "futures-core", + "futures-io", "futures-macro", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -763,7 +826,7 @@ version = "0.1.0" dependencies = [ "proc-macro2 1.0.63", "quote 1.0.29", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] @@ -800,6 +863,12 @@ dependencies = [ "weezl", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "gio" version = "0.17.10" @@ -1459,6 +1528,15 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -1569,7 +1647,7 @@ dependencies = [ "pest_meta", "proc-macro2 1.0.63", "quote 1.0.29", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] @@ -1600,7 +1678,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2 1.0.63", "quote 1.0.29", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] @@ -1837,6 +1915,45 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +[[package]] +name = "relm4" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "813306b9bc23e2f1e719801eb9aa59e4c2f96830be951a6168ad0c53363c6196" +dependencies = [ + "async-trait", + "flume", + "fragile", + "futures", + "gtk4", + "once_cell", + "relm4-macros", + "tokio", + "tracing", +] + +[[package]] +name = "relm4-components" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd02dd4c31b952cedb6f3ef200438963b1c4b7889f2ce760c607a1dc7f513e3" +dependencies = [ + "once_cell", + "relm4", + "tracker", +] + +[[package]] +name = "relm4-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad8d946cf33654b1df3e2e7d1c4952a154f008368cdda03a99c1840a6fcab3b" +dependencies = [ + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 2.0.29", +] + [[package]] name = "rgb" version = "0.8.36" @@ -1846,6 +1963,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -1912,7 +2035,7 @@ checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2 1.0.63", "quote 1.0.29", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] @@ -2060,9 +2183,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.22" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2 1.0.63", "quote 1.0.29", @@ -2134,7 +2257,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2 1.0.63", "quote 1.0.29", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] @@ -2164,6 +2287,18 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +[[package]] +name = "tokio" +version = "1.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +dependencies = [ + "autocfg", + "backtrace", + "num_cpus", + "pin-project-lite", +] + [[package]] name = "toml" version = "0.7.5" @@ -2198,6 +2333,58 @@ dependencies = [ "winnow", ] +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 2.0.29", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracker" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff9636d15e370187f6bf55b79ce62ebf4221998bc0ba1774d7fa208b007f6bf8" +dependencies = [ + "tracker-macros", +] + +[[package]] +name = "tracker-macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca029746fbe0efda3298205de77bf759d7fef23ac97902641e0b49a623b0455f" +dependencies = [ + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 2.0.29", +] + [[package]] name = "ttf-parser" version = "0.18.1" @@ -2315,7 +2502,7 @@ dependencies = [ "once_cell", "proc-macro2 1.0.63", "quote 1.0.29", - "syn 2.0.22", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -2337,7 +2524,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2 1.0.63", "quote 1.0.29", - "syn 2.0.22", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/Cargo.toml b/Cargo.toml index aec73d6..ae005d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,9 @@ proj = "0.27.2" image = "0.24.7" anyhow = "1.0.72" proj5 = { version = "0.1.7", features = ["multithreading"] } +relm4 = "0.6.1" +relm4-components = "0.6.1" + [build-dependencies] diff --git a/src/components/app.rs b/src/components/app.rs new file mode 100644 index 0000000..949b2f6 --- /dev/null +++ b/src/components/app.rs @@ -0,0 +1,61 @@ +use super::control_panel::ControlPanelModel; +use gtk::prelude::{ + ApplicationExt, ButtonExt, DialogExt, GtkWindowExt, ToggleButtonExt, WidgetExt, +}; +use relm4::*; + +#[derive(Debug)] +pub enum AppMode { + View, + Edit, + Export, +} + +#[derive(Debug)] +pub enum AppMsg { + SetMode(AppMode), + CloseRequest, + Close, +} + +pub struct AppModel { + mode: AppMode, + control: Controller, +} + +#[relm4::component(pub)] +impl SimpleComponent for AppModel { + type Init = AppMode; + type Input = AppMsg; + type Output = (); + + view! { + main_window = gtk::Window { + set_default_width: 500, + set_default_height: 250, + set_titlebar: Some(>k::HeaderBar::new()), + connect_close_request[sender] => move |_| { + sender.input(AppMsg::CloseRequest); + gtk::Inhibit(true) + } + } + } + + fn init( + params: Self::Init, + root: &Self::Root, + sender: ComponentSender, + ) -> ComponentParts { + let control = ControlPanelModel::builder() + .launch(0) + .forward(sender.input_sender(), |msg| AppMsg::Close); + let model = AppModel { + mode: AppMode::View, + control: control, + }; + let widgets = view_output!(); + ComponentParts { model, widgets } + } + + fn update(&mut self, msg: Self::Input, _sender: ComponentSender) {} +} diff --git a/src/components/control_panel.rs b/src/components/control_panel.rs new file mode 100644 index 0000000..33f2311 --- /dev/null +++ b/src/components/control_panel.rs @@ -0,0 +1,68 @@ +use gtk::prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, ToggleButtonExt}; +use relm4::*; + +pub struct ControlPanelModel; + +#[derive(Debug)] +pub enum HeaderOutput { + View, + Edit, + Export, +} + +#[relm4::component(pub)] +impl SimpleComponent for ControlPanelModel { + type Init = i8; + type Output = HeaderOutput; + type Input = (); + + view! { + #[root] + gtk::HeaderBar { + #[wrap(Some)] + set_title_widget = >k::Box { + #[name = "group"] + gtk::ToggleButton { + set_label: "View", + set_active: true, + connect_toggled[sender] => move |btn| { + if btn.is_active() { + sender.output(HeaderOutput::View).unwrap() + } + }, + }, + gtk::ToggleButton { + set_label: "Edit", + set_group: Some(&group), + connect_toggled[sender] => move |btn| { + if btn.is_active() { + sender.output(HeaderOutput::Edit).unwrap() + } + }, + }, + gtk::ToggleButton { + set_label: "Export", + set_group: Some(&group), + connect_toggled[sender] => move |btn| { + if btn.is_active() { + sender.output(HeaderOutput::Export).unwrap() + } + }, + }, + } + } + } + + fn init( + init: Self::Init, + root: &Self::Root, + sender: relm4::ComponentSender, + ) -> relm4::ComponentParts { + let model = ControlPanelModel {}; + // Insert the macro code generation here + let widgets = view_output!(); + + ComponentParts { model, widgets } + } + fn update(&mut self, msg: Self::Input, _sender: ComponentSender) {} +} diff --git a/src/components/mod.rs b/src/components/mod.rs new file mode 100644 index 0000000..8e237de --- /dev/null +++ b/src/components/mod.rs @@ -0,0 +1,2 @@ +pub mod app; +mod control_panel; diff --git a/src/main.rs b/src/main.rs index 1289855..ba2b8cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,14 @@ +#![allow(deprecated)] + use coords::proj::Mercator; use coords::Mapper; use data::{Npz, Radar2d}; use femtovg::{Color, Paint}; use gtk::prelude::*; use gtk::{gio, glib, Application, ApplicationWindow}; +use relm4::RelmApp; use std::ptr; +mod components; mod coords; mod data; mod errors; @@ -12,12 +16,13 @@ mod monitor; mod pipeline; mod render; mod window; +use components::app::{AppMode, AppModel}; use monitor::Monitor; use render::{BackgroundConfig, BackgroundWidget, ForegroundConfig, ForegroundWidget, Render}; const APP_ID: &str = "org.gtk_rs.HelloWorld2"; -fn main() -> glib::ExitCode { +fn main() { // Load GL pointers from epoxy (GL context management library used by GTK). { #[cfg(target_os = "macos")] @@ -29,11 +34,10 @@ fn main() -> glib::ExitCode { .or_else(|_| libloading::os::windows::Library::open_already_loaded("epoxy-0.dll")) .unwrap(); - gio::resources_register_include!("p.gresource") - .expect("Failed to register resources."); + gio::resources_register_include!("p.gresource").expect("Failed to register resources."); epoxy::load_with(|name| { - unsafe { library.get::<>(name.as_bytes()) } + unsafe { library.get(name.as_bytes()) } .map(|symbol| *symbol) .unwrap_or(ptr::null()) }); @@ -41,11 +45,14 @@ fn main() -> glib::ExitCode { // gio::resources_register_include!("monitor.gresource").expect("Failed to register resources"); // Create a new application - let app = Application::builder().application_id(APP_ID).build(); - // Connect to "activate" signal of `app` - app.connect_activate(build_ui); - // Run the application - app.run() + // let app = Application::builder().application_id(APP_ID).build(); + // // Connect to "activate" signal of `app` + // app.connect_activate(build_ui); + // // Run the application + // app.run() + + let relm = RelmApp::new(APP_ID); + relm.run::(AppMode::Edit); } fn build_ui(app: &Application) { @@ -65,7 +72,7 @@ fn build_ui(app: &Application) { let foreground_widget = ForegroundWidget::new(foreground_config); let render = Render::new(background_widget, foreground_widget); - let path = "/Users/tsuki/projects/radar-g/test2.npz"; + let path = "/Users/ruomu/projects/cinrad_g/test2.npz"; let data = Radar2d::::load(path, Npz).unwrap(); let projection = Mercator::new(); diff --git a/test.png b/test.png deleted file mode 100644 index 9a20d43..0000000 Binary files a/test.png and /dev/null differ diff --git a/test.tiff b/test.tiff deleted file mode 100644 index 3018ef2..0000000 Binary files a/test.tiff and /dev/null differ