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;
 | 
						|
	}
 | 
						|
}
 |