diff --git a/Cargo.lock b/Cargo.lock index 5d85032..19d2f45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -282,6 +282,7 @@ dependencies = [ "glue", "gtk4", "image", + "libadwaita", "libloading 0.8.0", "ndarray", "npyz", @@ -1269,6 +1270,39 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +[[package]] +name = "libadwaita" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab9c0843f9f23ff25634df2743690c3a1faffe0a190e60c490878517eb81abf" +dependencies = [ + "bitflags 1.3.2", + "gdk-pixbuf", + "gdk4", + "gio", + "glib", + "gtk4", + "libadwaita-sys", + "libc", + "pango", +] + +[[package]] +name = "libadwaita-sys" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4231cb2499a9f0c4cdfa4885414b33e39901ddcac61150bc0bb4ff8a57ede404" +dependencies = [ + "gdk4-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk4-sys", + "libc", + "pango-sys", + "system-deps", +] + [[package]] name = "libc" version = "0.2.147" diff --git a/Cargo.toml b/Cargo.toml index ae005d3..600215f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,3 +42,7 @@ glib-build-tools = "0.17.0" [dependencies.geo-macros] path = "geo-macros" + +[dependencies.adw] +package = "libadwaita" +version = "*" \ No newline at end of file diff --git a/src/components/app.rs b/src/components/app.rs index 949b2f6..5bdb580 100644 --- a/src/components/app.rs +++ b/src/components/app.rs @@ -1,7 +1,7 @@ -use super::control_panel::ControlPanelModel; -use gtk::prelude::{ +use super::{control_panel::ControlPanelModel, render_panel::RenderPanelModel}; +use gtk::{prelude::{ ApplicationExt, ButtonExt, DialogExt, GtkWindowExt, ToggleButtonExt, WidgetExt, -}; +}, traits::OrientableExt}; use relm4::*; #[derive(Debug)] @@ -21,6 +21,7 @@ pub enum AppMsg { pub struct AppModel { mode: AppMode, control: Controller, + render: Controller, } #[relm4::component(pub)] @@ -31,9 +32,15 @@ impl SimpleComponent for AppModel { view! { main_window = gtk::Window { - set_default_width: 500, - set_default_height: 250, + set_default_width: 1000, + set_default_height: 700, set_titlebar: Some(>k::HeaderBar::new()), + gtk::Box{ + set_orientation: gtk::Orientation::Vertical, + set_valign:gtk::Align::Fill, + model.control.widget(), + model.render.widget(), + }, connect_close_request[sender] => move |_| { sender.input(AppMsg::CloseRequest); gtk::Inhibit(true) @@ -49,11 +56,19 @@ impl SimpleComponent for AppModel { let control = ControlPanelModel::builder() .launch(0) .forward(sender.input_sender(), |msg| AppMsg::Close); + + let render = RenderPanelModel::builder() + .launch(0) + .forward(sender.input_sender(), |a| AppMsg::Close); + let model = AppModel { mode: AppMode::View, control: control, + render: render, }; + let widgets = view_output!(); + ComponentParts { model, widgets } } diff --git a/src/components/control_panel.rs b/src/components/control_panel.rs index 33f2311..a69e931 100644 --- a/src/components/control_panel.rs +++ b/src/components/control_panel.rs @@ -1,3 +1,4 @@ +use adw::prelude::WidgetExt; use gtk::prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, ToggleButtonExt}; use relm4::*; @@ -18,38 +19,19 @@ impl SimpleComponent for ControlPanelModel { 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() - } - }, - }, - } + gtk::Box { + set_orientation: gtk::Orientation::Horizontal, + set_spacing: 10, + set_size_request: (100, 150), + gtk::Button { + set_label: "View", + }, + gtk::Button { + set_label: "Edit", + }, + gtk::Button { + set_label: "Export", + }, } } diff --git a/src/components/mod.rs b/src/components/mod.rs index 8e237de..d07d9e1 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -1,2 +1,3 @@ pub mod app; mod control_panel; +mod render_panel; \ No newline at end of file diff --git a/src/components/render_panel.rs b/src/components/render_panel.rs new file mode 100644 index 0000000..cc76392 --- /dev/null +++ b/src/components/render_panel.rs @@ -0,0 +1,40 @@ +use crate::monitor::Monitor; +use crate::coords::proj::Mercator; +use crate::render::{ + BackgroundConfig, BackgroundWidget, ForegroundConfig, ForegroundWidget, Render, +}; +use gtk::prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, ToggleButtonExt}; +use relm4::*; + +pub struct RenderPanelModel; + +#[relm4::component(pub)] +impl SimpleComponent for RenderPanelModel { + type Init = i8; + type Output = (); + type Input = (); + + view! { + #[root] + Monitor::new( + Render::new( + BackgroundWidget::new(BackgroundConfig{ show_lat_lines: true, show_lon_lines: true, ..Default::default() }), + ForegroundWidget::new(ForegroundConfig::default()), + Some(Mercator::new().into()) + ) + ), + } + + fn init( + init: Self::Init, + root: &Self::Root, + sender: relm4::ComponentSender, + ) -> relm4::ComponentParts { + let model = RenderPanelModel {}; + // 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/coords/mapper.rs b/src/coords/mapper.rs index 8770503..1c0e71f 100644 --- a/src/coords/mapper.rs +++ b/src/coords/mapper.rs @@ -10,7 +10,7 @@ pub struct Mapper { } impl From for Mapper { fn from(proj: Proj) -> Self { - let default_range: (Range, Range) = ((-180.0..180.0).into(), (-90.0..90.0).into()); + let default_range: (Range, Range) = ((-180.0..180.0).into(), (-81.0..81.0).into()); let bounds = Self::bound(&proj, default_range.clone()).unwrap(); Self { proj: proj, @@ -53,14 +53,16 @@ impl Mapper { Ok((x, y)) } - pub fn set_lon_range(&mut self, range: std::ops::Range) { + pub fn set_lon_range(&mut self, range: std::ops::Range)->&mut Self { self.range.0 = range.into(); self.bounds = Self::bound(&self.proj, self.range.clone()).unwrap(); + self } - pub fn set_lat_range(&mut self, range: std::ops::Range) { + pub fn set_lat_range(&mut self, range: std::ops::Range)->&mut Self { self.range.1 = range.into(); self.bounds = Self::bound(&self.proj, self.range.clone()).unwrap(); + self } fn bound(proj: &Proj, range: (Range, Range)) -> Result<(f64, f64, f64, f64), ProjError> { diff --git a/src/main.rs b/src/main.rs index ba2b8cf..84594da 100644 --- a/src/main.rs +++ b/src/main.rs @@ -70,7 +70,7 @@ fn build_ui(app: &Application) { let background_widget = BackgroundWidget::new(background_config); let foreground_widget = ForegroundWidget::new(foreground_config); - let render = Render::new(background_widget, foreground_widget); + let render = Render::new(background_widget, foreground_widget,None); let path = "/Users/ruomu/projects/cinrad_g/test2.npz"; let data = Radar2d::::load(path, Npz).unwrap(); diff --git a/src/monitor/mod.rs b/src/monitor/mod.rs index 18a0a60..ce85f09 100644 --- a/src/monitor/mod.rs +++ b/src/monitor/mod.rs @@ -44,6 +44,7 @@ impl Monitor { render.add_controller(pointer_location_detecture); render.add_controller(scale_detecture); render.set_hexpand(true); + render.set_vexpand(true); render.set_parent(&this); this.imp().renderer.replace(render); diff --git a/src/render/background/mod.rs b/src/render/background/mod.rs index 6a89465..a0049ba 100644 --- a/src/render/background/mod.rs +++ b/src/render/background/mod.rs @@ -74,7 +74,7 @@ impl BackgroundWidget { if config.show_lat_lines { config.lat_lines.iter().for_each(|lat| { let mut paint = Paint::color(Color::white()); - paint.set_font_size(35.0); + paint.set_font_size(25.0); paint.set_line_width(1.0); let text_location = mapper.map((left, *lat)).unwrap(); @@ -90,7 +90,7 @@ impl BackgroundWidget { if config.show_lon_lines { config.lon_lines.iter().for_each(|lon| { let mut paint = Paint::color(Color::white()); - paint.set_font_size(35.0); + paint.set_font_size(25.0); paint.set_line_width(1.0); let text_location = mapper.map((*lon, top + 0.1)).unwrap(); @@ -136,11 +136,13 @@ impl BackgroundWidget { } pub fn set_lat_lines(&self, lat_lines: Vec) { + println!("set lat lines {:?}", lat_lines); let imp = self.imp(); imp.config.borrow_mut().lat_lines = lat_lines; } pub fn set_lon_lines(&self, lon_lines: Vec) { + println!("set lon lines {:?}", lon_lines); let imp = self.imp(); imp.config.borrow_mut().lon_lines = lon_lines; } diff --git a/src/render/imp.rs b/src/render/imp.rs index 59bdeec..75fc6a4 100644 --- a/src/render/imp.rs +++ b/src/render/imp.rs @@ -104,11 +104,11 @@ impl GLAreaImpl for Render { { let background_widget = self.background.borrow_mut(); - background_widget.set_lat_lines(lat_range.key_points(5)); + background_widget.set_lat_lines(lat_range.key_points(9)); } { let background_widget = self.background.borrow_mut(); - background_widget.set_lon_lines(lon_range.key_points(10)); + background_widget.set_lon_lines(lon_range.key_points(20)); } self.foreground diff --git a/src/render/mod.rs b/src/render/mod.rs index ddfbb6a..3dd9f2c 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -27,12 +27,12 @@ glib::wrapper! { impl Default for Render { fn default() -> Self { - Self::new(BackgroundWidget::default(), ForegroundWidget::default()) + Self::new(BackgroundWidget::default(), ForegroundWidget::default(),None) } } impl Render { - pub fn new(background: BackgroundWidget, foreground: ForegroundWidget) -> Self { + pub fn new(background: BackgroundWidget, foreground: ForegroundWidget,mapper: Option) -> Self { let this: Self = glib::Object::new(); this.imp().background.replace(background); this.imp().foreground.replace(foreground); @@ -40,6 +40,9 @@ impl Render { let mut configs = this.imp().config.borrow_mut(); configs.scale = 1.0; } + if let Some(mapper) = mapper { + this.set_mapper(mapper); + } this }