Initial commit

This commit is contained in:
2025-12-28 02:25:12 -06:00
commit a48220d3d7
7 changed files with 4907 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/target

4792
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

14
Cargo.toml Normal file
View File

@@ -0,0 +1,14 @@
[package]
name = "bretting-templates"
version = "0.1.0"
edition = "2024"
[dependencies]
anyhow_serde = "1.0.101"
eframe = "0.33.3"
evalexpr = "13.1.0"
image = { version = "0.25.9", default-features = false, features = ["bmp", "rayon"] }
minijinja = "2.14.0"
rfd = "0.16.0"
ron = "0.12.0"
serde = { version = "1.0.228", features = ["derive"] }

0
fail.txt Normal file
View File

66
src/app.rs Normal file
View File

@@ -0,0 +1,66 @@
use eframe::egui::{self, Id};
use rfd::FileDialog;
use crate::template::{self, Template};
pub struct MyEguiApp {
templates: Vec<Template>,
selected_template: Option<usize>,
error_modal: bool,
error_value: Option<anyhow_serde::Error>,
}
impl MyEguiApp {
pub fn new(cc: &eframe::CreationContext<'_>) -> Self {
MyEguiApp { templates: Vec::new(), selected_template: None, error_modal: false, error_value: None}
}
}
impl eframe::App for MyEguiApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("Hello, World!");
if ui.button("Add Template").clicked() {
let file = FileDialog::new().add_filter("text", &["txt"]).set_directory("/").pick_file();
if let Some(path) = file {
match template::Template::from_file(path) {
Ok(templ) => self.templates.push(templ),
Err(e) => {
self.error_value = Some(e);
self.error_modal = true;
}
}
};
};
if self.error_modal {
egui::Modal::new(Id::new("Error Box")).show(ui.ctx(), |ui| {
ui.heading("An Error Has Occurred");
ui.label(format!("{:?}", self.error_value));
if ui.button("Okay").clicked() {
self.error_modal = false;
self.error_value = None;
}
});
}
let combo_text = match self.selected_template {
Some(num) => {&self.templates[num].get_label()}
None => "Select a template"
};
egui::ComboBox::from_label("Template").selected_text(combo_text).show_ui(ui, |ui| {
if self.templates.is_empty() {
ui.label("No templates loaded");
} else {
for i in self.templates.iter().enumerate() {
ui.selectable_value(&mut self.selected_template, Some(i.0), i.1.get_label());
}
}
})
});
}
}

10
src/main.rs Normal file
View File

@@ -0,0 +1,10 @@
mod app;
mod template;
fn main() {
let native_options = eframe::NativeOptions::default();
eframe::run_native("test app", native_options, Box::new(|cc| Ok(Box::new(app::MyEguiApp::new(cc)))));
}

24
src/template.rs Normal file
View File

@@ -0,0 +1,24 @@
use serde::{Deserialize, Serialize};
use anyhow_serde::{Context, Result};
#[derive(Serialize, Deserialize)]
pub struct Template {
label: String,
content: Vec<u8>,
}
impl Template {
pub fn new() -> Self {
Template { label: "Template".to_string(), content: Vec::new() }
}
pub fn from_file<P: AsRef<std::path::Path>>(path: P) -> Result<Self> {
let errfile = path.as_ref().to_string_lossy().to_string();
let file = std::fs::File::open(path).with_context(|| format!("Failed to open file at location: {:?}", errfile))?;
ron::de::from_reader(file).context("Template Contents Invalid")
}
pub fn get_label(&self) -> &str {
self.label.as_str()
}
}