動的カテゴリとは、開かれるたびに、関数に基づいて動的に再設定されるカテゴリのことです。
Blockly では、登録済みの文字列キーを使用してカテゴリに関数を関連付けることで、これをサポートしています。関数は、カテゴリのコンテンツ(ブロック、ボタン、ラベルなど)の定義を返す必要があります。コンテンツは JSON または XML で指定できますが、JSON を使用することをおすすめします。
また、関数にはターゲット ワークスペースがパラメータとして渡されるため、動的カテゴリのブロックはワークスペースの状態に基づいて設定できます。
JSON
// 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);
XML
// Returns an array 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>
注: Blockly のコードベース全体で「procedure」という単語が使用されていますが、 生徒には「function」という単語の方がわかりやすいことがわかりました。不一致が生じて申し訳ありません。