From 87eb9fa1ccf69bde4a270a661ca5ec657f00a9c4 Mon Sep 17 00:00:00 2001 From: fgnm Date: Sun, 8 Aug 2021 17:04:39 +0200 Subject: [PATCH] * Avoid tons of garbage in `Items Tree` * Update libGDX to 1.10.1-SNAPSHOT * Update LWJGL to 3.3.0-SNAPSHOT --- CHANGES | 4 + gradle.properties | 4 +- .../editor/CustomExceptionHandler.java | 2 + .../commands/ConvertToCompositeCommand.java | 2 + .../controller/commands/ItemsMoveCommand.java | 7 +- .../editor/utils/runtime/EntityUtils.java | 5 +- .../editor/view/ui/box/UIItemsTreeBox.java | 96 ++++++++++++------- .../view/ui/box/UIItemsTreeBoxMediator.java | 4 +- .../editor/view/ui/box/UIItemsTreeNode.java | 49 +++++++++- .../editor/view/ui/box/UIItemsTreeValue.java | 18 +++- 10 files changed, 142 insertions(+), 49 deletions(-) diff --git a/CHANGES b/CHANGES index bb808a3a..dfd51057 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ [0.0.8] +- Update libGDX to 1.10.1-SNAPSHOT - [BREAK CHANGE] Rework runtime code, replaced Ashley ECS with Artemis-odb += Editor = +- Update LWJGL to 3.3.0-SNAPSHOT + [0.0.7] - [BREAK CHANGE] Spine and Sprite animations are now packed into same main atlas pack - [BREAK CHANGE] Update Project version to `0.2.0` diff --git a/gradle.properties b/gradle.properties index ab931061..c9970b28 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -gdxVersion = 1.10.0 -lwjgl3Version = 3.2.3 +gdxVersion = 1.10.1-SNAPSHOT +lwjgl3Version = 3.3.0-SNAPSHOT artemisVersion = 2.3.0 spineVersion = 3.8.55.1 visuiVersion = 1.5.0 diff --git a/src/main/java/games/rednblack/editor/CustomExceptionHandler.java b/src/main/java/games/rednblack/editor/CustomExceptionHandler.java index b043e32b..8227f4c2 100644 --- a/src/main/java/games/rednblack/editor/CustomExceptionHandler.java +++ b/src/main/java/games/rednblack/editor/CustomExceptionHandler.java @@ -37,6 +37,8 @@ public class CustomExceptionHandler implements UncaughtExceptionHandler { stacktrace = stacktrace.replace("<", ""); stacktrace = stacktrace.replace(">", ""); stacktrace = stacktrace.replace("$", ""); + stacktrace = stacktrace.replace("'", ""); + stacktrace = stacktrace.replace("\"", ""); TinyFileDialogs.tinyfd_messageBox("Oops! Something went wrong", "HyperLap2D just crashed, stacktrace saved in: " + localPath.getAbsolutePath() diff --git a/src/main/java/games/rednblack/editor/controller/commands/ConvertToCompositeCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ConvertToCompositeCommand.java index e3b72bfa..87576a0a 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/ConvertToCompositeCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/ConvertToCompositeCommand.java @@ -143,5 +143,7 @@ public class ConvertToCompositeCommand extends EntityModifyRevertibleCommand { HyperLap2DFacade.getInstance().sendNotification(DONE); sandbox.getSelector().setSelections(children, true); + + facade.sendNotification(MsgAPI.DELETE_ITEMS_COMMAND_DONE); } } diff --git a/src/main/java/games/rednblack/editor/controller/commands/ItemsMoveCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ItemsMoveCommand.java index 675316ad..35ab6cdb 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/ItemsMoveCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/ItemsMoveCommand.java @@ -24,7 +24,6 @@ import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.h2d.common.MsgAPI; import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.renderer.components.TransformComponent; -import games.rednblack.editor.renderer.utils.ComponentRetriever; import games.rednblack.editor.utils.runtime.EntityUtils; import java.util.HashMap; @@ -35,6 +34,8 @@ import java.util.Map; */ public class ItemsMoveCommand extends EntityModifyRevertibleCommand { + public static final String TAG = ItemsMoveCommand.class.getCanonicalName(); + private HashMap prevLocations = new HashMap<>(); @Override @@ -59,7 +60,7 @@ public class ItemsMoveCommand extends EntityModifyRevertibleCommand { transformComponent.y = newLocation.y; // pining UI to update current item properties tools - HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity, TAG); } } @@ -76,7 +77,7 @@ public class ItemsMoveCommand extends EntityModifyRevertibleCommand { transformComponent.y = prevLocation.y; // pining UI to update current item properties tools - HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity, TAG); } } diff --git a/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java b/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java index 5517d0e3..14d47679 100644 --- a/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java +++ b/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java @@ -92,9 +92,8 @@ public class EntityUtils { } } - public static Drawable getItemIcon(int entity) { - int type = EntityUtils.getType(entity); - String icon = itemTypeIconMap.get(type); + public static Drawable getItemIcon(int entityType) { + String icon = itemTypeIconMap.get(entityType); return VisUI.getSkin().getDrawable(icon); } diff --git a/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBox.java b/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBox.java index 90129bc4..78afbfaf 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBox.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBox.java @@ -21,12 +21,15 @@ package games.rednblack.editor.view.ui.box; import java.util.Comparator; import java.util.Set; +import com.artemis.ComponentMapper; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; -import com.badlogic.gdx.scenes.scene2d.ui.Cell; import com.badlogic.gdx.scenes.scene2d.ui.Tree; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.Selection; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Pools; import com.kotcrab.vis.ui.widget.*; import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.renderer.components.MainItemComponent; @@ -34,25 +37,33 @@ import games.rednblack.editor.renderer.components.NodeComponent; import games.rednblack.editor.renderer.components.ParentNodeComponent; import games.rednblack.editor.renderer.components.ZIndexComponent; import games.rednblack.editor.renderer.factory.EntityFactory; -import games.rednblack.editor.renderer.utils.ComponentRetriever; -import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.h2d.common.MsgAPI; import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; import games.rednblack.editor.utils.runtime.EntityUtils; import games.rednblack.editor.view.stage.Sandbox; public class UIItemsTreeBox extends UICollapsibleBox { + protected ComponentMapper nodeComponentMapper; + protected ComponentMapper parentNodeComponentMapper; + protected ComponentMapper mainItemComponentMapper; + protected ComponentMapper zIndexComponentMapper; + public static final String ITEMS_SELECTED = "games.rednblack.editor.view.ui.box.UIItemsTreeBox." + ".ITEMS_SELECTED"; private final HyperLap2DFacade facade; private final VisTable treeTable; private Tree tree; + private VisScrollPane scroller; + private UIItemsTreeNode rootTreeNode; + private final Array tmpNodes = new Array<>(); private UIItemsTreeNode rootNode; private Set lastSelection; private final VisImageButton zUp, zDown; - Sandbox sandbox; + private Sandbox sandbox; + + private final ZIndexComparator zIndexComparator = new ZIndexComparator(); public UIItemsTreeBox() { super("Items Tree", 180); @@ -87,14 +98,13 @@ public class UIItemsTreeBox extends UICollapsibleBox { }); } - UIItemsTreeNode rootTreeNode; - public void init(int rootScene) { sandbox = Sandbox.getInstance(); + sandbox.getEngine().inject(this); treeTable.clear(); tree = new VisTree<>(); - VisScrollPane scroller = StandardWidgetsFactory.createScrollPane(tree); + scroller = StandardWidgetsFactory.createScrollPane(tree); scroller.setFlickScroll(false); treeTable.add(scroller).width(177).maxHeight(570).colspan(2); // @@ -115,20 +125,39 @@ public class UIItemsTreeBox extends UICollapsibleBox { } public void sortTree() { - rootTreeNode.getChildren().sort(new ZIndexComparator()); + rootTreeNode.getChildren().sort(zIndexComparator); rootTreeNode.updateChildren(); tree.updateRootNodes(); } + public void update(int rootScene) { + Pools.freeAll(tmpNodes); + tmpNodes.clear(); + + tree.clearChildren(); + tree.setOverNode(null); + tree.getRootNodes().clear(); + tree.getSelection().clear(); + + rootTreeNode = addTreeRoot(rootScene, null); + rootTreeNode.setExpanded(true); + + sortTree(); + + if (lastSelection != null) + setSelection(lastSelection); + } + private UIItemsTreeNode addTreeRoot(int entity, UIItemsTreeNode parentNode) { // was like this addTreeRoot(CompositeItem compoiteItem, Node parentNode) UIItemsTreeNode node = addTreeNode(entity, parentNode); if (parentNode == null) rootNode = node; - NodeComponent nodeComponent = SandboxComponentRetriever.get(entity, NodeComponent.class); + NodeComponent nodeComponent = nodeComponentMapper.get(entity); + MainItemComponent mainItemComponent = mainItemComponentMapper.get(entity); if(nodeComponent != null) { for (int item : nodeComponent.children) { - if (EntityUtils.getType(entity) == EntityFactory.COMPOSITE_TYPE) { + if (mainItemComponent.entityType == EntityFactory.COMPOSITE_TYPE) { addTreeRoot(item, node); } else { addTreeNode(item, node); @@ -139,38 +168,36 @@ public class UIItemsTreeBox extends UICollapsibleBox { } private UIItemsTreeNode addTreeNode(int item, UIItemsTreeNode parentNode) { - String name, style; - ParentNodeComponent parentNodeComponent = SandboxComponentRetriever.get(item, ParentNodeComponent.class); - MainItemComponent mainItemComponent = SandboxComponentRetriever.get(item, MainItemComponent.class); + String name; + ParentNodeComponent parentNodeComponent = parentNodeComponentMapper.get(item); + MainItemComponent mainItemComponent = mainItemComponentMapper.get(item); + + UIItemsTreeNode node = Pools.get(UIItemsTreeNode.class, 20000).obtain(); + tmpNodes.add(node); if (parentNodeComponent == null) { + node.setColor(Color.WHITE); name = Sandbox.getInstance().sceneControl.getCurrentSceneVO().sceneName; - style = "default"; } else if (mainItemComponent.itemIdentifier != null && !mainItemComponent.itemIdentifier.isEmpty()) { + node.setColor(Color.WHITE); name = mainItemComponent.itemIdentifier; - style = "default"; } else { - style = "greyed"; - int type = EntityUtils.getType(item); - name = EntityUtils.itemTypeNameMap.get(type); + node.setColor(0.65f, 0.65f, 0.65f, 1f); + name = EntityUtils.itemTypeNameMap.get(mainItemComponent.entityType); if (name == null) name = EntityUtils.itemTypeNameMap.get(EntityFactory.UNKNOWN_TYPE); } - VisTable label = new VisTable(); - Cell lblCell = label.add(new VisLabel(name, style)); - UIItemsTreeNode node = new UIItemsTreeNode(label); - ZIndexComponent zIndexComponent = SandboxComponentRetriever.get(item, ZIndexComponent.class); + node.setName(name); + ZIndexComponent zIndexComponent = zIndexComponentMapper.get(item); - node.setValue(new UIItemsTreeValue(mainItemComponent.uniqueId, zIndexComponent.getGlobalZIndex())); + node.setNodeValue(mainItemComponent.uniqueId, zIndexComponent.getGlobalZIndex()); if (mainItemComponent.entityType != EntityFactory.COMPOSITE_TYPE) - lblCell.padBottom(4); - else { - lblCell.padTop(4); - lblCell.padLeft(3); - lblCell.padBottom(4); - } - node.setIcon(EntityUtils.getItemIcon(item)); + node.setPad(0, 0, 4, 0); + else + node.setPad(4, 3, 4, 0); + + node.setIcon(EntityUtils.getItemIcon(mainItemComponent.entityType)); if (parentNode != null) { parentNode.add(node); } else { @@ -193,7 +220,7 @@ public class UIItemsTreeBox extends UICollapsibleBox { lastSelection.addAll(selection); if (tree == null || selection == null) return; - Array allSceneRootNodes = tree.getNodes().get(0).getChildren(); + Array allSceneRootNodes = tree.getRootNodes().get(0).getChildren(); for (int entityId : EntityUtils.getEntityId(selection)) { for (UIItemsTreeNode n : allSceneRootNodes) { @@ -203,6 +230,11 @@ public class UIItemsTreeBox extends UICollapsibleBox { } } } + + if (tree.getSelection().size() > 0) { + Actor firstSelected = tree.getSelection().first().getActor(); + scroller.scrollTo(0, firstSelected.getY(), firstSelected.getWidth(), firstSelected.getHeight()); + } } public void removeFromSelection(Set selection) { @@ -210,7 +242,7 @@ public class UIItemsTreeBox extends UICollapsibleBox { lastSelection.removeAll(selection); if (tree == null || selection == null) return; - Array allSceneRootNodes = tree.getNodes().get(0).getChildren(); + Array allSceneRootNodes = tree.getRootNodes().get(0).getChildren(); for (int entityId : EntityUtils.getEntityId(selection)) { for (UIItemsTreeNode n : allSceneRootNodes) { diff --git a/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBoxMediator.java b/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBoxMediator.java index e2d1ee91..def73a3c 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBoxMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBoxMediator.java @@ -2,6 +2,7 @@ package games.rednblack.editor.view.ui.box; import com.badlogic.gdx.scenes.scene2d.utils.Selection; import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.controller.commands.ItemsMoveCommand; import games.rednblack.editor.controller.commands.resource.DeleteResourceCommand; import games.rednblack.h2d.common.MsgAPI; import games.rednblack.editor.HyperLap2DFacade; @@ -65,7 +66,8 @@ public class UIItemsTreeBoxMediator extends PanelMediator { case MsgAPI.DELETE_ITEMS_COMMAND_DONE: case DeleteResourceCommand.DONE: rootEntity = sandbox.getCurrentViewingEntity(); - viewComponent.init(rootEntity); + if (notification.getType() == null || !notification.getType().equals(ItemsMoveCommand.TAG)) + viewComponent.update(rootEntity); break; case UIItemsTreeBox.ITEMS_SELECTED: Selection selection = notification.getBody(); diff --git a/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeNode.java b/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeNode.java index 258e4ff0..c66f85c9 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeNode.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeNode.java @@ -1,11 +1,54 @@ package games.rednblack.editor.view.ui.box; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.scenes.scene2d.ui.Cell; import com.badlogic.gdx.scenes.scene2d.ui.Tree; +import com.badlogic.gdx.utils.Pool; +import com.kotcrab.vis.ui.widget.VisLabel; import com.kotcrab.vis.ui.widget.VisTable; -public class UIItemsTreeNode extends Tree.Node { +public class UIItemsTreeNode extends Tree.Node implements Pool.Poolable { + VisLabel label; + Cell lblCell; - public UIItemsTreeNode(VisTable actor) { - super(actor); + public UIItemsTreeNode() { + super(new VisTable()); + + label = new VisLabel("", "default"); + setColor(Color.WHITE); + lblCell = getActor().add(label); + + setValue(new UIItemsTreeValue()); + } + + public void setNodeValue(int entityId, int zIndex) { + getValue().setEntityId(entityId); + getValue().setzIndex(zIndex); + } + + public void setColor(Color color) { + label.setColor(color); + } + + public void setColor(float r, float g, float b, float a) { + label.setColor(r, g, b, a); + } + + public void setName(String name) { + label.setText(name); + } + + public void setPad(float top, float left, float bottom, float right) { + lblCell.pad(top, left, bottom, right); + } + + @Override + public void reset() { + getValue().reset(); + + setExpanded(false); + setIcon(null); + clearChildren(); + remove(); } } diff --git a/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeValue.java b/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeValue.java index 7bacafea..4e1bacb5 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeValue.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeValue.java @@ -1,11 +1,19 @@ package games.rednblack.editor.view.ui.box; public class UIItemsTreeValue { - public int entityId; - public int zIndex; + public int entityId = -1; + public int zIndex = -1; - public UIItemsTreeValue(int id, int index) { - entityId = id; - zIndex = index; + public void setEntityId(int entityId) { + this.entityId = entityId; + } + + public void setzIndex(int zIndex) { + this.zIndex = zIndex; + } + + public void reset() { + entityId = -1; + zIndex = -1; } }