Verbindungsformen

Es gibt mehrere Möglichkeiten, das Aussehen von Verbindungen anzupassen. und zunehmender Schwierigkeitsgrad. Sie alle müssen ein benutzerdefinierten Renderer.

Grundlegende Dimensionen

Verbindungen mit unterschiedlichen Dimensionen

Sie können Verbindungen anpassen, indem Sie ihre Breite oder Höhe ändern, die Grundform beibehalten. Dazu müssen Sie ein benutzerdefinierten Konstantenanbieter-Komponente und einige Konstanten überschreiben.

Unterschiedliche Renderer definieren und verwenden unterschiedliche Konstanten. Sehen Sie sich die Referenzdokumentation für Ihre Superklasse:

Für den Basis-Renderer können Sie NOTCH_WIDTH überschreiben und NOTCH_HEIGHT für nächste und vorherige Verbindungen und TAB_WIDTH und TAB_HEIGHT für Ein- und Ausgabe Verbindungen.

class CustomConstantProvider extends Blockly.blockRendering.ConstantProvider {
  constructor() {
    super();
    this.NOTCH_WIDTH = 20;
    this.NOTCH_HEIGHT = 10;
    this.TAB_HEIGHT = 8;
  }
}

Grundformen

Verbindungen mit verschiedenen Formen

Sie können Verbindungen anpassen, indem Sie ihre Grundform überschreiben. Grundformen eine Höhe, eine Breite und zwei Pfade.

Bei jedem Pfad wird dieselbe Form gezeichnet, jedoch von den anderen Enden aus!

eine Auskerbung aus beiden Richtungen

Dies ist notwendig, denn wenn die Leiste den Umriss des wird jede Art von Verbindung in beide Richtungen gezeichnet. Beispiel: Vorherige Verbindungen werden von links nach rechts gezeichnet, die nächsten Verbindungen von rechts nach links gezogen werden. Sie müssen also Pfade für beide für diese Fälle.

die Richtung, in die ein Block eingezeichnet wird

Sie können die makeNotch-Methode für die nächste und vorherige Sitzung überschreiben. Verbindungen und die makePuzzleTab-Methode für Eingabe- und Ausgangsverbindungen.

class CustomConstantProvider extends Blockly.blockRendering.ConstantProvider {
  makePuzzleTab() {
    const width = this.TAB_WIDTH;
    const height = this.TAB_HEIGHT;
    return {
      type: this.SHAPES.PUZZLE,
      width,
      height,
      pathUp: Blockly.utils.svgPaths.line([
          Blockly.utils.svgPaths.point(-width, -height / 2),
          Blockly.utils.svgPaths.point(width, -height / 2)]),
      pathDown: Blockly.utils.svgPaths.line([
          Blockly.utils.svgPaths.point(-width, height / 2),
          Blockly.utils.svgPaths.point(width, height / 2)]),
    };
  }
}

In der Dokumentation zum MDN-SVG-Pfad erfahren Sie, wie Sie um Pfadzeichenfolgen zu definieren. Der Namespace Blockly.utils.svgPaths wird bereitgestellt als dünner Wrapper um diese Zeichenfolgen, um sie besser lesbar zu machen.

Formen für Verbindungsprüfungen

Verschiedene Verbindungen mit unterschiedlichen Formen

Sie können Verbindungen anpassen, indem Sie die Form basierend auf den Verbindungsprüfung durchführen.

Auf diese Weise können Sie verschiedene Formen erstellen, um verschiedene Datentypen darzustellen. So könnten Strings durch dreieckige Verbindungen dargestellt werden, während Boolesche Werte werden durch runde Verbindungen dargestellt.

Um verschiedene Formen für verschiedene Verbindungsprüfungen bereitzustellen, müssen Sie Methode shapeFor Die zurückgegebenen Formen sollten initialisiert werden. in „init“.

Unter Basisformen finden Sie Informationen dazu, welche Arten von Formen Formen werden unterstützt.

export class ConstantProvider extends Blockly.blockRendering.BaseConstantProvider {
  shapeFor(connection) {
    let check = connection.getCheck();
    // For connections with no check, match any child block.
    if (!check && connection.targetConnection) {
      check = connection.targetConnection.getCheck();
    }

    if (check && check.includes('String')) return this.TRIANGULAR_TAB;
    if (check && check.includes('Boolean')) return this.ROUND_TAB;

    return super.shapeFor(connection);
  }
}

Benutzerdefinierte Eingaben

Sie können Verbindungsformen anpassen, indem Sie eine vollständig benutzerdefinierte Eingabe erstellen. Dieses wird nur erstellt, wenn Sie möchten, dass einige Verbindungen sich von anderen unterscheiden, das nicht auf der Verbindungsprüfung basieren soll.

Wenn z. B. einige Werteingaben wie Anweisungseingaben eingerückt werden sollen, können Sie eine benutzerdefinierte Eingabe erstellen.

Benutzerdefinierte Eingabeklasse erstellen

Folgen Sie der Anleitung zum Erstellen einer benutzerdefinierten Eingabe.

Einen messbaren

Sie müssen ein messbares Element erstellen, das Ihre benutzerdefinierte Eingabe darstellt.

Ihre benutzerdefinierte, messbare Eingabe sollte von Blockly.blockRendering.InputConnection Sie können auch Messdaten, die Sie benötigen, um die Form der Eingabe zu zeichnen.

export class CustomInputMeasurable extends Blockly.blockRendering.InputConnection {
  constructor(constants, input) {
    super(constants, input);

    // Any extra measurement data...
  }
}

Messbare Werte instanziieren

Ihre Renderinginformationen müssen Ihre benutzerdefinierten messbar sind. Dazu müssen Sie die Methode addInput_ überschreiben.

export class RenderInfo extends Blockly.blockRendering.RenderInfo {
  addInput_(input, activeRow) {
    if (input instanceof CustomInput) {
      activeRow.elements.push(new CustomInputMeasurable(this.constants_, input));
    }
    super.addInput_(input, activeRow);
  }
}

Optional: Zeile erstellen

Standardmäßig werden durch Eingaben keine neuen Zeilen erstellt. Wenn Sie Ihre Eingabe um das Ende einer Zeile auszulösen, müssen Sie den shouldStartNewRow_-Methode Ihres Informationen zum Rendern.

export class RenderInfo extends Blockly.blockRendering.RenderInfo {
  shouldStartNewRow_(currInput, prevInput) {
    if (prevInput instanceof CustomInput) return true;
    return super.shouldStartNewRow_(currInput, prevInput);
  }
}

Optional: Form für Ihre Eingabe erstellen

Es empfiehlt sich, die Form Ihres Inputs in einer konstanten für Kerben und Puzzle-Registerkarten. So bleibt Ihr Code organisiert und später leichter ändern können.

Eingabe zeichnen

Zum Schluss müssen Sie noch Ihre Leiste ändern, um die Form zu zeichnen.

Für benutzerdefinierte Eingaben gibt es folgende Optionen:

  • Sie können den Umriss Ihres Blocks beeinflussen, z. B. Anweisungseingaben

    Bild der Outline-Eingaben

  • Oder wirken sich auf das Innere des Blocks aus, z. B. die Inline-Werteingaben

    Bild interner Eingaben

Wenn sich die Eingabe auf den Umriss des Blocks auswirkt, überschreiben Sie drawOutline_, andernfalls überschreiben drawInternals_

export class Drawer extends Blockly.blockRendering.Drawer {
  drawOutline_() {
    this.drawTop_();
    for (let r = 1; r < this.info_.rows.length - 1; r++) {
      const row = this.info_.rows[r];

      // Insert checks for your input here!
      if (row.getLastInput() instanceof CustomInputMeasurable) {
        this.drawCustomInput(row);
      } else if (row.hasJaggedEdge) {
        this.drawJaggedEdge_(row);
      } else if (row.hasStatement) {
        this.drawStatementInput_(row);
      } else if (row.hasExternalInput) {
        this.drawValueInput_(row);
      } else {
        this.drawRightSideRow_(row);
      }
    }
    this.drawBottom_();
    this.drawLeft_();
  }

  protected drawInternals_() {
    for (const row of rows) {
      for (const elem of row) {

        // Insert checks for your input here!
        if (elem instanceof CustomInputMeasurable) {
          this.drawCustomInput(elem);
        }

        if (Types.isInlineInput(elem)) {
          this.drawInlineInput_(elem as InlineInput);
        } else if (Types.isIcon(elem) || Types.isField(elem)) {
          this.layoutField_(elem as Field | Icon);
        }
      }
    }
  }
}