// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import * as i18n from '../../../core/i18n/i18n.js'; import * as Platform from '../../../core/platform/platform.js'; import * as UI from '../../../ui/legacy/legacy.js'; import * as Lit from '../../../ui/lit/lit.js'; import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js'; import {ValueType, valueTypeToLocalizedString} from './ValueInterpreterDisplayUtils.js'; import valueInterpreterSettingsStyles from './valueInterpreterSettings.css.js'; const {render, html} = Lit; const UIStrings = { /** * @description Name of a group of selectable value types that do not fall under integer and floating point value types, e.g. Pointer32. The group appears name appears under the Value Interpreter Settings. */ otherGroup: 'Other', } as const; const str_ = i18n.i18n.registerUIStrings('panels/linear_memory_inspector/components/ValueInterpreterSettings.ts', UIStrings); const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_); const enum ValueTypeGroup { INTEGER = 'Integer', FLOAT = 'Floating point', OTHER = 'Other', } const GROUP_TO_TYPES = new Map( [ [ValueTypeGroup.INTEGER, [ValueType.INT8, ValueType.INT16, ValueType.INT32, ValueType.INT64]], [ValueTypeGroup.FLOAT, [ValueType.FLOAT32, ValueType.FLOAT64]], [ValueTypeGroup.OTHER, [ValueType.POINTER32, ValueType.POINTER64]], ], ); function valueTypeGroupToLocalizedString(group: ValueTypeGroup): string { if (group === ValueTypeGroup.OTHER) { return i18nString(UIStrings.otherGroup); } // The remaining group type names should not be localized. return group; } export interface ViewInput { valueTypes: Set; onToggle: (type: ValueType, checked: boolean) => void; } export const DEFAULT_VIEW = (input: ViewInput, _output: undefined, target: HTMLElement): void => { // clang-format off render(html`
${[...GROUP_TO_TYPES.keys()].map(group => { const types = GROUP_TO_TYPES.get(group) ?? []; return html`
${valueTypeGroupToLocalizedString(group)} ${types.map(type => { return html` { const checkbox = e.target as HTMLInputElement; input.onToggle(type, checkbox.checked); }} jslog=${VisualLogging.toggle().track({change: true}).context(Platform.StringUtilities.toKebabCase(type))} }>${valueTypeToLocalizedString(type)} `;})}
`;})}
`, target); }; // clang-format on export type View = typeof DEFAULT_VIEW; export class ValueInterpreterSettings extends UI.Widget.Widget { #view: View; #valueTypes = new Set(); #onToggle: (type: ValueType, checked: boolean) => void = () => {}; constructor(element?: HTMLElement, view = DEFAULT_VIEW) { super(element); this.#view = view; } get valueTypes(): Set { return this.#valueTypes; } set valueTypes(value: Set) { this.#valueTypes = value; this.requestUpdate(); } get onToggle(): (type: ValueType, checked: boolean) => void { return this.#onToggle; } set onToggle(value: (type: ValueType, checked: boolean) => void) { this.#onToggle = value; this.requestUpdate(); } override performUpdate(): void { const viewInput = { valueTypes: this.#valueTypes, onToggle: this.#onToggle, }; this.#view(viewInput, undefined, this.contentElement); } }