mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
281 lines
7.7 KiB
TypeScript
281 lines
7.7 KiB
TypeScript
namespace gdjs {
|
|
/** Base parameters for {@link gdjs.BBTextRuntimeObject} */
|
|
export type BBTextObjectDataType = {
|
|
/** The base parameters of the BBText */
|
|
content: {
|
|
/** The opacity of the BBText */
|
|
opacity: number;
|
|
/** Deprecated - Is the text visible? */
|
|
visible: boolean;
|
|
/** Content of the text */
|
|
text: string;
|
|
/** The color of the text */
|
|
color: string;
|
|
/** The font of the text */
|
|
fontFamily: string;
|
|
/** The size of the text */
|
|
fontSize: number;
|
|
/** Activate word wrap if set to true */
|
|
wordWrap: boolean;
|
|
/** Alignment of the text: "left", "center" or "right" */
|
|
align: 'left' | 'center' | 'right';
|
|
};
|
|
};
|
|
export type BBTextObjectData = ObjectData & BBTextObjectDataType;
|
|
|
|
/**
|
|
* Displays a rich text using BBCode markup (allowing to set parts of the text as bold, italic, use different colors and shadows).
|
|
*/
|
|
export class BBTextRuntimeObject extends gdjs.RuntimeObject {
|
|
_opacity: float;
|
|
|
|
_text: string;
|
|
|
|
/** color in format [r, g, b], where each component is in the range [0, 255] */
|
|
_color: integer[];
|
|
_fontFamily: string;
|
|
_fontSize: number;
|
|
|
|
_wordWrap: boolean;
|
|
_wrappingWidth: float = 250;
|
|
|
|
// This value is the default wrapping width of the runtime object.
|
|
_align: string;
|
|
_renderer: gdjs.BBTextRuntimeObjectRenderer;
|
|
|
|
// While this should rather be exposed as a property for all objects, honor the "visible"
|
|
// property that is specific to this object.
|
|
hidden: boolean;
|
|
|
|
/**
|
|
* @param runtimeScene The scene the object belongs to.
|
|
* @param objectData The object data used to initialize the object
|
|
*/
|
|
constructor(runtimeScene: gdjs.RuntimeScene, objectData: BBTextObjectData) {
|
|
super(runtimeScene, objectData);
|
|
// @ts-ignore - parseFloat should not be required, but GDevelop 5.0 beta 92 and below were storing it as a string.
|
|
this._opacity = parseFloat(objectData.content.opacity);
|
|
this._text = objectData.content.text;
|
|
this._color = gdjs.rgbOrHexToRGBColor(objectData.content.color);
|
|
this._fontFamily = objectData.content.fontFamily;
|
|
// @ts-ignore - parseFloat should not be required, but GDevelop 5.0 beta 92 and below were storing it as a string.
|
|
this._fontSize = parseFloat(objectData.content.fontSize);
|
|
this._wordWrap = objectData.content.wordWrap;
|
|
this._align = objectData.content.align;
|
|
this._renderer = new gdjs.BBTextRuntimeObjectRenderer(this, runtimeScene);
|
|
this.hidden = !objectData.content.visible;
|
|
|
|
// *ALWAYS* call `this.onCreated()` at the very end of your object constructor.
|
|
this.onCreated();
|
|
}
|
|
|
|
getRendererObject() {
|
|
return this._renderer.getRendererObject();
|
|
}
|
|
|
|
// @ts-ignore
|
|
updateFromObjectData(
|
|
oldObjectData: BBTextObjectDataType,
|
|
newObjectData: BBTextObjectDataType
|
|
): boolean {
|
|
if (oldObjectData.content.opacity !== newObjectData.content.opacity) {
|
|
this.setOpacity(newObjectData.content.opacity);
|
|
}
|
|
if (oldObjectData.content.visible !== newObjectData.content.visible) {
|
|
this.hide(!newObjectData.content.visible);
|
|
}
|
|
if (oldObjectData.content.text !== newObjectData.content.text) {
|
|
this.setBBText(newObjectData.content.text);
|
|
}
|
|
if (oldObjectData.content.color !== newObjectData.content.color) {
|
|
this._color = gdjs.rgbOrHexToRGBColor(newObjectData.content.color);
|
|
this._renderer.updateColor();
|
|
}
|
|
if (
|
|
oldObjectData.content.fontFamily !== newObjectData.content.fontFamily
|
|
) {
|
|
this.setFontFamily(newObjectData.content.fontFamily);
|
|
}
|
|
if (oldObjectData.content.fontSize !== newObjectData.content.fontSize) {
|
|
this.setFontSize(newObjectData.content.fontSize);
|
|
}
|
|
if (oldObjectData.content.wordWrap !== newObjectData.content.wordWrap) {
|
|
this.setWordWrap(newObjectData.content.wordWrap);
|
|
}
|
|
if (oldObjectData.content.align !== newObjectData.content.align) {
|
|
this.setAlignment(newObjectData.content.align);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Initialize the extra parameters that could be set for an instance.
|
|
*/
|
|
extraInitializationFromInitialInstance(initialInstanceData: InstanceData) {
|
|
if (initialInstanceData.customSize) {
|
|
this.setWrappingWidth(initialInstanceData.width);
|
|
} else {
|
|
this.setWrappingWidth(
|
|
// This value is the default wrapping width of the runtime object.
|
|
250
|
|
);
|
|
}
|
|
}
|
|
|
|
onDestroyFromScene(runtimeScene): void {
|
|
super.onDestroyFromScene(runtimeScene);
|
|
}
|
|
|
|
/**
|
|
* Set the markup text to display.
|
|
*/
|
|
setBBText(text): void {
|
|
this._text = text;
|
|
this._renderer.updateText();
|
|
}
|
|
|
|
/**
|
|
* Get the markup text displayed by the object.
|
|
*/
|
|
getBBText() {
|
|
return this._text;
|
|
}
|
|
|
|
setColor(rgbColorString): void {
|
|
this._color = gdjs.rgbOrHexToRGBColor(rgbColorString);
|
|
this._renderer.updateColor();
|
|
}
|
|
|
|
/**
|
|
* Get the base color.
|
|
* @return The color as a "R;G;B" string, for example: "255;0;0"
|
|
*/
|
|
getColor(): string {
|
|
return this._color[0] + ';' + this._color[1] + ';' + this._color[2];
|
|
}
|
|
|
|
setFontSize(fontSize): void {
|
|
this._fontSize = fontSize;
|
|
this._renderer.updateFontSize();
|
|
}
|
|
|
|
getFontSize() {
|
|
return this._fontSize;
|
|
}
|
|
|
|
setFontFamily(fontFamily): void {
|
|
this._fontFamily = fontFamily;
|
|
this._renderer.updateFontFamily();
|
|
}
|
|
|
|
getFontFamily() {
|
|
return this._fontFamily;
|
|
}
|
|
|
|
setAlignment(align): void {
|
|
this._align = align;
|
|
this._renderer.updateAlignment();
|
|
}
|
|
|
|
getAlignment() {
|
|
return this._align;
|
|
}
|
|
|
|
/**
|
|
* Set object position on X axis.
|
|
* @param x The new position X of the object.
|
|
*/
|
|
setX(x: float): void {
|
|
super.setX(x);
|
|
this._renderer.updatePosition();
|
|
}
|
|
|
|
/**
|
|
* Set object position on Y axis.
|
|
* @param y The new position Y of the object.
|
|
*/
|
|
setY(y: float): void {
|
|
super.setY(y);
|
|
this._renderer.updatePosition();
|
|
}
|
|
|
|
/**
|
|
* Set the angle of the object.
|
|
* @param angle The new angle of the object.
|
|
*/
|
|
setAngle(angle: float): void {
|
|
super.setAngle(angle);
|
|
this._renderer.updateAngle();
|
|
}
|
|
|
|
/**
|
|
* Set object opacity.
|
|
* @param opacity The new opacity of the object (0-255).
|
|
*/
|
|
setOpacity(opacity: float): void {
|
|
if (opacity < 0) {
|
|
opacity = 0;
|
|
}
|
|
if (opacity > 255) {
|
|
opacity = 255;
|
|
}
|
|
this._opacity = opacity;
|
|
this._renderer.updateOpacity();
|
|
}
|
|
|
|
/**
|
|
* Get object opacity.
|
|
*/
|
|
getOpacity() {
|
|
return this._opacity;
|
|
}
|
|
|
|
/**
|
|
* Set the width.
|
|
* @param width The new width in pixels.
|
|
*/
|
|
setWrappingWidth(width: float): void {
|
|
if (this._wrappingWidth === width) return;
|
|
|
|
this._wrappingWidth = width;
|
|
this._renderer.updateWrappingWidth();
|
|
this.hitBoxesDirty = true;
|
|
}
|
|
|
|
/**
|
|
* Get the wrapping width of the object.
|
|
*/
|
|
getWrappingWidth(): float {
|
|
return this._wrappingWidth;
|
|
}
|
|
|
|
setWordWrap(wordWrap: boolean): void {
|
|
if (this._wordWrap === wordWrap) return;
|
|
|
|
this._wordWrap = wordWrap;
|
|
this._renderer.updateWordWrap();
|
|
this.hitBoxesDirty = true;
|
|
}
|
|
|
|
getWordWrap() {
|
|
return this._wordWrap;
|
|
}
|
|
|
|
/**
|
|
* Get the width of the object.
|
|
*/
|
|
getWidth(): float {
|
|
return this._renderer.getWidth();
|
|
}
|
|
|
|
/**
|
|
* Get the height of the object.
|
|
*/
|
|
getHeight(): float {
|
|
return this._renderer.getHeight();
|
|
}
|
|
}
|
|
// @ts-ignore
|
|
gdjs.registerObject('BBText::BBText', gdjs.BBTextRuntimeObject);
|
|
}
|