blockly 7.20211209.4 → 8.0.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/blockly.d.ts +18963 -18432
- package/blockly.min.js +852 -844
- package/blockly_compressed.js +669 -664
- package/blockly_compressed.js.map +1 -1
- package/blocks/blocks.js +47 -0
- package/blocks/colour.js +13 -3
- package/blocks/lists.js +22 -13
- package/blocks/logic.js +13 -3
- package/blocks/loops.js +24 -11
- package/blocks/math.js +12 -3
- package/blocks/procedures.js +41 -27
- package/blocks/text.js +22 -13
- package/blocks/variables.js +14 -3
- package/blocks/variables_dynamic.js +13 -3
- package/blocks_compressed.js +146 -141
- package/blocks_compressed.js.map +1 -1
- package/core/block.js +1869 -1814
- package/core/block_drag_surface.js +201 -200
- package/core/block_dragger.js +377 -373
- package/core/block_svg.js +1593 -1479
- package/core/blockly.js +8 -22
- package/core/blocks.js +9 -2
- package/core/browser_events.js +22 -5
- package/core/bubble.js +841 -797
- package/core/bubble_dragger.js +213 -206
- package/core/bump_objects.js +2 -2
- package/core/clipboard.js +9 -9
- package/core/comment.js +353 -332
- package/core/common.js +46 -17
- package/core/component_manager.js +181 -174
- package/core/config.js +87 -0
- package/core/connection.js +595 -584
- package/core/connection_checker.js +242 -244
- package/core/connection_db.js +235 -230
- package/core/contextmenu.js +9 -6
- package/core/contextmenu_items.js +1 -2
- package/core/contextmenu_registry.js +93 -89
- package/core/css.js +474 -474
- package/core/delete_area.js +45 -42
- package/core/drag_target.js +57 -56
- package/core/dropdowndiv.js +153 -163
- package/core/events/events.js +2 -2
- package/core/events/events_abstract.js +89 -77
- package/core/events/events_block_base.js +37 -36
- package/core/events/events_block_change.js +130 -124
- package/core/events/events_block_create.js +73 -71
- package/core/events/events_block_delete.js +84 -82
- package/core/events/events_block_drag.js +50 -49
- package/core/events/events_block_move.js +147 -140
- package/core/events/events_bubble_open.js +51 -50
- package/core/events/events_click.js +48 -44
- package/core/events/events_comment_base.js +72 -69
- package/core/events/events_comment_change.js +63 -61
- package/core/events/events_comment_create.js +44 -42
- package/core/events/events_comment_delete.js +42 -40
- package/core/events/events_comment_move.js +106 -104
- package/core/events/events_marker_move.js +65 -64
- package/core/events/events_selected.js +46 -45
- package/core/events/events_theme_change.js +36 -35
- package/core/events/events_toolbox_item_select.js +46 -45
- package/core/events/events_trashcan_open.js +37 -36
- package/core/events/events_ui.js +47 -46
- package/core/events/events_ui_base.js +30 -29
- package/core/events/events_var_base.js +37 -36
- package/core/events/events_var_create.js +50 -48
- package/core/events/events_var_delete.js +50 -48
- package/core/events/events_var_rename.js +51 -49
- package/core/events/events_viewport.js +66 -65
- package/core/events/utils.js +29 -14
- package/core/events/workspace_events.js +49 -55
- package/core/extensions.js +4 -3
- package/core/field.js +1061 -997
- package/core/field_angle.js +462 -442
- package/core/field_checkbox.js +194 -182
- package/core/field_colour.js +519 -505
- package/core/field_dropdown.js +617 -598
- package/core/field_image.js +229 -220
- package/core/field_label.js +102 -91
- package/core/field_label_serializable.js +42 -41
- package/core/field_multilineinput.js +372 -358
- package/core/field_number.js +272 -253
- package/core/field_textinput.js +499 -467
- package/core/field_variable.js +458 -420
- package/core/flyout_base.js +1005 -952
- package/core/flyout_button.js +277 -260
- package/core/flyout_horizontal.js +304 -302
- package/core/flyout_metrics_manager.js +64 -64
- package/core/flyout_vertical.js +306 -300
- package/core/generator.js +459 -446
- package/core/gesture.js +829 -813
- package/core/grid.js +166 -163
- package/core/icon.js +168 -159
- package/core/inject.js +7 -5
- package/core/input.js +257 -248
- package/core/insertion_marker_manager.js +655 -624
- package/core/internal_constants.js +0 -129
- package/core/keyboard_nav/ast_node.js +605 -596
- package/core/keyboard_nav/basic_cursor.js +166 -165
- package/core/keyboard_nav/cursor.js +99 -97
- package/core/keyboard_nav/marker.js +83 -79
- package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
- package/core/marker_manager.js +153 -141
- package/core/menu.js +377 -372
- package/core/menuitem.js +223 -217
- package/core/metrics_manager.js +403 -390
- package/core/mutator.js +468 -437
- package/core/names.js +229 -188
- package/core/options.js +290 -284
- package/core/procedures.js +29 -17
- package/core/registry.js +19 -16
- package/core/rendered_connection.js +482 -463
- package/core/renderers/common/block_rendering.js +9 -3
- package/core/renderers/common/constants.js +1119 -1112
- package/core/renderers/common/debug.js +14 -0
- package/core/renderers/common/debugger.js +338 -316
- package/core/renderers/common/drawer.js +380 -370
- package/core/renderers/common/i_path_object.js +2 -2
- package/core/renderers/common/info.js +626 -618
- package/core/renderers/common/marker_svg.js +579 -541
- package/core/renderers/common/path_object.js +203 -200
- package/core/renderers/common/renderer.js +220 -218
- package/core/renderers/geras/constants.js +36 -36
- package/core/renderers/geras/drawer.js +155 -147
- package/core/renderers/geras/highlight_constants.js +244 -238
- package/core/renderers/geras/highlighter.js +231 -179
- package/core/renderers/geras/info.js +392 -369
- package/core/renderers/geras/measurables/inline_input.js +25 -19
- package/core/renderers/geras/measurables/statement_input.js +23 -17
- package/core/renderers/geras/path_object.js +106 -121
- package/core/renderers/geras/renderer.js +96 -98
- package/core/renderers/measurables/base.js +30 -18
- package/core/renderers/measurables/bottom_row.js +83 -80
- package/core/renderers/measurables/connection.js +22 -15
- package/core/renderers/measurables/external_value_input.js +35 -22
- package/core/renderers/measurables/field.js +35 -20
- package/core/renderers/measurables/hat.js +18 -13
- package/core/renderers/measurables/icon.js +24 -17
- package/core/renderers/measurables/in_row_spacer.js +15 -13
- package/core/renderers/measurables/inline_input.js +43 -33
- package/core/renderers/measurables/input_connection.js +41 -28
- package/core/renderers/measurables/input_row.js +50 -44
- package/core/renderers/measurables/jagged_edge.js +14 -12
- package/core/renderers/measurables/next_connection.js +16 -14
- package/core/renderers/measurables/output_connection.js +26 -20
- package/core/renderers/measurables/previous_connection.js +16 -15
- package/core/renderers/measurables/round_corner.js +20 -18
- package/core/renderers/measurables/row.js +184 -168
- package/core/renderers/measurables/spacer_row.js +38 -23
- package/core/renderers/measurables/square_corner.js +18 -16
- package/core/renderers/measurables/statement_input.js +23 -20
- package/core/renderers/measurables/top_row.js +88 -85
- package/core/renderers/minimalist/constants.js +8 -7
- package/core/renderers/minimalist/drawer.js +11 -10
- package/core/renderers/minimalist/info.js +18 -18
- package/core/renderers/minimalist/renderer.js +40 -39
- package/core/renderers/thrasos/info.js +258 -248
- package/core/renderers/thrasos/renderer.js +20 -20
- package/core/renderers/zelos/constants.js +898 -873
- package/core/renderers/zelos/drawer.js +186 -169
- package/core/renderers/zelos/info.js +502 -479
- package/core/renderers/zelos/marker_svg.js +129 -115
- package/core/renderers/zelos/measurables/bottom_row.js +31 -30
- package/core/renderers/zelos/measurables/inputs.js +22 -21
- package/core/renderers/zelos/measurables/row_elements.js +14 -13
- package/core/renderers/zelos/measurables/top_row.js +34 -33
- package/core/renderers/zelos/path_object.js +181 -180
- package/core/renderers/zelos/renderer.js +91 -92
- package/core/scrollbar.js +759 -713
- package/core/scrollbar_pair.js +250 -245
- package/core/serialization/blocks.js +19 -9
- package/core/serialization/workspaces.js +3 -2
- package/core/shortcut_registry.js +286 -277
- package/core/sprites.js +31 -0
- package/core/theme.js +135 -141
- package/core/theme_manager.js +147 -143
- package/core/toolbox/category.js +602 -576
- package/core/toolbox/collapsible_category.js +226 -227
- package/core/toolbox/separator.js +70 -61
- package/core/toolbox/toolbox.js +934 -927
- package/core/toolbox/toolbox_item.js +115 -99
- package/core/tooltip.js +108 -35
- package/core/touch.js +8 -3
- package/core/touch_gesture.js +254 -251
- package/core/trashcan.js +606 -595
- package/core/utils/coordinate.js +97 -95
- package/core/utils/dom.js +2 -2
- package/core/utils/global.js +2 -0
- package/core/utils/rect.js +41 -37
- package/core/utils/sentinel.js +25 -0
- package/core/utils/size.js +30 -27
- package/core/utils/svg.js +18 -16
- package/core/variable_map.js +325 -341
- package/core/variable_model.js +55 -54
- package/core/variables.js +9 -2
- package/core/variables_dynamic.js +3 -1
- package/core/warning.js +126 -120
- package/core/widgetdiv.js +4 -4
- package/core/workspace.js +685 -664
- package/core/workspace_audio.js +124 -118
- package/core/workspace_comment.js +308 -298
- package/core/workspace_comment_svg.js +1029 -951
- package/core/workspace_drag_surface_svg.js +147 -140
- package/core/workspace_dragger.js +70 -71
- package/core/workspace_svg.js +2322 -2297
- package/core/xml.js +30 -20
- package/core/zoom_controls.js +431 -439
- package/dart_compressed.js +40 -43
- package/dart_compressed.js.map +1 -1
- package/generators/dart/colour.js +56 -64
- package/generators/dart/lists.js +61 -50
- package/generators/dart/math.js +160 -148
- package/generators/dart/text.js +83 -61
- package/generators/javascript/colour.js +37 -34
- package/generators/javascript/lists.js +50 -43
- package/generators/javascript/math.js +123 -139
- package/generators/javascript/text.js +67 -81
- package/generators/lua/colour.js +25 -23
- package/generators/lua/lists.js +97 -69
- package/generators/lua/logic.js +1 -2
- package/generators/lua/math.js +182 -144
- package/generators/lua/text.js +116 -99
- package/generators/php/colour.js +38 -32
- package/generators/php/lists.js +109 -89
- package/generators/php/math.js +90 -81
- package/generators/php/text.js +63 -61
- package/generators/python/colour.js +18 -18
- package/generators/python/lists.js +38 -30
- package/generators/python/loops.js +12 -8
- package/generators/python/math.js +104 -106
- package/generators/python/text.js +34 -30
- package/javascript_compressed.js +37 -39
- package/javascript_compressed.js.map +1 -1
- package/lua_compressed.js +39 -42
- package/lua_compressed.js.map +1 -1
- package/msg/az.js +2 -2
- package/msg/be.js +4 -4
- package/msg/cs.js +15 -15
- package/msg/de.js +1 -1
- package/msg/diq.js +1 -1
- package/msg/eo.js +1 -1
- package/msg/es.js +1 -1
- package/msg/fa.js +1 -1
- package/msg/fr.js +4 -4
- package/msg/he.js +1 -1
- package/msg/hr.js +2 -2
- package/msg/hy.js +2 -2
- package/msg/id.js +12 -12
- package/msg/inh.js +14 -14
- package/msg/ja.js +7 -7
- package/msg/lv.js +29 -29
- package/msg/pa.js +3 -3
- package/msg/smn.js +436 -0
- package/msg/te.js +1 -1
- package/msg/yue.js +1 -1
- package/msg/zh-hans.js +3 -3
- package/msg/zh-hant.js +3 -3
- package/package.json +7 -6
- package/php_compressed.js +38 -42
- package/php_compressed.js.map +1 -1
- package/python_compressed.js +26 -25
- package/python_compressed.js.map +1 -1
- package/blocks/all.js +0 -23
package/core/flyout_button.js
CHANGED
|
@@ -29,311 +29,328 @@ const {WorkspaceSvg} = goog.requireType('Blockly.WorkspaceSvg');
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
* Class for a button in the flyout.
|
|
33
|
-
* @param {!WorkspaceSvg} workspace The workspace in which to place this
|
|
34
|
-
* button.
|
|
35
|
-
* @param {!WorkspaceSvg} targetWorkspace The flyout's target workspace.
|
|
36
|
-
* @param {!toolbox.ButtonOrLabelInfo} json
|
|
37
|
-
* The JSON specifying the label/button.
|
|
38
|
-
* @param {boolean} isLabel Whether this button should be styled as a label.
|
|
39
|
-
* @constructor
|
|
40
|
-
* @package
|
|
32
|
+
* Class for a button or label in the flyout.
|
|
41
33
|
* @alias Blockly.FlyoutButton
|
|
42
34
|
*/
|
|
43
|
-
|
|
44
|
-
// Labels behave the same as buttons, but are styled differently.
|
|
45
|
-
|
|
35
|
+
class FlyoutButton {
|
|
46
36
|
/**
|
|
47
|
-
* @
|
|
48
|
-
*
|
|
37
|
+
* @param {!WorkspaceSvg} workspace The workspace in which to place this
|
|
38
|
+
* button.
|
|
39
|
+
* @param {!WorkspaceSvg} targetWorkspace The flyout's target workspace.
|
|
40
|
+
* @param {!toolbox.ButtonOrLabelInfo} json
|
|
41
|
+
* The JSON specifying the label/button.
|
|
42
|
+
* @param {boolean} isLabel Whether this button should be styled as a label.
|
|
43
|
+
* @package
|
|
49
44
|
*/
|
|
50
|
-
|
|
45
|
+
constructor(workspace, targetWorkspace, json, isLabel) {
|
|
46
|
+
/**
|
|
47
|
+
* @type {!WorkspaceSvg}
|
|
48
|
+
* @private
|
|
49
|
+
*/
|
|
50
|
+
this.workspace_ = workspace;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @type {!WorkspaceSvg}
|
|
54
|
+
* @private
|
|
55
|
+
*/
|
|
56
|
+
this.targetWorkspace_ = targetWorkspace;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @type {string}
|
|
60
|
+
* @private
|
|
61
|
+
*/
|
|
62
|
+
this.text_ = json['text'];
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @type {!Coordinate}
|
|
66
|
+
* @private
|
|
67
|
+
*/
|
|
68
|
+
this.position_ = new Coordinate(0, 0);
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Whether this button should be styled as a label.
|
|
72
|
+
* Labels behave the same as buttons, but are styled differently.
|
|
73
|
+
* @type {boolean}
|
|
74
|
+
* @private
|
|
75
|
+
*/
|
|
76
|
+
this.isLabel_ = isLabel;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The key to the function called when this button is clicked.
|
|
80
|
+
* @type {string}
|
|
81
|
+
* @private
|
|
82
|
+
*/
|
|
83
|
+
this.callbackKey_ = json['callbackKey'] ||
|
|
84
|
+
/* Check the lower case version too to satisfy IE */
|
|
85
|
+
json['callbackkey'];
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* If specified, a CSS class to add to this button.
|
|
89
|
+
* @type {?string}
|
|
90
|
+
* @private
|
|
91
|
+
*/
|
|
92
|
+
this.cssClass_ = json['web-class'] || null;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Mouse up event data.
|
|
96
|
+
* @type {?browserEvents.Data}
|
|
97
|
+
* @private
|
|
98
|
+
*/
|
|
99
|
+
this.onMouseUpWrapper_ = null;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* The JSON specifying the label / button.
|
|
103
|
+
* @type {!toolbox.ButtonOrLabelInfo}
|
|
104
|
+
*/
|
|
105
|
+
this.info = json;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The width of the button's rect.
|
|
109
|
+
* @type {number}
|
|
110
|
+
*/
|
|
111
|
+
this.width = 0;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* The height of the button's rect.
|
|
115
|
+
* @type {number}
|
|
116
|
+
*/
|
|
117
|
+
this.height = 0;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The root SVG group for the button or label.
|
|
121
|
+
* @type {?SVGGElement}
|
|
122
|
+
* @private
|
|
123
|
+
*/
|
|
124
|
+
this.svgGroup_ = null;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* The SVG element with the text of the label or button.
|
|
128
|
+
* @type {?SVGTextElement}
|
|
129
|
+
* @private
|
|
130
|
+
*/
|
|
131
|
+
this.svgText_ = null;
|
|
132
|
+
}
|
|
51
133
|
|
|
52
134
|
/**
|
|
53
|
-
*
|
|
54
|
-
* @
|
|
135
|
+
* Create the button elements.
|
|
136
|
+
* @return {!SVGElement} The button's SVG group.
|
|
55
137
|
*/
|
|
56
|
-
|
|
138
|
+
createDom() {
|
|
139
|
+
let cssClass = this.isLabel_ ? 'blocklyFlyoutLabel' : 'blocklyFlyoutButton';
|
|
140
|
+
if (this.cssClass_) {
|
|
141
|
+
cssClass += ' ' + this.cssClass_;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
this.svgGroup_ = dom.createSvgElement(
|
|
145
|
+
Svg.G, {'class': cssClass}, this.workspace_.getCanvas());
|
|
146
|
+
|
|
147
|
+
let shadow;
|
|
148
|
+
if (!this.isLabel_) {
|
|
149
|
+
// Shadow rectangle (light source does not mirror in RTL).
|
|
150
|
+
shadow = dom.createSvgElement(
|
|
151
|
+
Svg.RECT, {
|
|
152
|
+
'class': 'blocklyFlyoutButtonShadow',
|
|
153
|
+
'rx': 4,
|
|
154
|
+
'ry': 4,
|
|
155
|
+
'x': 1,
|
|
156
|
+
'y': 1,
|
|
157
|
+
},
|
|
158
|
+
this.svgGroup_);
|
|
159
|
+
}
|
|
160
|
+
// Background rectangle.
|
|
161
|
+
const rect = dom.createSvgElement(
|
|
162
|
+
Svg.RECT, {
|
|
163
|
+
'class': this.isLabel_ ? 'blocklyFlyoutLabelBackground' :
|
|
164
|
+
'blocklyFlyoutButtonBackground',
|
|
165
|
+
'rx': 4,
|
|
166
|
+
'ry': 4,
|
|
167
|
+
},
|
|
168
|
+
this.svgGroup_);
|
|
169
|
+
|
|
170
|
+
const svgText = dom.createSvgElement(
|
|
171
|
+
Svg.TEXT, {
|
|
172
|
+
'class': this.isLabel_ ? 'blocklyFlyoutLabelText' : 'blocklyText',
|
|
173
|
+
'x': 0,
|
|
174
|
+
'y': 0,
|
|
175
|
+
'text-anchor': 'middle',
|
|
176
|
+
},
|
|
177
|
+
this.svgGroup_);
|
|
178
|
+
let text = parsing.replaceMessageReferences(this.text_);
|
|
179
|
+
if (this.workspace_.RTL) {
|
|
180
|
+
// Force text to be RTL by adding an RLM.
|
|
181
|
+
text += '\u200F';
|
|
182
|
+
}
|
|
183
|
+
svgText.textContent = text;
|
|
184
|
+
if (this.isLabel_) {
|
|
185
|
+
this.svgText_ = svgText;
|
|
186
|
+
this.workspace_.getThemeManager().subscribe(
|
|
187
|
+
this.svgText_, 'flyoutForegroundColour', 'fill');
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const fontSize = style.getComputedStyle(svgText, 'fontSize');
|
|
191
|
+
const fontWeight = style.getComputedStyle(svgText, 'fontWeight');
|
|
192
|
+
const fontFamily = style.getComputedStyle(svgText, 'fontFamily');
|
|
193
|
+
this.width = dom.getFastTextWidthWithSizeString(
|
|
194
|
+
svgText, fontSize, fontWeight, fontFamily);
|
|
195
|
+
const fontMetrics =
|
|
196
|
+
dom.measureFontMetrics(text, fontSize, fontWeight, fontFamily);
|
|
197
|
+
this.height = fontMetrics.height;
|
|
198
|
+
|
|
199
|
+
if (!this.isLabel_) {
|
|
200
|
+
this.width += 2 * FlyoutButton.TEXT_MARGIN_X;
|
|
201
|
+
this.height += 2 * FlyoutButton.TEXT_MARGIN_Y;
|
|
202
|
+
shadow.setAttribute('width', this.width);
|
|
203
|
+
shadow.setAttribute('height', this.height);
|
|
204
|
+
}
|
|
205
|
+
rect.setAttribute('width', this.width);
|
|
206
|
+
rect.setAttribute('height', this.height);
|
|
207
|
+
|
|
208
|
+
svgText.setAttribute('x', this.width / 2);
|
|
209
|
+
svgText.setAttribute(
|
|
210
|
+
'y', this.height / 2 - fontMetrics.height / 2 + fontMetrics.baseline);
|
|
211
|
+
|
|
212
|
+
this.updateTransform_();
|
|
213
|
+
|
|
214
|
+
this.onMouseUpWrapper_ = browserEvents.conditionalBind(
|
|
215
|
+
this.svgGroup_, 'mouseup', this, this.onMouseUp_);
|
|
216
|
+
return this.svgGroup_;
|
|
217
|
+
}
|
|
57
218
|
|
|
58
219
|
/**
|
|
59
|
-
*
|
|
60
|
-
* @private
|
|
220
|
+
* Correctly position the flyout button and make it visible.
|
|
61
221
|
*/
|
|
62
|
-
|
|
222
|
+
show() {
|
|
223
|
+
this.updateTransform_();
|
|
224
|
+
this.svgGroup_.setAttribute('display', 'block');
|
|
225
|
+
}
|
|
63
226
|
|
|
64
227
|
/**
|
|
65
|
-
*
|
|
228
|
+
* Update SVG attributes to match internal state.
|
|
66
229
|
* @private
|
|
67
230
|
*/
|
|
68
|
-
|
|
231
|
+
updateTransform_() {
|
|
232
|
+
this.svgGroup_.setAttribute(
|
|
233
|
+
'transform',
|
|
234
|
+
'translate(' + this.position_.x + ',' + this.position_.y + ')');
|
|
235
|
+
}
|
|
69
236
|
|
|
70
237
|
/**
|
|
71
|
-
*
|
|
72
|
-
* @
|
|
73
|
-
* @
|
|
238
|
+
* Move the button to the given x, y coordinates.
|
|
239
|
+
* @param {number} x The new x coordinate.
|
|
240
|
+
* @param {number} y The new y coordinate.
|
|
74
241
|
*/
|
|
75
|
-
|
|
242
|
+
moveTo(x, y) {
|
|
243
|
+
this.position_.x = x;
|
|
244
|
+
this.position_.y = y;
|
|
245
|
+
this.updateTransform_();
|
|
246
|
+
}
|
|
76
247
|
|
|
77
248
|
/**
|
|
78
|
-
*
|
|
79
|
-
* @type {string}
|
|
80
|
-
* @private
|
|
249
|
+
* @return {boolean} Whether or not the button is a label.
|
|
81
250
|
*/
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
251
|
+
isLabel() {
|
|
252
|
+
return this.isLabel_;
|
|
253
|
+
}
|
|
85
254
|
|
|
86
255
|
/**
|
|
87
|
-
*
|
|
88
|
-
* @
|
|
89
|
-
* @
|
|
256
|
+
* Location of the button.
|
|
257
|
+
* @return {!Coordinate} x, y coordinates.
|
|
258
|
+
* @package
|
|
90
259
|
*/
|
|
91
|
-
|
|
260
|
+
getPosition() {
|
|
261
|
+
return this.position_;
|
|
262
|
+
}
|
|
92
263
|
|
|
93
264
|
/**
|
|
94
|
-
*
|
|
95
|
-
* @type {?browserEvents.Data}
|
|
96
|
-
* @private
|
|
265
|
+
* @return {string} Text of the button.
|
|
97
266
|
*/
|
|
98
|
-
|
|
267
|
+
getButtonText() {
|
|
268
|
+
return this.text_;
|
|
269
|
+
}
|
|
99
270
|
|
|
100
271
|
/**
|
|
101
|
-
*
|
|
102
|
-
* @
|
|
272
|
+
* Get the button's target workspace.
|
|
273
|
+
* @return {!WorkspaceSvg} The target workspace of the flyout where this
|
|
274
|
+
* button resides.
|
|
103
275
|
*/
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* The horizontal margin around the text in the button.
|
|
109
|
-
*/
|
|
110
|
-
FlyoutButton.MARGIN_X = 5;
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* The vertical margin around the text in the button.
|
|
114
|
-
*/
|
|
115
|
-
FlyoutButton.MARGIN_Y = 2;
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* The width of the button's rect.
|
|
119
|
-
* @type {number}
|
|
120
|
-
*/
|
|
121
|
-
FlyoutButton.prototype.width = 0;
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* The height of the button's rect.
|
|
125
|
-
* @type {number}
|
|
126
|
-
*/
|
|
127
|
-
FlyoutButton.prototype.height = 0;
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Create the button elements.
|
|
131
|
-
* @return {!SVGElement} The button's SVG group.
|
|
132
|
-
*/
|
|
133
|
-
FlyoutButton.prototype.createDom = function() {
|
|
134
|
-
let cssClass = this.isLabel_ ? 'blocklyFlyoutLabel' : 'blocklyFlyoutButton';
|
|
135
|
-
if (this.cssClass_) {
|
|
136
|
-
cssClass += ' ' + this.cssClass_;
|
|
276
|
+
getTargetWorkspace() {
|
|
277
|
+
return this.targetWorkspace_;
|
|
137
278
|
}
|
|
138
279
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
},
|
|
153
|
-
this.svgGroup_);
|
|
154
|
-
}
|
|
155
|
-
// Background rectangle.
|
|
156
|
-
const rect = dom.createSvgElement(
|
|
157
|
-
Svg.RECT, {
|
|
158
|
-
'class': this.isLabel_ ? 'blocklyFlyoutLabelBackground' :
|
|
159
|
-
'blocklyFlyoutButtonBackground',
|
|
160
|
-
'rx': 4,
|
|
161
|
-
'ry': 4,
|
|
162
|
-
},
|
|
163
|
-
this.svgGroup_);
|
|
164
|
-
|
|
165
|
-
const svgText = dom.createSvgElement(
|
|
166
|
-
Svg.TEXT, {
|
|
167
|
-
'class': this.isLabel_ ? 'blocklyFlyoutLabelText' : 'blocklyText',
|
|
168
|
-
'x': 0,
|
|
169
|
-
'y': 0,
|
|
170
|
-
'text-anchor': 'middle',
|
|
171
|
-
},
|
|
172
|
-
this.svgGroup_);
|
|
173
|
-
let text = parsing.replaceMessageReferences(this.text_);
|
|
174
|
-
if (this.workspace_.RTL) {
|
|
175
|
-
// Force text to be RTL by adding an RLM.
|
|
176
|
-
text += '\u200F';
|
|
177
|
-
}
|
|
178
|
-
svgText.textContent = text;
|
|
179
|
-
if (this.isLabel_) {
|
|
180
|
-
this.svgText_ = svgText;
|
|
181
|
-
this.workspace_.getThemeManager().subscribe(
|
|
182
|
-
this.svgText_, 'flyoutForegroundColour', 'fill');
|
|
280
|
+
/**
|
|
281
|
+
* Dispose of this button.
|
|
282
|
+
*/
|
|
283
|
+
dispose() {
|
|
284
|
+
if (this.onMouseUpWrapper_) {
|
|
285
|
+
browserEvents.unbind(this.onMouseUpWrapper_);
|
|
286
|
+
}
|
|
287
|
+
if (this.svgGroup_) {
|
|
288
|
+
dom.removeNode(this.svgGroup_);
|
|
289
|
+
}
|
|
290
|
+
if (this.svgText_) {
|
|
291
|
+
this.workspace_.getThemeManager().unsubscribe(this.svgText_);
|
|
292
|
+
}
|
|
183
293
|
}
|
|
184
294
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
this.
|
|
197
|
-
|
|
198
|
-
|
|
295
|
+
/**
|
|
296
|
+
* Do something when the button is clicked.
|
|
297
|
+
* @param {!Event} e Mouse up event.
|
|
298
|
+
* @private
|
|
299
|
+
*/
|
|
300
|
+
onMouseUp_(e) {
|
|
301
|
+
const gesture = this.targetWorkspace_.getGesture(e);
|
|
302
|
+
if (gesture) {
|
|
303
|
+
gesture.cancel();
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (this.isLabel_ && this.callbackKey_) {
|
|
307
|
+
console.warn(
|
|
308
|
+
'Labels should not have callbacks. Label text: ' + this.text_);
|
|
309
|
+
} else if (
|
|
310
|
+
!this.isLabel_ &&
|
|
311
|
+
!(this.callbackKey_ &&
|
|
312
|
+
this.targetWorkspace_.getButtonCallback(this.callbackKey_))) {
|
|
313
|
+
console.warn('Buttons should have callbacks. Button text: ' + this.text_);
|
|
314
|
+
} else if (!this.isLabel_) {
|
|
315
|
+
this.targetWorkspace_.getButtonCallback(this.callbackKey_)(this);
|
|
316
|
+
}
|
|
199
317
|
}
|
|
200
|
-
|
|
201
|
-
rect.setAttribute('height', this.height);
|
|
202
|
-
|
|
203
|
-
svgText.setAttribute('x', this.width / 2);
|
|
204
|
-
svgText.setAttribute(
|
|
205
|
-
'y', this.height / 2 - fontMetrics.height / 2 + fontMetrics.baseline);
|
|
206
|
-
|
|
207
|
-
this.updateTransform_();
|
|
208
|
-
|
|
209
|
-
this.onMouseUpWrapper_ = browserEvents.conditionalBind(
|
|
210
|
-
this.svgGroup_, 'mouseup', this, this.onMouseUp_);
|
|
211
|
-
return this.svgGroup_;
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Correctly position the flyout button and make it visible.
|
|
216
|
-
*/
|
|
217
|
-
FlyoutButton.prototype.show = function() {
|
|
218
|
-
this.updateTransform_();
|
|
219
|
-
this.svgGroup_.setAttribute('display', 'block');
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Update SVG attributes to match internal state.
|
|
224
|
-
* @private
|
|
225
|
-
*/
|
|
226
|
-
FlyoutButton.prototype.updateTransform_ = function() {
|
|
227
|
-
this.svgGroup_.setAttribute(
|
|
228
|
-
'transform',
|
|
229
|
-
'translate(' + this.position_.x + ',' + this.position_.y + ')');
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Move the button to the given x, y coordinates.
|
|
234
|
-
* @param {number} x The new x coordinate.
|
|
235
|
-
* @param {number} y The new y coordinate.
|
|
236
|
-
*/
|
|
237
|
-
FlyoutButton.prototype.moveTo = function(x, y) {
|
|
238
|
-
this.position_.x = x;
|
|
239
|
-
this.position_.y = y;
|
|
240
|
-
this.updateTransform_();
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* @return {boolean} Whether or not the button is a label.
|
|
245
|
-
*/
|
|
246
|
-
FlyoutButton.prototype.isLabel = function() {
|
|
247
|
-
return this.isLabel_;
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* Location of the button.
|
|
252
|
-
* @return {!Coordinate} x, y coordinates.
|
|
253
|
-
* @package
|
|
254
|
-
*/
|
|
255
|
-
FlyoutButton.prototype.getPosition = function() {
|
|
256
|
-
return this.position_;
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* @return {string} Text of the button.
|
|
261
|
-
*/
|
|
262
|
-
FlyoutButton.prototype.getButtonText = function() {
|
|
263
|
-
return this.text_;
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Get the button's target workspace.
|
|
268
|
-
* @return {!WorkspaceSvg} The target workspace of the flyout where this
|
|
269
|
-
* button resides.
|
|
270
|
-
*/
|
|
271
|
-
FlyoutButton.prototype.getTargetWorkspace = function() {
|
|
272
|
-
return this.targetWorkspace_;
|
|
273
|
-
};
|
|
318
|
+
}
|
|
274
319
|
|
|
275
320
|
/**
|
|
276
|
-
*
|
|
321
|
+
* The horizontal margin around the text in the button.
|
|
277
322
|
*/
|
|
278
|
-
FlyoutButton.
|
|
279
|
-
if (this.onMouseUpWrapper_) {
|
|
280
|
-
browserEvents.unbind(this.onMouseUpWrapper_);
|
|
281
|
-
}
|
|
282
|
-
if (this.svgGroup_) {
|
|
283
|
-
dom.removeNode(this.svgGroup_);
|
|
284
|
-
}
|
|
285
|
-
if (this.svgText_) {
|
|
286
|
-
this.workspace_.getThemeManager().unsubscribe(this.svgText_);
|
|
287
|
-
}
|
|
288
|
-
};
|
|
323
|
+
FlyoutButton.TEXT_MARGIN_X = 5;
|
|
289
324
|
|
|
290
325
|
/**
|
|
291
|
-
*
|
|
292
|
-
* @param {!Event} e Mouse up event.
|
|
293
|
-
* @private
|
|
326
|
+
* The vertical margin around the text in the button.
|
|
294
327
|
*/
|
|
295
|
-
FlyoutButton.
|
|
296
|
-
const gesture = this.targetWorkspace_.getGesture(e);
|
|
297
|
-
if (gesture) {
|
|
298
|
-
gesture.cancel();
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
if (this.isLabel_ && this.callbackKey_) {
|
|
302
|
-
console.warn('Labels should not have callbacks. Label text: ' + this.text_);
|
|
303
|
-
} else if (
|
|
304
|
-
!this.isLabel_ &&
|
|
305
|
-
!(this.callbackKey_ &&
|
|
306
|
-
this.targetWorkspace_.getButtonCallback(this.callbackKey_))) {
|
|
307
|
-
console.warn('Buttons should have callbacks. Button text: ' + this.text_);
|
|
308
|
-
} else if (!this.isLabel_) {
|
|
309
|
-
this.targetWorkspace_.getButtonCallback(this.callbackKey_)(this);
|
|
310
|
-
}
|
|
311
|
-
};
|
|
328
|
+
FlyoutButton.TEXT_MARGIN_Y = 2;
|
|
312
329
|
|
|
313
330
|
/**
|
|
314
331
|
* CSS for buttons and labels. See css.js for use.
|
|
315
332
|
*/
|
|
316
333
|
Css.register(`
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
334
|
+
.blocklyFlyoutButton {
|
|
335
|
+
fill: #888;
|
|
336
|
+
cursor: default;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.blocklyFlyoutButtonShadow {
|
|
340
|
+
fill: #666;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.blocklyFlyoutButton:hover {
|
|
344
|
+
fill: #aaa;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.blocklyFlyoutLabel {
|
|
348
|
+
cursor: default;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
.blocklyFlyoutLabelBackground {
|
|
352
|
+
opacity: 0;
|
|
353
|
+
}
|
|
337
354
|
`);
|
|
338
355
|
|
|
339
356
|
exports.FlyoutButton = FlyoutButton;
|