Menu contestuali

Un menu contestuale contiene un elenco di azioni che puoi eseguire in relazione ad alcuni elementi nell'area di lavoro. Viene mostrato un menu contestuale con i clic effettuati con il tasto destro del mouse e le pressioni prolungate.

Il menu contestuale predefinito di un blocco

Puoi creare un'opzione di menu contestuale personalizzata se vuoi aggiungere un nuovo tipo di azione che l'utente può eseguire. Ad esempio, puoi organizzare tutti i blocchi nell'area di lavoro o scaricare un'immagine dei blocchi. Se ritieni che l'azione sarà usata raramente, il menu contestuale è la scelta giusta. In caso contrario, puoi creare un modo più rilevabile per accedere all'azione.

Implementa una nuova opzione

Per implementare una nuova opzione di menu contestuale, devi soddisfare l'interfaccia di RegistryItem.

ID

La proprietà id deve essere una stringa univoca che indica la funzione dell'opzione del menu contestuale.

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

Ambito

La proprietà scopeType indica a Blockly in quale contesto potrebbe essere mostrata l'opzione di menu e quali informazioni trasmettere ai relativi displayText, preconditionFn e callback. I menu contestuali possono limitare l'ambito a blocchi, commenti dell'area di lavoro e aree di lavoro.

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

Se vuoi che il menu contestuale funzioni in più ambiti, devi duplicare l'opzione del menu contestuale e ridefinire il parametro di ambito per ogni ambito.

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

Testo visualizzato

displayText è ciò che deve essere mostrato all'utente nell'ambito dell'opzione del menu. Il testo visualizzato può essere una stringa, un HTML o una funzione che restituisce una stringa o un codice HTML.

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

Se vuoi visualizzare una traduzione da Blockly.Msg devi utilizzare una funzione. Se provi ad assegnare direttamente il valore, i messaggi potrebbero non essere caricati e verrà visualizzato il valore undefined.

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

Se utilizzi una funzione, viene trasmesso anche un valore Scope che ti consente di accedere all'elemento a cui è associato il menu contestuale, ad esempio blocco o area di lavoro. Puoi utilizzarla per aggiungere informazioni sull'elemento al testo visualizzato.

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

Peso

L'weight determina l'ordine in cui vengono visualizzate le voci del menu contestuale. I valori più positivi vengono visualizzati più in basso nell'elenco rispetto a quelli meno positivi. Puoi immaginare che le opzioni con pesi più alti siano "più pesanti" in modo che affondano verso il basso.

const deleteOption = {
  weight: 10;
}

Le ponderazioni per le opzioni del menu contestuale integrate sono in ordine crescente, a partire da 1 e aumentandole di 1.

Precondition

Oltre a scopeType, puoi utilizzare preconditionFn per limitare quando e come deve essere visualizzata un'opzione del menu contestuale.

Dovrebbe essere restituito un insieme di stringhe: 'enabled', 'disabled' o 'hidden'.

Valore Descrizione Immagine
abilitata Indica che l'opzione è attiva. Un'opzione attivata
disabilitato Indica che l'opzione non è attiva. Un'opzione disattivata
nascosto Nasconde l'opzione.

preconditionFn riceve anche un Scope che puoi utilizzare per determinare lo stato dell'opzione.

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

Richiamata

La proprietà callback esegue l'azione indicata dalla voce del menu contestuale. È stato superato un Scope e un PointerEvent. PointerEvent è l'evento originale che ha attivato l'apertura del menu contestuale, non l'evento che ha selezionato un'opzione. Puoi utilizzare l'evento per capire dove è avvenuto il clic. Ad esempio, puoi creare un nuovo blocco nel punto in cui l'utente fa clic.

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

Iscrizione

Per utilizzare l'opzione del menu contestuale, devi registrarla. Devi eseguire questa operazione al caricamento della pagina. Può accadere prima o dopo l'inserimento nell'area di lavoro.

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

Modifica le opzioni per tipo di blocco

I blocchi offrono un metodo aggiuntivo per modificare i menu contestuali, ovvero sovrascrivere la proprietà customContextMenu corrispondente. Questo metodo prende un array di oggetti ContextMenuOption (combinati dalle voci di menu registrate) e modifica l'array esistente per determinare l'insieme finale di opzioni visualizzate.

Per ulteriori informazioni, consulta Definire blocchi, menu contestuali personalizzati.

Le aree di lavoro hanno anche un metodo configureContextMenu che funziona in modo simile.

Rimuovere un'opzione

Puoi rimuovere un'opzione dal menu contestuale annullando la registrazione in base all'ID.

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

Gli ID delle opzioni predefinite sono in contextmenu_items.ts.

Modificare un'opzione

Puoi modificare un'opzione esistente recuperando l'elemento dal registro e modificandolo nella posizione.

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