// Copyright Epic Games, Inc. All Rights Reserved. import type { SettingText, TextParametersIds } from '@epicgames-ps/lib-pixelstreamingfrontend-ue5.5'; import { SettingUIBase } from './SettingUIBase'; export class SettingUIText extends SettingUIBase { /* A text box that reflects the value of this setting. */ _textbox: HTMLInputElement; // input type="text" /* This element contains a text node that reflects the setting's text label. */ _settingsTextElem: HTMLElement; constructor(setting: SettingText) { super(setting); this.label = this.setting.label; this.text = this.setting.text; } /** * @returns The setting component. */ public override get setting(): SettingText { return this._setting as SettingText; } public get settingsTextElem(): HTMLElement { if (!this._settingsTextElem) { this._settingsTextElem = document.createElement('div'); this._settingsTextElem.innerText = this.setting.label; this._settingsTextElem.title = this.setting.description; } return this._settingsTextElem; } public get textbox(): HTMLInputElement { if (!this._textbox) { this._textbox = document.createElement('input'); this._textbox.classList.add('form-control'); this._textbox.type = 'textbox'; } return this._textbox; } /** * @returns Return or creates a HTML element that represents this setting in the DOM. */ public override get rootElement(): HTMLElement { if (!this._rootElement) { // create root div with "setting" css class this._rootElement = document.createElement('div'); this._rootElement.id = this.setting.id; this._rootElement.classList.add('setting'); // create div element to contain our setting's text this._rootElement.appendChild(this.settingsTextElem); // create label element to wrap out input type const wrapperLabel = document.createElement('label'); this._rootElement.appendChild(wrapperLabel); // create input type=checkbox this.textbox.title = this.setting.description; wrapperLabel.appendChild(this.textbox); // setup on change from checkbox this.textbox.addEventListener('input', (event) => { if (this.setting.text !== this.textbox.value) { this.setting.text = this.textbox.value; this.setting.updateURLParams(); } event.stopPropagation(); }); // Block keypress/up/down propogation from text field typing going to UE this.textbox.addEventListener('keypress', (event) => { event.stopPropagation(); }); this.textbox.addEventListener('keyup', (event) => { event.stopPropagation(); }); this.textbox.addEventListener('keydown', (event) => { event.stopPropagation(); }); } return this._rootElement; } /** * Update the setting's stored value. * @param inValue - The new value for the setting. */ public set text(inValue: string) { this.textbox.value = inValue; } /** * Get value */ public get text() { return this.textbox.value; } /** * Set the label text for the setting. * @param label - setting label. */ public set label(inLabel: string) { this.settingsTextElem.innerText = inLabel; } /** * Get label */ public get label() { return this.settingsTextElem.innerText; } public disable() { this.textbox.disabled = true; } public enable() { this.textbox.disabled = false; } }