Added minimal functionality for Robot teaching

- Added minimal HMI
- Added possibility to open and close all chamber doors
This commit is contained in:
2026-01-17 09:20:39 +01:00
parent 9f058db2a3
commit 2d11c43579
2274 changed files with 912690 additions and 162 deletions

View File

@@ -0,0 +1,795 @@
{
"$schema": "../../TcHmiFramework/Schema/ControlDescription.Schema.json",
"apiVersion": 1,
"name": "TcHmiKeyboard",
"namespace": "TcHmi.Controls.Beckhoff",
"displayName": "Keyboard",
"version": {
"full": "14.4.1.0",
"major": 14,
"minor": 4,
"build": 1,
"revision": 0
},
"visible": true,
"themeable": "Standard",
"base": "TcHmi.Controls.System.TcHmiControl",
"description": "An on-screen Keyboard.",
"defaultDesignerEvent": "",
"properties": {
"containerControl": false,
"geometry": {
"width": 790,
"height": 250
}
},
"icons": [
{
"name": "Icons/16x16.png",
"width": 16,
"height": 16
}
],
"template": "Template.html",
"dependencyFiles": [
{
"name": "Style.css",
"type": "Stylesheet",
"description": ""
},
{
"name": "../dist/UiProvider/loader.esm.js",
"type": "EsModule",
"description": "Load corresponding UI Provider module (and perhaps others, too :-)"
},
{
"name": "../dist/TcHmiKeyboard/TcHmiKeyboard.esm.js",
"type": "EsModule",
"description": "Contains all the main logic as ES module."
}
],
"themes": {
"Base": {
"resources": [
{
"name": "Themes/Base/Style.css",
"type": "Stylesheet",
"description": ""
}
]
},
"Base-Dark": {
"resources": [
{
"name": "Themes/Base-Dark/Style.css",
"type": "Stylesheet",
"description": ""
}
]
}
},
"attributes": [
{
"name": "data-tchmi-width-mode",
"propertyName": "WidthMode",
"propertySetterName": "setWidthMode",
"propertyGetterName": "getWidthMode",
"displayName": "Width Mode",
"visible": true,
"themeable": "Advanced",
"displayPriority": 40,
"type": "tchmi:framework#/definitions/SizeModeWithContent",
"category": "Layout",
"description": "Defines wether the control width is applied as configured via the width attribute or automatically adjusts to fill the parent or fit the displayed keyboard layout.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": "Value"
},
{
"name": "data-tchmi-height-mode",
"propertyName": "HeightMode",
"propertySetterName": "setHeightMode",
"propertyGetterName": "getHeightMode",
"displayName": "Height Mode",
"visible": true,
"themeable": "Advanced",
"displayPriority": 40,
"type": "tchmi:framework#/definitions/SizeModeWithContent",
"category": "Layout",
"description": "Defines wether the control height is applied as configured via the height attribute or automatically adjusts to fill the parent or fit the displayed keyboard layout.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": "Value"
},
{
"name": "data-tchmi-layout-file",
"propertyName": "LayoutFile",
"propertySetterName": "setLayoutFile",
"propertyGetterName": "getLayoutFile",
"displayName": "Layout File",
"visible": true,
"themeable": "Advanced",
"displayPriority": 10,
"type": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiKeyboard.ProjectKeyboardLayouts",
"category": "Common",
"description": "Path to a layout JSON file in the project.\nThis overrides Layout.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": "KeyboardLayouts/US - compact.keyboard.json",
"defaultValueInternal": null
},
{
"name": "data-tchmi-scale-mode",
"propertyName": "ScaleMode",
"propertySetterName": "setScaleMode",
"propertyGetterName": "getScaleMode",
"displayName": "Scale Mode",
"visible": true,
"themeable": "Advanced",
"displayPriority": 60,
"type": "tchmi:framework#/definitions/ScaleMode",
"category": "Common",
"description": "Scale the content to control size. Alternatively, the control size can be set to the size of the displayed layout using WidthMode and HeightMode.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": "ScaleToFit",
"defaultValueInternal": "None"
},
{
"name": "data-tchmi-fixed-target",
"propertyName": "FixedTarget",
"propertySetterName": "setFixedTarget",
"propertyGetterName": "getFixedTarget",
"displayName": "Fixed Target",
"visible": true,
"themeable": "Advanced",
"displayPriority": 10,
"type": "tchmi:general#/definitions/String",
"category": "Behaviour",
"description": "Set this to the name of a control to always send input to that control, regardless of focus.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": ""
},
{
"name": "data-tchmi-release-sticky-keys-manually",
"propertyName": "ReleaseStickyKeysManually",
"propertySetterName": "setReleaseStickyKeysManually",
"propertyGetterName": "getReleaseStickyKeysManually",
"displayName": "Release Sticky Keys Manually",
"visible": true,
"themeable": "Advanced",
"displayPriority": 20,
"type": "tchmi:general#/definitions/Boolean",
"category": "Behaviour",
"description": "Whether to require an explicit keypress on a sticky key to release it, or release it automatically after a character was typed.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": false
},
{
"name": "data-tchmi-input-hints-validation",
"propertyName": "InputHintsValidation",
"propertySetterName": "setInputHintsValidation",
"propertyGetterName": "getInputHintsValidation",
"displayName": "Input Hints Validation",
"visible": true,
"themeable": "Advanced",
"displayPriority": 30,
"type": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiKeyboard.ValidationLevel",
"category": "Behaviour",
"description": "How to validate input hints, which can be specified with the data-tchmikeyboard-min and data-tchmikeyboard-max attributes on input elements.\n\"None\": No validation is performed.\n\"HighlightHints\": Input hints that are violated by the currently entered value are highlighted in red.\n\"DisableAccept\": In addition to the highlighting, the accept key is disabled.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": "DisableAccept"
},
{
"name": "data-tchmi-pressed-keys",
"propertyName": "PressedKeys",
"propertyGetterName": "getPressedKeys",
"displayName": "Pressed Keys",
"visible": true,
"type": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiKeyboard.KeyList",
"category": "Behaviour",
"description": "Currently pressed keys.",
"readOnly": true,
"bindable": false,
"defaultBindingMode": "OneWay",
"heritable": true
},
{
"name": "data-tchmi-longpress-delay",
"propertyName": "LongpressDelay",
"propertySetterName": "setLongpressDelay",
"propertyGetterName": "getLongpressDelay",
"displayName": "Longpress Delay",
"visible": true,
"themeable": "Advanced",
"displayPriority": 60,
"type": "tchmi:general#/definitions/Number",
"category": "Behaviour",
"description": "The time in milliseconds before the longpress action is triggered.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": 300
},
{
"name": "data-tchmi-repetition-delay",
"propertyName": "RepetitionDelay",
"propertySetterName": "setRepetitionDelay",
"propertyGetterName": "getRepetitionDelay",
"displayName": "Repetition Delay",
"visible": true,
"themeable": "Advanced",
"displayPriority": 60,
"type": "tchmi:general#/definitions/Number",
"category": "Behaviour",
"description": "The time in milliseconds between repeated kepresses when the longpress action is repetition.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": 50
},
{
"name": "data-tchmi-indirect-input-horizontal-alignment",
"propertyName": "IndirectInputHorizontalAlignment",
"propertySetterName": "setIndirectInputHorizontalAlignment",
"propertyGetterName": "getIndirectInputHorizontalAlignment",
"displayName": "Indirect Input Horizontal Alignment",
"visible": true,
"themeable": "Standard",
"displayPriority": 30,
"type": "tchmi:framework#/definitions/HorizontalAlignment",
"category": "Indirect Input",
"description": "The horizontal alignment of text in the indirect input textbox.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": "Left"
},
{
"name": "data-tchmi-indirect-input-font-size",
"propertyName": "IndirectInputFontSize",
"propertySetterName": "setIndirectInputFontSize",
"propertyGetterName": "getIndirectInputFontSize",
"displayName": "Indirect Input Font Size",
"visible": true,
"themeable": "Standard",
"displayPriority": 40,
"type": "tchmi:framework#/definitions/MeasurementValue",
"category": "Indirect Input",
"description": "The font size of the indirect input textbox.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": null
},
{
"name": "data-tchmi-indirect-input-font-size-unit",
"propertyName": "IndirectInputFontSizeUnit",
"propertySetterName": "setIndirectInputFontSizeUnit",
"propertyGetterName": "getIndirectInputFontSizeUnit",
"displayName": "Indirect Input Font Size Unit",
"refTo": "IndirectInputFontSize",
"visible": true,
"themeable": "Standard",
"displayPriority": 40,
"type": "tchmi:framework#/definitions/MeasurementUnit",
"category": "Indirect Input",
"description": "The font size unit of the indirect input textbox.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": "px"
},
{
"name": "data-tchmi-indirect-input-padding",
"propertyName": "IndirectInputPadding",
"propertySetterName": "setIndirectInputPadding",
"propertyGetterName": "getIndirectInputPadding",
"displayName": "Indirect Input Padding",
"visible": true,
"themeable": "Advanced",
"displayPriority": 110,
"type": "tchmi:framework#/definitions/Padding",
"category": "Indirect Input",
"description": "The padding of the indirect input textbox.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"allowSymbolExpressionsInObject": true,
"defaultValue": {
"top": 3,
"right": 3,
"bottom": 3,
"left": 3
},
"defaultValueInternal": null
},
{
"name": "data-tchmi-label-font-family",
"propertyName": "LabelFontFamily",
"propertySetterName": "setLabelFontFamily",
"propertyGetterName": "getLabelFontFamily",
"displayName": "Label Font Family",
"visible": true,
"themeable": "Standard",
"displayPriority": 60,
"type": "tchmi:framework#/definitions/FontFamily",
"category": "Labels",
"description": "Comma separated list of family name or keyword: 'serif', 'sans-serif', 'monospace'.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": null
},
{
"name": "data-tchmi-label-font-size",
"propertyName": "LabelFontSize",
"propertySetterName": "setLabelFontSize",
"propertyGetterName": "getLabelFontSize",
"displayName": "Label Font Size",
"visible": true,
"themeable": "Standard",
"displayPriority": 60,
"type": "tchmi:framework#/definitions/MeasurementValue",
"category": "Labels",
"description": "The size of the font. Percent values are relative to the parent elements font size.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": 14,
"defaultValueInternal": 12
},
{
"name": "data-tchmi-label-font-size-unit",
"propertyName": "LabelFontSizeUnit",
"propertySetterName": "setLabelFontSizeUnit",
"propertyGetterName": "getLabelFontSizeUnit",
"refTo": "LabelFontSize",
"displayName": "Label Font Size Unit",
"visible": true,
"themeable": "Advanced",
"displayPriority": 60,
"type": "tchmi:framework#/definitions/MeasurementUnit",
"category": "Labels",
"description": "Could be 'px' or for relative sizing '%'.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": "px"
},
{
"name": "data-tchmi-label-font-style",
"propertyName": "LabelFontStyle",
"propertySetterName": "setLabelFontStyle",
"propertyGetterName": "getLabelFontStyle",
"displayName": "Label Font Style",
"visible": true,
"themeable": "Standard",
"displayPriority": 60,
"type": "tchmi:framework#/definitions/FontStyle",
"category": "Labels",
"description": "'Normal', 'Italic' (slanted with special glyphs), 'Oblique' (slanted normal glyphs) or 'Auto' for inherited.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": "Auto"
},
{
"name": "data-tchmi-label-font-weight",
"propertyName": "LabelFontWeight",
"propertySetterName": "setLabelFontWeight",
"propertyGetterName": "getLabelFontWeight",
"displayName": "Label Font Weight",
"visible": true,
"themeable": "Standard",
"displayPriority": 60,
"type": "tchmi:framework#/definitions/FontWeight",
"category": "Labels",
"description": "'Normal', 'Bold' (glyphs with more weight) or 'Auto' for inherited.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": "Auto"
},
{
"name": "data-tchmi-label-stroke-thickness",
"propertyName": "LabelStrokeThickness",
"propertySetterName": "setLabelStrokeThickness",
"propertyGetterName": "getLabelStrokeThickness",
"displayName": "Label Stroke Thickness",
"visible": true,
"themeable": "Standard",
"displayPriority": 30,
"type": "tchmi:general#/definitions/Number",
"category": "Labels",
"description": "How thick to stroke graphical labels.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"defaultValue": null,
"defaultValueInternal": null
},
{
"name": "data-tchmi-keyboard-padding",
"propertyName": "KeyboardPadding",
"propertySetterName": "setKeyboardPadding",
"propertyGetterName": "getKeyboardPadding",
"displayName": "Keyboard Padding",
"visible": true,
"themeable": "Standard",
"displayPriority": 51,
"type": "tchmi:framework#/definitions/PixelPadding",
"category": "Layout",
"description": "Padding of the whole keyboard",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"allowSymbolExpressionsInObject": true,
"defaultValue": {
"top": 10,
"topUnit": "px",
"right": 10,
"rightUnit": "px",
"bottom": 10,
"bottomUnit": "px",
"left": 10,
"leftUnit": "px"
},
"defaultValueInternal": null
},
{
"name": "data-tchmi-key-padding",
"propertyName": "KeyPadding",
"propertySetterName": "setKeyPadding",
"propertyGetterName": "getKeyPadding",
"displayName": "Key Padding",
"visible": true,
"themeable": "Standard",
"displayPriority": 51,
"type": "tchmi:framework#/definitions/Padding",
"category": "Layout",
"description": "Padding of the individual keys",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"allowSymbolExpressionsInObject": true,
"defaultValue": {
"top": 4,
"topUnit": "px",
"right": 4,
"rightUnit": "px",
"bottom": 4,
"bottomUnit": "px",
"left": 4,
"leftUnit": "px"
},
"defaultValueInternal": null
},
{
"name": "data-tchmi-additional-key-backdrop-padding",
"propertyName": "AdditionalKeyBackdropPadding",
"propertySetterName": "setAdditionalKeyBackdropPadding",
"propertyGetterName": "getAdditionalKeyBackdropPadding",
"displayName": "Additional Key Backdrop Padding",
"visible": true,
"themeable": "Standard",
"displayPriority": 51,
"type": "tchmi:framework#/definitions/Padding",
"category": "Layout",
"description": "Padding of the backdrop behind additional keys",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"allowSymbolExpressionsInObject": true,
"defaultValue": {
"top": 10,
"topUnit": "px",
"right": 10,
"rightUnit": "px",
"bottom": 10,
"bottomUnit": "px",
"left": 10,
"leftUnit": "px"
},
"defaultValueInternal": null
},
{
"name": "data-tchmi-key-background-color",
"propertyName": "KeyBackgroundColor",
"propertySetterName": "setKeyBackgroundColor",
"propertyGetterName": "getKeyBackgroundColor",
"displayName": "Key Background Color",
"visible": true,
"themeable": "Standard",
"displayPriority": 20,
"type": "tchmi:framework#/definitions/Color",
"category": "Colors",
"description": "The background color of the keys.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"allowSymbolExpressionsInObject": true,
"defaultValue": null,
"defaultValueInternal": null
},
{
"name": "data-tchmi-label-color",
"propertyName": "LabelColor",
"propertySetterName": "setLabelColor",
"propertyGetterName": "getLabelColor",
"displayName": "Label Color",
"visible": true,
"themeable": "Standard",
"displayPriority": 20,
"type": "tchmi:framework#/definitions/SolidColor",
"category": "Colors",
"description": "The font color of text labels.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"allowSymbolExpressionsInObject": true,
"defaultValue": null,
"defaultValueInternal": null
},
{
"name": "data-tchmi-label-stroke-color",
"propertyName": "LabelStrokeColor",
"propertySetterName": "setLabelStrokeColor",
"propertyGetterName": "getLabelStrokeColor",
"displayName": "Label Stroke Color",
"visible": true,
"themeable": "Standard",
"displayPriority": 20,
"type": "tchmi:framework#/definitions/SolidColor",
"category": "Colors",
"description": "The stroke color of graphical symbols.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"allowSymbolExpressionsInObject": true,
"defaultValue": null,
"defaultValueInternal": null
},
{
"name": "data-tchmi-label-fill-color",
"propertyName": "LabelFillColor",
"propertySetterName": "setLabelFillColor",
"propertyGetterName": "getLabelFillColor",
"displayName": "Label Fill Color",
"visible": true,
"themeable": "Standard",
"displayPriority": 60,
"type": "tchmi:framework#/definitions/Color",
"category": "Colors",
"description": "The fill color of graphical symbols.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"allowSymbolExpressionsInObject": true,
"defaultValue": null,
"defaultValueInternal": null
},
{
"name": "data-tchmi-additional-key-backdrop-color",
"propertyName": "AdditionalKeyBackdropColor",
"propertySetterName": "setAdditionalKeyBackdropColor",
"propertyGetterName": "getAdditionalKeyBackdropColor",
"displayName": "Additional Key Backdrop Color",
"visible": true,
"themeable": "Standard",
"displayPriority": 60,
"type": "tchmi:framework#/definitions/Color",
"category": "Colors",
"description": "The background color of the backdrop behind additional keys.",
"readOnly": false,
"bindable": true,
"defaultBindingMode": "OneWay",
"heritable": true,
"allowSymbolExpressionsInObject": true,
"defaultValue": null,
"defaultValueInternal": null
}
],
"attributeCategories": [
{
"name": "Behaviour",
"displayPriority": 500,
"defaultCollapsed": true,
"description": "Attributes defining the behaviour of the control."
},
{
"name": "Indirect Input",
"displayPriority": 140,
"defaultCollapsed": true,
"description": "Attributes controlling the indirect input mode via a textbox owned by the keyboard."
},
{
"name": "Labels",
"displayPriority": 150,
"defaultCollapsed": true,
"description": "Attributes defining the labels of the control."
}
],
"functions": [],
"events": [
{
"name": ".onKeyPressStarted",
"displayName": ".onKeyPressStarted",
"visible": true,
"displayPriority": 10,
"category": "Control",
"description": "The onKeyPressStarted event is fired when the user presses down a key.",
"heritable": true,
"arguments": [
{
"type": "tchmi:framework#/definitions/TcHmiKeyboardKeyPressedEventObjects",
"description": "The event object containing information about the pressed keys."
}
]
},
{
"name": ".onKeyPressCanceled",
"displayName": ".onKeyPressCanceled",
"visible": true,
"displayPriority": 11,
"category": "Control",
"description": "The onKeyPressCanceled event is fired when the user cancels a key press by moving the pointer off the key.",
"heritable": true,
"arguments": [
{
"type": "tchmi:framework#/definitions/TcHmiKeyboardKeyPressedEventObjects",
"description": "The event object containing information about the released keys."
}
]
},
{
"name": ".onKeyPressFinished",
"displayName": ".onKeyPressFinished",
"visible": true,
"displayPriority": 12,
"category": "Control",
"description": "The onKeyPressFinished event is fired when the user finishes pressing a key by releasing a key that was pressed before.",
"heritable": true,
"arguments": [
{
"type": "tchmi:framework#/definitions/TcHmiKeyboardKeyPressedEventObjects",
"description": "The event object containing information about the released keys."
}
]
},
{
"name": ".onKeyPressEnded",
"displayName": ".onKeyPressEnded",
"visible": true,
"displayPriority": 13,
"category": "Control",
"description": "The onKeyPressEnded event is fired after a key press is finished or canceled.",
"heritable": true,
"arguments": [
{
"type": "tchmi:framework#/definitions/TcHmiKeyboardKeyPressedEventObjects",
"description": "The event object containing information about the released keys."
}
]
},
{
"name": ".onIndirectInputAccepted",
"displayName": ".onIndirectInputAccepted",
"visible": true,
"displayPriority": 14,
"category": "Control",
"description": "The onIndirectInputAccepted event is fired when the user accepts the indirect input.",
"heritable": true,
"arguments": [
{
"type": "tchmi:general#/definitions/String",
"description": "The new indirect input value."
}
]
},
{
"name": ".onIndirectInputCanceled",
"displayName": ".onIndirectInputCanceled",
"visible": true,
"displayPriority": 15,
"category": "Control",
"description": "The onIndirectInputCanceled event is fired when the user cancels the indirect input.",
"heritable": true,
"arguments": [
{
"type": "tchmi:general#/definitions/String",
"description": "The canceled indirect input value."
}
]
},
{
"name": ".onLayoutLoaded",
"displayName": ".onLayoutLoaded",
"visible": true,
"displayPriority": 16,
"category": "Control",
"description": "The onLayoutLoaded event is fired when the layout file was fetched, parsed and the keys were created.",
"heritable": true,
"arguments": [
{
"type": "tchmi:framework#/definitions/TcHmiKeyboardLayoutFileEventObject",
"description": "The event object containing information about the layout."
}
]
},
{
"name": ".onLayoutActivated",
"displayName": ".onLayoutActivated",
"visible": true,
"displayPriority": 17,
"category": "Control",
"description": "The onLayoutActivated event is fired when one of the layouts in the current layout file is activated.",
"heritable": true,
"arguments": [
{
"type": "tchmi:framework#/definitions/TcHmiKeyboardLayoutEventObject",
"description": "The event object containing information about the layout."
}
]
}
],
"dataTypes": [
{
"schema": "Schema/Types.Schema.json"
}
],
"languages": {
"en": "Lang/Language.en.json",
"de": "Lang/Language.de.json"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

View File

@@ -0,0 +1,10 @@
{
"$schema": "../../../TwinCAT-HMI-Common/JsonSchemas/Language.Schema.json",
"locale": "de",
"localizedText": {
"Engineering_Not_Configured": "LayoutFile wurde nicht konfiguriert.\nBitte fügen Sie dem Projekt ein Tastaturlayout hinzu und setzen Sie das Attribut LayoutFile.",
"InputHint_Min": "Min:",
"InputHint_Max": "Max:",
"InputHint_Separator": ";"
}
}

View File

@@ -0,0 +1,10 @@
{
"$schema": "../../../TwinCAT-HMI-Common/JsonSchemas/Language.Schema.json",
"locale": "en",
"localizedText": {
"Engineering_Not_Configured": "No configured LayoutFile.\nPlease add a keyboard layout to the project and set the LayoutFile attribute.",
"InputHint_Min": "Min:",
"InputHint_Max": "Max:",
"InputHint_Separator": ";"
}
}

View File

@@ -0,0 +1,176 @@
{
"$schema": "http://json-schema.org/draft-04/schema",
"definitions": {
"TcHmi.Controls.Beckhoff.TcHmiKeyboard.ProjectKeyboardLayouts": {
"type": "string",
"description": "A path of a keyboard layout in the project."
},
"KeyList": {
"$ref": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiKeyboard.KeyList"
},
"TcHmi.Controls.Beckhoff.TcHmiKeyboard": {
"type": "object",
"frameworkInstanceOf": "TcHmi.Controls.System.TcHmiControl",
"frameworkControlType": "TcHmiKeyboard",
"frameworkControlNamespace": "TcHmi.Controls.Beckhoff"
},
"TcHmi.Controls.Beckhoff.TcHmiKeyboard.KeyList": {
"title": "KeyList",
"description": "Array of keys.",
"type": "array",
"items": {
"type": "object",
"engineeringColumns": ["code", "key"],
"propertiesMeta": [
{
"name": "code",
"displayName": "Code",
"category": "General",
"displayPriority": 10,
"description": "Special string for each physical key on the keyboard (does not have to be the same as the corresponding char)",
"defaultValue": null,
"defaultValueInternal": null
},
{
"name": "key",
"displayName": "Key",
"category": "General",
"displayPriority": 10,
"description": "Value of the key pressed",
"defaultValue": null,
"defaultValueInternal": null
},
{
"name": "location",
"displayName": "Location",
"category": "General",
"displayPriority": 10,
"description": "Location of the pressed key",
"defaultValue": null,
"defaultValueInternal": null
}
],
"properties": {
"code": {
"type": "string"
},
"key": {
"type": "string"
},
"unmodifiedKey": {
"type": "string"
},
"location": {
"type": "string",
"enum": ["standard", "left", "right", "numpad"]
}
},
"required": ["code", "key", "unmodifiedKey", "location"],
"additionalProperties": false
}
},
"TcHmi.Controls.Beckhoff.TcHmiKeyboard.ValidationLevel": {
"type": "string",
"enum": ["None", "HighlightHints", "DisableAccept"]
},
"TcHmiKeyboard": {
"$ref": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiKeyboard"
},
"ControlKeyboardLayouts": {
"title": "ControlKeyboardLayouts",
"description": "Enum of existing Layouts from the control",
"type": "string",
"enum": [
"EN-US_QWERTY_standard",
"EN-US_QWERTY_full",
"EN-US_QWERTY_compact",
"DE-DE_QWERTZ_standard",
"DE-DE_QWERTZ_full",
"DE-DE_QWERTZ_compact",
"PINpad",
"Numpad",
"Calculator"
]
},
"TcHmi.Controls.Beckhoff.TcHmiKeyboard.KeyPressedEventObjects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"element": {
"$ref": "tchmi:framework#/definitions/HTMLElement"
},
"key": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"key": {
"type": "string"
},
"unmodifiedKey": {
"type": "string"
},
"location": {
"type": "string",
"enum": ["standard", "left", "right", "numpad"]
}
},
"required": ["code", "key", "unmodifiedKey", "location"],
"type": "object"
}
},
"required": ["key", "element"],
"additionalProperties": false
}
},
"TcHmiKeyboardKeyPressedEventObjects": {
"$ref": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiKeyboard.KeyPressedEventObjects"
},
"TcHmi.Controls.Beckhoff.TcHmiKeyboard.Layout": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"dimensions": {
"width": "number",
"height": "number"
},
"keys": {
"type": "array",
"items": { "type": "object" }
}
},
"additionalProperties": false
},
"TcHmiKeyboardLayout": {
"$ref": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiKeyboard.Layout"
},
"TcHmi.Controls.Beckhoff.TcHmiKeyboard.LayoutFileEventObject": {
"type": "object",
"properties": {
"layoutFile": {
"$ref": "tchmi:framework#/definitions/TcHmiKeyboardLayout"
}
},
"additionalProperties": false
},
"TcHmiKeyboardLayoutFileEventObject": {
"$ref": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiKeyboard.LayoutFileEventObject"
},
"TcHmi.Controls.Beckhoff.TcHmiKeyboard.LayoutEventObject": {
"type": "object",
"properties": {
"layout": {
"$ref": "tchmi:framework#/definitions/TcHmiKeyboardLayout"
}
},
"additionalProperties": false
},
"TcHmiKeyboardLayoutEventObject": {
"$ref": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiKeyboard.LayoutEventObject"
}
}
}

View File

@@ -0,0 +1,195 @@
/** Styles for all themes */
.TcHmi_Controls_Beckhoff_TcHmiKeyboard,
.tchmi-keyboard {
overflow: hidden;
--input-hint-separator: '';
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template,
.tchmi-keyboard-template {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-padding-container,
.tchmi-keyboard-template-padding-container {
width: 100%;
height: 100%;
position: relative;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key,
.tchmi-keyboard-template-key,
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-textbox {
position: absolute;
box-sizing: border-box;
pointer-events: auto;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-additional-keys-container {
visibility: hidden;
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-additional-keys-container.tchmi-in-topmostlayer {
position: absolute;
visibility: visible;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-backdrop,
.tchmi-keyboard-template-backdrop {
pointer-events: none;
position: absolute;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label,
.tchmi-keyboard-template-label {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
align-items: center;
justify-content: center;
display: none;
overflow: hidden;
/* fix for IE to get active state on key root */
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label.top,
.tchmi-keyboard-template-label.top {
align-items: flex-start;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label.bottom,
.tchmi-keyboard-template-label.bottom {
align-items: flex-end;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label.left,
.tchmi-keyboard-template-label.left {
justify-content: flex-start;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label.right,
.tchmi-keyboard-template-label.right {
justify-content: flex-end;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label.show,
.tchmi-keyboard-template-label.show {
display: flex;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label.show-always,
.tchmi-keyboard-template-label.show-always {
display: flex;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.locked
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label.show-locked,
.tchmi-keyboard-template-key.locked .tchmi-keyboard-template-label.show-locked {
display: flex;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label.hide,
.tchmi-keyboard-template-label.hide {
display: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.locked
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label.hide-locked,
.tchmi-keyboard-template-key.locked .tchmi-keyboard-template-label.hide-locked {
display: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.disabled {
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.disabled::after {
content: '';
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
z-index: 100;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints {
position: absolute;
box-sizing: border-box;
padding: 0;
pointer-events: none;
overflow: hidden;
display: grid;
align-content: center;
grid-template-columns: repeat(4, minmax(auto, min-content));
grid-template-rows: repeat(2, min-content);
container: input-hints / size;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints.textbox-overlay {
align-content: space-between;
justify-content: end;
padding: 3px 5px 3px 25%;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints.textbox-overlay.left-aligned {
justify-content: start;
padding: 3px 25% 3px 5px;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span {
grid-row: 1 / 3;
align-self: center;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.value {
padding-left: 2px;
text-align: right;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.value:not(:last-child)::after {
content: var(--input-hint-separator);
padding-right: 4px;
}
@container input-hints (min-height: 40px) {
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.min {
grid-row: 2;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.max {
grid-row: 1;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.label {
grid-column: 1;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.value {
grid-column: 2;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.value:not(:last-child)::after {
display: none;
}
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints.hidden {
display: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.hidden {
display: none;
}

View File

@@ -0,0 +1,5 @@
<div class="TcHmi_Controls_Beckhoff_TcHmiKeyboard-template tchmi-keyboard-template tchmi-box">
<div
class="TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-padding-container tchmi-keyboard-template-padding-container"
></div>
</div>

View File

@@ -0,0 +1,107 @@
/** Styles for the theme: Base-Dark */
/* Style for the main element */
.TcHmi_Controls_Beckhoff_TcHmiKeyboard,
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-additional-keys-container,
.tchmi-keyboard {
--tchmi-background: var(--tchmi-background-color-1);
--tchmi-color: var(--tchmi-foreground-color-1);
--tchmi-backdrop-background: var(--tchmi-background-color-3);
--tchmi-input-background: var(--tchmi-background-color-4);
--tchmi-light-text-color: var(--tchmi-foreground-color-4);
--tchmi-error-text-color: var(--tchmi-error-color);
--tchmi-border-color: var(--tchmi-background-color-2);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard,
.tchmi-keyboard {
background-color: var(--tchmi-background);
box-shadow: var(--tchmi-card-shadow);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key,
.tchmi-keyboard-template-key {
font-size: var(--tchmi-button-font-size);
background: var(--tchmi-button-background);
color: var(--tchmi-button-text-color);
border: var(--tchmi-button-border);
box-shadow: var(--tchmi-button-shadow);
}
/* tchmibutton, not disabled, not operate-disallowed, mouse over, mousedown on it and still pressed */
.TcHmi_Controls_Beckhoff_TcHmiKeyboard:not(.TcHmi_Controls_System_TcHmiControl-disabled):not(
.TcHmi_Controls_System_TcHmiControl-operate-disallowed
)
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.hover.down,
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-additional-keys-container
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.hover.down,
.TcHmi_Controls_Beckhoff_TcHmiKeyboard:not(.TcHmi_Controls_System_TcHmiControl-disabled):not(
.TcHmi_Controls_System_TcHmiControl-operate-disallowed
)
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.down
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.additional-key.hover,
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.show-additional-keys,
.tchmi-keyboard:not(.tchmi-control-disabled):not(.tchmi-control-operate-disallowed)
.tchmi-keyboard-template-key.hover.down,
.tchmi-keyboard:not(.tchmi-control-disabled):not(.tchmi-control-operate-disallowed)
.tchmi-keyboard-template-key.down
.tchmi-keyboard-template-key.additional-key.hover,
.tchmi-keyboard-template-key.show-additional-keys {
background: var(--tchmi-button-background-pressed);
color: var(--tchmi-button-text-color-pressed);
border: var(--tchmi-button-border-pressed);
box-shadow: var(--tchmi-button-shadow-pressed);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.active,
.tchmi-keyboard-template-key.active {
background: var(--tchmi-highlight-button-background-pressed);
color: var(--tchmi-highlight-button-text-color-pressed);
border: var(--tchmi-highlight-button-border-pressed);
box-shadow: var(--tchmi-highlight-button-shadow-pressed);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-backdrop,
.tchmi-keyboard-template-backdrop {
background-color: var(--tchmi-backdrop-background);
box-shadow: var(--tchmi-popup-shadow);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label svg,
.tchmi-keyboard-template-label svg {
fill: none;
stroke: currentColor;
stroke-width: 1.1px;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-textbox {
border: 1px solid var(--tchmi-border-color);
color: var(--tchmi-color);
background: var(--tchmi-input-background);
font-family: inherit;
font-size: inherit;
font-style: inherit;
font-weight: inherit;
resize: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-textbox:focus {
/* A blinking cursor is enough for ourself. The manipulated text element is highlighted. */
outline: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.disabled::after {
background-color: var(--tchmi-disabled-color);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints {
color: var(--tchmi-light-text-color);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.violated {
color: var(--tchmi-error-text-color);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.violated::after {
color: var(--tchmi-light-text-color);
}

View File

@@ -0,0 +1,108 @@
/** Styles for the theme: Base */
/* Style for the main element */
.TcHmi_Controls_Beckhoff_TcHmiKeyboard,
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-additional-keys-container,
.tchmi-keyboard {
--tchmi-background: var(--tchmi-background-color-1);
--tchmi-color: var(--tchmi-foreground-color-1);
--tchmi-backdrop-background: var(--tchmi-background-color-4);
--tchmi-input-background: var(--tchmi-background-color-4);
--tchmi-light-text-color: var(--tchmi-foreground-color-3);
--tchmi-error-text-color: var(--tchmi-error-color);
--tchmi-border-color: var(--tchmi-background-color-2);
--tchmi-button-border-color: var(--tchmi-foreground-color-3);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard,
.tchmi-keyboard {
background-color: var(--tchmi-background);
box-shadow: var(--tchmi-card-shadow);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key,
.tchmi-keyboard-template-key {
font-size: var(--tchmi-button-font-size);
background: var(--tchmi-button-background);
color: var(--tchmi-button-text-color);
border: var(--tchmi-button-border);
box-shadow: var(--tchmi-button-shadow);
}
/* tchmibutton, not disabled, not operate-disallowed, mouse over, mousedown on it and still pressed */
.TcHmi_Controls_Beckhoff_TcHmiKeyboard:not(.TcHmi_Controls_System_TcHmiControl-disabled):not(
.TcHmi_Controls_System_TcHmiControl-operate-disallowed
)
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.hover.down,
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-additional-keys-container
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.hover.down,
.TcHmi_Controls_Beckhoff_TcHmiKeyboard:not(.TcHmi_Controls_System_TcHmiControl-disabled):not(
.TcHmi_Controls_System_TcHmiControl-operate-disallowed
)
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.down
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.additional-key.hover,
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.show-additional-keys,
.tchmi-keyboard:not(.tchmi-control-disabled):not(.tchmi-control-operate-disallowed)
.tchmi-keyboard-template-key.hover.down,
.tchmi-keyboard:not(.tchmi-control-disabled):not(.tchmi-control-operate-disallowed)
.tchmi-keyboard-template-key.down
.tchmi-keyboard-template-key.additional-key.hover,
.tchmi-keyboard-template-key.show-additional-keys {
background: var(--tchmi-button-background-pressed);
color: var(--tchmi-button-text-color-pressed);
border: var(--tchmi-button-border-pressed);
box-shadow: var(--tchmi-button-shadow-pressed);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.active,
.tchmi-keyboard-template-key.active {
background: var(--tchmi-highlight-button-background-pressed);
color: var(--tchmi-highlight-button-text-color-pressed);
border: var(--tchmi-highlight-button-border-pressed);
box-shadow: var(--tchmi-highlight-button-shadow-pressed);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-backdrop,
.tchmi-keyboard-template-backdrop {
background-color: var(--tchmi-backdrop-background);
box-shadow: var(--tchmi-dropdown-shadow);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-label svg,
.tchmi-keyboard-template-label svg {
fill: none;
stroke: currentColor;
stroke-width: 1.1px;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-textbox {
border: 1px solid var(--tchmi-border-color);
color: var(--tchmi-color);
background: var(--tchmi-input-background);
font-family: inherit;
font-size: inherit;
font-style: inherit;
font-weight: inherit;
resize: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-textbox:focus {
/* A blinking cursor is enough for ourself. The manipulated text element is highlighted. */
outline: none;
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-key.disabled::after {
background-color: var(--tchmi-disabled-color);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints {
color: var(--tchmi-light-text-color);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.violated {
color: var(--tchmi-error-text-color);
}
.TcHmi_Controls_Beckhoff_TcHmiKeyboard-template-hints span.violated::after {
color: var(--tchmi-light-text-color);
}