Sürüklenebilir

Sürüklenebilir öğe, çalışma alanında bulunan ve sürüklenip bırakılabilen oluşturulmuş bir nesnedir. IDraggable arayüzünü uygular.

Blockly'ye yeni bir sürüklenebilir öğe ekleyemeyeceğiniz için çok az durumda (ör. multiselect eklentisi veya mevcut bir nesnenin sürükleme işlemlerini değiştirme) sürüklenebilir öğe eklemek isteyebilirsiniz. Bir çalışma alanı içinde oluşturulmuş nesneler yalnızca bloklar, balonlar ve çalışma alanı yorumlarıdır.

Sorumluluklar

Sürüklenebilir öğelerin, sürüklemeleri yürütürken çeşitli sorumlulukları vardır:

Uygulama

Yeni bir sürüklenebilir öğe oluşturmak için IRenderedElement ve IDraggable arayüzlerini uygulamanız gerekir. Bu şekilde Blockly, nesnenizin görünür olduğunu ve sürüklenebileceğini bilir.

class MyDraggable extends IRenderedElement, IDraggable {}

Kök SVG öğesini döndürme

getRootSvg yöntemi, sürüklenebilir öğenin görünümünü oluşturan diğer tüm öğeleri barındıran kök svg öğesini (genellikle bir grup) döndürür.

getSvgRoot() {
  return this.rootSvg;
}

İade taşınabilirliği

isMovable yöntemi, sürüklenebilir öğenin o anda taşınabilir olup olmadığını döndürür (nesnenin sürüklenmesini geçici olarak devre dışı bırakmak isteyebileceğiniz için). isMovable değeri false değerini döndürürse çalışma alanı sürüklenir.

isMovable() {
  return true;
}

Dönüş konumu

getRelativeToSurfaceXY yöntemi, çalışma alanı koordinatlarında sürüklenebilir öğenin üst başlangıç köşesinin konumunu belirten bir Coordinate döndürür.

Çalışma alanı koordinatlarının başlangıç noktası, çalışma alanının mutlak sol ve mutlak üst noktasındadır. Ayrıca çalışma alanı ölçeklendirildiğinde veya taşındığında değişmezler.

getRelativeToSurfaceXY() {
  return this.loc;
}

Sürüklemeleri başlat

startDrag yöntemi, sürüklenebilir üzerinde bir sürüklemeyi başlatır. Bu yöntem, sürüklenebilir öğeyi hareket ettirmez. Ancak herhangi bir veriyi depolamanız veya sürükleme işlemini tamamlamak için ihtiyacınız olan nesneleri oluşturmanız gerekir. Buna, revertDrag çağrılırsa sürükleme işlemini geri almak için ihtiyaç duyacağınız tüm veriler dahildir.

Çalışma alanının sürükleme katmanında yer alacak svg öğeleri de değiştirilmelidir. Böylece, bu öğeler diğer öğelerin üzerinde yer alır.

Ayrıca, basılan tuşları kontrol etmek için kullanabileceğiniz bir etkinlik de alır. Bu, (örneğin) normal bir sürüklenmeden farklı bir şekilde geçiş yaparken sürüklemeyi işlemenize olanak tanır.

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

Sürüklenim

drag yöntemi aslında sürüklenebilir nesneyi taşır. newLoc, çalışma alanı koordinatlarındadır ve basılan tuşları kontrol etmek için kullanabileceğiniz bir etkinlik geçirildi.

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

Sürüklemeleri geri alma

revertDrag yöntemi, sürüklenebilir öğeyi sürüklemenin başında olduğu konuma döndürür. Örneğin, sürüklenebilir öğe hareketi önleyen bir sürükleme hedefine bırakılırsa bu durum gerçekleşir.

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

Sürüklemeleri sonlandır

endDrag yöntemi bir sürüklemeyi temizleyerek depolanan verileri veya nesneleri serbest bırakır ve sürüklenebilir öğeyi orijinal katmanına geri döndürür.

revertDrag çağrılırsa endDrag, her zaman revertDrag tarihinden sonra çağrılır.

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

Seçim

Sürüklenen öğe, bir sürükleme algılandığında seçilen öğe tarafından belirlenir.

ISelectable

Sürüklenebilir bir öğenin seçilebilmesi için ISelectable arayüzünü uygulaması gerekir.

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

Seçimi ayarla

Seçilen öğe, Blockly.common.setSelected() çağrısı yapılarak ayarlanabilir. genellikle bunu kullanıcıdan bir pointerdown etkinliğine yanıt olarak yapmak istersiniz.

  constructor() {
    this.initSvg();

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

Uyumluluk

Sürüklenebilir öğeniz, Blockly'deki diğer sistemlerle etkileşim kurabilmek için ek arayüzler uygulayabilir.

Silinebilir

Sürüklenebilir öğelerinizin çöp kutusu veya diğer silme hedefleri tarafından atılmasını sağlamak için IDeleteable arayüzünü uygulayabilirsiniz.

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

Kopyalanabilir

Sürüklenebilir öğelerin kopyalanmasına olanak tanımak için ICopyable arayüzünü uygulayabilir ve yapıştırılmasına izin vermek için bir IPaster tanımlayabilirsiniz.

Kopyalama yapıştırma hakkında daha fazla bilgi için Kopyalama yapıştırma konusuna bakın.