From 7ee334f5106c43ad614bfb4bec19218a76d8f010 Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Sun, 19 May 2013 02:40:19 +0200 Subject: [PATCH] Added click to toggle selection, more firing of selection changed, and methods to get/restore expanded nodes. --- .../com/badlogic/gdx/scenes/scene2d/ui/Tree.java | 52 +++++++++++++++++++--- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/gdx/src/com/badlogic/gdx/scenes/scene2d/ui/Tree.java b/gdx/src/com/badlogic/gdx/scenes/scene2d/ui/Tree.java index 0ced3cc8e..08cd1742d 100644 --- a/gdx/src/com/badlogic/gdx/scenes/scene2d/ui/Tree.java +++ b/gdx/src/com/badlogic/gdx/scenes/scene2d/ui/Tree.java @@ -44,6 +44,7 @@ public class Tree extends WidgetGroup { private float leftColumnWidth, prefWidth, prefHeight; private boolean sizeInvalid = true; boolean multiSelect = true; + boolean toggleSelect; private Node foundNode; Node overNode; private ClickListener clickListener; @@ -78,9 +79,7 @@ public class Tree extends WidgetGroup { selectNodes(rootNodes, high, low); else selectNodes(rootNodes, low, high); - ChangeEvent changeEvent = Pools.obtain(ChangeEvent.class); - fire(changeEvent); - Pools.free(changeEvent); + fireChangeEvent(); return; } if (!multiSelect || (!Gdx.input.isKeyPressed(Keys.CONTROL_LEFT) && !Gdx.input.isKeyPressed(Keys.CONTROL_RIGHT))) { @@ -94,14 +93,17 @@ public class Tree extends WidgetGroup { } } if (!node.isSelectable()) return; + boolean unselect = toggleSelect && selectedNodes.size == 1 && selectedNodes.contains(node, true); selectedNodes.clear(); + if (unselect) { + fireChangeEvent(); + return; + } } else if (!node.isSelectable()) // return; // Select single (ctrl). if (!selectedNodes.removeValue(node, true)) selectedNodes.add(node); - ChangeEvent changeEvent = Pools.obtain(ChangeEvent.class); - fire(changeEvent); - Pools.free(changeEvent); + fireChangeEvent(); } public boolean mouseMoved (InputEvent event, float x, float y) { @@ -149,6 +151,13 @@ public class Tree extends WidgetGroup { rootNodes.clear(); selectedNodes.clear(); setOverNode(null); + fireChangeEvent(); + } + + void fireChangeEvent () { + ChangeEvent changeEvent = Pools.obtain(ChangeEvent.class); + fire(changeEvent); + Pools.free(changeEvent); } public Array getNodes () { @@ -301,19 +310,23 @@ public class Tree extends WidgetGroup { public void setSelection (Node node) { selectedNodes.clear(); selectedNodes.add(node); + fireChangeEvent(); } public void setSelection (Array nodes) { selectedNodes.clear(); selectedNodes.addAll(nodes); + fireChangeEvent(); } public void addSelection (Node node) { selectedNodes.add(node); + fireChangeEvent(); } public void clearSelection () { selectedNodes.clear(); + fireChangeEvent(); } public TreeStyle getStyle () { @@ -357,6 +370,29 @@ public class Tree extends WidgetGroup { return prefHeight; } + public void findExpandedObjects (Array objects) { + findExpandedObjects(rootNodes, objects); + } + + public void restoreExpandedObjects (Array objects) { + for (int i = 0, n = objects.size; i < n; i++) { + Node node = findNode(objects.get(i)); + if (node != null) { + node.setExpanded(true); + node.expandTo(); + } + } + } + + static boolean findExpandedObjects (Array nodes, Array objects) { + boolean expanded = false; + for (int i = 0, n = nodes.size; i < n; i++) { + Node node = nodes.get(i); + if (node.expanded && !findExpandedObjects(node.children, objects)) objects.add(node.object); + } + return expanded; + } + /** Returns the node with the specified object, or null. */ public Node findNode (Object object) { if (object == null) throw new IllegalArgumentException("object cannot be null."); @@ -406,6 +442,10 @@ public class Tree extends WidgetGroup { this.multiSelect = multiSelect; } + public void setToggleSelect (boolean toggleSelect) { + this.toggleSelect = toggleSelect; + } + static public class Node { Actor actor; Node parent; -- 2.11.0