mirror of
https://github.com/google/blockly.git
synced 2025-12-15 22:00:07 +01:00
Add disconnect sound and animation.
This commit is contained in:
@@ -187,6 +187,7 @@ Blockly.BlockSvg.onMouseMoveWrapper_ = null;
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
Blockly.BlockSvg.terminateDrag_ = function() {
|
Blockly.BlockSvg.terminateDrag_ = function() {
|
||||||
|
Blockly.BlockSvg.disconnectUiStop_();
|
||||||
if (Blockly.BlockSvg.onMouseUpWrapper_) {
|
if (Blockly.BlockSvg.onMouseUpWrapper_) {
|
||||||
Blockly.unbindEvent_(Blockly.BlockSvg.onMouseUpWrapper_);
|
Blockly.unbindEvent_(Blockly.BlockSvg.onMouseUpWrapper_);
|
||||||
Blockly.BlockSvg.onMouseUpWrapper_ = null;
|
Blockly.BlockSvg.onMouseUpWrapper_ = null;
|
||||||
@@ -692,6 +693,7 @@ Blockly.BlockSvg.prototype.onMouseMove_ = function(e) {
|
|||||||
var oldXY = this_.getRelativeToSurfaceXY();
|
var oldXY = this_.getRelativeToSurfaceXY();
|
||||||
var newXY = workspace_.moveDrag(e);
|
var newXY = workspace_.moveDrag(e);
|
||||||
|
|
||||||
|
var group = this_.getSvgRoot();
|
||||||
if (Blockly.dragMode_ == 1) {
|
if (Blockly.dragMode_ == 1) {
|
||||||
// Still dragging within the sticky DRAG_RADIUS.
|
// Still dragging within the sticky DRAG_RADIUS.
|
||||||
var dr = goog.math.Coordinate.distance(oldXY, newXY) * workspace_.scale;
|
var dr = goog.math.Coordinate.distance(oldXY, newXY) * workspace_.scale;
|
||||||
@@ -699,8 +701,15 @@ Blockly.BlockSvg.prototype.onMouseMove_ = function(e) {
|
|||||||
// Switch to unrestricted dragging.
|
// Switch to unrestricted dragging.
|
||||||
Blockly.dragMode_ = 2;
|
Blockly.dragMode_ = 2;
|
||||||
Blockly.longStop_();
|
Blockly.longStop_();
|
||||||
// Push this block to the very top of the stack.
|
group.translate_ = '';
|
||||||
this_.setParent(null);
|
group.skew_ = '';
|
||||||
|
if (this_.parentBlock_) {
|
||||||
|
// Push this block to the very top of the stack.
|
||||||
|
this_.setParent(null);
|
||||||
|
if (workspace_.scale >= 1) {
|
||||||
|
this_.disconnectUiEffect();
|
||||||
|
}
|
||||||
|
}
|
||||||
this_.setDragging_(true);
|
this_.setDragging_(true);
|
||||||
workspace_.recordDeleteAreas();
|
workspace_.recordDeleteAreas();
|
||||||
}
|
}
|
||||||
@@ -709,8 +718,8 @@ Blockly.BlockSvg.prototype.onMouseMove_ = function(e) {
|
|||||||
// Unrestricted dragging.
|
// Unrestricted dragging.
|
||||||
var dx = oldXY.x - this_.dragStartXY_.x;
|
var dx = oldXY.x - this_.dragStartXY_.x;
|
||||||
var dy = oldXY.y - this_.dragStartXY_.y;
|
var dy = oldXY.y - this_.dragStartXY_.y;
|
||||||
this_.getSvgRoot().setAttribute('transform',
|
group.translate_ = 'translate(' + newXY.x + ',' + newXY.y + ')';
|
||||||
'translate(' + newXY.x + ',' + newXY.y + ')');
|
group.setAttribute('transform', group.translate_ + group.skew_);
|
||||||
// Drag all the nested bubbles.
|
// Drag all the nested bubbles.
|
||||||
for (var i = 0; i < this_.draggedBubbles_.length; i++) {
|
for (var i = 0; i < this_.draggedBubbles_.length; i++) {
|
||||||
var commentData = this_.draggedBubbles_[i];
|
var commentData = this_.draggedBubbles_[i];
|
||||||
@@ -1126,10 +1135,82 @@ Blockly.BlockSvg.connectionUiStep_ = function(ripple, start, workspaceScale) {
|
|||||||
var closure = function() {
|
var closure = function() {
|
||||||
Blockly.BlockSvg.connectionUiStep_(ripple, start, workspaceScale);
|
Blockly.BlockSvg.connectionUiStep_(ripple, start, workspaceScale);
|
||||||
};
|
};
|
||||||
setTimeout(closure, 10);
|
Blockly.BlockSvg.disconnectUiStop_.pid_ = setTimeout(closure, 10);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Play some UI effects (sound, animation) when disconnecting a block.
|
||||||
|
*/
|
||||||
|
Blockly.BlockSvg.prototype.disconnectUiEffect = function() {
|
||||||
|
this.workspace.playAudio('disconnect');
|
||||||
|
// Horizontal distance for bottom of block to wiggle.
|
||||||
|
var DISPLACEMENT = 10;
|
||||||
|
// Scale magnitude of skew to height of block.
|
||||||
|
var height = this.getHeightWidth().height;
|
||||||
|
var magnitude = Math.atan(DISPLACEMENT / height) / Math.PI * 180;
|
||||||
|
if (this.RTL) {
|
||||||
|
magnitude *= -1;
|
||||||
|
}
|
||||||
|
// Start the animation.
|
||||||
|
Blockly.BlockSvg.disconnectUiStep_(this.svgGroup_, magnitude, new Date());
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Animate a brief wiggle of a disconnected block.
|
||||||
|
* @param {!Element} group SVG element to animate.
|
||||||
|
* @param {number} magnitude Maximum degrees skew (reversed for RTL).
|
||||||
|
* @param {!Date} start Date of animation's start.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
Blockly.BlockSvg.disconnectUiStep_ = function(group, magnitude, start) {
|
||||||
|
var DURATION = 200; // Milliseconds.
|
||||||
|
var WIGGLES = 3; // Half oscillations.
|
||||||
|
|
||||||
|
var ms = (new Date()) - start;
|
||||||
|
var percent = ms / DURATION;
|
||||||
|
|
||||||
|
if (percent > 1) {
|
||||||
|
group.skew_ = '';
|
||||||
|
} else {
|
||||||
|
var skew = Math.round(Math.sin(percent * Math.PI * WIGGLES) *
|
||||||
|
(1 - percent) * magnitude);
|
||||||
|
group.skew_ = 'skewX(' + skew + ')';
|
||||||
|
var closure = function() {
|
||||||
|
Blockly.BlockSvg.disconnectUiStep_(group, magnitude, start);
|
||||||
|
};
|
||||||
|
Blockly.BlockSvg.disconnectUiStop_.group = group;
|
||||||
|
Blockly.BlockSvg.disconnectUiStop_.pid = setTimeout(closure, 10);
|
||||||
|
}
|
||||||
|
group.setAttribute('transform', group.translate_ + group.skew_);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the disconnect UI animation immediately.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
Blockly.BlockSvg.disconnectUiStop_ = function() {
|
||||||
|
if (Blockly.BlockSvg.disconnectUiStop_.group) {
|
||||||
|
clearTimeout(Blockly.BlockSvg.disconnectUiStop_.pid);
|
||||||
|
var group = Blockly.BlockSvg.disconnectUiStop_.group
|
||||||
|
group.skew_ = '';
|
||||||
|
group.setAttribute('transform', group.translate_);
|
||||||
|
Blockly.BlockSvg.disconnectUiStop_.group = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PID of disconnect UI animation. There can only be one at a time.
|
||||||
|
* @type {number}
|
||||||
|
*/
|
||||||
|
Blockly.BlockSvg.disconnectUiStop_.pid = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SVG group of wobbling block. There can only be one at a time.
|
||||||
|
* @type {Element}
|
||||||
|
*/
|
||||||
|
Blockly.BlockSvg.disconnectUiStop_.group = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the colour of a block.
|
* Change the colour of a block.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -510,6 +510,10 @@ Blockly.init_ = function(mainWorkspace) {
|
|||||||
[options.pathToMedia + 'click.mp3',
|
[options.pathToMedia + 'click.mp3',
|
||||||
options.pathToMedia + 'click.wav',
|
options.pathToMedia + 'click.wav',
|
||||||
options.pathToMedia + 'click.ogg'], 'click');
|
options.pathToMedia + 'click.ogg'], 'click');
|
||||||
|
mainWorkspace.loadAudio_(
|
||||||
|
[options.pathToMedia + 'disconnect.mp3',
|
||||||
|
options.pathToMedia + 'disconnect.ogg',
|
||||||
|
options.pathToMedia + 'disconnect.wav'], 'disconnect');
|
||||||
mainWorkspace.loadAudio_(
|
mainWorkspace.loadAudio_(
|
||||||
[options.pathToMedia + 'delete.mp3',
|
[options.pathToMedia + 'delete.mp3',
|
||||||
options.pathToMedia + 'delete.ogg',
|
options.pathToMedia + 'delete.ogg',
|
||||||
|
|||||||
BIN
media/disconnect.mp3
Normal file
BIN
media/disconnect.mp3
Normal file
Binary file not shown.
BIN
media/disconnect.ogg
Normal file
BIN
media/disconnect.ogg
Normal file
Binary file not shown.
BIN
media/disconnect.wav
Normal file
BIN
media/disconnect.wav
Normal file
Binary file not shown.
Reference in New Issue
Block a user