Trascinabile

Un oggetto trascinabile è un oggetto visualizzato che esiste nell'area di lavoro e può essere trascinato. Implementano l'interfaccia IDraggable.

Ci sono pochissime circostanze in cui potresti voler aggiungere un nuovo elemento trascinabile in Blockly (ad es. il plug-in Multiselect o la modifica del modo in cui un oggetto esistente gestisce il trascinamento) perché non è possibile aggiungere nuovi oggetti visualizzati a Blockly. Gli unici oggetti visualizzati che possono esistere all'interno di un'area di lavoro sono blocchi, bolle e commenti dell'area di lavoro.

Responsabilità

I trascinabili hanno diverse responsabilità durante l'esecuzione dei trascinamento:

Implementazione

Per creare un nuovo elemento trascinabile, devi implementare le interfacce IRenderedElement e IDraggable. Questo indica a Blockly che l'oggetto è visibile e può essere trascinato.

class MyDraggable extends IRenderedElement, IDraggable {}

Restituisci l'elemento SVG principale

Il metodo getRootSvg restituisce l'elemento svg principale (di solito un gruppo) che contiene tutti gli altri elementi che costituiscono la vista per l'elemento trascinabile.

getSvgRoot() {
  return this.rootSvg;
}

Spostabilità dei resi

Il metodo isMovable indica se il trascinamento è attualmente spostabile (poiché potresti voler disattivare temporaneamente il trascinamento di un oggetto). Se isMovable restituisce false, l'area di lavoro viene trascinata.

isMovable() {
  return true;
}

Posizione di ritorno

Il metodo getRelativeToSurfaceXY restituisce un elemento Coordinate che specifica la posizione dell'angolo superiore iniziale della finestra trascinabile nelle coordinate dell'area di lavoro.

Le coordinate dell'area di lavoro hanno un'origine in assoluto a sinistra e in alto dell'area di lavoro. Inoltre, non cambiano quando l'area di lavoro viene scalata o spostata.

getRelativeToSurfaceXY() {
  return this.loc;
}

Avvia trascinamento

Il metodo startDrag inizializza un elemento di trascinamento. Con questo metodo non sposta il file trascinabile. Dovresti però archiviare tutti i dati o costruire gli oggetti necessari per completare il trascinamento. Sono inclusi tutti i dati necessari per ripristinare il trascinamento se viene chiamato revertDrag.

Inoltre, gli elementi svg devono essere impostati sul livello di trascinamento dell'area di lavoro in modo che siano al di sopra di qualsiasi altro elemento.

Prende anche un evento, che puoi usare per verificare la presenza di tasti premuti. Questo consente, ad esempio, di trattare un attacco mentre ci si sposta in modo diverso rispetto a un normale trascinamento.

startDrag(e) {
  // Save the original location so we can revert the drag.
  this.startLoc = this.getRelativeToSurfaceXY();

  // Disable resizing the workspace for performance.
  this.workspace.setResizesEnabled(false);

  // Put the element on the drag layer.
  this.workspace.getLayerManager()?.moveToDragLayer(this);

  // Fire a drag event...

  // etc...
}

Resistenza aerodinamica

Il metodo drag sposta effettivamente l'oggetto trascinabile. newLoc si trova nelle coordinate dell'area di lavoro ed è presente anche un evento trasmesso che puoi utilizzare per verificare la presenza di tasti premuti.

drag(newLoc, e) {
  this.moveTo(newLoc);
}

Ripristina trascinamento

Il metodo revertDrag restituisce il file trascinabile nella posizione in cui si trovava all'inizio del trascinamento. Questo accade se, ad esempio, l'elemento trascinabile viene rilasciato su un target di trascinamento che impedisce il movimento.

revertDrag() {
  // Move back to the position that was stored in `startDrag`.
  this.moveTo(this.startLoc);
}

Termina trascinamenti

Il metodo endDrag ripulisce un'operazione di trascinamento, rilasciando eventuali dati o oggetti archiviati e restituendo l'elemento trascinabile al livello originale.

endDrag viene sempre chiamato dopo revertDrag se viene chiamato revertDrag.

endDrag() {
  // Put the element back on its original layer (in this case BLOCK).
  this.workspace
    .getLayerManager()
    ?.moveOffDragLayer(this, Blockly.layers.BLOCK);

  // Allow the workspace to start resizing again.
  this.workspace.setResizesEnabled(true);
}

Selezione

L'elemento che viene trascinato è determinato dall'elemento selezionato quando viene rilevato un trascinamento.

ISelectable

Per essere selezionata, un elemento trascinabile deve implementare l'interfaccia ISelectable.

class MyDraggable implements ISelectable {
  constructor(workspace) {
    this.id = Blockly.utils.idGenerator.genUid();
    this.workspace = workspace;
  }

  select() {
    // Visually indicate this draggable is selected.
  }

  unselect() {
    // Visually indicate this draggable is not selected.
  }
}

Imposta selezione

L'elemento selezionato può essere impostato chiamando Blockly.common.setSelected(). in genere devi eseguire questa operazione in risposta a un evento pointerdown dell'utente.

  constructor() {
    this.initSvg();

    Blockly.browserEvents.conditionalBind(
      this.getSvgRoot(),
      'pointerdown',
      this,
      () => Blockly.common.setSelected(this));
  }

Compatibilità

L'elemento trascinabile può implementare interfacce aggiuntive in modo da poter interagire con altri sistemi in Blockly.

Eliminabile

Puoi implementare l'interfaccia IDeleteable per consentire che il file trascinabile venga eliminato dal cestino o da altre destinazioni di eliminazione.

class MyDraggable implements IDeletable {
  isDeletable() {
    return true;
  }

  dispose() {
    // Dispose of any references to data or SVG elements.
  }

  setDeleteStyle() {
    // Visually indicate that the draggable is about to be deleted.
  }
}

Copiabili

Puoi implementare l'interfaccia ICopyable per consentire la copia del file trascinabile e definire un IPaster per consentirne l'incollamento.

Per ulteriori informazioni su come copiare e incollare, consulta Copiare e incollare.