nightshade-editor 0.12.0

An interactive editor for the Nightshade game engine
use crate::Editor;
use crate::engine_editor::{
    EntityContextAction, TransformOperation, UndoableOperation, add_primitive_popup_ui,
    capture_hierarchy, entity_context_menu_ui, gizmo, selection,
};
use nightshade::prelude::*;

impl Editor {
    pub fn handle_popups(&mut self, world: &mut World, ui_context: &egui::Context) {
        if let Some(popup_pos) = self.context.ui.popup.add_primitive {
            let result = add_primitive_popup_ui(ui_context, world, popup_pos);
            if result.close_popup {
                self.context.ui.popup.add_primitive = None;
            }
            if let Some(entity) = result.spawned_entity {
                let hierarchy = Box::new(capture_hierarchy(world, entity));
                self.context.editor.undo_history.push(
                    UndoableOperation::EntityCreated {
                        hierarchy,
                        current_entity: entity,
                    },
                    "Add primitive".to_string(),
                );
                self.context.editor.selection.set_single(entity);
                self.context.ui.tree_dirty = true;
                self.project_state.mark_modified();
            }
        }

        if let Some(popup_pos) = self.context.ui.popup.entity_context_menu {
            let result = entity_context_menu_ui(
                ui_context,
                world,
                &self.context.editor.selection,
                popup_pos,
            );
            if result.close_popup {
                self.context.ui.popup.entity_context_menu = None;
            }
            match result.action {
                EntityContextAction::Grab => {
                    gizmo::start_modal_transform(
                        &mut self.context.editor,
                        world,
                        TransformOperation::Grab,
                    );
                }
                EntityContextAction::Rotate => {
                    gizmo::start_modal_transform(
                        &mut self.context.editor,
                        world,
                        TransformOperation::Rotate,
                    );
                }
                EntityContextAction::Scale => {
                    gizmo::start_modal_transform(
                        &mut self.context.editor,
                        world,
                        TransformOperation::Scale,
                    );
                }
                EntityContextAction::Duplicate => {
                    let changed = selection::duplicate_selection(&mut self.context.editor, world);
                    self.context.ui.tree_dirty |= changed;
                    if changed {
                        self.project_state.mark_modified();
                    }
                }
                EntityContextAction::Delete => {
                    let changed = selection::delete_selection(&mut self.context.editor, world);
                    self.context.ui.tree_dirty |= changed;
                    if changed {
                        self.project_state.mark_modified();
                    }
                }
                EntityContextAction::None => {}
            }
        }
    }

    pub fn render_quit_confirmation(&mut self, world: &mut World, ui_context: &egui::Context) {
        if !self.context.ui.popup.quit_confirmation {
            return;
        }

        let mut open = true;
        egui::Window::new("Quit")
            .collapsible(false)
            .resizable(false)
            .open(&mut open)
            .anchor(egui::Align2::CENTER_CENTER, [0.0, 0.0])
            .show(ui_context, |ui| {
                if self.project_state.is_modified {
                    ui.label("You have unsaved changes. Are you sure you want to quit?");
                } else {
                    ui.label("Are you sure you want to quit?");
                }
                ui.add_space(8.0);
                ui.horizontal(|ui| {
                    if ui.button("Quit").clicked() {
                        world.resources.window.should_exit = true;
                        self.context.ui.popup.quit_confirmation = false;
                    }
                    if ui.button("Cancel").clicked() {
                        self.context.ui.popup.quit_confirmation = false;
                    }
                });
            });
        if !open {
            self.context.ui.popup.quit_confirmation = false;
        }
    }
}