使用含圖示的彈出式視窗

內建圖示會使用彈出式泡泡樣式的 UI,顯示額外資訊或 編輯自訂圖示也能複製此行為, 外觀和風格保持一致

如果圖示應顯示對話框,您就必須導入 IHasBubble 介面。

顯示或隱藏對話框

使用泡泡的圖示應實作 setBubbleVisible 方法來顯示或隱藏泡泡。

// Implement the setBubbleVisible method of the IHasBubble interface.
async setBubbleVisible(visible) {
  // State is already correct.
  if (!!this.myBubble === visible) return;

  // Wait for queued renders to finish so that the icon will be correctly
  // positioned before displaying the bubble.
  await Blockly.renderManagement.finishQueuedRenders();

  if (visible) {
    this.myBubble = new MyBubble(this.getAnchorLocation(), this.getOwnerRect());
  } else {
    this.myBubble?.dispose();
  }
}

// Implement helper methods for getting the anchor location and bounds.

// Returns the location of the middle of this icon in workspace coordinates.
getAnchorLocation() {
  const size = this.getSize();
  const midIcon = new Blockly.utils.Coordinate(size.width / 2, size.height / 2);
  return Blockly.utils.Coordinate.sum(this.workspaceLocation, midIcon);
}

// Returns the rect the bubble should avoid overlapping, i.e. the block this
// icon is appended to.
getOwnerRect() {
  const bbox = this.sourceBlock.getSvgRoot().getBBox();
  return new Blockly.utils.Rect(
      bbox.y, bbox.y + bbox.height, bbox.x, bbox.x + bbox.width);
}

處理拖曳區塊的方式

圖示變更位置時,對話框不會隨著圖示自動移動。 您需要更新或隱藏泡泡的位置。可用的值包括 呼叫 Deployment 的 onLocationChange 方法 IIcon 介面。

onLocationChange(blockOrigin) {
  super.onLocationChange(blockOrigin);
  this.myBubble?.setAnchorLocation(this.getAnchorLocation());
}

傳回對話框的顯示設定

IHasBubble 介面也需要您實作 isBubbleVisible 方法,會傳回對話框是否 是否隱藏。

isBubbleVisible() {
  return !!this.myBubble;
}