From de5323b7e77ebbaa2784997337d6372ba43811b5 Mon Sep 17 00:00:00 2001 From: Geequlim Date: Thu, 25 Jun 2020 11:16:37 +0800 Subject: [PATCH] TypeScript decorators can used for pure property members now --- README.md | 11 +++++++---- misc/decorators.ts | 23 ++++++++++++----------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 02163211..cc3ecd2a 100644 --- a/README.md +++ b/README.md @@ -167,6 +167,10 @@ export default class InputLine extends godot.HBoxContainer { static readonly Signal = Signal; + // register offset property to godot inspector with default value Vector2(0, 0) + @property(godot.Vector2.ZERO) + offset: Vector2; + // register properties for godot editor inspector @property("Title") get title() { return this._title; } @@ -189,13 +193,12 @@ export default class InputLine extends godot.HBoxContainer { } private _hint: string; - - get label(): godot.Label { return this.label; } + get label(): godot.Label { return this._label; } protected _label: godot.Label; - // call get_node('LineEdit') and assign the returen value to 'edit' automatically when the node is ready + // call get_node('LineEdit') and assign the returen value to 'this.edit' automatically when the node is ready @onready('LineEdit') - get edit(): godot.LineEdit { return null; } + edit: godot.LineEdit; get text(): string { return this.edit?.text; diff --git a/misc/decorators.ts b/misc/decorators.ts index 72dac8e0..4b458203 100644 --- a/misc/decorators.ts +++ b/misc/decorators.ts @@ -23,10 +23,7 @@ export function signal(name: string) { */ export function signals(signals: {[key: string]: any} | string[]) { return function (target: new() => T) { - let keys: string[] = []; - if (!Array.isArray) { - keys = Object.getOwnPropertyNames(signals); - } + let keys: string[] = Array.isArray(signals) ? signals : Object.getOwnPropertyNames(signals); for (const signal of keys) { godot.register_signal(target, signal); } @@ -38,7 +35,7 @@ export function signals(signals: {[key: string]: any} | * @param value The default value of the property */ export function property(value) { - return function (target: T, property: string, descriptor) { + return function (target: T, property: string, descriptor?: any) { godot.register_property(target, property, value); return descriptor; } @@ -50,7 +47,7 @@ export function property(value) { * @param default_value The default value of the property */ export function enum_property(enumeration: string[], default_value?: string|number) { - return function (target: T, property: string, descriptor) { + return function (target: T, property: string, descriptor?: any) { const pi: godot.PropertyInfo = { hint: godot.PropertyHint.PROPERTY_HINT_ENUM, type: typeof(default_value) === 'string' ? godot.TYPE_STRING : godot.TYPE_INT, @@ -73,13 +70,17 @@ export function enum_property(enumeration: string[], def * @param path The path or the type to get the node */ export function onready(path: string | (new()=>godot.Node)) { - return function (target: T, property: string, descriptor) { + return function (target: T, property: string, descriptor?: any) { + const key = `__on_ready_value:${property}`; + descriptor = descriptor || {}; + descriptor.set = function(v) { this[key] = v; }; descriptor.get = function() { - const key = `__on_ready_value:${property}`; - if (!this[key]) { - this[key] = (this as godot.Node).get_node(path as (new()=>godot.Node)); + let v = this[key]; + if (!v) { + v = (this as godot.Node).get_node(path as (new()=>godot.Node)); + this[key] = v; } - return this[key]; + return v; }; return descriptor; }