@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
56 lines (51 loc) • 2.13 kB
text/typescript
import {ParamValuesTypeMap} from './types/ParamValuesTypeMap';
import {stringValueElements} from './../expressions/traversers/ParsedTree';
import {ParamEvent} from './../poly/ParamEvent';
import {TypedParam} from './_Base';
import {ParamType} from '../poly/ParamType';
import {ExpressionController} from './utils/ExpressionController';
export abstract class TypedStringParam<
T extends ParamType.STRING | ParamType.NODE_PATH | ParamType.PARAM_PATH
> extends TypedParam<T> {
protected abstract _assignValue(value: ParamValuesTypeMap[T] | string): void;
override expressionParsedAsString() {
return true;
}
protected override processRawInput() {
if (stringValueElements(this._raw_input).length >= 3) {
this._expression_controller = this._expression_controller || new ExpressionController(this);
if (this._raw_input != this._expression_controller.expression()) {
this.states.error.clear();
this._expression_controller.setExpression(this._raw_input, false);
this.setDirty();
this.emitController.emit(ParamEvent.EXPRESSION_UPDATED);
}
} else {
this.processRawInputWithoutExpression();
}
}
protected abstract processRawInputWithoutExpression(): void;
protected override async processComputation(): Promise<void> {
if (this.expressionController?.active() && !this.expressionController.entitiesDependent()) {
const expressionResult = await this.expressionController.computeExpression();
if (this.expressionController.isErrored()) {
this.states.error.set(
`expression error: "${this.expressionController.expression()}" (${this.expressionController.errorMessage()})`
);
} else {
const converted = this.convert(expressionResult);
// we need to check if equal nulls explicitely
// as the empty string '' evals to false...
if (converted != null) {
this.states.error.clear();
this._assignValue(converted);
this.emitController.emit(ParamEvent.VALUE_UPDATED);
this.options.executeCallback();
} else {
this.states.error.set(`expression returns an invalid type (${expressionResult})`);
}
this.removeDirtyState();
}
}
}
}