quiet zone

This commit is contained in:
kieran 2025-01-12 11:00:18 +00:00
parent e54cf8a1bd
commit f9cf52b7ea
No known key found for this signature in database
GPG Key ID: DE71CEB3925BE941
2 changed files with 175 additions and 13 deletions

166
Cargo.lock generated
View File

@ -547,9 +547,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.2.7"
version = "1.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7"
checksum = "ad0cf6e91fde44c773c6ee7ec6bba798504641a8bc2eb7e37a04ffbf4dfaa55a"
dependencies = [
"jobserver",
"libc",
@ -992,6 +992,16 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "erased-serde"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d"
dependencies = [
"serde",
"typeid",
]
[[package]]
name = "errno"
version = "0.3.10"
@ -1566,6 +1576,12 @@ dependencies = [
"hashbrown",
]
[[package]]
name = "itoa"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "jni"
version = "0.21.1"
@ -1681,9 +1697,12 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.22"
version = "0.4.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
checksum = "3d6ea2a48c204030ee31a7d7fc72c93294c92fe87ecb1789881c9543516e1a0d"
dependencies = [
"value-bag",
]
[[package]]
name = "malloc_buf"
@ -2368,6 +2387,12 @@ dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "ryu"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
name = "same-file"
version = "1.0.6"
@ -2422,6 +2447,15 @@ dependencies = [
"syn 2.0.96",
]
[[package]]
name = "serde_fmt"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1d4ddca14104cd60529e8c7f7ba71a2c8acd8f7f5cfcdc2faf97eeb7c3010a4"
dependencies = [
"serde",
]
[[package]]
name = "serde_repr"
version = "0.1.19"
@ -2561,6 +2595,84 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
[[package]]
name = "sval"
version = "2.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6dc0f9830c49db20e73273ffae9b5240f63c42e515af1da1fceefb69fceafd8"
[[package]]
name = "sval_buffer"
version = "2.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "429922f7ad43c0ef8fd7309e14d750e38899e32eb7e8da656ea169dd28ee212f"
dependencies = [
"sval",
"sval_ref",
]
[[package]]
name = "sval_dynamic"
version = "2.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68f16ff5d839396c11a30019b659b0976348f3803db0626f736764c473b50ff4"
dependencies = [
"sval",
]
[[package]]
name = "sval_fmt"
version = "2.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c01c27a80b6151b0557f9ccbe89c11db571dc5f68113690c1e028d7e974bae94"
dependencies = [
"itoa",
"ryu",
"sval",
]
[[package]]
name = "sval_json"
version = "2.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0deef63c70da622b2a8069d8600cf4b05396459e665862e7bdb290fd6cf3f155"
dependencies = [
"itoa",
"ryu",
"sval",
]
[[package]]
name = "sval_nested"
version = "2.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a39ce5976ae1feb814c35d290cf7cf8cd4f045782fe1548d6bc32e21f6156e9f"
dependencies = [
"sval",
"sval_buffer",
"sval_ref",
]
[[package]]
name = "sval_ref"
version = "2.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb7c6ee3751795a728bc9316a092023529ffea1783499afbc5c66f5fabebb1fa"
dependencies = [
"sval",
]
[[package]]
name = "sval_serde"
version = "2.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a5572d0321b68109a343634e3a5d576bf131b82180c6c442dee06349dfc652a"
dependencies = [
"serde",
"sval",
"sval_nested",
]
[[package]]
name = "syn"
version = "1.0.109"
@ -2735,6 +2847,12 @@ dependencies = [
"rustc-hash",
]
[[package]]
name = "typeid"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e"
[[package]]
name = "typenum"
version = "1.17.0"
@ -2799,6 +2917,42 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "value-bag"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2"
dependencies = [
"value-bag-serde1",
"value-bag-sval2",
]
[[package]]
name = "value-bag-serde1"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bb773bd36fd59c7ca6e336c94454d9c66386416734817927ac93d81cb3c5b0b"
dependencies = [
"erased-serde",
"serde",
"serde_fmt",
]
[[package]]
name = "value-bag-sval2"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a916a702cac43a88694c97657d449775667bcd14b70419441d05b7fea4a83a"
dependencies = [
"sval",
"sval_buffer",
"sval_dynamic",
"sval_fmt",
"sval_json",
"sval_ref",
"sval_serde",
]
[[package]]
name = "version_check"
version = "0.9.5"
@ -3515,9 +3669,9 @@ dependencies = [
[[package]]
name = "winnow"
version = "0.6.23"
version = "0.6.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b129b5fb432e82eb9878736362d1f1710975adbdca1b9be5145470ae92a5d651"
checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a"
dependencies = [
"memchr",
]

View File

@ -9,12 +9,14 @@ enum CodeSrc<'a> {
pub struct QrCodeWidget<'a> {
code: CodeSrc<'a>,
quiet_zone: f32,
}
impl<'a> QrCodeWidget<'a> {
pub fn new(code: &'a QrCode) -> Self {
QrCodeWidget {
code: CodeSrc::Ref(code),
quiet_zone: 1.,
}
}
@ -22,31 +24,37 @@ impl<'a> QrCodeWidget<'a> {
let code = QrCode::new(data)?;
Ok(QrCodeWidget {
code: CodeSrc::Owned(code),
quiet_zone: 1.,
})
}
pub fn quiet_zone(mut self, quiet_zone: f32) -> Self {
self.quiet_zone = quiet_zone;
self
}
}
impl Widget for QrCodeWidget<'_> {
fn ui(self, ui: &mut Ui) -> Response {
let size = ui.available_size();
let outer_size = ui.available_size();
let code_ref = match &self.code {
CodeSrc::Ref(code) => code,
CodeSrc::Owned(q) => q,
};
let w = code_ref.width();
let scale = (size.x.min(size.y) / w as f32).floor();
let start = ui.cursor().min;
let (response, painter) =
ui.allocate_painter(vec2(w as f32 * scale, w as f32 * scale), Sense::click());
let min_size = outer_size.x.min(outer_size.y);
let scale = min_size / (w as f32 + (self.quiet_zone * 2.));
let start = ui.cursor().min + vec2(self.quiet_zone * scale, self.quiet_zone * scale);
let (response, painter) = ui.allocate_painter(vec2(min_size, min_size), Sense::click());
painter.rect(response.rect, Rounding::ZERO, Color32::WHITE, Stroke::NONE);
let mut ctr = 0;
for c in code_ref.to_colors() {
let row = ctr / w;
let col = ctr % w;
let c_start = start + vec2(col as f32 * scale, row as f32 * scale);
let c_end = c_start + vec2(scale, scale);
let c_start = start.floor() + vec2(col as f32 * scale, row as f32 * scale).floor();
let c_end = c_start.ceil() + vec2(scale, scale).ceil();
if matches!(c, Color::Dark) {
painter.rect(
Rect::from_min_max(c_start, c_end),