add relm4

This commit is contained in:
sleptworld 2023-08-18 08:39:29 +08:00
parent 4ec48fc21c
commit 7a87a50764
8 changed files with 348 additions and 20 deletions

207
Cargo.lock generated
View File

@ -2,6 +2,15 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "addr2line"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3"
dependencies = [
"gimli",
]
[[package]] [[package]]
name = "adler" name = "adler"
version = "1.0.2" version = "1.0.2"
@ -52,6 +61,17 @@ dependencies = [
"num-traits", "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]] [[package]]
name = "atty" name = "atty"
version = "0.2.14" version = "0.2.14"
@ -69,6 +89,21 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 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]] [[package]]
name = "base64ct" name = "base64ct"
version = "1.6.0" version = "1.6.0"
@ -255,6 +290,8 @@ dependencies = [
"proj-sys", "proj-sys",
"proj5", "proj5",
"quadtree_rs", "quadtree_rs",
"relm4",
"relm4-components",
"shapefile", "shapefile",
"svg", "svg",
"thiserror", "thiserror",
@ -609,6 +646,27 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 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]] [[package]]
name = "futures-channel" name = "futures-channel"
version = "0.3.28" version = "0.3.28"
@ -616,6 +674,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-sink",
] ]
[[package]] [[package]]
@ -649,7 +708,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
dependencies = [ dependencies = [
"proc-macro2 1.0.63", "proc-macro2 1.0.63",
"quote 1.0.29", "quote 1.0.29",
"syn 2.0.22", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -670,9 +729,13 @@ version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
dependencies = [ dependencies = [
"futures-channel",
"futures-core", "futures-core",
"futures-io",
"futures-macro", "futures-macro",
"futures-sink",
"futures-task", "futures-task",
"memchr",
"pin-project-lite", "pin-project-lite",
"pin-utils", "pin-utils",
"slab", "slab",
@ -763,7 +826,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"proc-macro2 1.0.63", "proc-macro2 1.0.63",
"quote 1.0.29", "quote 1.0.29",
"syn 2.0.22", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -800,6 +863,12 @@ dependencies = [
"weezl", "weezl",
] ]
[[package]]
name = "gimli"
version = "0.27.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
[[package]] [[package]]
name = "gio" name = "gio"
version = "0.17.10" version = "0.17.10"
@ -1459,6 +1528,15 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "object"
version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.18.0" version = "1.18.0"
@ -1569,7 +1647,7 @@ dependencies = [
"pest_meta", "pest_meta",
"proc-macro2 1.0.63", "proc-macro2 1.0.63",
"quote 1.0.29", "quote 1.0.29",
"syn 2.0.22", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -1600,7 +1678,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
dependencies = [ dependencies = [
"proc-macro2 1.0.63", "proc-macro2 1.0.63",
"quote 1.0.29", "quote 1.0.29",
"syn 2.0.22", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -1837,6 +1915,45 @@ version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" 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]] [[package]]
name = "rgb" name = "rgb"
version = "0.8.36" version = "0.8.36"
@ -1846,6 +1963,12 @@ dependencies = [
"bytemuck", "bytemuck",
] ]
[[package]]
name = "rustc-demangle"
version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]] [[package]]
name = "rustc-hash" name = "rustc-hash"
version = "1.1.0" version = "1.1.0"
@ -1912,7 +2035,7 @@ checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68"
dependencies = [ dependencies = [
"proc-macro2 1.0.63", "proc-macro2 1.0.63",
"quote 1.0.29", "quote 1.0.29",
"syn 2.0.22", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -2060,9 +2183,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.22" version = "2.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
dependencies = [ dependencies = [
"proc-macro2 1.0.63", "proc-macro2 1.0.63",
"quote 1.0.29", "quote 1.0.29",
@ -2134,7 +2257,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [ dependencies = [
"proc-macro2 1.0.63", "proc-macro2 1.0.63",
"quote 1.0.29", "quote 1.0.29",
"syn 2.0.22", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -2164,6 +2287,18 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" 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]] [[package]]
name = "toml" name = "toml"
version = "0.7.5" version = "0.7.5"
@ -2198,6 +2333,58 @@ dependencies = [
"winnow", "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]] [[package]]
name = "ttf-parser" name = "ttf-parser"
version = "0.18.1" version = "0.18.1"
@ -2315,7 +2502,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2 1.0.63", "proc-macro2 1.0.63",
"quote 1.0.29", "quote 1.0.29",
"syn 2.0.22", "syn 2.0.29",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -2337,7 +2524,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
dependencies = [ dependencies = [
"proc-macro2 1.0.63", "proc-macro2 1.0.63",
"quote 1.0.29", "quote 1.0.29",
"syn 2.0.22", "syn 2.0.29",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]

View File

@ -32,6 +32,9 @@ proj = "0.27.2"
image = "0.24.7" image = "0.24.7"
anyhow = "1.0.72" anyhow = "1.0.72"
proj5 = { version = "0.1.7", features = ["multithreading"] } proj5 = { version = "0.1.7", features = ["multithreading"] }
relm4 = "0.6.1"
relm4-components = "0.6.1"
[build-dependencies] [build-dependencies]

61
src/components/app.rs Normal file
View File

@ -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<ControlPanelModel>,
}
#[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(&gtk::HeaderBar::new()),
connect_close_request[sender] => move |_| {
sender.input(AppMsg::CloseRequest);
gtk::Inhibit(true)
}
}
}
fn init(
params: Self::Init,
root: &Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
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<Self>) {}
}

View File

@ -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 = &gtk::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<Self>,
) -> relm4::ComponentParts<Self> {
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<Self>) {}
}

2
src/components/mod.rs Normal file
View File

@ -0,0 +1,2 @@
pub mod app;
mod control_panel;

View File

@ -1,10 +1,14 @@
#![allow(deprecated)]
use coords::proj::Mercator; use coords::proj::Mercator;
use coords::Mapper; use coords::Mapper;
use data::{Npz, Radar2d}; use data::{Npz, Radar2d};
use femtovg::{Color, Paint}; use femtovg::{Color, Paint};
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{gio, glib, Application, ApplicationWindow}; use gtk::{gio, glib, Application, ApplicationWindow};
use relm4::RelmApp;
use std::ptr; use std::ptr;
mod components;
mod coords; mod coords;
mod data; mod data;
mod errors; mod errors;
@ -12,12 +16,13 @@ mod monitor;
mod pipeline; mod pipeline;
mod render; mod render;
mod window; mod window;
use components::app::{AppMode, AppModel};
use monitor::Monitor; use monitor::Monitor;
use render::{BackgroundConfig, BackgroundWidget, ForegroundConfig, ForegroundWidget, Render}; use render::{BackgroundConfig, BackgroundWidget, ForegroundConfig, ForegroundWidget, Render};
const APP_ID: &str = "org.gtk_rs.HelloWorld2"; 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). // Load GL pointers from epoxy (GL context management library used by GTK).
{ {
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
@ -29,11 +34,10 @@ fn main() -> glib::ExitCode {
.or_else(|_| libloading::os::windows::Library::open_already_loaded("epoxy-0.dll")) .or_else(|_| libloading::os::windows::Library::open_already_loaded("epoxy-0.dll"))
.unwrap(); .unwrap();
gio::resources_register_include!("p.gresource") gio::resources_register_include!("p.gresource").expect("Failed to register resources.");
.expect("Failed to register resources.");
epoxy::load_with(|name| { epoxy::load_with(|name| {
unsafe { library.get::<>(name.as_bytes()) } unsafe { library.get(name.as_bytes()) }
.map(|symbol| *symbol) .map(|symbol| *symbol)
.unwrap_or(ptr::null()) .unwrap_or(ptr::null())
}); });
@ -41,11 +45,14 @@ fn main() -> glib::ExitCode {
// gio::resources_register_include!("monitor.gresource").expect("Failed to register resources"); // gio::resources_register_include!("monitor.gresource").expect("Failed to register resources");
// Create a new application // Create a new application
let app = Application::builder().application_id(APP_ID).build(); // let app = Application::builder().application_id(APP_ID).build();
// Connect to "activate" signal of `app` // // Connect to "activate" signal of `app`
app.connect_activate(build_ui); // app.connect_activate(build_ui);
// Run the application // // Run the application
app.run() // app.run()
let relm = RelmApp::new(APP_ID);
relm.run::<AppModel>(AppMode::Edit);
} }
fn build_ui(app: &Application) { fn build_ui(app: &Application) {
@ -65,7 +72,7 @@ fn build_ui(app: &Application) {
let foreground_widget = ForegroundWidget::new(foreground_config); let foreground_widget = ForegroundWidget::new(foreground_config);
let render = Render::new(background_widget, foreground_widget); 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::<i8>::load(path, Npz).unwrap(); let data = Radar2d::<i8>::load(path, Npz).unwrap();
let projection = Mercator::new(); let projection = Mercator::new();

BIN
test.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

BIN
test.tiff

Binary file not shown.