@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.
- package/.nvmrc +1 -0
- package/LICENSE +674 -0
- package/README.md +57 -0
- package/TRADEMARK +1 -0
- package/blockly_compressed_horizontal.js +2268 -0
- package/blockly_compressed_vertical.js +2296 -0
- package/blockly_uncompressed_horizontal.js +1212 -0
- package/blockly_uncompressed_vertical.js +1212 -0
- package/blocks_common/colour.js +61 -0
- package/blocks_common/math.js +159 -0
- package/blocks_common/matrix.js +54 -0
- package/blocks_common/note.js +58 -0
- package/blocks_common/text.js +57 -0
- package/blocks_compressed.js +37 -0
- package/blocks_compressed_horizontal.js +68 -0
- package/blocks_compressed_vertical.js +216 -0
- package/blocks_horizontal/control.js +212 -0
- package/blocks_horizontal/default_toolbox.js +139 -0
- package/blocks_horizontal/event.js +190 -0
- package/blocks_horizontal/wedo.js +325 -0
- package/blocks_vertical/control.js +532 -0
- package/blocks_vertical/data.js +666 -0
- package/blocks_vertical/default_toolbox.js +571 -0
- package/blocks_vertical/event.js +329 -0
- package/blocks_vertical/extensions.js +294 -0
- package/blocks_vertical/looks.js +591 -0
- package/blocks_vertical/motion.js +587 -0
- package/blocks_vertical/operators.js +470 -0
- package/blocks_vertical/procedures.js +1051 -0
- package/blocks_vertical/sensing.js +555 -0
- package/blocks_vertical/sound.js +246 -0
- package/blocks_vertical/vertical_extensions.js +289 -0
- package/build/gen_blocks.js +1 -0
- package/build/test_expect.js +1 -0
- package/build/test_input.js +1 -0
- package/build.py +647 -0
- package/cleanup.sh +101 -0
- package/core/block.js +1837 -0
- package/core/block_animations.js +107 -0
- package/core/block_drag_surface.js +299 -0
- package/core/block_dragger.js +424 -0
- package/core/block_events.js +531 -0
- package/core/block_render_svg_horizontal.js +892 -0
- package/core/block_render_svg_vertical.js +1734 -0
- package/core/block_svg.js +1355 -0
- package/core/blockly.js +620 -0
- package/core/blocks.js +37 -0
- package/core/bubble.js +664 -0
- package/core/bubble_dragger.js +285 -0
- package/core/colours.js +177 -0
- package/core/comment.js +293 -0
- package/core/comment_events.js +539 -0
- package/core/connection.js +776 -0
- package/core/connection_db.js +300 -0
- package/core/constants.js +408 -0
- package/core/contextmenu.js +534 -0
- package/core/css.js +1354 -0
- package/core/data_category.js +490 -0
- package/core/dragged_connection_manager.js +260 -0
- package/core/dropdowndiv.js +408 -0
- package/core/events.js +429 -0
- package/core/events_abstract.js +113 -0
- package/core/extensions.js +450 -0
- package/core/field.js +810 -0
- package/core/field_angle.js +410 -0
- package/core/field_checkbox.js +133 -0
- package/core/field_colour.js +253 -0
- package/core/field_colour_slider.js +387 -0
- package/core/field_date.js +353 -0
- package/core/field_dropdown.js +447 -0
- package/core/field_iconmenu.js +309 -0
- package/core/field_image.js +200 -0
- package/core/field_label.js +136 -0
- package/core/field_label_serializable.js +125 -0
- package/core/field_matrix.js +566 -0
- package/core/field_note.js +850 -0
- package/core/field_number.js +366 -0
- package/core/field_numberdropdown.js +77 -0
- package/core/field_textdropdown.js +164 -0
- package/core/field_textinput.js +675 -0
- package/core/field_textinput_removable.js +105 -0
- package/core/field_variable.js +385 -0
- package/core/field_variable_getter.js +185 -0
- package/core/field_vertical_separator.js +161 -0
- package/core/flyout_base.js +935 -0
- package/core/flyout_button.js +324 -0
- package/core/flyout_dragger.js +83 -0
- package/core/flyout_extension_category_header.js +159 -0
- package/core/flyout_horizontal.js +475 -0
- package/core/flyout_vertical.js +770 -0
- package/core/generator.js +426 -0
- package/core/gesture.js +1010 -0
- package/core/grid.js +227 -0
- package/core/icon.js +205 -0
- package/core/inject.js +496 -0
- package/core/input.js +285 -0
- package/core/insertion_marker_manager.js +678 -0
- package/core/intersection_observer.js +102 -0
- package/core/msg.js +62 -0
- package/core/mutator.js +426 -0
- package/core/names.js +198 -0
- package/core/options.js +244 -0
- package/core/procedures.js +739 -0
- package/core/rendered_connection.js +417 -0
- package/core/scratch_block_comment.js +646 -0
- package/core/scratch_blocks_utils.js +246 -0
- package/core/scratch_bubble.js +699 -0
- package/core/scratch_events.js +131 -0
- package/core/scratch_msgs.js +85 -0
- package/core/scrollbar.js +875 -0
- package/core/toolbox.js +803 -0
- package/core/tooltip.js +337 -0
- package/core/touch.js +226 -0
- package/core/trashcan.js +343 -0
- package/core/ui_events.js +91 -0
- package/core/ui_menu_utils.js +68 -0
- package/core/utils.js +825 -0
- package/core/variable_events.js +259 -0
- package/core/variable_map.js +415 -0
- package/core/variable_model.js +116 -0
- package/core/variables.js +674 -0
- package/core/warning.js +199 -0
- package/core/widgetdiv.js +344 -0
- package/core/workspace.js +673 -0
- package/core/workspace_audio.js +170 -0
- package/core/workspace_comment.js +426 -0
- package/core/workspace_comment_render_svg.js +706 -0
- package/core/workspace_comment_svg.js +609 -0
- package/core/workspace_drag_surface_svg.js +195 -0
- package/core/workspace_dragger.js +132 -0
- package/core/workspace_svg.js +2382 -0
- package/core/xml.js +930 -0
- package/core/zoom_controls.js +301 -0
- package/dist/horizontal.js +222 -0
- package/dist/vertical.js +222 -0
- package/dist/web/horizontal.js +232 -0
- package/dist/web/vertical.js +232 -0
- package/i18n/common.py +234 -0
- package/i18n/create_messages.py +162 -0
- package/i18n/create_scratch_msgs.js +69 -0
- package/i18n/dedup_json.py +73 -0
- package/i18n/js_to_json.js +46 -0
- package/i18n/js_to_json.py +136 -0
- package/i18n/json_to_js.js +52 -0
- package/i18n/json_to_js.py +185 -0
- package/i18n/sync_tx_translations.js +111 -0
- package/i18n/test_scratch_msgs.js +87 -0
- package/i18n/tests.py +47 -0
- package/i18n/xliff_to_json.py +232 -0
- package/local_build.sh +70 -0
- package/media/click.mp3 +0 -0
- package/media/click.ogg +0 -0
- package/media/click.wav +0 -0
- package/media/comment-arrow-down.svg +10 -0
- package/media/comment-arrow-up.svg +10 -0
- package/media/delete-x.svg +10 -0
- package/media/delete.mp3 +0 -0
- package/media/delete.ogg +0 -0
- package/media/delete.wav +0 -0
- package/media/dropdown-arrow-dark.svg +1 -0
- package/media/dropdown-arrow.svg +1 -0
- package/media/extensions/microbit-block-icon.svg +130 -0
- package/media/extensions/music-block-icon.svg +17 -0
- package/media/extensions/pen-block-icon.svg +19 -0
- package/media/extensions/wedo2-block-icon.svg +36 -0
- package/media/eyedropper.svg +22 -0
- package/media/green-flag.svg +17 -0
- package/media/handclosed.cur +0 -0
- package/media/handdelete.cur +0 -0
- package/media/handopen.cur +0 -0
- package/media/icons/arrow.svg +12 -0
- package/media/icons/arrow_button.svg +1 -0
- package/media/icons/control_forever.svg +1 -0
- package/media/icons/control_repeat.svg +1 -0
- package/media/icons/control_stop.svg +1 -0
- package/media/icons/control_wait.svg +1 -0
- package/media/icons/event_broadcast_blue.svg +1 -0
- package/media/icons/event_broadcast_coral.svg +1 -0
- package/media/icons/event_broadcast_green.svg +1 -0
- package/media/icons/event_broadcast_magenta.svg +1 -0
- package/media/icons/event_broadcast_orange.svg +1 -0
- package/media/icons/event_broadcast_purple.svg +1 -0
- package/media/icons/event_when-broadcast-received_blue.svg +1 -0
- package/media/icons/event_when-broadcast-received_coral.svg +1 -0
- package/media/icons/event_when-broadcast-received_green.svg +1 -0
- package/media/icons/event_when-broadcast-received_magenta.svg +1 -0
- package/media/icons/event_when-broadcast-received_orange.svg +1 -0
- package/media/icons/event_when-broadcast-received_purple.svg +1 -0
- package/media/icons/event_whenflagclicked.svg +1 -0
- package/media/icons/remove.svg +19 -0
- package/media/icons/set-led_blue.svg +1 -0
- package/media/icons/set-led_coral.svg +1 -0
- package/media/icons/set-led_green.svg +1 -0
- package/media/icons/set-led_magenta.svg +1 -0
- package/media/icons/set-led_mystery.svg +1 -0
- package/media/icons/set-led_orange.svg +1 -0
- package/media/icons/set-led_purple.svg +1 -0
- package/media/icons/set-led_white.svg +1 -0
- package/media/icons/set-led_yellow.svg +1 -0
- package/media/icons/wedo_motor-clockwise.svg +1 -0
- package/media/icons/wedo_motor-counterclockwise.svg +1 -0
- package/media/icons/wedo_motor-speed_fast.svg +1 -0
- package/media/icons/wedo_motor-speed_med.svg +1 -0
- package/media/icons/wedo_motor-speed_slow.svg +1 -0
- package/media/icons/wedo_when-distance_close.svg +1 -0
- package/media/icons/wedo_when-tilt-backward.svg +1 -0
- package/media/icons/wedo_when-tilt-forward.svg +1 -0
- package/media/icons/wedo_when-tilt-left.svg +1 -0
- package/media/icons/wedo_when-tilt-right.svg +1 -0
- package/media/icons/wedo_when-tilt.svg +1 -0
- package/media/repeat.svg +18 -0
- package/media/rotate-left.svg +1 -0
- package/media/rotate-right.svg +1 -0
- package/media/sprites.png +0 -0
- package/media/status-not-ready.svg +13 -0
- package/media/status-ready.svg +13 -0
- package/media/zoom-in.svg +1 -0
- package/media/zoom-out.svg +1 -0
- package/media/zoom-reset.svg +1 -0
- package/msg/js/en.js +290 -0
- package/msg/json/en.json +285 -0
- package/msg/messages.js +359 -0
- package/msg/scratch_msgs.js +22969 -0
- package/package.json +60 -0
- package/pull_from_blockly.sh +151 -0
- package/renovate.json5 +15 -0
- package/shim/blockly_compressed_horizontal-blocks_compressed.js +1 -0
- package/shim/blockly_compressed_horizontal.Blockly.js +1 -0
- package/shim/blockly_compressed_horizontal.goog.js +1 -0
- package/shim/blockly_compressed_horizontal.js +1 -0
- package/shim/blockly_compressed_vertical-blocks_compressed.js +1 -0
- package/shim/blockly_compressed_vertical.Blockly.js +1 -0
- package/shim/blockly_compressed_vertical.goog.js +1 -0
- package/shim/blockly_compressed_vertical.js +1 -0
- package/shim/blocks_compressed_horizontal-blockly_compressed_horizontal-messages.js +1 -0
- package/shim/blocks_compressed_horizontal.js +1 -0
- package/shim/blocks_compressed_vertical-blockly_compressed_vertical-messages.js +1 -0
- package/shim/blocks_compressed_vertical.js +1 -0
- package/shim/gh-pages.js +1 -0
- package/shim/horizontal.js +1 -0
- package/shim/index.js +17 -0
- package/shim/vertical.js +1 -0
- 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
|
+
};
|