diff --git a/src/app.rs b/src/app.rs index fd0c637..33832a8 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,9 +1,8 @@ -use std::sync::mpsc; +use std::{hash::Hash, sync::mpsc}; use std::collections::HashMap; use crate::templates::{self, Template}; -use egui::{Align, Layout}; #[cfg(target_arch = "wasm32")] use wasm_bindgen_futures; #[cfg(target_arch = "wasm32")] @@ -12,8 +11,6 @@ use web_sys; #[cfg(not(target_arch = "wasm32"))] use smol; -use tinytemplate::TinyTemplate; - /// We derive Deserialize/Serialize so we can persist app state on shutdown. #[derive(serde::Deserialize, serde::Serialize)] #[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 { AddTemplate(Template), - + RemoveTemplate(String), } impl Default for TemplateApp { @@ -50,7 +47,7 @@ impl Default for TemplateApp { label: "Hello World!".to_owned(), value: 2.7, templates: HashMap::new(), - active_template: "Select a template".to_string(), + active_template: "No Template Loaded".to_string(), preview_text: "No File Selected".to_string(), messaging: mpsc::channel(), } @@ -65,20 +62,20 @@ impl TemplateApp { // Load previous app state (if any). // Note that you must enable the `persistence` feature for this to work. - if let Some(storage) = cc.storage { - eframe::get_value(storage, eframe::APP_KEY).unwrap_or_default() + if let Some(_storage) = cc.storage { + //eframe::get_value(storage, eframe::APP_KEY).unwrap_or_default() + Default::default() } else { Default::default() } } - } impl eframe::App for TemplateApp { /// Called by the framework to save state before shutdown. - fn save(&mut self, storage: &mut dyn eframe::Storage) { - eframe::set_value(storage, eframe::APP_KEY, self); - } + //fn save(&mut self, storage: &mut dyn eframe::Storage) { + // eframe::set_value(storage, eframe::APP_KEY, self); + //} /// 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) { @@ -90,6 +87,7 @@ impl eframe::App for TemplateApp { for i in self.messaging.1.try_iter() { match i { 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: egui::MenuBar::new().ui(ui, |ui| { - // NOTE: no File->Quit on web pages! - if !is_web { - ui.menu_button("File", |ui| { - if ui.button("Quit").clicked() { - ctx.send_viewport_cmd(egui::ViewportCommand::Close); + egui::containers::Sides::new().show(ui, |left_ui| { + left_ui.menu_button("File", |ui| { + if ui.button("Add Template").clicked() { + test_async(self.messaging.0.clone()); + } + 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); - } - egui::widgets::global_theme_preference_buttons(ui); + left_ui.add_space(16.0); + }, |right_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 - egui::containers::Sides::new().show(ui, |ui|{ - ui.with_layout(Layout::top_down(Align::LEFT), |ui| { + ui.horizontal(|ui| { + ui.vertical(|ui| { ui.heading("eframe template"); ui.horizontal(|ui| { @@ -132,16 +140,8 @@ impl eframe::App for TemplateApp { self.value += 1.0; } - if ui.button("rfd").clicked() { - test_async(self.messaging.0.clone()); - } - ui.separator(); - if self.templates.is_empty() { - - } - egui::containers::ComboBox::from_label("Select a template") .selected_text(self.active_template.clone()) .show_ui(ui, |x| { @@ -149,7 +149,6 @@ impl eframe::App for TemplateApp { x.selectable_value(&mut self.active_template, name.clone(), name.clone()); } }); - ui.separator(); ui.add(egui::github_link_file!( @@ -157,20 +156,22 @@ impl eframe::App for TemplateApp { "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) { #[cfg(target_arch = "wasm32")] web_sys::console::log_1(&string_data.clone().into()); - - let _ = test.send(Message::AddTemplate(Template::new(string_data))); + let mut new_template = Template::new("Untitled".to_string()); + new_template.text_files.push((name, string_data)); + let _ = test.send(Message::AddTemplate(new_template)); } }); } +fn template_popup() { + +} + #[cfg(not(target_arch = "wasm32"))] fn execute + Send + 'static>(f: F) { std::thread::spawn(move || smol::block_on(f)); @@ -227,7 +233,10 @@ fn execute + 'static>(f: F) { web_sys::console::log_1(&"Async End".into()); } - fn add_template(map: &mut HashMap, label: String, template: Template) { map.insert(label, template); +} + +fn remove_template(map: &mut HashMap, label: String) { + let _ = map.remove(&label); } \ No newline at end of file diff --git a/src/templates.rs b/src/templates.rs index 8f99884..d1f08b6 100644 --- a/src/templates.rs +++ b/src/templates.rs @@ -1,6 +1,4 @@ -use std::hash::Hash; - - +use tinytemplate::TinyTemplate; #[derive(serde::Serialize, serde::Deserialize, Eq)] #[serde(default)] @@ -17,9 +15,13 @@ impl Template { name, text_files: Vec::new(), images: Vec::new(), - config: String::new(), + config: String::new(), } } + + pub fn generate(&self) { + + } } impl Default for Template { @@ -44,7 +46,7 @@ impl PartialEq for Template { } } -impl Hash for Template { +impl std::hash::Hash for Template { fn hash(&self, state: &mut H) { self.name.hash(state); }