diff --git a/samples/01-view/src/ViewExample.hx b/samples/01-view/src/ViewExample.hx index a99fb27..1f4122e 100755 --- a/samples/01-view/src/ViewExample.hx +++ b/samples/01-view/src/ViewExample.hx @@ -21,6 +21,14 @@ class FormView extends VGroupView { trace("init"); list.data = [for (i in 0...100) StringTools.hex(Math.floor(Math.random() * 1e9))]; } + + private function onPress(view:ButtonView):Void { + trace('onPress: ${view.id}'); + } + + private function onItemSelect(item:IListItemView):Void { + trace('onItemSelect: ${item.data}'); + } } class ViewExample { @@ -36,17 +44,5 @@ class ViewExample { trace(form.button1); trace(form.button2); trace(form.button3); - form.button1.onPress.connect(onPress); - form.button2.onPress.connect(onPress); - form.button3.onPress.connect(onPress); - form.list.onItemSelect.connect(onItemSelect); - } - - private function onPress(view:ButtonView):Void { - trace('onPress: ${view.id}'); - } - - private function onItemSelect(item:IListItemView):Void { - trace('onItemSelect: ${item.data}'); } } diff --git a/samples/01-view/src/form.yaml b/samples/01-view/src/form.yaml index 1b6aaca..ef568a0 100644 --- a/samples/01-view/src/form.yaml +++ b/samples/01-view/src/form.yaml @@ -2,30 +2,27 @@ $type: haxework.gui.VGroupView paddings: 20 layoutMargin: 10 -# skin: -# $type: haxework.gui.skin.ColorSkin -# color: 0xff0000 +skin: [ $type: [haxework.gui.skin.Skin.color, 0xff0000] ] views: - id: list $type: haxework.gui.list.VListView - factory: $class:haxework.gui.list.LabelListItem + +onItemSelect: $this:onItemSelect + factory: { $class: haxework.gui.list.LabelListItem } pWidth: 100 pHeight: 100 - leftMargin: 5 - rightMargin: 10 scroll: $type: haxework.gui.list.VScrollView width: 10 pHeight: 100 - skin: [ "$class:haxework.gui.list.ScrollSkin.vertical(0xcccccc,0x555555)" ] - skin: [$class:haxework.gui.skin.Skin.color(0xffffff)] + skin: [ $type: [haxework.gui.list.ScrollSkin.vertical, 0xcffcc, 0x55cc55] ] + skin: [ $type: [haxework.gui.skin.Skin.color, 0xffffff] ] - $type: haxework.gui.SpriteView vAlign: BOTTOM width: 50 height: 50 leftMargin: 5 rightMargin: 10 - skin: [$class:haxework.gui.skin.Skin.color(0x0000ff)] + skin: [ $type: [haxework.gui.skin.Skin.color, 0x0000ff] ] - id: panel $type: haxework.gui.HGroupView layoutHAlign: RIGHT @@ -33,32 +30,28 @@ views: height: 30 paddings: 3 layoutMargin: 3 - skin: [$class:haxework.gui.skin.Skin.color(0xffff00)] + skin: [ $type: [haxework.gui.skin.Skin.color, 0xffff00] ] views: - id: button1 $type: haxework.gui.ButtonView + +onPress: $this:onPress width: 100 pHeight: 100 - skin: [$class:haxework.gui.skin.ButtonSkin.color(0xcc0000)] - # skin: - # $type: haxework.gui.skin.ButtonColorSkin - # color: 0xcc0000 + skin: [ $type: [haxework.gui.skin.ButtonSkin.color, 0xcc0000] ] text: Text1 - id: button2 $type: haxework.gui.ButtonView + +onPress: $this:onPress contentSize: true - # skin: - # $type: haxework.gui.skin.ButtonColorSkin - # color: 0x00cc00 + skin: [ $type: [haxework.gui.skin.ButtonSkin.color, 0x00cc00] ] text: Text2 fontFamily: Georgia fontColor: 0xffffff - id: button3 $type: haxework.gui.ButtonView + +onPress: $this:onPress contentSize: true - # skin: - # $type: haxework.gui.skin.ButtonColorSkin - # color: 0x00cccc + skin: [ $type: [haxework.gui.skin.ButtonSkin.color, 0x00cccc] ] text: Text 3333333333 ddd fontFamily: Tahoma fontColor: 0xff0000 diff --git a/samples/02-loader/run.sh b/samples/02-loader/run.sh index a3aa04a..438d349 100644 --- a/samples/02-loader/run.sh +++ b/samples/02-loader/run.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash +echo "`pwd`/target" > ~/.macromedia/Flash_Player/#Security/FlashPlayerTrust/haxework_test.cfg . /opt/sdk/haxe/3.4.7/activate haxe build.hxml && flashplayerdebugger target/LoaderExample.swf diff --git a/src/main/haxework/macro/ProvideMacro.hx b/src/main/haxework/macro/ProvideMacro.hx index db77612..9f426b7 100644 --- a/src/main/haxework/macro/ProvideMacro.hx +++ b/src/main/haxework/macro/ProvideMacro.hx @@ -7,10 +7,7 @@ import haxe.macro.Expr; class ProvideMacro { public static function has(field:Field):Bool { - for (md in field.meta) if (md.name == ":provide") { - return true; - } - return false; + return Util.hasFieldMeta(":provide", field); } diff --git a/src/main/haxework/macro/StyleMacro.hx b/src/main/haxework/macro/StyleMacro.hx index cb40918..fc01124 100644 --- a/src/main/haxework/macro/StyleMacro.hx +++ b/src/main/haxework/macro/StyleMacro.hx @@ -9,10 +9,7 @@ class StyleMacro { private static inline var metaName:String = ':style'; public static function has(classType:ClassType):Bool { - for (md in classType.meta.get()) if (md.name == metaName) { - return true; - } - return false; + return Util.hasClassMeta(metaName, classType); } public static var style:Dynamic; diff --git a/src/main/haxework/macro/TemplateMacro.hx b/src/main/haxework/macro/TemplateMacro.hx index 55e23fe..2e5c550 100644 --- a/src/main/haxework/macro/TemplateMacro.hx +++ b/src/main/haxework/macro/TemplateMacro.hx @@ -11,10 +11,7 @@ class TemplateMacro { private static inline var metaName:String = ':template'; public static function has(classType:ClassType):Bool { - for (md in classType.meta.get()) if (md.name == metaName) { - return true; - } - return false; + return Util.hasClassMeta(metaName, classType); } @@ -77,32 +74,30 @@ class TemplateMacro { case "asset": switch (a[1]) { case "image": - "openfl.Assets.getBitmapData(\"" + a[2] + "\")"; + 'openfl.Assets.getBitmapData("${a[2]}")'; case _: a[2]; } case "res": - var res = "haxework.provider.Provider.get(haxework.resources.IResources)." + a[1]; - var bindExpr = res + ".bind(\"" + a[2] + "\", " + name + ", \"" + key + "\")"; + var bindExpr = 'haxework.provider.Provider.get(haxework.resources.IResources).${a[1]}.bind("${[2]}", "${name}", "${key}")'; exprs.push(Context.parse(bindExpr, getPosition(position))); - //res + ".get(\"" + a[2] + "\")"; null; case "locale": - "new haxework.locale.LString(\"" + a[1] + "\")"; - case "class": + 'new haxework.locale.LString("${[1]}")'; + case "raw": a[1]; + case "this": + 'this.${a[1]}'; case "layout": var template = FileUtil.loadJsonFile(a[1]); return createValue(name, key, template, position, exprs); - case "link": - "(links == null) ? untyped this : Reflect.field(links, \"" + a[1] + "\")"; case _: - Context.error("Unsupported prefix \"" + a[0] + "\"", getPosition(position)); + Context.error('Unsupported prefix "${a[0]}"', getPosition(position)); } } - private static function getType(value:Dynamic, position:Position):String { - var type:String = getSpecField(value, "type"); + private static function getType(value:Dynamic, position:Position):Dynamic { + var type:Dynamic = getSpecField(value, "type"); if (type == null) { Context.error("Need @type field", position); } @@ -125,19 +120,26 @@ class TemplateMacro { } else if (Std.is(value, Float) || (Std.is(value, Bool))) { value; } else if (value != null) { - var type = getType(value, getPosition(position)); - if (type != null) { - var n = 'a${i++}'; - if (type == "Dynamic") { - //ToDo: - exprs.push(Context.parse("var " + n + " = cast {}", getPosition(position))); - } else { - exprs.push(Context.parse("var " + n + " = new " + type + "()", getPosition(position))); - } - createElement(n, value, exprs); - n; + var className:String = getSpecField(value, "class"); + if (className != null) { + className; } else { - null; + var type:Dynamic = getType(value, getPosition(position)); + if (type != null) { + var varName = 'a${i++}'; + if (Std.is(type, Array)) { + var args = cast(type,Array).slice(1).join(","); + exprs.push(Context.parse('var ${varName} = ${type[0]}(${args})', getPosition(position))); + } else if (type == "Dynamic") { + exprs.push(Context.parse('var ${varName} = cast {}', getPosition(position))); + } else { + exprs.push(Context.parse('var ${varName} = new ${type}()', getPosition(position))); + } + createElement(varName, value, exprs); + varName; + } else { + null; + } } } else { value; @@ -169,7 +171,11 @@ class TemplateMacro { var position = Reflect.field(data, "$" + key); var value = createValue(name, key, Reflect.field(data, key), position, exprs); if (value != null) { - exprs.push(Context.parse(name + "." + key + " = " + value, getPosition(position))); + if (key.charAt(0) == "+") { + exprs.push(Context.parse('${name}.${key.substr(1)}.connect(${value})', getPosition(position))); + } else { + exprs.push(Context.parse('${name}.${key} = ${value}', getPosition(position))); + } } } diff --git a/src/main/haxework/macro/Util.hx b/src/main/haxework/macro/Util.hx index 4b37f8c..0bcd427 100644 --- a/src/main/haxework/macro/Util.hx +++ b/src/main/haxework/macro/Util.hx @@ -1,5 +1,6 @@ package haxework.macro; +import haxe.macro.Type.ClassType; import haxe.macro.Expr; @@ -15,4 +16,18 @@ class Util { public inline static function DynamicType():ComplexType { return ComplexType.TPath({name:'Dynamic', pack:[], params:[]}); } -} \ No newline at end of file + + public static function hasClassMeta(metaName:String, classType:ClassType):Bool { + for (md in classType.meta.get()) if (md.name == metaName) { + return true; + } + return false; + } + + public static function hasFieldMeta(metaName:String, field:Field):Bool { + for (md in field.meta) if (md.name == metaName) { + return true; + } + return false; + } +}