Skip to content

Commit

Permalink
MaterialFXUndo / Redo
Browse files Browse the repository at this point in the history
  • Loading branch information
markusmoenig committed Jun 10, 2024
1 parent d594ce7 commit d06f6c4
Show file tree
Hide file tree
Showing 9 changed files with 439 additions and 231 deletions.
28 changes: 22 additions & 6 deletions creator/src/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1309,13 +1309,17 @@ impl TheTrait for Editor {
if id.name == "Undo" {
manager.undo(
self.server_ctx.curr_region,
&mut self.server_ctx,
&mut self.project,
ui,
ctx,
);
} else {
manager.redo(
self.server_ctx.curr_region,
&mut self.server_ctx,
&mut self.project,
ui,
ctx,
);
}
Expand All @@ -1325,20 +1329,32 @@ impl TheTrait for Editor {
self.server.update_region(region);
RENDERER.lock().unwrap().set_region(region);
}
} else if manager.context == UndoManagerContext::ModelFX {
} else if manager.context == UndoManagerContext::MaterialFX {
if id.name == "Undo" {
manager.undo(Uuid::nil(), &mut self.project, ctx);
manager.undo(
Uuid::nil(),
&mut self.server_ctx,
&mut self.project,
ui,
ctx,
);
} else {
manager.redo(Uuid::nil(), &mut self.project, ctx);
manager.redo(
Uuid::nil(),
&mut self.server_ctx,
&mut self.project,
ui,
ctx,
);
}
let mut model_editor = MODELFXEDITOR.lock().unwrap();
model_editor.modelfx.draw(ui, ctx, &self.project.palette);
//let mut model_editor = MODELFXEDITOR.lock().unwrap();
//model_editor.modelfx.draw(ui, ctx, &self.project.palette);
// model_editor.set_selected_node_ui(
// ui,
// ctx,
// &self.project.palette,
// );
model_editor.render_preview(ui, &self.project.palette);
//model_editor.render_preview(ui, &self.project.palette);
}
}

Expand Down
2 changes: 1 addition & 1 deletion creator/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ pub mod prelude {
pub use crate::tilefxeditor::*;
pub use crate::tilemapeditor::*;
pub use crate::tilepicker::*;
pub use crate::undo::modelfx_undo::*;
pub use crate::undo::materialfx_undo::*;
pub use crate::undo::region_undo::*;
pub use crate::undo::*;
}
Expand Down
200 changes: 97 additions & 103 deletions creator/src/modelfxeditor.rs

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions creator/src/sidebar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2114,14 +2114,14 @@ impl Sidebar {
SidebarMode::Model as usize,
));

MODELFXEDITOR
.lock()
.unwrap()
.render_preview(ui, &project.palette);
MODELFXEDITOR
.lock()
.unwrap()
.redraw_modelfx_library(project, ui, ctx);
// MODELFXEDITOR
// .lock()
// .unwrap()
// .render_preview(ui, &project.palette);
// MODELFXEDITOR
// .lock()
// .unwrap()
// .redraw_modelfx_library(project, ui, ctx);

redraw = true;
} else if id.name == "Debug Section" && *state == TheWidgetState::Selected {
Expand Down
2 changes: 1 addition & 1 deletion creator/src/tileeditor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -558,7 +558,7 @@ impl TileEditor {
if id.name == "Region Editor View" || id.name == "RenderView" {
UNDOMANAGER.lock().unwrap().context = UndoManagerContext::Region;
} else if id.name == "ModelFX RGBA Layout View" {
UNDOMANAGER.lock().unwrap().context = UndoManagerContext::ModelFX;
UNDOMANAGER.lock().unwrap().context = UndoManagerContext::MaterialFX;
}
}
TheEvent::StateChanged(id, _state) => {
Expand Down
152 changes: 152 additions & 0 deletions creator/src/undo/materialfx_undo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
use crate::editor::MODELFXEDITOR;
use crate::prelude::*;
use theframework::prelude::*;

#[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
pub enum MaterialFXUndoAtom {
AddMaterial(MaterialFXObject),
AddNode(Uuid, String, String),
Edit(Uuid, String, String),
}

impl MaterialFXUndoAtom {
pub fn undo(
&self,
server_ctx: &mut ServerContext,
project: &mut Project,
ui: &mut TheUI,
ctx: &mut TheContext,
) {
match self {
MaterialFXUndoAtom::AddMaterial(material) => {
project.materials.shift_remove(&material.id);
if server_ctx.curr_material_object == Some(material.id) {
server_ctx.curr_material_object = None;
}

let mut editor = MODELFXEDITOR.lock().unwrap();
editor.set_material_tiles(ui, ctx, project, None);
editor.set_material_node_ui(server_ctx, project, ui, ctx);
}
MaterialFXUndoAtom::AddNode(id, prev, _) | MaterialFXUndoAtom::Edit(id, prev, _) => {
if let Some(material) = project.materials.get_mut(id) {
*material = MaterialFXObject::from_json(prev);
material.render_preview(&project.palette);

let node_canvas = material.to_canvas(&project.palette);
ui.set_node_canvas("MaterialFX NodeCanvas", node_canvas);

let mut editor = MODELFXEDITOR.lock().unwrap();
editor.set_material_tiles(ui, ctx, project, None);
editor.set_material_node_ui(server_ctx, project, ui, ctx);
editor.set_selected_material_node_ui(server_ctx, project, ui, ctx);
editor.render_material_changes(*id, server_ctx, project);
}
}
}
}
pub fn redo(
&self,
server_ctx: &mut ServerContext,
project: &mut Project,
ui: &mut TheUI,
ctx: &mut TheContext,
) {
match self {
MaterialFXUndoAtom::AddMaterial(material) => {
project.materials.insert(material.id, material.clone());
}
MaterialFXUndoAtom::AddNode(id, _, next) | MaterialFXUndoAtom::Edit(id, _, next) => {
if let Some(material) = project.materials.get_mut(id) {
*material = MaterialFXObject::from_json(next);
material.render_preview(&project.palette);

let node_canvas = material.to_canvas(&project.palette);
ui.set_node_canvas("MaterialFX NodeCanvas", node_canvas);

let mut editor = MODELFXEDITOR.lock().unwrap();
editor.set_material_tiles(ui, ctx, project, None);
editor.set_material_node_ui(server_ctx, project, ui, ctx);
editor.set_selected_material_node_ui(server_ctx, project, ui, ctx);
editor.render_material_changes(*id, server_ctx, project);
}
}
}
}
}

#[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
pub struct MaterialFXUndo {
pub stack: Vec<MaterialFXUndoAtom>,
pub index: isize,
}

impl Default for MaterialFXUndo {
fn default() -> Self {
Self::new()
}
}

impl MaterialFXUndo {
pub fn new() -> Self {
Self {
stack: vec![],
index: -1,
}
}

pub fn is_empty(&self) -> bool {
self.stack.is_empty()
}

pub fn clear(&mut self) {
self.stack = vec![];
self.index = -1;
}

pub fn has_undo(&self) -> bool {
self.index >= 0
}

pub fn has_redo(&self) -> bool {
if self.index >= -1 && self.index < self.stack.len() as isize - 1 {
return true;
}
false
}

pub fn add(&mut self, atom: MaterialFXUndoAtom) {
let to_remove = self.stack.len() as isize - self.index - 1;
for _i in 0..to_remove {
self.stack.pop();
}
self.stack.push(atom);
self.index += 1;
}

pub fn undo(
&mut self,
server_ctx: &mut ServerContext,
project: &mut Project,
ui: &mut TheUI,
ctx: &mut TheContext,
) {
if self.index >= 0 {
self.stack[self.index as usize].undo(server_ctx, project, ui, ctx);
self.index -= 1;
}
}

pub fn redo(
&mut self,
server_ctx: &mut ServerContext,
project: &mut Project,
ui: &mut TheUI,
ctx: &mut TheContext,
) {
if self.index < self.stack.len() as isize - 1 {
self.index += 1;
self.stack[self.index as usize].redo(server_ctx, project, ui, ctx);
}
}
}
58 changes: 35 additions & 23 deletions creator/src/undo/mod.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
pub mod modelfx_undo;
pub mod materialfx_undo;
pub mod region_undo;

use crate::prelude::*;

use crate::editor::MODELFXEDITOR;
//use crate::editor::MODELFXEDITOR;

use self::modelfx_undo::ModelFXUndo;
use self::materialfx_undo::MaterialFXUndo;

#[derive(PartialEq, Clone, Debug)]
pub enum UndoManagerContext {
None,
Region,
ModelFX,
MaterialFX,
CodeGridFX,
}

Expand All @@ -20,7 +20,7 @@ pub struct UndoManager {
pub context: UndoManagerContext,

regions: FxHashMap<Uuid, RegionUndo>,
modelfx: ModelFXUndo,
materialfx: MaterialFXUndo,
}

impl Default for UndoManager {
Expand All @@ -35,7 +35,7 @@ impl UndoManager {
context: UndoManagerContext::None,

regions: FxHashMap::default(),
modelfx: ModelFXUndo::default(),
materialfx: MaterialFXUndo::default(),
}
}

Expand All @@ -47,14 +47,21 @@ impl UndoManager {
self.can_save(ctx);
}

pub fn add_modelfx_undo(&mut self, atom: ModelFXUndoAtom, ctx: &mut TheContext) {
self.context = UndoManagerContext::ModelFX;
self.modelfx.add(atom);
pub fn add_materialfx_undo(&mut self, atom: MaterialFXUndoAtom, ctx: &mut TheContext) {
self.context = UndoManagerContext::MaterialFX;
self.materialfx.add(atom);
ctx.ui.set_enabled("Undo");
self.can_save(ctx);
}

pub fn undo(&mut self, context_id: Uuid, project: &mut Project, ctx: &mut TheContext) {
pub fn undo(
&mut self,
context_id: Uuid,
server_ctx: &mut ServerContext,
project: &mut Project,
ui: &mut TheUI,
ctx: &mut TheContext,
) {
match &self.context {
UndoManagerContext::None => {}
UndoManagerContext::Region => {
Expand All @@ -79,17 +86,16 @@ impl UndoManager {
}
}
}
UndoManagerContext::ModelFX => {
self.modelfx
.undo(&mut MODELFXEDITOR.lock().unwrap().modelfx);
UndoManagerContext::MaterialFX => {
self.materialfx.undo(server_ctx, project, ui, ctx);

if !self.modelfx.has_undo() {
if !self.materialfx.has_undo() {
ctx.ui.set_disabled("Undo");
} else {
ctx.ui.set_enabled("Undo");
}

if !self.modelfx.has_redo() {
if !self.materialfx.has_redo() {
ctx.ui.set_disabled("Redo");
} else {
ctx.ui.set_enabled("Redo");
Expand All @@ -100,7 +106,14 @@ impl UndoManager {
self.can_save(ctx);
}

pub fn redo(&mut self, context_id: Uuid, project: &mut Project, ctx: &mut TheContext) {
pub fn redo(
&mut self,
context_id: Uuid,
server_ctx: &mut ServerContext,
project: &mut Project,
ui: &mut TheUI,
ctx: &mut TheContext,
) {
match &self.context {
UndoManagerContext::None => {}
UndoManagerContext::Region => {
Expand All @@ -125,17 +138,16 @@ impl UndoManager {
}
}
}
UndoManagerContext::ModelFX => {
self.modelfx
.redo(&mut MODELFXEDITOR.lock().unwrap().modelfx);
UndoManagerContext::MaterialFX => {
self.materialfx.redo(server_ctx, project, ui, ctx);

if !self.modelfx.has_undo() {
if !self.materialfx.has_undo() {
ctx.ui.set_disabled("Undo");
} else {
ctx.ui.set_enabled("Undo");
}

if !self.modelfx.has_redo() {
if !self.materialfx.has_redo() {
ctx.ui.set_disabled("Redo");
} else {
ctx.ui.set_enabled("Redo");
Expand Down Expand Up @@ -168,7 +180,7 @@ impl UndoManager {
}

/// Clears the ModelFX undo.
pub fn clear_modelfx(&mut self) {
self.modelfx.clear();
pub fn clear_materialfx(&mut self) {
self.materialfx.clear();
}
}
Loading

0 comments on commit d06f6c4

Please sign in to comment.