# Botón

> La tecla de comando: escribe un valor preestablecido, ejecuta un comando de unidad, abre otro panel de control o ejecuta una acción de Logic.

**Botón** es la tecla de comando de la paleta. Un clic hace la única cosa que el componente declara
(su *acción*) y el panel de propiedades pide entonces solo los campos propios de esa acción, así
que ningún campo se queda en pantalla bajo una regla escondida sobre cuándo cuenta. Es un
componente de *Mando*; uno nuevo ocupa 3 × 1 celdas.

Sea cual sea la acción, el botón lleva su propio aspecto: un par de colores y un icono opcional. En
un panel de operación, el botón es la pieza a la que va la mano del operador, y el color y la marca
son lo que hace que uno se encuentre de un vistazo.

## Contenido {#content}

| Campo | Qué hace | Valores | Por defecto |
|---|---|---|---|
| Etiqueta | El rótulo de la tecla. Vacío recae en aquello a lo que apunta la acción elegida: el último segmento de la dirección del punto escrito, el nombre del panel de control de destino, o el nombre de la acción de Logic vinculada, y "(sin punto)", "(sin panel de control)", "(sin acción)" o "(no encontrado)" mientras no hay nada que nombrar. | Texto libre | vacío |

## Acción {#action}

| Campo | Qué hace | Valores | Por defecto |
|---|---|---|---|
| Al hacer clic | Lo que hace el clic. Todos los campos de abajo pertenecen a la acción elegida. | `Escribir un valor` · `Ejecutar un comando de unidad` · `Abrir otro panel de control` · `Ejecutar una acción de Logic` | `Escribir un valor` |

### Escribir un valor {#write-a-value}

| Campo | Qué hace | Valores | Por defecto |
|---|---|---|---|
| Punto | El punto escrito. La lista se estrecha a lo que se puede escribir realmente: variables de memoria y tags que no son de solo lectura. | Texto libre; sugerencias de puntos escribibles | vacío |
| Valor escrito | El literal preestablecido que se envía en cada clic. Se lee primero contra el tipo propio del punto, así que un valor que el punto no puede contener se rechaza en la línea de respuesta del botón y no llega nunca a la cola. | Texto libre | `true` |

La escritura pasa por el punto único de escritura de la lógica de la estación y queda registrada en
el diario como cualquier otra escritura. Quien espera al equipo es el botón, no la lógica, así que
la línea de respuesta dice "Escrito" solo cuando el valor ya fue aceptado; cualquier otra cosa deja
ahí el rechazo con las palabras de quien lo rechazó, las de la estación para lo que resolvió antes
de enviar ("No se escribió en 'Cmd': el equipo no está conectado.") y las del equipo para lo que
ocurrió en el cable. Un valor al que una escritura más reciente sobre el mismo punto adelantó antes
de salir se lee "'Cmd' se sustituyó por un valor más reciente antes de enviarse."

Sobre un tag con la etapa **Límites** habilitada, un valor fijo fuera de esos límites se
rechaza en la línea de respuesta con un motivo que nombra esos límites, y no
se escribe nada: si no, el tag lo tomaría en el borde, y el botón confirmaría un valor que
la planta nunca recibió.

Sobre un punto que contiene enteros (un tag de tipo entero cuya Escala y Calibración dejan el valor sin cambios, o una variable de memoria que contiene enteros), un valor fijo con decimales se rechaza en la línea de respuesta en lugar de redondearse ("Este punto admite un entero, así que 2.5 no se escribe."), y no se escribe nada.

### Ejecutar un comando de unidad {#run-a-unit-command}

| Campo | Qué hace | Valores | Por defecto |
|---|---|---|---|
| Comando | Un punto de comando de ensayo de una unidad (`Process.<Modelo>.<Unidad>.Commands.*`). Lanzar el comando es toda la instrucción: no hay ningún valor que escribir. | Texto libre; la lista ofrece los puntos de comando de ensayo de la unidad | vacío |

Un punto de comando lee "se puede ejecutar ahora", así que el botón se deshabilita solo mientras el
comando no procede; un Arrancar con el runtime bloqueado muestra además el motivo del bloqueo. La
pulsación ejecuta el comando contra la unidad, atribuido al operador con la sesión iniciada, y la
línea de respuesta nombra el comando que se ejecutó.

### Abrir otro panel de control {#open-another-dashboard}

| Campo | Qué hace | Valores | Por defecto |
|---|---|---|---|
| Panel de control | El sinóptico de destino. El selector enumera los paneles de control de la estación; los sinópticos definidos sobre un modelo de Process no se ofrecen, porque solo se abren desde una unidad. | `(ninguno)` o un panel de control | `(ninguno)` |

Cambiar de sinóptico es un gesto de operación: un panel que se ejecuta a pantalla completa sigue a
pantalla completa cuando llega el operador. La referencia es floja: un sinóptico que se eliminó, o
que el rol con la sesión iniciada no ve, no deshabilita nada más; la pulsación responde "Ese panel
de control no está disponible." en la línea propia del botón en lugar de romper el sinóptico.

### Ejecutar una acción de Logic {#run-a-logic-action}

| Campo | Qué hace | Valores | Por defecto |
|---|---|---|---|
| Acción | La acción de Logic vinculada (véase la [página Logic](logic)). | `(ninguno)` o una acción | `(ninguno)` |

La acción se ejecuta en la vía de acciones, registrada en el diario como venida del panel de
control. La línea de respuesta informa del resultado: "Correcto · 12 ms", o el error propio de la
acción. Una acción eliminada o deshabilitada deshabilita el botón en lugar de romperlo.

## Color e icono {#color-and-icon}

Se leen sea cual sea la acción:

| Campo | Qué hace | Valores | Por defecto |
|---|---|---|---|
| Color del botón | La cara de la tecla, como un par (una mitad por tema, las dos en pantalla a la vez, porque el tema en marcha decide cuál pinta). Un hexadecimal a medio escribir se rechaza y los campos vuelven a los colores en vigor. Lo que significa un color es su convención; la aplicación no lee ninguna. | `#RRGGBB` cada uno | `#FFFFFF` claro · `#2B2B2B` oscuro |
| Icono | Marca opcional delante del rótulo, elegida de la biblioteca de iconos de la aplicación (unas 2.770 marcas), con búsqueda por nombre o etiqueta ("en inglés: play, stop, warning…"). La celda `—` es la elección de ningún icono. | Glifo del catálogo o ninguno | ninguno |

La tinta del rótulo se **deriva**, no se escribe nunca: sobre cada mitad de la cara, la aplicación
elige el de sus dos tonos de texto que tenga mejor contraste, así que ningún color que usted elija
puede dejar el rótulo ilegible. El rótulo se dimensiona solo con el contrato de visualización
compartido: lo que la tecla no puede contener se recorta con puntos suspensivos, con el rótulo
entero en la información emergente.

## Permisos y el candado {#permissions-and-the-lock}

Todas las acciones necesitan el permiso del rol para operar los paneles de control. Lo que una
pulsación necesita más allá de eso se lee de su *objetivo*, no del tipo: solo **Ejecutar un comando
de unidad** alcanza una mutación de Process y necesita además el permiso de ejecutar
procedimientos. Una pulsación que el rol con la sesión iniciada no puede hacer dibuja la marca
compartida de candado con el motivo en la información emergente del componente (véase la
[página de los paneles de control](home)); la autorización se vuelve a comprobar en el clic. La
línea de respuesta pasajera caduca a los pocos segundos. En una celda sin línea para ella y sin
título de esquina sobre la tecla (un botón de una fila en una rejilla densa), la respuesta
ocupa el lugar del rótulo en la tecla mientras se muestra: queda sobre el rótulo en un tono más
discreto de la propia tinta del rótulo, un rechazo con la tinta de error, con la respuesta entera
en la información emergente. El icono y la tecla se quedan donde están, y el rótulo vuelve cuando
la respuesta caduca (véase la
[página de los paneles de control](home#commands-permissions-and-the-lock-mark)).

Las secciones compartidas Apariencia, Identificación, Posición y capa y Acciones se describen en la
[página de los componentes](components#the-shared-property-sections).
