mirror of
https://github.com/scratchfoundation/scratch-blocks.git
synced 2025-08-28 22:10:31 -04:00
Merge duplicate event calls.
This commit is contained in:
parent
247782c72a
commit
e7444120ca
4 changed files with 43 additions and 33 deletions
|
@ -951,13 +951,12 @@ d.setMovable("true"==a);(a=b.getAttribute("editable"))&&d.setEditable("true"==a)
|
|||
goog.global.Blockly.Xml.textToDom=Blockly.Xml.textToDom;goog.global.Blockly.Xml.workspaceToDom=Blockly.Xml.workspaceToDom;
|
||||
// Copyright 2014 Google Inc. Apache License 2.0
|
||||
Blockly.WorkspaceSvg=function(a,b){Blockly.WorkspaceSvg.superClass_.constructor.call(this);this.getMetrics=a;this.setMetrics=b;Blockly.ConnectionDB.init(this)};goog.inherits(Blockly.WorkspaceSvg,Blockly.Workspace);Blockly.WorkspaceSvg.prototype.rendered=!0;Blockly.WorkspaceSvg.prototype.isFlyout=!1;Blockly.WorkspaceSvg.prototype.dragMode=!1;Blockly.WorkspaceSvg.prototype.scrollX=0;Blockly.WorkspaceSvg.prototype.scrollY=0;Blockly.WorkspaceSvg.prototype.trashcan=null;
|
||||
Blockly.WorkspaceSvg.prototype.fireChangeEventPid_=null;Blockly.WorkspaceSvg.prototype.scrollbar=null;Blockly.WorkspaceSvg.prototype.createDom=function(){this.svgGroup_=Blockly.createSvgElement("g",{},null);this.svgBlockCanvas_=Blockly.createSvgElement("g",{},this.svgGroup_);this.svgBubbleCanvas_=Blockly.createSvgElement("g",{},this.svgGroup_);this.fireChangeEvent();return this.svgGroup_};
|
||||
Blockly.WorkspaceSvg.prototype.scrollbar=null;Blockly.WorkspaceSvg.prototype.createDom=function(){this.svgGroup_=Blockly.createSvgElement("g",{},null);this.svgBlockCanvas_=Blockly.createSvgElement("g",{},this.svgGroup_);this.svgBubbleCanvas_=Blockly.createSvgElement("g",{},this.svgGroup_);this.fireChangeEvent();return this.svgGroup_};
|
||||
Blockly.WorkspaceSvg.prototype.dispose=function(){this.rendered=!1;Blockly.WorkspaceSvg.superClass_.dispose.call(this);this.svgGroup_&&(goog.dom.removeNode(this.svgGroup_),this.svgGroup_=null);this.svgBubbleCanvas_=this.svgBlockCanvas_=null;this.flyout_&&(this.flyout_.dispose(),this.flyout_=null);this.trashcan&&(this.trashcan.dispose(),this.trashcan=null)};
|
||||
Blockly.WorkspaceSvg.prototype.addTrashcan=function(){if(Blockly.hasTrashcan&&!Blockly.readOnly){this.trashcan=new Blockly.Trashcan(this);var a=this.trashcan.createDom();this.svgGroup_.insertBefore(a,this.svgBlockCanvas_);this.trashcan.init()}};Blockly.WorkspaceSvg.prototype.getCanvas=function(){return this.svgBlockCanvas_};Blockly.WorkspaceSvg.prototype.getBubbleCanvas=function(){return this.svgBubbleCanvas_};
|
||||
Blockly.WorkspaceSvg.prototype.addTopBlock=function(a){Blockly.WorkspaceSvg.superClass_.addTopBlock.call(this,a);Blockly.Realtime.isEnabled()&&this==Blockly.mainWorkspace&&Blockly.Realtime.addTopBlock(a)};Blockly.WorkspaceSvg.prototype.removeTopBlock=function(a){Blockly.WorkspaceSvg.superClass_.removeTopBlock.call(this,a);Blockly.Realtime.isEnabled()&&this==Blockly.mainWorkspace&&Blockly.Realtime.removeTopBlock(a)};Blockly.WorkspaceSvg.prototype.clear=function(){Blockly.hideChaff();Blockly.WorkspaceSvg.superClass_.clear.call(this)};
|
||||
Blockly.WorkspaceSvg.prototype.getWidth=function(){return this.getMetrics().viewWidth};Blockly.WorkspaceSvg.prototype.render=function(){for(var a=this.getAllBlocks(),b=0,c;c=a[b];b++)c.getChildren().length||c.render()};Blockly.WorkspaceSvg.prototype.traceOn=function(a){this.traceOn_=a;this.traceWrapper_&&(Blockly.unbindEvent_(this.traceWrapper_),this.traceWrapper_=null);a&&(this.traceWrapper_=Blockly.bindEvent_(this.svgBlockCanvas_,"blocklySelectChange",this,function(){this.traceOn_=!1}))};
|
||||
Blockly.WorkspaceSvg.prototype.highlightBlock=function(a){this.traceOn_&&0!=Blockly.dragMode_&&this.traceOn(!1);if(this.traceOn_){var b=null;if(a&&(b=this.getBlockById(a),!b))return;this.traceOn(!1);b?b.select():Blockly.selected&&Blockly.selected.unselect();var c=this;setTimeout(function(){c.traceOn(!0)},1)}};
|
||||
Blockly.WorkspaceSvg.prototype.fireChangeEvent=function(){if(this.rendered){this.fireChangeEventPid_&&clearTimeout(this.fireChangeEventPid_);var a=this.svgBlockCanvas_;a&&(this.fireChangeEventPid_=setTimeout(function(){Blockly.fireUiEvent(a,"blocklyWorkspaceChange")},0))}};
|
||||
Blockly.WorkspaceSvg.prototype.highlightBlock=function(a){this.traceOn_&&0!=Blockly.dragMode_&&this.traceOn(!1);if(this.traceOn_){var b=null;if(a&&(b=this.getBlockById(a),!b))return;this.traceOn(!1);b?b.select():Blockly.selected&&Blockly.selected.unselect();var c=this;setTimeout(function(){c.traceOn(!0)},1)}};Blockly.WorkspaceSvg.prototype.fireChangeEvent=function(){this.rendered&&this.svgBlockCanvas_&&Blockly.fireUiEvent(this.svgBlockCanvas_,"blocklyWorkspaceChange")};
|
||||
Blockly.WorkspaceSvg.prototype.paste=function(a){if(!(a.getElementsByTagName("block").length>=this.remainingCapacity())){var b=Blockly.Xml.domToBlock(this,a),c=parseInt(a.getAttribute("x"),10);a=parseInt(a.getAttribute("y"),10);if(!isNaN(c)&&!isNaN(a)){Blockly.RTL&&(c=-c);do for(var d=!1,e=this.getAllBlocks(),f=0,g;g=e[f];f++)g=g.getRelativeToSurfaceXY(),1>=Math.abs(c-g.x)&&1>=Math.abs(a-g.y)&&(c=Blockly.RTL?c-Blockly.SNAP_RADIUS:c+Blockly.SNAP_RADIUS,a+=2*Blockly.SNAP_RADIUS,d=!0);while(d);b.moveBy(c,
|
||||
a)}b.select()}};Blockly.WorkspaceSvg.prototype.recordDeleteAreas=function(){this.deleteAreaTrash_=this.trashcan?this.trashcan.getRect():null;this.deleteAreaToolbox_=this.flyout_?this.flyout_.getRect():this.toolbox_?this.toolbox_.getRect():null};
|
||||
Blockly.WorkspaceSvg.prototype.isDeleteArea=function(a){a=Blockly.mouseToSvg(a);a=new goog.math.Coordinate(a.x,a.y);if(this.deleteAreaTrash_){if(this.deleteAreaTrash_.contains(a))return this.trashcan.setOpen_(!0),Blockly.Css.setCursor(Blockly.Css.Cursor.DELETE),!0;this.trashcan.setOpen_(!1)}if(this.deleteAreaToolbox_&&this.deleteAreaToolbox_.contains(a))return Blockly.Css.setCursor(Blockly.Css.Cursor.DELETE),!0;Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED);return!1};
|
||||
|
@ -1290,7 +1289,8 @@ Blockly.utils={};Blockly.addClass_=function(a,b){var c=a.getAttribute("class")||
|
|||
Blockly.hasClass_=function(a,b){return-1!=(" "+a.getAttribute("class")+" ").indexOf(" "+b+" ")};
|
||||
Blockly.bindEvent_=function(a,b,c,d){var e=function(a){d.apply(c,arguments)};a.addEventListener(b,e,!1);var f=[[a,b,e]];if(b in Blockly.bindEvent_.TOUCH_MAP)for(var e=function(a){if(1==a.changedTouches.length){var b=a.changedTouches[0];a.clientX=b.clientX;a.clientY=b.clientY}d.apply(c,arguments);a.preventDefault()},g=0,h;h=Blockly.bindEvent_.TOUCH_MAP[b][g];g++)a.addEventListener(h,e,!1),f.push([a,h,e]);return f};Blockly.bindEvent_.TOUCH_MAP={};
|
||||
goog.events.BrowserFeature.TOUCH_ENABLED&&(Blockly.bindEvent_.TOUCH_MAP={mousedown:["touchstart"],mousemove:["touchmove"],mouseup:["touchend","touchcancel"]});Blockly.unbindEvent_=function(a){for(;a.length;){var b=a.pop(),c=b[2];b[0].removeEventListener(b[1],c,!1)}return c};
|
||||
Blockly.fireUiEventNow=function(a,b){var c=document;if(c.createEvent)c=c.createEvent("UIEvents"),c.initEvent(b,!0,!0),a.dispatchEvent(c);else if(c.createEventObject)c=c.createEventObject(),a.fireEvent("on"+b,c);else throw"FireEvent: No event creation mechanism.";};Blockly.fireUiEvent=function(a,b){setTimeout(function(){Blockly.fireUiEventNow(a,b)},0)};Blockly.noEvent=function(a){a.preventDefault();a.stopPropagation()};
|
||||
Blockly.fireUiEventNow=function(a,b){var c=Blockly.fireUiEvent.DB_[b];if(c){var d=c.indexOf(a);-1!=d&&c.splice(d,1)}if(document.createEvent)c=document.createEvent("UIEvents"),c.initEvent(b,!0,!0),a.dispatchEvent(c);else if(document.createEventObject)c=document.createEventObject(),a.fireEvent("on"+b,c);else throw"FireEvent: No event creation mechanism.";};
|
||||
Blockly.fireUiEvent=function(a,b){var c=Blockly.fireUiEvent.DB_[b];if(c){if(-1!=c.indexOf(a))return;c.push(a)}else Blockly.fireUiEvent.DB_[b]=[a];setTimeout(function(){Blockly.fireUiEventNow(a,b)},0)};Blockly.fireUiEvent.DB_={};Blockly.noEvent=function(a){a.preventDefault();a.stopPropagation()};
|
||||
Blockly.getRelativeXY_=function(a){var b={x:0,y:0},c=a.getAttribute("x");c&&(b.x=parseInt(c,10));if(c=a.getAttribute("y"))b.y=parseInt(c,10);if(a=(a=a.getAttribute("transform"))&&a.match(/translate\(\s*([-\d.]+)([ ,]\s*([-\d.]+)\s*\))?/))b.x+=parseInt(a[1],10),a[3]&&(b.y+=parseInt(a[3],10));return b};Blockly.getSvgXY_=function(a){var b=0,c=0;do{var d=Blockly.getRelativeXY_(a),b=b+d.x,c=c+d.y;a=a.parentNode}while(a&&a!=Blockly.svg);return{x:b,y:c}};
|
||||
Blockly.getAbsoluteXY_=function(a){a=Blockly.getSvgXY_(a);return Blockly.convertCoordinates(a.x,a.y,!1)};Blockly.createSvgElement=function(a,b,c){a=document.createElementNS(Blockly.SVG_NS,a);for(var d in b)a.setAttribute(d,b[d]);document.body.runtimeStyle&&(a.runtimeStyle=a.currentStyle=a.style);c&&c.appendChild(a);return a};Blockly.isRightButton=function(a){return 2==a.button||a.ctrlKey};
|
||||
Blockly.convertCoordinates=function(a,b,c){c&&(a-=window.scrollX||window.pageXOffset,b-=window.scrollY||window.pageYOffset);var d=Blockly.svg.createSVGPoint();d.x=a;d.y=b;a=Blockly.svg.getScreenCTM();c&&(a=a.inverse());d=d.matrixTransform(a);c||(d.x+=window.scrollX||window.pageXOffset,d.y+=window.scrollY||window.pageYOffset);return d};Blockly.mouseToSvg=function(a){return Blockly.convertCoordinates(a.clientX+(window.scrollX||window.pageXOffset),a.clientY+(window.scrollY||window.pageYOffset),!0)};
|
||||
|
|
|
@ -105,22 +105,22 @@ Blockly.makeColour = function(hue) {
|
|||
};
|
||||
|
||||
/**
|
||||
* ENUM for a right-facing value input. E.g. 'test' or 'return'.
|
||||
* ENUM for a right-facing value input. E.g. 'set item to' or 'return'.
|
||||
* @const
|
||||
*/
|
||||
Blockly.INPUT_VALUE = 1;
|
||||
/**
|
||||
* ENUM for a left-facing value output. E.g. 'call random'.
|
||||
* ENUM for a left-facing value output. E.g. 'random fraction'.
|
||||
* @const
|
||||
*/
|
||||
Blockly.OUTPUT_VALUE = 2;
|
||||
/**
|
||||
* ENUM for a down-facing block stack. E.g. 'then-do' or 'else-do'.
|
||||
* ENUM for a down-facing block stack. E.g. 'if-do' or 'else'.
|
||||
* @const
|
||||
*/
|
||||
Blockly.NEXT_STATEMENT = 3;
|
||||
/**
|
||||
* ENUM for an up-facing block stack. E.g. 'close screen'.
|
||||
* ENUM for an up-facing block stack. E.g. 'break out of loop'.
|
||||
* @const
|
||||
*/
|
||||
Blockly.PREVIOUS_STATEMENT = 4;
|
||||
|
|
|
@ -160,15 +160,23 @@ Blockly.unbindEvent_ = function(bindData) {
|
|||
* @param {string} eventName Name of event (e.g. 'click').
|
||||
*/
|
||||
Blockly.fireUiEventNow = function(node, eventName) {
|
||||
var doc = document;
|
||||
if (doc.createEvent) {
|
||||
// Remove the event from the anti-duplicate database.
|
||||
var list = Blockly.fireUiEvent.DB_[eventName];
|
||||
if (list) {
|
||||
var i = list.indexOf(node);
|
||||
if (i != -1) {
|
||||
list.splice(i, 1);
|
||||
}
|
||||
}
|
||||
// Fire the event in a browser-compatible way.
|
||||
if (document.createEvent) {
|
||||
// W3
|
||||
var evt = doc.createEvent('UIEvents');
|
||||
var evt = document.createEvent('UIEvents');
|
||||
evt.initEvent(eventName, true, true); // event type, bubbling, cancelable
|
||||
node.dispatchEvent(evt);
|
||||
} else if (doc.createEventObject) {
|
||||
} else if (document.createEventObject) {
|
||||
// MSIE
|
||||
var evt = doc.createEventObject();
|
||||
var evt = document.createEventObject();
|
||||
node.fireEvent('on' + eventName, evt);
|
||||
} else {
|
||||
throw 'FireEvent: No event creation mechanism.';
|
||||
|
@ -176,17 +184,36 @@ Blockly.fireUiEventNow = function(node, eventName) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Fire a synthetic event asynchronously.
|
||||
* Fire a synthetic event asynchronously. Groups of simultaneous events (e.g.
|
||||
* a tree of blocks being deleted) are merged into one event.
|
||||
* @param {!EventTarget} node The event's target node.
|
||||
* @param {string} eventName Name of event (e.g. 'click').
|
||||
*/
|
||||
Blockly.fireUiEvent = function(node, eventName) {
|
||||
var list = Blockly.fireUiEvent.DB_[eventName];
|
||||
if (list) {
|
||||
if (list.indexOf(node) != -1) {
|
||||
// This event is already scheduled to fire.
|
||||
return;
|
||||
}
|
||||
list.push(node);
|
||||
} else {
|
||||
Blockly.fireUiEvent.DB_[eventName] = [node];
|
||||
}
|
||||
var fire = function() {
|
||||
Blockly.fireUiEventNow(node, eventName);
|
||||
};
|
||||
setTimeout(fire, 0);
|
||||
};
|
||||
|
||||
/**
|
||||
* Database of upcoming firing event types.
|
||||
* Used to fire only one event after multiple changes.
|
||||
* @type {!Object}
|
||||
* @private
|
||||
*/
|
||||
Blockly.fireUiEvent.DB_ = {};
|
||||
|
||||
/**
|
||||
* Don't do anything for this event, just halt propagation.
|
||||
* @param {!Event} e An event.
|
||||
|
|
|
@ -89,14 +89,6 @@ Blockly.WorkspaceSvg.prototype.scrollY = 0;
|
|||
*/
|
||||
Blockly.WorkspaceSvg.prototype.trashcan = null;
|
||||
|
||||
/**
|
||||
* PID of upcoming firing of a change event. Used to fire only one event
|
||||
* after multiple changes.
|
||||
* @type {?number}
|
||||
* @private
|
||||
*/
|
||||
Blockly.WorkspaceSvg.prototype.fireChangeEventPid_ = null;
|
||||
|
||||
/**
|
||||
* This workspace's scrollbars, if they exist.
|
||||
* @type {Blockly.ScrollbarPair}
|
||||
|
@ -284,17 +276,8 @@ Blockly.WorkspaceSvg.prototype.highlightBlock = function(id) {
|
|||
* 'blocklyWorkspaceChange' on Blockly.mainWorkspace.getCanvas().
|
||||
*/
|
||||
Blockly.WorkspaceSvg.prototype.fireChangeEvent = function() {
|
||||
if (!this.rendered) {
|
||||
return;
|
||||
}
|
||||
if (this.fireChangeEventPid_) {
|
||||
clearTimeout(this.fireChangeEventPid_);
|
||||
}
|
||||
var canvas = this.svgBlockCanvas_;
|
||||
if (canvas) {
|
||||
this.fireChangeEventPid_ = setTimeout(function() {
|
||||
Blockly.fireUiEvent(canvas, 'blocklyWorkspaceChange');
|
||||
}, 0);
|
||||
if (this.rendered && this.svgBlockCanvas_) {
|
||||
Blockly.fireUiEvent(this.svgBlockCanvas_, 'blocklyWorkspaceChange');
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue