OSDN Git Service

Added click to toggle selection, more firing of selection changed, and methods to...
authorNathanSweet <nathan.sweet@gmail.com>
Sun, 19 May 2013 00:40:19 +0000 (02:40 +0200)
committerNathanSweet <nathan.sweet@gmail.com>
Sun, 19 May 2013 00:40:19 +0000 (02:40 +0200)
gdx/src/com/badlogic/gdx/scenes/scene2d/ui/Tree.java

index 0ced3cc..08cd174 100644 (file)
@@ -44,6 +44,7 @@ public class Tree extends WidgetGroup {
        private float leftColumnWidth, prefWidth, prefHeight;\r
        private boolean sizeInvalid = true;\r
        boolean multiSelect = true;\r
+       boolean toggleSelect;\r
        private Node foundNode;\r
        Node overNode;\r
        private ClickListener clickListener;\r
@@ -78,9 +79,7 @@ public class Tree extends WidgetGroup {
                                                selectNodes(rootNodes, high, low);\r
                                        else\r
                                                selectNodes(rootNodes, low, high);\r
-                                       ChangeEvent changeEvent = Pools.obtain(ChangeEvent.class);\r
-                                       fire(changeEvent);\r
-                                       Pools.free(changeEvent);\r
+                                       fireChangeEvent();\r
                                        return;\r
                                }\r
                                if (!multiSelect || (!Gdx.input.isKeyPressed(Keys.CONTROL_LEFT) && !Gdx.input.isKeyPressed(Keys.CONTROL_RIGHT))) {\r
@@ -94,14 +93,17 @@ public class Tree extends WidgetGroup {
                                                }\r
                                        }\r
                                        if (!node.isSelectable()) return;\r
+                                       boolean unselect = toggleSelect && selectedNodes.size == 1 && selectedNodes.contains(node, true);\r
                                        selectedNodes.clear();\r
+                                       if (unselect) {\r
+                                               fireChangeEvent();\r
+                                               return;\r
+                                       }\r
                                } else if (!node.isSelectable()) //\r
                                        return;\r
                                // Select single (ctrl).\r
                                if (!selectedNodes.removeValue(node, true)) selectedNodes.add(node);\r
-                               ChangeEvent changeEvent = Pools.obtain(ChangeEvent.class);\r
-                               fire(changeEvent);\r
-                               Pools.free(changeEvent);\r
+                               fireChangeEvent();\r
                        }\r
 \r
                        public boolean mouseMoved (InputEvent event, float x, float y) {\r
@@ -149,6 +151,13 @@ public class Tree extends WidgetGroup {
                rootNodes.clear();\r
                selectedNodes.clear();\r
                setOverNode(null);\r
+               fireChangeEvent();\r
+       }\r
+\r
+       void fireChangeEvent () {\r
+               ChangeEvent changeEvent = Pools.obtain(ChangeEvent.class);\r
+               fire(changeEvent);\r
+               Pools.free(changeEvent);\r
        }\r
 \r
        public Array<Node> getNodes () {\r
@@ -301,19 +310,23 @@ public class Tree extends WidgetGroup {
        public void setSelection (Node node) {\r
                selectedNodes.clear();\r
                selectedNodes.add(node);\r
+               fireChangeEvent();\r
        }\r
 \r
        public void setSelection (Array<Node> nodes) {\r
                selectedNodes.clear();\r
                selectedNodes.addAll(nodes);\r
+               fireChangeEvent();\r
        }\r
 \r
        public void addSelection (Node node) {\r
                selectedNodes.add(node);\r
+               fireChangeEvent();\r
        }\r
 \r
        public void clearSelection () {\r
                selectedNodes.clear();\r
+               fireChangeEvent();\r
        }\r
 \r
        public TreeStyle getStyle () {\r
@@ -357,6 +370,29 @@ public class Tree extends WidgetGroup {
                return prefHeight;\r
        }\r
 \r
+       public void findExpandedObjects (Array objects) {\r
+               findExpandedObjects(rootNodes, objects);\r
+       }\r
+\r
+       public void restoreExpandedObjects (Array objects) {\r
+               for (int i = 0, n = objects.size; i < n; i++) {\r
+                       Node node = findNode(objects.get(i));\r
+                       if (node != null) {\r
+                               node.setExpanded(true);\r
+                               node.expandTo();\r
+                       }\r
+               }\r
+       }\r
+\r
+       static boolean findExpandedObjects (Array<Node> nodes, Array objects) {\r
+               boolean expanded = false;\r
+               for (int i = 0, n = nodes.size; i < n; i++) {\r
+                       Node node = nodes.get(i);\r
+                       if (node.expanded && !findExpandedObjects(node.children, objects)) objects.add(node.object);\r
+               }\r
+               return expanded;\r
+       }\r
+\r
        /** Returns the node with the specified object, or null. */\r
        public Node findNode (Object object) {\r
                if (object == null) throw new IllegalArgumentException("object cannot be null.");\r
@@ -406,6 +442,10 @@ public class Tree extends WidgetGroup {
                this.multiSelect = multiSelect;\r
        }\r
 \r
+       public void setToggleSelect (boolean toggleSelect) {\r
+               this.toggleSelect = toggleSelect;\r
+       }\r
+\r
        static public class Node {\r
                Actor actor;\r
                Node parent;\r