Menús contextuales

Un menú contextual contiene una lista de acciones que puedes realizar en relación con algún elemento del lugar de trabajo. Se muestra un menú contextual cuando se hace clic con el botón derecho y se mantiene presionado.

Menú contextual predeterminado para un bloque

Es posible que desees crear una opción de menú contextual personalizado si deseas agregar un nuevo tipo de acción que el usuario pueda realizar. Por ejemplo, para organizar todos los bloques en el espacio de trabajo o descargar una imagen de los bloques. Si crees que la acción se usará con poca frecuencia, el menú contextual es un excelente lugar para ponerla. De lo contrario, es posible que desees crear una forma más detectable para acceder a la acción.

Implementa una opción nueva

Para implementar una opción nueva de menú contextual, debes entregar la interfaz RegistryItem.

ID

La propiedad id debe ser una cadena única que indique lo que hace tu opción de menú contextual.

const deleteOption = {
  id: 'deleteElement',
};

Alcance

La propiedad scopeType le indica a Blockly en qué contexto se podría mostrar la opción de menú y qué información pasar a sus displayText, preconditionFn y callback. Los menús contextuales se pueden limitar a bloques, comentarios del lugar de trabajo y lugares de trabajo.

const deleteOption = {
  scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK,
};

Si quieres que tu menú contextual funcione en varios alcances, debes duplicar la opción de menú contextual y volver a definir el parámetro de alcance para cada alcance.

const otherDeleteOption = {...deleteOption};
otherDeleteOption.scopeType = Blockly.ContextMenuRegistry.ScopeType.COMMENT;

Texto visible

displayText es lo que se debe mostrar al usuario como parte de la opción del menú. El texto visible puede ser una cadena, HTML o una función que muestra una cadena o HTML.

const deleteOption = {
  displayText: 'Delete block',
};

Si deseas mostrar una traducción del Blockly.Msg, debes usar una función. Si intentas asignar el valor de forma directa, es posible que los mensajes no se cargan y que recibas un valor de undefined en su lugar.

const deleteOption = {
  displayText: () => Blockly.Msg['MY_DELETE_OPTION_TEXT'],
};

Si usas una función, también se le pasa un valor Scope, que te brinda acceso al elemento con el que está asociado el menú contextual (p.ej., el bloque o el lugar de trabajo). Puedes usar esto para agregar información sobre el elemento a tu texto visible.

const deleteOption = {
  displayText: (scope) => `Delete ${scope.block.type} block`,
}

Peso

El weight determina el orden en el que se muestran los elementos del menú contextual. Los valores más positivos se muestran en los niveles inferiores de la lista que los menos positivos. (Puedes imaginar que las opciones con pesos más altos son "más pesadas", por lo que se hunde hasta el fondo).

const deleteOption = {
  weight: 10;
}

Los pesos de las opciones del menú contextual integradas van en orden creciente a partir de 1 y, luego, en 1.

Condición previa

Además del scopeType, puedes usar el preconditionFn para restringir cuándo y cómo se debe mostrar una opción de menú contextual.

Debe mostrar uno de un conjunto de cadenas: 'enabled', 'disabled' o 'hidden'.

Valor Descripción De imagen
habilitado Muestra que la opción está activa. Una opción habilitada
inhabilitado Muestra que la opción no está activa. Una opción inhabilitada
de pesos Oculta la opción.

A preconditionFn también se le pasa un Scope que puedes usar para determinar el estado de tu opción.

const deleteOption = {
  preconditionFn: (scope) => {
    if (scope.block.isDeletable()) {
      return 'enabled';
    }
    return 'disabled';
  }
}

Devolución de llamada

La propiedad callback realiza la acción del elemento de menú contextual. Le pasa un Scope y un PointerEvent. El PointerEvent es el evento original que activó la apertura del menú contextual, no el que seleccionó una opción. Puedes usar el evento para averiguar dónde se produjo el clic. Esto te permite, por ejemplo, crear un bloque nuevo en la ubicación del clic.

const deleteOption = {
  callback: (scope, e) => {
    scope.block.dispose();
  }
}

Registro

Para utilizar la opción de menú contextual, debes registrarla. Debes hacer esto una vez cuando se carga la página. Puede ocurrir antes o después de inyectar el espacio de trabajo.

const deleteOption = { /* implementations from above */ };
Blockly.ContextMenuRegistry.registry.register(deleteOption);

Modificar opciones por tipo de bloque

Los bloques tienen una forma adicional de modificar los menús contextuales, que consiste en reemplazar su propiedad customContextMenu. Este método toma un array de objetos ContextMenuOption (que se recopilan de los elementos de menú registrados) y, luego, modifica ese array en su lugar para determinar el conjunto final de opciones que se muestran.

Para obtener más información, consulta Define bloques, menús contextuales personalizados.

Los lugares de trabajo también tienen un método configureContextMenu que funciona de manera similar.

Cómo quitar una opción

Para quitar una opción del menú contextual, puedes cancelar el registro por ID.

Blockly.ContextMenuRegistry.registry.unregister('someID');

Los ID para las opciones predeterminadas se encuentran en contextmenu_items.ts.

Cómo modificar una opción

Para modificar una opción existente, obtén el elemento del registro y, luego, modifícalo en su ubicación.

const option = Blockly.ContextMenuRegistry.registry.getItem('someID');
option?.displayText = 'some other display text';