Add undo for material creation

This commit is contained in:
Lubos Lenco
2021-04-28 16:28:11 +02:00
parent 814c53607c
commit 2947aad4e8
6 changed files with 74 additions and 2 deletions
+59 -2
View File
@@ -8,6 +8,7 @@ import arm.ui.UINodes;
import arm.ui.UIToolbar;
import arm.sys.Path;
import arm.data.LayerSlot;
import arm.data.MaterialSlot;
import arm.node.MakeMaterial;
class History {
@@ -169,6 +170,24 @@ class History {
else if (step.name == tr("Edit Nodes")) {
swapCanvas(step);
}
else if (step.name == tr("New Material")) {
Context.material = Project.materials[step.material];
step.canvas = Context.material.canvas;
Context.material.delete();
}
else if (step.name == tr("Delete Material")) {
Context.material = new MaterialSlot(Project.materials[0].data);
Project.materials.insert(step.material, Context.material);
Context.material.canvas = step.canvas;
UINodes.inst.canvasChanged();
@:privateAccess UINodes.inst.getNodes().handle = new zui.Zui.Handle();
UINodes.inst.hwnd.redraws = 2;
}
else if (step.name == tr("Duplicate Material")) {
Context.material = Project.materials[step.material];
step.canvas = Context.material.canvas;
Context.material.delete();
}
else { // Paint operation
undoI = undoI - 1 < 0 ? Config.raw.undo_steps - 1 : undoI - 1;
var lay = undoLayers[undoI];
@@ -180,6 +199,7 @@ class History {
undos--;
redos++;
UISidebar.inst.hwnd0.redraws = 2;
UISidebar.inst.hwnd1.redraws = 2;
Context.ddirty = 2;
if (UIView2D.inst.show) UIView2D.inst.hwnd.redraws = 2;
}
@@ -294,6 +314,27 @@ class History {
else if (step.name == tr("Edit Nodes")) {
swapCanvas(step);
}
else if (step.name == tr("New Material")) {
Context.material = new MaterialSlot(Project.materials[0].data);
Project.materials.insert(step.material, Context.material);
Context.material.canvas = step.canvas;
UINodes.inst.canvasChanged();
@:privateAccess UINodes.inst.getNodes().handle = new zui.Zui.Handle();
UINodes.inst.hwnd.redraws = 2;
}
else if (step.name == tr("Delete Material")) {
Context.material = Project.materials[step.material];
step.canvas = Context.material.canvas;
Context.material.delete();
}
else if (step.name == tr("Duplicate Material")) {
Context.material = new MaterialSlot(Project.materials[0].data);
Project.materials.insert(step.material, Context.material);
Context.material.canvas = step.canvas;
UINodes.inst.canvasChanged();
@:privateAccess UINodes.inst.getNodes().handle = new zui.Zui.Handle();
UINodes.inst.hwnd.redraws = 2;
}
else { // Paint operation
var lay = undoLayers[undoI];
Context.selectPaintObject(Project.paintObjects[step.object]);
@@ -305,6 +346,7 @@ class History {
undos++;
redos--;
UISidebar.inst.hwnd0.redraws = 2;
UISidebar.inst.hwnd1.redraws = 2;
Context.ddirty = 2;
if (UIView2D.inst.show) UIView2D.inst.hwnd.redraws = 2;
}
@@ -410,8 +452,23 @@ class History {
push(tr("Layer Blending"));
}
// public static function newMaterial() {}
// public static function deleteMaterial() {}
public static function newMaterial() {
var step = push(tr("New Material"));
step.canvas_type = 0;
step.canvas = haxe.Json.parse(haxe.Json.stringify(Context.material.canvas));
}
public static function deleteMaterial() {
var step = push(tr("Delete Material"));
step.canvas_type = 0;
step.canvas = haxe.Json.parse(haxe.Json.stringify(Context.material.canvas));
}
public static function duplicateMaterial() {
var step = push(tr("Duplicate Material"));
step.canvas_type = 0;
step.canvas = haxe.Json.parse(haxe.Json.stringify(Context.material.canvas));
}
public static function editNodes(canvas: TNodeCanvas, canvas_type: Int, canvas_group: Null<Int> = null) {
var step = push(tr("Edit Nodes"));
+9
View File
@@ -58,4 +58,13 @@ class MaterialSlot {
}
App.notifyOnNextFrame(_next);
}
public function delete() {
unload();
var mpos = Project.materials.indexOf(this);
Project.materials.remove(this);
if (Project.materials.length > 0) {
Context.setMaterial(Project.materials[mpos > 0 ? mpos - 1 : 0]);
}
}
}
+1
View File
@@ -393,6 +393,7 @@ class ImportArm {
Context.material = new MaterialSlot(m0, c);
Project.materials.push(Context.material);
imported.push(Context.material);
History.newMaterial();
}
if (project.material_groups != null) {
+1
View File
@@ -624,6 +624,7 @@ class ImportBlend {
link = link.get("next");
if (last.block == link.block) break;
}
History.newMaterial();
}
function _init() {
+1
View File
@@ -113,6 +113,7 @@ class ImportFolder {
MakeMaterial.parsePaintMaterial();
RenderUtil.makeMaterialPreview();
UISidebar.inst.hwnd1.redraws = 2;
History.newMaterial();
}
static function placeImageNode(nodes: Nodes, canvas: TNodeCanvas, asset: String, ny: Int, to_id: Int, to_socket: Int) {
+3
View File
@@ -33,6 +33,7 @@ class TabMaterials {
materials.push(Context.material);
updateMaterial();
ui.g.begin(false);
History.newMaterial();
}
if (ui.button(tr("Import"))) {
@@ -136,11 +137,13 @@ class TabMaterials {
var cloned = Json.parse(Json.stringify(materials[i].canvas));
Context.material.canvas = cloned;
updateMaterial();
History.duplicateMaterial();
}
iron.App.notifyOnInit(_init);
}
if (materials.length > 1 && ui.button(tr("Delete"), Left)) {
History.deleteMaterial();
selectMaterial(i == 0 ? 1 : 0);
materials.splice(i, 1);
UISidebar.inst.hwnd1.redraws = 2;