Explorar el Código

fixed some exceptions in icon tree (jquery.data on complex objects) : do not hold values

Nicolas Cannasse hace 4 años
padre
commit
eacddfbd8f
Se han modificado 1 ficheros con 35 adiciones y 19 borrados
  1. 35 19
      hide/comp/IconTree.hx

+ 35 - 19
hide/comp/IconTree.hx

@@ -23,6 +23,7 @@ class IconTree<T:{}> extends Component {
 
 	var waitRefresh = new Array<Void->Void>();
 	var map : Map<String, IconTreeItem<T>> = new Map();
+	var values : Map<String, T> = new Map();
 	var revMapString : haxe.ds.StringMap<IconTreeItem<T>> = new haxe.ds.StringMap();
 	var revMap : haxe.ds.ObjectMap<T, IconTreeItem<T>> = new haxe.ds.ObjectMap();
 	public var allowRename : Bool;
@@ -62,17 +63,31 @@ class IconTree<T:{}> extends Component {
 	public dynamic function applyStyle( e : T, element : Element ) {
 	}
 
+	function getValue( c : IconTreeItem<T> ) {
+		if( c.value != null )
+			return c.value;
+		return values.get(c.id);
+	}
+
+	function getVal( id : String ) : T {
+		var c = map.get(id);
+		return getValue(c);
+	}
+
 	function makeContent(parent:IconTreeItem<T>) {
-		var content : Array<IconTreeItem<T>> = get(parent == null ? null : parent.value);
+		var content : Array<IconTreeItem<T>> = get(parent == null ? null : getValue(parent));
 		for( c in content ) {
 			var key = (parent == null ? "" : parent.absKey + "/") + c.text;
 			if( c.absKey == null ) c.absKey = key;
-			c.id = "titem$" + (UID++);
+			c.id = "titem__" + (UID++);
 			map.set(c.id, c);
 			if( Std.is(c.value, String) )
 				revMapString.set(cast c.value, c);
-			else
+			else {
 				revMap.set(c.value, c);
+				values.set(c.id, c.value);
+				c.value = null;
+			}
 			if( c.state == null ) {
 				var s = getDisplayState(key);
 				if( s != null ) c.state = { opened : s } else c.state = {};
@@ -102,11 +117,11 @@ class IconTree<T:{}> extends Component {
 						return false;
 					if( operation == "rename_node" ) {
 						if( node.text == value ) return true; // no change
-						return onRename(map.get(node.id).value, value);
+						return onRename(getVal(node.id), value);
 					}
 					if( operation == "move_node" ) {
 						if( extra.ref == null ) return true;
-						return onAllowMove(map.get(node.id).value, map.get(extra.ref.id).value);
+						return onAllowMove(getVal(node.id), getVal(extra.ref.id));
 					}
 					return false;
 				},
@@ -119,8 +134,8 @@ class IconTree<T:{}> extends Component {
 		element.on("click.jstree", function (event) {
 			var node = new Element(event.target).closest("li");
 			if(node == null || node.length == 0) return;
-   			var i = map.get(node[0].id);
-			onClick(i.value, event);
+   			var v = getVal(node[0].id);
+			onClick(v, event);
 		});
 		element.on("dblclick.jstree", function (event) {
 			// ignore dblclick on open/close arrow
@@ -129,26 +144,26 @@ class IconTree<T:{}> extends Component {
 
 			var node = new Element(event.target).closest("li");
 			if( node == null || node.length == 0 ) return;
-   			var i = map.get(node[0].id);
-			if(onDblClick(i.value))
+   			var v = getVal(node[0].id);
+			if(onDblClick(v))
 				return;
 			if( allowRename ) {
 				// ignore rename on icon
 				if( event.target.className.indexOf("jstree-icon") >= 0 )
 					return;
-				editNode(i.value);
+				editNode(v);
 				return;
 			}
 		});
 		element.on("open_node.jstree", function(event, e) {
 			var i = map.get(e.node.id);
 			saveDisplayState(i.absKey, true);
-			onToggle(i.value, true);
+			onToggle(getValue(i), true);
 		});
 		element.on("close_node.jstree", function(event,e) {
 			var i = map.get(e.node.id);
 			saveDisplayState(i.absKey, false);
-			onToggle(i.value, false);
+			onToggle(getValue(i), false);
 		});
 		element.on("refresh.jstree", function(_) {
 			var old = waitRefresh;
@@ -156,26 +171,26 @@ class IconTree<T:{}> extends Component {
 			for( f in old ) f();
 		});
 		element.on("move_node.jstree", function(event, e) {
-			onMove(map.get(e.node.id).value, e.parent == "#" ? null : map.get(e.parent).value, e.position);
+			onMove(getVal(e.node.id), e.parent == "#" ? null : getVal(e.parent), e.position);
 		});
 		element.on('ready.jstree', function () {
 			/* var lis = element.find("li");
 			for(li in lis) {
 				var item = map.get(li.id);
 				if(item != null)
-					applyStyle(item.value, new Element(li));
+					applyStyle(getValue(item), new Element(li));
 			} */
 		});
 		element.on('changed.jstree', function (e, data) {
 			var nodes: Array<Dynamic> = data.changed.deselected;
 			for(id in nodes) {
-				var item = map.get(id).value;
+				var item = getVal(id);
 				var el = getElement(item);
 				applyStyle(item, el);
 			}
 		});
 		element.on("rename_node.jstree", function(e, data) {
-			var item = map.get(data.node.id).value;
+			var item = getVal(data.node.id);
 			var el = getElement(item);
 			applyStyle(item, el);
 		});
@@ -184,7 +199,7 @@ class IconTree<T:{}> extends Component {
 			for(li in lis) {
 				var item = map.get(li.id);
 				if(item != null)
-					applyStyle(item.value, new Element(li));
+					applyStyle(getValue(item), new Element(li));
 			}
 		});
 	}
@@ -213,7 +228,7 @@ class IconTree<T:{}> extends Component {
 		if( id == null )
 			return null;
 		var i = map.get(id.substr(0, -7)); // remove _anchor
-		return i == null ? null : i.value;
+		return i == null ? null : getValue(i);
 	}
 
 	public function setSelection( objects : Array<T> ) {
@@ -229,13 +244,14 @@ class IconTree<T:{}> extends Component {
 		map = new Map();
 		revMap = new haxe.ds.ObjectMap();
 		revMapString = new haxe.ds.StringMap();
+		values = new Map();
 		if( onReady != null ) waitRefresh.push(onReady);
 		(element:Dynamic).jstree('refresh',true);
 	}
 
 	public function getSelection() : Array<T> {
 		var ids : Array<String> = (element:Dynamic).jstree('get_selected');
-		return [for( id in ids ) map.get(id).value];
+		return [for( id in ids ) getVal(id)];
 	}
 
 	public function collapseAll() {