diff --git a/README.md b/README.md
index 60a8e0b..4501139 100644
--- a/README.md
+++ b/README.md
@@ -11,12 +11,22 @@ This library installs new custom procedures for blockly, with custom modificatio
- Support for a `Blockly.CUSTOM_COLORS` object.
## Usage
+
+If you desire to use a different language than Spanish, you can define your own translations for the needed blocks using `Blockly.Msg`, for example:
+
+```javascript
+Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = 'your translation';
+```
+
+Then proceed to call `ProcedsBlockly.init()` to load these new translations. Otherwise, you can use the default language by calling `ProcedsBlockly.setDefacultLocale()`:
+
```
```
diff --git a/package-lock.json b/package-lock.json
index ed06b3f..eafc4df 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "proceds-blockly",
- "version": "1.0.1",
+ "version": "1.1.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 8e213cc..cab0b7b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "proceds-blockly",
- "version": "1.0.1",
+ "version": "1.1.0",
"description": "This library installs new custom procedures for blockly, with custom modifications: - The parameters now can be easily added and removed with buttons, replacing the mutator popup. - The arguments (`variables_get`) are associated with the procedure. All this blocks now have a `$parent` field with the id of the procedure where they belong. **For this to work, you must save this `$parent` in the mutation of `variables_get`**. - The 'help' option was removed from the context menu. - The block `procedures_defnoreturn` has been splitted in `procedures_defnoreturn` and `procedures_defnoreturnnoparams`. - The block `procedures_defreturn` has been splitted in `procedures_defreturn`, `procedures_defreturnsimplewithparams` and `procedures_defreturnsimple`. - The blocks can be added on every category you want. If you want to create a category for the calls, use the custom names `PROCEDURE_CALLS` and `FUNCTION_CALLS`. - Procedure descriptions are disabled by default.",
"main": "proceds-blockly.js",
"scripts": {
@@ -19,4 +19,4 @@
"dependencies": {
"blockly-package": "1.0.0"
}
-}
\ No newline at end of file
+}
diff --git a/proceds-blockly.js b/proceds-blockly.js
index 07a0c25..d824407 100644
--- a/proceds-blockly.js
+++ b/proceds-blockly.js
@@ -1,774 +1,783 @@
-var PLUS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAQAAAD2e2DtAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAHdElNRQfhDAUCCjFLV0NqAAAC60lEQVR42u3dQW7aQABA0Wl7MMjJICeDnIwuqm4qVQrYjMH/Pa/jsfFnTJDwjAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBUP7Y+gClOY4zznX9zHmN8bn3gLHcYtwXbYevDZ5nLost/G7dx2foUeNzyyy+BN7Zs8ncjeHvrvP/NAW9qvff/rueAn1sfwNMcX3hvL2S/3wPcVt7fTl+p/c4AfIsA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4mYHcBinVRdz+v+2tjlHfdrv8lRjHFZcyG3P22VmBPOWQrrsd+WtJ7iOjzkDzQrA5b/XpATmBHAY1ynj7MtxfD1/kDkBrP+RrGHC1ZnxX8Bpwhj7NOGV8z1A3IxbgBvA455+fcwAcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcT9mjLKcevTfFPn5/860AwQ58ehr2wnPw51C3jMccYgcwL48nyAu11nPB3AI2Je1bRHxMz7EPgxjuaBb7mO46zLP3MG+OMwjuM8ecx3cp419f81O4B51v7PY6evlO8B4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQN2fp2G0cV9zXhEVct7HfGeD6wntjisu4rbRdtj4VHnFYLYDD1qfCY9aZA7z/39jyBFz+N7fsRrD7yX+n62H+4zTG3QvWnscYn1sfOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALvzG8Ijm7EmMQYoAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTEyLTA1VDAyOjEwOjQ5LTA1OjAwJa2zowAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0xMi0wNVQwMjoxMDo0OS0wNTowMFTwCx8AAAAASUVORK5CYII=";
-var MINUS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAQAAAD2e2DtAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAHdElNRQfhDAUCCi+xWH4JAAABcUlEQVR42u3c7ZGCMBSG0etuYcTKls7AyrSEVWd4+bjnUECMeSbhD6kCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBzu4XHm2rUvPekD2yutR57/4itTLXU0/Pvs9SUW5TcDrDUyE3r9Na6ZwZKBWD5PxVKIBPAVGtknGsZibeBTADPyCjXE1idn8A0/gJjXFPgn0sEwIEljgAHwPc2Xx87QHMCaE4AzQmgOQE0J4DmBNCcAJoTQHMCaE4AzQmgOQE0J4DmBNCcAJoTQHMCaE4AzQmgOQE0J4DmBNDcb2SUsfc0T2re/utAO0BzPg49sot8HOoI+M5IDJIJ4OF+gI+F7gpyRcwxxa6Iyb0E3mvYB96y1kgtv2vijubS18QBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAWXq7xrTQhKAi3AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTEyLTA1VDAyOjEwOjQ3LTA1OjAwdZLI/gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0xMi0wNVQwMjoxMDo0Ny0wNTowMATPcEIAAAAASUVORK5CYII=";
-var HAND = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfiBAUBKBeKSgeBAAABTElEQVQoz22QzyvDcRjHX5/vvrMyStI2uZgftdVCSpJCyW1y00oUF+Xg4OIkx5VyUyJOsgv/gnJw4YCSSFMyB5pGbLJ99/k8LltreB2f9+v50eOigoc5FvGTJF8pugCwaKaNaE98uf9zMBXwjtNpbvmuaH2B0+HXuuyMEbOlQ4U1M5ZVcYbowg02YfZW5cnE9JIROdI7jsiOacoMPLZdEYPR1ouQkxCRG+feESlIXkQOzLR+NhvCpc3UbPcHAoRsADcAQ0Twq0ZosQgEVY0SqvGpkAUCxkIUYRP4bZRRNi9pvaD+TwXyFseHuYzy/Kt8CWfQ5Ems6C/5y7uZyDEH0Nt8vq0dUx0XzaapPyIIoIi23+47+SrlTvrTjLhKy2wmO95OqiacS+QBH9gAFDlOZnYbrimWOixSZCwUlK+vZd7bXiPldyi0yqX1OtkfCBS/9XAtDKAAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTgtMDQtMDVUMDQ6NDQ6NDItMDM6MDD+uUN1AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE4LTA0LTA1VDA0OjQwOjIzLTAzOjAw5hdZgAAAAABJRU5ErkJggg==";
-
-window.initProcedsBlockly = function(customStatementType, initialize = () => {}) {
- Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = 'Describe el procedimiento...';
- Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Hacer algo";
- Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "Definir";
- Blockly.Msg.PROCEDURES_DEFNORETURN_NOPARAMS = "";
- Blockly.Msg.PROCEDURES_DEFRETURN_NOPARAMS = "";
- Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = 'Describe la función...';
- Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = "devolver algo";
- Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = "Definir";
- Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con";
- Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea un procedimiento.";
- Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una función.";
- Blockly.Msg.PROCEDURES_ADD_PARAMETER = "Agregar parámetro";
- Blockly.Msg.PROCEDURES_ADD_PARAMETER_PROMPT = "Ingresa el nombre del parámetro";
- Blockly.Msg.PROCEDURES_REMOVE_PARAMETER = "Quitar parámetro";
- Blockly.Msg.PROCEDURES_PARAMETER = "parámetro";
-
- // -------------------------------------
- // [!] Fixing FieldImage's click handler
- // -------------------------------------
-
- Blockly.FieldImage.prototype.init = function() {
- if (this.fieldGroup_) {
- // Image has already been initialized once.
- return;
- }
- // Build the DOM.
- /** @type {SVGElement} */
- this.fieldGroup_ = Blockly.utils.createSvgElement('g', {}, null);
- if (!this.visible_) {
- this.fieldGroup_.style.display = 'none';
- }
- /** @type {SVGElement} */
- this.imageElement_ = Blockly.utils.createSvgElement(
- 'image',
- {
- 'height': this.height_ + 'px',
- 'width': this.width_ + 'px'
- },
- this.fieldGroup_);
- this.setValue(this.src_);
- this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_);
-
- // Configure the field to be transparent with respect to tooltips.
- this.setTooltip(this.sourceBlock_);
- Blockly.Tooltip.bindMouseEvents(this.imageElement_);
-
- var self = this;
-
- if (this.clickHandler_) { // [!]
- this.imageElement_.addEventListener("mousedown", function(event) {
- event.stopPropagation();
- event.preventDefault();
-
- if (event.button === 0) {
- self.clickHandler_();
- }
- });
- this.mouseDownWrapper_ =
- Blockly.bindEventWithChecks_(
- this.fieldGroup_, 'mousedown', this, this.clickHandler_);
- }
- };
-
- // [!] Modifying callbackFactory to return the created block
- Blockly.ContextMenu.callbackFactory = function(block, xml) {
- return function() {
- Blockly.Events.disable();
- try {
- var newBlock = Blockly.Xml.domToBlock(xml, block.workspace);
- // Move the new block next to the old block.
- var xy = block.getRelativeToSurfaceXY();
- if (block.RTL) {
- xy.x -= Blockly.SNAP_RADIUS;
- } else {
- xy.x += Blockly.SNAP_RADIUS;
- }
- xy.y += Blockly.SNAP_RADIUS * 2;
- newBlock.moveBy(xy.x, xy.y);
- } finally {
- Blockly.Events.enable();
+window.ProcedsBlockly = {
+ PLUS : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAQAAAD2e2DtAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAHdElNRQfhDAUCCjFLV0NqAAAC60lEQVR42u3dQW7aQABA0Wl7MMjJICeDnIwuqm4qVQrYjMH/Pa/jsfFnTJDwjAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBUP7Y+gClOY4zznX9zHmN8bn3gLHcYtwXbYevDZ5nLost/G7dx2foUeNzyyy+BN7Zs8ncjeHvrvP/NAW9qvff/rueAn1sfwNMcX3hvL2S/3wPcVt7fTl+p/c4AfIsA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4mYHcBinVRdz+v+2tjlHfdrv8lRjHFZcyG3P22VmBPOWQrrsd+WtJ7iOjzkDzQrA5b/XpATmBHAY1ynj7MtxfD1/kDkBrP+RrGHC1ZnxX8Bpwhj7NOGV8z1A3IxbgBvA455+fcwAcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcT9mjLKcevTfFPn5/860AwQ58ehr2wnPw51C3jMccYgcwL48nyAu11nPB3AI2Je1bRHxMz7EPgxjuaBb7mO46zLP3MG+OMwjuM8ecx3cp419f81O4B51v7PY6evlO8B4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQN2fp2G0cV9zXhEVct7HfGeD6wntjisu4rbRdtj4VHnFYLYDD1qfCY9aZA7z/39jyBFz+N7fsRrD7yX+n62H+4zTG3QvWnscYn1sfOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALvzG8Ijm7EmMQYoAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTEyLTA1VDAyOjEwOjQ5LTA1OjAwJa2zowAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0xMi0wNVQwMjoxMDo0OS0wNTowMFTwCx8AAAAASUVORK5CYII=",
+ MINUS : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAQAAAD2e2DtAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAHdElNRQfhDAUCCi+xWH4JAAABcUlEQVR42u3c7ZGCMBSG0etuYcTKls7AyrSEVWd4+bjnUECMeSbhD6kCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBzu4XHm2rUvPekD2yutR57/4itTLXU0/Pvs9SUW5TcDrDUyE3r9Na6ZwZKBWD5PxVKIBPAVGtknGsZibeBTADPyCjXE1idn8A0/gJjXFPgn0sEwIEljgAHwPc2Xx87QHMCaE4AzQmgOQE0J4DmBNCcAJoTQHMCaE4AzQmgOQE0J4DmBNCcAJoTQHMCaE4AzQmgOQE0J4DmBNDcb2SUsfc0T2re/utAO0BzPg49sot8HOoI+M5IDJIJ4OF+gI+F7gpyRcwxxa6Iyb0E3mvYB96y1kgtv2vijubS18QBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAWXq7xrTQhKAi3AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTEyLTA1VDAyOjEwOjQ3LTA1OjAwdZLI/gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0xMi0wNVQwMjoxMDo0Ny0wNTowMATPcEIAAAAASUVORK5CYII=",
+ HAND : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfiBAUBKBeKSgeBAAABTElEQVQoz22QzyvDcRjHX5/vvrMyStI2uZgftdVCSpJCyW1y00oUF+Xg4OIkx5VyUyJOsgv/gnJw4YCSSFMyB5pGbLJ99/k8LltreB2f9+v50eOigoc5FvGTJF8pugCwaKaNaE98uf9zMBXwjtNpbvmuaH2B0+HXuuyMEbOlQ4U1M5ZVcYbowg02YfZW5cnE9JIROdI7jsiOacoMPLZdEYPR1ouQkxCRG+feESlIXkQOzLR+NhvCpc3UbPcHAoRsADcAQ0Twq0ZosQgEVY0SqvGpkAUCxkIUYRP4bZRRNi9pvaD+TwXyFseHuYzy/Kt8CWfQ5Ems6C/5y7uZyDEH0Nt8vq0dUx0XzaapPyIIoIi23+47+SrlTvrTjLhKy2wmO95OqiacS+QBH9gAFDlOZnYbrimWOixSZCwUlK+vZd7bXiPldyi0yqX1OtkfCBS/9XAtDKAAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTgtMDQtMDVUMDQ6NDQ6NDItMDM6MDD+uUN1AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE4LTA0LTA1VDA0OjQwOjIzLTAzOjAw5hdZgAAAAABJRU5ErkJggg==",
+
+ setDefaultLocale: function(){
+ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = 'Describe el procedimiento...';
+ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Hacer algo";
+ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "Definir";
+ Blockly.Msg.PROCEDURES_DEFNORETURN_NOPARAMS = "";
+ Blockly.Msg.PROCEDURES_DEFRETURN_NOPARAMS = "";
+ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = 'Describe la función...';
+ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = "devolver algo";
+ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = "Definir";
+ Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con";
+ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea un procedimiento.";
+ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una función.";
+ Blockly.Msg.PROCEDURES_ADD_PARAMETER = "Agregar parámetro";
+ Blockly.Msg.PROCEDURES_ADD_PARAMETER_PROMPT = "Ingresa el nombre del parámetro";
+ Blockly.Msg.PROCEDURES_REMOVE_PARAMETER = "Quitar parámetro";
+ Blockly.Msg.PROCEDURES_PARAMETER = "parámetro";
+ },
+
+ init: function(customStatementType, initialize = () => {}) {
+ // -------------------------------------
+ // [!] Fixing FieldImage's click handler
+ // -------------------------------------
+
+ Blockly.FieldImage.prototype.init = function() {
+ if (this.fieldGroup_) {
+ // Image has already been initialized once.
+ return;
}
- if (Blockly.Events.isEnabled() && !newBlock.isShadow()) {
- Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock));
+ // Build the DOM.
+ /** @type {SVGElement} */
+ this.fieldGroup_ = Blockly.utils.createSvgElement('g', {}, null);
+ if (!this.visible_) {
+ this.fieldGroup_.style.display = 'none';
}
- newBlock.select();
-
- return newBlock; // [!]
- };
- };
-
- // --------------------------------------
- // [!] Adding custom procedure parameters
- // --------------------------------------
-
- var createParameterCaller = function(procedureBlock, name) {
- var xmlField = goog.dom.createDom('field', null, name);
- xmlField.setAttribute('name', 'VAR');
- var xmlBlock = goog.dom.createDom('block', null, xmlField);
- xmlBlock.setAttribute('type', 'variables_get');
-
- var callback = Blockly.ContextMenu.callbackFactory(procedureBlock, xmlBlock);
-
- return function() {
- var block = callback();
- block.$parent = procedureBlock.id;
-
- try {
- Blockly.Events.disabled_ = 1;
- const posParent = procedureBlock.getRelativeToSurfaceXY();
- const pos = block.getRelativeToSurfaceXY();
- let width = procedureBlock.width;
- const returnBlock = procedureBlock.inputList.find((it) => it.name === "RETURN");
- if (returnBlock) width -= returnBlock.renderWidth - 8;
-
- block.moveBy(posParent.x - pos.x + width + 16, posParent.y - pos.y + 6);
- } finally {
- Blockly.Events.disabled_ = 0;
+ /** @type {SVGElement} */
+ this.imageElement_ = Blockly.utils.createSvgElement(
+ 'image',
+ {
+ 'height': this.height_ + 'px',
+ 'width': this.width_ + 'px'
+ },
+ this.fieldGroup_);
+ this.setValue(this.src_);
+ this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_);
+
+ // Configure the field to be transparent with respect to tooltips.
+ this.setTooltip(this.sourceBlock_);
+ Blockly.Tooltip.bindMouseEvents(this.imageElement_);
+
+ var self = this;
+
+ if (this.clickHandler_) { // [!]
+ this.imageElement_.addEventListener("mousedown", function(event) {
+ event.stopPropagation();
+ event.preventDefault();
+
+ if (event.button === 0) {
+ self.clickHandler_();
+ }
+ });
+ this.mouseDownWrapper_ =
+ Blockly.bindEventWithChecks_(
+ this.fieldGroup_, 'mousedown', this, this.clickHandler_);
}
};
- };
-
- var getAvailableName = function(self, name) {
- var result = name;
- while (self.arguments_.some(it => it === result))
- result += "_";
- return result;
- }
-
- var addParameter = function(self, index, name) {
- var i = index === undefined ? self.arguments_.length : index;
- var tmpName = name === undefined ? Blockly.Msg.PROCEDURES_PARAMETER + " " + (i + 1) : name;
- var name = index === undefined ? getAvailableName(self, tmpName) : tmpName;
- var id = "INPUTARG" + i;
-
- if (index === undefined) {
- self.arguments_.push(name);
- self.updateParams_();
-
- var blocks = self.workspace.getAllBlocks();
- for (block of blocks)
- if (block.type === self.callType_ && block.getProcedureCall() === self.getProcedureDef()[0]) {
- block.arguments_.push(name);
- block.updateShape_();
+
+ // [!] Modifying callbackFactory to return the created block
+ Blockly.ContextMenu.callbackFactory = function(block, xml) {
+ return function() {
+ Blockly.Events.disable();
+ try {
+ var newBlock = Blockly.Xml.domToBlock(xml, block.workspace);
+ // Move the new block next to the old block.
+ var xy = block.getRelativeToSurfaceXY();
+ if (block.RTL) {
+ xy.x -= Blockly.SNAP_RADIUS;
+ } else {
+ xy.x += Blockly.SNAP_RADIUS;
+ }
+ xy.y += Blockly.SNAP_RADIUS * 2;
+ newBlock.moveBy(xy.x, xy.y);
+ } finally {
+ Blockly.Events.enable();
+ }
+ if (Blockly.Events.isEnabled() && !newBlock.isShadow()) {
+ Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock));
}
+ newBlock.select();
+
+ return newBlock; // [!]
+ };
+ };
+
+ // --------------------------------------
+ // [!] Adding custom procedure parameters
+ // --------------------------------------
+
+ var createParameterCaller = function(procedureBlock, name) {
+ var xmlField = goog.dom.createDom('field', null, name);
+ xmlField.setAttribute('name', 'VAR');
+ var xmlBlock = goog.dom.createDom('block', null, xmlField);
+ xmlBlock.setAttribute('type', 'variables_get');
+
+ var callback = Blockly.ContextMenu.callbackFactory(procedureBlock, xmlBlock);
+
+ return function() {
+ var block = callback();
+ block.$parent = procedureBlock.id;
+
+ try {
+ Blockly.Events.disabled_ = 1;
+ const posParent = procedureBlock.getRelativeToSurfaceXY();
+ const pos = block.getRelativeToSurfaceXY();
+ let width = procedureBlock.width;
+ const returnBlock = procedureBlock.inputList.find((it) => it.name === "RETURN");
+ if (returnBlock) width -= returnBlock.renderWidth - 8;
+
+ block.moveBy(posParent.x - pos.x + width + 16, posParent.y - pos.y + 6);
+ } finally {
+ Blockly.Events.disabled_ = 0;
+ }
+ };
+ };
+
+ var getAvailableName = function(self, name) {
+ var result = name;
+ while (self.arguments_.some(it => it === result))
+ result += "_";
+ return result;
}
-
- var createCallButton = new Blockly.FieldImage(
- HAND,
- 16,
- 16,
- Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', name),
- function() {
- createParameterCaller(self, self.arguments_[i])();
- }
- );
-
- var removeParameterButton = new Blockly.FieldImage(
- MINUS,
- 16,
- 16,
- Blockly.Msg.PROCEDURES_REMOVE_PARAMETER,
- function() {
- for (var j = 0; j < self.arguments_.length; j++)
- self.removeInput("INPUTARG" + j);
- self.arguments_.splice(i, 1);
- self.arguments_.forEach(function(name, i) {
- addParameter(this, i, name, true);
- }.bind(self));
-
+
+ var addParameter = function(self, index, name) {
+ var i = index === undefined ? self.arguments_.length : index;
+ var tmpName = name === undefined ? Blockly.Msg.PROCEDURES_PARAMETER + " " + (i + 1) : name;
+ var name = index === undefined ? getAvailableName(self, tmpName) : tmpName;
+ var id = "INPUTARG" + i;
+
+ if (index === undefined) {
+ self.arguments_.push(name);
+ self.updateParams_();
+
var blocks = self.workspace.getAllBlocks();
for (block of blocks)
if (block.type === self.callType_ && block.getProcedureCall() === self.getProcedureDef()[0]) {
- block.arguments_.splice(i, 1);
+ block.arguments_.push(name);
block.updateShape_();
}
}
- );
-
- var nameField = new Blockly.FieldTextInput(name, function(newName) {
- var oldName = self.arguments_[i];
-
- if (oldName !== newName)
- newName = getAvailableName(self, newName);
-
- self.arguments_[i] = newName;
-
- var blocks = self.workspace.getAllBlocks();
- for (block of blocks) {
- if (block.type === self.callType_ && block.getProcedureCall() === self.getProcedureDef()[0]) {
- block.arguments_ = block.arguments_.map(function(it) {
- return it === oldName ? newName : it;
- });
- block.updateShape_();
- }
-
- if (block.type === "variables_get" && block.$parent === self.id) {
- var varField = block.getField("VAR");
- if (varField.getValue() === oldName) {
- varField.setValue(newName);
- }
- }
- }
-
- return newName;
- });
-
- self
- .appendDummyInput(id)
- .appendField(Blockly.Msg.PROCEDURES_BEFORE_PARAMS)
- .appendField(nameField, 'ARG' + i)
- .appendField(createCallButton)
- .appendField(removeParameterButton);
-
- self.moveInputBefore(id, 'STACK');
- };
-
- var makeProcedureDomToMutation = function() {
- return function(xmlElement) {
- this.arguments_ = [];
- for (var i = 0, childNode; childNode = xmlElement.childNodes[i]; i++) {
- if (childNode.nodeName.toLowerCase() == 'arg') {
- this.arguments_.push(childNode.getAttribute('name'));
- }
- }
- this.updateParams_();
- Blockly.Procedures.mutateCallers(this);
-
- // Show or hide the statement input.
- this.setStatements_(xmlElement.getAttribute('statements') !== 'false');
-
- this.arguments_.forEach(function(name, i) { // [!]
- addParameter(this, i, name);
- }.bind(this));
- };
- }
-
- var makeProcedureInit = function(
- withReturn,
- withStatements = true,
- withParameters = false,
- defaultName,
- title,
- comment,
- tooltip,
- helpUrl,
- returnMsg = Blockly.Msg.PROCEDURES_DEFRETURN_RETURN
- ) {
- return function() {
- var defaultLegalName = Blockly.Procedures.findLegalName(defaultName, this);
- var nameField = new Blockly.FieldTextInput(defaultLegalName, Blockly.Procedures.rename);
- nameField.setSpellcheck(false);
-
- var self = this;
-
- // [!]
- var addParameterButton = new Blockly.FieldImage(
- PLUS,
+
+ var createCallButton = new Blockly.FieldImage(
+ ProcedsBlockly.HAND,
16,
16,
- Blockly.Msg.PROCEDURES_ADD_PARAMETER,
- function() { addParameter(self); }
+ Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', name),
+ function() {
+ createParameterCaller(self, self.arguments_[i])();
+ }
);
-
- var input = this.appendDummyInput()
- .appendField(title)
- .appendField(nameField, 'NAME')
- .appendField('', 'PARAMS');
-
- if (withParameters)
- input.appendField(addParameterButton);
-
- if (withReturn)
- this.appendValueInput('RETURN')
- .setAlign(Blockly.ALIGN_RIGHT)
- .appendField(returnMsg);
-
- // if (withParametersMutator)
- // this.setMutator(new Blockly.Mutator(['procedures_mutatorarg']));
-
- if ((this.workspace.options.comments ||
- (this.workspace.options.parentWorkspace &&
- this.workspace.options.parentWorkspace.options.comments)) &&
- comment) {
- this.setCommentText(comment);
- }
- this.setCommentText(null);
- this.setColour((
- Blockly.CUSTOM_COLORS && (
- Blockly.CUSTOM_COLORS[this.type] ||
- Blockly.CUSTOM_COLORS[withReturn ? "function" : "procedure"]
- )) || Blockly.Blocks.procedures.HUE);
- this.setTooltip(tooltip);
- this.setHelpUrl(helpUrl);
- this.arguments_ = [];
- this.setStatements_(withStatements);
- this.statementConnection_ = null;
-
- // if (!withParametersMutator) this.updateParams_();
-
- // [!] adding create call button
- var createCallButton = new Blockly.FieldImage(
- HAND,
+
+ var removeParameterButton = new Blockly.FieldImage(
+ ProcedsBlockly.MINUS,
16,
16,
- "",
+ Blockly.Msg.PROCEDURES_REMOVE_PARAMETER,
function() {
- var name = self.getFieldValue('NAME');
- var xmlMutation = goog.dom.createDom('mutation');
- xmlMutation.setAttribute('name', name);
- for (var i = 0; i < self.arguments_.length; i++) {
- var xmlArg = goog.dom.createDom('arg');
- xmlArg.setAttribute('name', self.arguments_[i]);
- xmlMutation.appendChild(xmlArg);
+ for (var j = 0; j < self.arguments_.length; j++)
+ self.removeInput("INPUTARG" + j);
+ self.arguments_.splice(i, 1);
+ self.arguments_.forEach(function(name, i) {
+ addParameter(this, i, name, true);
+ }.bind(self));
+
+ var blocks = self.workspace.getAllBlocks();
+ for (block of blocks)
+ if (block.type === self.callType_ && block.getProcedureCall() === self.getProcedureDef()[0]) {
+ block.arguments_.splice(i, 1);
+ block.updateShape_();
+ }
+ }
+ );
+
+ var nameField = new Blockly.FieldTextInput(name, function(newName) {
+ var oldName = self.arguments_[i];
+
+ if (oldName !== newName)
+ newName = getAvailableName(self, newName);
+
+ self.arguments_[i] = newName;
+
+ var blocks = self.workspace.getAllBlocks();
+ for (block of blocks) {
+ if (block.type === self.callType_ && block.getProcedureCall() === self.getProcedureDef()[0]) {
+ block.arguments_ = block.arguments_.map(function(it) {
+ return it === oldName ? newName : it;
+ });
+ block.updateShape_();
}
- var xmlBlock = goog.dom.createDom('block', null, xmlMutation);
- xmlBlock.setAttribute('type', self.callType_);
-
- const block = Blockly.ContextMenu.callbackFactory(self, xmlBlock)();
-
- try {
- const procedureBlock = self;
-
- Blockly.Events.disabled_ = 1;
- const posParent = procedureBlock.getRelativeToSurfaceXY();
- const pos = block.getRelativeToSurfaceXY();
- let width = procedureBlock.width;
- const returnBlock = procedureBlock.inputList.find((it) => it.name === "RETURN");
- if (returnBlock) width -= returnBlock.renderWidth - 8;
-
- block.moveBy(posParent.x - pos.x + width + 16, posParent.y - pos.y + 6);
- } finally {
- Blockly.Events.disabled_ = 0;
+
+ if (block.type === "variables_get" && block.$parent === self.id) {
+ var varField = block.getField("VAR");
+ if (varField.getValue() === oldName) {
+ varField.setValue(newName);
+ }
}
}
- );
- input.appendField(createCallButton);
+
+ return newName;
+ });
+
+ self
+ .appendDummyInput(id)
+ .appendField(Blockly.Msg.PROCEDURES_BEFORE_PARAMS)
+ .appendField(nameField, 'ARG' + i)
+ .appendField(createCallButton)
+ .appendField(removeParameterButton);
+
+ self.moveInputBefore(id, 'STACK');
};
- };
-
- // -----------------------
- // [!] Custom context menu
- // -----------------------
-
- var makeProcedureCustomMenu = function(withParametersOptions = true) {
- return function(options) {
- // Add options to create getters for each parameter.
- if (!this.isCollapsed()) {
- for (var i = this.arguments_.length - 1; i >= 0; i--) {
- var option = {enabled: true};
- var name = this.arguments_[i];
- option.text = Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', name);
- option.callback = createParameterCaller(this, name);
-
- options.unshift(option);
+
+ var makeProcedureDomToMutation = function() {
+ return function(xmlElement) {
+ this.arguments_ = [];
+ for (var i = 0, childNode; childNode = xmlElement.childNodes[i]; i++) {
+ if (childNode.nodeName.toLowerCase() == 'arg') {
+ this.arguments_.push(childNode.getAttribute('name'));
+ }
}
+ this.updateParams_();
+ Blockly.Procedures.mutateCallers(this);
+
+ // Show or hide the statement input.
+ this.setStatements_(xmlElement.getAttribute('statements') !== 'false');
+
+ this.arguments_.forEach(function(name, i) { // [!]
+ addParameter(this, i, name);
+ }.bind(this));
+ };
+ }
+
+ var makeProcedureInit = function(
+ withReturn,
+ withStatements = true,
+ withParameters = false,
+ defaultName,
+ title,
+ comment,
+ tooltip,
+ helpUrl,
+ returnMsg = Blockly.Msg.PROCEDURES_DEFRETURN_RETURN
+ ) {
+ return function() {
+ var defaultLegalName = Blockly.Procedures.findLegalName(defaultName, this);
+ var nameField = new Blockly.FieldTextInput(defaultLegalName, Blockly.Procedures.rename);
+ nameField.setSpellcheck(false);
+
+ var self = this;
+
+ // [!]
+ var addParameterButton = new Blockly.FieldImage(
+ ProcedsBlockly.PLUS,
+ 16,
+ 16,
+ Blockly.Msg.PROCEDURES_ADD_PARAMETER,
+ function() { addParameter(self); }
+ );
+
+ var input = this.appendDummyInput()
+ .appendField(title)
+ .appendField(nameField, 'NAME')
+ .appendField('', 'PARAMS');
+
+ if (withParameters)
+ input.appendField(addParameterButton);
+
+ if (withReturn)
+ this.appendValueInput('RETURN')
+ .setAlign(Blockly.ALIGN_RIGHT)
+ .appendField(returnMsg);
+
+ // if (withParametersMutator)
+ // this.setMutator(new Blockly.Mutator(['procedures_mutatorarg']));
+
+ if ((this.workspace.options.comments ||
+ (this.workspace.options.parentWorkspace &&
+ this.workspace.options.parentWorkspace.options.comments)) &&
+ comment) {
+ this.setCommentText(comment);
+ }
+ this.setCommentText(null);
+ this.setColour((
+ Blockly.CUSTOM_COLORS && (
+ Blockly.CUSTOM_COLORS[this.type] ||
+ Blockly.CUSTOM_COLORS[withReturn ? "function" : "procedure"]
+ )) || Blockly.Blocks.procedures.HUE);
+ this.setTooltip(tooltip);
+ this.setHelpUrl(helpUrl);
+ this.arguments_ = [];
+ this.setStatements_(withStatements);
+ this.statementConnection_ = null;
+
+ // if (!withParametersMutator) this.updateParams_();
+
+ // [!] adding create call button
+ var createCallButton = new Blockly.FieldImage(
+ ProcedsBlockly.HAND,
+ 16,
+ 16,
+ "",
+ function() {
+ var name = self.getFieldValue('NAME');
+ var xmlMutation = goog.dom.createDom('mutation');
+ xmlMutation.setAttribute('name', name);
+ for (var i = 0; i < self.arguments_.length; i++) {
+ var xmlArg = goog.dom.createDom('arg');
+ xmlArg.setAttribute('name', self.arguments_[i]);
+ xmlMutation.appendChild(xmlArg);
+ }
+ var xmlBlock = goog.dom.createDom('block', null, xmlMutation);
+ xmlBlock.setAttribute('type', self.callType_);
+
+ const block = Blockly.ContextMenu.callbackFactory(self, xmlBlock)();
+
+ try {
+ const procedureBlock = self;
+
+ Blockly.Events.disabled_ = 1;
+ const posParent = procedureBlock.getRelativeToSurfaceXY();
+ const pos = block.getRelativeToSurfaceXY();
+ let width = procedureBlock.width;
+ const returnBlock = procedureBlock.inputList.find((it) => it.name === "RETURN");
+ if (returnBlock) width -= returnBlock.renderWidth - 8;
+
+ block.moveBy(posParent.x - pos.x + width + 16, posParent.y - pos.y + 6);
+ } finally {
+ Blockly.Events.disabled_ = 0;
+ }
+ }
+ );
+ input.appendField(createCallButton);
+ };
+ };
+
+ // -----------------------
+ // [!] Custom context menu
+ // -----------------------
+
+ var makeProcedureCustomMenu = function(withParametersOptions = true) {
+ return function(options) {
+ // Add options to create getters for each parameter.
+ if (!this.isCollapsed()) {
+ for (var i = this.arguments_.length - 1; i >= 0; i--) {
+ var option = {enabled: true};
+ var name = this.arguments_[i];
+ option.text = Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', name);
+ option.callback = createParameterCaller(this, name);
+
+ options.unshift(option);
+ }
+ }
+
+ // [!]
+ // if (withParametersOptions) {
+ // options.unshift({
+ // enabled: this.arguments_.length > 0,
+ // text: Blockly.Msg.PROCEDURES_REMOVE_PARAMETER,
+ // callback: function() {
+ // this.arguments_.pop();
+ // this.updateParams_();
+ // }.bind(this)
+ // });
+
+ // options.unshift({
+ // enabled: true,
+ // text: Blockly.Msg.PROCEDURES_ADD_PARAMETER,
+ // callback: function() {
+ // var name = "";
+ // while (name === "") // Rompe encapsulamiento
+ // name = Blockly.Blocks['procedures_mutatorarg'].validator_(prompt(Blockly.Msg.PROCEDURES_ADD_PARAMETER_PROMPT));
+ // if (name === null) return;
+
+ // this.arguments_.push(name);
+ // this.updateParams_();
+ // }.bind(this)
+ // });
+ // }
+
+ // Add option to create caller.
+ var option = {enabled: true};
+ var name = this.getFieldValue('NAME');
+ option.text = Blockly.Msg.PROCEDURES_CREATE_DO.replace('%1', name);
+ var xmlMutation = goog.dom.createDom('mutation');
+ xmlMutation.setAttribute('name', name);
+ for (var i = 0; i < this.arguments_.length; i++) {
+ var xmlArg = goog.dom.createDom('arg');
+ xmlArg.setAttribute('name', this.arguments_[i]);
+ xmlMutation.appendChild(xmlArg);
+ }
+ var xmlBlock = goog.dom.createDom('block', null, xmlMutation);
+ xmlBlock.setAttribute('type', this.callType_);
+ option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock);
+ options.unshift(option); // [!]
+
+ options.pop(); // [!] Remove help
+ };
+ };
+
+ // ---------------------------------------------------------------------
+ // [!] Setting custom statement type to procedure calls and adding color
+ // ---------------------------------------------------------------------
+
+ var oldProceduresCallNoReturnInit = Blockly.Blocks['procedures_callnoreturn'].init;
+ Blockly.Blocks['procedures_callnoreturn'].init = function() {
+ oldProceduresCallNoReturnInit.call(this);
+
+ if (customStatementType) {
+ this.jsonInit({
+ type: customStatementType,
+ previousStatement: customStatementType,
+ nextStatement: customStatementType
+ });
}
-
- // [!]
- // if (withParametersOptions) {
- // options.unshift({
- // enabled: this.arguments_.length > 0,
- // text: Blockly.Msg.PROCEDURES_REMOVE_PARAMETER,
- // callback: function() {
- // this.arguments_.pop();
- // this.updateParams_();
- // }.bind(this)
- // });
-
- // options.unshift({
- // enabled: true,
- // text: Blockly.Msg.PROCEDURES_ADD_PARAMETER,
- // callback: function() {
- // var name = "";
- // while (name === "") // Rompe encapsulamiento
- // name = Blockly.Blocks['procedures_mutatorarg'].validator_(prompt(Blockly.Msg.PROCEDURES_ADD_PARAMETER_PROMPT));
- // if (name === null) return;
-
- // this.arguments_.push(name);
- // this.updateParams_();
- // }.bind(this)
- // });
- // }
-
- // Add option to create caller.
- var option = {enabled: true};
- var name = this.getFieldValue('NAME');
- option.text = Blockly.Msg.PROCEDURES_CREATE_DO.replace('%1', name);
- var xmlMutation = goog.dom.createDom('mutation');
- xmlMutation.setAttribute('name', name);
- for (var i = 0; i < this.arguments_.length; i++) {
- var xmlArg = goog.dom.createDom('arg');
- xmlArg.setAttribute('name', this.arguments_[i]);
- xmlMutation.appendChild(xmlArg);
- }
- var xmlBlock = goog.dom.createDom('block', null, xmlMutation);
- xmlBlock.setAttribute('type', this.callType_);
- option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock);
- options.unshift(option); // [!]
-
- options.pop(); // [!] Remove help
+
+ this.setColour((
+ Blockly.CUSTOM_COLORS && (
+ Blockly.CUSTOM_COLORS[this.type] ||
+ Blockly.CUSTOM_COLORS.procedure_call
+ )) || Blockly.Blocks.procedures.HUE);
};
- };
-
- // ---------------------------------------------------------------------
- // [!] Setting custom statement type to procedure calls and adding color
- // ---------------------------------------------------------------------
-
- var oldProceduresCallNoReturnInit = Blockly.Blocks['procedures_callnoreturn'].init;
- Blockly.Blocks['procedures_callnoreturn'].init = function() {
- oldProceduresCallNoReturnInit.call(this);
-
- if (customStatementType) {
- this.jsonInit({
- type: customStatementType,
- previousStatement: customStatementType,
- nextStatement: customStatementType
- });
- }
-
- this.setColour((
- Blockly.CUSTOM_COLORS && (
- Blockly.CUSTOM_COLORS[this.type] ||
- Blockly.CUSTOM_COLORS.procedure_call
- )) || Blockly.Blocks.procedures.HUE);
- };
-
- // ----------------------------------
- // [!] Adding color to function calls
- // ----------------------------------
-
- var oldProceduresCallReturnInit = Blockly.Blocks['procedures_callreturn'].init;
- Blockly.Blocks['procedures_callreturn'].init = function() {
- oldProceduresCallReturnInit.call(this);
-
- this.setColour((
- Blockly.CUSTOM_COLORS && (
- Blockly.CUSTOM_COLORS[this.type] || // TODO: Usar this.type en todos los cosos de colors
- Blockly.CUSTOM_COLORS.function_call
- )) || Blockly.Blocks.procedures.HUE);
- };
-
- // -------------------------------
- // [!] Patching default procedures
- // -------------------------------
-
- var makeUpdateParams = function() { return function() { }; };
-
- Blockly.Blocks['procedures_defnoreturn'].init = makeProcedureInit(
- false, true, true,
- Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE,
- Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE,
- Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT,
- Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP,
- Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL
- );
- Blockly.Blocks['procedures_defnoreturn'].customContextMenu = makeProcedureCustomMenu();
- Blockly.Blocks['procedures_defnoreturn'].updateParams_ = makeUpdateParams();
- Blockly.Blocks['procedures_defnoreturn'].domToMutation = makeProcedureDomToMutation();
-
- Blockly.Blocks['procedures_defreturn'].init = makeProcedureInit(
- true, true, true,
- Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE,
- Blockly.Msg.PROCEDURES_DEFRETURN_TITLE,
- Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT,
- Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP,
- Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL
- );
- Blockly.Blocks['procedures_defreturn'].customContextMenu = makeProcedureCustomMenu();
- Blockly.Blocks['procedures_defreturn'].updateParams_ = makeUpdateParams();
- Blockly.Blocks['procedures_defreturn'].domToMutation = makeProcedureDomToMutation();
-
- // -------------------------------------------------
- // [!] Adding a new type of procedure with no params
- // -------------------------------------------------
-
- Blockly.Blocks['procedures_defnoreturnnoparams'] = {
- init: makeProcedureInit(
- false, true, false,
+
+ // ----------------------------------
+ // [!] Adding color to function calls
+ // ----------------------------------
+
+ var oldProceduresCallReturnInit = Blockly.Blocks['procedures_callreturn'].init;
+ Blockly.Blocks['procedures_callreturn'].init = function() {
+ oldProceduresCallReturnInit.call(this);
+
+ this.setColour((
+ Blockly.CUSTOM_COLORS && (
+ Blockly.CUSTOM_COLORS[this.type] || // TODO: Usar this.type en todos los cosos de colors
+ Blockly.CUSTOM_COLORS.function_call
+ )) || Blockly.Blocks.procedures.HUE);
+ };
+
+ // -------------------------------
+ // [!] Patching default procedures
+ // -------------------------------
+
+ var makeUpdateParams = function() { return function() { }; };
+
+ Blockly.Blocks['procedures_defnoreturn'].init = makeProcedureInit(
+ false, true, true,
Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE,
Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE,
Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT,
Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP,
Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL
- ),
- setStatements_: Blockly.Blocks['procedures_defnoreturn'].setStatements_,
- updateParams_: makeUpdateParams(),
- mutationToDom: Blockly.Blocks['procedures_defnoreturn'].mutationToDom,
- domToMutation: makeProcedureDomToMutation(),
- decompose: Blockly.Blocks['procedures_defnoreturn'].decompose,
- compose: Blockly.Blocks['procedures_defnoreturn'].compose,
- getProcedureDef: Blockly.Blocks['procedures_defnoreturn'].getProcedureDef,
- getVars: Blockly.Blocks['procedures_defnoreturn'].getVars,
- renameVar: Blockly.Blocks['procedures_defnoreturn'].renameVar,
- customContextMenu: makeProcedureCustomMenu(false),
- callType_: 'procedures_callnoreturnnoparams'
- };
-
- Blockly.Blocks['procedures_callnoreturnnoparams'] = {
- init: Blockly.Blocks['procedures_callnoreturn'].init,
- getProcedureCall: Blockly.Blocks['procedures_callnoreturn'].getProcedureCall,
- renameProcedure: Blockly.Blocks['procedures_callnoreturn'].renameProcedure,
- setProcedureParameters_: Blockly.Blocks['procedures_callnoreturn'].setProcedureParameters_,
- updateShape_: Blockly.Blocks['procedures_callnoreturn'].updateShape_,
- mutationToDom: Blockly.Blocks['procedures_callnoreturn'].mutationToDom,
- domToMutation: Blockly.Blocks['procedures_callnoreturn'].domToMutation,
- renameVar: Blockly.Blocks['procedures_callnoreturn'].renameVar,
- onchange: Blockly.Blocks['procedures_callnoreturn'].onchange,
- customContextMenu: Blockly.Blocks['procedures_callnoreturn'].customContextMenu,
- defType_: 'procedures_defnoreturnnoparams'
- };
-
- // ---------------------------------------------------------------------
- // [!] Adding a new type of function only with return value (and params)
- // ---------------------------------------------------------------------
-
- Blockly.Blocks['procedures_defreturnsimplewithparams'] = {
- init: makeProcedureInit(
- true, false, true,
- Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE,
- Blockly.Msg.PROCEDURES_DEFRETURN_TITLE,
- Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT,
- Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP,
- Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL
- ),
- setStatements_: Blockly.Blocks['procedures_defreturn'].setStatements_,
- updateParams_: makeUpdateParams(),
- mutationToDom: Blockly.Blocks['procedures_defreturn'].mutationToDom,
- domToMutation: makeProcedureDomToMutation(),
- decompose: Blockly.Blocks['procedures_defreturn'].decompose,
- compose: Blockly.Blocks['procedures_defreturn'].compose,
- getProcedureDef: Blockly.Blocks['procedures_defreturn'].getProcedureDef,
- getVars: Blockly.Blocks['procedures_defreturn'].getVars,
- renameVar: Blockly.Blocks['procedures_defreturn'].renameVar,
- customContextMenu: makeProcedureCustomMenu(true),
- callType_: 'procedures_callreturnsimplewithparams'
- };
-
- Blockly.Blocks['procedures_callreturnsimplewithparams'] = {
- init: Blockly.Blocks['procedures_callreturn'].init,
- getProcedureCall: Blockly.Blocks['procedures_callreturn'].getProcedureCall,
- renameProcedure: Blockly.Blocks['procedures_callreturn'].renameProcedure,
- setProcedureParameters_: Blockly.Blocks['procedures_callreturn'].setProcedureParameters_,
- updateShape_: Blockly.Blocks['procedures_callreturn'].updateShape_,
- mutationToDom: Blockly.Blocks['procedures_callreturn'].mutationToDom,
- domToMutation: Blockly.Blocks['procedures_callreturn'].domToMutation,
- renameVar: Blockly.Blocks['procedures_callreturn'].renameVar,
- onchange: Blockly.Blocks['procedures_callreturn'].onchange,
- customContextMenu: Blockly.Blocks['procedures_callreturn'].customContextMenu,
- defType_: 'procedures_defreturnsimplewithparams'
- };
-
- // --------------------------------------------------------
- // [!] Adding a new type of function only with return value
- // --------------------------------------------------------
-
- Blockly.Blocks['procedures_defreturnsimple'] = {
- init: makeProcedureInit(
- true, false, false,
+ );
+ Blockly.Blocks['procedures_defnoreturn'].customContextMenu = makeProcedureCustomMenu();
+ Blockly.Blocks['procedures_defnoreturn'].updateParams_ = makeUpdateParams();
+ Blockly.Blocks['procedures_defnoreturn'].domToMutation = makeProcedureDomToMutation();
+ Blockly.Blocks['procedures_defreturn'].init = makeProcedureInit(
+ true, true, true,
Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE,
Blockly.Msg.PROCEDURES_DEFRETURN_TITLE,
Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT,
Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP,
Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL
- ),
- setStatements_: Blockly.Blocks['procedures_defreturn'].setStatements_,
- updateParams_: makeUpdateParams(),
- mutationToDom: Blockly.Blocks['procedures_defreturn'].mutationToDom,
- domToMutation: makeProcedureDomToMutation(),
- decompose: Blockly.Blocks['procedures_defreturn'].decompose,
- compose: Blockly.Blocks['procedures_defreturn'].compose,
- getProcedureDef: Blockly.Blocks['procedures_defreturn'].getProcedureDef,
- getVars: Blockly.Blocks['procedures_defreturn'].getVars,
- renameVar: Blockly.Blocks['procedures_defreturn'].renameVar,
- customContextMenu: makeProcedureCustomMenu(false),
- callType_: 'procedures_callreturnsimple'
- };
-
- Blockly.Blocks['procedures_callreturnsimple'] = {
- init: Blockly.Blocks['procedures_callreturn'].init,
- getProcedureCall: Blockly.Blocks['procedures_callreturn'].getProcedureCall,
- renameProcedure: Blockly.Blocks['procedures_callreturn'].renameProcedure,
- setProcedureParameters_: Blockly.Blocks['procedures_callreturn'].setProcedureParameters_,
- updateShape_: Blockly.Blocks['procedures_callreturn'].updateShape_,
- mutationToDom: Blockly.Blocks['procedures_callreturn'].mutationToDom,
- domToMutation: Blockly.Blocks['procedures_callreturn'].domToMutation,
- renameVar: Blockly.Blocks['procedures_callreturn'].renameVar,
- onchange: Blockly.Blocks['procedures_callreturn'].onchange,
- customContextMenu: Blockly.Blocks['procedures_callreturn'].customContextMenu,
- defType_: 'procedures_defreturnsimple'
- };
-
- // ---------------------------------------------------------------
- // [!] Calling `initialize` to support another types of procedures
- // ---------------------------------------------------------------
- initialize(
- makeProcedureInit,
- makeUpdateParams,
- makeProcedureDomToMutation,
- makeProcedureCustomMenu
- );
-
+ );
+ Blockly.Blocks['procedures_defreturn'].customContextMenu = makeProcedureCustomMenu();
+ Blockly.Blocks['procedures_defreturn'].updateParams_ = makeUpdateParams();
+ Blockly.Blocks['procedures_defreturn'].domToMutation = makeProcedureDomToMutation();
+
+ // -------------------------------------------------
+ // [!] Adding a new type of procedure with no params
+ // -------------------------------------------------
+
+ Blockly.Blocks['procedures_defnoreturnnoparams'] = {
+ init: makeProcedureInit(
+ false, true, false,
+ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE,
+ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE,
+ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT,
+ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP,
+ Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL
+ ),
+ setStatements_: Blockly.Blocks['procedures_defnoreturn'].setStatements_,
+ updateParams_: makeUpdateParams(),
+ mutationToDom: Blockly.Blocks['procedures_defnoreturn'].mutationToDom,
+ domToMutation: makeProcedureDomToMutation(),
+ decompose: Blockly.Blocks['procedures_defnoreturn'].decompose,
+ compose: Blockly.Blocks['procedures_defnoreturn'].compose,
+ getProcedureDef: Blockly.Blocks['procedures_defnoreturn'].getProcedureDef,
+ getVars: Blockly.Blocks['procedures_defnoreturn'].getVars,
+ renameVar: Blockly.Blocks['procedures_defnoreturn'].renameVar,
+ customContextMenu: makeProcedureCustomMenu(false),
+ callType_: 'procedures_callnoreturnnoparams'
+ };
+
+ Blockly.Blocks['procedures_callnoreturnnoparams'] = {
+ init: Blockly.Blocks['procedures_callnoreturn'].init,
+ getProcedureCall: Blockly.Blocks['procedures_callnoreturn'].getProcedureCall,
+ renameProcedure: Blockly.Blocks['procedures_callnoreturn'].renameProcedure,
+ setProcedureParameters_: Blockly.Blocks['procedures_callnoreturn'].setProcedureParameters_,
+ updateShape_: Blockly.Blocks['procedures_callnoreturn'].updateShape_,
+ mutationToDom: Blockly.Blocks['procedures_callnoreturn'].mutationToDom,
+ domToMutation: Blockly.Blocks['procedures_callnoreturn'].domToMutation,
+ renameVar: Blockly.Blocks['procedures_callnoreturn'].renameVar,
+ onchange: Blockly.Blocks['procedures_callnoreturn'].onchange,
+ customContextMenu: Blockly.Blocks['procedures_callnoreturn'].customContextMenu,
+ defType_: 'procedures_defnoreturnnoparams'
+ };
+
+ // ---------------------------------------------------------------------
+ // [!] Adding a new type of function only with return value (and params)
+ // ---------------------------------------------------------------------
+
+ Blockly.Blocks['procedures_defreturnsimplewithparams'] = {
+ init: makeProcedureInit(
+ true, false, true,
+ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE,
+ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE,
+ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT,
+ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP,
+ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL
+ ),
+ setStatements_: Blockly.Blocks['procedures_defreturn'].setStatements_,
+ updateParams_: makeUpdateParams(),
+ mutationToDom: Blockly.Blocks['procedures_defreturn'].mutationToDom,
+ domToMutation: makeProcedureDomToMutation(),
+ decompose: Blockly.Blocks['procedures_defreturn'].decompose,
+ compose: Blockly.Blocks['procedures_defreturn'].compose,
+ getProcedureDef: Blockly.Blocks['procedures_defreturn'].getProcedureDef,
+ getVars: Blockly.Blocks['procedures_defreturn'].getVars,
+ renameVar: Blockly.Blocks['procedures_defreturn'].renameVar,
+ customContextMenu: makeProcedureCustomMenu(true),
+ callType_: 'procedures_callreturnsimplewithparams'
+ };
+
+ Blockly.Blocks['procedures_callreturnsimplewithparams'] = {
+ init: Blockly.Blocks['procedures_callreturn'].init,
+ getProcedureCall: Blockly.Blocks['procedures_callreturn'].getProcedureCall,
+ renameProcedure: Blockly.Blocks['procedures_callreturn'].renameProcedure,
+ setProcedureParameters_: Blockly.Blocks['procedures_callreturn'].setProcedureParameters_,
+ updateShape_: Blockly.Blocks['procedures_callreturn'].updateShape_,
+ mutationToDom: Blockly.Blocks['procedures_callreturn'].mutationToDom,
+ domToMutation: Blockly.Blocks['procedures_callreturn'].domToMutation,
+ renameVar: Blockly.Blocks['procedures_callreturn'].renameVar,
+ onchange: Blockly.Blocks['procedures_callreturn'].onchange,
+ customContextMenu: Blockly.Blocks['procedures_callreturn'].customContextMenu,
+ defType_: 'procedures_defreturnsimplewithparams'
+ };
+
+ // --------------------------------------------------------
+ // [!] Adding a new type of function only with return value
+ // --------------------------------------------------------
+
+ Blockly.Blocks['procedures_defreturnsimple'] = {
+ init: makeProcedureInit(
+ true, false, false,
+ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE,
+ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE,
+ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT,
+ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP,
+ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL
+ ),
+ setStatements_: Blockly.Blocks['procedures_defreturn'].setStatements_,
+ updateParams_: makeUpdateParams(),
+ mutationToDom: Blockly.Blocks['procedures_defreturn'].mutationToDom,
+ domToMutation: makeProcedureDomToMutation(),
+ decompose: Blockly.Blocks['procedures_defreturn'].decompose,
+ compose: Blockly.Blocks['procedures_defreturn'].compose,
+ getProcedureDef: Blockly.Blocks['procedures_defreturn'].getProcedureDef,
+ getVars: Blockly.Blocks['procedures_defreturn'].getVars,
+ renameVar: Blockly.Blocks['procedures_defreturn'].renameVar,
+ customContextMenu: makeProcedureCustomMenu(false),
+ callType_: 'procedures_callreturnsimple'
+ };
+
+ Blockly.Blocks['procedures_callreturnsimple'] = {
+ init: Blockly.Blocks['procedures_callreturn'].init,
+ getProcedureCall: Blockly.Blocks['procedures_callreturn'].getProcedureCall,
+ renameProcedure: Blockly.Blocks['procedures_callreturn'].renameProcedure,
+ setProcedureParameters_: Blockly.Blocks['procedures_callreturn'].setProcedureParameters_,
+ updateShape_: Blockly.Blocks['procedures_callreturn'].updateShape_,
+ mutationToDom: Blockly.Blocks['procedures_callreturn'].mutationToDom,
+ domToMutation: Blockly.Blocks['procedures_callreturn'].domToMutation,
+ renameVar: Blockly.Blocks['procedures_callreturn'].renameVar,
+ onchange: Blockly.Blocks['procedures_callreturn'].onchange,
+ customContextMenu: Blockly.Blocks['procedures_callreturn'].customContextMenu,
+ defType_: 'procedures_defreturnsimple'
+ };
+
+ // ---------------------------------------------------------------
+ // [!] Calling `initialize` to support another types of procedures
+ // ---------------------------------------------------------------
+ initialize(
+ makeProcedureInit,
+ makeUpdateParams,
+ makeProcedureDomToMutation,
+ makeProcedureCustomMenu
+ );
+
// -------------------------------------------------------------------
- // [!] Adding two flyoutCategories: PROCEDURE_CALLS and FUNCTION_CALLS
- // -------------------------------------------------------------------
-
- Blockly.Procedures.procedureCallFlyoutCategory = function(workspace) {
- var xmlList = [];
-
- function populateProcedures(procedureList) { // [!]
- for (var i = 0; i < procedureList.length; i++) {
- var name = procedureList[i][0];
- var args = procedureList[i][1];
- var templateName = Blockly.Procedures.getDefinition(name, workspace).callType_; // [!]
- //
- //
- //
- //
- //
- var block = goog.dom.createDom('block');
- block.setAttribute('type', templateName);
- block.setAttribute('gap', 16);
- var mutation = goog.dom.createDom('mutation');
- mutation.setAttribute('name', name);
- block.appendChild(mutation);
- for (var j = 0; j < args.length; j++) {
- var arg = goog.dom.createDom('arg');
- arg.setAttribute('name', args[j]);
- mutation.appendChild(arg);
+ // [!] Adding two flyoutCategories: PROCEDURE_CALLS and FUNCTION_CALLS
+ // -------------------------------------------------------------------
+
+ Blockly.Procedures.procedureCallFlyoutCategory = function(workspace) {
+ var xmlList = [];
+
+ function populateProcedures(procedureList) { // [!]
+ for (var i = 0; i < procedureList.length; i++) {
+ var name = procedureList[i][0];
+ var args = procedureList[i][1];
+ var templateName = Blockly.Procedures.getDefinition(name, workspace).callType_; // [!]
+ //
+ //
+ //
+ //
+ //
+ var block = goog.dom.createDom('block');
+ block.setAttribute('type', templateName);
+ block.setAttribute('gap', 16);
+ var mutation = goog.dom.createDom('mutation');
+ mutation.setAttribute('name', name);
+ block.appendChild(mutation);
+ for (var j = 0; j < args.length; j++) {
+ var arg = goog.dom.createDom('arg');
+ arg.setAttribute('name', args[j]);
+ mutation.appendChild(arg);
+ }
+ xmlList.push(block);
}
- xmlList.push(block);
}
- }
-
- var tuple = Blockly.Procedures.allProcedures(workspace);
- populateProcedures(tuple[0]); // [!]
- return xmlList;
- };
-
- Blockly.Procedures.functionCallFlyoutCategory = function(workspace) {
- var xmlList = [];
-
- function populateProcedures(procedureList) { // [!]
- for (var i = 0; i < procedureList.length; i++) {
- var name = procedureList[i][0];
- var args = procedureList[i][1];
- var templateName = Blockly.Procedures.getDefinition(name, workspace).callType_; // [!]
- //
- //
- //
- //
- //
- var block = goog.dom.createDom('block');
- block.setAttribute('type', templateName);
- block.setAttribute('gap', 16);
- var mutation = goog.dom.createDom('mutation');
- mutation.setAttribute('name', name);
- block.appendChild(mutation);
- for (var j = 0; j < args.length; j++) {
- var arg = goog.dom.createDom('arg');
- arg.setAttribute('name', args[j]);
- mutation.appendChild(arg);
+
+ var tuple = Blockly.Procedures.allProcedures(workspace);
+ populateProcedures(tuple[0]); // [!]
+ return xmlList;
+ };
+
+ Blockly.Procedures.functionCallFlyoutCategory = function(workspace) {
+ var xmlList = [];
+
+ function populateProcedures(procedureList) { // [!]
+ for (var i = 0; i < procedureList.length; i++) {
+ var name = procedureList[i][0];
+ var args = procedureList[i][1];
+ var templateName = Blockly.Procedures.getDefinition(name, workspace).callType_; // [!]
+ //
+ //
+ //
+ //
+ //
+ var block = goog.dom.createDom('block');
+ block.setAttribute('type', templateName);
+ block.setAttribute('gap', 16);
+ var mutation = goog.dom.createDom('mutation');
+ mutation.setAttribute('name', name);
+ block.appendChild(mutation);
+ for (var j = 0; j < args.length; j++) {
+ var arg = goog.dom.createDom('arg');
+ arg.setAttribute('name', args[j]);
+ mutation.appendChild(arg);
+ }
+ xmlList.push(block);
}
- xmlList.push(block);
}
- }
-
- var tuple = Blockly.Procedures.allProcedures(workspace);
- populateProcedures(tuple[1]); // [!]
- return xmlList;
- };
-
- Blockly.Flyout.prototype.show = function(xmlList) {
- this.workspace_.setResizesEnabled(false);
- this.hide();
- this.clearOldBlocks_();
-
- // Handle dynamic categories, represented by a name instead of a list of XML.
- // Look up the correct category generation function and call that to get a
- // valid XML list.
- if (xmlList === "PROCEDURE_CALLS") { // [!]
- xmlList = Blockly.Procedures.procedureCallFlyoutCategory(this.workspace_.targetWorkspace);
- } else if (xmlList === "FUNCTION_CALLS") { // [!]
- xmlList = Blockly.Procedures.functionCallFlyoutCategory(this.workspace_.targetWorkspace);
- } else if (typeof xmlList == 'string') {
- var fnToApply = this.workspace_.targetWorkspace.getToolboxCategoryCallback(
- xmlList);
- goog.asserts.assert(goog.isFunction(fnToApply),
- 'Couldn\'t find a callback function when opening a toolbox category.');
- xmlList = fnToApply(this.workspace_.targetWorkspace);
- goog.asserts.assert(goog.isArray(xmlList),
- 'The result of a toolbox category callback must be an array.');
- }
-
- this.setVisible(true);
- // Create the blocks to be shown in this flyout.
- var contents = [];
- var gaps = [];
- this.permanentlyDisabled_.length = 0;
- for (var i = 0, xml; xml = xmlList[i]; i++) {
- if (xml.tagName) {
- var tagName = xml.tagName.toUpperCase();
- var default_gap = this.horizontalLayout_ ? this.GAP_X : this.GAP_Y;
- if (tagName == 'BLOCK') {
- var curBlock = Blockly.Xml.domToBlock(xml, this.workspace_);
- if (curBlock.disabled) {
- // Record blocks that were initially disabled.
- // Do not enable these blocks as a result of capacity filtering.
- this.permanentlyDisabled_.push(curBlock);
- }
- contents.push({type: 'block', block: curBlock});
- var gap = parseInt(xml.getAttribute('gap'), 10);
- gaps.push(isNaN(gap) ? default_gap : gap);
- } else if (xml.tagName.toUpperCase() == 'SEP') {
- // Change the gap between two blocks.
- //
- // The default gap is 24, can be set larger or smaller.
- // This overwrites the gap attribute on the previous block.
- // Note that a deprecated method is to add a gap to a block.
- //
- var newGap = parseInt(xml.getAttribute('gap'), 10);
- // Ignore gaps before the first block.
- if (!isNaN(newGap) && gaps.length > 0) {
- gaps[gaps.length - 1] = newGap;
- } else {
+
+ var tuple = Blockly.Procedures.allProcedures(workspace);
+ populateProcedures(tuple[1]); // [!]
+ return xmlList;
+ };
+
+ Blockly.Flyout.prototype.show = function(xmlList) {
+ this.workspace_.setResizesEnabled(false);
+ this.hide();
+ this.clearOldBlocks_();
+
+ // Handle dynamic categories, represented by a name instead of a list of XML.
+ // Look up the correct category generation function and call that to get a
+ // valid XML list.
+ if (xmlList === "PROCEDURE_CALLS") { // [!]
+ xmlList = Blockly.Procedures.procedureCallFlyoutCategory(this.workspace_.targetWorkspace);
+ } else if (xmlList === "FUNCTION_CALLS") { // [!]
+ xmlList = Blockly.Procedures.functionCallFlyoutCategory(this.workspace_.targetWorkspace);
+ } else if (typeof xmlList == 'string') {
+ var fnToApply = this.workspace_.targetWorkspace.getToolboxCategoryCallback(
+ xmlList);
+ goog.asserts.assert(goog.isFunction(fnToApply),
+ 'Couldn\'t find a callback function when opening a toolbox category.');
+ xmlList = fnToApply(this.workspace_.targetWorkspace);
+ goog.asserts.assert(goog.isArray(xmlList),
+ 'The result of a toolbox category callback must be an array.');
+ }
+
+ this.setVisible(true);
+ // Create the blocks to be shown in this flyout.
+ var contents = [];
+ var gaps = [];
+ this.permanentlyDisabled_.length = 0;
+ for (var i = 0, xml; xml = xmlList[i]; i++) {
+ if (xml.tagName) {
+ var tagName = xml.tagName.toUpperCase();
+ var default_gap = this.horizontalLayout_ ? this.GAP_X : this.GAP_Y;
+ if (tagName == 'BLOCK') {
+ var curBlock = Blockly.Xml.domToBlock(xml, this.workspace_);
+ if (curBlock.disabled) {
+ // Record blocks that were initially disabled.
+ // Do not enable these blocks as a result of capacity filtering.
+ this.permanentlyDisabled_.push(curBlock);
+ }
+ contents.push({type: 'block', block: curBlock});
+ var gap = parseInt(xml.getAttribute('gap'), 10);
+ gaps.push(isNaN(gap) ? default_gap : gap);
+ } else if (xml.tagName.toUpperCase() == 'SEP') {
+ // Change the gap between two blocks.
+ //
+ // The default gap is 24, can be set larger or smaller.
+ // This overwrites the gap attribute on the previous block.
+ // Note that a deprecated method is to add a gap to a block.
+ //
+ var newGap = parseInt(xml.getAttribute('gap'), 10);
+ // Ignore gaps before the first block.
+ if (!isNaN(newGap) && gaps.length > 0) {
+ gaps[gaps.length - 1] = newGap;
+ } else {
+ gaps.push(default_gap);
+ }
+ } else if (tagName == 'BUTTON' || tagName == 'LABEL') {
+ // Labels behave the same as buttons, but are styled differently.
+ var isLabel = tagName == 'LABEL';
+ var curButton = new Blockly.FlyoutButton(this.workspace_,
+ this.targetWorkspace_, xml, isLabel);
+ contents.push({type: 'button', button: curButton});
gaps.push(default_gap);
}
- } else if (tagName == 'BUTTON' || tagName == 'LABEL') {
- // Labels behave the same as buttons, but are styled differently.
- var isLabel = tagName == 'LABEL';
- var curButton = new Blockly.FlyoutButton(this.workspace_,
- this.targetWorkspace_, xml, isLabel);
- contents.push({type: 'button', button: curButton});
- gaps.push(default_gap);
}
}
- }
-
- this.layout_(contents, gaps);
-
- // IE 11 is an incompetent browser that fails to fire mouseout events.
- // When the mouse is over the background, deselect all blocks.
- var deselectAll = function() {
- var topBlocks = this.workspace_.getTopBlocks(false);
- for (var i = 0, block; block = topBlocks[i]; i++) {
- block.removeSelect();
+
+ this.layout_(contents, gaps);
+
+ // IE 11 is an incompetent browser that fails to fire mouseout events.
+ // When the mouse is over the background, deselect all blocks.
+ var deselectAll = function() {
+ var topBlocks = this.workspace_.getTopBlocks(false);
+ for (var i = 0, block; block = topBlocks[i]; i++) {
+ block.removeSelect();
+ }
+ };
+
+ this.listeners_.push(Blockly.bindEventWithChecks_(this.svgBackground_,
+ 'mouseover', this, deselectAll));
+
+ if (this.horizontalLayout_) {
+ this.height_ = 0;
+ } else {
+ this.width_ = 0;
}
+ this.workspace_.setResizesEnabled(true);
+ this.reflow();
+
+ this.filterForCapacity_();
+
+ // Correctly position the flyout's scrollbar when it opens.
+ this.position();
+
+ this.reflowWrapper_ = this.reflow.bind(this);
+ this.workspace_.addChangeListener(this.reflowWrapper_);
};
-
- this.listeners_.push(Blockly.bindEventWithChecks_(this.svgBackground_,
- 'mouseover', this, deselectAll));
-
- if (this.horizontalLayout_) {
- this.height_ = 0;
- } else {
- this.width_ = 0;
- }
- this.workspace_.setResizesEnabled(true);
- this.reflow();
-
- this.filterForCapacity_();
-
- // Correctly position the flyout's scrollbar when it opens.
- this.position();
-
- this.reflowWrapper_ = this.reflow.bind(this);
- this.workspace_.addChangeListener(this.reflowWrapper_);
- };
-
+
+ }
}
+
+window.initProcedsBlockly = function(customStatementType, initialize = () => {}) {
+ console.warn('initProcedsBlockly() is deprecated. You should now use ProcedsBlockly.init()')
+ ProcedsBlockly.setDefaultLocale()
+ ProcedsBlockly.init(customStatementType, initialize = () => {})
+}
\ No newline at end of file