import { biGear } from '../styles/icons'; import { AutomatonComponent } from '../'; import { html } from 'lit'; import { SlChangeEvent, SlCheckbox, SlInput, SlSelect } from '@shoelace-style/shoelace'; import { live } from 'lit/directives/live.js'; import { msg } from '@lit/localize'; import { Logger } from '@u/logger'; export class Settings { constructor(private parentComponent: AutomatonComponent) { this.numberStringToPermissions(parentComponent.permissions); } private _permissions = { node: { add: true, delete: true, change: true, }, edge: { add: true, delete: true, change: true, }, stack: { add: true, delete: true, change: true, }, }; private set permissions(permissions: typeof this._permissions) { this._permissions = permissions; this.parentComponent.permissions = this.permissionsToNumberString(); } public get permissions() { return this._permissions; } render() { return html`

${biGear} ${msg("Settings")}


${msg("Add")} ${msg("Delete")} ${msg("Change")}
${msg("Node")} { const c = e.target as SlCheckbox; this.permissions = { ...this.permissions, node: { ...this.permissions.node, add: (e.target as SlCheckbox).checked }, }; c.checked = this.permissions.node.add; }} name="node-add" > { const c = e.target as SlCheckbox; this.permissions = { ...this.permissions, node: { ...this.permissions.node, delete: (e.target as SlCheckbox).checked }, }; c.checked = this.permissions.node.delete; }} name="node-delete" > { const c = e.target as SlCheckbox; this.permissions = { ...this.permissions, node: { ...this.permissions.node, change: (e.target as SlCheckbox).checked }, }; c.checked = this.permissions.node.change; }} name="node-change" >
${msg("Edge")} { const c = e.target as SlCheckbox; this.permissions = { ...this.permissions, edge: { ...this.permissions.edge, add: (e.target as SlCheckbox).checked }, }; c.checked = this.permissions.edge.add; }} name="edge-add" > { const c = e.target as SlCheckbox; this.permissions = { ...this.permissions, edge: { ...this.permissions.edge, delete: (e.target as SlCheckbox).checked }, }; c.checked = this.permissions.edge.delete; }} name="edge-delete" > { const c = e.target as SlCheckbox; this.permissions = { ...this.permissions, edge: { ...this.permissions.edge, change: (e.target as SlCheckbox).checked }, }; c.checked = this.permissions.edge.change; }} name="edge-change" >
${msg("Stack")} { const c = e.target as SlCheckbox; this.permissions = { ...this.permissions, stack: { ...this.permissions.stack, add: (e.target as SlCheckbox).checked }, }; c.checked = this.permissions.stack.add; }} name="stack-add" > { const c = e.target as SlCheckbox; this.permissions = { ...this.permissions, stack: { ...this.permissions.stack, delete: (e.target as SlCheckbox).checked }, }; c.checked = this.permissions.stack.delete; }} name="stack-delete" > { const c = e.target as SlCheckbox; this.permissions = { ...this.permissions, stack: { ...this.permissions.stack, change: (e.target as SlCheckbox).checked }, }; c.checked = this.permissions.stack.change; }} name="stack-change" >
{ this.parentComponent.allowedTypes = (e.target as SlSelect).value as string[]; this.parentComponent.requestUpdate(); }} name="automatonTypes" > ${msg("NFA")} ${msg("DFA")} ${msg("PDA")} { this.parentComponent.allowedTransformations = (e.target as SlSelect).value as string[]; this.parentComponent.requestUpdate(); }} name="transformations" > ${msg("Sinkstate")}
{ this.parentComponent.allowedModes = (e.target as SlSelect).value as string[]; this.parentComponent.requestUpdate(); }} name="modes" > ${msg("Edit")} ${msg("Simulate")} { this.parentComponent.showHelp = (e.target as SlCheckbox).checked ? 'true' : 'false'; this.parentComponent.automaton.showErrors = (e.target as SlCheckbox).checked; this.parentComponent.requestUpdate(); }} name="showHelp" >${msg("Show Help")} { this.parentComponent.showFormalDefinition = (e.target as SlCheckbox).checked ? 'true' : 'false'; this.parentComponent.requestUpdate(); }} name="showFormalDefinition" >${msg("Show Formal Definition")} { this.parentComponent.showTransitionsTable = (e.target as SlCheckbox).checked ? 'true' : 'false'; this.parentComponent.requestUpdate(); }} name="showTransitionsTable" >${msg("Show Transitions Table")} a, X|aX { this.parentComponent.testLanguage = (e.target as SlInput).value; this.parentComponent.requestUpdate(); }} autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" > { if ((e.target as SlInput).value === '') { this.parentComponent.testWords = []; this.parentComponent.requestUpdate(); return; } this.parentComponent.testWords = (e.target as SlInput).value.split(','); this.parentComponent.requestUpdate(); }} autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" > { if ((e.target as SlInput).value === '') { this.parentComponent.forcedAlphabet = []; this.parentComponent.requestUpdate(); return; } this.parentComponent.forcedAlphabet = (e.target as SlInput).value.split(',').filter((x) => x.length === 1); // remove duplicates this.parentComponent.forcedAlphabet = [...new Set(this.parentComponent.forcedAlphabet)]; this.parentComponent.requestUpdate(); }} autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" > { this.parentComponent.verbose = (e.target as SlCheckbox).checked; this.parentComponent.requestUpdate(); }} name="verbose" >${msg("Verbose")} `; } permissionsToNumberString() { const nodeString = (this.permissions.node.add ? '1' : '0') + (this.permissions.node.delete ? '1' : '0') + (this.permissions.node.change ? '1' : '0'); const edgeString = (this.permissions.edge.add ? '1' : '0') + (this.permissions.edge.delete ? '1' : '0') + (this.permissions.edge.change ? '1' : '0'); const stackString = (this.permissions.stack.add ? '1' : '0') + (this.permissions.stack.delete ? '1' : '0') + (this.permissions.stack.change ? '1' : '0'); return ( parseInt(nodeString, 2).toString() + parseInt(edgeString, 2).toString() + parseInt(stackString, 2).toString() ); } numberStringToPermissions(num: string) { const nodeString = parseInt(num[0], 10).toString(2).padStart(3, '0'); const edgeString = parseInt(num[1], 10).toString(2).padStart(3, '0'); const stackString = parseInt(num[2], 10).toString(2).padStart(3, '0'); this.permissions = { node: { add: nodeString[0] === '1', delete: nodeString[1] === '1', change: nodeString[2] === '1', }, edge: { add: edgeString[0] === '1', delete: edgeString[1] === '1', change: edgeString[2] === '1', }, stack: { add: stackString[0] === '1', delete: stackString[1] === '1', change: stackString[2] === '1', }, }; } }