230 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			230 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package lnx2d.tools;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Zui
							 | 
						||
| 
								 | 
							
								import zui.Zui;
							 | 
						||
| 
								 | 
							
								import leenkx.ui.Canvas;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class CanvasTools {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function makeElem(cui:Zui, canvas:TCanvas, type:ElementType) {
							 | 
						||
| 
								 | 
							
										var name = "";
							 | 
						||
| 
								 | 
							
										var height = cui.t.ELEMENT_H;
							 | 
						||
| 
								 | 
							
										var alignment = Align.Left;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										switch (type) {
							 | 
						||
| 
								 | 
							
										case ElementType.Text:
							 | 
						||
| 
								 | 
							
											name = unique("Text", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.Button:
							 | 
						||
| 
								 | 
							
											name = unique("Button", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
											alignment = Align.Center;
							 | 
						||
| 
								 | 
							
										case ElementType.Image:
							 | 
						||
| 
								 | 
							
											name = unique("Image", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
											height = 100;
							 | 
						||
| 
								 | 
							
										case ElementType.FRectangle:
							 | 
						||
| 
								 | 
							
											name = unique("Filled_Rectangle", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
											height = 100;
							 | 
						||
| 
								 | 
							
										case ElementType.FCircle:
							 | 
						||
| 
								 | 
							
											name = unique("Filled_Circle", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.Rectangle:
							 | 
						||
| 
								 | 
							
											name = unique("Rectangle", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
											height = 100;
							 | 
						||
| 
								 | 
							
										case ElementType.FTriangle:
							 | 
						||
| 
								 | 
							
											name = unique("Filled_Triangle", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.Triangle:
							 | 
						||
| 
								 | 
							
											name = unique("Triangle", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.Circle:
							 | 
						||
| 
								 | 
							
											name = unique("Circle", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.Check:
							 | 
						||
| 
								 | 
							
											name = unique("Check", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.Radio:
							 | 
						||
| 
								 | 
							
											name = unique("Radio", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.Combo:
							 | 
						||
| 
								 | 
							
											name = unique("Combo", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.Slider:
							 | 
						||
| 
								 | 
							
											name = unique("Slider", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
											alignment = Align.Right;
							 | 
						||
| 
								 | 
							
										case ElementType.TextInput:
							 | 
						||
| 
								 | 
							
											name = unique("TextInput", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.KeyInput:
							 | 
						||
| 
								 | 
							
											name = unique("KeyInput", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.TextArea:
							 | 
						||
| 
								 | 
							
											name = unique("TextArea", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.ProgressBar:
							 | 
						||
| 
								 | 
							
											name = unique("Progress_bar", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.CProgressBar:
							 | 
						||
| 
								 | 
							
											name = unique("CProgress_bar", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
										case ElementType.Empty:
							 | 
						||
| 
								 | 
							
											name = unique("Empty", canvas.elements, "name");
							 | 
						||
| 
								 | 
							
											height = 100;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										var elem:TElement = {
							 | 
						||
| 
								 | 
							
											id: Canvas.getElementId(canvas),
							 | 
						||
| 
								 | 
							
											type: type,
							 | 
						||
| 
								 | 
							
											name: name,
							 | 
						||
| 
								 | 
							
											event: "",
							 | 
						||
| 
								 | 
							
											x: 0,
							 | 
						||
| 
								 | 
							
											y: 0,
							 | 
						||
| 
								 | 
							
											width: 150,
							 | 
						||
| 
								 | 
							
											height: height,
							 | 
						||
| 
								 | 
							
											rotation: 0,
							 | 
						||
| 
								 | 
							
											text: "My " + name,
							 | 
						||
| 
								 | 
							
											asset: "",
							 | 
						||
| 
								 | 
							
											progress_at: 0,
							 | 
						||
| 
								 | 
							
											progress_total: 100,
							 | 
						||
| 
								 | 
							
											strength: 1,
							 | 
						||
| 
								 | 
							
											alignment: cast(alignment, Int),
							 | 
						||
| 
								 | 
							
											anchor: 0,
							 | 
						||
| 
								 | 
							
											parent: null,
							 | 
						||
| 
								 | 
							
											children: [],
							 | 
						||
| 
								 | 
							
											visible: true
							 | 
						||
| 
								 | 
							
										};
							 | 
						||
| 
								 | 
							
										canvas.elements.push(elem);
							 | 
						||
| 
								 | 
							
										return elem;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Generates a unique string for a given array based on the string s.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param s The string that is returned in a unique form
							 | 
						||
| 
								 | 
							
									 * @param data The array where the string should be unique
							 | 
						||
| 
								 | 
							
									 * @param elemAttr The name of the attribute of the data elements to be compared with the string.
							 | 
						||
| 
								 | 
							
									 * @param counter=-1 Internal use only, do not overwrite!
							 | 
						||
| 
								 | 
							
									 * @return String A unique string in the given array
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									 //TODO: Here
							 | 
						||
| 
								 | 
							
									public static function unique(s:String, data:Array<Dynamic>, elemAttr:String, counter=-1): String {
							 | 
						||
| 
								 | 
							
										var originalName = s;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Reconstruct the original name
							 | 
						||
| 
								 | 
							
										var split = s.lastIndexOf(".");
							 | 
						||
| 
								 | 
							
										if (split != -1) {
							 | 
						||
| 
								 | 
							
											// .001, .002...
							 | 
						||
| 
								 | 
							
											var suffix = s.substring(split);
							 | 
						||
| 
								 | 
							
											if (suffix.length == 4) {
							 | 
						||
| 
								 | 
							
												originalName = s.substring(0, split);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (elem in data) {
							 | 
						||
| 
								 | 
							
											if (Reflect.getProperty(elem, elemAttr) == s) {
							 | 
						||
| 
								 | 
							
												if (counter > -1) {
							 | 
						||
| 
								 | 
							
													counter++;
							 | 
						||
| 
								 | 
							
													var counterLen = Std.string(counter).length;
							 | 
						||
| 
								 | 
							
													if (counterLen > 3) counterLen = 3;
							 | 
						||
| 
								 | 
							
													var padding = ".";
							 | 
						||
| 
								 | 
							
													for (i in 0...3 - counterLen) {
							 | 
						||
| 
								 | 
							
														padding += "0";
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													return unique(originalName + padding + Std.string(counter), data, elemAttr, counter);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												} else {
							 | 
						||
| 
								 | 
							
													return unique(originalName, data, elemAttr, 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return s;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function moveElem(canvas:TCanvas, elem:TElement, d:Int) {
							 | 
						||
| 
								 | 
							
										var ar = canvas.elements;
							 | 
						||
| 
								 | 
							
										var i = ar.indexOf(elem);
							 | 
						||
| 
								 | 
							
										var p = elem.parent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										while (true) {
							 | 
						||
| 
								 | 
							
											i += d;
							 | 
						||
| 
								 | 
							
											if (i < 0 || i >= ar.length) break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if (ar[i].parent == p) {
							 | 
						||
| 
								 | 
							
												ar.remove(elem);
							 | 
						||
| 
								 | 
							
												ar.insert(i, elem);
							 | 
						||
| 
								 | 
							
												break;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function removeElem(canvas:TCanvas, elem:TElement) {
							 | 
						||
| 
								 | 
							
										if (elem.children != null) for (id in elem.children) removeElem(canvas, CanvasTools.elemById(canvas, id));
							 | 
						||
| 
								 | 
							
										canvas.elements.remove(elem);
							 | 
						||
| 
								 | 
							
										if (elem.parent != null) {
							 | 
						||
| 
								 | 
							
											CanvasTools.elemById(canvas, elem.parent).children.remove(elem.id);
							 | 
						||
| 
								 | 
							
											elem.parent = null;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function elemById(canvas: TCanvas, id: Int): TElement {
							 | 
						||
| 
								 | 
							
										for (e in canvas.elements) if (e.id == id) return e;
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function unparent(canvas:TCanvas, elem:TElement) {
							 | 
						||
| 
								 | 
							
										var parent = CanvasTools.elemById(canvas, elem.parent);
							 | 
						||
| 
								 | 
							
										if (parent != null) {
							 | 
						||
| 
								 | 
							
											elem.x += Math.absx(canvas, parent);
							 | 
						||
| 
								 | 
							
											elem.y += Math.absy(canvas, parent);
							 | 
						||
| 
								 | 
							
											elem.parent = null;
							 | 
						||
| 
								 | 
							
											parent.children.remove(elem.id);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function setParent(canvas:TCanvas, elem:TElement, parent:TElement) {
							 | 
						||
| 
								 | 
							
										var oldParent = CanvasTools.elemById(canvas, elem.parent);
							 | 
						||
| 
								 | 
							
										if (oldParent == parent) return;
							 | 
						||
| 
								 | 
							
										unparent(canvas, elem); //Unparent first if we already have a parent
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (parent != null) { //Parent
							 | 
						||
| 
								 | 
							
											if (parent.children == null) elem.children = [];
							 | 
						||
| 
								 | 
							
											parent.children.push(elem.id);
							 | 
						||
| 
								 | 
							
											elem.parent = parent.id;
							 | 
						||
| 
								 | 
							
											elem.x -= Math.absx(canvas, parent);
							 | 
						||
| 
								 | 
							
											elem.y -= Math.absy(canvas, parent);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function duplicateElem(canvas:TCanvas, elem:TElement, parentId:Null<Int> = null):TElement {
							 | 
						||
| 
								 | 
							
										if (elem != null) {
							 | 
						||
| 
								 | 
							
											if (parentId == null) parentId = elem.parent;
							 | 
						||
| 
								 | 
							
											var dupe:TElement = {
							 | 
						||
| 
								 | 
							
												id: Canvas.getElementId(canvas),
							 | 
						||
| 
								 | 
							
												type: elem.type,
							 | 
						||
| 
								 | 
							
												name: elem.name,
							 | 
						||
| 
								 | 
							
												event: elem.event,
							 | 
						||
| 
								 | 
							
												x: elem.x + 10,
							 | 
						||
| 
								 | 
							
												y: elem.y + 10,
							 | 
						||
| 
								 | 
							
												width: elem.width,
							 | 
						||
| 
								 | 
							
												height: elem.height,
							 | 
						||
| 
								 | 
							
												rotation: elem.rotation,
							 | 
						||
| 
								 | 
							
												text: elem.text,
							 | 
						||
| 
								 | 
							
												asset: elem.asset,
							 | 
						||
| 
								 | 
							
												color: elem.color,
							 | 
						||
| 
								 | 
							
												color_text: elem.color_text,
							 | 
						||
| 
								 | 
							
												color_hover: elem.color_hover,
							 | 
						||
| 
								 | 
							
												color_press: elem.color_press,
							 | 
						||
| 
								 | 
							
												color_progress: elem.color_progress,
							 | 
						||
| 
								 | 
							
												progress_at: elem.progress_at,
							 | 
						||
| 
								 | 
							
												progress_total: elem.progress_total,
							 | 
						||
| 
								 | 
							
												strength: elem.strength,
							 | 
						||
| 
								 | 
							
												anchor: elem.anchor,
							 | 
						||
| 
								 | 
							
												parent: parentId,
							 | 
						||
| 
								 | 
							
												children: [],
							 | 
						||
| 
								 | 
							
												visible: elem.visible
							 | 
						||
| 
								 | 
							
											};
							 | 
						||
| 
								 | 
							
											canvas.elements.push(dupe);
							 | 
						||
| 
								 | 
							
											if (parentId != null) {
							 | 
						||
| 
								 | 
							
												var parentElem = CanvasTools.elemById(canvas, parentId);
							 | 
						||
| 
								 | 
							
												parentElem.children.push(dupe.id);
							 | 
						||
| 
								 | 
							
												if (elem.parent != parentId) {
							 | 
						||
| 
								 | 
							
													dupe.x = elem.x;
							 | 
						||
| 
								 | 
							
													dupe.y = elem.y;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											for(child in elem.children) {
							 | 
						||
| 
								 | 
							
												duplicateElem(canvas, CanvasTools.elemById(canvas, child), dupe.id);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return dupe;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |