Bağlantı şekilleri

Bağlantıların görünüşünü özelleştirmenin birkaç yolu vardır. Her biri zorluk artar. Tüm bunların kullanılabilmesi için bir özel oluşturucu.

Temel boyutlar

farklı boyutlardaki bağlantılar

Bağlantıları, genişliklerini veya yüksekliklerini değiştirerek özelleştirebilirsiniz. korunduğundan emin olun. Bunu yapmak için, bir özel sabit sağlayıcı bileşeni oluşturup bazı sabit değerleri geçersiz kılar.

Farklı oluşturucular farklı sabit değerler tanımlar ve kullanır. Bu nedenle referans belgeler:

ziyaret edin.

Temel oluşturucu için NOTCH_WIDTH ve Sonraki ve önceki bağlantılar için NOTCH_HEIGHT ve Giriş ve çıkış için TAB_WIDTH ve TAB_HEIGHT bağlantılar.

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

Temel şekiller

farklı şekillere sahip bağlantılar

Temel şekillerini geçersiz kılarak bağlantıları özelleştirebilirsiniz. Temel şekiller bir yükseklik, bir genişlik ve iki yolu vardır.

Her yol aynı şekli çizer ama zıt uçlardan oluşur.

iki yönden alınan bir çentik

Bu gereklidir çünkü çekmece her tür bağlantıyı her iki yönde de çeker. Örneğin, önceki bağlantılar soldan sağa doğru çizilir, ancak sonraki bağlantılar sağdan sola doğru çizilir. Bu nedenle, her iki yöntem için de bu tür durumlar buna örnektir.

bir bloğun çizildiği yön

Sonraki ve önceki için makeNotch yöntemini geçersiz kılabilirsiniz ve giriş ve çıkış için makePuzzleTab yöntemi çıkış bağlantıları ekleyin.

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

Nasıl yapılacağıyla ilgili bilgi edinmek için MDN SVG yolu dokümanlarına bakın kullanabilirsiniz. Blockly.utils.svgPaths ad alanı sağlanır dizeleri daha okunabilir hale getirmek için ince bir sarmalayıcı olarak yerleştirir.

Bağlantı kontrolleri için şekiller

farklı şekillere sahip farklı bağlantılar

Bağlantının şekline göre şekli değiştirerek bağlantıları özelleştirebilirsiniz. bağlantı kontrolünden yararlanabilirsiniz.

Bu sayede farklı veri türlerini temsil edecek farklı şekiller oluşturabilirsiniz. Örneğin, dizeler üçgen bağlantılarla temsil edilirken, boole değerleri yuvarlak bağlantılarla temsil edilir.

Farklı bağlantı kontrolleri için farklı şekiller sağlamak isterseniz shapeFor yöntemini kullanır. Döndürülen şekiller başlatılmalıdır init içinde.

Etkinlik türleri hakkında bilgi için temel şekillere bakın. şekiller destekleniyor.

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

Özel girişler

Tamamen özel bir giriş oluşturarak bağlantı şekillerini özelleştirebilirsiniz. Bu yalnızca bazı bağlantıların diğerlerinden farklı görünmesini istiyorsanız yapılır, bağlantı kontrolüne dayalı olmasını istemediğinizden emin olun.

Örneğin, bazı değer girişlerinin, ifade girişleri gibi girintili olmasını istiyorsanız bunu destekleyecek özel bir giriş oluşturabilirsiniz.

Özel giriş sınıfı oluşturma

Özel giriş oluşturma adımlarını uygulayın.

Ölçülebilir veriler oluşturun

Özel girişinizi temsil eden bir ölçülebilir öğe oluşturmanız gerekir.

Ölçülebilir özel girişiniz, şuradan devralınmalıdır: Blockly.blockRendering.InputConnection. Ayrıca girdinin şeklini çizmek için ihtiyacınız olan ekstra ölçüm verilerini içerebilir.

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

    // Any extra measurement data...
  }
}

Ölçülebilir gösterimlerinizi

Oluşturma bilgilerinizin, özel oluşturma işleminizi örneklendirmesi gerekir ölçülebilir. Bunu yapmak için addInput_ yöntemini geçersiz kılmanız gerekir.

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

İsteğe bağlı olarak bir satır oluşturun

Varsayılan olarak girişler yeni satır oluşturmaz. Geri bildirimlerinizi bir satırın sonunu tetiklemek için, shouldStartNewRow_ yönteminiz oluşturma bilgilerini kullanın.

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

İsteğe bağlı olarak girişiniz için bir şekil oluşturun

Girişinizin şeklini tıpkı bir önceki gibi bulmaca sekmeleri için çok benzer. Bu, kodunuzu düzenli tutar ve bunları daha sonra kolayca değiştirebilirsiniz.

Girdiyi çizin

Son olarak, şekli çizmek için çekmecenizi değiştirmeniz gerekir.

Özel girişler:

  • Blokunuzun ana hatlarını (ör. ifade girişleri) etkiler

    dış çizgi girişlerinin resmi

  • Alternatif olarak, satır içi değer girişleri gibi blokunuzun dahili unsurlarını da etkileyebilirsiniz

    dahili girişlerin resmi

Giriş blokunuzun ana hatlarını etkiliyorsa drawOutline_, aksi takdirde geçersiz kıl 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);
        }
      }
    }
  }
}