This commit is contained in:
Tsuki 2024-03-11 12:03:23 +08:00
parent 53d5b6a57f
commit caf8b68926
27 changed files with 837 additions and 295 deletions

546
Cargo.lock generated
View File

@ -240,6 +240,12 @@ dependencies = [
"rustc-demangle", "rustc-demangle",
] ]
[[package]]
name = "base64"
version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]] [[package]]
name = "base64ct" name = "base64ct"
version = "1.6.0" version = "1.6.0"
@ -505,6 +511,7 @@ dependencies = [
"glue", "glue",
"gtk4", "gtk4",
"image", "image",
"imgref",
"indexmap", "indexmap",
"lazy_static", "lazy_static",
"libadwaita", "libadwaita",
@ -524,10 +531,13 @@ dependencies = [
"relm4", "relm4",
"relm4-components", "relm4-components",
"relm4-icons", "relm4-icons",
"reqwest",
"rgb",
"rstar", "rstar",
"serde", "serde",
"serde_json", "serde_json",
"shapefile", "shapefile",
"slippy-map-tiles",
"smallvec", "smallvec",
"sorted-vec", "sorted-vec",
"surfman", "surfman",
@ -976,6 +986,15 @@ version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" 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]] [[package]]
name = "env_logger" name = "env_logger"
version = "0.9.3" version = "0.9.3"
@ -1007,6 +1026,16 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" 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]] [[package]]
name = "etws_loader" name = "etws_loader"
version = "0.1.0" version = "0.1.0"
@ -1050,6 +1079,12 @@ dependencies = [
"zune-inflate", "zune-inflate",
] ]
[[package]]
name = "fastrand"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
[[package]] [[package]]
name = "fdeflate" name = "fdeflate"
version = "0.3.4" version = "0.3.4"
@ -1183,6 +1218,15 @@ 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 = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 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]] [[package]]
name = "fragile" name = "fragile"
version = "2.0.0" version = "2.0.0"
@ -1766,6 +1810,25 @@ dependencies = [
"zvariant", "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]] [[package]]
name = "half" name = "half"
version = "2.2.1" version = "2.2.1"
@ -1833,12 +1896,83 @@ dependencies = [
"digest", "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]] [[package]]
name = "humantime" name = "humantime"
version = "2.1.0" version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 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]] [[package]]
name = "iana-time-zone" name = "iana-time-zone"
version = "0.1.59" version = "0.1.59"
@ -1868,6 +2002,16 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 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]] [[package]]
name = "image" name = "image"
version = "0.24.7" version = "0.24.7"
@ -1889,9 +2033,9 @@ dependencies = [
[[package]] [[package]]
name = "imgref" name = "imgref"
version = "1.9.4" version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2cf49df1085dcfb171460e4592597b84abe50d900fb83efb6e41b20fefd6c2c" checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126"
[[package]] [[package]]
name = "indexmap" name = "indexmap"
@ -1936,6 +2080,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "ipnet"
version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.10.5" version = "0.10.5"
@ -2064,9 +2214,9 @@ dependencies = [
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.147" version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]] [[package]]
name = "libloading" name = "libloading"
@ -2116,6 +2266,12 @@ dependencies = [
"redox_syscall 0.4.1", "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]] [[package]]
name = "lock_api" name = "lock_api"
version = "0.4.10" version = "0.4.10"
@ -2222,6 +2378,12 @@ dependencies = [
"objc", "objc",
] ]
[[package]]
name = "mime"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]] [[package]]
name = "minimal-lexical" name = "minimal-lexical"
version = "0.2.1" version = "0.2.1"
@ -2240,9 +2402,9 @@ dependencies = [
[[package]] [[package]]
name = "mio" name = "mio"
version = "0.8.8" version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
dependencies = [ dependencies = [
"libc", "libc",
"log", "log",
@ -2259,6 +2421,24 @@ dependencies = [
"getrandom", "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]] [[package]]
name = "ndarray" name = "ndarray"
version = "0.15.6" version = "0.15.6"
@ -2622,6 +2802,50 @@ version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 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]] [[package]]
name = "option-ext" name = "option-ext"
version = "0.2.0" version = "0.2.0"
@ -3237,10 +3461,50 @@ dependencies = [
] ]
[[package]] [[package]]
name = "rgb" name = "reqwest"
version = "0.8.36" version = "0.11.25"
source = "registry+https://github.com/rust-lang/crates.io-index" 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 = [ dependencies = [
"bytemuck", "bytemuck",
] ]
@ -3283,6 +3547,28 @@ dependencies = [
"semver", "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]] [[package]]
name = "rustversion" name = "rustversion"
version = "1.0.14" version = "1.0.14"
@ -3326,6 +3612,15 @@ dependencies = [
"winapi-util", "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]] [[package]]
name = "scoped-tls" name = "scoped-tls"
version = "1.0.1" version = "1.0.1"
@ -3351,6 +3646,29 @@ dependencies = [
"tiny-skia", "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]] [[package]]
name = "semver" name = "semver"
version = "1.0.17" version = "1.0.17"
@ -3397,6 +3715,18 @@ dependencies = [
"serde", "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]] [[package]]
name = "servo-display-link" name = "servo-display-link"
version = "0.2.0" version = "0.2.0"
@ -3468,6 +3798,15 @@ 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 = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" 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]] [[package]]
name = "simd-adler32" name = "simd-adler32"
version = "0.3.7" version = "0.3.7"
@ -3483,6 +3822,16 @@ dependencies = [
"autocfg", "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]] [[package]]
name = "slotmap" name = "slotmap"
version = "1.0.6" version = "1.0.6"
@ -3517,6 +3866,16 @@ dependencies = [
"wayland-protocols", "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]] [[package]]
name = "sorted-vec" name = "sorted-vec"
version = "0.8.3" version = "0.8.3"
@ -3636,6 +3995,33 @@ dependencies = [
"unicode-ident", "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]] [[package]]
name = "system-deps" name = "system-deps"
version = "6.1.1" version = "6.1.1"
@ -3666,6 +4052,19 @@ version = "0.12.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b1c7f239eb94671427157bd93b3694320f3668d4e1eff08c7285366fd777fac" 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]] [[package]]
name = "termcolor" name = "termcolor"
version = "1.2.0" version = "1.2.0"
@ -3773,16 +4172,37 @@ dependencies = [
] ]
[[package]] [[package]]
name = "tokio" name = "tinyvec"
version = "1.35.1" version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" 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 = [ dependencies = [
"backtrace", "backtrace",
"bytes", "bytes",
"libc",
"mio",
"num_cpus", "num_cpus",
"parking_lot",
"pin-project-lite", "pin-project-lite",
"signal-hook-registry",
"socket2",
"tokio-macros", "tokio-macros",
"windows-sys 0.48.0",
] ]
[[package]] [[package]]
@ -3805,6 +4225,30 @@ dependencies = [
"syn 2.0.48", "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]] [[package]]
name = "toml" name = "toml"
version = "0.7.5" version = "0.7.5"
@ -3876,6 +4320,12 @@ dependencies = [
"serde_json", "serde_json",
] ]
[[package]]
name = "tower-service"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
[[package]] [[package]]
name = "tracing" name = "tracing"
version = "0.1.40" version = "0.1.40"
@ -3953,6 +4403,12 @@ dependencies = [
"syn 2.0.48", "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]] [[package]]
name = "tstr" name = "tstr"
version = "0.2.3" version = "0.2.3"
@ -4034,6 +4490,15 @@ version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" 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]] [[package]]
name = "unicode-script" name = "unicode-script"
version = "0.5.5" version = "0.5.5"
@ -4058,12 +4523,29 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" 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]] [[package]]
name = "valuable" name = "valuable"
version = "0.1.0" version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]] [[package]]
name = "vec_map" name = "vec_map"
version = "0.8.2" version = "0.8.2"
@ -4092,6 +4574,15 @@ dependencies = [
"winapi-util", "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]] [[package]]
name = "wasi" name = "wasi"
version = "0.11.0+wasi-snapshot-preview1" version = "0.11.0+wasi-snapshot-preview1"
@ -4123,6 +4614,18 @@ dependencies = [
"wasm-bindgen-shared", "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]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.87" version = "0.2.87"
@ -4322,6 +4825,15 @@ dependencies = [
"windows-targets 0.48.1", "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]] [[package]]
name = "windows-targets" name = "windows-targets"
version = "0.42.2" version = "0.42.2"
@ -4546,6 +5058,16 @@ dependencies = [
"memchr", "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]] [[package]]
name = "wio" name = "wio"
version = "0.2.2" version = "0.2.2"

View File

@ -42,15 +42,16 @@ core_extensions = { version = "1.5.2", default_features = false, features = [
"std", "std",
] } ] }
plotters-backend = "0.3.5" plotters-backend = "0.3.5"
tokio = { version = "1.35.1", features = [ #tokio = { version = "1.35.1", features = [
"time", # "time",
"fs", # "fs",
"io-std", # "io-std",
"macros", # "macros",
"num_cpus", # "num_cpus",
"bytes", # "bytes",
"io-util", # "io-util",
] } #] }
tokio = { version = "1.36.0", features = ["full"] }
async-trait = "0.1.77" async-trait = "0.1.77"
lazy_static = "1.4.0" lazy_static = "1.4.0"
once_cell = "1.19.0" once_cell = "1.19.0"
@ -87,6 +88,10 @@ tracing = "0.1.40"
tracing-subscriber = "0.3.18" tracing-subscriber = "0.3.18"
indexmap = "2.2.2" indexmap = "2.2.2"
tokio-condvar = "0.1.0" 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] [build-dependencies]

View File

@ -33,6 +33,8 @@ impl Plugin for ETWSLoader {
} }
fn load(&self, path: RStr<'_>) -> RResult<PluginResult, Error> where { fn load(&self, path: RStr<'_>) -> RResult<PluginResult, Error> 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()) { if let Ok(record) = Record::parse_from_path(path.to_string()) {
let result_blocks = record let result_blocks = record
.blocks .blocks
@ -87,6 +89,11 @@ impl Plugin for ETWSLoader {
CoordType::Other 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() { let shape = match b.info.dimension_size.len() {
1 => radarg_plugin_interface::DataShape::Vector, 1 => radarg_plugin_interface::DataShape::Vector,
2 => radarg_plugin_interface::DataShape::Matrix, 2 => radarg_plugin_interface::DataShape::Matrix,
@ -137,8 +144,8 @@ impl Plugin for ETWSLoader {
let meta = MetaData { let meta = MetaData {
datetime: RSome(record.filetime.timestamp()), datetime: RSome(record.filetime.timestamp()),
site_info: RNone, site_info: RNone,
lon_range: RSome([0.0, 0.0]), lon_range: RSome(lon_range),
lat_range: RSome([1.0, 1.0]), lat_range: RSome(lat_range),
data_format: RSome("Eastone Washon Radar".into()), data_format: RSome("Eastone Washon Radar".into()),
other_info: RNone, other_info: RNone,
}; };

View File

@ -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 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: `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: `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":"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"} {"$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"}

View File

@ -222,6 +222,8 @@ impl Component for AppModel {
*FILE_PATH_ROOT.lock().unwrap() = path.clone(); *FILE_PATH_ROOT.lock().unwrap() = path.clone();
let data = Self::open_file_only(path); let data = Self::open_file_only(path);
let meta: MetaInfo = (&data.meta).clone().into(); 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 element_impl = plugin_result_impl(&data);
let mut renderer = OffscreenRenderer::new(3000, 3000).unwrap(); let mut renderer = OffscreenRenderer::new(3000, 3000).unwrap();
let mut canvas = renderer.create_canvas(); let mut canvas = renderer.create_canvas();
@ -238,6 +240,9 @@ impl Component for AppModel {
let layer = let layer =
Layer::new(true, "New Layer".to_string(), AssoElement::Instant(element)); Layer::new(true, "New Layer".to_string(), AssoElement::Instant(element));
dialog_render_sender.emit(MonitorInputMsg::AddMetaItem(meta.to_map())); 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::NewLayer(layer)
} }
_ => AppMsg::Close, _ => AppMsg::Close,

View File

@ -67,11 +67,6 @@ impl SimpleComponent for ControlPanelModel {
println!("Selected: {}", step_selector.selected()); println!("Selected: {}", step_selector.selected());
}, },
} }
// gtk::Label{
// set_label: "Subheader",
// add_css_class:"h3",
// set_halign: gtk::Align::Start,
// }
}, },
#[local] #[local]
step_selector -> gtk::DropDown{ step_selector -> gtk::DropDown{

View File

@ -17,12 +17,14 @@ pub enum MonitorInputMsg {
UpdateMetaItem(HashMap<String, String>), UpdateMetaItem(HashMap<String, String>),
UpdateLayer((String, Box<dyn Fn(&mut Layer) + 'static>)), UpdateLayer((String, Box<dyn Fn(&mut Layer) + 'static>)),
RefreshLayerList, RefreshLayerList,
SetRenderRange(f64, f64, f64, f64),
None, None,
} }
impl Debug for MonitorInputMsg { impl Debug for MonitorInputMsg {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self { match self {
MonitorInputMsg::SetRenderRange(_, _, _, _) => write!(f, "MonitorInputMsg::SetRenderRange"),
MonitorInputMsg::RefreshLayerList => write!(f, "MonitorInputMsg::RefreshLayerList"), MonitorInputMsg::RefreshLayerList => write!(f, "MonitorInputMsg::RefreshLayerList"),
MonitorInputMsg::NewElement(_) => write!(f, "MonitorInputMsg::NewElement"), MonitorInputMsg::NewElement(_) => write!(f, "MonitorInputMsg::NewElement"),
MonitorInputMsg::AddLayer(_) => write!(f, "MonitorInputMsg::AddLayer"), MonitorInputMsg::AddLayer(_) => write!(f, "MonitorInputMsg::AddLayer"),

View File

@ -79,8 +79,6 @@ impl Component for MonitorModel {
#[name = "renderer"] #[name = "renderer"]
#[wrap(Some)] #[wrap(Some)]
set_child = &Render{ set_child = &Render{
// #[track = "model.changed(MonitorModel::new_layer())"]
// set_interior_layers: model.layers.clone(),
#[track = "model.changed(MonitorModel::render_cfg())"] #[track = "model.changed(MonitorModel::render_cfg())"]
set_cfg: model.render_cfg, set_cfg: model.render_cfg,
#[track = "model.changed(MonitorModel::render_range())"] #[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<Self>, root: &Self::Root) { fn update_with_view(&mut self, widgets: &mut Self::Widgets, message: Self::Input, sender: ComponentSender<Self>, root: &Self::Root) {
self.reset(); self.reset();
match message { match message {
MonitorInputMsg::AddLayer(layer) => { MonitorInputMsg::AddLayer(layer) => {
@ -126,6 +123,9 @@ impl Component for MonitorModel {
MonitorInputMsg::AddMetaItem(map) => { MonitorInputMsg::AddMetaItem(map) => {
self.sidebar.emit(SideBarInputMsg::AddMetaItems(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::ClearMetaItems => self.sidebar.emit(SideBarInputMsg::ClearMetaItems),
MonitorInputMsg::UpdateMetaItem(map) => { MonitorInputMsg::UpdateMetaItem(map) => {
self.sidebar.emit(SideBarInputMsg::ClearMetaItems); self.sidebar.emit(SideBarInputMsg::ClearMetaItems);
@ -193,16 +193,6 @@ impl Component for MonitorModel {
) { ) {
self.reset(); self.reset();
match msg { 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);
// }
_ => {} _ => {}
} }
} }

View File

@ -0,0 +1,6 @@
use crate::widgets::Layer;
relm4::safe_settings_and_actions! {
#[derive(Debug)]
pub(super) Visible(group: "layer", name: "layer-visible");
}

View File

@ -2,3 +2,4 @@ pub mod sidebar;
pub use sidebar::*; pub use sidebar::*;
pub mod bottom_bar; pub mod bottom_bar;
pub mod meta_data_list; pub mod meta_data_list;
mod actions;

View File

@ -1,8 +1,11 @@
use abi_stable::type_level::trait_marker::Hash; use abi_stable::type_level::trait_marker::Hash;
use relm4::safe_settings_and_actions::extensions::SafeSimpleAction;
use super::actions::*;
use glib::clone; use glib::clone;
use gtk::prelude::WidgetExt; use gtk::prelude::WidgetExt;
use gtk::prelude::*; use gtk::prelude::*;
use relm4::{ use relm4::{
gtk::gio,
binding::{Binding, U8Binding}, binding::{Binding, U8Binding},
factory::{DynamicIndex, FactoryComponent, FactorySender, FactoryVecDeque}, factory::{DynamicIndex, FactoryComponent, FactorySender, FactoryVecDeque},
prelude::*, prelude::*,
@ -26,11 +29,9 @@ use super::{
meta_data_list::{InfoColumn, MyListItem, TagColumn}, 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 { pub struct SideBarModel {
layers: Rc<RefCell<Vec<Layer>>>, layers: Rc<RefCell<Vec<Layer>>>,
selected_layer_idx: usize,
counter: u8, counter: u8,
list_view_wrapper: TypedListView<LayerItem, gtk::SingleSelection>, list_view_wrapper: TypedListView<LayerItem, gtk::SingleSelection>,
bottom_bar_vec: FactoryVecDeque<BottomBarModel>, bottom_bar_vec: FactoryVecDeque<BottomBarModel>,
@ -93,8 +94,7 @@ impl SimpleComponent for SideBarModel {
set_spacing: 5, set_spacing: 5,
} }
} }
}, }
}, },
layer_page = gtk::ScrolledWindow::builder() layer_page = gtk::ScrolledWindow::builder()
.vexpand(true) .vexpand(true)
@ -132,24 +132,9 @@ impl SimpleComponent for SideBarModel {
// Initialize the ListView wrapper // Initialize the ListView wrapper
let mut list_view_wrapper: TypedListView<LayerItem, gtk::SingleSelection> = let mut list_view_wrapper: TypedListView<LayerItem, gtk::SingleSelection> =
TypedListView::with_sorting(); TypedListView::with_sorting();
let mut bottom_bar_vec = FactoryVecDeque::new(gtk::Box::default(), sender.input_sender()); let mut bottom_bar_vec = FactoryVecDeque::new(gtk::Box::default(), sender.input_sender());
let mut group = relm4::actions::RelmActionGroup::<LayerActionGroup>::new();
let action: RelmAction<ToTime> = {
RelmAction::new_stateful_with_target_value(&(), move |_, state, _value| {
sender.output(SideBarOutputMsg::SwitchToTimeSeries(_value as usize)).unwrap()
})
};
let action2:RelmAction<BeTime> = RelmAction::new_stateless(|_| {
dbg!("be time");
});
group.add_action(action);
group.add_action(action2);
let app = relm4::main_application(); let app = relm4::main_application();
group.register_for_widget(root);
{ {
let mut bottom_bar_vec_guard = bottom_bar_vec.guard(); let mut bottom_bar_vec_guard = bottom_bar_vec.guard();
@ -165,6 +150,7 @@ impl SimpleComponent for SideBarModel {
let mut model = SideBarModel { let mut model = SideBarModel {
meta_list_view, meta_list_view,
layers: init, layers: init,
selected_layer_idx: 0,
counter: 0, counter: 0,
list_view_wrapper, list_view_wrapper,
bottom_bar_vec, bottom_bar_vec,
@ -269,8 +255,6 @@ impl RelmListItem for LayerItem {
fn setup(_item: &gtk::ListItem) -> (gtk::Box, Widgets) { fn setup(_item: &gtk::ListItem) -> (gtk::Box, Widgets) {
relm4::menu! { relm4::menu! {
main_menu: { main_menu: {
"Bind To Time" => ToTime(0),
"Be Time" => BeTime,
} }
} }
@ -326,8 +310,6 @@ impl RelmListItem for LayerItem {
relm4::menu! { relm4::menu! {
main_menu: { main_menu: {
"Bind To Time" => ToTime(self.key),
"Be Time" => BeTime,
} }
} }
menu.set_menu_model(Some(&main_menu)); menu.set_menu_model(Some(&main_menu));

View File

@ -26,6 +26,8 @@ use tracing::info;
use tracing_subscriber; use tracing_subscriber;
mod widgets; mod widgets;
mod data_utils; mod data_utils;
mod predefined;
mod map_tile_utils;
const APP_ID: &str = "org.tsuki.radar_g"; const APP_ID: &str = "org.tsuki.radar_g";
static RUNTIME: SafeLazy<Runtime> = static RUNTIME: SafeLazy<Runtime> =

9
src/map_tile_utils.rs Normal file
View File

@ -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
}

View File

@ -9,7 +9,8 @@ use crate::RUNTIME;
use crate::{coords::Range, widgets::widget::Widget}; use crate::{coords::Range, widgets::widget::Widget};
use chrono::{DateTime, TimeZone, Utc}; use chrono::{DateTime, TimeZone, Utc};
use core_extensions::SelfOps; 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 futures::StreamExt;
use glib::PropertyGet; use glib::PropertyGet;
use radarg_plugin_interface::PluginResult; use radarg_plugin_interface::PluginResult;
@ -149,8 +150,15 @@ impl InstantElement {
let result_id = match target.target { let result_id = match target.target {
TargetType::ImageId(id) => id, TargetType::ImageId(id) => id,
TargetType::Mem(ref mem) => { 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 let converted = canvas
.load_image_mem(mem, femtovg::ImageFlags::empty()) .create_image_from_native_texture(
texture,
ImageInfo::new(flags, 3000, 3000, PixelFormat::Rgba8),
)
.unwrap(); .unwrap();
target.set_target(TargetType::ImageId(converted)); target.set_target(TargetType::ImageId(converted));
converted converted
@ -168,17 +176,25 @@ impl InstantElement {
pub fn to_time_series( pub fn to_time_series(
self, self,
dispatcher: Rc<Dispatcher>, dispatcher: Rc<Dispatcher>,
cms:CMS cms: CMS,
) -> (TimeSeriesElement, DateTime<Utc>) { ) -> (TimeSeriesElement, DateTime<Utc>) {
// let imp = Arc::new(InstantElementImpl::new(self)); // let imp = Arc::new(InstantElementImpl::new(self));
if let InstantElementDrawerType::Prepared((target, imp)) = self.draw_type { if let InstantElementDrawerType::Prepared((target, imp)) = self.draw_type {
let mut time_series = TimeSeriesElement::new(imp, dispatcher, cms, self.key); let mut time_series = TimeSeriesElement::new(imp, dispatcher, cms, self.key);
let data = target.data.clone().unwrap().downcast::<PluginResult>().unwrap(); let data = target
.data
.clone()
.unwrap()
.downcast::<PluginResult>()
.unwrap();
let time_stamp = data.blocks.first().unwrap().datetime; 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::*; use chrono::prelude::*;
let time = Utc.timestamp_opt(time_stamp, 0).unwrap(); 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) (time_series, time)
} else { } else {
panic!("InstantElementDrawerType is not prepared"); panic!("InstantElementDrawerType is not prepared");
@ -294,15 +310,11 @@ impl TimeSeriesElement {
} }
{ {
registers registers.lock().unwrap().get_mut(&dt).map(|x| {
.lock() x.into_iter().for_each(|n| {
.unwrap()
.get_mut(&dt)
.map(|x|x.into_iter()
.for_each(|n| {
n.notify_waiters(); n.notify_waiters();
}) ) })
; });
} }
}) })
}); });
@ -383,6 +395,115 @@ impl Target {
((x2 - x1).abs(), (y2 - y1).abs()) ((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) { pub fn origin(&self, cms: &Render) -> (f32, f32) {
let (x, y) = self.bounds; let (x, y) = self.bounds;
let p1 = (x.0, y.1); let p1 = (x.0, y.1);

View File

@ -14,6 +14,7 @@ use ndarray::ArrayView2;
use num_traits::{AsPrimitive, FromPrimitive, Num, NumOps}; use num_traits::{AsPrimitive, FromPrimitive, Num, NumOps};
use std::{fmt::Debug, io::Cursor, marker::PhantomData}; use std::{fmt::Debug, io::Cursor, marker::PhantomData};
use gtk::ResponseType::No; use gtk::ResponseType::No;
use tracing::info;
#[derive(Debug)] #[derive(Debug)]
pub struct GridFieldRenderer<CMAP, T> pub struct GridFieldRenderer<CMAP, T>
@ -60,14 +61,14 @@ impl<T: NumOps + PartialOrd + Copy + FromPrimitive + AsPrimitive<f64>, CMAP: Col
let rt_lat = dim2[[r + 1, c + 1]]; let rt_lat = dim2[[r + 1, c + 1]];
let rt_lon = dim1[[r + 1, c + 1]]; let rt_lon = dim1[[r + 1, c + 1]];
let cell: LineString = vec![ // let cell: LineString = vec![
(lb_lon, lb_lat), // (lb_lon, lb_lat),
(rt_lon + 0.001, lb_lat), // (rt_lon + 0.001, lb_lat),
(rt_lon + 0.001, rt_lat), // (rt_lon + 0.001, rt_lat),
(lb_lon, rt_lat + 0.001), // (lb_lon, rt_lat + 0.001),
(lb_lon, lb_lat + 0.001), // (lb_lon, lb_lat + 0.001),
] // ]
.into(); // .into();
let v = &data[[r, c]]; let v = &data[[r, c]];
let mapped_color = self.cmap.map_value_to_color(*v, fill_value); let mapped_color = self.cmap.map_value_to_color(*v, fill_value);
@ -76,17 +77,20 @@ impl<T: NumOps + PartialOrd + Copy + FromPrimitive + AsPrimitive<f64>, CMAP: Col
continue; 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 path = Path::new();
let mut points = mapped_ring.points(); // let mut points = mapped_ring.points();
let first_point = points.next().unwrap(); // let first_point = points.next().unwrap();
path.move_to(first_point.x(), first_point.y()); // path.move_to(first_point.x(), first_point.y());
//
for point in points { // for point in points {
path.line_to(point.x(), point.y()); // path.line_to(point.x(), point.y());
} // }
path.close(); path.rect(ox, oy, (rx - ox) * 1.5, (ry - oy) * 1.5);
// path.close();
canvas.fill_path(&path, &Paint::color(mapped_color.unwrap())); canvas.fill_path(&path, &Paint::color(mapped_color.unwrap()));
} }
} }
@ -107,11 +111,11 @@ where
data: &Self::Data, data: &Self::Data,
size: (f32, f32), size: (f32, f32),
) -> Target { ) -> Target {
let start = std::time::Instant::now();
let (w, h) = size; let (w, h) = size;
let new_img = canvas let new_img = canvas
.create_image_empty(w as usize, h as usize, Rgba8, ImageFlags::empty()) .create_image_empty(w as usize, h as usize, Rgba8, ImageFlags::empty())
.expect("Can't Create Image"); .expect("Can't Create Image");
canvas.image_size(new_img).unwrap(); canvas.image_size(new_img).unwrap();
canvas.set_render_target(RenderTarget::Image(new_img)); canvas.set_render_target(RenderTarget::Image(new_img));
@ -126,6 +130,7 @@ where
cms.set_lat_range(lat_start..lat_end); cms.set_lat_range(lat_start..lat_end);
cms.set_lon_range(lon_start..lon_end); cms.set_lon_range(lon_start..lon_end);
info!("Time to prepare data: {:?}", start.elapsed());
self.draw_2d( self.draw_2d(
canvas, canvas,
@ -136,6 +141,7 @@ where
data.fill_value, data.fill_value,
); );
canvas.flush(); canvas.flush();
info!("Time to render: {:?}", start.elapsed());
let mut pixels: Vec<u8> = vec![0; w as usize * h as usize * 4]; let mut pixels: Vec<u8> = vec![0; w as usize * h as usize * 4];
unsafe { unsafe {
gl::ReadPixels( gl::ReadPixels(
@ -149,23 +155,25 @@ where
); );
debug_assert_eq!(gl::GetError(), gl::NO_ERROR); debug_assert_eq!(gl::GetError(), gl::NO_ERROR);
} }
info!("Time to read pixels: {:?}", start.elapsed());
let img: ImageBuffer<Rgba<u8>, Vec<u8>> = ImageBuffer::from_raw(w as u32, h as u32, pixels) // let img: ImageBuffer<Rgba<u8>, Vec<u8>> = ImageBuffer::from_raw(w as u32, h as u32, pixels)
.expect("Failed to create ImageBuffer"); // .expect("Failed to create ImageBuffer");
let thumbnail = resize(&img, 500, 500, image::imageops::FilterType::Lanczos3); // let thumbnail = resize(&img, 500, 500, image::imageops::FilterType::Lanczos3);
let mut thumb_buffer = Cursor::new(Vec::new()); // let mut thumb_buffer = Cursor::new(Vec::new());
img.write_to(&mut thumb_buffer, image::ImageOutputFormat::Png) // img.write_to(&mut thumb_buffer, image::ImageOutputFormat::Png)
.expect("Failed to write PNG buffer"); // .expect("Failed to write PNG buffer");
let thumb_data = thumb_buffer.into_inner(); // info!("Time to write PNG: {:?}", start.elapsed());
let thumbnail_tex = // let thumb_data = thumb_buffer.into_inner();
gtk::gdk::Texture::from_bytes(&gtk::glib::Bytes::from(&thumb_data)).unwrap(); // let thumbnail_tex =
// gtk::gdk::Texture::from_bytes(&gtk::glib::Bytes::from(&thumb_data)).unwrap();
// 将 ImageBuffer 编码为 PNG // 将 ImageBuffer 编码为 PNG
let mut png_buffer = Cursor::new(Vec::new()); // let mut png_buffer = Cursor::new(Vec::new());
img.write_to(&mut png_buffer, image::ImageOutputFormat::Bmp) // img.write_to(&mut png_buffer, image::ImageOutputFormat::Bmp)
.expect("Failed to write PNG buffer"); // .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_start = (data.dim1.view()).first().unwrap().clone();
let d1_end = (data.dim1.view()).last().unwrap().clone(); let d1_end = (data.dim1.view()).last().unwrap().clone();
@ -175,11 +183,12 @@ where
canvas.set_render_target(RenderTarget::Screen); canvas.set_render_target(RenderTarget::Screen);
Target::new( Target::new(
TargetType::Mem(png_data), TargetType::Mem(pixels),
w, w,
h, h,
((d1_start, d1_end).into(), (d2_start, d2_end).into()), ((d1_start, d1_end).into(), (d2_start, d2_end).into()),
Some(thumbnail_tex), // Some(thumbnail_tex),
None,
None None
) )
} }

View File

@ -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);
}
}

1
src/predefined/mod.rs Normal file
View File

@ -0,0 +1 @@
mod map_tile;

View File

@ -51,6 +51,7 @@ pub struct Render {
pub(super) exterior: RefCell<ExteriorWidget>, pub(super) exterior: RefCell<ExteriorWidget>,
pub(super) interior: RefCell<InteriorWidget>, pub(super) interior: RefCell<InteriorWidget>,
pub(super) canvas: RefCell<Option<femtovg::Canvas<femtovg::renderer::OpenGl>>>, pub(super) canvas: RefCell<Option<femtovg::Canvas<femtovg::renderer::OpenGl>>>,
pub(super) glow_context: RefCell<Option<glow::Context>>,
pub config: RefCell<RenderConfig>, pub config: RefCell<RenderConfig>,
pub status: RefCell<RenderStatus>, pub status: RefCell<RenderStatus>,
pub mapper: RefCell<Mapper>, pub mapper: RefCell<Mapper>,
@ -63,6 +64,7 @@ impl Default for Render {
render_status: Cell::new(0), render_status: Cell::new(0),
exterior: RefCell::new(ExteriorWidget::default()), exterior: RefCell::new(ExteriorWidget::default()),
interior: RefCell::new(InteriorWidget::default()), interior: RefCell::new(InteriorWidget::default()),
glow_context: RefCell::new(None),
interior_layers: RefCell::new(Rc::new(RefCell::new(Vec::new()))), interior_layers: RefCell::new(Rc::new(RefCell::new(Vec::new()))),
config: RefCell::new(RenderConfig::default()), config: RefCell::new(RenderConfig::default()),
status: RefCell::new(RenderStatus::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) let id = NonZeroU32::new(ctx.get_parameter_i32(glow::DRAW_FRAMEBUFFER_BINDING) as u32)
.expect("No GTK provided framebuffer binding"); .expect("No GTK provided framebuffer binding");
ctx.bind_framebuffer(glow::FRAMEBUFFER, None); ctx.bind_framebuffer(glow::FRAMEBUFFER, None);
self.glow_context.replace(Some(ctx));
(renderer, glow::NativeFramebuffer(id)) (renderer, glow::NativeFramebuffer(id))
}; };
renderer.set_screen_target(Some(fbo)); renderer.set_screen_target(Some(fbo));

View File

@ -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<dyn LayerImpl + Send + Sync>,
Arc<Mutex<CanvasWrapper>>,
CMS,
) -> Target
+ Sync
+ Send,
>,
>,
>,
>;
type DrawFunc = Arc<dyn Fn(&Layer, Render, (f32, f32)) + Send + Sync>;
pub type LayerImplSync = Arc<Mutex<Box<dyn LayerImpl + Send + Sync>>>;
#[derive(Clone)]
pub struct Layer {
pub visiable: bool,
pub name: String,
pub widgets: Arc<Mutex<Option<Vec<Box<dyn Widget>>>>>,
target: Arc<Mutex<Option<Target>>>,
prepare: PrepareFunc,
imp: Option<Arc<Mutex<Box<dyn LayerImpl + Send + Sync>>>>,
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<OpenGl>, cms: &CMS) -> Option<Target>;
}
impl Layer {
pub fn new<
F: 'static + Fn(&Self, Render, (f32, f32)) + Send + Sync,
PREPARE: FnOnce(LayerImplSync, Arc<Mutex<CanvasWrapper>>, CMS) -> Target + Send + Sync + 'static,
IMP: LayerImpl + Sync + Send + 'static,
>(
visiable: bool,
draw: F,
widgets: Option<Vec<Box<dyn Widget>>>,
layer_name: String,
prepare: Option<PREPARE>,
imp: Option<IMP>,
) -> 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<Mutex<CanvasWrapper>>, CMS) -> Target
+ Sync
+ Send,
>
}))),
draw: Arc::new(Box::new(draw)),
imp: imp.map(|i| {
Arc::new(Mutex::new(
Box::new(i) as Box<dyn LayerImpl + Send + Sync + 'static>
))
}),
}
}
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<Mutex<Option<Target>>> {
self.target.clone()
}
pub fn get_imp(&self) -> Option<Arc<Mutex<Box<dyn LayerImpl + Sync + Send + 'static>>>> {
// self.imp.map(|p| p.clone())
self.imp.clone()
}
pub fn get_thumbnail(&self) -> Option<gtk::gdk::Texture> {
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<gtk::gdk::Texture>,
// pub width: f32,
// pub height: f32,
// pub bounds: (Range, Range),
// }
//
// #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)]
// pub enum TargetType {
// ImageId(ImageId),
// Mem(Vec<u8>),
// }
//
// impl Target {
// pub fn new(
// target: TargetType,
// width: f32,
// height: f32,
// bounds: (Range, Range),
// thumbnail: Option<gtk::gdk::Texture>,
// ) -> 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;
// }
// }

View File

@ -35,6 +35,7 @@ pub enum AssoElement {
#[derive(Clone)] #[derive(Clone)]
pub struct Layer { pub struct Layer {
pub visiable: bool, pub visiable: bool,
pub alpha: f32,
pub name: String, pub name: String,
associated_element: AssoElement, associated_element: AssoElement,
time: Option<DateTime<Utc>>, time: Option<DateTime<Utc>>,
@ -55,6 +56,7 @@ pub trait LayerImpl: Debug {
impl Layer { impl Layer {
pub fn new(visiable: bool, layer_name: String, element: AssoElement) -> Self { pub fn new(visiable: bool, layer_name: String, element: AssoElement) -> Self {
Layer { Layer {
alpha: 1.0,
visiable, visiable,
name: layer_name, name: layer_name,
associated_element: element, 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(); let mut path = femtovg::Path::new();
path.rect(ox, oy, x, y); path.rect(ox, oy, x, y);
canvas.fill_path(&path, &paint); canvas.fill_path(&path, &paint);
@ -119,6 +121,10 @@ impl Layer {
None None
} }
pub fn set_alpha(&mut self, alpha: f32) {
self.alpha = alpha;
}
pub fn change_visiable(&mut self, visiable: bool) { pub fn change_visiable(&mut self, visiable: bool) {
self.visiable = visiable; self.visiable = visiable;
} }

View File

@ -0,0 +1,30 @@
pub(super) struct MapTile {
server: Option<String>,
lat_range: (f64, f64),
lon_range: (f64, f64),
zoom: u8,
}
impl MapTile{
pub fn new(server: Option<String>, lat_range: (f64, f64), lon_range: (f64, f64), zoom: u8) -> MapTile {
MapTile {
server,
lat_range,
lon_range,
zoom,
}
}
pub fn get_server(&self) -> Option<String> {
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
}
}

View File

@ -1,5 +1,7 @@
mod imp; mod imp;
mod layers; mod layers;
mod map_tile;
use super::super::Render; use super::super::Render;
use femtovg::{renderer::OpenGl, Canvas}; use femtovg::{renderer::OpenGl, Canvas};
pub use layers::{Layer, LayerImpl, LayerImplSync, AssoElement}; pub use layers::{Layer, LayerImpl, LayerImplSync, AssoElement};

View File

@ -112,6 +112,10 @@ impl Render {
self.imp().canvas.borrow_mut() self.imp().canvas.borrow_mut()
} }
pub fn get_context(&self) -> RefMut<'_, Option<glow::Context>> {
self.imp().glow_context.borrow_mut()
}
pub fn set_cfg(&self, cfg: RenderConfig) { pub fn set_cfg(&self, cfg: RenderConfig) {
self.imp().config.replace(cfg); self.imp().config.replace(cfg);
} }