Forme di connessione

Esistono diversi modi per personalizzare l'aspetto delle connessioni, ciascuno con difficoltà sempre più numerose. Tutte richiedono la creazione di un renderer personalizzato.

Dimensioni di base

connessioni con dimensioni diverse

Puoi personalizzare le connessioni modificando la larghezza o l'altezza, mentre mantenendo la stessa forma di base. Per farlo, devi creare un componente costante del provider personalizzato e sostituire alcune costanti.

Renderer diversi definiscono e utilizzano costanti diverse, quindi controlla documentazione di riferimento per la tua super classe:

di Gemini Advanced.

Per il renderer di base, puoi eseguire l'override di NOTCH_WIDTH e NOTCH_HEIGHT per le connessioni successive e precedenti e TAB_WIDTH e TAB_HEIGHT per l'input e l'output e connessioni a Internet.

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

Forme di base

connessioni con forme diverse

Puoi personalizzare le connessioni sostituendo la loro forma di base. Forme di base hanno altezza, larghezza e due percorsi.

Ogni percorso traccia la stessa forma, ma da estremità opposte.

un incavo tracciato da entrambe le direzioni

Questa operazione è necessaria perché il riquadro a scomparsa traccia il contorno del blocca, traccia ogni tipo di connessione in entrambe le direzioni. Ad esempio: le connessioni precedenti vengono tracciate da sinistra a destra, mentre quelle successive disegnate da destra a sinistra. Devi quindi fornire percorsi sia per questi casi.

la direzione in cui viene disegnato un blocco

Puoi eseguire l'override del metodo makeNotch per i campi avanti e precedenti e il metodo makePuzzleTab per l'input di output.

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

Per informazioni su come fare, consulta la documentazione sul percorso MDN SVG per definire le stringhe del percorso. È stato fornito lo spazio dei nomi Blockly.utils.svgPaths come un sottile wrapper attorno a queste stringhe per renderle più leggibili.

Forme per i controlli della connessione

connessioni diverse con forme diverse

Puoi personalizzare le connessioni modificando la forma in base alla controllo della connessione.

In questo modo puoi creare forme diverse per rappresentare diversi tipi di dati. Ad esempio, le stringhe potrebbero essere rappresentate da connessioni triangolari, mentre I valori booleani sono rappresentati da connessioni rotonde.

Per specificare forme diverse per controlli della connessione differenti, è necessario eseguire l'override il metodo shapeFor. Le forme restituite devono essere inizializzate a init.

Consulta le forme di base per avere informazioni sui tipi di sono supportate.

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

Input personalizzati

Puoi personalizzare le forme delle connessioni creando un input interamente personalizzato. Questo puoi eseguire questa operazione solo se vuoi che alcune connessioni abbiano un aspetto diverso dalle altre, in modo che non si basi sul controllo della connessione.

Ad esempio, se vuoi che alcuni input di valori siano rientrati come input di istruzioni, puoi creare un input personalizzato a supporto.

Crea una classe di input personalizzata

Segui i passaggi per creare un input personalizzato.

Crea un modello misurabile

Devi creare un valore misurabile per rappresentare il tuo input personalizzato.

L'input personalizzato misurabile deve ereditare Blockly.blockRendering.InputConnection Può anche includere i dati di misurazione aggiuntivi di cui hai bisogno per tracciare la forma dell'input.

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

    // Any extra measurement data...
  }
}

Crea un'istanza per la tua metrica

Le informazioni di rendering devono creare un'istanza del tuo misurabile. Per farlo, devi eseguire l'override del metodo addInput_.

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

Se vuoi, puoi creare una riga

Per impostazione predefinita, gli input non creano nuove righe. Se vuoi il tuo input per attivare la fine di una riga, devi sostituire il valore shouldStartNewRow_ del tuo informazioni di rendering.

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

Se vuoi, crea una forma per l'input

È una buona idea memorizzare la forma dell'input in una costante, proprio come per gli tacche e le schede dei rompicapi. In questo modo il codice è organizzato e semplificarne la modifica in un secondo momento.

Traccia l'input

Infine, devi modificare il cassetto per tracciare la forma.

Gli input personalizzati possono:

  • Influisce sulla struttura del blocco, ad esempio gli input delle dichiarazioni

    immagine degli input Outline

  • Oppure influire sugli elementi interni del blocco, ad esempio sugli input dei valori in linea

    immagine degli input interni

Se l'input influisce sulla struttura del blocco, sostituisci drawOutline_, altrimenti, sostituisci 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);
        }
      }
    }
  }
}