Açılır alanlar

Açılır alanda, değer olarak bir dize ve metni olarak bir dize saklanır. Bu değer, metne erişmek için kullanılacak dil gerektirmeyen bir anahtardır ve Blockly diller arasında geçiş yaptığında çevrilmez. Metin, kullanıcıya gösterilecek, okunabilir bir dizedir.

içerik üretimi

Açılır oluşturucu, bir menü oluşturucuyu ve isteğe bağlı bir validator alır. Menü oluşturucu pek çok esnekliğe sahiptir, ancak temel olarak her seçenek, kullanıcılar tarafından okunabilir bir bölüm ve dilden bağımsız bir dize içeren bir dizi seçenektir.

Basit metin açılır listeleri

İki metin seçeneği içeren açılır listeyi açın

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');
  }
};

Kullanıcıların okuyabileceği bilgileri dilsiz anahtardan ayrı tutmak, açılır menü ayarının diller arasında korunmasını sağlar. Örneğin, bir bloğun İngilizce sürümü [['left', 'LEFT'], ['right', 'RIGHT]] tanımlarken aynı bloğun Almanca sürümü [['links', 'LEFT'], ['rechts', 'RIGHT]] tanımlar.

Resim açılır listeleri

Açılır menüdeki seçenekler, metin yerine resim de olabilir. Görüntü nesneleri src, width, height ve alt özellikleriyle belirtilir.

Açılır listelerde metin ve resim seçeneklerinin bir karışımı bulunabilse de tek bir seçeneğin şu anda hem resim hem de metin içeremeyeceğini unutmayın.

Resim ve metin içeren açılır alan

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');
  }
};

Dinamik açılır listeler

Haftanın günlerini içeren açılır alan

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');
  });

Bu işlem bir JSON uzantısı kullanılarak yapılır.

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

Statik seçenekler listesi yerine, seçeneklerin dinamik olmasını sağlayan bir işlev içeren bir açılır liste de sağlanabilir. İşlev, statik seçeneklerle aynı [human-readable-value, language-neutral-key] biçiminde bir seçenek dizisi döndürmelidir. Açılır menü her tıklandığında işlev çalıştırılır ve seçenekler yeniden hesaplanır.

Serileştirme

JSON

Bir açılır liste alanı için JSON şöyle görünür:

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

Burada FIELDNAME, açılır liste alanına referans veren bir dizedir. Değer ise alana uygulanacak değerdir. Değer, tek bir dil gerektirmeyen bir seçenek anahtarı olmalıdır.

XML

Bir açılır liste alanı için XML şöyle görünür:

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

Alanın name özelliği, açılır listeye referans veren bir dize içerirken iç metin alana uygulanacak değerdir. İç metin, geçerli bir dil duyarsız seçenek anahtarı olmalıdır.

Özelleştirme

Blockly.FieldDropdown.ARROW_CHAR özelliği, açılır oku temsil eden unicode karakterini değiştirmek için kullanılabilir.

Özel ok içeren açılır liste alanı

ARROW_CHAR özelliği, Android'de varsayılan olarak \u25BC (▼) ve \u25BE (▾) değerine ayarlanır.

Bu global bir mülk olduğu için ayarlandığında tüm açılır liste alanlarını değiştirir.

Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH özelliği, menünün maksimum yüksekliğini değiştirmek için kullanılabilir. Görüntü alanı yüksekliğinin bir yüzdesi olarak tanımlanır. Görüntü alanı, penceredir.

MAX_MENU_HEIGHT_VH özelliğinin varsayılan değeri 0,45'tir.

Bu global bir mülk olduğu için ayarlandığında tüm açılır liste alanlarını değiştirir.

Önek/sonek eşleşmesi

Tüm açılır menü seçenekleri ortak ön eki ve/veya son eki paylaşıyorsa bu kelimeler otomatik olarak göz ardı edilir ve statik metin olarak eklenir. Örneğin, aynı bloku iki şekilde oluşturabilirsiniz (ilki sonek eşleştirmesi olmadan, ikincisi sonek eşlemesi olmadan):

Son ek eşleştirme olmadan:

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');
  }
};

Sonek eşleştirmede:

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');
  }
};

Açılır alan

Bu yaklaşımın avantajlarından biri, blokun diğer dillere daha kolay çevrilmesidir. Önceki kod 'hello', 'world' ve 'computer' dizelerine sahipken düzeltilmiş kod 'hello world' ve 'hello computer' dizelerine sahiptir. Çevirmenlerin ifadeleri çevirmek, tek başına kelimeler kullanmaktan çok daha kolay olmasını sağlar.

Bu yaklaşımın diğer bir avantajı, kelime sırasının genellikle diller arasında değişmesidir. 'world hello' ve 'computer hello' dillerinin kullanıldığı bir dil düşünün. Sonek eşleştirme algoritması, ortak 'hello' öğesini algılar ve bunu açılır menüden sonra gösterir.

Ancak bazen önek/sonek eşleşmesi başarısız olur. Bazı durumlarda iki kelime her zaman birlikte kullanılır ve önek çıkarılmaz. Örneğin, 'drive red car' ve 'drive red truck' muhtemelen 'drive red' değil, yalnızca 'drive' öğelerini dikkate almamalıdır. Unicode için bölünmeyen boşluk '\u00A0', önek/sonek eşleyicisini gizlemek için normal bir boşluk yerine kullanılabilir. Dolayısıyla, yukarıdaki örnek 'drive red\u00A0car' ve 'drive red\u00A0truck' ile düzeltilebilir.

Önek/sonek eşleşmesinin başarısız olduğu bir başka yer de kelimeleri tek tek boşluklarla ayırmayan dillerdir. Çince iyi bir örnek. '訪問中國' dizesi 'visit China' anlamına gelir. kelimeler arasında boşluk olmadığına dikkat edin. Son iki karakter ('中國') toplu olarak 'China' için kullanılan kelimedir. Ancak bölünme durumunda bunlar sırasıyla 'centre' ve 'country' anlamına gelir. Çince gibi dillerde önek/sonek eşleşmesinin çalışması için boşluk eklenmesi gereken yere boşluk eklemeniz yeterlidir. Örneğin, '訪問 中國' ve '訪問 美國' "visit [China/USA]" ile sonuçlanırken '訪問 中 國' ve '訪問 美 國' "visit [centre/beautiful] country" ile sonuçlanır.

Açılır liste doğrulayıcı oluşturma

Açılır liste alanının değeri, dil içermeyen bir dizedir. Bu nedenle, tüm doğrulayıcılar bir dizeyi kabul etmeli ve kullanılabilir bir seçenek olan, null veya undefined olan bir dize döndürmelidir.

Doğrulayıcınız başka bir şey döndürürse Blockly'nin davranışı tanımlanmaz ve programınız kilitlenebilir.

Örneğin, üç seçenekli bir açılır alan ve şunun gibi bir doğrulayıcı tanımlayabilirsiniz:

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 her zaman iletildiği değeri döndürür, ancak açılır menü değerine göre giriş ekleyen veya kaldıran yardımcı işlevi updateConnection çağırır:

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');
  }
}