@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,324 @@
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 Class for a button in the flyout.
23
+ * @author fenichel@google.com (Rachel Fenichel)
24
+ */
25
+ 'use strict';
26
+
27
+ goog.provide('Blockly.FlyoutButton');
28
+
29
+ goog.require('goog.dom');
30
+ goog.require('goog.math.Coordinate');
31
+
32
+
33
+ /**
34
+ * Class for a button or label in the flyout. Labels behave the same as buttons,
35
+ * but are styled differently.
36
+ * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to place this
37
+ * button.
38
+ * @param {!Blockly.WorkspaceSvg} targetWorkspace The flyout's target workspace.
39
+ * @param {!Element} xml The XML specifying the label/button.
40
+ * @param {boolean} isLabel Whether this button should be styled as a label.
41
+ * @constructor
42
+ */
43
+ Blockly.FlyoutButton = function(workspace, targetWorkspace, xml, isLabel) {
44
+
45
+ this.init(workspace, targetWorkspace, xml, isLabel);
46
+
47
+ /**
48
+ * Function to call when this button is clicked.
49
+ * @type {function(!Blockly.FlyoutButton)}
50
+ * @private
51
+ */
52
+ this.callback_ = null;
53
+
54
+ var callbackKey = xml.getAttribute('callbackKey');
55
+ if (this.isLabel_ && callbackKey) {
56
+ console.warn('Labels should not have callbacks. Label text: ' + this.text_);
57
+ } else if (!this.isLabel_ &&
58
+ !(callbackKey && targetWorkspace.getButtonCallback(callbackKey))) {
59
+ console.warn('Buttons should have callbacks. Button text: ' + this.text_);
60
+ } else {
61
+ this.callback_ = targetWorkspace.getButtonCallback(callbackKey);
62
+ }
63
+
64
+ this.callbackData_ = xml.getAttribute('callbackData');
65
+ };
66
+
67
+ /**
68
+ * The margin around the text in the button.
69
+ */
70
+ Blockly.FlyoutButton.MARGIN = 40;
71
+
72
+ /**
73
+ * The width of the button's rect.
74
+ * @type {number}
75
+ */
76
+ Blockly.FlyoutButton.prototype.width = 0;
77
+
78
+ /**
79
+ * The height of the button's rect.
80
+ * @type {number}
81
+ */
82
+ Blockly.FlyoutButton.prototype.height = 40; // Can't be computed like the width
83
+
84
+ /**
85
+ * Opaque data that can be passed to Blockly.unbindEvent_.
86
+ * @type {Array.<!Array>}
87
+ * @private
88
+ */
89
+ Blockly.FlyoutButton.prototype.onMouseUpWrapper_ = null;
90
+
91
+ /**
92
+ * Initialize the button or label. This is a helper function to so that the
93
+ * constructor can be overridden.
94
+ * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to place this
95
+ * button.
96
+ * @param {!Blockly.WorkspaceSvg} targetWorkspace The flyout's target workspace.
97
+ * @param {!Element} xml The XML specifying the label/button.
98
+ * @param {boolean} isLabel Whether this button should be styled as a label.
99
+ */
100
+ Blockly.FlyoutButton.prototype.init = function(
101
+ workspace, targetWorkspace, xml, isLabel) {
102
+
103
+ /**
104
+ * @type {!Blockly.WorkspaceSvg}
105
+ * @private
106
+ */
107
+ this.workspace_ = workspace;
108
+
109
+ /**
110
+ * @type {!Blockly.Workspace}
111
+ * @private
112
+ */
113
+ this.targetWorkspace_ = targetWorkspace;
114
+
115
+ /**
116
+ * @type {string}
117
+ * @private
118
+ */
119
+ this.text_ = xml.getAttribute('text');
120
+
121
+ /**
122
+ * @type {!goog.math.Coordinate}
123
+ * @private
124
+ */
125
+ this.position_ = new goog.math.Coordinate(0, 0);
126
+
127
+ /**
128
+ * Whether this button should be styled as a label.
129
+ * @type {boolean}
130
+ * @private
131
+ */
132
+ this.isLabel_ = isLabel;
133
+
134
+ /**
135
+ * Whether this button is a label at the top of a category.
136
+ * @type {boolean}
137
+ * @private
138
+ */
139
+ this.isCategoryLabel_ = xml.getAttribute('category-label') === 'true';
140
+
141
+ /**
142
+ * If specified, a CSS class to add to this button.
143
+ * @type {?string}
144
+ * @private
145
+ */
146
+ this.cssClass_ = xml.getAttribute('web-class') || null;
147
+ };
148
+
149
+ /**
150
+ * Create the button elements.
151
+ * @return {!Element} The button's SVG group.
152
+ */
153
+ Blockly.FlyoutButton.prototype.createDom = function() {
154
+ var cssClass = this.isLabel_ ? 'blocklyFlyoutLabel' : 'blocklyFlyoutButton';
155
+ if (this.cssClass_) {
156
+ cssClass += ' ' + this.cssClass_;
157
+ }
158
+
159
+ this.svgGroup_ = Blockly.utils.createSvgElement('g', {'class': cssClass},
160
+ this.workspace_.getCanvas());
161
+
162
+ this.addTextSvg(this.isLabel_);
163
+
164
+ this.mouseUpWrapper_ = Blockly.bindEventWithChecks_(this.svgGroup_, 'mouseup',
165
+ this, this.onMouseUp_);
166
+ return this.svgGroup_;
167
+ };
168
+
169
+ /**
170
+ * Add the text element for the label or button.
171
+ * @param {boolean} isLabel True if this is a label and not button.
172
+ * @package
173
+ */
174
+ Blockly.FlyoutButton.prototype.addTextSvg = function(isLabel) {
175
+ if (!isLabel) {
176
+ // Shadow rectangle (light source does not mirror in RTL).
177
+ var shadow = Blockly.utils.createSvgElement('rect',
178
+ {
179
+ 'class': 'blocklyFlyoutButtonShadow',
180
+ 'rx': 4,
181
+ 'ry': 4,
182
+ 'x': 1,
183
+ 'y': 1
184
+ },
185
+ this.svgGroup_);
186
+ }
187
+ // Background rectangle.
188
+ var rect = Blockly.utils.createSvgElement('rect',
189
+ {
190
+ 'class': isLabel ?
191
+ 'blocklyFlyoutLabelBackground' : 'blocklyFlyoutButtonBackground',
192
+ 'rx': 4, 'ry': 4
193
+ },
194
+ this.svgGroup_);
195
+
196
+ var svgText = Blockly.utils.createSvgElement('text',
197
+ {
198
+ 'class': isLabel ? 'blocklyFlyoutLabelText' : 'blocklyText',
199
+ 'x': 0,
200
+ 'y': 0,
201
+ 'text-anchor': 'middle'
202
+ },
203
+ this.svgGroup_);
204
+ svgText.textContent = Blockly.utils.replaceMessageReferences(this.text_);
205
+
206
+ this.width = Blockly.Field.getCachedWidth(svgText);
207
+
208
+ if (!isLabel) {
209
+ this.width += 2 * Blockly.FlyoutButton.MARGIN;
210
+ shadow.setAttribute('width', this.width);
211
+ shadow.setAttribute('height', this.height);
212
+ }
213
+
214
+ rect.setAttribute('width', this.width);
215
+ rect.setAttribute('height', this.height);
216
+
217
+ svgText.setAttribute('text-anchor', 'middle');
218
+ svgText.setAttribute('dominant-baseline', 'central');
219
+ svgText.setAttribute('dy', goog.userAgent.EDGE_OR_IE ?
220
+ Blockly.Field.IE_TEXT_OFFSET : '0');
221
+ svgText.setAttribute('x', this.width / 2);
222
+ svgText.setAttribute('y', this.height / 2);
223
+ };
224
+
225
+ /**
226
+ * Correctly position the flyout button and make it visible.
227
+ */
228
+ Blockly.FlyoutButton.prototype.show = function() {
229
+ this.updateTransform_();
230
+ this.svgGroup_.setAttribute('display', 'block');
231
+ };
232
+
233
+ /**
234
+ * Update SVG attributes to match internal state.
235
+ * @private
236
+ */
237
+ Blockly.FlyoutButton.prototype.updateTransform_ = function() {
238
+ this.svgGroup_.setAttribute('transform',
239
+ 'translate(' + this.position_.x + ',' + this.position_.y + ')');
240
+ };
241
+
242
+ /**
243
+ * Move the button to the given x, y coordinates.
244
+ * @param {number} x The new x coordinate.
245
+ * @param {number} y The new y coordinate.
246
+ */
247
+ Blockly.FlyoutButton.prototype.moveTo = function(x, y) {
248
+ this.position_.x = x;
249
+ this.position_.y = y;
250
+ this.updateTransform_();
251
+ };
252
+
253
+ /**
254
+ * Get the button's target workspace.
255
+ * @return {!Blockly.WorkspaceSvg} The target workspace of the flyout where this
256
+ * button resides.
257
+ */
258
+ Blockly.FlyoutButton.prototype.getTargetWorkspace = function() {
259
+ return this.targetWorkspace_;
260
+ };
261
+
262
+ /**
263
+ * Get whether this button is a label at the top of a category.
264
+ * @return {boolean} True if it is a category label.
265
+ * @package
266
+ */
267
+ Blockly.FlyoutButton.prototype.getIsCategoryLabel = function() {
268
+ return this.isCategoryLabel_;
269
+ };
270
+
271
+ /**
272
+ * Get the text of this button.
273
+ * @return {string} The text on the button.
274
+ * @package
275
+ */
276
+ Blockly.FlyoutButton.prototype.getText = function() {
277
+ return this.text_;
278
+ };
279
+
280
+ /**
281
+ * Get the position of this button.
282
+ * @return {!goog.math.Coordinate} The button position.
283
+ * @package
284
+ */
285
+ Blockly.FlyoutButton.prototype.getPosition = function() {
286
+ return this.position_;
287
+ };
288
+
289
+ /**
290
+ * Dispose of this button.
291
+ */
292
+ Blockly.FlyoutButton.prototype.dispose = function() {
293
+ if (this.onMouseUpWrapper_) {
294
+ Blockly.unbindEvent_(this.onMouseUpWrapper_);
295
+ }
296
+ if (this.svgGroup_) {
297
+ goog.dom.removeNode(this.svgGroup_);
298
+ this.svgGroup_ = null;
299
+ }
300
+ this.workspace_ = null;
301
+ this.targetWorkspace_ = null;
302
+ };
303
+
304
+ /**
305
+ * Do something when the button is clicked.
306
+ * @param {!Event} e Mouse up event.
307
+ * @private
308
+ */
309
+ Blockly.FlyoutButton.prototype.onMouseUp_ = function(e) {
310
+ var gesture = this.targetWorkspace_.getGesture(e);
311
+ if (gesture) {
312
+ // If we're in the middle of dragging something (blocks, workspace, etc.) ignore the button.
313
+ // Otherwise, cancel the gesture.
314
+ if (gesture.isDragging()) {
315
+ return;
316
+ }
317
+ gesture.cancel();
318
+ }
319
+
320
+ // Call the callback registered to this button.
321
+ if (this.callback_) {
322
+ this.callback_(this);
323
+ }
324
+ };
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @license
3
+ * Visual Blocks Editor
4
+ *
5
+ * Copyright 2017 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 for dragging a flyout visually.
23
+ * @author fenichel@google.com (Rachel Fenichel)
24
+ */
25
+ 'use strict';
26
+
27
+ goog.provide('Blockly.FlyoutDragger');
28
+
29
+ goog.require('Blockly.WorkspaceDragger');
30
+
31
+ goog.require('goog.asserts');
32
+ goog.require('goog.math.Coordinate');
33
+
34
+
35
+ /**
36
+ * Class for a flyout dragger. It moves a flyout workspace around when it is
37
+ * being dragged by a mouse or touch.
38
+ * Note that the workspace itself manages whether or not it has a drag surface
39
+ * and how to do translations based on that. This simply passes the right
40
+ * commands based on events.
41
+ * @param {!Blockly.Flyout} flyout The flyout to drag.
42
+ * @constructor
43
+ */
44
+ Blockly.FlyoutDragger = function(flyout) {
45
+ Blockly.FlyoutDragger.superClass_.constructor.call(this,
46
+ flyout.getWorkspace());
47
+
48
+ /**
49
+ * The scrollbar to update to move the flyout.
50
+ * Unlike the main workspace, the flyout has only one scrollbar, in either the
51
+ * horizontal or the vertical direction.
52
+ * @type {!Blockly.Scrollbar}
53
+ * @private
54
+ */
55
+ this.scrollbar_ = flyout.scrollbar_;
56
+
57
+ /**
58
+ * Whether the flyout scrolls horizontally. If false, the flyout scrolls
59
+ * vertically.
60
+ * @type {boolean}
61
+ * @private
62
+ */
63
+ this.horizontalLayout_ = flyout.horizontalLayout_;
64
+ };
65
+ goog.inherits(Blockly.FlyoutDragger, Blockly.WorkspaceDragger);
66
+
67
+ /**
68
+ * Move the appropriate scrollbar to drag the flyout.
69
+ * Since flyouts only scroll in one direction at a time, this will discard one
70
+ * of the calculated values.
71
+ * x and y are in pixels.
72
+ * @param {number} x The new x position to move the scrollbar to.
73
+ * @param {number} y The new y position to move the scrollbar to.
74
+ * @private
75
+ */
76
+ Blockly.FlyoutDragger.prototype.updateScroll_ = function(x, y) {
77
+ // Move the scrollbar and the flyout will scroll automatically.
78
+ if (this.horizontalLayout_) {
79
+ this.scrollbar_.set(x);
80
+ } else {
81
+ this.scrollbar_.set(y);
82
+ }
83
+ };
@@ -0,0 +1,159 @@
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 Class for a category header in the flyout for Scratch
23
+ * extensions which can display a textual label and a status button.
24
+ * @author ericr@media.mit.edu (Eric Rosenbaum)
25
+ */
26
+ 'use strict';
27
+
28
+ goog.provide('Blockly.FlyoutExtensionCategoryHeader');
29
+
30
+ goog.require('Blockly.FlyoutButton');
31
+
32
+ /**
33
+ * Class for a category header in the flyout for Scratch extensions which can
34
+ * display a textual label and a status button.
35
+ * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to place this
36
+ * header.
37
+ * @param {!Blockly.WorkspaceSvg} targetWorkspace The flyout's target workspace.
38
+ * @param {!Element} xml The XML specifying the header.
39
+ * @extends {Blockly.FlyoutButton}
40
+ * @constructor
41
+ */
42
+ Blockly.FlyoutExtensionCategoryHeader = function(workspace, targetWorkspace, xml) {
43
+
44
+ this.init(workspace, targetWorkspace, xml, false);
45
+
46
+ /**
47
+ * @type {number}
48
+ * @private
49
+ */
50
+ this.flyoutWidth_ = this.targetWorkspace_.getFlyout().getWidth();
51
+
52
+ /**
53
+ * @type {string}
54
+ */
55
+ this.extensionId = xml.getAttribute('id');
56
+
57
+ /**
58
+ * Whether this is a label at the top of a category.
59
+ * @type {boolean}
60
+ * @private
61
+ */
62
+ this.isCategoryLabel_ = true;
63
+ };
64
+ goog.inherits(Blockly.FlyoutExtensionCategoryHeader, Blockly.FlyoutButton);
65
+
66
+ /**
67
+ * Create the label and button elements.
68
+ * @return {!Element} The SVG group.
69
+ */
70
+ Blockly.FlyoutExtensionCategoryHeader.prototype.createDom = function() {
71
+ var cssClass = 'blocklyFlyoutLabel';
72
+
73
+ this.svgGroup_ = Blockly.utils.createSvgElement('g', {'class': cssClass},
74
+ this.workspace_.getCanvas());
75
+
76
+ this.addTextSvg(true);
77
+
78
+ this.refreshStatus();
79
+
80
+ var statusButtonWidth = 30;
81
+ var marginX = 20;
82
+ var marginY = 5;
83
+ var touchPadding = 16;
84
+
85
+ var statusButtonX = this.workspace_.RTL ? (marginX - this.flyoutWidth_ + statusButtonWidth) :
86
+ (this.flyoutWidth_ - statusButtonWidth - marginX) / this.workspace_.scale;
87
+
88
+ if (this.imageSrc_) {
89
+ /** @type {SVGElement} */
90
+ this.imageElement_ = Blockly.utils.createSvgElement(
91
+ 'image',
92
+ {
93
+ 'class': 'blocklyFlyoutButton',
94
+ 'height': statusButtonWidth + 'px',
95
+ 'width': statusButtonWidth + 'px',
96
+ 'x': statusButtonX + 'px',
97
+ 'y': marginY + 'px'
98
+ },
99
+ this.svgGroup_);
100
+ this.imageElementBackground_ = Blockly.utils.createSvgElement(
101
+ 'rect',
102
+ {
103
+ 'class': 'blocklyTouchTargetBackground',
104
+ 'height': statusButtonWidth + 2 * touchPadding + 'px',
105
+ 'width': statusButtonWidth + 2 * touchPadding + 'px',
106
+ 'x': (statusButtonX - touchPadding) + 'px',
107
+ 'y': (marginY - touchPadding) + 'px'
108
+ },
109
+ this.svgGroup_);
110
+ this.setImageSrc(this.imageSrc_);
111
+ }
112
+
113
+ this.callback_ = Blockly.statusButtonCallback.bind(this, this.extensionId);
114
+
115
+ this.mouseUpWrapper_ = Blockly.bindEventWithChecks_(this.imageElementBackground_, 'mouseup',
116
+ this, this.onMouseUp_);
117
+ return this.svgGroup_;
118
+ };
119
+
120
+ /**
121
+ * Set the image on the status button using a status string.
122
+ */
123
+ Blockly.FlyoutExtensionCategoryHeader.prototype.refreshStatus = function() {
124
+ var status = Blockly.FlyoutExtensionCategoryHeader.getExtensionState(this.extensionId);
125
+ var basePath = Blockly.mainWorkspace.options.pathToMedia;
126
+ if (status == Blockly.StatusButtonState.READY) {
127
+ this.setImageSrc(basePath + 'status-ready.svg');
128
+ }
129
+ if (status == Blockly.StatusButtonState.NOT_READY) {
130
+ this.setImageSrc(basePath + 'status-not-ready.svg');
131
+ }
132
+ };
133
+
134
+ /**
135
+ * Set the source URL of the image for the button.
136
+ * @param {?string} src New source.
137
+ * @package
138
+ */
139
+ Blockly.FlyoutExtensionCategoryHeader.prototype.setImageSrc = function(src) {
140
+ if (src === null) {
141
+ // No change if null.
142
+ return;
143
+ }
144
+ this.imageSrc_ = src;
145
+ if (this.imageElement_) {
146
+ this.imageElement_.setAttributeNS('http://www.w3.org/1999/xlink',
147
+ 'xlink:href', this.imageSrc_ || '');
148
+ }
149
+ };
150
+
151
+ /**
152
+ * Gets the extension state. Overridden externally.
153
+ * @param {string} extensionId The ID of the extension in question.
154
+ * @return {Blockly.StatusButtonState} The state of the extension.
155
+ * @public
156
+ */
157
+ Blockly.FlyoutExtensionCategoryHeader.getExtensionState = function(/* extensionId */) {
158
+ return Blockly.StatusButtonState.NOT_READY;
159
+ };