Refactored launcher to use a struct rather than string

This commit is contained in:
2023-06-02 17:49:41 +01:00
parent c668e85810
commit c744229066

View File

@@ -18,11 +18,16 @@ struct WadInfo {
name: String, name: String,
} }
struct LauncherInfo {
path: PathBuf,
name: String,
}
struct RustDoomLauncher { struct RustDoomLauncher {
all_launchers: Vec<String>, all_launchers: Vec<LauncherInfo>,
all_iwads: Vec<WadInfo>, all_iwads: Vec<WadInfo>,
all_pwads: Vec<WadInfo>, all_pwads: Vec<WadInfo>,
selected_launcher: Option<String>, selected_launcher: Option<usize>,
selected_iwad: Option<usize>, selected_iwad: Option<usize>,
selected_pwads: Vec<usize>, selected_pwads: Vec<usize>,
name: String, name: String,
@@ -31,7 +36,7 @@ struct RustDoomLauncher {
impl Default for RustDoomLauncher { impl Default for RustDoomLauncher {
fn default() -> Self { fn default() -> Self {
Self { Self {
all_launchers: vec!["GZDoom 1.9".to_string(), "PRBoom+".to_string()], all_launchers: Vec::new(),
all_iwads: Vec::new(), all_iwads: Vec::new(),
all_pwads: Vec::new(), all_pwads: Vec::new(),
selected_launcher: None, selected_launcher: None,
@@ -49,16 +54,16 @@ impl eframe::App for RustDoomLauncher {
ui.horizontal_wrapped(|ui| { ui.horizontal_wrapped(|ui| {
ui.vertical(|ui| { ui.vertical(|ui| {
ui.label("Launchers"); ui.label("Launchers");
for launcher in &self.all_launchers { for (pos, launcher) in self.all_launchers.iter().enumerate() {
if ui if ui
.add(egui::SelectableLabel::new( .add(egui::SelectableLabel::new(
self.selected_launcher.is_some() self.selected_launcher.is_some()
&& self.selected_launcher.as_ref().unwrap() == launcher, && *self.selected_launcher.as_ref().unwrap() == pos,
launcher, &launcher.name,
)) ))
.clicked() .clicked()
{ {
self.selected_launcher = Some(launcher.to_string()); self.selected_launcher = Some(pos);
} }
} }
}); });
@@ -100,13 +105,16 @@ impl eframe::App for RustDoomLauncher {
ui.label("Add WADs etc"); ui.label("Add WADs etc");
ui.set_max_width(180.0); ui.set_max_width(180.0);
ui.horizontal(|ui| { ui.horizontal(|ui| {
let name_label = ui.label("Name:"); let name_label = ui.label("Name:");
ui.text_edit_singleline(&mut self.name) ui.text_edit_singleline(&mut self.name)
.labelled_by(name_label.id); .labelled_by(name_label.id);
}); });
if ui.button("Add Launcher").clicked() { if ui.button("Add Launcher").clicked() {
if let Some(path) = rfd::FileDialog::new().pick_file() { if let Some(path) = rfd::FileDialog::new().pick_file() {
self.all_launchers.push(path.display().to_string()); self.all_launchers.push(LauncherInfo {
name: self.name.clone(),
path: path
});
} }
} }
if ui.button("Add IWAD").clicked() { if ui.button("Add IWAD").clicked() {
@@ -132,7 +140,11 @@ impl eframe::App for RustDoomLauncher {
// I don't actually think using SelectableLabel is correct here - // I don't actually think using SelectableLabel is correct here -
// but it'll at least do the highlighting when hovered nicely // but it'll at least do the highlighting when hovered nicely
if let Some(l) = &self.selected_launcher { if let Some(l) = &self.selected_launcher {
if ui.add(egui::SelectableLabel::new(false, l)).clicked() { if let Some(iwad) = &self.all_launchers.get(*l) {
if ui.add(egui::SelectableLabel::new(false, &iwad.name)).clicked() {
self.selected_launcher = None;
}
} else {
self.selected_launcher = None; self.selected_launcher = None;
} }
} else { } else {