start work on some stuff
This commit is contained in:
parent
4d6e23980e
commit
122904369b
107
src/main.rs
107
src/main.rs
@ -30,7 +30,8 @@ fn main() -> anyhow::Result<()> {
|
|||||||
|
|
||||||
let options = eframe::NativeOptions {
|
let options = eframe::NativeOptions {
|
||||||
viewport: egui::ViewportBuilder::default()
|
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()
|
..Default::default()
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -348,45 +349,83 @@ impl eframe::App for Application {
|
|||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
top_horizontal(ui, |ui| {
|
top_horizontal(ui, |ui| {
|
||||||
TableBuilder::new(ui)
|
TableBuilder::new(ui)
|
||||||
.column(Column::auto().at_least(100.0))
|
.column(Column::auto().at_least(100.0))
|
||||||
.column(Column::exact(300.0))
|
.column(Column::exact(300.0))
|
||||||
.body(|mut body| {
|
.body(|mut body| {
|
||||||
body.row(24.0, |mut row| {
|
body.row(24.0, |mut row| {
|
||||||
row.col(|ui| {
|
row.col(|ui| {
|
||||||
ui.label(RichText::new("Mod ID").size(16.0));
|
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| {
|
body.row(24.0, |mut row| {
|
||||||
ui.add(egui::TextEdit::singleline(&mut self.configuration.mod_id).font(font.clone()));
|
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();
|
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");
|
||||||
|
}
|
||||||
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||||
@ -17,3 +21,47 @@ pub struct ModConfiguration {
|
|||||||
pub include_maps: bool,
|
pub include_maps: bool,
|
||||||
pub include_movies: 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<PathBuf>, counter: Arc<AtomicU64>) -> 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<PathBuf>, target: Sender<PathBuf>, counter: Arc<AtomicU64>) {
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user