230 lines
6.3 KiB
Haxe
Raw Normal View History

2025-01-22 16:18:30 +01:00
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;
}
}