プルダウン フィールド

プルダウン フィールドには、値として文字列が、テキストとして文字列が格納されます。「 value は言語に依存しないキーで、テキストと Blockly を言語間で切り替えたときには翻訳されません。テキストは ユーザーに表示される、人が読める形式の文字列。

作成

プルダウン コンストラクタは、メニュー ジェネレータとオプションの バリデータ。メニュー生成ツールには 基本的には複数のオプションからなり、各オプションには そして言語に依存しない文字列です

シンプルなテキスト プルダウン

2 つのテキスト オプションを含むプルダウンを開く

JSON

{
  "type": "example_dropdown",
  "message0": "drop down: %1",
  "args0": [
    {
      "type": "field_dropdown",
      "name": "FIELDNAME",
      "options": [
        [ "first item", "ITEM1" ],
        [ "second item", "ITEM2" ]
      ]
    }
  ]
}

JavaScript

Blockly.Blocks['example_dropdown'] = {
  init: function() {
    this.appendDummyInput()
        .appendField('drop down:')
        .appendField(new Blockly.FieldDropdown([
            ['first item', 'ITEM1'],
            ['second item', 'ITEM2']
        ]), 'FIELDNAME');
  }
};

人が読める形式の情報と言語に依存しない鍵を分ける を使用すると、言語間でプルダウン メニューの設定を維持できます。対象 ブロックの英語バージョンでは [['left', 'LEFT'], ['right', 'RIGHT]] が定義され、同じブロックのドイツ語バージョンでは [['links', 'LEFT'], ['rechts', 'RIGHT]] が定義されます。

画像のプルダウン

プルダウン メニューのオプションは、テキストではなく画像にすることもできます。イメージオブジェクトは srcwidthheightalt の各プロパティで指定されています。

なお、プルダウンにはテキスト オプションと画像のオプションを混在させることができますが、 現在、個々のオプションに画像とテキストの両方を含めることはできません。

画像とテキストを含むプルダウン フィールド

JSON

{
  "type": "image_dropdown",
  "message0": "flag %1",
  "args0": [
    {
      "type": "field_dropdown",
      "name": "FLAG",
      "options": [
        ["none", "NONE"],
        [{"src": "canada.png", "width": 50, "height": 25, "alt": "Canada"}, "CANADA"],
        [{"src": "usa.png", "width": 50, "height": 25, "alt": "USA"}, "USA"],
        [{"src": "mexico.png", "width": 50, "height": 25, "alt": "Mexico"}, "MEXICO"]
      ]
    }
  ]
}

JavaScript

Blockly.Blocks['image_dropdown'] = {
  init: function() {
    var input = this.appendDummyInput()
        .appendField('flag');
    var options = [
        ['none', 'NONE'],
        [{'src': 'canada.png', 'width': 50, 'height': 25, 'alt': 'Canada'}, 'CANADA'],
        [{'src': 'usa.png', 'width': 50, 'height': 25, 'alt': 'USA'}, 'USA'],
        [{'src': 'mexico.png', 'width': 50, 'height': 25, 'alt': 'Mexico'}, 'MEXICO']
    ];
    input.appendField(new Blockly.FieldDropdown(options), 'FLAG');
  }
};

動的なプルダウン

曜日のプルダウン フィールド

JSON

{
  "type": "dynamic_dropdown",
  "message0": "day %1",
  "args0": [
    {
      "type": "input_dummy",
      "name": "INPUT"
    }
  ],
  "extensions": ["dynamic_menu_extension"]
}
Blockly.Extensions.register('dynamic_menu_extension',
  function() {
    this.getInput('INPUT')
      .appendField(new Blockly.FieldDropdown(
        function() {
          var options = [];
          var now = Date.now();
          for(var i = 0; i < 7; i++) {
            var dateString = String(new Date(now)).substring(0, 3);
            options.push([dateString, dateString.toUpperCase()]);
            now += 24 * 60 * 60 * 1000;
          }
          return options;
        }), 'DAY');
  });

これには JSON 関数を使用して 拡張機能:

JavaScript

Blockly.Blocks['dynamic_dropdown'] = {
  init: function() {
    var input = this.appendDummyInput()
      .appendField('day')
      .appendField(new Blockly.FieldDropdown(
        this.generateOptions), 'DAY');
  },

  generateOptions: function() {
    var options = [];
    var now = Date.now();
    for(var i = 0; i < 7; i++) {
      var dateString = String(new Date(now)).substring(0, 3);
      options.push([dateString, dateString.toUpperCase()]);
      now += 24 * 60 * 60 * 1000;
    }
    return options;
  }
};

静的なリストの代わりに、関数でプルダウンを指定することもできます。 オプションです。これにより、オプションを動的に設定できます。この関数は 同じ [human-readable-value, language-neutral-key] 内のオプションの配列 静的オプションとしてエクスポートできます。プルダウンがクリックされるたびに オプションが再計算されます

シリアル化

JSON

プルダウン フィールドの JSON は次のようになります。

{
  "fields": {
    "FIELDNAME": "LANGUAGE-NEUTRAL-KEY"
  }
}

ここで、FIELDNAME はプルダウン フィールドを参照する文字列です。 value は、フィールドに適用する値です。この値は 言語に依存しないオプションキー。

XML

プルダウン フィールドの XML は次のようになります。

<field name="FIELDNAME">LANGUAGE-NEUTRAL-KEY</field>

フィールドの name 属性にプルダウンを参照する文字列が含まれる場合 フィールド、内部テキストはフィールドに適用する値です。内部 言語に依存しない有効なオプションキーにする必要があります。

カスタマイズ

Blockly.FieldDropdown.ARROW_CHAR プロパティを使用すると、 プルダウン矢印を表す Unicode 文字。

カスタム矢印が付いたプルダウン フィールド

ARROW_CHAR プロパティの既定値は、Android では \u25BC(↓)、\u25BE(▾)です。 できません。

これはグローバル プロパティであるため、設定されるとすべてのプルダウン フィールドが変更されます。

Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH プロパティを使用すると、 メニューの最大の高さ。これはビューポートの割合として定義され、 ビューポートがウィンドウになります

MAX_MENU_HEIGHT_VH プロパティのデフォルト値は 0.45 です。

これはグローバル プロパティであるため、設定されるとすべてのプルダウン フィールドが変更されます。

接頭辞/接尾辞の一致

すべてのプルダウン メニューのオプションに共通の接頭辞や接尾辞が使われている場合 これらの単語は自動的に除去され、静的なテキストとして挿入されます。 たとえば、同じブロックを作成する方法は 2 つあります(1 つ目は が次が含まれ、2 番目は次が指定されます)。

サフィックス マッチングを使用しない場合:

JSON

{
  "type": "dropdown_no_matching",
  "message0": "hello %1",
  "args0": [
    {
      "type": "field_dropdown",
      "name": "MODE",
      "options": [
        ["world", "WORLD"],
        ["computer", "CPU"]
      ]
    }
  ]
}

JavaScript

Blockly.Blocks['dropdown_no_matching'] = {
  init: function() {
    var options = [
      ['world', 'WORLD'],
      ['computer', 'CPU']
    ];

    this.appendDummyInput()
        .appendField('hello')
        .appendField(new Blockly.FieldDropdown(options), 'MODE');
  }
};

サフィックス マッチングを使用する場合:

JSON

{
  "type": "dropdown_with_matching",
  "message0": "%1",
  "args0": [
    {
      "type": "field_dropdown",
      "name": "MODE",
      "options": [
        ["hello world", "WORLD"],
        ["hello computer", "CPU"]
      ]
    }
  ]
}

JavaScript

Blockly.Blocks['dropdown_with_matching'] = {
  init: function() {
    var options = [
      ['hello world', 'WORLD'],
      ['hello computer', 'CPU']
    ];

    this.appendDummyInput()
        .appendField(new Blockly.FieldDropdown(options), 'MODE');
  }
};

プルダウン フィールド

このアプローチの利点の一つは、ブロックを 他の言語にも対応しています。前のコードには、文字列 'hello''world'、および 'computer'。修正されたコードには文字列 'hello world''hello computer'。翻訳者はフレーズを翻訳するのに 使用できます。

このアプローチのもう一つの利点は、単語の順序が 対応しています。'world hello''computer hello' を使用する言語を想像してみてください。 サフィックス マッチング アルゴリズムが共通の 'hello' を検出して表示します プルダウンから選びます

ただし、接頭辞/接尾辞の一致は失敗することがあります。一部のケースでは 2 つの単語は常に一緒になり、接頭辞は除外されません。 たとえば、'drive red car''drive red truck' は、間違いなく 'drive red' ではなく 'drive' を除算します。Unicode の非互換性 通常のスペースの代わりにスペース '\u00A0' を使用すると、 一致します。したがって、上記の例は、次のコマンドで修正できます。 'drive red\u00A0car''drive red\u00A0truck'

接頭辞/接尾辞のマッチングが失敗するもう一つの問題は、 単語をスペースで区切ることができます。中国語が良い例です。文字列 '訪問中國''visit China' を意味します。単語間にスペースがないことに注意してください。 まとめると、最後の 2 文字('中國')は 'China' を指す単語です。 分割する場合はそれぞれ 'centre''country' を意味します。 中国語などの言語では、接頭辞/接尾辞のマッチングが機能します。 必要な部分にスペースを挿入しますたとえば、'訪問 中國''訪問 美國'"visit [China/USA]" になりますが、'訪問 中 國''訪問 美 國'"visit [centre/beautiful] country" になります。

プルダウン バリデータを作成する

プルダウン フィールドの値は言語に依存しない文字列であるため、バリデータはすべて 文字列を受け入れ、使用可能なオプションである文字列、null、または undefined

バリデータによって他の値が返された場合、Blockly の動作は未定義となり、 プログラムがクラッシュする可能性があります。

たとえば、3 つのオプションと 1 つのプルダウンを含む 使用します。

validate: function(newValue) {
  this.getSourceBlock().updateConnections(newValue);
  return newValue;
},

init: function() {
  var options = [
   ['has neither', 'NEITHER'],
   ['has statement', 'STATEMENT'],
   ['has value', 'VALUE'],
  ];

  this.appendDummyInput()
  // Pass the field constructor the options list, the validator, and the name.
      .appendField(new Blockly.FieldDropdown(options, this.validate), 'MODE');
}

validate は常に渡された値を返しますが、ヘルパーを呼び出します。 プルダウンに基づいて入力を追加または削除できる関数 updateConnection value:

updateConnections: function(newValue) {
  this.removeInput('STATEMENT', /* no error */ true);
  this.removeInput('VALUE', /* no error */ true);
  if (newValue == 'STATEMENT') {
    this.appendStatementInput('STATEMENT');
  } else if (newValue == 'VALUE') {
    this.appendValueInput('VALUE');
  }
}