From ecbec5de4e0dcf3a9c2f1f5b6d09ea184c69cad5 Mon Sep 17 00:00:00 2001 From: lunarcleint Date: Thu, 20 Mar 2025 13:04:51 -0700 Subject: [PATCH] undos finsished i think >:D --- source/funkin/editors/UndoList.hx | 6 +++ .../editors/character/CharacterAnimButton.hx | 44 ++++++++++++++++--- .../editors/character/CharacterEditor.hx | 31 ++++++++++--- 3 files changed, 70 insertions(+), 11 deletions(-) diff --git a/source/funkin/editors/UndoList.hx b/source/funkin/editors/UndoList.hx index cefdc12f..79d61a87 100644 --- a/source/funkin/editors/UndoList.hx +++ b/source/funkin/editors/UndoList.hx @@ -35,4 +35,10 @@ class UndoList { public inline function save() savedLength = undoList.length; + + public inline function clear() { + undoList = []; + redoList = []; + save(); + } } \ No newline at end of file diff --git a/source/funkin/editors/character/CharacterAnimButton.hx b/source/funkin/editors/character/CharacterAnimButton.hx index 82fc04f7..3f0e48da 100644 --- a/source/funkin/editors/character/CharacterAnimButton.hx +++ b/source/funkin/editors/character/CharacterAnimButton.hx @@ -216,7 +216,7 @@ class CharacterAnimButton extends UIButton { super.update(elapsed); } - public function changeName(newName:String) @:privateAccess { + public function changeName(newName:String, addToUndo:Bool = true) @:privateAccess { if (newName == anim) return; if (parent.character.getNameList().indexOf(newName) != -1) { @@ -224,6 +224,7 @@ class CharacterAnimButton extends UIButton { return; } + var oldName:String = anim; if (parent.character.animateAtlas != null) { var animSymbol:FlxSymbolAnimation = __getAnimationSymbol(); @@ -252,13 +253,17 @@ class CharacterAnimButton extends UIButton { parent.displayAnimsFramesList.set(newName, displayFrame); this.anim = newName; + nameTextBox.label.text = newName; updateText(); + + if (addToUndo) CharacterEditor.undos.addToUndo(CAnimEditName(ID, oldName, newName)); } - public function changeAnim(newAnim:String) @:privateAccess { + public function changeAnim(newAnim:String, addToUndo:Bool = true) @:privateAccess { var animData:AnimData = parent.character.animDatas[anim]; if (newAnim == animData.anim) return; + var oldAnim:String = animData.anim; animData.anim = newAnim; if (parent.character.animateAtlas != null) @@ -280,13 +285,19 @@ class CharacterAnimButton extends UIButton { if (parent.character.getAnimName() == anim) CharacterEditor.instance.playAnimation(anim); + + animTextBox.label.text = newAnim; + + if (addToUndo) CharacterEditor.undos.addToUndo(CAnimEditAnim(ID, oldAnim, newAnim)); } - public function changeOffset(newOffsetX:Null, newOffsetY:Null) { + public function changeOffset(newOffsetX:Null, newOffsetY:Null, addToUndo:Bool = true) { var animData:AnimData = parent.character.animDatas[anim]; if (newOffsetX != null && newOffsetY != null && newOffsetX == animData.x && newOffsetY == animData.y) return; + + var oldPosition:FlxPoint = FlxPoint.get(animData.x, animData.y); if (newOffsetX != null) animData.x = newOffsetX; if (newOffsetY != null) animData.y = newOffsetY; @@ -296,11 +307,17 @@ class CharacterAnimButton extends UIButton { if (parent.character.getAnimName() == anim && Options.playAnimOnOffset) CharacterEditor.instance.playAnimation(anim); + positionXStepper.label.text = Std.string(animData.x); + positionYStepper.label.text = Std.string(animData.y); + updateText(); + + if (addToUndo) CharacterEditor.undos.addToUndo(CAnimEditOffset(ID, oldPosition, FlxPoint.get(animData.x, animData.y))); } - public function changeFPS(newFPS:Float) @:privateAccess { + public function changeFPS(newFPS:Float, addToUndo:Bool = true) @:privateAccess { var animData:AnimData = parent.character.animDatas[anim]; + var oldFPS:Float = animData.fps; animData.fps = newFPS; if (parent.character.animateAtlas != null) { @@ -313,10 +330,15 @@ class CharacterAnimButton extends UIButton { if (parent.character.getAnimName() == anim) CharacterEditor.instance.playAnimation(anim); + + fpsStepper.label.text = Std.string(newFPS); + + if (addToUndo) CharacterEditor.undos.addToUndo(CAnimEditFPS(ID, oldFPS, newFPS)); } - public function changeLooping(newLooping:Bool) @:privateAccess { + public function changeLooping(newLooping:Bool, addToUndo:Bool = true) @:privateAccess { var animData:AnimData = parent.character.animDatas[anim]; + animData.loop = newLooping; if (parent.character.animateAtlas != null) { @@ -329,16 +351,26 @@ class CharacterAnimButton extends UIButton { if (parent.character.getAnimName() == anim) CharacterEditor.instance.playAnimation(anim); + + loopedCheckbox.checked = newLooping; + + if (addToUndo) CharacterEditor.undos.addToUndo(CAnimEditLooping(ID, newLooping)); } - public function changeIndicies(indicies:Array) @:privateAccess { + public function changeIndicies(indicies:Array, addToUndo:Bool = true) @:privateAccess { var animData:AnimData = parent.character.animDatas[anim]; + var oldIndices:Array = animData.indices.copy(); + animData.indices = indicies; __refreshAnimation(); if (parent.character.getAnimName() == anim) CharacterEditor.instance.playAnimation(anim); + + indicesTextBox.label.text = animData.indices.join(", "); + + if (addToUndo) CharacterEditor.undos.addToUndo(CAnimEditIndices(ID, oldIndices, indicies)); } public inline function refreshFlxAnimationFrames(flxAnimation:FlxAnimation, animData:AnimData) @:privateAccess { diff --git a/source/funkin/editors/character/CharacterEditor.hx b/source/funkin/editors/character/CharacterEditor.hx index a12689cc..258bf8ff 100644 --- a/source/funkin/editors/character/CharacterEditor.hx +++ b/source/funkin/editors/character/CharacterEditor.hx @@ -505,7 +505,6 @@ class CharacterEditor extends UIState { changeCharacterDesginedAs(!newIsPlayer, false); case CCharEditInfo(oldInfo, newInfo): characterPropertiesWindow.editCharacterInfo(oldInfo, false); - case CCharEditSprite(oldSprite, newSprite): case CAnimCreate(animID, animData): characterAnimsWindow.deleteAnimation(characterAnimsWindow.buttons.members[animID], false); case CAnimDelete(animID, animData): @@ -516,15 +515,27 @@ class CharacterEditor extends UIState { characterAnimsWindow.buttons.members.remove(button); characterAnimsWindow.buttons.members.insert(animID, button); case CAnimEditName(animID, oldName, newName): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeName(oldName, false); case CAnimEditAnim(animID, oldAnim, newAnim): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeAnim(oldAnim, false); case CAnimEditOffset(animID, oldOffset, newOffset): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeOffset(oldOffset.x, oldOffset.y, false); case CAnimEditFPS(animID, oldFPS, newFPS): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeFPS(oldFPS, false); case CAnimEditLooping(animID, newLooping): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeLooping(!newLooping, false); case CAnimEditIndices(animID, oldIndicies, newIndicies): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeIndicies(oldIndicies, false); case CCharClearOffsets(oldOffsets): for (anim => offset in oldOffsets) if (characterAnimsWindow.animButtons[anim] != null) - characterAnimsWindow.animButtons[anim].changeOffset(offset.x, offset.y); + characterAnimsWindow.animButtons[anim].changeOffset(offset.x, offset.y, false); } } @@ -550,7 +561,6 @@ class CharacterEditor extends UIState { changeCharacterDesginedAs(newIsPlayer, false); case CCharEditInfo(oldInfo, newInfo): characterPropertiesWindow.editCharacterInfo(newInfo, false); - case CCharEditSprite(oldSprite, newSprite): case CAnimCreate(animID, animData): characterAnimsWindow.addAnimation(animData, animID, false); playAnimation(animData.name); @@ -561,11 +571,23 @@ class CharacterEditor extends UIState { characterAnimsWindow.buttons.members.remove(button); characterAnimsWindow.buttons.members.insert(newAnimID, button); case CAnimEditName(animID, oldName, newName): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeName(newName, false); case CAnimEditAnim(animID, oldAnim, newAnim): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeAnim(newAnim, false); case CAnimEditOffset(animID, oldOffset, newOffset): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeOffset(newOffset.x, newOffset.y, false); case CAnimEditFPS(animID, oldFPS, newFPS): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeFPS(newFPS, false); case CAnimEditLooping(animID, newLooping): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeLooping(newLooping, false); case CAnimEditIndices(animID, oldIndicies, newIndicies): + var button:CharacterAnimButton = characterAnimsWindow.buttons.members[animID]; + button.changeIndicies(newIndicies, false); case CCharClearOffsets(oldOffsets): clearOffsets(false); } @@ -601,7 +623,7 @@ class CharacterEditor extends UIState { ]; for (anim => button in characterAnimsWindow.animButtons) - button.changeOffset(0, 0); + button.changeOffset(0, 0, false); if (addToUndo) undos.addToUndo(CCharClearOffsets(oldOffsets)); } @@ -861,7 +883,6 @@ enum CharacterEditorChange { CCharEditDesignedAs(newIsPlayer:Bool); CCharEditInfo(oldInfo:CharacterExtraInfo, newInfo:CharacterExtraInfo); - CCharEditSprite(oldSprite:String, newSprite:String); CAnimCreate(animID:Int, animData:AnimData); CAnimDelete(animID:Int, animData:AnimData);