This commit is contained in:
kieran 2025-01-10 20:34:31 +00:00
commit 113ac26d38
No known key found for this signature in database
GPG Key ID: DE71CEB3925BE941
5 changed files with 2731 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

2655
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

11
Cargo.toml Normal file
View File

@ -0,0 +1,11 @@
[package]
name = "egui_qr"
version = "0.1.0"
edition = "2021"
[dependencies]
egui = { version = "^0.20", default-features = false }
qrcode = { version = "0.14.1", default-features = false }
[dev-dependencies]
eframe = "^0.20"

23
examples/main.rs Normal file
View File

@ -0,0 +1,23 @@
use eframe::{Frame, NativeOptions};
use egui::{CentralPanel, Context, Widget};
use egui_qr::QrCodeWidget;
use qrcode::QrCode;
fn main() {
let _ = eframe::run_native(
"egui_qr",
NativeOptions::default(),
Box::new(|_| Box::new(App)),
);
}
struct App;
impl eframe::App for App {
fn update(&mut self, ctx: &Context, frame: &mut Frame) {
let code = QrCode::new(b"hello").unwrap();
CentralPanel::default().show(ctx, |ui| {
QrCodeWidget::new(&code).ui(ui);
});
}
}

41
src/lib.rs Normal file
View File

@ -0,0 +1,41 @@
use egui::{vec2, Color32, Rect, Response, Rounding, Sense, Stroke, Ui, Widget};
use qrcode::{Color, QrCode};
pub struct QrCodeWidget<'a> {
code: &'a QrCode,
}
impl<'a> QrCodeWidget<'a> {
pub fn new(code: &'a QrCode) -> Self {
QrCodeWidget { code }
}
}
impl Widget for QrCodeWidget<'_> {
fn ui(self, ui: &mut Ui) -> Response {
let size = ui.available_size();
let (response, painter) = ui.allocate_painter(size, Sense::click());
let w = self.code.width();
let start = response.rect.min;
let mut ctr = 0;
let scale = (size.x / w as f32).floor();
for c in self.code.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);
painter.rect(
Rect::from_min_max(c_start, c_end),
Rounding::none(),
match c {
Color::Light => Color32::WHITE,
Color::Dark => Color32::BLACK,
},
Stroke::NONE,
);
ctr += 1;
}
response
}
}