diff --git a/Cargo.lock b/Cargo.lock index fed1f63..f0c060d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -240,6 +240,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64ct" version = "1.6.0" @@ -505,6 +511,7 @@ dependencies = [ "glue", "gtk4", "image", + "imgref", "indexmap", "lazy_static", "libadwaita", @@ -524,10 +531,13 @@ dependencies = [ "relm4", "relm4-components", "relm4-icons", + "reqwest", + "rgb", "rstar", "serde", "serde_json", "shapefile", + "slippy-map-tiles", "smallvec", "sorted-vec", "surfman", @@ -976,6 +986,15 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + [[package]] name = "env_logger" version = "0.9.3" @@ -1007,6 +1026,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "etws_loader" version = "0.1.0" @@ -1050,6 +1079,12 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + [[package]] name = "fdeflate" version = "0.3.4" @@ -1183,6 +1218,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "fragile" version = "2.0.0" @@ -1766,6 +1810,25 @@ dependencies = [ "zvariant", ] +[[package]] +name = "h2" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.2.1" @@ -1833,12 +1896,83 @@ dependencies = [ "digest", ] +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "iana-time-zone" version = "0.1.59" @@ -1868,6 +2002,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "image" version = "0.24.7" @@ -1889,9 +2033,9 @@ dependencies = [ [[package]] name = "imgref" -version = "1.9.4" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cf49df1085dcfb171460e4592597b84abe50d900fb83efb6e41b20fefd6c2c" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" [[package]] name = "indexmap" @@ -1936,6 +2080,12 @@ dependencies = [ "libc", ] +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "itertools" version = "0.10.5" @@ -2064,9 +2214,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" @@ -2116,6 +2266,12 @@ dependencies = [ "redox_syscall 0.4.1", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + [[package]] name = "lock_api" version = "0.4.10" @@ -2222,6 +2378,12 @@ dependencies = [ "objc", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2240,9 +2402,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", @@ -2259,6 +2421,24 @@ dependencies = [ "getrandom", ] +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndarray" version = "0.15.6" @@ -2622,6 +2802,50 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.3.3", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2 1.0.76", + "quote 1.0.35", + "syn 2.0.48", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -3237,10 +3461,50 @@ dependencies = [ ] [[package]] -name = "rgb" -version = "0.8.36" +name = "reqwest" +version = "0.11.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20ec2d3e3fc7a92ced357df9cebd5a10b6fb2aa1ee797bf7e9ce2f17dffc8f59" +checksum = "0eea5a9eb898d3783f17c6407670e3592fd174cb81a10e51d4c37f49450b9946" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rgb" +version = "0.8.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" dependencies = [ "bytemuck", ] @@ -3283,6 +3547,28 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.38.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" +dependencies = [ + "bitflags 2.3.3", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -3326,6 +3612,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -3351,6 +3646,29 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.17" @@ -3397,6 +3715,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "servo-display-link" version = "0.2.0" @@ -3468,6 +3798,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -3483,6 +3822,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "slippy-map-tiles" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca0bb81e6365882ec0e68a114f08c1c126d1fca2faafee1c82d2d95b0f07099" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "slotmap" version = "1.0.6" @@ -3517,6 +3866,16 @@ dependencies = [ "wayland-protocols", ] +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "sorted-vec" version = "0.8.3" @@ -3636,6 +3995,33 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bc6ee10a9b4fcf576e9b0819d95ec16f4d2c02d39fd83ac1c8789785c4a42" +dependencies = [ + "bitflags 2.3.3", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "system-deps" version = "6.1.1" @@ -3666,6 +4052,19 @@ version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1c7f239eb94671427157bd93b3694320f3668d4e1eff08c7285366fd777fac" +[[package]] +name = "tempfile" +version = "3.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.48.0", +] + [[package]] name = "termcolor" version = "1.2.0" @@ -3773,16 +4172,37 @@ dependencies = [ ] [[package]] -name = "tokio" -version = "1.35.1" +name = "tinyvec" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", + "libc", + "mio", "num_cpus", + "parking_lot", "pin-project-lite", + "signal-hook-registry", + "socket2", "tokio-macros", + "windows-sys 0.48.0", ] [[package]] @@ -3805,6 +4225,30 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + [[package]] name = "toml" version = "0.7.5" @@ -3876,6 +4320,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + [[package]] name = "tracing" version = "0.1.40" @@ -3953,6 +4403,12 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tstr" version = "0.2.3" @@ -4034,6 +4490,15 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-script" version = "0.5.5" @@ -4058,12 +4523,29 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + [[package]] name = "valuable" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vec_map" version = "0.8.2" @@ -4092,6 +4574,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4123,6 +4614,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.87" @@ -4322,6 +4825,15 @@ dependencies = [ "windows-targets 0.48.1", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -4546,6 +5058,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wio" version = "0.2.2" diff --git a/Cargo.toml b/Cargo.toml index f4ee0a3..3c358a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,15 +42,16 @@ core_extensions = { version = "1.5.2", default_features = false, features = [ "std", ] } plotters-backend = "0.3.5" -tokio = { version = "1.35.1", features = [ - "time", - "fs", - "io-std", - "macros", - "num_cpus", - "bytes", - "io-util", -] } +#tokio = { version = "1.35.1", features = [ +# "time", +# "fs", +# "io-std", +# "macros", +# "num_cpus", +# "bytes", +# "io-util", +#] } +tokio = { version = "1.36.0", features = ["full"] } async-trait = "0.1.77" lazy_static = "1.4.0" once_cell = "1.19.0" @@ -87,6 +88,10 @@ tracing = "0.1.40" tracing-subscriber = "0.3.18" indexmap = "2.2.2" tokio-condvar = "0.1.0" +imgref = "1.10.1" +rgb = "0.8.37" +slippy-map-tiles = "0.16.0" +reqwest = "0.11.25" [build-dependencies] diff --git a/etws_loader/src/lib.rs b/etws_loader/src/lib.rs index 744c5c4..28e32bc 100644 --- a/etws_loader/src/lib.rs +++ b/etws_loader/src/lib.rs @@ -33,6 +33,8 @@ impl Plugin for ETWSLoader { } fn load(&self, path: RStr<'_>) -> RResult where { + let mut lat_range = [0.0, 0.0]; + let mut lon_range = [0.0, 0.0]; if let Ok(record) = Record::parse_from_path(path.to_string()) { let result_blocks = record .blocks @@ -87,6 +89,11 @@ impl Plugin for ETWSLoader { CoordType::Other }; + let lat = b.info.dimension_values.get(0).unwrap(); + let lon = b.info.dimension_values.get(1).unwrap(); + lat_range = [lat[0], lat[lat.len() - 1]]; + lon_range = [lon[0], lon[lon.len() - 1]]; + let shape = match b.info.dimension_size.len() { 1 => radarg_plugin_interface::DataShape::Vector, 2 => radarg_plugin_interface::DataShape::Matrix, @@ -137,8 +144,8 @@ impl Plugin for ETWSLoader { let meta = MetaData { datetime: RSome(record.filetime.timestamp()), site_info: RNone, - lon_range: RSome([0.0, 0.0]), - lat_range: RSome([1.0, 1.0]), + lon_range: RSome(lon_range), + lat_range: RSome(lat_range), data_format: RSome("Eastone Washon Radar".into()), other_info: RNone, }; diff --git a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader index 7981586..194757b 100644 --- a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader +++ b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader @@ -1,6 +1,6 @@ {"$message_type":"diagnostic","message":"unused imports: `Write`, `self`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":327,"line_start":13,"line_end":13,"column_start":15,"column_end":19,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":19}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":335,"byte_end":340,"line_start":13,"line_end":13,"column_start":27,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":27,"highlight_end":32}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the unused imports","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":329,"line_start":13,"line_end":13,"column_start":15,"column_end":21,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":21}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null},{"file_name":"src/parser.rs","byte_start":333,"byte_end":340,"line_start":13,"line_end":13,"column_start":25,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":25,"highlight_end":32}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused imports: `Write`, `self`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:13:15\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m13\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0muse std::io::{self, Read, Write};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"} {"$message_type":"diagnostic","message":"unused variable: `hlen2`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":6651,"byte_end":6656,"line_start":198,"line_end":198,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_variables)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":6651,"byte_end":6656,"line_start":198,"line_end":198,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":"_hlen2","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:198:21\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m198\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (input, hlen2) = Self::_parse_u32(input, order)?;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` on by default\u001b[0m\n\n"} {"$message_type":"diagnostic","message":"unused variable: `order`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":9035,"byte_end":9040,"line_start":279,"line_end":279,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":9035,"byte_end":9040,"line_start":279,"line_end":279,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":"_order","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `order`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:279:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m279\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m order: Order,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_order`\u001b[0m\n\n"} -{"$message_type":"diagnostic","message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1029,"byte_end":1042,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1029,"byte_end":1042,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:41:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m41\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1109,"byte_end":1122,"line_start":43,"line_end":43,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1109,"byte_end":1122,"line_start":43,"line_end":43,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:43:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m43\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"} {"$message_type":"diagnostic","message":"variants `I64` and `U64` are never constructed","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":563,"byte_end":573,"line_start":28,"line_end":28,"column_start":6,"column_end":16,"is_primary":false,"text":[{"text":"enum ValueTypes {","highlight_start":6,"highlight_end":16}],"label":"variants in this enum","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":580,"byte_end":583,"line_start":29,"line_end":29,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" I64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":616,"byte_end":619,"line_start":33,"line_end":33,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" U64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(dead_code)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: variants `I64` and `U64` are never constructed\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:29:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m28\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0menum ValueTypes {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m----------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mvariants in this enum\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m29\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m I64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m...\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m33\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m U64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` on by default\u001b[0m\n\n"} {"$message_type":"diagnostic","message":"5 warnings emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: 5 warnings emitted\u001b[0m\n\n"} diff --git a/etws_loader/target/release/deps/libetws_loader.dylib b/etws_loader/target/release/deps/libetws_loader.dylib index 1f015cd..41e2705 100755 Binary files a/etws_loader/target/release/deps/libetws_loader.dylib and b/etws_loader/target/release/deps/libetws_loader.dylib differ diff --git a/etws_loader/target/release/deps/libetws_loader.rlib b/etws_loader/target/release/deps/libetws_loader.rlib index e9da2c8..6b83ed0 100644 Binary files a/etws_loader/target/release/deps/libetws_loader.rlib and b/etws_loader/target/release/deps/libetws_loader.rlib differ diff --git a/etws_loader/target/release/libetws_loader.dylib b/etws_loader/target/release/libetws_loader.dylib index 1f015cd..41e2705 100755 Binary files a/etws_loader/target/release/libetws_loader.dylib and b/etws_loader/target/release/libetws_loader.dylib differ diff --git a/etws_loader/target/release/libetws_loader.rlib b/etws_loader/target/release/libetws_loader.rlib index e9da2c8..6b83ed0 100644 Binary files a/etws_loader/target/release/libetws_loader.rlib and b/etws_loader/target/release/libetws_loader.rlib differ diff --git a/src/components/app.rs b/src/components/app.rs index c0cee89..a9e1340 100644 --- a/src/components/app.rs +++ b/src/components/app.rs @@ -222,6 +222,8 @@ impl Component for AppModel { *FILE_PATH_ROOT.lock().unwrap() = path.clone(); let data = Self::open_file_only(path); let meta: MetaInfo = (&data.meta).clone().into(); + let (lat_start, lat_end) = meta.lat_range.unwrap(); + let (lon_start, lon_end) = meta.lon_range.unwrap(); let element_impl = plugin_result_impl(&data); let mut renderer = OffscreenRenderer::new(3000, 3000).unwrap(); let mut canvas = renderer.create_canvas(); @@ -238,6 +240,9 @@ impl Component for AppModel { let layer = Layer::new(true, "New Layer".to_string(), AssoElement::Instant(element)); dialog_render_sender.emit(MonitorInputMsg::AddMetaItem(meta.to_map())); + dialog_render_sender.emit(MonitorInputMsg::SetRenderRange( + lon_start, lon_end, lat_start, lat_end, + )); AppMsg::NewLayer(layer) } _ => AppMsg::Close, diff --git a/src/components/control_panel/control_panel.rs b/src/components/control_panel/control_panel.rs index e3146b2..1e8c9f8 100644 --- a/src/components/control_panel/control_panel.rs +++ b/src/components/control_panel/control_panel.rs @@ -67,11 +67,6 @@ impl SimpleComponent for ControlPanelModel { println!("Selected: {}", step_selector.selected()); }, } - // gtk::Label{ - // set_label: "Subheader", - // add_css_class:"h3", - // set_halign: gtk::Align::Start, - // } }, #[local] step_selector -> gtk::DropDown{ diff --git a/src/components/monitor/messages.rs b/src/components/monitor/messages.rs index 57e0caa..16ec1c2 100644 --- a/src/components/monitor/messages.rs +++ b/src/components/monitor/messages.rs @@ -17,12 +17,14 @@ pub enum MonitorInputMsg { UpdateMetaItem(HashMap), UpdateLayer((String, Box)), RefreshLayerList, + SetRenderRange(f64, f64, f64, f64), None, } impl Debug for MonitorInputMsg { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { + MonitorInputMsg::SetRenderRange(_, _, _, _) => write!(f, "MonitorInputMsg::SetRenderRange"), MonitorInputMsg::RefreshLayerList => write!(f, "MonitorInputMsg::RefreshLayerList"), MonitorInputMsg::NewElement(_) => write!(f, "MonitorInputMsg::NewElement"), MonitorInputMsg::AddLayer(_) => write!(f, "MonitorInputMsg::AddLayer"), diff --git a/src/components/monitor/monitor.rs b/src/components/monitor/monitor.rs index 5fb1e98..52b3d63 100644 --- a/src/components/monitor/monitor.rs +++ b/src/components/monitor/monitor.rs @@ -79,8 +79,6 @@ impl Component for MonitorModel { #[name = "renderer"] #[wrap(Some)] set_child = &Render{ - // #[track = "model.changed(MonitorModel::new_layer())"] - // set_interior_layers: model.layers.clone(), #[track = "model.changed(MonitorModel::render_cfg())"] set_cfg: model.render_cfg, #[track = "model.changed(MonitorModel::render_range())"] @@ -110,7 +108,6 @@ impl Component for MonitorModel { } fn update_with_view(&mut self, widgets: &mut Self::Widgets, message: Self::Input, sender: ComponentSender, root: &Self::Root) { - self.reset(); match message { MonitorInputMsg::AddLayer(layer) => { @@ -126,6 +123,9 @@ impl Component for MonitorModel { MonitorInputMsg::AddMetaItem(map) => { self.sidebar.emit(SideBarInputMsg::AddMetaItems(map)) } + MonitorInputMsg::SetRenderRange(lon_start,lon_end,lat_start,lat_end)=>{ + self.set_render_range((lat_start,lat_end,lon_start,lon_end)); + } MonitorInputMsg::ClearMetaItems => self.sidebar.emit(SideBarInputMsg::ClearMetaItems), MonitorInputMsg::UpdateMetaItem(map) => { self.sidebar.emit(SideBarInputMsg::ClearMetaItems); @@ -193,16 +193,6 @@ impl Component for MonitorModel { ) { self.reset(); match msg { - // MonitorCommand::NewLayer(layer) => { - // // self.layers.borrow_mut().insert(layer.name.clone(), layer); - // // self.set_render_range((29.13, 30.16, 119.53, 121.13)); - // // self.sidebar - // // .sender() - // // .send(SideBarInputMsg::RefreshList) - // // .unwrap(); - // // let raw_id = self.get_new_layer(); - // // self.set_new_layer(*raw_id + 1); - // } _ => {} } } diff --git a/src/components/monitor/sidebar/actions.rs b/src/components/monitor/sidebar/actions.rs new file mode 100644 index 0000000..3e7c6f4 --- /dev/null +++ b/src/components/monitor/sidebar/actions.rs @@ -0,0 +1,6 @@ +use crate::widgets::Layer; + +relm4::safe_settings_and_actions! { + #[derive(Debug)] + pub(super) Visible(group: "layer", name: "layer-visible"); +} \ No newline at end of file diff --git a/src/components/monitor/sidebar/mod.rs b/src/components/monitor/sidebar/mod.rs index a2c7b4b..45da1d6 100644 --- a/src/components/monitor/sidebar/mod.rs +++ b/src/components/monitor/sidebar/mod.rs @@ -2,3 +2,4 @@ pub mod sidebar; pub use sidebar::*; pub mod bottom_bar; pub mod meta_data_list; +mod actions; diff --git a/src/components/monitor/sidebar/sidebar.rs b/src/components/monitor/sidebar/sidebar.rs index 8efe3e9..174b457 100644 --- a/src/components/monitor/sidebar/sidebar.rs +++ b/src/components/monitor/sidebar/sidebar.rs @@ -1,8 +1,11 @@ use abi_stable::type_level::trait_marker::Hash; +use relm4::safe_settings_and_actions::extensions::SafeSimpleAction; +use super::actions::*; use glib::clone; use gtk::prelude::WidgetExt; use gtk::prelude::*; use relm4::{ + gtk::gio, binding::{Binding, U8Binding}, factory::{DynamicIndex, FactoryComponent, FactorySender, FactoryVecDeque}, prelude::*, @@ -26,11 +29,9 @@ use super::{ meta_data_list::{InfoColumn, MyListItem, TagColumn}, }; -relm4::new_action_group!(LayerActionGroup, "layer"); -relm4::new_stateful_action!(ToTime, LayerActionGroup, "to_time", u32, ()); -relm4::new_stateless_action!(BeTime, LayerActionGroup, "be_time"); pub struct SideBarModel { layers: Rc>>, + selected_layer_idx: usize, counter: u8, list_view_wrapper: TypedListView, bottom_bar_vec: FactoryVecDeque, @@ -93,8 +94,7 @@ impl SimpleComponent for SideBarModel { set_spacing: 5, } } - }, - + } }, layer_page = gtk::ScrolledWindow::builder() .vexpand(true) @@ -132,24 +132,9 @@ impl SimpleComponent for SideBarModel { // Initialize the ListView wrapper let mut list_view_wrapper: TypedListView = TypedListView::with_sorting(); - let mut bottom_bar_vec = FactoryVecDeque::new(gtk::Box::default(), sender.input_sender()); - let mut group = relm4::actions::RelmActionGroup::::new(); - let action: RelmAction = { - RelmAction::new_stateful_with_target_value(&(), move |_, state, _value| { - sender.output(SideBarOutputMsg::SwitchToTimeSeries(_value as usize)).unwrap() - }) - }; - - let action2:RelmAction = RelmAction::new_stateless(|_| { - dbg!("be time"); - }); - - group.add_action(action); - group.add_action(action2); let app = relm4::main_application(); - group.register_for_widget(root); { let mut bottom_bar_vec_guard = bottom_bar_vec.guard(); @@ -165,6 +150,7 @@ impl SimpleComponent for SideBarModel { let mut model = SideBarModel { meta_list_view, layers: init, + selected_layer_idx: 0, counter: 0, list_view_wrapper, bottom_bar_vec, @@ -269,8 +255,6 @@ impl RelmListItem for LayerItem { fn setup(_item: >k::ListItem) -> (gtk::Box, Widgets) { relm4::menu! { main_menu: { - "Bind To Time" => ToTime(0), - "Be Time" => BeTime, } } @@ -326,8 +310,6 @@ impl RelmListItem for LayerItem { relm4::menu! { main_menu: { - "Bind To Time" => ToTime(self.key), - "Be Time" => BeTime, } } menu.set_menu_model(Some(&main_menu)); diff --git a/src/main.rs b/src/main.rs index 18d75f6..7f7b016 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,6 +26,8 @@ use tracing::info; use tracing_subscriber; mod widgets; mod data_utils; +mod predefined; +mod map_tile_utils; const APP_ID: &str = "org.tsuki.radar_g"; static RUNTIME: SafeLazy = diff --git a/src/map_tile_utils.rs b/src/map_tile_utils.rs new file mode 100644 index 0000000..1aeccff --- /dev/null +++ b/src/map_tile_utils.rs @@ -0,0 +1,9 @@ + +pub fn lat_lon_to_zoom(lat_range: (f64, f64), lon_range: (f64, f64), w: f32, h:f32 ) -> u8 { + let lat_diff = lat_range.1 - lat_range.0; + let lon_diff = lon_range.1 - lon_range.0; + let z1 = ( (360.0 * w) as f64 / lon_diff / 256.0).log2(); + let z2 = ( (180.0 * h) as f64 / lat_diff / 256.0).log2(); + let z = z1.min(z2); + z as u8 +} \ No newline at end of file diff --git a/src/pipeline/element.rs b/src/pipeline/element.rs index 06b828e..9d2e00b 100644 --- a/src/pipeline/element.rs +++ b/src/pipeline/element.rs @@ -9,7 +9,8 @@ use crate::RUNTIME; use crate::{coords::Range, widgets::widget::Widget}; use chrono::{DateTime, TimeZone, Utc}; use core_extensions::SelfOps; -use femtovg::{renderer::OpenGl, Canvas, ImageId}; +use femtovg::rgb::alt::GRAY8; +use femtovg::{renderer::OpenGl, Canvas, ImageFlags, ImageId, ImageInfo, PixelFormat}; use futures::StreamExt; use glib::PropertyGet; use radarg_plugin_interface::PluginResult; @@ -149,8 +150,15 @@ impl InstantElement { let result_id = match target.target { TargetType::ImageId(id) => id, TargetType::Mem(ref mem) => { + let gl_bind = render.get_context(); + let gl = gl_bind.as_ref().unwrap(); + let flags = ImageFlags::empty(); + let texture = target.mem_to_native_texture(gl, flags); let converted = canvas - .load_image_mem(mem, femtovg::ImageFlags::empty()) + .create_image_from_native_texture( + texture, + ImageInfo::new(flags, 3000, 3000, PixelFormat::Rgba8), + ) .unwrap(); target.set_target(TargetType::ImageId(converted)); converted @@ -168,17 +176,25 @@ impl InstantElement { pub fn to_time_series( self, dispatcher: Rc, - cms:CMS + cms: CMS, ) -> (TimeSeriesElement, DateTime) { // let imp = Arc::new(InstantElementImpl::new(self)); if let InstantElementDrawerType::Prepared((target, imp)) = self.draw_type { let mut time_series = TimeSeriesElement::new(imp, dispatcher, cms, self.key); - let data = target.data.clone().unwrap().downcast::().unwrap(); + let data = target + .data + .clone() + .unwrap() + .downcast::() + .unwrap(); let time_stamp = data.blocks.first().unwrap().datetime; - let meta_info:MetaInfo = data.meta.clone().into(); + let meta_info: MetaInfo = data.meta.clone().into(); use chrono::prelude::*; let time = Utc.timestamp_opt(time_stamp, 0).unwrap(); - (*time_series.buffer).lock().unwrap().insert(time, Some(RenderResult::new(target, meta_info))); + (*time_series.buffer) + .lock() + .unwrap() + .insert(time, Some(RenderResult::new(target, meta_info))); (time_series, time) } else { panic!("InstantElementDrawerType is not prepared"); @@ -294,15 +310,11 @@ impl TimeSeriesElement { } { - registers - .lock() - .unwrap() - .get_mut(&dt) - .map(|x|x.into_iter() - .for_each(|n| { - n.notify_waiters(); - }) ) - ; + registers.lock().unwrap().get_mut(&dt).map(|x| { + x.into_iter().for_each(|n| { + n.notify_waiters(); + }) + }); } }) }); @@ -383,6 +395,115 @@ impl Target { ((x2 - x1).abs(), (y2 - y1).abs()) } + pub fn mem_to_native_texture(&self, gl: &glow::Context, flags: ImageFlags) -> glow::NativeTexture { + if let TargetType::Mem(ref mem) = self.target{ + use glow::*; + let texture = unsafe { + let id = gl.create_texture().unwrap(); + gl.bind_texture(glow::TEXTURE_2D, Some(id)); + gl.pixel_store_i32(glow::UNPACK_ALIGNMENT, 1); + gl.pixel_store_i32(glow::UNPACK_ROW_LENGTH, 3000 as i32); + gl.pixel_store_i32(glow::UNPACK_SKIP_PIXELS, 0); + gl.pixel_store_i32(glow::UNPACK_SKIP_ROWS, 0); + id + }; + let width = 3000; // 纹理宽度 + let height = 3000; // 纹理高度 + unsafe { + gl.tex_image_2d( + glow::TEXTURE_2D, + 0, // level + glow::RGBA as i32, // internal_format + width, + height, + 0, // border + glow::RGBA, // format + glow::UNSIGNED_BYTE, // type + Some(&mem), // pixels + ); + } + + if flags.contains(ImageFlags::GENERATE_MIPMAPS) { + if flags.contains(ImageFlags::NEAREST) { + unsafe { + gl.tex_parameter_i32( + glow::TEXTURE_2D, + glow::TEXTURE_MIN_FILTER, + glow::NEAREST_MIPMAP_NEAREST as i32, + ); + } + } else { + unsafe { + gl.tex_parameter_i32( + glow::TEXTURE_2D, + glow::TEXTURE_MIN_FILTER, + glow::LINEAR_MIPMAP_LINEAR as i32, + ); + } + } + } else if flags.contains(ImageFlags::NEAREST) { + unsafe { + gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::NEAREST as i32); + } + } else { + unsafe { + gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::LINEAR as i32); + } + } + + if flags.contains(ImageFlags::NEAREST) { + unsafe { + gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::NEAREST as i32); + } + } else { + unsafe { + gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::LINEAR as i32); + } + } + + if flags.contains(ImageFlags::REPEAT_X) { + unsafe { + gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::REPEAT as i32); + } + } else { + unsafe { + gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::CLAMP_TO_EDGE as i32); + } + } + + if flags.contains(ImageFlags::REPEAT_Y) { + unsafe { + gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::REPEAT as i32); + } + } else { + unsafe { + gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::CLAMP_TO_EDGE as i32); + } + } + + unsafe { + gl.pixel_store_i32(glow::UNPACK_ALIGNMENT, 4); + gl.pixel_store_i32(glow::UNPACK_ROW_LENGTH, 0); + gl.pixel_store_i32(glow::UNPACK_SKIP_PIXELS, 0); + gl.pixel_store_i32(glow::UNPACK_SKIP_ROWS, 0); + } + + if flags.contains(ImageFlags::GENERATE_MIPMAPS) { + unsafe { + gl.generate_mipmap(glow::TEXTURE_2D); + } + } + + unsafe { + gl.bind_texture(glow::TEXTURE_2D, None); + } + + return texture; + } else { + panic!("Target is not mem"); + } + } + pub fn origin(&self, cms: &Render) -> (f32, f32) { let (x, y) = self.bounds; let p1 = (x.0, y.1); diff --git a/src/pipeline/predefined/grid_field_renderer.rs b/src/pipeline/predefined/grid_field_renderer.rs index 0af1428..fc2b233 100644 --- a/src/pipeline/predefined/grid_field_renderer.rs +++ b/src/pipeline/predefined/grid_field_renderer.rs @@ -14,6 +14,7 @@ use ndarray::ArrayView2; use num_traits::{AsPrimitive, FromPrimitive, Num, NumOps}; use std::{fmt::Debug, io::Cursor, marker::PhantomData}; use gtk::ResponseType::No; +use tracing::info; #[derive(Debug)] pub struct GridFieldRenderer @@ -60,14 +61,14 @@ impl, CMAP: Col let rt_lat = dim2[[r + 1, c + 1]]; let rt_lon = dim1[[r + 1, c + 1]]; - let cell: LineString = vec![ - (lb_lon, lb_lat), - (rt_lon + 0.001, lb_lat), - (rt_lon + 0.001, rt_lat), - (lb_lon, rt_lat + 0.001), - (lb_lon, lb_lat + 0.001), - ] - .into(); + // let cell: LineString = vec![ + // (lb_lon, lb_lat), + // (rt_lon + 0.001, lb_lat), + // (rt_lon + 0.001, rt_lat), + // (lb_lon, rt_lat + 0.001), + // (lb_lon, lb_lat + 0.001), + // ] + // .into(); let v = &data[[r, c]]; let mapped_color = self.cmap.map_value_to_color(*v, fill_value); @@ -76,17 +77,20 @@ impl, CMAP: Col continue; } - let mapped_ring = cms.ring_map(&cell).unwrap(); + // let mapped_ring = cms.ring_map(&cell).unwrap(); + let (ox,oy) = cms.map((lb_lon, lb_lat)).unwrap(); + let (rx, ry) = cms.map((rt_lon, rt_lat)).unwrap(); let mut path = Path::new(); - let mut points = mapped_ring.points(); - let first_point = points.next().unwrap(); - path.move_to(first_point.x(), first_point.y()); - - for point in points { - path.line_to(point.x(), point.y()); - } - path.close(); + // let mut points = mapped_ring.points(); + // let first_point = points.next().unwrap(); + // path.move_to(first_point.x(), first_point.y()); + // + // for point in points { + // path.line_to(point.x(), point.y()); + // } + path.rect(ox, oy, (rx - ox) * 1.5, (ry - oy) * 1.5); + // path.close(); canvas.fill_path(&path, &Paint::color(mapped_color.unwrap())); } } @@ -107,11 +111,11 @@ where data: &Self::Data, size: (f32, f32), ) -> Target { + let start = std::time::Instant::now(); let (w, h) = size; let new_img = canvas .create_image_empty(w as usize, h as usize, Rgba8, ImageFlags::empty()) .expect("Can't Create Image"); - canvas.image_size(new_img).unwrap(); canvas.set_render_target(RenderTarget::Image(new_img)); @@ -126,6 +130,7 @@ where cms.set_lat_range(lat_start..lat_end); cms.set_lon_range(lon_start..lon_end); + info!("Time to prepare data: {:?}", start.elapsed()); self.draw_2d( canvas, @@ -136,6 +141,7 @@ where data.fill_value, ); canvas.flush(); + info!("Time to render: {:?}", start.elapsed()); let mut pixels: Vec = vec![0; w as usize * h as usize * 4]; unsafe { gl::ReadPixels( @@ -149,23 +155,25 @@ where ); debug_assert_eq!(gl::GetError(), gl::NO_ERROR); } + info!("Time to read pixels: {:?}", start.elapsed()); - let img: ImageBuffer, Vec> = ImageBuffer::from_raw(w as u32, h as u32, pixels) - .expect("Failed to create ImageBuffer"); - let thumbnail = resize(&img, 500, 500, image::imageops::FilterType::Lanczos3); - let mut thumb_buffer = Cursor::new(Vec::new()); - img.write_to(&mut thumb_buffer, image::ImageOutputFormat::Png) - .expect("Failed to write PNG buffer"); - let thumb_data = thumb_buffer.into_inner(); - let thumbnail_tex = - gtk::gdk::Texture::from_bytes(>k::glib::Bytes::from(&thumb_data)).unwrap(); + // let img: ImageBuffer, Vec> = ImageBuffer::from_raw(w as u32, h as u32, pixels) + // .expect("Failed to create ImageBuffer"); + // let thumbnail = resize(&img, 500, 500, image::imageops::FilterType::Lanczos3); + // let mut thumb_buffer = Cursor::new(Vec::new()); + // img.write_to(&mut thumb_buffer, image::ImageOutputFormat::Png) + // .expect("Failed to write PNG buffer"); + // info!("Time to write PNG: {:?}", start.elapsed()); + // let thumb_data = thumb_buffer.into_inner(); + // let thumbnail_tex = + // gtk::gdk::Texture::from_bytes(>k::glib::Bytes::from(&thumb_data)).unwrap(); // 将 ImageBuffer 编码为 PNG - let mut png_buffer = Cursor::new(Vec::new()); - img.write_to(&mut png_buffer, image::ImageOutputFormat::Bmp) - .expect("Failed to write PNG buffer"); + // let mut png_buffer = Cursor::new(Vec::new()); + // img.write_to(&mut png_buffer, image::ImageOutputFormat::Bmp) + // .expect("Failed to write PNG buffer"); - let png_data = png_buffer.into_inner(); + // let png_data = png_buffer.into_inner(); let d1_start = (data.dim1.view()).first().unwrap().clone(); let d1_end = (data.dim1.view()).last().unwrap().clone(); @@ -175,11 +183,12 @@ where canvas.set_render_target(RenderTarget::Screen); Target::new( - TargetType::Mem(png_data), + TargetType::Mem(pixels), w, h, ((d1_start, d1_end).into(), (d2_start, d2_end).into()), - Some(thumbnail_tex), + // Some(thumbnail_tex), + None, None ) } diff --git a/src/predefined/map_tile.rs b/src/predefined/map_tile.rs new file mode 100644 index 0000000..0eddb26 --- /dev/null +++ b/src/predefined/map_tile.rs @@ -0,0 +1,20 @@ +use crate::map_tile_utils::*; +use slippy_map_tiles::{BBox, merc_location_to_tile_coords, size_bbox_zoom_metatiles, Tile}; + +pub fn map_tile_layer(lat_range: (f64, f64), lon_range: (f64, f64), w: f32, h: f32) { + let z = lat_lon_to_zoom(lat_range, lon_range, w, h); + let bbox = BBox::new(lat_range.0 as f32, lon_range.0 as f32, lat_range.1 as f32, lon_range.1 as f32).unwrap(); + let size = size_bbox_zoom_metatiles(&bbox, z, 4); + let t = Tile::new(10, 547, 380).unwrap(); + println!("size: {:?}", size); + println!("tile: {:?}", t); +} + + +mod test { + use super::*; + #[test] + fn test_map_tile_layer() { + map_tile_layer((37.7749, 37.7749), (-122.4194, -122.4194), 1000.0, 1000.0); + } +} \ No newline at end of file diff --git a/src/predefined/mod.rs b/src/predefined/mod.rs new file mode 100644 index 0000000..4df6fb4 --- /dev/null +++ b/src/predefined/mod.rs @@ -0,0 +1 @@ +mod map_tile; \ No newline at end of file diff --git a/src/widgets/render/imp.rs b/src/widgets/render/imp.rs index 807060b..79b6a0c 100644 --- a/src/widgets/render/imp.rs +++ b/src/widgets/render/imp.rs @@ -51,6 +51,7 @@ pub struct Render { pub(super) exterior: RefCell, pub(super) interior: RefCell, pub(super) canvas: RefCell>>, + pub(super) glow_context: RefCell>, pub config: RefCell, pub status: RefCell, pub mapper: RefCell, @@ -63,6 +64,7 @@ impl Default for Render { render_status: Cell::new(0), exterior: RefCell::new(ExteriorWidget::default()), interior: RefCell::new(InteriorWidget::default()), + glow_context: RefCell::new(None), interior_layers: RefCell::new(Rc::new(RefCell::new(Vec::new()))), config: RefCell::new(RenderConfig::default()), status: RefCell::new(RenderStatus::default()), @@ -240,6 +242,7 @@ impl Render { let id = NonZeroU32::new(ctx.get_parameter_i32(glow::DRAW_FRAMEBUFFER_BINDING) as u32) .expect("No GTK provided framebuffer binding"); ctx.bind_framebuffer(glow::FRAMEBUFFER, None); + self.glow_context.replace(Some(ctx)); (renderer, glow::NativeFramebuffer(id)) }; renderer.set_screen_target(Some(fbo)); diff --git a/src/widgets/render/interior/layers copy.rs b/src/widgets/render/interior/layers copy.rs deleted file mode 100644 index f3822f3..0000000 --- a/src/widgets/render/interior/layers copy.rs +++ /dev/null @@ -1,180 +0,0 @@ -use super::super::{Render}; -use crate::pipeline::offscreen_renderer::CanvasWrapper; -use crate::{coords::Range, widgets::widget::Widget}; -use femtovg::{renderer::OpenGl, Canvas, ImageId}; -use std::{ - cell::{Ref, RefCell}, - fmt::Debug, - future::Future, - pin::Pin, - sync::{Arc, Mutex}, -}; -use crate::coords::cms::CMS; -use crate::pipeline::element::Target; - -type PrepareFunc = Arc< - Mutex< - Option< - Box< - dyn FnOnce( - LayerImplSync, - // Box, - Arc>, - CMS, - ) -> Target - + Sync - + Send, - >, - >, - >, ->; -type DrawFunc = Arc; -pub type LayerImplSync = Arc>>; - -#[derive(Clone)] -pub struct Layer { - pub visiable: bool, - pub name: String, - pub widgets: Arc>>>>, - target: Arc>>, - prepare: PrepareFunc, - imp: Option>>>, - draw: DrawFunc, -} - -impl Debug for Layer { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Layer") - .field("visiable", &self.visiable) - .field("target", &self.target) - .field("imp", &self.imp) - .finish() - } -} - -pub trait LayerImpl: Debug { - fn draw(&self, canvas: &mut Canvas, cms: &CMS) -> Option; -} - -impl Layer { - pub fn new< - F: 'static + Fn(&Self, Render, (f32, f32)) + Send + Sync, - PREPARE: FnOnce(LayerImplSync, Arc>, CMS) -> Target + Send + Sync + 'static, - IMP: LayerImpl + Sync + Send + 'static, - >( - visiable: bool, - draw: F, - widgets: Option>>, - layer_name: String, - prepare: Option, - imp: Option, - ) -> Self { - Layer { - visiable, - target: Arc::new(Mutex::new(None)), - name: layer_name, - widgets: Arc::new(Mutex::new(widgets)), - prepare: Arc::new(Mutex::new(prepare.map(|p| { - Box::new(move |a, b, c| p(a, b, c)) - as Box< - dyn FnOnce(LayerImplSync, Arc>, CMS) -> Target - + Sync - + Send, - > - }))), - draw: Arc::new(Box::new(draw)), - imp: imp.map(|i| { - Arc::new(Mutex::new( - Box::new(i) as Box - )) - }), - } - } - - pub fn draw(&self, render: &Render, window_size: (f32, f32)) { - if self.visiable { - let drawer = &self.draw; - drawer(self, render.clone(), window_size); - } - } - - pub fn get_prepare(&self) -> PrepareFunc { - self.prepare.clone() - } - - pub fn set_render_target(&self, target: Target) { - self.target.lock().unwrap().replace(target); - } - - pub fn render_target(&self) -> Arc>> { - self.target.clone() - } - - pub fn get_imp(&self) -> Option>>> { - // self.imp.map(|p| p.clone()) - self.imp.clone() - } - - pub fn get_thumbnail(&self) -> Option { - self.target - .lock() - .unwrap() - .as_ref() - .and_then(|t| t.thumbnail.clone()) - } -} - -// #[derive(Clone, Debug, PartialEq, PartialOrd)] -// pub struct Target { -// pub target: TargetType, -// pub thumbnail: Option, -// pub width: f32, -// pub height: f32, -// pub bounds: (Range, Range), -// } -// -// #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)] -// pub enum TargetType { -// ImageId(ImageId), -// Mem(Vec), -// } -// -// impl Target { -// pub fn new( -// target: TargetType, -// width: f32, -// height: f32, -// bounds: (Range, Range), -// thumbnail: Option, -// ) -> Self { -// Self { -// target, -// width, -// height, -// bounds, -// thumbnail, -// } -// } -// -// pub fn size(&self, render: &Render) -> (f32, f32) { -// let (x, y) = self.bounds; -// -// let p1 = (x.0, y.0); -// let p2 = (x.1, y.1); -// -// let (x1, y1) = render.map(p1).unwrap(); -// let (x2, y2) = render.map(p2).unwrap(); -// -// ((x2 - x1).abs(), (y2 - y1).abs()) -// } -// -// pub fn origin(&self, render: &Render) -> (f32, f32) { -// let (x, y) = self.bounds; -// let p1 = (x.0, y.1); -// render.map(p1).unwrap() -// } -// -// pub fn set_target(&mut self, target: TargetType) { -// self.target = target; -// } -// } diff --git a/src/widgets/render/interior/layers.rs b/src/widgets/render/interior/layers.rs index 9410e31..7797441 100644 --- a/src/widgets/render/interior/layers.rs +++ b/src/widgets/render/interior/layers.rs @@ -35,6 +35,7 @@ pub enum AssoElement { #[derive(Clone)] pub struct Layer { pub visiable: bool, + pub alpha: f32, pub name: String, associated_element: AssoElement, time: Option>, @@ -55,6 +56,7 @@ pub trait LayerImpl: Debug { impl Layer { pub fn new(visiable: bool, layer_name: String, element: AssoElement) -> Self { Layer { + alpha: 1.0, visiable, name: layer_name, associated_element: element, @@ -100,7 +102,7 @@ impl Layer { } }; - let paint = femtovg::Paint::image(result_id, ox, oy, x, y, 0.0, 1.0); + let paint = femtovg::Paint::image(result_id, ox, oy, x, y, 0.0, self.alpha); let mut path = femtovg::Path::new(); path.rect(ox, oy, x, y); canvas.fill_path(&path, &paint); @@ -119,6 +121,10 @@ impl Layer { None } + pub fn set_alpha(&mut self, alpha: f32) { + self.alpha = alpha; + } + pub fn change_visiable(&mut self, visiable: bool) { self.visiable = visiable; } diff --git a/src/widgets/render/interior/map_tile.rs b/src/widgets/render/interior/map_tile.rs new file mode 100644 index 0000000..2a3e916 --- /dev/null +++ b/src/widgets/render/interior/map_tile.rs @@ -0,0 +1,30 @@ +pub(super) struct MapTile { + server: Option, + lat_range: (f64, f64), + lon_range: (f64, f64), + zoom: u8, +} + +impl MapTile{ + pub fn new(server: Option, lat_range: (f64, f64), lon_range: (f64, f64), zoom: u8) -> MapTile { + MapTile { + server, + lat_range, + lon_range, + zoom, + } + } + + pub fn get_server(&self) -> Option { + self.server.clone() + } + + pub fn get_lat_range(&self) -> (f64, f64) { + self.lat_range + } + + pub fn get_lon_range(&self) -> (f64, f64) { + self.lon_range + } +} + diff --git a/src/widgets/render/interior/mod.rs b/src/widgets/render/interior/mod.rs index cde68d6..7171fda 100644 --- a/src/widgets/render/interior/mod.rs +++ b/src/widgets/render/interior/mod.rs @@ -1,5 +1,7 @@ mod imp; mod layers; +mod map_tile; + use super::super::Render; use femtovg::{renderer::OpenGl, Canvas}; pub use layers::{Layer, LayerImpl, LayerImplSync, AssoElement}; diff --git a/src/widgets/render/mod.rs b/src/widgets/render/mod.rs index 6dab846..654ca3f 100644 --- a/src/widgets/render/mod.rs +++ b/src/widgets/render/mod.rs @@ -112,6 +112,10 @@ impl Render { self.imp().canvas.borrow_mut() } + pub fn get_context(&self) -> RefMut<'_, Option> { + self.imp().glow_context.borrow_mut() + } + pub fn set_cfg(&self, cfg: RenderConfig) { self.imp().config.replace(cfg); }