Switching to main

This commit is contained in:
2026-03-24 00:33:00 +00:00
parent b99015fc1b
commit 00b87e5774
2 changed files with 63 additions and 52 deletions

View File

@@ -1,9 +1,8 @@
use std::sync::mpsc; use std::{hash::Hash, sync::mpsc};
use std::collections::HashMap; use std::collections::HashMap;
use crate::templates::{self, Template}; use crate::templates::{self, Template};
use egui::{Align, Layout};
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
use wasm_bindgen_futures; use wasm_bindgen_futures;
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
@@ -12,8 +11,6 @@ use web_sys;
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
use smol; use smol;
use tinytemplate::TinyTemplate;
/// We derive Deserialize/Serialize so we can persist app state on shutdown. /// We derive Deserialize/Serialize so we can persist app state on shutdown.
#[derive(serde::Deserialize, serde::Serialize)] #[derive(serde::Deserialize, serde::Serialize)]
#[serde(default)] // if we add new fields, give them default values when deserializing old state #[serde(default)] // if we add new fields, give them default values when deserializing old state
@@ -39,7 +36,7 @@ pub struct TemplateApp {
pub enum Message { pub enum Message {
AddTemplate(Template), AddTemplate(Template),
RemoveTemplate(String),
} }
impl Default for TemplateApp { impl Default for TemplateApp {
@@ -50,7 +47,7 @@ impl Default for TemplateApp {
label: "Hello World!".to_owned(), label: "Hello World!".to_owned(),
value: 2.7, value: 2.7,
templates: HashMap::new(), templates: HashMap::new(),
active_template: "Select a template".to_string(), active_template: "No Template Loaded".to_string(),
preview_text: "No File Selected".to_string(), preview_text: "No File Selected".to_string(),
messaging: mpsc::channel(), messaging: mpsc::channel(),
} }
@@ -65,20 +62,20 @@ impl TemplateApp {
// Load previous app state (if any). // Load previous app state (if any).
// Note that you must enable the `persistence` feature for this to work. // Note that you must enable the `persistence` feature for this to work.
if let Some(storage) = cc.storage { if let Some(_storage) = cc.storage {
eframe::get_value(storage, eframe::APP_KEY).unwrap_or_default() //eframe::get_value(storage, eframe::APP_KEY).unwrap_or_default()
Default::default()
} else { } else {
Default::default() Default::default()
} }
} }
} }
impl eframe::App for TemplateApp { impl eframe::App for TemplateApp {
/// Called by the framework to save state before shutdown. /// Called by the framework to save state before shutdown.
fn save(&mut self, storage: &mut dyn eframe::Storage) { //fn save(&mut self, storage: &mut dyn eframe::Storage) {
eframe::set_value(storage, eframe::APP_KEY, self); // eframe::set_value(storage, eframe::APP_KEY, self);
} //}
/// Called each time the UI needs repainting, which may be many times per second. /// Called each time the UI needs repainting, which may be many times per second.
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
@@ -90,6 +87,7 @@ impl eframe::App for TemplateApp {
for i in self.messaging.1.try_iter() { for i in self.messaging.1.try_iter() {
match i { match i {
Message::AddTemplate(t) => add_template(&mut self.templates, t.name.clone(), t), Message::AddTemplate(t) => add_template(&mut self.templates, t.name.clone(), t),
Message::RemoveTemplate(t) => remove_template(&mut self.templates, t),
} }
} }
@@ -97,16 +95,25 @@ impl eframe::App for TemplateApp {
// The top panel is often a good place for a menu bar: // The top panel is often a good place for a menu bar:
egui::MenuBar::new().ui(ui, |ui| { egui::MenuBar::new().ui(ui, |ui| {
// NOTE: no File->Quit on web pages! egui::containers::Sides::new().show(ui, |left_ui| {
if !is_web { left_ui.menu_button("File", |ui| {
ui.menu_button("File", |ui| { if ui.button("Add Template").clicked() {
if ui.button("Quit").clicked() { test_async(self.messaging.0.clone());
ctx.send_viewport_cmd(egui::ViewportCommand::Close); }
if ui.button("Remove Template").clicked() {
}
// NOTE: no File->Quit on web pages!
if !is_web {
if ui.button("Quit").clicked() {
ctx.send_viewport_cmd(egui::ViewportCommand::Close);
}
} }
}); });
ui.add_space(16.0); left_ui.add_space(16.0);
} }, |right_ui| {
egui::widgets::global_theme_preference_buttons(ui); egui::widgets::global_theme_preference_buttons(right_ui);
});
}); });
}); });
@@ -117,10 +124,11 @@ impl eframe::App for TemplateApp {
}); });
}); });
egui::CentralPanel::default().show(ctx, |ui| { let size = ctx.available_rect();
egui::SidePanel::left("left_panel").exact_width(size.width()/3.).resizable(false).show(ctx, |ui| {
// The central panel the region left after adding TopPanel's and SidePanel's // The central panel the region left after adding TopPanel's and SidePanel's
egui::containers::Sides::new().show(ui, |ui|{ ui.horizontal(|ui| {
ui.with_layout(Layout::top_down(Align::LEFT), |ui| { ui.vertical(|ui| {
ui.heading("eframe template"); ui.heading("eframe template");
ui.horizontal(|ui| { ui.horizontal(|ui| {
@@ -132,16 +140,8 @@ impl eframe::App for TemplateApp {
self.value += 1.0; self.value += 1.0;
} }
if ui.button("rfd").clicked() {
test_async(self.messaging.0.clone());
}
ui.separator(); ui.separator();
if self.templates.is_empty() {
}
egui::containers::ComboBox::from_label("Select a template") egui::containers::ComboBox::from_label("Select a template")
.selected_text(self.active_template.clone()) .selected_text(self.active_template.clone())
.show_ui(ui, |x| { .show_ui(ui, |x| {
@@ -149,7 +149,6 @@ impl eframe::App for TemplateApp {
x.selectable_value(&mut self.active_template, name.clone(), name.clone()); x.selectable_value(&mut self.active_template, name.clone(), name.clone());
} }
}); });
ui.separator(); ui.separator();
ui.add(egui::github_link_file!( ui.add(egui::github_link_file!(
@@ -157,20 +156,22 @@ impl eframe::App for TemplateApp {
"Source code." "Source code."
)); ));
}); });
}, |ui| {
let selected = match self.templates.get(&self.active_template.clone()) {
Some(t) => {
let text = t.text_files.iter().next();
match text {
Some(t) => t.1.clone(),
None => "No File Selected".to_string(),
}
},
None => "No File Selected".to_string()
};
ui.label(selected);
}); });
}); });
egui::CentralPanel::default().show(ctx, |ui| {
let selected = match self.templates.get(&self.active_template) {
Some(t) => {
let text = t.text_files.iter().next();
match text {
Some(t) => t.1.clone(),
None => "No File Selected".to_string(),
}
},
None => "No File Selected".to_string()
};
ui.label(selected);
});
} }
} }
@@ -209,12 +210,17 @@ fn test_async(test: mpsc::Sender<Message>) {
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
web_sys::console::log_1(&string_data.clone().into()); web_sys::console::log_1(&string_data.clone().into());
let mut new_template = Template::new("Untitled".to_string());
let _ = test.send(Message::AddTemplate(Template::new(string_data))); new_template.text_files.push((name, string_data));
let _ = test.send(Message::AddTemplate(new_template));
} }
}); });
} }
fn template_popup() {
}
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
fn execute<F: Future<Output = ()> + Send + 'static>(f: F) { fn execute<F: Future<Output = ()> + Send + 'static>(f: F) {
std::thread::spawn(move || smol::block_on(f)); std::thread::spawn(move || smol::block_on(f));
@@ -227,7 +233,10 @@ fn execute<F: Future<Output = ()> + 'static>(f: F) {
web_sys::console::log_1(&"Async End".into()); web_sys::console::log_1(&"Async End".into());
} }
fn add_template(map: &mut HashMap<String, Template>, label: String, template: Template) { fn add_template(map: &mut HashMap<String, Template>, label: String, template: Template) {
map.insert(label, template); map.insert(label, template);
} }
fn remove_template(map: &mut HashMap<String, Template>, label: String) {
let _ = map.remove(&label);
}

View File

@@ -1,6 +1,4 @@
use std::hash::Hash; use tinytemplate::TinyTemplate;
#[derive(serde::Serialize, serde::Deserialize, Eq)] #[derive(serde::Serialize, serde::Deserialize, Eq)]
#[serde(default)] #[serde(default)]
@@ -20,6 +18,10 @@ impl Template {
config: String::new(), config: String::new(),
} }
} }
pub fn generate(&self) {
}
} }
impl Default for Template { impl Default for Template {
@@ -44,7 +46,7 @@ impl PartialEq<String> for Template {
} }
} }
impl Hash for Template { impl std::hash::Hash for Template {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) { fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.name.hash(state); self.name.hash(state);
} }