nightshade-editor 0.13.4

An interactive editor for the Nightshade game engine
use crate::Editor;
#[cfg(not(target_arch = "wasm32"))]
use crate::settings;
#[cfg(not(target_arch = "wasm32"))]
use nightshade::prelude::*;

impl Editor {
    #[cfg(not(target_arch = "wasm32"))]
    pub fn display_project_menu(&mut self, world: &mut World, ui: &mut egui::Ui) {
        let light_green = egui::Color32::from_rgb(144, 238, 144);

        ui.menu_button(
            egui::RichText::new("🔨 Project").color(light_green),
            |ui| {
                if ui.button("New Project").clicked() {
                    self.new_project(world);
                    ui.close();
                }
                ui.separator();
                if ui.button("Save Project").clicked() {
                    self.save_project(world);
                    ui.close();
                }
                if ui.button("Save Project As...").clicked() {
                    self.save_project_as(world);
                    ui.close();
                }
                if ui.button("Collect All and Save...").clicked() {
                    self.collect_all_and_save(world);
                    ui.close();
                }
                if ui.button("Load Project...").clicked() {
                    self.load_project(world);
                    ui.close();
                }
                ui.separator();

                let current_project_is_startup = if let Some(current_path) =
                    &self.context.project_edit.current_path
                    && let Some(startup_path) = &self.settings.data.startup_project
                {
                    current_path.to_string_lossy() == *startup_path
                } else {
                    false
                };

                if ui
                    .add_enabled(
                        self.context.project_edit.current_path.is_some()
                            && !current_project_is_startup,
                        egui::Button::new("Set as Startup Project"),
                    )
                    .clicked()
                {
                    crate::project_io::startup::set_as_startup_project(
                        &self.context.project_edit,
                        &mut self.settings,
                        &mut self.toasts,
                    );
                    ui.close();
                }
                if ui
                    .add_enabled(
                        self.settings.data.startup_project.is_some(),
                        egui::Button::new("Unset Startup Project"),
                    )
                    .clicked()
                {
                    crate::project_io::startup::unset_startup_project(
                        &mut self.settings,
                        &mut self.toasts,
                    );
                    ui.close();
                }
                ui.separator();

                let startup_project = self.settings.data.startup_project.clone();
                let action = self.settings.data.recent_projects.render_menu(
                    ui,
                    startup_project.as_deref(),
                    |path| settings::get_project_name(&path.to_string_lossy()),
                );
                if let Some(action) = action {
                    match action {
                        crate::mosaic::RecentFilesAction::Open(path) => {
                            self.load_project_from_path(world, &path);
                            ui.close();
                        }
                        crate::mosaic::RecentFilesAction::Clear => {
                            self.settings.data.recent_projects.clear();
                            if let Some(startup_path) = &self.settings.data.startup_project {
                                self.settings
                                    .data
                                    .recent_projects
                                    .add(std::path::PathBuf::from(startup_path));
                            }
                            if let Err(error) = self.settings.save() {
                                tracing::error!("Failed to save settings: {error}");
                            }
                            ui.close();
                        }
                    }
                }
            },
        );

        let project_name = self
            .context
            .project_edit
            .current_name
            .clone()
            .unwrap_or_else(|| "Untitled".to_string());
        let display_name = if self.project_state.is_modified {
            format!("{} *", project_name)
        } else {
            project_name.clone()
        };

        let text_color = if ui.visuals().dark_mode {
            egui::Color32::from_rgb(246, 247, 245)
        } else {
            egui::Color32::from_rgb(25, 25, 24)
        };
        ui.label(egui::RichText::new(&display_name).color(text_color));

        if ui
            .small_button("")
            .on_hover_text("Edit project name")
            .clicked()
        {
            self.context.project_edit.editing_name = true;
            self.context.project_edit.name_edit_buffer = project_name;
        }
    }
}