Track hovered sprite. End drag may transfer blocks from one sprite to another.

This commit is contained in:
DD 2018-02-12 18:09:41 -05:00
parent fe4b3d3c01
commit 31def7d03d
2 changed files with 37 additions and 1 deletions

View file

@ -152,7 +152,7 @@ const domToBlocks = function (blocksDOM) {
/**
* Adapter between block creation events and block representation which can be
* used by the Scratch runtime.
* @param {object} e `Blockly.events.create`
* @param {object} e `Blockly.events.create` or `Blockly.events.endDrag`
* @return {Array.<object>} List of blocks from this CREATE event.
*/
const adapter = function (e) {

View file

@ -10,6 +10,7 @@ const sb3 = require('./serialization/sb3');
const StringUtil = require('./util/string-util');
const formatMessage = require('format-message');
const Variable = require('./engine/variable');
const adapter = require('./engine/adapter');
const {loadCostume} = require('./import/load-costume.js');
const {loadSound} = require('./import/load-sound.js');
@ -40,6 +41,11 @@ class VirtualMachine extends EventEmitter {
*/
this.editingTarget = null;
/**
* ID of sprite that mouse is hovered over in sprite selector, if any
*/
this._hoveredSpriteId = null;
/**
* The currently dragging target, for redirecting IO data.
* @type {Target}
@ -553,6 +559,16 @@ class VirtualMachine extends EventEmitter {
});
}
/**
* Sets the hovered sprite
* @param {string} targetId ID of a target whose sprite to duplicate.
* @returns {Promise} Promise that resolves when duplicated target has
* been added to the runtime.
*/
setHoveredSprite (targetId) {
this._hoveredSpriteId = targetId;
}
/**
* Set the audio engine for the VM/runtime
* @param {!AudioEngine} audioEngine The audio engine to attach
@ -596,6 +612,26 @@ class VirtualMachine extends EventEmitter {
blockListener (e) {
if (this.editingTarget) {
this.editingTarget.blocks.blocklyListen(e, this.runtime);
// Validate event
if (typeof e !== 'object') return;
if (typeof e.blockId !== 'string' && typeof e.varId !== 'string') {
return;
}
// Drag blocks onto another sprite
if (e.type === 'endDrag' &&
e.isOutside &&
this._hoveredSpriteId &&
this._hoveredSpriteId !== this.editingTarget.id) {
const dragTarget = this.runtime.getTargetById(this._hoveredSpriteId);
if (dragTarget) {
const newBlocks = adapter(e);
for (let i = 0; i < newBlocks.length; i++) {
dragTarget.blocks.createBlock(newBlocks[i]);
}
}
}
}
}