В панели инструментов можно настроить (задать предварительное состояние) блоков. Например, можно установить для поля значение по умолчанию или соединить два блока. Также можно создавать теневые блоки , которые служат в качестве значений по умолчанию для дочерних блоков.
Примеры
Вот несколько примеров предустановленных блоков.
Блок с заданным значением поля
Вот блок math_number , в поле которого отображается число 42 вместо значения по умолчанию 0:

А вот панель инструментов, которая позволяет установить это поле:
JSON
{
"kind": "flyoutToolbox",
"contents": [
{
"kind": "block",
"type": "math_number",
"fields": {
"NUM": 42
}
},
]
}
XML
<xml id="toolbox" style="display: none">
<block type="math_number">
<field name="NUM">42</field>
</block>
</xml>
Предварительно соединенные блоки
Вот блок controls_for , к которому подключены три блока math_number :

А вот набор инструментов, который предварительно соединяет эти блоки:
JSON
{
"kind": "flyoutToolbox",
"contents": [
{
"kind": "block",
"type": "controls_for",
"inputs": {
"FROM": {
"block": {
"type": "math_number",
"fields": {
"NUM": 1
}
}
},
"TO": {
"block": {
"type": "math_number",
"fields": {
"NUM": 10
}
}
},
"BY": {
"block": {
"type": "math_number",
"fields": {
"NUM": 1
}
}
},
}
},
]
}
XML
<xml id="toolbox" style="display: none">
<block type="controls_for">
<value name="FROM">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
<value name="TO">
<block type="math_number">
<field name="NUM">10</field>
</block>
</value>
<value name="BY">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
</block>
</xml>
Отключенные блоки
Отключенные блоки нельзя перетаскивать из панели инструментов. Блоки можно отключать по отдельности, используя необязательное свойство disabled .

JSON
{
"kind": "flyoutToolbox",
"contents": [
{
"kind": "block",
"type":"math_number"
},
{
"kind": "block",
"type": "math_arithmetic"
},
{
"kind": "block",
"type": "math_single",
"disabled": "true"
}
]
}
XML
<xml id="toolbox" style="display: none">
<block type="math_number"></block>
<block type="math_arithmetic"></block>
<block type="math_single" disabled="true"></block>
</xml>
Также можно программно отключить или включить блок, используя setDisabledReason .
Настройте свои блоки
В панели инструментов можно настроить блок любым способом, аналогичным настройке в рабочей области. Например, можно задавать значения полей, связывать блоки с полями ввода значений или операторов, добавлять комментарии, а также сворачивать или отключать блоки. Это возможно, потому что панели инструментов используют тот же код для настройки блоков, что и рабочие области для их сериализации.
Это также означает, что создать конфигурацию блока очень просто. Просто загрузите свой блок в рабочую область, настройте его по своему усмотрению и сериализуйте, выполнив следующий код в консоли.
JSON
console.log(Blockly.serialization.workspaces.save(Blockly.getMainWorkspace()));
XML
console.log(Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace()));
Затем вы можете скопировать код конфигурации и вставить его в панель инструментов. Обязательно удалите свойства x , y и id , которые игнорируются панелью инструментов.
Поля переменных
Возможно, потребуется указывать переменные поля по-разному, когда они находятся в панели инструментов и когда они сериализованы.
В частности, при сериализации полей переменных в формат JSON они содержат только идентификатор представляемой ими переменной, поскольку имя и тип переменной сериализуются отдельно. Однако в панелях инструментов эта информация отсутствует, поэтому её необходимо указывать непосредственно в поле переменной.
{
"kind": "flyoutToolbox",
"content": [
{
"kind": "block",
"type": "controls_for",
"fields": {
"VAR": {
"name": "index",
"type": "Number"
}
}
}
]
}
Теневые блоки
Теневые блоки — это блоки-заполнители, выполняющие несколько функций:
- Они указывают значения по умолчанию для родительского блока.
- Они позволяют пользователям вводить значения напрямую, без необходимости получения числового или строкового блока.
- В отличие от обычных блоков, они заменяются, если пользователь перетаскивает на них другой блок.
- Они информируют пользователя о типе ожидаемого значения.
Для создания теневого блока используйте свойство shadow (JSON) или тег <shadow> (XML) вместо свойства block или тега <block> . Например, вот блок math_arithmetic , к которому подключены два теневых блока math_number :

А вот набор инструментов, использующий эти блоки с тенями:
JSON
{
"kind": "flyoutToolbox",
"contents": [
{
"kind": "block",
"type": "math_arithmetic",
"fields": {
"OP": "ADD"
},
"inputs": {
"A": {
"shadow": {
"type": "math_number",
"fields": {
"NUM": 1
}
}
},
"B": {
"shadow": {
"type": "math_number",
"fields": {
"NUM": 1
}
}
}
}
},
]
}
XML
<xml id="toolbox" style="display: none">
<block type="math_arithmetic">
<field name="OP">ADD</field>
<value name="A">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="B">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</xml>