import { consume } from "@lit/context"; import { t } from "i18next"; import { css, CSSResultGroup, html, nothing, PropertyValues } from "lit"; import { customElement, state } from "lit/decorators.js"; import { BaseElement } from "../../hierarchy/BaseElement"; import { T } from "../../translations/Languages"; import { ContextSetter, IWithPngExportContext, pngExportAnalysisContext, pngExportAnalysisSetterContext, pngExportColumnsContext, pngExportColumnsSetterContext, pngExportFileDateContext, pngExportFileDateSetterContext, pngExportFileNameContext, pngExportFileNameSetterContext, pngExportFsContext, pngExportFsSetterContext, pngExportGroupNameContext, pngExportGroupNameSetterContext, pngExportLicenseContext, pngExportLicenseSetterContext, pngExportScaleContext, pngExportScaleSetterContext, pngExportWidthContext, pngExportWidthSetterContext } from "../../utils/converters/pngExportContext"; @customElement("png-export-panel") export class PngExportPanel extends BaseElement implements IWithPngExportContext { @consume({ context: pngExportWidthContext, subscribe: true }) public pngWidth!: number; @consume({ context: pngExportWidthSetterContext, subscribe: true }) public pngWidthSetter!: ContextSetter; @consume({ context: pngExportFsContext, subscribe: true }) public pngFs!: number; @consume({ context: pngExportFsSetterContext, subscribe: true }) public pngFsSetter!: ContextSetter; @consume({context: pngExportAnalysisContext, subscribe: true}) public pngAnalyses!: boolean; @consume({context: pngExportAnalysisSetterContext, subscribe: true}) public pngExportAnalysesSetter!: ContextSetter; @consume({context: pngExportScaleContext, subscribe: true}) public pngExportScale!: boolean; @consume({context: pngExportScaleSetterContext, subscribe: true}) public pngExportScaleSetter!: ContextSetter; @consume({context: pngExportLicenseContext, subscribe: true}) public pngExportLicense!: boolean; @consume({context: pngExportLicenseSetterContext, subscribe: true}) public pngExportLicenseSetter!: ContextSetter; @consume({context: pngExportFileNameContext, subscribe: true}) public pngExportFileName!: boolean; @consume({context: pngExportFileNameSetterContext, subscribe: true}) public pngExportFileNameSetter!: ContextSetter; @consume({context: pngExportFileDateContext, subscribe: true}) public pngExportFileDate!: boolean; @consume({context: pngExportFileDateSetterContext, subscribe: true}) public pngExportFileDateSetter!: ContextSetter; @consume({context: pngExportColumnsContext, subscribe: true}) public pngExportColumns!: number; @consume({context: pngExportColumnsSetterContext, subscribe: true}) public pngExportColumnsSetter!: ContextSetter; @consume({context: pngExportGroupNameContext, subscribe: true}) public pngExportGroupName!: boolean; @consume({context: pngExportGroupNameSetterContext, subscribe: true}) public pngExportGroupNameSetter!: ContextSetter; protected renderRow( label: string, content: ReturnType, hint?: ReturnType | string ) { return html`
${content}
${hint ? hint : nothing}
`; } protected renderGroup( label: string, content: ReturnType, ) { return html`
${label} ${content}
`; } protected formatTip( value?: ReturnType | string, ) { return value ? html`
${value}
` : ""; } protected renderCheckbox( key: string, label: string, value: boolean, onChange: (value: boolean) => void ) { const content = html` { const target = event.target as HTMLInputElement; const value = target.checked; onChange(value); }}>`; return html`
${content}
`; } protected renderSlider( key: string, label: string, value: number, unit: string, min: number, max: number, step: number, onChange: (value: number) => void, hint?: ReturnType | string ) { const content = html``; const help = html`${value} ${unit} (${min} - ${max} ${unit})${hint ? "
" + hint : "" }`; const tip = this.formatTip(help); return this.renderRow(label, content, tip); } static styles?: CSSResultGroup | undefined = css` :host { display: contents; } .hint { font-size: calc( var( --thermal-fs-sm ) * .75 ); padding-top: .2em; } fieldset { border: 1px solid var(--thermal-slate); border-radius: var(--thermal-radius); margin-bottom: var(--thermal-gap); legend { border-radius: var(--thermal-radius); border: 1px solid var(--thermal-slate); padding: 0.3em 0.5em; } } `; protected updated(_changedProperties: PropertyValues): void { super.updated(_changedProperties); if ( this.pngFs === undefined || this.pngWidth === undefined || this.pngWidthSetter === undefined || this.pngFsSetter === undefined ) { return; } const numericalValues = [ "pngFs", "pngWidth" ]; for ( const key of numericalValues ) { if ( _changedProperties.has( key ) ) { const value = this[key as keyof PngExportPanel] as number; const element = this.shadowRoot?.querySelector( `input[name="${key}"]` ) as HTMLInputElement; if ( element && value) { const oldValue = element.value; if ( parseInt( oldValue ) !== value ) { element.value = value.toString(); this.log(`Updated ${key} from ${oldValue} to ${value}`); } } } } } protected render(): unknown { if ( this.pngFs === undefined || this.pngWidth === undefined || this.pngWidthSetter === undefined || this.pngFsSetter === undefined ) { // return nothing; } return html` ${this.renderGroup( t(T.exportcontent), html` ${this.renderCheckbox( "pngExportAnalyses", t(T.analyses), this.pngAnalyses, this.pngExportAnalysesSetter.bind(this) ) } ${this.renderCheckbox( "pngExportScale", t(T.thermalscale), this.pngExportScale, this.pngExportScaleSetter.bind(this) )} ${this.renderCheckbox( "pngExportFileName", t(T.exportfilenames), this.pngExportFileName, this.pngExportFileNameSetter.bind(this) )} ${this.renderCheckbox( "pngExportFileDate", t(T.filedate), this.pngExportFileDate, this.pngExportFileDateSetter.bind(this) )} ` )} ${this.renderGroup( t(T.exportdimensions), html` ${this.renderSlider( "pngWidth", t(T.exportimagewidth), this.pngWidth, "px", 500, 2000, 50, this.pngWidthSetter.bind(this) )} ${this.renderSlider( "pngFs", t(T.exportimagefontsize), this.pngFs, "px", 10, 50, 1, this.pngFsSetter.bind(this) )} ` )} ${this.renderGroup( t(T.exportgroup), html` ${this.renderCheckbox( "pngExportGroupName", t(T.exportgroupname), this.pngExportGroupName, this.pngExportGroupNameSetter.bind(this) ) } ${this.renderSlider( "pngColumns", t(T.exportfilenames), this.pngExportColumns, "sloupců", 1, 5, 1, this.pngExportColumnsSetter.bind(this) )} ` )} `; } }