@blockdia/scratch-blocks 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/.nvmrc +1 -0
  2. package/LICENSE +674 -0
  3. package/README.md +57 -0
  4. package/TRADEMARK +1 -0
  5. package/blockly_compressed_horizontal.js +2268 -0
  6. package/blockly_compressed_vertical.js +2296 -0
  7. package/blockly_uncompressed_horizontal.js +1212 -0
  8. package/blockly_uncompressed_vertical.js +1212 -0
  9. package/blocks_common/colour.js +61 -0
  10. package/blocks_common/math.js +159 -0
  11. package/blocks_common/matrix.js +54 -0
  12. package/blocks_common/note.js +58 -0
  13. package/blocks_common/text.js +57 -0
  14. package/blocks_compressed.js +37 -0
  15. package/blocks_compressed_horizontal.js +68 -0
  16. package/blocks_compressed_vertical.js +216 -0
  17. package/blocks_horizontal/control.js +212 -0
  18. package/blocks_horizontal/default_toolbox.js +139 -0
  19. package/blocks_horizontal/event.js +190 -0
  20. package/blocks_horizontal/wedo.js +325 -0
  21. package/blocks_vertical/control.js +532 -0
  22. package/blocks_vertical/data.js +666 -0
  23. package/blocks_vertical/default_toolbox.js +571 -0
  24. package/blocks_vertical/event.js +329 -0
  25. package/blocks_vertical/extensions.js +294 -0
  26. package/blocks_vertical/looks.js +591 -0
  27. package/blocks_vertical/motion.js +587 -0
  28. package/blocks_vertical/operators.js +470 -0
  29. package/blocks_vertical/procedures.js +1051 -0
  30. package/blocks_vertical/sensing.js +555 -0
  31. package/blocks_vertical/sound.js +246 -0
  32. package/blocks_vertical/vertical_extensions.js +289 -0
  33. package/build/gen_blocks.js +1 -0
  34. package/build/test_expect.js +1 -0
  35. package/build/test_input.js +1 -0
  36. package/build.py +647 -0
  37. package/cleanup.sh +101 -0
  38. package/core/block.js +1837 -0
  39. package/core/block_animations.js +107 -0
  40. package/core/block_drag_surface.js +299 -0
  41. package/core/block_dragger.js +424 -0
  42. package/core/block_events.js +531 -0
  43. package/core/block_render_svg_horizontal.js +892 -0
  44. package/core/block_render_svg_vertical.js +1734 -0
  45. package/core/block_svg.js +1355 -0
  46. package/core/blockly.js +620 -0
  47. package/core/blocks.js +37 -0
  48. package/core/bubble.js +664 -0
  49. package/core/bubble_dragger.js +285 -0
  50. package/core/colours.js +177 -0
  51. package/core/comment.js +293 -0
  52. package/core/comment_events.js +539 -0
  53. package/core/connection.js +776 -0
  54. package/core/connection_db.js +300 -0
  55. package/core/constants.js +408 -0
  56. package/core/contextmenu.js +534 -0
  57. package/core/css.js +1354 -0
  58. package/core/data_category.js +490 -0
  59. package/core/dragged_connection_manager.js +260 -0
  60. package/core/dropdowndiv.js +408 -0
  61. package/core/events.js +429 -0
  62. package/core/events_abstract.js +113 -0
  63. package/core/extensions.js +450 -0
  64. package/core/field.js +810 -0
  65. package/core/field_angle.js +410 -0
  66. package/core/field_checkbox.js +133 -0
  67. package/core/field_colour.js +253 -0
  68. package/core/field_colour_slider.js +387 -0
  69. package/core/field_date.js +353 -0
  70. package/core/field_dropdown.js +447 -0
  71. package/core/field_iconmenu.js +309 -0
  72. package/core/field_image.js +200 -0
  73. package/core/field_label.js +136 -0
  74. package/core/field_label_serializable.js +125 -0
  75. package/core/field_matrix.js +566 -0
  76. package/core/field_note.js +850 -0
  77. package/core/field_number.js +366 -0
  78. package/core/field_numberdropdown.js +77 -0
  79. package/core/field_textdropdown.js +164 -0
  80. package/core/field_textinput.js +675 -0
  81. package/core/field_textinput_removable.js +105 -0
  82. package/core/field_variable.js +385 -0
  83. package/core/field_variable_getter.js +185 -0
  84. package/core/field_vertical_separator.js +161 -0
  85. package/core/flyout_base.js +935 -0
  86. package/core/flyout_button.js +324 -0
  87. package/core/flyout_dragger.js +83 -0
  88. package/core/flyout_extension_category_header.js +159 -0
  89. package/core/flyout_horizontal.js +475 -0
  90. package/core/flyout_vertical.js +770 -0
  91. package/core/generator.js +426 -0
  92. package/core/gesture.js +1010 -0
  93. package/core/grid.js +227 -0
  94. package/core/icon.js +205 -0
  95. package/core/inject.js +496 -0
  96. package/core/input.js +285 -0
  97. package/core/insertion_marker_manager.js +678 -0
  98. package/core/intersection_observer.js +102 -0
  99. package/core/msg.js +62 -0
  100. package/core/mutator.js +426 -0
  101. package/core/names.js +198 -0
  102. package/core/options.js +244 -0
  103. package/core/procedures.js +739 -0
  104. package/core/rendered_connection.js +417 -0
  105. package/core/scratch_block_comment.js +646 -0
  106. package/core/scratch_blocks_utils.js +246 -0
  107. package/core/scratch_bubble.js +699 -0
  108. package/core/scratch_events.js +131 -0
  109. package/core/scratch_msgs.js +85 -0
  110. package/core/scrollbar.js +875 -0
  111. package/core/toolbox.js +803 -0
  112. package/core/tooltip.js +337 -0
  113. package/core/touch.js +226 -0
  114. package/core/trashcan.js +343 -0
  115. package/core/ui_events.js +91 -0
  116. package/core/ui_menu_utils.js +68 -0
  117. package/core/utils.js +825 -0
  118. package/core/variable_events.js +259 -0
  119. package/core/variable_map.js +415 -0
  120. package/core/variable_model.js +116 -0
  121. package/core/variables.js +674 -0
  122. package/core/warning.js +199 -0
  123. package/core/widgetdiv.js +344 -0
  124. package/core/workspace.js +673 -0
  125. package/core/workspace_audio.js +170 -0
  126. package/core/workspace_comment.js +426 -0
  127. package/core/workspace_comment_render_svg.js +706 -0
  128. package/core/workspace_comment_svg.js +609 -0
  129. package/core/workspace_drag_surface_svg.js +195 -0
  130. package/core/workspace_dragger.js +132 -0
  131. package/core/workspace_svg.js +2382 -0
  132. package/core/xml.js +930 -0
  133. package/core/zoom_controls.js +301 -0
  134. package/dist/horizontal.js +222 -0
  135. package/dist/vertical.js +222 -0
  136. package/dist/web/horizontal.js +232 -0
  137. package/dist/web/vertical.js +232 -0
  138. package/i18n/common.py +234 -0
  139. package/i18n/create_messages.py +162 -0
  140. package/i18n/create_scratch_msgs.js +69 -0
  141. package/i18n/dedup_json.py +73 -0
  142. package/i18n/js_to_json.js +46 -0
  143. package/i18n/js_to_json.py +136 -0
  144. package/i18n/json_to_js.js +52 -0
  145. package/i18n/json_to_js.py +185 -0
  146. package/i18n/sync_tx_translations.js +111 -0
  147. package/i18n/test_scratch_msgs.js +87 -0
  148. package/i18n/tests.py +47 -0
  149. package/i18n/xliff_to_json.py +232 -0
  150. package/local_build.sh +70 -0
  151. package/media/click.mp3 +0 -0
  152. package/media/click.ogg +0 -0
  153. package/media/click.wav +0 -0
  154. package/media/comment-arrow-down.svg +10 -0
  155. package/media/comment-arrow-up.svg +10 -0
  156. package/media/delete-x.svg +10 -0
  157. package/media/delete.mp3 +0 -0
  158. package/media/delete.ogg +0 -0
  159. package/media/delete.wav +0 -0
  160. package/media/dropdown-arrow-dark.svg +1 -0
  161. package/media/dropdown-arrow.svg +1 -0
  162. package/media/extensions/microbit-block-icon.svg +130 -0
  163. package/media/extensions/music-block-icon.svg +17 -0
  164. package/media/extensions/pen-block-icon.svg +19 -0
  165. package/media/extensions/wedo2-block-icon.svg +36 -0
  166. package/media/eyedropper.svg +22 -0
  167. package/media/green-flag.svg +17 -0
  168. package/media/handclosed.cur +0 -0
  169. package/media/handdelete.cur +0 -0
  170. package/media/handopen.cur +0 -0
  171. package/media/icons/arrow.svg +12 -0
  172. package/media/icons/arrow_button.svg +1 -0
  173. package/media/icons/control_forever.svg +1 -0
  174. package/media/icons/control_repeat.svg +1 -0
  175. package/media/icons/control_stop.svg +1 -0
  176. package/media/icons/control_wait.svg +1 -0
  177. package/media/icons/event_broadcast_blue.svg +1 -0
  178. package/media/icons/event_broadcast_coral.svg +1 -0
  179. package/media/icons/event_broadcast_green.svg +1 -0
  180. package/media/icons/event_broadcast_magenta.svg +1 -0
  181. package/media/icons/event_broadcast_orange.svg +1 -0
  182. package/media/icons/event_broadcast_purple.svg +1 -0
  183. package/media/icons/event_when-broadcast-received_blue.svg +1 -0
  184. package/media/icons/event_when-broadcast-received_coral.svg +1 -0
  185. package/media/icons/event_when-broadcast-received_green.svg +1 -0
  186. package/media/icons/event_when-broadcast-received_magenta.svg +1 -0
  187. package/media/icons/event_when-broadcast-received_orange.svg +1 -0
  188. package/media/icons/event_when-broadcast-received_purple.svg +1 -0
  189. package/media/icons/event_whenflagclicked.svg +1 -0
  190. package/media/icons/remove.svg +19 -0
  191. package/media/icons/set-led_blue.svg +1 -0
  192. package/media/icons/set-led_coral.svg +1 -0
  193. package/media/icons/set-led_green.svg +1 -0
  194. package/media/icons/set-led_magenta.svg +1 -0
  195. package/media/icons/set-led_mystery.svg +1 -0
  196. package/media/icons/set-led_orange.svg +1 -0
  197. package/media/icons/set-led_purple.svg +1 -0
  198. package/media/icons/set-led_white.svg +1 -0
  199. package/media/icons/set-led_yellow.svg +1 -0
  200. package/media/icons/wedo_motor-clockwise.svg +1 -0
  201. package/media/icons/wedo_motor-counterclockwise.svg +1 -0
  202. package/media/icons/wedo_motor-speed_fast.svg +1 -0
  203. package/media/icons/wedo_motor-speed_med.svg +1 -0
  204. package/media/icons/wedo_motor-speed_slow.svg +1 -0
  205. package/media/icons/wedo_when-distance_close.svg +1 -0
  206. package/media/icons/wedo_when-tilt-backward.svg +1 -0
  207. package/media/icons/wedo_when-tilt-forward.svg +1 -0
  208. package/media/icons/wedo_when-tilt-left.svg +1 -0
  209. package/media/icons/wedo_when-tilt-right.svg +1 -0
  210. package/media/icons/wedo_when-tilt.svg +1 -0
  211. package/media/repeat.svg +18 -0
  212. package/media/rotate-left.svg +1 -0
  213. package/media/rotate-right.svg +1 -0
  214. package/media/sprites.png +0 -0
  215. package/media/status-not-ready.svg +13 -0
  216. package/media/status-ready.svg +13 -0
  217. package/media/zoom-in.svg +1 -0
  218. package/media/zoom-out.svg +1 -0
  219. package/media/zoom-reset.svg +1 -0
  220. package/msg/js/en.js +290 -0
  221. package/msg/json/en.json +285 -0
  222. package/msg/messages.js +359 -0
  223. package/msg/scratch_msgs.js +22969 -0
  224. package/package.json +60 -0
  225. package/pull_from_blockly.sh +151 -0
  226. package/renovate.json5 +15 -0
  227. package/shim/blockly_compressed_horizontal-blocks_compressed.js +1 -0
  228. package/shim/blockly_compressed_horizontal.Blockly.js +1 -0
  229. package/shim/blockly_compressed_horizontal.goog.js +1 -0
  230. package/shim/blockly_compressed_horizontal.js +1 -0
  231. package/shim/blockly_compressed_vertical-blocks_compressed.js +1 -0
  232. package/shim/blockly_compressed_vertical.Blockly.js +1 -0
  233. package/shim/blockly_compressed_vertical.goog.js +1 -0
  234. package/shim/blockly_compressed_vertical.js +1 -0
  235. package/shim/blocks_compressed_horizontal-blockly_compressed_horizontal-messages.js +1 -0
  236. package/shim/blocks_compressed_horizontal.js +1 -0
  237. package/shim/blocks_compressed_vertical-blockly_compressed_vertical-messages.js +1 -0
  238. package/shim/blocks_compressed_vertical.js +1 -0
  239. package/shim/gh-pages.js +1 -0
  240. package/shim/horizontal.js +1 -0
  241. package/shim/index.js +17 -0
  242. package/shim/vertical.js +1 -0
  243. package/universal-python.js +82 -0
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @license
3
+ * Visual Blocks Editor
4
+ *
5
+ * Copyright 2018 Google Inc.
6
+ * https://developers.google.com/blockly/
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */
20
+
21
+ /**
22
+ * @fileoverview Methods animating a block on connection and disconnection.
23
+ * @author fenichel@google.com (Rachel Fenichel)
24
+ */
25
+ 'use strict';
26
+
27
+ goog.provide('Blockly.BlockAnimations');
28
+
29
+
30
+ /**
31
+ * Play some UI effects (sound, animation) when disposing of a block.
32
+ * @param {!Blockly.BlockSvg} block The block being disposed of.
33
+ * @package
34
+ */
35
+ Blockly.BlockAnimations.disposeUiEffect = function(block) {
36
+ var workspace = block.workspace;
37
+ var svgGroup = block.getSvgRoot();
38
+ workspace.getAudioManager().play('delete');
39
+
40
+ var xy = workspace.getSvgXY(svgGroup);
41
+ // Deeply clone the current block.
42
+ var clone = svgGroup.cloneNode(true);
43
+ clone.translateX_ = xy.x;
44
+ clone.translateY_ = xy.y;
45
+ clone.setAttribute('transform', 'translate(' + xy.x + ',' + xy.y + ')');
46
+ workspace.getParentSvg().appendChild(clone);
47
+ clone.bBox_ = clone.getBBox();
48
+ // Start the animation.
49
+ Blockly.BlockAnimations.disposeUiStep_(clone, workspace.RTL, new Date,
50
+ workspace.scale);
51
+ };
52
+
53
+ /**
54
+ * Animate a cloned block and eventually dispose of it.
55
+ * This is a class method, not an instance method since the original block has
56
+ * been destroyed and is no longer accessible.
57
+ * @param {!Element} clone SVG element to animate and dispose of.
58
+ * @param {boolean} rtl True if RTL, false if LTR.
59
+ * @param {!Date} start Date of animation's start.
60
+ * @param {number} workspaceScale Scale of workspace.
61
+ * @private
62
+ */
63
+ Blockly.BlockAnimations.disposeUiStep_ = function(clone, rtl, start,
64
+ workspaceScale) {
65
+ var ms = new Date - start;
66
+ var percent = ms / 150;
67
+ if (percent > 1) {
68
+ goog.dom.removeNode(clone);
69
+ } else {
70
+ var x = clone.translateX_ +
71
+ (rtl ? -1 : 1) * clone.bBox_.width * workspaceScale / 2 * percent;
72
+ var y = clone.translateY_ + clone.bBox_.height * workspaceScale * percent;
73
+ var scale = (1 - percent) * workspaceScale;
74
+ clone.setAttribute('transform', 'translate(' + x + ',' + y + ')' +
75
+ ' scale(' + scale + ')');
76
+ setTimeout(Blockly.BlockAnimations.disposeUiStep_, 10, clone, rtl, start,
77
+ workspaceScale);
78
+ }
79
+ };
80
+
81
+ /**
82
+ * Play some UI effects (sound, ripple) after a connection has been established.
83
+ * @param {!Blockly.BlockSvg} block The block being connected.
84
+ * @package
85
+ */
86
+ Blockly.BlockAnimations.connectionUiEffect = function(block) {
87
+ block.workspace.getAudioManager().play('click');
88
+ };
89
+
90
+ /**
91
+ * Play some UI effects (sound, animation) when disconnecting a block.
92
+ * No-op in scratch-blocks, which has no disconnect animation.
93
+ * @param {!Blockly.BlockSvg} _block The block being disconnected.
94
+ * @package
95
+ */
96
+ Blockly.BlockAnimations.disconnectUiEffect = function(
97
+ /* eslint-disable no-unused-vars */ _block
98
+ /* eslint-enable no-unused-vars */) {
99
+ };
100
+
101
+ /**
102
+ * Stop the disconnect UI animation immediately.
103
+ * No-op in scratch-blocks, which has no disconnect animation.
104
+ * @package
105
+ */
106
+ Blockly.BlockAnimations.disconnectUiStop = function() {
107
+ };
@@ -0,0 +1,299 @@
1
+ /**
2
+ * @license
3
+ * Visual Blocks Editor
4
+ *
5
+ * Copyright 2016 Google Inc.
6
+ * https://developers.google.com/blockly/
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */
20
+
21
+ /**
22
+ * @fileoverview A class that manages a surface for dragging blocks. When a
23
+ * block drag is started, we move the block (and children) to a separate DOM
24
+ * element that we move around using translate3d. At the end of the drag, the
25
+ * blocks are put back in into the SVG they came from. This helps performance by
26
+ * avoiding repainting the entire SVG on every mouse move while dragging blocks.
27
+ * @author picklesrus
28
+ */
29
+
30
+ 'use strict';
31
+
32
+ goog.provide('Blockly.BlockDragSurfaceSvg');
33
+ goog.require('Blockly.utils');
34
+ goog.require('goog.asserts');
35
+ goog.require('goog.math.Coordinate');
36
+
37
+
38
+ /**
39
+ * Class for a drag surface for the currently dragged block. This is a separate
40
+ * SVG that contains only the currently moving block, or nothing.
41
+ * @param {!Element} container Containing element.
42
+ * @constructor
43
+ */
44
+ Blockly.BlockDragSurfaceSvg = function(container) {
45
+ /**
46
+ * @type {!Element}
47
+ * @private
48
+ */
49
+ this.container_ = container;
50
+ this.createDom();
51
+ };
52
+
53
+ /**
54
+ * The SVG drag surface. Set once by Blockly.BlockDragSurfaceSvg.createDom.
55
+ * @type {Element}
56
+ * @private
57
+ */
58
+ Blockly.BlockDragSurfaceSvg.prototype.SVG_ = null;
59
+
60
+ /**
61
+ * This is where blocks live while they are being dragged if the drag surface
62
+ * is enabled.
63
+ * @type {Element}
64
+ * @private
65
+ */
66
+ Blockly.BlockDragSurfaceSvg.prototype.dragGroup_ = null;
67
+
68
+ /**
69
+ * Containing HTML element; parent of the workspace and the drag surface.
70
+ * @type {Element}
71
+ * @private
72
+ */
73
+ Blockly.BlockDragSurfaceSvg.prototype.container_ = null;
74
+
75
+ /**
76
+ * Cached value for the scale of the drag surface.
77
+ * Used to set/get the correct translation during and after a drag.
78
+ * @type {number}
79
+ * @private
80
+ */
81
+ Blockly.BlockDragSurfaceSvg.prototype.scale_ = 1;
82
+
83
+ /**
84
+ * Cached value for the translation of the drag surface.
85
+ * This translation is in pixel units, because the scale is applied to the
86
+ * drag group rather than the top-level SVG.
87
+ * @type {goog.math.Coordinate}
88
+ * @private
89
+ */
90
+ Blockly.BlockDragSurfaceSvg.prototype.surfaceXY_ = null;
91
+
92
+ /**
93
+ * ID for the drag shadow filter, set in createDom.
94
+ * Belongs in Scratch Blocks but not Blockly.
95
+ * @type {string}
96
+ * @private
97
+ */
98
+ Blockly.BlockDragSurfaceSvg.prototype.dragShadowFilterId_ = '';
99
+
100
+ /**
101
+ * Standard deviation for gaussian blur on drag shadow, in px.
102
+ * Belongs in Scratch Blocks but not Blockly.
103
+ * @type {number}
104
+ * @const
105
+ */
106
+ Blockly.BlockDragSurfaceSvg.SHADOW_STD_DEVIATION = 6;
107
+
108
+ /**
109
+ * Create the drag surface and inject it into the container.
110
+ */
111
+ Blockly.BlockDragSurfaceSvg.prototype.createDom = function() {
112
+ if (this.SVG_) {
113
+ return; // Already created.
114
+ }
115
+ this.SVG_ = Blockly.utils.createSvgElement('svg',
116
+ {
117
+ 'xmlns': Blockly.SVG_NS,
118
+ 'xmlns:html': Blockly.HTML_NS,
119
+ 'xmlns:xlink': 'http://www.w3.org/1999/xlink',
120
+ 'version': '1.1',
121
+ 'class': 'blocklyBlockDragSurface'
122
+ }, this.container_);
123
+ this.dragGroup_ = Blockly.utils.createSvgElement('g', {}, this.SVG_);
124
+ // Belongs in Scratch Blocks, but not Blockly.
125
+ var defs = Blockly.utils.createSvgElement('defs', {}, this.SVG_);
126
+ this.dragShadowFilterId_ = this.createDropShadowDom_(defs);
127
+ this.dragGroup_.setAttribute(
128
+ 'filter', 'url(#' + this.dragShadowFilterId_ + ')');
129
+ };
130
+
131
+ /**
132
+ * Scratch-specific: Create the SVG def for the drop shadow.
133
+ * @param {Element} defs Defs element to insert the shadow filter definition
134
+ * @return {string} ID for the filter element
135
+ * @private
136
+ */
137
+ Blockly.BlockDragSurfaceSvg.prototype.createDropShadowDom_ = function(defs) {
138
+ var rnd = String(Math.random()).substring(2);
139
+ // Adjust these width/height, x/y properties to stop the shadow from clipping
140
+ var dragShadowFilter = Blockly.utils.createSvgElement('filter',
141
+ {
142
+ 'id': 'blocklyDragShadowFilter' + rnd,
143
+ 'height': '140%',
144
+ 'width': '140%',
145
+ 'y': '-20%',
146
+ 'x': '-20%'
147
+ },
148
+ defs);
149
+ Blockly.utils.createSvgElement('feGaussianBlur',
150
+ {
151
+ 'in': 'SourceAlpha',
152
+ 'stdDeviation': Blockly.BlockDragSurfaceSvg.SHADOW_STD_DEVIATION
153
+ },
154
+ dragShadowFilter);
155
+ var componentTransfer = Blockly.utils.createSvgElement(
156
+ 'feComponentTransfer', {'result': 'offsetBlur'}, dragShadowFilter);
157
+ // Shadow opacity is specified in the adjustable colour library,
158
+ // since the darkness of the shadow largely depends on the workspace colour.
159
+ Blockly.utils.createSvgElement('feFuncA',
160
+ {
161
+ 'type': 'linear',
162
+ 'slope': Blockly.Colours.dragShadowOpacity
163
+ },
164
+ componentTransfer);
165
+ Blockly.utils.createSvgElement('feComposite',
166
+ {
167
+ 'in': 'SourceGraphic',
168
+ 'in2': 'offsetBlur',
169
+ 'operator': 'over'
170
+ },
171
+ dragShadowFilter);
172
+ return dragShadowFilter.id;
173
+ };
174
+
175
+ /**
176
+ * Set the SVG blocks on the drag surface's group and show the surface.
177
+ * Only one block group should be on the drag surface at a time.
178
+ * @param {!Element} blocks Block or group of blocks to place on the drag
179
+ * surface.
180
+ */
181
+ Blockly.BlockDragSurfaceSvg.prototype.setBlocksAndShow = function(blocks) {
182
+ goog.asserts.assert(
183
+ this.dragGroup_.childNodes.length == 0, 'Already dragging a block.');
184
+ // appendChild removes the blocks from the previous parent
185
+ this.dragGroup_.appendChild(blocks);
186
+ this.SVG_.style.display = 'block';
187
+ this.surfaceXY_ = new goog.math.Coordinate(0, 0);
188
+ // This allows blocks to be dragged outside of the blockly svg space.
189
+ // This should be reset to hidden at the end of the block drag.
190
+ // Note that this behavior is different from blockly where block disappear
191
+ // "under" the blockly area.
192
+ var injectionDiv = document.getElementsByClassName('injectionDiv')[0];
193
+ injectionDiv.style.overflow = 'visible';
194
+ };
195
+
196
+ /**
197
+ * Translate and scale the entire drag surface group to the given position, to
198
+ * keep in sync with the workspace.
199
+ * @param {number} x X translation in workspace coordinates.
200
+ * @param {number} y Y translation in workspace coordinates.
201
+ * @param {number} scale Scale of the group.
202
+ */
203
+ Blockly.BlockDragSurfaceSvg.prototype.translateAndScaleGroup = function(x, y, scale) {
204
+ this.scale_ = scale;
205
+ // This is a work-around to prevent a the blocks from rendering
206
+ // fuzzy while they are being dragged on the drag surface.
207
+ var fixedX = x.toFixed(0);
208
+ var fixedY = y.toFixed(0);
209
+ this.dragGroup_.setAttribute('transform',
210
+ 'translate(' + fixedX + ',' + fixedY + ') scale(' + scale + ')');
211
+ };
212
+
213
+ /**
214
+ * Translate the drag surface's SVG based on its internal state.
215
+ * @private
216
+ */
217
+ Blockly.BlockDragSurfaceSvg.prototype.translateSurfaceInternal_ = function() {
218
+ var x = this.surfaceXY_.x;
219
+ var y = this.surfaceXY_.y;
220
+ // This is a work-around to prevent a the blocks from rendering
221
+ // fuzzy while they are being dragged on the drag surface.
222
+ x = x.toFixed(0);
223
+ y = y.toFixed(0);
224
+ this.SVG_.style.display = 'block';
225
+
226
+ Blockly.utils.setCssTransform(this.SVG_,
227
+ 'translate(' + x + 'px, ' + y + 'px)');
228
+ };
229
+
230
+ /**
231
+ * Translate the entire drag surface during a drag.
232
+ * We translate the drag surface instead of the blocks inside the surface
233
+ * so that the browser avoids repainting the SVG.
234
+ * Because of this, the drag coordinates must be adjusted by scale.
235
+ * @param {number} x X translation for the entire surface.
236
+ * @param {number} y Y translation for the entire surface.
237
+ */
238
+ Blockly.BlockDragSurfaceSvg.prototype.translateSurface = function(x, y) {
239
+ this.surfaceXY_ = new goog.math.Coordinate(x * this.scale_, y * this.scale_);
240
+ this.translateSurfaceInternal_();
241
+ };
242
+
243
+ /**
244
+ * Reports the surface translation in scaled workspace coordinates.
245
+ * Use this when finishing a drag to return blocks to the correct position.
246
+ * @return {!goog.math.Coordinate} Current translation of the surface.
247
+ */
248
+ Blockly.BlockDragSurfaceSvg.prototype.getSurfaceTranslation = function() {
249
+ var xy = Blockly.utils.getRelativeXY(this.SVG_);
250
+ return new goog.math.Coordinate(xy.x / this.scale_, xy.y / this.scale_);
251
+ };
252
+
253
+ /**
254
+ * Provide a reference to the drag group (primarily for
255
+ * BlockSvg.getRelativeToSurfaceXY).
256
+ * @return {Element} Drag surface group element.
257
+ */
258
+ Blockly.BlockDragSurfaceSvg.prototype.getGroup = function() {
259
+ return this.dragGroup_;
260
+ };
261
+
262
+ /**
263
+ * Get the current blocks on the drag surface, if any (primarily
264
+ * for BlockSvg.getRelativeToSurfaceXY).
265
+ * @return {!Element|undefined} Drag surface block DOM element, or undefined
266
+ * if no blocks exist.
267
+ */
268
+ Blockly.BlockDragSurfaceSvg.prototype.getCurrentBlock = function() {
269
+ return this.dragGroup_.firstChild;
270
+ };
271
+
272
+ /**
273
+ * Clear the group and hide the surface; move the blocks off onto the provided
274
+ * element.
275
+ * If the block is being deleted it doesn't need to go back to the original
276
+ * surface, since it would be removed immediately during dispose.
277
+ * @param {Element=} opt_newSurface Surface the dragging blocks should be moved
278
+ * to, or null if the blocks should be removed from this surface without
279
+ * being moved to a different surface.
280
+ */
281
+ Blockly.BlockDragSurfaceSvg.prototype.clearAndHide = function(opt_newSurface) {
282
+ if (opt_newSurface) {
283
+ // appendChild removes the node from this.dragGroup_
284
+ opt_newSurface.appendChild(this.getCurrentBlock());
285
+ } else {
286
+ this.dragGroup_.removeChild(this.getCurrentBlock());
287
+ }
288
+ this.SVG_.style.display = 'none';
289
+ goog.asserts.assert(
290
+ this.dragGroup_.childNodes.length == 0, 'Drag group was not cleared.');
291
+ this.surfaceXY_ = null;
292
+
293
+ // Reset the overflow property back to hidden so that nothing appears outside
294
+ // of the blockly area.
295
+ // Note that this behavior is different from blockly. See note in
296
+ // setBlocksAndShow.
297
+ var injectionDiv = document.getElementsByClassName('injectionDiv')[0];
298
+ injectionDiv.style.overflow = 'hidden';
299
+ };