ড্রপডাউন ক্ষেত্র

ড্রপডাউন ক্ষেত্রটি একটি স্ট্রিং এর মান হিসাবে এবং একটি স্ট্রিং এর পাঠ্য হিসাবে সংরক্ষণ করে। মানটি একটি ভাষা-নিরপেক্ষ কী যা পাঠ্য অ্যাক্সেস করার জন্য ব্যবহার করা হবে এবং যখন ব্লকলি ভাষাগুলির মধ্যে স্যুইচ করা হয় তখন অনুবাদ করা হবে না। পাঠ্যটি একটি মানব-পাঠযোগ্য স্ট্রিং যা ব্যবহারকারীর কাছে প্রদর্শিত হবে।

সৃষ্টি

ড্রপডাউন কনস্ট্রাক্টর একটি মেনু জেনারেটর এবং একটি ঐচ্ছিক যাচাইকারী নেয়। মেনু জেনারেটরের অনেক নমনীয়তা রয়েছে, তবে এটি মূলত বিকল্পগুলির একটি অ্যারে, প্রতিটি বিকল্পে একটি মানব-পাঠযোগ্য অংশ এবং একটি ভাষা-নিরপেক্ষ স্ট্রিং রয়েছে।

সহজ পাঠ্য ড্রপডাউন

দুটি পাঠ্য বিকল্প সহ ড্রপডাউন খুলুন

JSON

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

জাভাস্ক্রিপ্ট

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]] সংজ্ঞায়িত করবে। [['links', 'LEFT'], ['rechts', 'RIGHT]]

ছবি ড্রপডাউন

একটি ড্রপডাউন মেনুতে বিকল্পগুলি পাঠ্যের পরিবর্তে চিত্রগুলিও হতে পারে৷ ইমেজ অবজেক্ট src , width , height , এবং alt বৈশিষ্ট্য দিয়ে নির্দিষ্ট করা হয়।

মনে রাখবেন যদিও একটি ড্রপডাউনে টেক্সট অপশন এবং ইমেজ অপশনের মিশ্রণ থাকতে পারে, একটি পৃথক বিকল্পে বর্তমানে একটি ইমেজ এবং টেক্সট উভয়ই থাকতে পারে না।

ছবি এবং পাঠ্য ধারণকারী ড্রপডাউন ক্ষেত্র

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"]
      ]
    }
  ]
}

জাভাস্ক্রিপ্ট

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 এক্সটেনশন ব্যবহার করে করা হয়।

জাভাস্ক্রিপ্ট

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 হল একটি স্ট্রিং যা একটি ড্রপডাউন ক্ষেত্র উল্লেখ করে এবং মান হল ক্ষেত্রে প্রয়োগ করা মান৷ মানটি একটি ভাষা-নিরপেক্ষ বিকল্প কী হওয়া উচিত।

এক্সএমএল

একটি ড্রপডাউন ক্ষেত্রের জন্য XML দেখতে এরকম দেখাচ্ছে:

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

যেখানে ক্ষেত্রের name বৈশিষ্ট্যে একটি স্ট্রিং রয়েছে যা একটি ড্রপডাউন ক্ষেত্রের উল্লেখ করে এবং ভিতরের পাঠ্যটি ক্ষেত্রে প্রয়োগ করার মান। ভিতরের পাঠ্যটি একটি বৈধ ভাষা-নিরপেক্ষ বিকল্প কী হওয়া উচিত।

কাস্টমাইজেশন

Blockly.FieldDropdown.ARROW_CHAR বৈশিষ্ট্যটি ড্রপডাউন তীর প্রতিনিধিত্বকারী ইউনিকোড অক্ষর পরিবর্তন করতে ব্যবহার করা যেতে পারে।

কাস্টম তীর সহ ড্রপডাউন ক্ষেত্র

ARROW_CHAR প্রপার্টি Android-এ \u25BC (▼) এবং অন্যথায় \u25BE (▾) তে ডিফল্ট।

এটি একটি বিশ্বব্যাপী সম্পত্তি, তাই এটি সেট করার সময় সমস্ত ড্রপডাউন ক্ষেত্র পরিবর্তন করবে।

Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH বৈশিষ্ট্যটি মেনুর সর্বোচ্চ উচ্চতা পরিবর্তন করতে ব্যবহার করা যেতে পারে। এটি ভিউপোর্টের উচ্চতার শতাংশ হিসাবে সংজ্ঞায়িত করা হয়, ভিউপোর্টটি উইন্ডো।

MAX_MENU_HEIGHT_VH প্রপার্টি ডিফল্ট 0.45।

এটি একটি বিশ্বব্যাপী সম্পত্তি, তাই এটি সেট করার সময় সমস্ত ড্রপডাউন ক্ষেত্র পরিবর্তন করবে।

উপসর্গ/প্রত্যয় মিলে যাওয়া

যদি সমস্ত ড্রপডাউন মেনু বিকল্পগুলি সাধারণ উপসর্গ এবং/অথবা প্রত্যয় শব্দগুলি ভাগ করে তবে এই শব্দগুলি স্বয়ংক্রিয়ভাবে ফ্যাক্টর আউট হয়ে যায় এবং স্ট্যাটিক টেক্সট হিসাবে সন্নিবেশিত হয়। উদাহরণস্বরূপ, এখানে একই ব্লক তৈরি করার দুটি উপায় রয়েছে (প্রথমটি প্রত্যয় ম্যাচিং ছাড়াই এবং দ্বিতীয়টির সাথে):

প্রত্যয় মিল ছাড়া:

JSON

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

জাভাস্ক্রিপ্ট

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"]
      ]
    }
  ]
}

জাভাস্ক্রিপ্ট

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' সনাক্ত করবে এবং ড্রপ-ডাউনের পরে এটি প্রদর্শন করবে।

যাইহোক, কখনও কখনও উপসর্গ/প্রত্যয় ম্যাচিং ব্যর্থ হয়। এমন কিছু ক্ষেত্রে রয়েছে যেখানে দুটি শব্দ সর্বদা একসাথে যাওয়া উচিত এবং উপসর্গটি ফ্যাক্টর করা উচিত নয়। যেমন 'drive red car' এবং 'drive red truck' যুক্তিযুক্তভাবে শুধুমাত্র 'drive' ফ্যাক্টর করা উচিত, 'drive red' নয়। ইউনিকোড নন-ব্রেকিং স্পেস '\u00A0' উপসর্গ/প্রত্যয় ম্যাচারকে চাপা দিতে একটি নিয়মিত স্থানের জায়গায় ব্যবহার করা যেতে পারে। এইভাবে উপরের উদাহরণটি 'drive red\u00A0car' এবং 'drive red\u00A0truck' দিয়ে ঠিক করা যেতে পারে।

আরেকটি জায়গা যেখানে উপসর্গ/প্রত্যয় মিলতে ব্যর্থ হয় তা হল সেই ভাষাগুলিতে যা পৃথক শব্দগুলিকে স্পেস দিয়ে আলাদা করে না। চীনা একটি ভাল উদাহরণ. '訪問中國' স্ট্রিংটির অর্থ 'visit China' , শব্দের মধ্যে শূন্যস্থানের অভাব লক্ষ্য করুন। সমষ্টিগতভাবে, শেষ দুটি অক্ষর ( '中國' ) হল 'China' শব্দ, কিন্তু বিভক্ত হলে যথাক্রমে 'centre' এবং 'country' বোঝাবে। চাইনিজ ভাষাতে উপসর্গ/প্রত্যয় মিলে কাজ করতে, শুধুমাত্র একটি স্থান সন্নিবেশ করুন যেখানে বিরতি হওয়া উচিত। উদাহরণস্বরূপ '訪問 中國' এবং '訪問 美國' -এর ফলে "visit [China/USA]" , যেখানে '訪問 中 國' এবং '訪問 美 國' ফলে "visit [centre/beautiful] country" হবে৷

একটি ড্রপডাউন যাচাইকারী তৈরি করা হচ্ছে

একটি ড্রপডাউন ক্ষেত্রের মান হল একটি ভাষা-নিরপেক্ষ স্ট্রিং, তাই যেকোনো যাচাইকারীকে অবশ্যই একটি স্ট্রিং গ্রহণ করতে হবে এবং একটি স্ট্রিং ফেরত দিতে হবে যা একটি উপলব্ধ বিকল্প , null , বা undefined

যদি আপনার যাচাইকারী অন্য কিছু ফেরত দেয়, তাহলে Blockly এর আচরণ অনির্ধারিত এবং আপনার প্রোগ্রাম ক্র্যাশ হতে পারে।

উদাহরণস্বরূপ, আপনি তিনটি বিকল্প সহ একটি ড্রপডাউন ক্ষেত্র সংজ্ঞায়িত করতে পারেন এবং এটির মতো একটি যাচাইকারী:

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 কল করে যা ড্রপডাউন মানের উপর ভিত্তি করে ইনপুট যোগ করে বা অপসারণ করে:

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