กล่องเครื่องมือ

กล่องเครื่องมือคือที่ที่ผู้ใช้จะได้รับบล็อก ซึ่งโดยปกติจะแสดง ที่ด้านหนึ่งของพื้นที่ทำงาน บางครั้งอาจมีหมวดหมู่ และบางครั้งอาจไม่มี

หน้านี้จะเน้นไปที่วิธีระบุโครงสร้างของกล่องเครื่องมือ (เช่น กล่องเครื่องมือมีหมวดหมู่อะไร และบล็อกอะไรได้บ้าง) หากต้องการรายละเอียดเพิ่มเติมเกี่ยวกับวิธีเปลี่ยน UI ของกล่องเครื่องมือ โปรดดู Customizing a Blockly Toolbox Codelab และ 2021 Toolbox APIs

รูปแบบ

Blockly ให้คุณระบุโครงสร้างของกล่องเครื่องมือโดยใช้รูปแบบที่แตกต่างกัน 2-3 รูปแบบ รูปแบบใหม่ที่แนะนำใช้ JSON ส่วนรูปแบบเดิมใช้ XML

วิธีต่างๆ สำหรับการระบุกล่องเครื่องมือข้างต้นมีดังนี้

JSON

ตั้งแต่กล่องเครื่องมือรุ่นเดือนกันยายน 2020 คุณสามารถกำหนดได้โดยใช้ JSON

var toolbox = {
    "kind": "flyoutToolbox",
    "contents": [
      {
        "kind": "block",
        "type": "controls_if"
      },
      {
        "kind": "block",
        "type": "controls_whileUntil"
      }
    ]
  };
var workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox});

XML

<xml id="toolbox" style="display: none">
  <block type="controls_if"></block>
  <block type="controls_whileUntil"></block>
</xml>
<script>
  var workspace = Blockly.inject('blocklyDiv',
      {toolbox: document.getElementById('toolbox')});
</script>

สตริง XML

var toolbox = '<xml>' +
    '<block type="controls_if"></block>' +
    '<block type="controls_whileUntil"></block>' +
    '</xml>';
var workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox});

หมวดหมู่

บล็อกในกล่องเครื่องมืออาจจัดเรียงไว้เป็นหมวดหมู่

ต่อไปนี้เป็นวิธีกำหนดกล่องเครื่องมือข้างต้น ซึ่งมี 2 หมวดหมู่ ("การควบคุม" และ "ตรรกะ") โดยแต่ละหมวดมีบล็อก

JSON

{
  "kind": "categoryToolbox",
  "contents": [
    {
      "kind": "category",
      "name": "Control",
      "contents": [
        {
          "kind": "block",
          "type": "controls_if"
        },
      ]
    },
    {
      "kind": "category",
      "name": "Logic",
      "contents": [
        {
          "kind": "block",
          "type": "logic_compare"
        },
        {
          "kind": "block",
          "type": "logic_operation"
        },
        {
          "kind": "block",
          "type": "logic_boolean"
        }
      ]
    }
  ]
}

XML

<xml id="toolbox" style="display: none">
  <category name="Control">
    <block type="controls_if"></block>
  <category name="Logic">
    <block type="logic_compare"></block>
    <block type="logic_operation"></block>
    <block type="logic_boolean"></block>
  </category>
</xml>

หมวดหมู่ที่ซ้อนกัน

หมวดหมู่อาจซ้อนอยู่ในหมวดหมู่อื่น ต่อไปนี้เป็นหมวดหมู่ระดับบนสุด 2 หมวด ("หลัก" และ "กำหนดเอง") หมวดหมู่ที่ 2 มีหมวดหมู่ย่อย 2 หมวดหมู่ ซึ่งแต่ละหมวดมีการบล็อก

โปรดทราบว่า หนึ่งหมวดหมู่อาจมีทั้งหมวดหมู่ย่อยและการบล็อก ในตัวอย่างข้างต้น "กำหนดเอง" มี 2 หมวดหมู่ย่อย ("ย้าย" และ "เลี้ยว") ตลอดจนบล็อกของตนเอง ("start")

JSON

{
  "kind": "categoryToolbox",
  "contents": [
    {
      "kind": "category",
      "name": "Core",
      "contents": [
        {
          "kind": "block",
          "type": "controls_if"
        },
        {
          "kind": "block",
          "type": "logic_compare"
        },
      ]
    },
    {
      "kind": "category",
      "name": "Custom",
      "contents": [
        {
          "kind": "block",
          "type": "start"
        },
        {
          "kind": "category",
          "name": "Move",
          "contents": [
            {
              "kind": "block",
              "type": "move_forward"
            }
          ]
        },
        {
          "kind": "category",
          "name": "Turn",
          "contents": [
            {
              "kind": "block",
              "type": "turn_left"
            }
          ]
        }
      ]
    }
  ]
}

XML

<xml id="toolbox" style="display: none">
  <category name="Core">
    <block type="controls_if"></block>
    <block type="logic_compare"></block>
  </category>
  <category name="Custom">
    <block type="start"></block>
    <category name="Move">
      <block type="move_forward"></block>
    </category>
    <category name="Turn">
      <block type="turn_left"></block>
    </category>
  </category>
</xml>

หมวดหมู่แบบไดนามิก

หมวดหมู่แบบไดนามิกคือหมวดหมู่ที่มีการเติมข้อมูลใหม่แบบไดนามิกโดยอิงตามฟังก์ชันเมื่อมีการเปิดหมวดหมู่

Blockly รองรับการดำเนินการนี้โดยให้คุณเชื่อมโยงหมวดหมู่กับฟังก์ชันผ่านคีย์สตริงที่ลงทะเบียนไว้ ฟังก์ชันดังกล่าวควรแสดงคำจำกัดความของเนื้อหา หมวดหมู่ (รวมถึงบล็อก ปุ่ม ป้ายกำกับ ฯลฯ) คุณจะระบุเนื้อหาเป็น JSON หรือ XML ก็ได้ แต่ขอแนะนำให้ใช้ JSON

และโปรดทราบว่าฟังก์ชันนี้จะมีพื้นที่ทำงานเป้าหมายเป็นพารามิเตอร์ ดังนั้นการบล็อกในหมวดหมู่แบบไดนามิกอาจอิงตามสถานะของพื้นที่ทำงานได้

JSON

ตั้งแต่รุ่นเดือนกันยายน 2021 คุณระบุสถานะของการบล็อกได้โดยไม่ต้องใช้ 'blockxml'

// Returns an array of objects.
var coloursFlyoutCallback = function(workspace) {
  // Returns an array of hex colours, e.g. ['#4286f4', '#ef0447']
  var colourList = getPalette();
  var blockList = [];
  for (var i = 0; i < colourList.length; i++) {
    blockList.push({
      'kind': 'block',
      'type': 'colour_picker',
      'fields': {
        'COLOUR': colourList[i]
      }
    });
  }
  return blockList;
};

// Associates the function with the string 'COLOUR_PALETTE'
myWorkspace.registerToolboxCategoryCallback(
    'COLOUR_PALETTE', coloursFlyoutCallback);

JSON เดิม

ก่อนรุ่นเดือนกันยายน 2021 คุณต้องใช้พร็อพเพอร์ตี้ 'blockxml' เพื่อระบุสถานะของการบล็อก

// Returns an array of objects.
var coloursFlyoutCallback = function(workspace) {
  // Returns an array of hex colours, e.g. ['#4286f4', '#ef0447']
  var colourList = getPalette();
  var blockList = [];
  for (var i = 0; i < colourList.length; i++) {
    blockList.push({
      'kind': 'block',
      'type': 'colour_picker', // Type is optional if you provide blockxml
      'blockxml': '<block type="colour_picker">' +
          '<field name="COLOUR">' + colourList[i] + '</field>' +
          '</block>'
    });
  }
  return blockList;
};

// Associates the function with the string 'COLOUR_PALETTE'
myWorkspace.registerToolboxCategoryCallback(
    'COLOUR_PALETTE', coloursFlyoutCallback);

XML

// Returns an arry of XML nodes.
var coloursFlyoutCallback = function(workspace) {
  // Returns an array of hex colours, e.g. ['#4286f4', '#ef0447']
  var colourList = getPalette();
  var blockList = [];
  for (var i = 0; i < colourList.length; i++) {
    var block = document.createElement('block');
    block.setAttribute('type', 'colour_picker');
    var field = document.createElement('field');
    field.setAttribute('name', 'COLOUR');
    field.innerText = colourList[i];
    block.appendChild(field);
    blockList.push(block);
  }
  return blockList;
};

// Associates the function with the string 'COLOUR_PALETTE'
myWorkspace.registerToolboxCategoryCallback(
    'COLOUR_PALETTE', coloursFlyoutCallback);

หลังจากเชื่อมโยงฟังก์ชันหมวดหมู่แบบไดนามิกกับคีย์สตริง (หรือที่เรียกว่าลงทะเบียนแล้ว) แล้ว คุณจะกำหนดคีย์สตริงนี้ให้กับพร็อพเพอร์ตี้ custom ของคำจำกัดความหมวดหมู่เพื่อทำให้หมวดหมู่เป็นแบบไดนามิกได้

JSON

{
  "kind": "category",
  "name": "Colours",
  "custom": "COLOUR_PALETTE"
}

XML

<category name="Colours" custom="COLOUR_PALETTE"></category>

หมวดหมู่แบบไดนามิกในตัว

Blockly มีหมวดหมู่แบบไดนามิกในตัว 3 หมวดหมู่

  • 'VARIABLE' สร้างหมวดหมู่สำหรับตัวแปรที่ไม่พิมพ์
  • 'VARIABLE_DYNAMIC' สร้างหมวดหมู่สำหรับตัวแปรที่มีการพิมพ์ โดยมีปุ่มสำหรับสร้าง สตริง ตัวเลข และสี
  • 'PROCEDURE' สร้างหมวดหมู่สำหรับบล็อกฟังก์ชัน

JSON

{
  "kind": "category",
  "name": "Variables",
  "custom": "VARIABLE"
},
{
  "kind": "category",
  "name": "Variables",
  "custom": "VARIABLE_DYNAMIC"
},
{
  "kind": "category",
  "name": "Functions",
  "custom": "PROCEDURE"
}

XML

<category name="Variables" custom="VARIABLE"></category>
<category name="Variables" custom="VARIABLE_DYNAMIC"></category>
<category name="Functions" custom="PROCEDURE"></category>

หมายเหตุ: มีการใช้คำว่า "ขั้นตอน" ใน Codebase ของ Blockly แต่นักเรียนพบว่าคำว่า "ฟังก์ชัน" เข้าใจได้มากกว่า ขออภัยที่ข้อมูลไม่ตรงกัน

กำลังปิดใช้

หมวดหมู่ที่ปิดใช้จะไม่อนุญาตให้ผู้ใช้เปิดหมวดหมู่นั้น และจะข้ามหมวดหมู่ในระหว่างการไปยังส่วนต่างๆ ด้วยแป้นพิมพ์

var category = toolbox.getToolboxItems()[0];
category.setDisabled('true');

เมื่อปิดใช้หมวดหมู่ ระบบจะเพิ่มพร็อพเพอร์ตี้ 'disabled' ลงในองค์ประกอบ DOM ซึ่งจะช่วยให้คุณควบคุมรูปลักษณ์ของหมวดหมู่ที่ปิดใช้ได้

.blocklyToolboxCategory[disabled="true"] {
  opacity: .5;
}

กำลังซ่อน

หมวดหมู่ที่ซ่อนไว้จะไม่แสดงเป็นส่วนหนึ่งของกล่องเครื่องมือ หมวดหมู่ที่ซ่อนไว้ สามารถแสดงผ่าน JavaScript ได้ในภายหลัง

JSON

{
  "kind": "category",
  "name": "...",
  "hidden": "true"
}

XML

<category name="..." hidden="true"></category>

JavaScript

var category = toolbox.getToolboxItems()[0];
category.hide();
// etc...
category.show();

กำลังขยาย

การดำเนินการนี้จะมีผลกับหมวดหมู่ที่มีหมวดหมู่ที่ซ้อนกันอื่นๆ เท่านั้น

หมวดหมู่ที่ขยายจะแสดงหมวดหมู่ย่อย โดยค่าเริ่มต้น หมวดหมู่ที่ซ้อนกันจะยุบอยู่ และจะต้องคลิกเพื่อขยาย

JSON

{
  "kind": "category",
  "name": "...",
  "expanded": "true"
}

XML

<category name="..." expanded="true"></sep>

การจัดรูปแบบ

Blockly มี UI หมวดหมู่เริ่มต้น รวมถึงตัวเลือกพื้นฐานสำหรับการจัดรูปแบบ หากต้องการข้อมูลเกี่ยวกับวิธีการจัดรูปแบบ/การกำหนดค่าขั้นสูงมากขึ้นสำหรับ UI โปรดดูการปรับแต่งโค้ดแล็บกล่องเครื่องมือของ Blockly และ พูดถึงเรื่อง API กล่องเครื่องมือปี 2021

ธีม

ธีมช่วยให้คุณระบุสีทั้งหมดของพื้นที่ทำงานได้พร้อมกัน รวมถึงสีในหมวดหมู่ต่างๆ

หากต้องการใช้หมวดหมู่นี้ คุณต้องเชื่อมโยงหมวดหมู่กับสไตล์หมวดหมู่ที่ต้องการ ดังนี้

JSON

{
  "kind": "category",
  "name": "Logic",
  "categorystyle": "logic_category"
}

XML

<category name="Logic" categorystyle="logic_category"></category>

สี

คุณยังสามารถระบุสีได้โดยตรง แต่เราไม่แนะนำให้ทำเช่นนี้ สีคือตัวเลขที่เป็นสตริง (0-360) ที่ระบุโทนสี สังเกตการสะกดคำแบบบริติช

JSON

{
  "contents": [
    {
      "kind": "category",
      "name": "Logic",
      "colour": "210"
    },
    {
      "kind": "category",
      "name": "Loops",
      "colour": "120"
    }
  ]
}

XML

<xml id="toolbox" style="display: none">
  <category name="Logic" colour="210">...</category>
  <category name="Loops" colour="120">...</category>
  <category name="Math" colour="230">...</category>
  <category name="Colour" colour="20">...</category>
  <category name="Variables" colour="330" custom="VARIABLE"></category>
  <category name="Functions" colour="290" custom="PROCEDURE"></category>
</xml>

โปรดทราบว่าเรารองรับการใช้การอ้างอิงสีที่แปลได้ด้วย

หมวดหมู่ CSS

หากต้องการการปรับแต่งที่มีประสิทธิภาพมากขึ้น Blockly ยังให้คุณระบุคลาส CSS สำหรับองค์ประกอบต่างๆ ของ UI เริ่มต้นได้ด้วย จากนั้นคุณสามารถใช้ CSS เพื่อจัดรูปแบบแท็ก

ประเภทองค์ประกอบต่อไปนี้สามารถใช้คลาส CSS ได้

  • คอนเทนเนอร์ - คลาสสำหรับ div ระดับบนสุดสำหรับหมวดหมู่ ค่าเริ่มต้น blocklyToolboxCategory
  • แถว - คลาสสำหรับ div ที่มีป้ายกำกับหมวดหมู่และไอคอน ค่าเริ่มต้น blocklyTreeRow
  • ไอคอน - ชั้นเรียนสำหรับไอคอนหมวดหมู่ blocklyTreeIcon เริ่มต้น
  • label - คลาสสำหรับป้ายกำกับหมวดหมู่ blocklyTreeLabel เริ่มต้น
  • selected - ชั้นเรียนที่เพิ่มลงในหมวดหมู่เมื่อเลือกแล้ว ค่าเริ่มต้น blocklyTreeSelected
  • openicon - ชั้นเรียนที่เพิ่มลงในไอคอนเมื่อหมวดหมู่มีหมวดหมู่ที่ซ้อนกัน และเปิดอยู่ blocklyTreeIconOpen เริ่มต้น
  • ไอคอนปิด - ชั้นเรียนที่เพิ่มลงในไอคอนเมื่อหมวดหมู่มีหมวดหมู่ที่ซ้อนกัน และปิดอยู่ blocklyTreeIconClosed เริ่มต้น

ซึ่งคุณจะระบุชั้นเรียนได้โดยใช้รูปแบบใดรูปแบบหนึ่งต่อไปนี้

JSON

ตั้งค่าคลาส CSS ของประเภทองค์ประกอบที่เฉพาะเจาะจงโดยใช้คุณสมบัติ cssConfig

{
  "kind": "category",
  "name": "...",
  "cssConfig": {
    "container": "yourClassName"
  }
}

XML

ตั้งค่าคลาส CSS ของประเภทองค์ประกอบเฉพาะโดยใส่ "css-" ไว้ด้านหน้า

<category name="..." css-container="yourClassName"></category>

การเข้าถึง

คุณเข้าถึงหมวดหมู่แบบเป็นโปรแกรมได้ 2 วิธี คุณจะเข้าถึง URL ด้วยดัชนี (โดยที่ 0 คือหมวดหมู่ยอดนิยม) ได้ดังนี้

var category = toolbox.getToolboxItems()[0];

หรือตามรหัส:

var category = toolbox.getToolboxItemById('categoryId');

ตำแหน่งที่มีการระบุรหัสในคำจำกัดความของกล่องเครื่องมือ

JSON

{
  "kind": "category",
  "name": "...",
  "toolboxitemid": "categoryId"
}

XML

<category name="..." toolboxitemid="categoryId"></category>

บล็อกที่กำหนดล่วงหน้า

คำจำกัดความกล่องเครื่องมืออาจมีการบล็อกที่มีการตั้งค่าช่องเป็นค่าเริ่มต้น หรือมีบล็อกที่เชื่อมต่อไว้ด้วยกันอยู่แล้ว

ต่อไปนี้เป็น 4 บล็อก:

  1. บล็อก logic_boolean แบบง่ายที่ไม่มีค่าที่กำหนดล่วงหน้า
  2. บล็อก math_number ที่มีการแก้ไขให้แสดงหมายเลข 42 แทนค่าเริ่มต้น 0:
  3. บล็อก controls_for ที่มีบล็อก math_number 3 บล็อกอยู่
  4. บล็อก math_arithmetic ที่มีmath_number บล็อกเงา 2 บล็อกเชื่อมต่ออยู่ ดังนี้

ต่อไปนี้เป็นคำนิยามของกล่องเครื่องมือที่มีบล็อกทั้ง 4 ส่วนนี้

JSON

ตั้งแต่รุ่นเดือนกันยายน 2021 คุณระบุสถานะของการบล็อกได้โดยใช้ 'blockxml'

{
  "kind": "flyoutToolbox",
  "contents": [
    {
      "kind": "block",
      "type": "logic_boolean"
    },
    {
      "kind": "block",
      "type": "math_number",
      "fields": {
        "NUM": 42
      }
    },
    {
      "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
            }
          }
        },
      }
    },
    {
      "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
            }
          }
        }
      }
    },
  ]
}

JSON เดิม

ก่อนรุ่นเดือนกันยายน 2021 คุณต้องใช้พร็อพเพอร์ตี้ 'blockxml' เพื่อระบุสถานะของการบล็อก

{
  "kind": "flyoutToolbox",
  "contents": [
    {
      "kind": "block",
      "type": "logic_boolean"
    },
    {
      "kind": "block",
      "blockxml":
          '<block type="math_number">' +
          '<field name="NUM">42</field>' +
          '</block>'
    },
    {
      "kind": "block",
      "blockxml":
          '<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>'
    },
    {
      "kind": "block",
      "blockxml":
          '<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

<xml id="toolbox" style="display: none">
  <block type="logic_boolean"></block>

  <block type="math_number">
    <field name="NUM">42</field>
  </block>

  <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>

  <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>

การเขียนคำนิยามด้วยมืออาจเป็นอะไรที่ชวนปวดหัว แต่คุณสามารถโหลดบล็อกลงในพื้นที่ทำงาน แล้วเรียกใช้โค้ดต่อไปนี้เพื่อรับคำจำกัดความได้ การเรียกเหล่านี้ได้ผลเนื่องจากกล่องเครื่องมือใช้รูปแบบสำหรับบล็อกรูปแบบเดียวกับระบบการทำให้เป็นอนุกรม

JSON

console.log(Blockly.serialization.workspaces.save(Blockly.getMainWorkspace()));

XML

console.log(Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace()));

นอกจากนี้ ยังนำพร็อพเพอร์ตี้ x, y และ id ออกได้ เนื่องจากกล่องเครื่องมือจะไม่สนใจพร็อพเพอร์ตี้เหล่านั้น

บล็อกการให้แสงเงา

บล็อกการให้แสงเงาคือบล็อกตัวยึดตําแหน่งซึ่งทํางานหลายอย่าง ดังนี้

  • โดยจะระบุค่าเริ่มต้นสำหรับการบล็อกระดับบนสุด
  • พารามิเตอร์นี้ช่วยให้ผู้ใช้พิมพ์ค่าได้โดยตรงโดยไม่ต้องดึงตัวเลขหรือบล็อกสตริง
  • การบล็อกแบบปกติจะถูกแทนที่หากผู้ใช้วางการบล็อกทับบล็อกเหล่านั้น
  • โดยจะแจ้งให้ผู้ใช้ทราบถึงประเภทของค่าที่คาดไว้

การบล็อกที่ปิดใช้

ลากบล็อกที่ปิดใช้จากกล่องเครื่องมือไม่ได้ คุณปิดใช้การบล็อกทีละรายการได้โดยใช้พร็อพเพอร์ตี้ 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>

คุณยังปิดใช้หรือเปิดใช้การบล็อกแบบเป็นโปรแกรมได้โดยใช้ setEnabled

ช่องตัวแปร

อาจต้องระบุช่องตัวแปรต่างออกไปเมื่ออยู่ในกล่องเครื่องมือกับเมื่อทำเพียงอนุกรม

โดยเฉพาะอย่างยิ่ง เมื่อช่องตัวแปรถูกทำให้เป็นอนุกรมสำหรับ JSON ช่องตัวแปรจะมีเฉพาะรหัสของตัวแปรที่แสดงเท่านั้น เนื่องจากชื่อและประเภทของตัวแปรได้รับการเรียงลำดับแยกกัน แต่กล่องเครื่องมือไม่มีข้อมูลดังกล่าว จึงต้องใส่ลงในช่องตัวแปรโดยตรง

{
  "kind": "flyoutToolbox",
  "content": [
    {
      "type": "controls_for",
      "fields": {
        "VAR": {
          "name": "index",
          "type": "Number"
        }
      }
    }
  ]
}

เส้นแบ่ง

การเพิ่มตัวแบ่งระหว่าง 2 หมวดหมู่จะสร้างบรรทัดและช่องว่างระหว่าง 2 หมวดหมู่นี้

คุณสามารถเปลี่ยนคลาสของตัวคั่นในคำจำกัดความกล่องเครื่องมือ JSON หรือ XML ได้

JSON

{
  "kind": "sep",
  "cssConfig": {
    "container": "yourClassName"
  }
}

XML

<sep css-container="yourClassName"></sep>

การเพิ่มตัวคั่นระหว่างบล็อก 2 บล็อกจะสร้างช่องว่างระหว่างบล็อกดังกล่าว โดยค่าเริ่มต้น ทุกๆ บล็อกจะแยกออกจากบริเวณใกล้เคียงกัน 24 พิกเซล การแยกนี้อาจเปลี่ยนได้โดยใช้แอตทริบิวต์ "gap" ซึ่งจะแทนที่ช่องว่างเริ่มต้น

ซึ่งช่วยให้คุณสร้างกลุ่มบล็อกเชิงตรรกะในกล่องเครื่องมือได้

JSON

{
  "kind": "flyoutToolbox",
  "contents": [
    {
      "kind": "block",
      "type":"math_number"
    },
    {
      "kind": "sep",
      "gap": "32"
    },
    {
      "kind": "block",
      "blockxml": "<block type='math_arithmetic'><field name='OP'>ADD</field></block>"
    },
    {
      "kind": "sep",
      "gap": "8"
    },
    {
      "kind": "block",
      "blockxml": "<block type='math_arithmetic'><field name='OP'>MINUS</field></block>"
    }
  ]
}

XML

<xml id="toolbox" style="display: none">
  <block type="math_number"></block>
  <sep gap="32"></sep>
  <block type="math_arithmetic">
    <field name="OP">ADD</field>
  </block>
  <sep gap="8"></sep>
  <block type="math_arithmetic">
    <field name="OP">MINUS</field>
  </block>
</xml>

ปุ่มและป้ายกำกับ

คุณจะวางปุ่มหรือป้ายกำกับไว้ที่ใดก็ได้ที่ใส่บล็อกในกล่องเครื่องมือ

JSON

{
  "kind": "flyoutToolbox",
  "contents": [
    {
      "kind": "block",
      "type":"logic_operation"
    },
    {
      "kind": "label",
      "text": "A label",
      "web-class": "myLabelStyle"
    },
    {
      "kind": "label",
      "text": "Another label"
    },
    {
      "kind": "block",
      "type": "logic_negate"
    },
    {
      "kind": "button",
      "text": "A button",
      "callbackKey": "myFirstButtonPressed"
    },
    {
      "kind": "block",
      "type": "logic_boolean"
    }
  ]
}

XML

<xml id="toolbox" style="display: none">
  <block type="logic_operation"></block>
  <label text="A label" web-class="myLabelStyle"></label>
  <label text="Another label"></label>
  <block type="logic_negate"></block>
  <button text="A button" callbackKey="myFirstButtonPressed"></button>
  <block type="logic_boolean"></block>
</xml>
    <style>
    .myLabelStyle>.blocklyFlyoutLabelText {
      font-style: italic;
      fill: green;
    }
    </style>

คุณระบุชื่อคลาส CSS เพื่อใช้กับปุ่มหรือป้ายกำกับได้ ในตัวอย่างข้างต้น ป้ายกำกับแรกใช้รูปแบบที่กำหนดเอง ส่วนป้ายกำกับที่ 2 ใช้รูปแบบเริ่มต้น

ปุ่มต่างๆ ควรมีฟังก์ชันเรียกกลับ ส่วนป้ายกำกับก็ไม่ควรมี เมื่อต้องการตั้งค่าโค้ดเรียกกลับ สำหรับการคลิกปุ่มที่ต้องการ ให้ใช้

yourWorkspace.registerButtonCallback(yourCallbackKey, yourFunction).

ฟังก์ชันของคุณควรยอมรับปุ่มที่ถูกคลิกเป็นอาร์กิวเมนต์ ปุ่ม "สร้างตัวแปร..." ในหมวดหมู่ตัวแปรเป็นตัวอย่างที่ดีของปุ่มที่มีโค้ดเรียกกลับ

การเปลี่ยนกล่องเครื่องมือ

แอปพลิเคชันอาจเปลี่ยนบล็อกที่อยู่ในกล่องเครื่องมือได้ตลอดเวลาด้วยการเรียกใช้ฟังก์ชันครั้งเดียว

workspace.updateToolbox(newTree);

เช่นเดียวกับในระหว่างการกำหนดค่าเริ่มต้น newTree อาจเป็นต้นไม้ของโหนด การแสดงสตริง หรือออบเจ็กต์ JSON ข้อจำกัดเพียงอย่างเดียวคือไม่สามารถเปลี่ยนโหมดได้ นั่นคือหากมีหมวดหมู่ในกล่องเครื่องมือที่กำหนดไว้ในตอนแรก กล่องเครื่องมือใหม่ก็จะต้องมีหมวดหมู่ด้วย (แต่หมวดหมู่อาจมีการเปลี่ยนแปลง) ในทำนองเดียวกัน หากกล่องเครื่องมือที่กำหนดไว้ตอนแรกไม่มีหมวดหมู่ กล่องเครื่องมือใหม่ก็อาจไม่มีหมวดหมู่ใดๆ

คุณอัปเดตเนื้อหาของหมวดหมู่ใดหมวดหมู่หนึ่งได้โดย

var category = workspace.getToolbox().getToolboxItems()[0];
category.updateFlyoutContents(flyoutContents);

โดยที่ flyoutContents อาจเป็นรายการบล็อกที่กำหนดโดยใช้ JSON, แผนผังของโหนด หรือการแสดงสตริง

โปรดทราบว่าขณะนี้การอัปเดตกล่องเครื่องมืออาจทำให้มีการรีเซ็ต UI เล็กน้อย:

  • ในกล่องเครื่องมือที่ไม่มีหมวดหมู่ ช่องที่ผู้ใช้เปลี่ยนแปลง (เช่น เมนูแบบเลื่อนลง) จะเปลี่ยนกลับไปเป็นค่าเริ่มต้น

นี่คือการสาธิตแบบสดของต้นไม้ที่มีหมวดหมู่และบล็อกกลุ่ม