Switching to main
This commit is contained in:
103
src/app.rs
103
src/app.rs
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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)]
|
||||||
@@ -17,9 +15,13 @@ impl Template {
|
|||||||
name,
|
name,
|
||||||
text_files: Vec::new(),
|
text_files: Vec::new(),
|
||||||
images: Vec::new(),
|
images: Vec::new(),
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user