mirror of
https://github.com/scratchfoundation/scratch-vm.git
synced 2025-01-25 09:01:07 -05:00
Select target after drag end
This commit is contained in:
parent
5fbfecb1a9
commit
fc61f9e547
2 changed files with 58 additions and 4 deletions
|
@ -36,6 +36,13 @@ class VirtualMachine extends EventEmitter {
|
||||||
* @type {Target}
|
* @type {Target}
|
||||||
*/
|
*/
|
||||||
this.editingTarget = null;
|
this.editingTarget = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The currently dragging target, for redirecting IO data.
|
||||||
|
* @type {Target}
|
||||||
|
*/
|
||||||
|
this._dragTarget = null;
|
||||||
|
|
||||||
// Runtime emits are passed along as VM emits.
|
// Runtime emits are passed along as VM emits.
|
||||||
this.runtime.on(Runtime.SCRIPT_GLOW_ON, glowData => {
|
this.runtime.on(Runtime.SCRIPT_GLOW_ON, glowData => {
|
||||||
this.emit(Runtime.SCRIPT_GLOW_ON, glowData);
|
this.emit(Runtime.SCRIPT_GLOW_ON, glowData);
|
||||||
|
@ -692,8 +699,8 @@ class VirtualMachine extends EventEmitter {
|
||||||
startDrag (targetId) {
|
startDrag (targetId) {
|
||||||
const target = this.runtime.getTargetById(targetId);
|
const target = this.runtime.getTargetById(targetId);
|
||||||
if (target) {
|
if (target) {
|
||||||
|
this._dragTarget = target;
|
||||||
target.startDrag();
|
target.startDrag();
|
||||||
this.setEditingTarget(target.id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -703,16 +710,24 @@ class VirtualMachine extends EventEmitter {
|
||||||
*/
|
*/
|
||||||
stopDrag (targetId) {
|
stopDrag (targetId) {
|
||||||
const target = this.runtime.getTargetById(targetId);
|
const target = this.runtime.getTargetById(targetId);
|
||||||
if (target) target.stopDrag();
|
if (target) {
|
||||||
|
this._dragTarget = null;
|
||||||
|
target.stopDrag();
|
||||||
|
this.setEditingTarget(target.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Post/edit sprite info for the current editing target.
|
* Post/edit sprite info for the current editing target or the drag target.
|
||||||
* @param {object} data An object with sprite info data to set.
|
* @param {object} data An object with sprite info data to set.
|
||||||
*/
|
*/
|
||||||
postSpriteInfo (data) {
|
postSpriteInfo (data) {
|
||||||
|
if (this._dragTarget) {
|
||||||
|
this._dragTarget.postSpriteInfo(data);
|
||||||
|
} else {
|
||||||
this.editingTarget.postSpriteInfo(data);
|
this.editingTarget.postSpriteInfo(data);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = VirtualMachine;
|
module.exports = VirtualMachine;
|
||||||
|
|
|
@ -316,3 +316,42 @@ test('emitWorkspaceUpdate', t => {
|
||||||
t.notEqual(xml.indexOf('blocks'), -1);
|
t.notEqual(xml.indexOf('blocks'), -1);
|
||||||
t.end();
|
t.end();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('drag IO redirect', t => {
|
||||||
|
const vm = new VirtualMachine();
|
||||||
|
const sprite1Info = [];
|
||||||
|
const sprite2Info = [];
|
||||||
|
vm.runtime.targets = [
|
||||||
|
{
|
||||||
|
id: 'sprite1',
|
||||||
|
postSpriteInfo: data => sprite1Info.push(data)
|
||||||
|
}, {
|
||||||
|
id: 'sprite2',
|
||||||
|
postSpriteInfo: data => sprite2Info.push(data),
|
||||||
|
startDrag: () => {},
|
||||||
|
stopDrag: () => {}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
vm.editingTarget = vm.runtime.targets[0];
|
||||||
|
// Stub emitWorkspace/TargetsUpdate, it needs data we don't care about here
|
||||||
|
vm.emitWorkspaceUpdate = () => null;
|
||||||
|
vm.emitTargetsUpdate = () => null;
|
||||||
|
|
||||||
|
// postSpriteInfo should go to the editing target by default``
|
||||||
|
vm.postSpriteInfo('sprite1 info');
|
||||||
|
t.equal(sprite1Info[0], 'sprite1 info');
|
||||||
|
|
||||||
|
// postSprite info goes to the drag target if it exists
|
||||||
|
vm.startDrag('sprite2');
|
||||||
|
vm.postSpriteInfo('sprite2 info');
|
||||||
|
t.equal(sprite2Info[0], 'sprite2 info');
|
||||||
|
|
||||||
|
// stop drag should set the editing target
|
||||||
|
vm.stopDrag('sprite2');
|
||||||
|
t.equal(vm.editingTarget.id, 'sprite2');
|
||||||
|
|
||||||
|
// Then postSpriteInfo should continue posting to the new editing target
|
||||||
|
vm.postSpriteInfo('sprite2 info 2');
|
||||||
|
t.equal(sprite2Info[1], 'sprite2 info 2');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in a new issue