81 lines
2.1 KiB
Rust
81 lines
2.1 KiB
Rust
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<OsString>,
|
|
text: Vec<String>,
|
|
}
|
|
|
|
impl Cli {
|
|
pub fn text(&self) -> &Vec<String> {
|
|
&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<u8>,
|
|
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);
|
|
});
|
|
}
|
|
}
|