Les icônes intégrées utilisent une interface utilisateur de type pop-up-info-bulle pour afficher des informations supplémentaires ou éditeurs. Les icônes personnalisées peuvent également reproduire ce comportement, une apparence et une convivialité cohérentes.
Si votre icône doit afficher une info-bulle, vous devez implémenter la
IHasBubble
.
Afficher ou masquer l'info-bulle
Les icônes qui utilisent des bulles doivent implémenter
setBubbleVisible
pour afficher ou masquer l'info-bulle.
// 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);
}
Faire glisser le bloc
Lorsque l'icône change d'emplacement, la bulle ne se déplace pas automatiquement en même temps que celle-ci.
Vous devez soit mettre à jour la position de l'info-bulle, soit la masquer. Il peut s'agir
effectué dans la méthode onLocationChange
du
IIcon
.
onLocationChange(blockOrigin) {
super.onLocationChange(blockOrigin);
this.myBubble?.setAnchorLocation(this.getAnchorLocation());
}
Renvoyer la visibilité de la bulle
L'interface IHasBubble
nécessite également que vous implémentiez une
isBubbleVisible
qui indique si la bulle est
visibles ou non.
isBubbleVisible() {
return !!this.myBubble;
}