use std::ffi::OsString; use clap::Parser; use eframe::egui; use egui_extras::RetainedImage; use fast_qr::convert::image::ImageBuilder; use godiva::qr::*; #[derive(Parser, Debug)] #[clap(author, version, trailing_var_arg = true)] struct Cli { #[clap(long, short, help = "File to expose")] pub file: Option, text: Vec, } impl Cli { pub fn text(&self) -> &Vec { &self.text } } fn main() -> Result<(), eframe::Error> { env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`). let cli = Cli::parse(); let content = if let Some(file) = cli.file { file.to_string_lossy().bytes().collect() } else { cli.text().join(" ").bytes().collect() }; //println!("content: {content}"); let options = eframe::NativeOptions { initial_window_size: Some(egui::vec2(1200.0, 1200.0)), ..Default::default() }; eframe::run_native( "Show an image with eframe/egui", options, Box::new(|_cc| { Box::new(Flasher { content, mode: Mode::Ascii, }) }), ) } struct Flasher { pub content: Vec, pub mode: Mode, } impl eframe::App for Flasher { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { let heading_text = String::from_utf8(self.content.clone()).unwrap(); let len = heading_text.len(); ui.heading(heading_text); let size = get_size(len, self.mode); let version = get_version(size, fast_qr::ECL::H); let qr = fast_qr::QRBuilder::new(self.content.clone()) .version(version) .build() .unwrap(); let bytes = ImageBuilder::default() .fit_width(1100) .to_pixmap(&qr) .encode_png() .unwrap(); let img = RetainedImage::from_image_bytes("generated qr code", &bytes).unwrap(); img.show(ui); }); } }