From 20a19fd56eb6a79078d3de9e4a37bc0f25f7075f Mon Sep 17 00:00:00 2001 From: Sabrina Meindlhumer Date: Sun, 10 Sep 2023 12:22:52 +0200 Subject: [PATCH 1/4] library: Add Rust demo Map --- src/Library/demos/Map/code.rs | 102 +++++++++++++++++++++++++++++ src/langs/rust/template/Cargo.lock | 32 +++++++++ src/langs/rust/template/Cargo.toml | 5 ++ 3 files changed, 139 insertions(+) create mode 100644 src/Library/demos/Map/code.rs diff --git a/src/Library/demos/Map/code.rs b/src/Library/demos/Map/code.rs new file mode 100644 index 000000000..3091d0a0e --- /dev/null +++ b/src/Library/demos/Map/code.rs @@ -0,0 +1,102 @@ +use crate::workbench; +use glib::clone; +use gtk::glib; +use gtk::prelude::*; +use shumate::ffi::{ + SHUMATE_MAX_LATITUDE, SHUMATE_MAX_LONGITUDE, SHUMATE_MIN_LATITUDE, SHUMATE_MIN_LONGITUDE, +}; +use shumate::prelude::*; +use shumate::MAP_SOURCE_OSM_MAPNIK; + +pub fn main() { + let map_widget: shumate::SimpleMap = workbench::builder().object("map_widget").unwrap(); + let registry = shumate::MapSourceRegistry::with_defaults(); + + // Use OpenStreetMap as the source + let map_source = registry.by_id(MAP_SOURCE_OSM_MAPNIK); + let viewport = map_widget.viewport().unwrap(); + let map = map_widget.map().unwrap(); + + map_widget.set_map_source(map_source.as_ref()); + map.center_on(0., 0.); + + // Reference map source used by MarkerLayer + viewport.set_reference_map_source(map_source.as_ref()); + viewport.set_zoom_level(5.); + + let marker_layer: shumate::MarkerLayer = + shumate::MarkerLayer::new_full(&viewport, gtk::SelectionMode::Single); + + let marker: shumate::Marker = workbench::builder().object("marker").unwrap(); + marker.set_location(0., 0.); + marker_layer.add_marker(&marker); + map.add_layer(&marker_layer); + + let gesture = gtk::GestureClick::new(); + map_widget.add_controller(gesture.clone()); + + let button_marker: gtk::ToggleButton = workbench::builder().object("button_marker").unwrap(); + + gesture.connect_pressed(clone!(@strong viewport => move |_, n_press, x, y| { + if button_marker.is_active() { + let location = viewport.widget_coords_to_location(&map_widget, x, y); + marker.set_location(location.0, location.1); + println!("Marker placed at location {} {}", location.0, location.1) + } + })); + + let entry_latitude: gtk::Entry = workbench::builder().object("entry_latitude").unwrap(); + let entry_longitude: gtk::Entry = workbench::builder().object("entry_longitude").unwrap(); + let button_go: gtk::Button = workbench::builder().object("button_go").unwrap(); + + button_go.connect_clicked( + clone!(@strong entry_latitude, @strong entry_longitude, @strong map, @weak viewport => move |_| { + go_to_location(&entry_latitude, &entry_longitude, &map, &viewport); + }), + ); + + entry_latitude.connect_activate( + clone!(@weak entry_longitude, @weak map, @weak viewport => move |entry_latitude| { + go_to_location(entry_latitude, &entry_longitude, &map, &viewport); + }), + ); + + entry_longitude.connect_activate(move |entry_longitude| { + go_to_location(&entry_latitude, entry_longitude, &map, &viewport); + }); +} + +pub fn go_to_location( + entry_latitude: >k::Entry, + entry_longitude: >k::Entry, + map: &shumate::Map, + viewport: &shumate::Viewport, +) { + let latitude = entry_latitude.text().parse::().unwrap(); + let longitude = entry_longitude.text().parse::().unwrap(); + + if latitude.is_nan() || longitude.is_nan() { + println!("Please enter valid coordinates"); + return; + } + + if latitude > SHUMATE_MAX_LATITUDE || latitude < SHUMATE_MIN_LATITUDE { + println!( + "Latitudes must be between {} and {}!", + SHUMATE_MIN_LATITUDE, SHUMATE_MAX_LATITUDE + ); + return; + } + + if latitude > SHUMATE_MAX_LONGITUDE || latitude < SHUMATE_MIN_LONGITUDE { + println!( + "Longitudes must be between {} and {}!", + SHUMATE_MIN_LONGITUDE, SHUMATE_MAX_LONGITUDE + ); + return; + } + + viewport.set_zoom_level(5.); + map.go_to(latitude, longitude); +} + diff --git a/src/langs/rust/template/Cargo.lock b/src/langs/rust/template/Cargo.lock index 299354516..dc05a8788 100644 --- a/src/langs/rust/template/Cargo.lock +++ b/src/langs/rust/template/Cargo.lock @@ -356,6 +356,7 @@ dependencies = [ "gtk4", "libadwaita", "libc", + "libshumate", "rand", "url", ] @@ -1014,6 +1015,37 @@ version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +[[package]] +name = "libshumate" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b743d27ff75bbd10e97729e771fa706f0e2e80503f8b737c7ebd39abd6ed1b2d" +dependencies = [ + "gdk-pixbuf", + "gdk4", + "gio", + "glib", + "gtk4", + "libc", + "libshumate-sys", +] + +[[package]] +name = "libshumate-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d267a8d525823ad53986bde3b56ed6ef8c319227b33fc71028daed41ea5103" +dependencies = [ + "gdk-pixbuf-sys", + "gdk4-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk4-sys", + "libc", + "system-deps", +] + [[package]] name = "linux-raw-sys" version = "0.3.8" diff --git a/src/langs/rust/template/Cargo.toml b/src/langs/rust/template/Cargo.toml index bfc7e24da..1dbf8cb8c 100644 --- a/src/langs/rust/template/Cargo.toml +++ b/src/langs/rust/template/Cargo.toml @@ -25,6 +25,11 @@ features = ["v1_4", "gtk_v4_10"] version = "0.6.2" features = ["gtk4"] +[dependencies.shumate] +version = "0.4.1" +package = "libshumate" +features = ["v1_1"] + [lib] crate-type = ["cdylib"] path = "lib.rs" From 7669c2c40b691896e9965c2cb504ca812692b815 Mon Sep 17 00:00:00 2001 From: Sabrina Meindlhumer Date: Sun, 10 Sep 2023 12:25:40 +0200 Subject: [PATCH 2/4] remove unused variable --- src/Library/demos/Map/code.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Library/demos/Map/code.rs b/src/Library/demos/Map/code.rs index 3091d0a0e..fec9bc0f7 100644 --- a/src/Library/demos/Map/code.rs +++ b/src/Library/demos/Map/code.rs @@ -37,7 +37,7 @@ pub fn main() { let button_marker: gtk::ToggleButton = workbench::builder().object("button_marker").unwrap(); - gesture.connect_pressed(clone!(@strong viewport => move |_, n_press, x, y| { + gesture.connect_pressed(clone!(@strong viewport => move |_, _, x, y| { if button_marker.is_active() { let location = viewport.widget_coords_to_location(&map_widget, x, y); marker.set_location(location.0, location.1); From 9add35881de934dea3ee6dd28ae5ce034f621016 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 11 Sep 2023 20:32:09 +0200 Subject: [PATCH 3/4] Ensure Shumate type in Vala --- src/Previewer/meson.build | 3 ++- src/Previewer/previewer.vala | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Previewer/meson.build b/src/Previewer/meson.build index 1c0f9d083..3a759fc2e 100644 --- a/src/Previewer/meson.build +++ b/src/Previewer/meson.build @@ -1,6 +1,6 @@ executable('workbench-vala-previewer', 'previewer.vala', - dependencies: [ dependency('gio-2.0'), dependency('gmodule-2.0'), dependency('libadwaita-1') ], + dependencies: [ dependency('gio-2.0'), dependency('gmodule-2.0'), dependency('libadwaita-1'), dependency('shumate-1.0') ], # vala_args: [ '--gresourcesdir=' + meson.current_build_dir() ], install: true, ) @@ -11,3 +11,4 @@ executable('workbench-crasher', # vala_args: [ '--gresourcesdir=' + meson.current_build_dir() ], install: true, ) + diff --git a/src/Previewer/previewer.vala b/src/Previewer/previewer.vala index 1fe5d30f4..4667bbe0f 100644 --- a/src/Previewer/previewer.vala +++ b/src/Previewer/previewer.vala @@ -60,6 +60,7 @@ namespace Workbench { } public void update_ui (string content, string target_id, string original_id = "") { + typeof (Shumate.SimpleMap).ensure(); this.builder = new Gtk.Builder.from_string (content, content.length); var target = this.builder.get_object (target_id) as Gtk.Widget; @@ -118,7 +119,7 @@ namespace Workbench { var end = section.get_end_location(); this.css_parser_error(error.message, (int)start.lines, (int)start.line_chars, (int)end.lines, (int)end.line_chars); }); - this.css.load_from_data (content, -1); + this.css.load_from_data (content.data); Gtk.StyleContext.add_provider_for_display (Gdk.Display.get_default (), this.css , Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); } From 964f5081d6afc64c687408c4bb202d1f86167a13 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 11 Sep 2023 20:32:18 +0200 Subject: [PATCH 4/4] Add `gtk::init` --- src/Library/demos/Map/code.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Library/demos/Map/code.rs b/src/Library/demos/Map/code.rs index fec9bc0f7..91b7724e5 100644 --- a/src/Library/demos/Map/code.rs +++ b/src/Library/demos/Map/code.rs @@ -9,6 +9,7 @@ use shumate::prelude::*; use shumate::MAP_SOURCE_OSM_MAPNIK; pub fn main() { + gtk::init().unwrap(); let map_widget: shumate::SimpleMap = workbench::builder().object("map_widget").unwrap(); let registry = shumate::MapSourceRegistry::with_defaults();