blockbench/js/property.js
JannisX11 fa98a3f28d Fix OBJ export of rotated cube faces
Rename mesh "Line" to "Edge"
Fix dialog title offset in text prompt dialog
Fix plugin install registration not working in web app
Fix modded entity models not exporting after conversion, closes #1124
2021-10-22 15:07:01 +02:00

122 lines
3.7 KiB
JavaScript

class Property {
constructor(target_class, type = 'boolean', name, options = 0) {
if (!target_class.properties) {
target_class.properties = {};
}
target_class.properties[name] = this;
this.class = target_class;
this.name = name;
this.type = type;
if (options.default != undefined) {
this.default = options.default;
} else {
switch (this.type) {
case 'string': this.default = ''; break;
case 'molang': this.default = '0'; break;
case 'number': this.default = 0; break;
case 'boolean': this.default = false; break;
case 'array': this.default = []; break;
case 'instance': this.default = null; break;
case 'vector': this.default = [0, 0, 0]; break;
case 'vector2': this.default = [0, 0]; break;
}
}
switch (this.type) {
case 'string': this.isString = true; break;
case 'molang': this.isMolang = true; break;
case 'number': this.isNumber = true; break;
case 'boolean': this.isBoolean = true; break;
case 'array': this.isArray = true; break;
case 'instance': this.isInstance = true; break;
case 'vector': this.isVector = true; break;
case 'vector2': this.isVector2 = true; break;
}
if (this.isMolang) {
Object.defineProperty(target_class.prototype, `${name}_string`, {
get() {
return typeof this[name] == 'number' ? trimFloatNumber(this[name]) || '0' : this[name];
},
set(val) {
this[name] = val;
}
})
}
if (typeof options.merge == 'function') this.merge = options.merge;
if (typeof options.reset == 'function') this.reset = options.reset;
if (typeof options.merge_validation == 'function') this.merge_validation = options.merge_validation;
if (options.condition) this.condition = options.condition;
if (options.exposed == false) this.exposed = false;
if (options.export == false) this.export = false;
if (options.label) this.label = options.label;
if (options.description) this.description = options.description;
if (options.options) this.options = options.options;
}
delete() {
delete this.class.properties[this.name];
}
getDefault(instance) {
if (typeof this.default == 'function') {
return this.default(instance);
} else {
return this.default;
}
}
merge(instance, data) {
if (data[this.name] == undefined || !Condition(this.condition, instance)) return;
if (this.isString) {
Merge.string(instance, data, this.name, this.merge_validation)
}
else if (this.isNumber) {
Merge.number(instance, data, this.name)
}
else if (this.isMolang) {
Merge.molang(instance, data, this.name)
}
else if (this.isBoolean) {
Merge.boolean(instance, data, this.name, this.merge_validation)
}
else if (this.isArray || this.isVector || this.isVector2) {
if (data[this.name] instanceof Array) {
if (instance[this.name] instanceof Array == false) {
instance[this.name] = [];
}
instance[this.name].replace(data[this.name]);
}
}
else if (this.isInstance) {
if (typeof data[this.name] === 'object') {
instance[this.name] =data[this.name];
}
}
}
copy(instance, target) {
if (!Condition(this.condition, instance)) return;
if (this.isArray || this.isVector || this.isVector2) {
if (instance[this.name] instanceof Array) {
target[this.name] = instance[this.name].slice();
}
} else {
target[this.name] = instance[this.name];
}
}
reset(instance, force) {
if (instance[this.name] == undefined && !Condition(this.condition, instance) && !force) return;
var dft = this.getDefault(instance)
if (this.isArray || this.isVector || this.isVector2) {
if (instance[this.name] instanceof Array == false) {
instance[this.name] = [];
}
instance[this.name].replace(dft || []);
} else {
instance[this.name] = dft;
}
}
}