From c489be9c782cf898e1e37eef649373d1760bdfaf Mon Sep 17 00:00:00 2001 From: Pcornat Date: Fri, 25 Nov 2022 21:12:16 +0100 Subject: [PATCH 1/3] Format --- .fleet/run.json | 15 +++ Cargo.lock | 32 +++-- Cargo.toml | 3 +- src/gui.rs | 27 +++-- src/lib.rs | 2 +- src/main.rs | 133 ++++++++++---------- src/sheet.rs | 317 +++++++++++++++++++++++++----------------------- 7 files changed, 293 insertions(+), 236 deletions(-) create mode 100644 .fleet/run.json diff --git a/.fleet/run.json b/.fleet/run.json new file mode 100644 index 0000000..f0426ed --- /dev/null +++ b/.fleet/run.json @@ -0,0 +1,15 @@ +{ + "configurations": [ + { + "type": "cargo", + "name": "Build release", + "cargoArgs": ["build", "--release"], + }, + { + "type": "cargo", + "name": "Run release", + "cargoArgs": ["run", "--release"], + }, + + ] +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index e079256..1be0107 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -196,7 +196,8 @@ name = "billy_sheet" version = "0.1.0" dependencies = [ "eframe", - "json", + "serde", + "serde_json", ] [[package]] @@ -1033,6 +1034,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "itoa" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" + [[package]] name = "jni" version = "0.19.0" @@ -1062,12 +1069,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "json" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" - [[package]] name = "khronos_api" version = "3.1.0" @@ -1623,6 +1624,12 @@ dependencies = [ "ordered-multimap", ] +[[package]] +name = "ryu" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + [[package]] name = "safe_arch" version = "0.5.2" @@ -1685,6 +1692,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_repr" version = "0.1.9" diff --git a/Cargo.toml b/Cargo.toml index d68fdd5..903f2f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,4 +7,5 @@ edition = "2021" [dependencies] eframe = { version = "*", features = ["dark-light"] } -json = "*" +serde = { version = "*", features = ["derive"] } +serde_json = "*" diff --git a/src/gui.rs b/src/gui.rs index e443dc0..931fb01 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -1,13 +1,22 @@ -use eframe::egui; use eframe::egui::Ui; -use crate::sheet::{Characteristic, CharacterSheet}; +use crate::sheet::Characteristic; -pub trait SheetGui where Self: Sized { - fn shortcut(&self, _ui: &mut Ui, category: &str, character_field: &Characteristic) -> (u32, u32, u32) { (0, 0, 0) } - fn gui_address(&mut self, ui: &mut Ui); - fn gui_stamina(&mut self, ui: &mut Ui); - fn gui_luck(&mut self, ui: &mut Ui); - fn gui_skill(&mut self, ui: &mut Ui); - fn secondary_stats(&mut self, ui: &mut Ui); +pub trait SheetGui +where + Self: Sized, +{ + fn shortcut( + &self, + _ui: &mut Ui, + _category: &str, + _character_field: &Characteristic, + ) -> (u32, u32, u32) { + (0, 0, 0) + } + fn gui_address(&mut self, ui: &mut Ui); + fn gui_stamina(&mut self, ui: &mut Ui); + fn gui_luck(&mut self, ui: &mut Ui); + fn gui_skill(&mut self, ui: &mut Ui); + fn secondary_stats(&mut self, ui: &mut Ui); } diff --git a/src/lib.rs b/src/lib.rs index 17ebef3..8d3728f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,2 @@ -pub mod sheet; pub mod gui; +pub mod sheet; diff --git a/src/main.rs b/src/main.rs index bf2c973..1d5db85 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,79 +3,82 @@ use eframe::egui; use billy_sheet::gui::SheetGui; fn main() { - let options = eframe::NativeOptions::default(); - eframe::run_native( - "Billy Sheet editor", - options, - Box::new(|_ctx| { - // ctx.egui_ctx.options().screen_reader = true; - Box::new(Gui::default()) - }), - ); + let options = eframe::NativeOptions::default(); + eframe::run_native( + "Billy Sheet editor", + options, + Box::new(|_ctx| { + // ctx.egui_ctx.options().screen_reader = true; + Box::new(Gui::default()) + }), + ); } #[derive(Debug)] struct Gui { - test: billy_sheet::sheet::CharacterSheet, - edit_mode: bool, + test: billy_sheet::sheet::CharacterSheet, + edit_mode: bool, } impl Default for Gui { - fn default() -> Self { - Self { - test: billy_sheet::sheet::CharacterSheet::default(), - edit_mode: true, - } - } + fn default() -> Self { + Self { + test: billy_sheet::sheet::CharacterSheet::default(), + edit_mode: true, + } + } } impl eframe::App for Gui { - fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - egui::TopBottomPanel::top("menu").show(ctx, |ui| { - egui::menu::bar(ui, |ui| { - egui::widgets::global_dark_light_mode_buttons(ui); - ui.menu_button("File", |ui| { - if ui.button("Open (Ctrl + O)").clicked() {} - if ui.button("Quit (Ctrl + Q)").clicked() { - _frame.close(); - } - }); - if ui.button(format!("Edit mode {}", self.edit_mode)).clicked() { - self.edit_mode = !self.edit_mode.clone(); - } - }); - }); - egui::CentralPanel::default().show(ctx, |ui| { - ui.heading("My egui Application"); - ui.separator(); - ui.vertical_centered_justified(|ui| { - let mut tmp_str = self.test.character().to_string(); - ui.text_edit_multiline(&mut tmp_str); - self.test.character = tmp_str; - }); - ui.columns(2, |columns| { - // let mut col_1_ui = &mut columns[0]; - // let mut col_2_ui = &mut columns[1]; - columns[0].columns(2, |two_columns| { - // let mut in_col1 = &mut two_columns[0]; - // let mut in_col2 = &mut two_columns[1]; - two_columns[0].vertical_centered_justified(|ui| { - self.test.gui_skill(ui); - self.test.gui_stamina(ui); - }); - two_columns[1].vertical_centered_justified(|ui| { - self.test.gui_address(ui); - self.test.gui_luck(ui); - }); - }); - columns[1].vertical_centered_justified(|ui| { - self.test.secondary_stats(ui); - }); - }); - }); - if ctx.input_mut().consume_key(egui::Modifiers::CTRL, egui::Key::Q) - { - _frame.close(); - } - } + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + egui::TopBottomPanel::top("menu").show(ctx, |ui| { + egui::menu::bar(ui, |ui| { + egui::widgets::global_dark_light_mode_buttons(ui); + ui.menu_button("File", |ui| { + if ui.button("Open (Ctrl + O)").clicked() {} + if ui.button("Quit (Ctrl + Q)").clicked() { + _frame.close(); + } + }); + if ui.button(format!("Edit mode {}", self.edit_mode)).clicked() { + self.edit_mode = !self.edit_mode.clone(); + } + }); + }); + egui::CentralPanel::default().show(ctx, |ui| { + ui.heading("My egui Application"); + ui.separator(); + ui.label("Caractère"); + ui.vertical_centered_justified(|ui| { + let mut tmp_str = self.test.character().to_string(); + ui.text_edit_multiline(&mut tmp_str); + self.test.character = tmp_str; + }); + ui.columns(2, |columns| { + // let mut col_1_ui = &mut columns[0]; + // let mut col_2_ui = &mut columns[1]; + columns[0].columns(2, |two_columns| { + // let mut in_col1 = &mut two_columns[0]; + // let mut in_col2 = &mut two_columns[1]; + two_columns[0].vertical_centered_justified(|ui| { + self.test.gui_skill(ui); + self.test.gui_stamina(ui); + }); + two_columns[1].vertical_centered_justified(|ui| { + self.test.gui_address(ui); + self.test.gui_luck(ui); + }); + }); + columns[1].vertical_centered_justified(|ui| { + self.test.secondary_stats(ui); + }); + }); + }); + if ctx + .input_mut() + .consume_key(egui::Modifiers::CTRL, egui::Key::Q) + { + _frame.close(); + } + } } diff --git a/src/sheet.rs b/src/sheet.rs index e52abd0..1fbafa1 100644 --- a/src/sheet.rs +++ b/src/sheet.rs @@ -1,183 +1,194 @@ -use eframe::egui::Ui; use eframe::egui::widgets::DragValue; +use eframe::egui::Ui; +use serde::{Deserialize, Serialize}; use crate::gui::SheetGui; -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] pub enum Classe { - Warrior, - Cautious, - Farmer, - Resourceful, + Warrior, + Cautious, + Farmer, + Resourceful, } -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] enum CharacteristicType { - Address, - Stamina, - Luck, - Skill, + Address, + Stamina, + Luck, + Skill, } -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] pub struct CharacterSheet { - character_class: Classe, - /// Field to write the personality/ - pub character: String, - address: Characteristic, - stamina: Characteristic, - luck: Characteristic, - skill: Characteristic, - health: u32, - armor: u32, - damage: u32, - glory: u32, - money: u32, + character_class: Classe, + /// Field to write the personality/ + pub character: String, + address: Characteristic, + stamina: Characteristic, + luck: Characteristic, + skill: Characteristic, + health: u32, + armor: u32, + damage: u32, + glory: u32, + money: u32, } impl CharacterSheet { - pub fn character_class(&self) -> &Classe { - &self.character_class - } - pub fn character(&self) -> &str { - &self.character - } - pub fn address(&self) -> &Characteristic { - &self.address - } - pub fn stamina(&self) -> &Characteristic { - &self.stamina - } - pub fn luck(&self) -> &Characteristic { - &self.luck - } - pub fn skill(&self) -> &Characteristic { - &self.skill - } - pub fn health(&self) -> u32 { - self.health - } - pub fn armor(&self) -> u32 { - self.armor - } - pub fn damage(&self) -> u32 { - self.damage - } - pub fn glory(&self) -> u32 { - self.glory - } - pub fn money(&self) -> u32 { - self.money - } + pub fn character_class(&self) -> &Classe { + &self.character_class + } + pub fn character(&self) -> &str { + &self.character + } + pub fn address(&self) -> &Characteristic { + &self.address + } + pub fn stamina(&self) -> &Characteristic { + &self.stamina + } + pub fn luck(&self) -> &Characteristic { + &self.luck + } + pub fn skill(&self) -> &Characteristic { + &self.skill + } + pub fn health(&self) -> u32 { + self.health + } + pub fn armor(&self) -> u32 { + self.armor + } + pub fn damage(&self) -> u32 { + self.damage + } + pub fn glory(&self) -> u32 { + self.glory + } + pub fn money(&self) -> u32 { + self.money + } } impl SheetGui for CharacterSheet { - fn shortcut(&self, ui: &mut Ui, category: &str, character_field: &Characteristic) -> (u32, u32, u32) { - let mut base = character_field.base; - let mut carac = character_field.carac; - let mut materiel = character_field.materiel; - ui.heading(category); - ui.columns(2, |columns| { - let mut ui_column = &mut columns[0]; - ui_column.label("Base"); - ui_column.label("Carac."); - ui_column.label("Matériel"); + fn shortcut( + &self, + ui: &mut Ui, + category: &str, + character_field: &Characteristic, + ) -> (u32, u32, u32) { + let mut base = character_field.base; + let mut carac = character_field.carac; + let mut materiel = character_field.materiel; + ui.heading(category); + ui.horizontal(|ui| { + ui.label("Base"); + ui.add(DragValue::new(&mut base)); + }); + ui.horizontal(|ui| { + ui.label("Carac."); + ui.add(DragValue::new(&mut carac)); + }); + ui.horizontal(|ui| { + ui.label("Matériel"); + ui.add(DragValue::new(&mut materiel)); + }); + return (base, carac, materiel); + } - ui_column = &mut columns[1]; - ui_column.add(DragValue::new(&mut base)); - ui_column.add(DragValue::new(&mut carac)); - ui_column.add(DragValue::new(&mut materiel)); - }); - return (base, carac, materiel); - } + fn gui_address(&mut self, ui: &mut Ui) { + let workaround = self as &CharacterSheet; + (self.address.base, self.address.carac, self.address.materiel) = + self.shortcut(ui, "Adresse", workaround.address()); + ui.label("Ne peut dépasser 5"); + } - fn gui_address(&mut self, ui: &mut Ui) { - let workaround: &CharacterSheet = self; - (self.address.base, self.address.carac, self.address.materiel) = self.shortcut(ui, "Habileté", workaround.address()); - ui.label("Ne peut dépasser 5"); - } + fn gui_stamina(&mut self, ui: &mut Ui) { + let workaround = self as &CharacterSheet; + (self.stamina.base, self.stamina.carac, self.stamina.materiel) = + self.shortcut(ui, "Endurance", workaround.stamina()); + } - fn gui_stamina(&mut self, ui: &mut Ui) { - let workaround: &CharacterSheet = self; - (self.stamina.base, self.stamina.carac, self.stamina.materiel) = self.shortcut(ui, "Endurance", workaround.stamina()); - } + fn gui_luck(&mut self, ui: &mut Ui) { + let workaround = self as &CharacterSheet; + (self.luck.base, self.luck.carac, self.luck.materiel) = + self.shortcut(ui, "Chance", workaround.luck()); + } - fn gui_luck(&mut self, ui: &mut Ui) { - let workaround: &CharacterSheet = self; - (self.luck.base, self.luck.carac, self.luck.materiel) = self.shortcut(ui, "Chance", workaround.luck()); - } + fn gui_skill(&mut self, ui: &mut Ui) { + let workaround = self as &CharacterSheet; + (self.skill.base, self.skill.carac, self.skill.materiel) = + self.shortcut(ui, "Habileté", workaround.skill()); + } - fn gui_skill(&mut self, ui: &mut Ui) { - let workaround: &CharacterSheet = self; - (self.skill.base, self.skill.carac, self.skill.materiel) = self.shortcut(ui, "Habileté", workaround.skill()); - } + fn secondary_stats(&mut self, ui: &mut Ui) { + let workaround = self as &CharacterSheet; + let mut damage = workaround.damage; + let mut armor = workaround.armor; - fn secondary_stats(&mut self, ui: &mut Ui) { - let workaround: &CharacterSheet = self; - ui.heading("Stat. secondaires"); - ui.columns(2, |columns| { - columns[0].vertical_centered_justified(|ui| { - ui.label("Dégâts"); - ui.label("Armure"); - ui.label("Critique"); - }); - columns[1].vertical_centered_justified(|ui| { - let mut damage = workaround.damage; - let mut armor = workaround.armor; - ui.add(DragValue::new(&mut damage)); - ui.add(DragValue::new(&mut armor)); - }); - }); - } + ui.heading("Stat. secondaires"); + ui.horizontal(|ui| { + ui.label("Dégâts"); + ui.add(DragValue::new(&mut damage)); + }); + + ui.horizontal(|ui| { + ui.label("Armure"); + ui.add(DragValue::new(&mut armor)); + }); + ui.label("Critique"); + } } -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] pub struct Characteristic { - characteristic_type: CharacteristicType, - pub base: u32, - pub carac: u32, - pub materiel: u32, - pub additional: u32, + characteristic_type: CharacteristicType, + pub base: u32, + pub carac: u32, + pub materiel: u32, + pub additional: u32, } impl Default for CharacterSheet { - fn default() -> Self { - Self { - character_class: Classe::Warrior, - character: "Billy".to_string(), - address: Characteristic { - characteristic_type: CharacteristicType::Address, - base: 0, - carac: 0, - materiel: 0, - additional: 1, - }, - stamina: Characteristic { - characteristic_type: CharacteristicType::Stamina, - base: 2, - carac: 0, - materiel: 0, - additional: 0, - }, - luck: Characteristic { - characteristic_type: CharacteristicType::Luck, - base: 3, - carac: 0, - materiel: 0, - additional: 0, - }, - skill: Characteristic { - characteristic_type: CharacteristicType::Skill, - base: 2, - carac: 0, - materiel: 0, - additional: 0, - }, - health: 0, - armor: 0, - damage: 0, - glory: 0, - money: 0, - } - } + fn default() -> Self { + Self { + character_class: Classe::Warrior, + character: "Billy".to_string(), + address: Characteristic { + characteristic_type: CharacteristicType::Address, + base: 0, + carac: 0, + materiel: 0, + additional: 1, + }, + stamina: Characteristic { + characteristic_type: CharacteristicType::Stamina, + base: 2, + carac: 0, + materiel: 0, + additional: 0, + }, + luck: Characteristic { + characteristic_type: CharacteristicType::Luck, + base: 3, + carac: 0, + materiel: 0, + additional: 0, + }, + skill: Characteristic { + characteristic_type: CharacteristicType::Skill, + base: 2, + carac: 0, + materiel: 0, + additional: 0, + }, + health: 0, + armor: 0, + damage: 0, + glory: 0, + money: 0, + } + } } From 1cff8df36b2c354ebc2083b3f7b7cb6c9989a500 Mon Sep 17 00:00:00 2001 From: Pcornat Date: Mon, 28 Nov 2022 21:01:45 +0100 Subject: [PATCH 2/3] More best practice way --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1d5db85..ff12042 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,7 @@ fn main() { options, Box::new(|_ctx| { // ctx.egui_ctx.options().screen_reader = true; - Box::new(Gui::default()) + Box::::default() }), ); } @@ -41,7 +41,7 @@ impl eframe::App for Gui { } }); if ui.button(format!("Edit mode {}", self.edit_mode)).clicked() { - self.edit_mode = !self.edit_mode.clone(); + self.edit_mode = !self.edit_mode; } }); }); From 281e4eb9f0a44494530a7bc3422fcd557a26088f Mon Sep 17 00:00:00 2001 From: Pcornat Date: Mon, 28 Nov 2022 21:02:36 +0100 Subject: [PATCH 3/3] More best practice way --- src/sheet.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sheet.rs b/src/sheet.rs index 1fbafa1..c2c6cb3 100644 --- a/src/sheet.rs +++ b/src/sheet.rs @@ -95,7 +95,7 @@ impl SheetGui for CharacterSheet { ui.label("Matériel"); ui.add(DragValue::new(&mut materiel)); }); - return (base, carac, materiel); + (base, carac, materiel) } fn gui_address(&mut self, ui: &mut Ui) {