2
0
Эх сурвалжийг харах

more cdb in hide work: base style

Nicolas Cannasse 7 жил өмнө
parent
commit
bdc6ef70ae
5 өөрчлөгдсөн 663 нэмэгдсэн , 220 устгасан
  1. 202 0
      bin/cdb.css
  2. 245 11
      bin/cdb.less
  3. 200 205
      hide/comp/CdbCell.hx
  4. 14 2
      hide/comp/CdbEditor.hx
  5. 2 2
      hide/view/CdbTable.hx

+ 202 - 0
bin/cdb.css

@@ -4,3 +4,205 @@
   border-collapse: collapse;
   border-spacing: 0;
 }
+.cdb .cdb-sheet th.start {
+  width: 30px;
+  border-left-color: #333;
+}
+.cdb .cdb-sheet td.start {
+  text-align: center;
+  cursor: pointer;
+  background-color: #333;
+  border-left: none;
+}
+.cdb .cdb-sheet tr.cursorLine td.start {
+  background-color: #444;
+}
+.cdb .cdb-sheet tr.head td.start {
+  cursor: nw-resize;
+}
+.cdb .cdb-sheet tr.separator {
+  background-color: #444;
+  height: 10px;
+}
+.cdb .cdb-sheet tr.separator td {
+  border-left: none;
+  padding-top: 6px;
+  color: #bbb;
+  font-weight: bold;
+  padding-left: 20px;
+}
+.cdb .cdb-sheet td {
+  padding: 2px 4px;
+  overflow: hidden;
+}
+.cdb .cdb-sheet td.cursor {
+  outline: 1px solid #555;
+}
+.cdb .cdb-sheet tr.cursorLine {
+  background-color: #EFF1F8;
+}
+.cdb .cdb-sheet tr.filtered {
+  display: none;
+}
+.cdb .cdb-sheet tr.clickable {
+  cursor: pointer;
+}
+.cdb .cdb-sheet tr.clickable:hover {
+  background-color: #f8f8f8;
+}
+.cdb .cdb-sheet tr.head,
+.cdb .cdb-sheet th {
+  font-weight: bold;
+  text-align: center;
+  border-bottom: 1px solid #666;
+  border-left: 1px solid #555;
+  background-color: #333;
+  color: #ddd;
+  width: auto;
+  white-space: nowrap;
+  overflow: hidden;
+}
+.cdb .cdb-sheet tr.head .display {
+  font-style: italic;
+}
+.cdb .cdb-sheet tr.selected,
+.cdb .cdb-sheet td.selected {
+  background-color: #EEE;
+}
+.cdb .cdb-sheet td {
+  user-select: none;
+  border-left: 1px solid #444;
+}
+.cdb .cdb-sheet tr {
+  border-bottom: 1px solid #333;
+}
+.cdb .cdb-sheet tr.list {
+  background-color: #CCC;
+  border-bottom: 0px;
+}
+.cdb .cdb-sheet tr.list tr.head {
+  color: #fff;
+  background-color: #777;
+  font-weight: normal;
+  height: 8px;
+}
+.cdb .cdb-sheet tr.list tr {
+  background-color: #EEE;
+  border-color: #E0E0E0;
+}
+.cdb .cdb-sheet tr.list input,
+.cdb .cdb-sheet tr.list select {
+  background-color: #EEE;
+}
+.cdb .cdb-sheet tr.list tr.selected,
+.cdb .cdb-sheet tr.list td.selected {
+  background-color: #DDD;
+}
+.cdb .cdb-sheet tr.list > td {
+  padding: 0;
+  padding-bottom: 5px;
+}
+.cdb .cdb-sheet th.t_tilepos {
+  width: 64px;
+}
+.cdb .cdb-sheet td.t_tilepos {
+  text-align: center;
+}
+.cdb .cdb-sheet th.t_bool,
+.cdb .cdb-sheet th.t_int,
+.cdb .cdb-sheet th.t_float {
+  width: 6%;
+}
+.cdb .cdb-sheet td.t_bool {
+  text-align: center;
+}
+.cdb .cdb-sheet td.t_bool.true {
+  color: #76AA09;
+  font-weight: bold;
+  font-size: inherit;
+}
+.cdb .cdb-sheet td.t_bool.false {
+  color: red;
+  font-weight: normal;
+  font-size: 75%;
+}
+.cdb .cdb-sheet .tile {
+  display: inline-block;
+  vertical-align: middle;
+  image-rendering: CSS("pixelated");
+}
+.cdb .cdb-sheet td.t_int,
+.cdb .cdb-sheet td.t_float {
+  text-align: center;
+}
+.cdb .cdb-sheet td.t_int input,
+.cdb .cdb-sheet td.t_float input {
+  text-align: center;
+}
+.cdb .cdb-sheet td.t_int.zero,
+.cdb .cdb-sheet td.t_float.zero {
+  color: #888;
+}
+.cdb .cdb-sheet td.t_list,
+.cdb .cdb-sheet td.t_properties {
+  white-space: nowrap;
+  cursor: pointer;
+}
+.cdb .cdb-sheet td.t_list img,
+.cdb .cdb-sheet td.t_properties img {
+  max-height: 32px;
+  max-width: 32px;
+}
+.cdb .cdb-sheet td.t_enum {
+  padding-left: 5px;
+}
+.cdb .cdb-sheet td.t_color {
+  text-align: center;
+}
+.cdb .cdb-sheet td.t_color .modal {
+  opacity: 0.;
+}
+.cdb .cdb-sheet td.t_color .color {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  border: 2px solid white;
+  outline: 1px solid black;
+}
+.cdb .cdb-sheet .flagValues {
+  position: absolute;
+  background-color: white;
+  width: 150px;
+  padding: 5px;
+  border: 1px solid #333;
+}
+.cdb .cdb-sheet .flagValues label {
+  display: block;
+  clear: both;
+  padding: 1px;
+}
+.cdb .cdb-sheet .flagValues label input {
+  float: right;
+}
+.cdb .cdb-sheet .flagValues label:hover {
+  background-color: #eee;
+}
+.cdb .cdb-sheet span.error {
+  color: #C44;
+}
+.cdb .cdb-sheet td.t_file .preview .previewContent {
+  display: none;
+  position: absolute;
+  background-color: #EEE;
+  border: 1px solid black;
+  padding: 5px;
+}
+.cdb .cdb-sheet td.t_file .preview .previewContent .label {
+  text-align: center;
+  margin-bottom: 5px;
+  background-color: white;
+  font-family: monospace;
+}
+.cdb .cdb-sheet td.t_file .preview:hover .previewContent {
+  display: block;
+}

+ 245 - 11
bin/cdb.less

@@ -1,11 +1,245 @@
-
-.cdb {
-
-	.cdb-sheet {
-		width : 100%;
-		table-layout:fixed;
-		border-collapse : collapse;
-		border-spacing : 0;
-	}
-
-}
+
+.cdb {
+
+	.cdb-sheet {
+
+		width : 100%;
+		table-layout:fixed;
+		border-collapse : collapse;
+		border-spacing : 0;
+
+		th.start {
+			width : 30px;
+			border-left-color : #333;
+		}
+		td.start {
+			text-align : center;
+			cursor : pointer;
+			background-color: #333;
+			border-left: none;
+		}
+		tr.cursorLine td.start {
+			background-color: #444;
+		}
+
+		tr.head td.start {
+			cursor : nw-resize;
+		}
+
+		tr.separator {
+			background-color : #444;
+			height : 10px;
+			td {
+//				border-top: 1px solid #99A6D2;
+				border-left: none;
+				padding-top: 6px;
+				color : #bbb;
+				font-weight : bold;
+				padding-left : 20px;
+			}
+		}
+
+		td {
+			padding : 2px 4px;
+			overflow : hidden;
+		}
+
+		td.cursor {
+			outline : 1px solid #555;
+		}
+
+		tr.cursorLine {
+			background-color: #EFF1F8;
+		}
+
+		tr.filtered {
+			display : none;
+		}
+
+		tr.clickable {
+			cursor : pointer;
+		}
+
+		tr.clickable:hover {
+			background-color : #f8f8f8;
+		}
+
+		tr.head, th {
+			font-weight: bold;
+			text-align: center;
+			border-bottom : 1px solid #666;
+			border-left: 1px solid #555;
+			background-color : #333;
+			color : #ddd;
+			width: auto;
+			white-space: nowrap;
+			overflow: hidden;
+		}
+
+		tr.head .display {
+			font-style : italic;
+		}
+
+		tr.selected, td.selected {
+			background-color : #EEE;
+		}
+
+		td {
+			user-select: none;
+			border-left : 1px solid #444;
+		}
+
+		tr {
+			border-bottom : 1px solid #333;
+		}
+
+		// ----- types -------
+
+		tr.list {
+			background-color : #CCC;
+			border-bottom : 0px;
+			tr.head {
+				color : #fff;
+				background-color : #777;
+				font-weight : normal;
+				height : 8px;
+			}
+			tr {
+				background-color : #EEE;
+				border-color : #E0E0E0;
+			}
+			input, select {
+				background-color : #EEE;
+			}
+
+			tr.selected, td.selected {
+				background-color : #DDD;
+			}
+
+			& > td {
+				padding : 0;
+				padding-bottom: 5px;
+			}
+		}
+
+
+		th.t_tilepos {
+			width: 64px;
+		}
+		td.t_tilepos {
+			text-align : center;
+		}
+
+		th.t_bool,
+		th.t_int,
+		th.t_float {
+			width: 6%;
+		}
+
+		td.t_bool {
+			text-align : center;
+		}
+		td.t_bool.true {
+			color: #76AA09;
+			font-weight: bold;
+			font-size: inherit;
+		}
+		td.t_bool.false {
+			color: red;
+			font-weight: normal;
+			font-size: 75%;
+		}
+
+		.tile {
+			display: inline-block;
+			vertical-align: middle;
+			image-rendering: CSS("pixelated");
+		}
+
+		td.t_int, td.t_float {
+			text-align : center;
+			input {
+				text-align : center;
+			}
+		}
+
+		td.t_int.zero, td.t_float.zero {
+			color: #888;
+		}
+
+		td.t_list, td.t_properties {
+			white-space: nowrap;
+			cursor : pointer;
+			img {
+				max-height: 32px;
+				max-width: 32px;
+			}
+		}
+
+		td.t_enum {
+			padding-left : 5px;
+		}
+
+		td.t_color {
+			text-align : center;
+			.modal {
+				opacity : 0.;
+			}
+			.color {
+				display : inline-block;
+				width : 20px;
+				height : 20px;
+				border : 2px solid white;
+				outline : 1px solid black;
+			}
+		}
+
+		.flagValues {
+			position : absolute;
+			background-color : white;
+			width : 150px;
+			padding : 5px;
+			border : 1px solid #333;
+			label {
+				display : block;
+				clear : both;
+				input {
+					float : right;
+				}
+				padding : 1px;
+			}
+			label:hover {
+				background-color : #eee;
+			}
+		}
+
+		span.error {
+			color : #C44;
+		}
+
+		td.t_file {
+			.preview {
+				.previewContent {
+					.label {
+						text-align : center;
+						margin-bottom : 5px;
+						background-color : white;
+						font-family : monospace;
+					}
+					display : none;
+					position : absolute;
+					background-color : #EEE;
+					border : 1px solid black;
+					padding : 5px;
+				}
+			}
+			.preview:hover {
+				.previewContent {
+					display : block;
+				}
+			}
+		}
+
+	}
+
+}

+ 200 - 205
hide/comp/CdbCell.hx

@@ -1,205 +1,200 @@
-package hide.comp;
-
-class CdbCell extends Component {
-
-	static var UID = 0;
-	static var typeNames = [for( t in Type.getEnumConstructs(cdb.Data.ColumnType) ) t.substr(1).toLowerCase()];
-
-	var table : CdbTable;
-	var col : cdb.Data.Column;
-	var obj : Dynamic;
-	public var value(default, set) : Dynamic;
-
-	public function new( root : Element, table : CdbTable, col : cdb.Data.Column, obj : Dynamic ) {
-		super(root);
-		this.table = table;
-		this.col = col;
-		this.obj = obj;
-		value = Reflect.field(obj, col.name);
-		root.addClass("t_" + typeNames[col.type.getIndex()]);
-		/*
-				v.data("index", cindex);
-				v.click(function(e) {
-					if( inTodo ) {
-						// nothing
-					} else if( e.shiftKey && cursor.s == sheet ) {
-						cursor.select = { x : cindex, y : index };
-						updateCursor();
-						e.stopImmediatePropagation();
-					} else
-						setCursor(sheet, cindex, index);
-					e.stopPropagation();
-				});
-
-				function set(val2:Dynamic) {
-					var old = val;
-					val = val2;
-					if( val == null )
-						Reflect.deleteField(obj, c.name);
-					else
-						Reflect.setField(obj, c.name, val);
-					html = valueHtml(c, val, sheet, obj);
-					v.html(html);
-					updateClasses(v, c, val);
-					//this.changed(sheet, c, index, old);
-					trace("CHANGED");
-				}
-
-				// TODO
-		*/
-	}
-
-	function set_value( v : Dynamic ) {
-		value = v;
-		refresh();
-		return v;
-	}
-
-	function refresh() {
-		var html = valueHtml(col, value, table.sheet, obj);
-		if( html == "&nbsp;" ) root.text(" ") else if( html.indexOf('<') < 0 && html.indexOf('&') < 0 ) root.text(html) else root.html(html);
-	}
-
-	public function valueHtml( c : cdb.Data.Column, v : Dynamic, sheet : cdb.Sheet, obj : Dynamic ) : String {
-		if( v == null ) {
-			if( c.opt )
-				return "&nbsp;";
-			return '<span class="error">#NULL</span>';
-		}
-		return switch( c.type ) {
-		case TInt, TFloat:
-			switch( c.display ) {
-			case Percent:
-				(Math.round(v * 10000)/100) + "%";
-			default:
-				v + "";
-			}
-		case TId:
-			v == "" ? '<span class="error">#MISSING</span>' : (table.base.getSheet(sheet.name).index.get(v).obj == obj ? v : '<span class="error">#DUP($v)</span>');
-		case TString, TLayer(_):
-			v == "" ? "&nbsp;" : StringTools.htmlEscape(v);
-		case TRef(sname):
-			if( v == "" )
-				'<span class="error">#MISSING</span>';
-			else {
-				var s = table.base.getSheet(sname);
-				var i = s.index.get(v);
-				i == null ? '<span class="error">#REF($v)</span>' : (i.ico == null ? "" : tileHtml(i.ico,true)+" ") + StringTools.htmlEscape(i.disp);
-			}
-		case TBool:
-			v?"Y":"N";
-		case TEnum(values):
-			values[v];
-		case TImage:
-			""; // deprecated
-		case TList:
-			var a : Array<Dynamic> = v;
-			var ps = sheet.getSub(c);
-			var out : Array<String> = [];
-			var size = 0;
-			for( v in a ) {
-				var vals = [];
-				for( c in ps.columns )
-					switch( c.type ) {
-					case TList, TProperties:
-						continue;
-					default:
-						vals.push(valueHtml(c, Reflect.field(v, c.name), ps, v));
-					}
-				var v = vals.length == 1 ? vals[0] : ""+vals;
-				if( size > 200 ) {
-					out.push("...");
-					break;
-				}
-				var vstr = v;
-				if( v.indexOf("<") >= 0 ) {
-					vstr = ~/<img src="[^"]+" style="display:none"[^>]+>/g.replace(vstr, "");
-					vstr = ~/<img src="[^"]+"\/>/g.replace(vstr, "[I]");
-					vstr = ~/<div id="[^>]+><\/div>/g.replace(vstr, "[D]");
-				}
-				size += vstr.length;
-				out.push(v);
-			}
-			if( out.length == 0 )
-				return "[]";
-			return out.join(", ");
-		case TProperties:
-			var ps = sheet.getSub(c);
-			var out = [];
-			for( c in ps.columns ) {
-				var pval = Reflect.field(v, c.name);
-				if( pval == null && c.opt ) continue;
-				out.push(c.name+" : "+valueHtml(c, pval, ps, v));
-			}
-			return out.join("<br/>");
-		case TCustom(name):
-			var t = table.base.getCustomType(name);
-			var a : Array<Dynamic> = v;
-			var cas = t.cases[a[0]];
-			var str = cas.name;
-			if( cas.args.length > 0 ) {
-				str += "(";
-				var out = [];
-				var pos = 1;
-				for( i in 1...a.length )
-					out.push(valueHtml(cas.args[i-1], a[i], sheet, this));
-				str += out.join(",");
-				str += ")";
-			}
-			str;
-		case TFlags(values):
-			var v : Int = v;
-			var flags = [];
-			for( i in 0...values.length )
-				if( v & (1 << i) != 0 )
-					flags.push(StringTools.htmlEscape(values[i]));
-			flags.length == 0 ? String.fromCharCode(0x2205) : flags.join("|<wbr>");
-		case TColor:
-			'<div class="color" style="background-color:#${StringTools.hex(v,6)}"></div>';
-		case TFile:
-			var path = ide.getPath(v);
-			var url = "file://" + path;
-			var ext = v.split(".").pop().toLowerCase();
-			var html = v == "" ? '<span class="error">#MISSING</span>' : StringTools.htmlEscape(v);
-			if( v != "" && !table.quickExists(path) )
-				html = '<span class="error">' + html + '</span>';
-			else if( ext == "png" || ext == "jpg" || ext == "jpeg" || ext == "gif" )
-				html = '<span class="preview">$html<div class="previewContent"><div class="label"></div><img src="$url" onload="$(this).parent().find(\'.label\').text(this.width+\'x\'+this.height)"/></div></span>';
-			if( v != "" )
-				html += ' <input type="submit" value="open" onclick="_.openFile(\'$path\')"/>';
-			html;
-		case TTilePos:
-			return tileHtml(v);
-		case TTileLayer:
-			var v : cdb.Types.TileLayer = v;
-			var path = ide.getPath(v.file);
-			if( !table.quickExists(path) )
-				'<span class="error">' + v.file + '</span>';
-			else
-				'#DATA';
-		case TDynamic:
-			var str = Std.string(v).split("\n").join(" ").split("\t").join("");
-			if( str.length > 50 ) str = str.substr(0, 47) + "...";
-			str;
-		}
-	}
-
-	function tileHtml( v : cdb.Types.TilePos, ?isInline ) {
-		var path = ide.getPath(v.file);
-		if( !table.quickExists(path) ) {
-			if( isInline ) return "";
-			return '<span class="error">' + v.file + '</span>';
-		}
-		var id = UID++;
-		var width = v.size * (v.width == null?1:v.width);
-		var height = v.size * (v.height == null?1:v.height);
-		var max = width > height ? width : height;
-		var zoom = max <= 32 ? 2 : 64 / max;
-		var inl = isInline ? 'display:inline-block;' : '';
-		var url = "file://" + path;
-		var html = '<div class="tile" id="_c${id}" style="width : ${Std.int(width * zoom)}px; height : ${Std.int(height * zoom)}px; background : url(\'$url\') -${Std.int(v.size*v.x*zoom)}px -${Std.int(v.size*v.y*zoom)}px; opacity:0; $inl"></div>';
-		html += '<img src="$url" style="display:none" onload="$(\'#_c$id\').css({opacity:1, backgroundSize : ((this.width*$zoom)|0)+\'px \' + ((this.height*$zoom)|0)+\'px\' '+(zoom > 1 ? ", imageRendering : 'pixelated'" : "") +'}); if( this.parentNode != null ) this.parentNode.removeChild(this)"/>';
-		return html;
-	}
-
-}
+package hide.comp;
+
+class CdbCell extends Component {
+
+	static var UID = 0;
+	static var typeNames = [for( t in Type.getEnumConstructs(cdb.Data.ColumnType) ) t.substr(1).toLowerCase()];
+
+	var editor : CdbEditor;
+	var col : cdb.Data.Column;
+	var obj : Dynamic;
+	var currentValue : Dynamic;
+	public var value(get, set) : Dynamic;
+
+	public function new( root : Element, editor : CdbEditor, col : cdb.Data.Column, obj : Dynamic ) {
+		super(root);
+		this.editor = editor;
+		this.col = col;
+		this.obj = obj;
+		currentValue = Reflect.field(obj, col.name);
+		root.addClass("t_" + typeNames[col.type.getIndex()]);
+		refresh();
+	}
+
+	function set_value( v : Dynamic ) {
+		var old = currentValue;
+		currentValue = v;
+		if( obj == null && v != currentValue ) {
+			if( v == null )
+				Reflect.deleteField(obj, col.name);
+			else
+				Reflect.setField(obj, col.name, v);
+			// TODO : history
+		}
+		refresh();
+		return v;
+	}
+
+	inline function get_value() return currentValue;
+
+	function refresh() {
+		var html = valueHtml(col, value, editor.sheet, obj);
+		if( html == "&nbsp;" ) root.text(" ") else if( html.indexOf('<') < 0 && html.indexOf('&') < 0 ) root.text(html) else root.html(html);
+		updateClasses();
+	}
+
+	function updateClasses() {
+		switch( col.type ) {
+		case TBool :
+			root.removeClass("true false").addClass( value==true ? "true" : "false" );
+		case TInt, TFloat :
+			root.removeClass("zero");
+			if( value == 0 ) root.addClass("zero");
+		default:
+		}
+	}
+
+	public function valueHtml( c : cdb.Data.Column, v : Dynamic, sheet : cdb.Sheet, obj : Dynamic ) : String {
+		if( v == null ) {
+			if( c.opt )
+				return "&nbsp;";
+			return '<span class="error">#NULL</span>';
+		}
+		return switch( c.type ) {
+		case TInt, TFloat:
+			switch( c.display ) {
+			case Percent:
+				(Math.round(v * 10000)/100) + "%";
+			default:
+				v + "";
+			}
+		case TId:
+			v == "" ? '<span class="error">#MISSING</span>' : (editor.base.getSheet(sheet.name).index.get(v).obj == obj ? v : '<span class="error">#DUP($v)</span>');
+		case TString, TLayer(_):
+			v == "" ? "&nbsp;" : StringTools.htmlEscape(v);
+		case TRef(sname):
+			if( v == "" )
+				'<span class="error">#MISSING</span>';
+			else {
+				var s = editor.base.getSheet(sname);
+				var i = s.index.get(v);
+				i == null ? '<span class="error">#REF($v)</span>' : (i.ico == null ? "" : tileHtml(i.ico,true)+" ") + StringTools.htmlEscape(i.disp);
+			}
+		case TBool:
+			v?"Y":"N";
+		case TEnum(values):
+			values[v];
+		case TImage:
+			'<span class="error">#DEPRECATED</span>';
+		case TList:
+			var a : Array<Dynamic> = v;
+			var ps = sheet.getSub(c);
+			var out : Array<String> = [];
+			var size = 0;
+			for( v in a ) {
+				var vals = [];
+				for( c in ps.columns )
+					switch( c.type ) {
+					case TList, TProperties:
+						continue;
+					default:
+						vals.push(valueHtml(c, Reflect.field(v, c.name), ps, v));
+					}
+				var v = vals.length == 1 ? vals[0] : ""+vals;
+				if( size > 200 ) {
+					out.push("...");
+					break;
+				}
+				var vstr = v;
+				if( v.indexOf("<") >= 0 ) {
+					vstr = ~/<img src="[^"]+" style="display:none"[^>]+>/g.replace(vstr, "");
+					vstr = ~/<img src="[^"]+"\/>/g.replace(vstr, "[I]");
+					vstr = ~/<div id="[^>]+><\/div>/g.replace(vstr, "[D]");
+				}
+				vstr = StringTools.trim(vstr);
+				size += vstr.length;
+				out.push(v);
+			}
+			if( out.length == 0 )
+				return "[]";
+			return out.join(", ");
+		case TProperties:
+			var ps = sheet.getSub(c);
+			var out = [];
+			for( c in ps.columns ) {
+				var pval = Reflect.field(v, c.name);
+				if( pval == null && c.opt ) continue;
+				out.push(c.name+" : "+valueHtml(c, pval, ps, v));
+			}
+			return out.join("<br/>");
+		case TCustom(name):
+			var t = editor.base.getCustomType(name);
+			var a : Array<Dynamic> = v;
+			var cas = t.cases[a[0]];
+			var str = cas.name;
+			if( cas.args.length > 0 ) {
+				str += "(";
+				var out = [];
+				var pos = 1;
+				for( i in 1...a.length )
+					out.push(valueHtml(cas.args[i-1], a[i], sheet, this));
+				str += out.join(",");
+				str += ")";
+			}
+			str;
+		case TFlags(values):
+			var v : Int = v;
+			var flags = [];
+			for( i in 0...values.length )
+				if( v & (1 << i) != 0 )
+					flags.push(StringTools.htmlEscape(values[i]));
+			flags.length == 0 ? String.fromCharCode(0x2205) : flags.join("|<wbr>");
+		case TColor:
+			'<div class="color" style="background-color:#${StringTools.hex(v,6)}"></div>';
+		case TFile:
+			var path = ide.getPath(v);
+			var url = "file://" + path;
+			var ext = v.split(".").pop().toLowerCase();
+			var html = v == "" ? '<span class="error">#MISSING</span>' : StringTools.htmlEscape(v);
+			if( v != "" && !editor.quickExists(path) )
+				html = '<span class="error">' + html + '</span>';
+			else if( ext == "png" || ext == "jpg" || ext == "jpeg" || ext == "gif" )
+				html = '<span class="preview">$html<div class="previewContent"><div class="label"></div><img src="$url" onload="$(this).parent().find(\'.label\').text(this.width+\'x\'+this.height)"/></div></span>';
+			if( v != "" )
+				html += ' <input type="submit" value="open" onclick="_.openFile(\'$path\')"/>';
+			html;
+		case TTilePos:
+			return tileHtml(v);
+		case TTileLayer:
+			var v : cdb.Types.TileLayer = v;
+			var path = ide.getPath(v.file);
+			if( !editor.quickExists(path) )
+				'<span class="error">' + v.file + '</span>';
+			else
+				'#DATA';
+		case TDynamic:
+			var str = Std.string(v).split("\n").join(" ").split("\t").join("");
+			if( str.length > 50 ) str = str.substr(0, 47) + "...";
+			str;
+		}
+	}
+
+	function tileHtml( v : cdb.Types.TilePos, ?isInline ) {
+		var path = ide.getPath(v.file);
+		if( !editor.quickExists(path) ) {
+			if( isInline ) return "";
+			return '<span class="error">' + v.file + '</span>';
+		}
+		var id = UID++;
+		var width = v.size * (v.width == null?1:v.width);
+		var height = v.size * (v.height == null?1:v.height);
+		var max = width > height ? width : height;
+		var zoom = max <= 32 ? 2 : 64 / max;
+		var inl = isInline ? 'display:inline-block;' : '';
+		var url = "file://" + path;
+		var html = '<div class="tile" id="_c${id}" style="width : ${Std.int(width * zoom)}px; height : ${Std.int(height * zoom)}px; background : url(\'$url\') -${Std.int(v.size*v.x*zoom)}px -${Std.int(v.size*v.y*zoom)}px; opacity:0; $inl"></div>';
+		html += '<img src="$url" style="display:none" onload="$(\'#_c$id\').css({opacity:1, backgroundSize : ((this.width*$zoom)|0)+\'px \' + ((this.height*$zoom)|0)+\'px\' '+(zoom > 1 ? ", imageRendering : 'pixelated'" : "") +'}); if( this.parentNode != null ) this.parentNode.removeChild(this)"/>';
+		return html;
+	}
+
+}

+ 14 - 2
hide/comp/CdbTable.hx → hide/comp/CdbEditor.hx

@@ -10,7 +10,7 @@ private typedef Cursor = {
 }
 
 @:allow(hide.comp.CdbCell)
-class CdbTable extends Component {
+class CdbEditor extends Component {
 
 	var base : cdb.Database;
 	var sheet : cdb.Sheet;
@@ -102,7 +102,16 @@ class CdbTable extends Component {
 				var v = J("<td>").addClass("c");
 				var l = lines[index];
 				v.appendTo(l);
-				new CdbCell(v, this, c, sheet.lines[index]);
+				var cell = new CdbCell(v, this, c, sheet.lines[index]);
+				switch( c.type ) {
+				case TList:
+					var key = sheet.getPath() + "@" + c.name + ":" + index;
+					cell.root.click(function(e) {
+						e.stopPropagation();
+						toggleList(cell);
+					});
+				default:
+				}
 			}
 		}
 
@@ -156,6 +165,9 @@ class CdbTable extends Component {
 		inTodo = false;
 	}
 
+	function toggleList( cell : CdbCell ) {
+	}
+
 	function quickExists(path) {
 		var c = existsCache.get(path);
 		if( c == null ) {

+ 2 - 2
hide/view/CdbTable.hx

@@ -3,7 +3,7 @@ package hide.view;
 class CdbTable extends hide.ui.View<{ path : String }> {
 
 	var sheet : cdb.Sheet;
-	var editor : hide.comp.CdbTable;
+	var editor : hide.comp.CdbEditor;
 
 	public function new(state) {
 		super(state);
@@ -20,7 +20,7 @@ class CdbTable extends hide.ui.View<{ path : String }> {
 			return;
 		}
 		root.addClass("hide-scroll");
-		editor = new hide.comp.CdbTable(root, sheet);
+		editor = new hide.comp.CdbEditor(root, sheet);
 	}
 
 	override function getTitle() {