diff --git a/src/main.rs b/src/main.rs index 79f9842..4a33ba6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,7 +30,8 @@ fn main() -> anyhow::Result<()> { let options = eframe::NativeOptions { viewport: egui::ViewportBuilder::default() - .with_min_inner_size([640.0, 480.0]), + .with_min_inner_size([640.0, 480.0]) + .with_inner_size([640.0, 480.0]), ..Default::default() }; @@ -348,45 +349,83 @@ impl eframe::App for Application { egui::CentralPanel::default().show(ctx, |ui| { top_horizontal(ui, |ui| { TableBuilder::new(ui) - .column(Column::auto().at_least(100.0)) - .column(Column::exact(300.0)) - .body(|mut body| { - body.row(24.0, |mut row| { - row.col(|ui| { - ui.label(RichText::new("Mod ID").size(16.0)); + .column(Column::auto().at_least(100.0)) + .column(Column::exact(300.0)) + .body(|mut body| { + body.row(24.0, |mut row| { + row.col(|ui| { + ui.label(RichText::new("Mod ID").size(16.0)); + }); + row.col(|ui| { + ui.add(egui::TextEdit::singleline(&mut self.configuration.mod_id).font(font.clone())); + }); }); - row.col(|ui| { - ui.add(egui::TextEdit::singleline(&mut self.configuration.mod_id).font(font.clone())); + body.row(24.0, |mut row| { + row.col(|ui| { + ui.label(RichText::new("Mod Name").size(16.0)); + }); + row.col(|ui| { + ui.add(egui::TextEdit::singleline(&mut self.configuration.mod_name).font(font.clone())); + }); + }); + body.row(24.0, |mut row| { + row.col(|ui| { + ui.label(RichText::new("Mod Description").size(16.0)); + }); + row.col(|ui| { + ui.add(egui::TextEdit::singleline(&mut self.configuration.mod_description).font(font.clone())); + }); + }); + body.row(24.0, |mut row| { + row.col(|ui| { + ui.label(RichText::new("Mod Version").size(16.0)); + }); + row.col(|ui| { + ui.add(egui::TextEdit::singleline(&mut self.configuration.mod_version).font(font.clone())); + }); }); }); - body.row(24.0, |mut row| { - row.col(|ui| { - ui.label(RichText::new("Mod Name").size(16.0)); - }); - row.col(|ui| { - ui.add(egui::TextEdit::singleline(&mut self.configuration.mod_name).font(font.clone())); - }); - }); - body.row(24.0, |mut row| { - row.col(|ui| { - ui.label(RichText::new("Mod Description").size(16.0)); - }); - row.col(|ui| { - ui.add(egui::TextEdit::singleline(&mut self.configuration.mod_description).font(font.clone())); - }); - }); - body.row(24.0, |mut row| { - row.col(|ui| { - ui.label(RichText::new("Mod Version").size(16.0)); - }); - row.col(|ui| { - ui.add(egui::TextEdit::singleline(&mut self.configuration.mod_version).font(font.clone())); - }); - }); - }); }); ui.separator(); + + top_horizontal(ui, |ui| { + ui.vertical(|ui| { + ui.add(egui::Checkbox::new(&mut self.configuration.include_audio, RichText::new("Include /audio").size(16.0))); + ui.add(egui::Checkbox::new(&mut self.configuration.include_data, RichText::new("Include /data").size(16.0))); + ui.add(egui::Checkbox::new(&mut self.configuration.include_fonts, RichText::new("Include /fonts").size(16.0))); + ui.add(egui::Checkbox::new(&mut self.configuration.include_icon, RichText::new("Include /icon").size(16.0))); + ui.add(egui::Checkbox::new(&mut self.configuration.include_img, RichText::new("Include /img").size(16.0))); + ui.add(egui::Checkbox::new(&mut self.configuration.include_languages, RichText::new("Include /languages").size(16.0))); + ui.add(egui::Checkbox::new(&mut self.configuration.include_maps, RichText::new("Include /maps").size(16.0))); + ui.add(egui::Checkbox::new(&mut self.configuration.include_movies, RichText::new("Include /movies").size(16.0))); + }); + }); + + // TODO: Implement performance settings here + }); + + egui::TopBottomPanel::bottom("configuration_start").show(ctx, |ui| { + let mut is_valid = self.configuration.include_audio || self.configuration.include_data || + self.configuration.include_fonts || self.configuration.include_icon || + self.configuration.include_img || self.configuration.include_languages || + self.configuration.include_maps || self.configuration.include_movies || + self.configuration.include_plugins; + + if self.configuration.mod_description.len() < 2 { is_valid = false; } + if self.configuration.mod_id.len() < 2 { is_valid = false; } + if self.configuration.mod_name.len() < 2 { is_valid = false; } + if self.configuration.mod_version.len() < 2 { is_valid = false; } + + ui.with_layout(Layout::top_down(Align::Max), |ui| { + if !is_valid { + ui.disable(); + } + + if ui.button("Continue").clicked() { + self.sender.send(UiEvent::UseConfiguration(self.configuration.clone())).expect("Failed to send"); + } + }) }); } } diff --git a/src/mod_builder.rs b/src/mod_builder.rs index d200695..a1dde08 100644 --- a/src/mod_builder.rs +++ b/src/mod_builder.rs @@ -1,3 +1,7 @@ +use std::{fs, path::PathBuf, sync::{atomic::{AtomicU64, Ordering}, Arc}}; + +use anyhow::Context; +use crossbeam_channel::Sender; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize, Default)] @@ -16,4 +20,48 @@ pub struct ModConfiguration { pub include_languages: bool, pub include_maps: bool, pub include_movies: bool +} +/* + TODO: + IMPORTANT!!! + IMPLEMENT ERROR HANDLING AND PROPAGATION + **BEFORE** MARKING 1.0.0!!! + IMPORTANT!! +*/ +fn walk_inner(relative_base: &PathBuf, real_filesystem_base: &PathBuf, target: &Sender, counter: Arc) -> anyhow::Result<()> { + let f = fs::read_dir(real_filesystem_base)?; + for entry in f { + let entry = entry?; + let file_type = entry.file_type()?; + let path = entry.path(); + let path = path.file_name().with_context(|| format!("The file doesn't have a name(????)"))?; + + let mut new_base = relative_base.clone(); + new_base.push(path); + + + if file_type.is_dir() { + let mut new_realfs_base = real_filesystem_base.clone(); + new_realfs_base.push(path); + + walk_inner(&new_base, &new_realfs_base, target, counter.clone())?; + } + if file_type.is_file() { + counter.fetch_add(1, Ordering::Relaxed); + target.send(new_base.clone())?; + } + } + + Ok(()) +} + +pub fn walk_dirs(base: &PathBuf, secondary_bases: &Vec, target: Sender, counter: Arc) { + for path in secondary_bases { + let mut real = base.clone(); + real.push(path); + + if walk_inner(path, &real, &target, counter.clone()).is_err() { + todo!("Implement error handling you bitch"); + } + } } \ No newline at end of file