ลากได้

รายการที่ลากได้คือออบเจ็กต์ที่แสดงผลซึ่งอยู่ในพื้นที่ทำงานซึ่งจะลากและวางได้ โดยใช้อินเทอร์เฟซ IDraggable

มีสถานการณ์น้อยมากที่คุณต้องการเพิ่มรายการที่ลากไปยัง Blockly ได้ (เช่น ปลั๊กอินmultiselect หรือเปลี่ยนวิธีจัดการกับการลากของออบเจ็กต์ที่มีอยู่) เนื่องจากคุณจะไม่สามารถเพิ่มออบเจ็กต์ที่แสดงผลใหม่ลงใน Blockly ได้ ออบเจ็กต์ที่แสดงผลเท่านั้นที่สามารถอยู่ในพื้นที่ทำงานได้ ได้แก่ บล็อก ลูกโป่ง และความคิดเห็นในพื้นที่ทำงาน

หน้าที่รับผิดชอบ

เครื่องมือลากจะมีหน้าที่รับผิดชอบหลายประการเมื่อใช้งานการลาก ดังนี้

การใช้งาน

หากต้องการสร้างอินเทอร์เฟซที่ลากได้ใหม่ คุณต้องใช้อินเทอร์เฟซ IRenderedElement และ IDraggable วิธีนี้จะช่วยให้ Blockly ทราบว่าวัตถุของคุณปรากฏอยู่และลากได้

class MyDraggable extends IRenderedElement, IDraggable {}

แสดงองค์ประกอบ SVG ราก

เมธอด getRootSvg จะแสดงผลองค์ประกอบ SVG รูท (โดยปกติจะเป็นกลุ่ม) ที่มีองค์ประกอบอื่นๆ ทั้งหมดที่ประกอบกันเป็นมุมมองสำหรับรายการที่ลากได้

getSvgRoot() {
  return this.rootSvg;
}

ส่งคืนความสามารถในการเคลื่อนย้าย

เมธอด isMovable จะแสดงผลว่าผู้ใช้สามารถย้ายที่ลากได้ในปัจจุบันหรือไม่ (เนื่องจากคุณอาจต้องปิดใช้การลากออบเจ็กต์ชั่วคราว) หาก isMovable แสดงผล false ระบบก็จะลากพื้นที่ทำงานแทน

isMovable() {
  return true;
}

ตำแหน่งการคืนสินค้า

เมธอด getRelativeToSurfaceXY จะแสดงผล Coordinate ที่ระบุตำแหน่งของมุมเริ่มต้นของพิกัดของพื้นที่ทำงานที่ลากได้

พิกัดของพื้นที่ทำงานมีต้นทางอยู่ทางด้านซ้ายสัมบูรณ์และบนสุดของพื้นที่ทำงาน โดยจะไม่เปลี่ยนแปลงเมื่อมีการปรับขนาดหรือย้ายพื้นที่ทำงาน

getRelativeToSurfaceXY() {
  return this.loc;
}

เริ่มการลาก

เมธอด startDrag จะเริ่มต้นการลากที่ลากได้ วิธีนี้ไม่ได้ย้าย ที่ลากได้ แต่คุณควรจัดเก็บข้อมูลหรือสร้างออบเจ็กต์ที่ต้องการสำหรับการลากให้เสร็จสิ้น ซึ่งรวมถึงข้อมูลที่คุณจำเป็นต้องเปลี่ยนกลับการลากหากมีการเรียก revertDrag

ควรเปลี่ยนองค์ประกอบ SVG ให้อยู่ในเลเยอร์การลากของพื้นที่ทำงาน เพื่อให้อยู่เหนือองค์ประกอบอื่นๆ

นอกจากนี้ เหตุการณ์ยังเข้าสู่เหตุการณ์ซึ่งคุณใช้เพื่อตรวจดูแป้นที่กดอยู่ได้ วิธีนี้ช่วยให้คุณ (ตัวอย่างเช่น) จัดการกับการลากขณะเลื่อนแตกต่างจากการลากแบบปกติ

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

ลาก

เมธอด drag จะย้ายออบเจ็กต์ที่ลากได้จริง newLoc อยู่ในพิกัดของพื้นที่ทำงาน และยังมีเหตุการณ์ผ่านไปแล้วที่คุณสามารถใช้เพื่อตรวจสอบแป้นที่กดได้อีกด้วย

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

เปลี่ยนกลับการลาก

เมธอด revertDrag จะแสดงตำแหน่งที่ลากได้ไปยังตำแหน่งที่เคยอยู่ที่จุดเริ่มต้นของการลาก กรณีนี้จะเกิดขึ้น เช่น หากมีการวางพื้นที่ที่ลากได้บนเป้าหมายที่ลากได้ที่ป้องกันไม่ให้มีการเคลื่อนไหว

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

หยุดการลาก

เมธอด endDrag จะล้างการลาก ปล่อยข้อมูลหรือออบเจ็กต์ที่เก็บไว้ และส่งคืนรายการที่ลากได้ไปยังเลเยอร์เดิม

ระบบจะเรียก endDrag หลัง revertDrag เสมอหากมีการเรียก revertDrag

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

การเลือก

องค์ประกอบที่ถูกลากจะกำหนดโดยองค์ประกอบที่เลือกไว้เมื่อตรวจพบการลาก

ISelectable

หากต้องการเลือกโฆษณาที่ลากได้ ต้องใช้อินเทอร์เฟซ ISelectable

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

ตั้งค่าการเลือก

คุณตั้งค่าองค์ประกอบที่เลือกได้ด้วยการเรียกใช้ Blockly.common.setSelected() โดยปกติคุณจะต้องทำเช่นนี้เพื่อตอบสนองต่อเหตุการณ์ pointerdown จากผู้ใช้

  constructor() {
    this.initSvg();

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

ความเข้ากันได้

ส่วนที่คุณลากได้จะใช้อินเทอร์เฟซเพิ่มเติมเพื่อให้โต้ตอบกับระบบอื่นๆ ใน Blockly ได้

ลบได้

คุณสามารถใช้อินเทอร์เฟซ IDeleteable เพื่อให้ถังขยะหรือเป้าหมายการลบอื่นๆ ทิ้งสิ่งที่ลากได้

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

คัดลอกได้

คุณสามารถใช้อินเทอร์เฟซ ICopyable เพื่ออนุญาตให้คัดลอกที่ลากได้ และกำหนด IPaster เพื่ออนุญาตให้วาง

ดูข้อมูลเพิ่มเติมเกี่ยวกับการคัดลอกและวางได้ที่คัดลอกและวาง