Benutzerdefinierte ziehbare Elemente

Ein ziehbares Element ist ein gerendertes Objekt, das sich im Arbeitsbereich befindet und per Drag-and-drop verschoben werden kann. Sie implementieren die IDraggable-Schnittstelle.

Es gibt nur sehr wenige Fälle, in denen Sie Blockly ein neues ziehbares Element hinzufügen möchten, z. B. das Plugin für die Mehrfachauswahl oder wenn Sie ändern möchten, wie ein vorhandenes Objekt Ziehvorgänge verarbeitet. Das liegt daran, dass Sie Blockly keine neuen gerenderten Objekte hinzufügen können. Die einzigen gerenderten Objekte, die in einem Arbeitsbereich vorhanden sein können, sind Blöcke, Sprechblasen und Arbeitsbereichskommentare.

Zuständigkeiten

Drag-Objekte haben beim Ausführen von Drag-Vorgängen mehrere Aufgaben:

  • SVG-Elemente werden auf die Drag-Ebene verschoben.
  • SVG-Elemente übersetzen
  • Bewegungs-Ereignisse auslösen

Implementierung

Wenn Sie ein neues ziehbares Element erstellen möchten, müssen Sie die Schnittstellen IRenderedElement und IDraggable implementieren. So weiß Blockly, dass Ihr Objekt sichtbar ist und gezogen werden kann.

class MyDraggable extends IRenderedElement, IDraggable {}

Gibt das SVG-Stammelement zurück.

Die Methode getRootSvg gibt das SVG-Stammelement (in der Regel eine Gruppe) zurück, das alle anderen Elemente enthält, aus denen die Ansicht für das ziehbare Element besteht.

getSvgRoot() {
  return this.rootSvg;
}

Rückgabeberechtigung

Die isMovable-Methode gibt zurück, ob das ziehbare Element derzeit verschiebbar ist. Möglicherweise möchten Sie das Ziehen eines Objekts vorübergehend deaktivieren. Wenn isMovable false zurückgibt, wird stattdessen der Arbeitsbereich gezogen.

isMovable() {
  return true;
}

Rückgabeposition

Die Methode getRelativeToSurfaceXY gibt ein Coordinate zurück, das die Position der oberen linken Ecke des ziehbaren Elements in Arbeitsbereichskoordinaten angibt.

Die Koordinaten des Arbeitsbereichs haben ihren Ursprung ganz links und ganz oben im Arbeitsbereich. Sie ändern sich auch nicht, wenn der Arbeitsbereich skaliert oder verschoben wird.

getRelativeToSurfaceXY() {
  return this.loc;
}

Ziehen starten

Die Methode startDrag initialisiert einen Drag-Vorgang für das ziehbare Element. Bei dieser Methode wird das ziehbare Element nicht verschoben. Sie sollten jedoch alle Daten speichern oder alle Objekte erstellen, die Sie zum Ausführen des Ziehens benötigen. Dazu gehören alle Daten, die Sie benötigen, um den Drag rückgängig zu machen, wenn revertDrag aufgerufen wird.

Außerdem sollten die SVG-Elemente in die Drag-Ebene des Arbeitsbereichs verschoben werden, damit sie über allen anderen Elementen liegen.

Außerdem wird ein Ereignis übergeben, mit dem Sie prüfen können, ob Tasten gedrückt wurden. So können Sie beispielsweise einen Drag beim Schalten anders behandeln als einen normalen Drag.

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...
}

Ziehen

Die Methode drag verschiebt das ziehbare Objekt. Die newLoc befindet sich in Arbeitsbereichskoordinaten. Außerdem wird ein Ereignis übergeben, mit dem Sie prüfen können, ob Tasten gedrückt wurden.

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

Ziehen rückgängig machen

Die Methode revertDrag setzt das ziehbare Element auf die Position zurück, die es zu Beginn des Ziehens hatte. Das passiert beispielsweise, wenn das ziehbare Element auf einem Drag-Ziel abgelegt wird, das Bewegungen verhindert.

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

Ziehen beenden

Mit der Methode endDrag wird ein Ziehvorgang beendet. Dabei werden alle gespeicherten Daten oder Objekte freigegeben und das ziehbare Element wird auf seine ursprüngliche Ebene zurückgesetzt.

endDrag wird immer nach revertDrag aufgerufen, wenn revertDrag aufgerufen wird.

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);
}

Auswahl

Das Element, das gezogen wird, wird durch das Element bestimmt, das ausgewählt ist, wenn ein Ziehen erkannt wird.

ISelectable

Damit ein Element ausgewählt werden kann, muss es die ISelectable-Schnittstelle implementieren.

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.
  }
}

Auswahl festlegen

Das ausgewählte Element kann durch Aufrufen von Blockly.common.setSelected() festgelegt werden. Normalerweise sollten Sie dies als Reaktion auf ein pointerdown-Ereignis des Nutzers tun.

  constructor() {
    this.initSvg();

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

Kompatibilität

Ihr ziehbares Element kann zusätzliche Schnittstellen implementieren, damit es mit anderen Systemen in Blockly interagieren kann.

Löschbar

Sie können die IDeleteable-Schnittstelle implementieren, damit Ihr ziehbares Element vom Papierkorb oder anderen Löschzielen entsorgt werden kann.

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.
  }
}

Kopierbar

Sie können die ICopyable-Schnittstelle implementieren, damit das ziehbare Element kopiert werden kann, und ein IPaster definieren, damit es eingefügt werden kann.

Weitere Informationen zum Kopieren und Einfügen finden Sie unter Kopieren und Einfügen.