কীবোর্ড শর্টকাট

ব্লকলি কীবোর্ড শর্টকাটগুলির একটি রেজিস্ট্রি রক্ষণাবেক্ষণ করে যা কীগুলি (অথবা ctrl-C মতো কী সংমিশ্রণগুলি) ক্রিয়াগুলিতে ম্যাপ করে৷ রেজিস্ট্রিটি অনেকগুলি শর্টকাট, যেমন কপির জন্য ctrl-C এবং meta-C দিয়ে তৈরি করা হয়েছে । আপনি রেজিস্ট্রি থেকে শর্টকাট যোগ করতে এবং মুছে ফেলতে পারেন।

কীবোর্ড শর্টকাট কিভাবে কাজ করে

শর্টকাট রেজিস্ট্রিতে এমন বস্তু রয়েছে যা মডেল কীবোর্ড শর্টকাট। যখন ব্যবহারকারী একটি কী (বা কীগুলির সংমিশ্রণ) টিপে, ব্লকলি:

  1. কীটিতে কোনো শর্টকাট প্রযোজ্য কিনা তা দেখতে রেজিস্ট্রি চেক করে। যদি একাধিক শর্টকাট কী ব্যবহার করে, শর্টকাটগুলি নিবন্ধকরণের বিপরীত ক্রমে চেষ্টা করা হয়। অর্থাৎ, সম্প্রতি নিবন্ধিত শর্টকাটটি প্রথমে চেষ্টা করা হয়।

  2. শর্টকাটের preconditionFn ফাংশনকে কল করে, যা শর্টকাটটি বর্তমান পরিস্থিতিতে প্রযোজ্য কিনা তা নির্ধারণ করে। উদাহরণস্বরূপ, অনুলিপি শর্টকাট ব্লকগুলিতে প্রযোজ্য কিন্তু কর্মক্ষেত্রে নয়। যদি শর্টকাট প্রযোজ্য না হয়, Blockly তালিকার পরবর্তী শর্টকাট চেষ্টা করে, যদি থাকে।

  3. শর্টকাটের callback ফাংশনকে কল করে, যা শর্টকাটের ক্রিয়া সম্পাদন করে। উদাহরণস্বরূপ, অনুলিপি শর্টকাট বর্তমানে ফোকাস করা বস্তুর একটি অনুলিপি তৈরি করে, যেমন একটি ব্লক। যদি এই ফাংশন true রিটার্ন করে, প্রসেসিং বন্ধ হয়ে যায়। যদি এটি false প্রত্যাবর্তন করে, ব্লকলি তালিকার পরবর্তী শর্টকাট চেষ্টা করে, যদি থাকে।

ব্যাপ্তি

একটি Scope অবজেক্ট ব্লকলি কম্পোনেন্ট সনাক্ত করে যেটিতে বর্তমানে ফোকাস রয়েছে। স্কোপ অবজেক্টগুলিকে preconditionFn এবং callback প্রেরণ করা হয়, যেগুলি একটি নির্দিষ্ট উপাদানের জন্য একটি শর্টকাট প্রযোজ্য কিনা এবং যদি তাই হয় তবে কীভাবে এটি প্রয়োগ করা যায় তা নির্ধারণ করতে ব্যবহার করে।

একটি Scope অবজেক্ট ব্যবহার করতে, এর focusedNode বৈশিষ্ট্য ব্যবহার করুন। এটি একটি বস্তু যা IFocusableNode প্রয়োগ করে। এই ইন্টারফেসটি সমস্ত ব্লকলি উপাদান দ্বারা প্রয়োগ করা হয় যেগুলিতে ব্যবহারকারী ফোকাস করতে পারে, যার মধ্যে ওয়ার্কস্পেস, ব্লক, ক্ষেত্র, মন্তব্য এবং আপনার নিজস্ব কাস্টম উপাদান রয়েছে; আরও তথ্যের জন্য, ফোকাস সিস্টেম দেখুন।

উদাহরণস্বরূপ, একটি শর্টকাট শুধুমাত্র ব্লকগুলিতে প্রযোজ্য তা নিশ্চিত করতে একটি preconditionFn focusedNode ব্যবহার করতে পারে।

preconditionFn(workspace, scope) {
  return (scope.focusedNode instanceof Blockly.BlockSvg);
}

কীবোর্ড শর্টকাট ইন্টারফেস

শর্টকাট রেজিস্ট্রির অবজেক্টগুলি KeyboardShortcut ইন্টারফেস বাস্তবায়ন করে। এতে নিম্নলিখিত বৈশিষ্ট্য রয়েছে।

নাম (প্রয়োজনীয়)

শর্টকাট জন্য একটি অনন্য নাম. এটি ব্যবহারকারীদের দেখানো হয় না এবং মানুষের পাঠযোগ্য হওয়ার প্রয়োজন নেই। এটি অনুবাদ করা উচিত নয়।

const logFieldsShortcut = {
  name: 'logFields',
  // ...
};

পূর্বশর্ত Fn (ঐচ্ছিক)

বর্তমান পরিস্থিতিতে একটি শর্টকাট প্রযোজ্য কিনা তা সিদ্ধান্ত নিতে ব্লকলি এই ফাংশনটিকে কল করে। যদি এটি true হয়, ব্লকলি callback কল করে। যদি এটি false প্রত্যাবর্তন করে, ব্লকলি এই শর্টকাট উপেক্ষা করে। যেমন:

const logFieldsShortcut = {
  // ...
  preconditionFn(workspace, scope) {
    // This shortcut only applies to blocks.
    return (scope.focusedNode instanceof Blockly.BlockSvg);
  },
  // ...
};

একটি শর্টকাট এই ফাংশনটি বাদ দিতে পারে যদি শর্টকাট সর্বদা প্রযোজ্য হয় (অসাধারণ)। শর্টকাটগুলি এই ফাংশনটি বাদ দেওয়া উচিত নয় এবং তারপরে callback শর্তসাপেক্ষে পদক্ষেপ নেওয়া উচিত৷ এটি করা ব্লকলিকে প্রযোজ্য শর্টকাটগুলি দেখায় এমন প্রাসঙ্গিক সহায়তা মেনু তৈরি করার মতো কাজগুলি থেকে বাধা দেয়।

কলব্যাক (ঐচ্ছিক)

এই ফাংশনটি শর্টকাটের সাথে যুক্ত ক্রিয়া সম্পাদন করে। এটি শুধুমাত্র তখনই বলা হয় যদি preconditionFn true ফেরত দেয় বা বিদ্যমান না থাকে। এর পরামিতিগুলি হল:

  • workspace : বর্তমান WorkspaceSvg
  • e : Event যা শর্টকাট শুরু করেছে।
  • shortcut : KeyboardShortcut শর্টকাট নিজেই।
  • scope : শর্টকাট প্রযোজ্য Scope

এটি সফল হলে true এবং ব্যর্থ হলে false ফেরত দেয়।

যেমন:

const logFieldsShortcut = {
  // ...
  callback(workspace, event, shortcut, scope) {
    // preconditionFn required focusedNode to be a BlockSvg.
    for (input of scope.focusedNode.inputList) {
      // Log the values of all named fields. (Label fields usually don't have names.)
      for (field of input.fieldRow) {
        if (field.name) {
          console.log(field.name + ': ' + field.getText());
        }
      }
    }
    return true;
  },
  // ...
};

যদিও callback ঐচ্ছিক, সাধারণত এটি বাস্তবায়ন না করার কোন কারণ নেই।

কীকোড (ঐচ্ছিক)

কীগুলির একটি অ্যারে (বা কীগুলির সংমিশ্রণ) যা এই শর্টকাটটি সক্রিয় করে। কী শনাক্ত করতে, Blockly.utils.KeyCodes এ কীকোড ব্যবহার করুন। যেমন:

const logFieldsShortcut = {
  // ...
  keyCodes: [Blockly.utils.KeyCodes.L],
  // ...
};

যদি আপনি একটি বিদ্যমান শর্টকাটে অতিরিক্ত কী ম্যাপ করতে চান -- উদাহরণস্বরূপ, আপনি একটি ডিফল্ট শর্টকাটে কী যোগ করতে চান -- আপনি Blockly.ShortcutRegistry.registry.addKeyMapping কল করতে পারেন। এটি সাধারণ নয়।

কী সমন্বয়

যদি আপনার কীবোর্ড শর্টকাট কীগুলির সংমিশ্রণ দ্বারা সক্রিয় করা হয়, যেমন Control এবং C একই সাথে ধরে রাখা, তাহলে Blockly.ShortcutRegistry.registry.createSerializedKey এ কল করে একটি ক্রমিক কীকোড তৈরি করুন :

const ctrlC = Blockly.ShortcutRegistry.registry.createSerializedKey(
  Blockly.utils.KeyCodes.C,       // Keycode of main key
  [Blockly.utils.KeyCodes.CTRL],  // Array of modifier keys
);

const copyShortcut = {
  // ...
  keyCodes: [ctrlC], // Use the serialized keycode
  // ...
};

নিয়ন্ত্রণ এবং মেটা

উইন্ডোজে, Control কী দিয়ে অনেক শর্টকাট সক্রিয় করা হয়। ম্যাকে, এই কীবোর্ড শর্টকাটগুলি পরিবর্তে Command কী ব্যবহার করে, যা META কীকোড হিসাবে স্বীকৃত। উভয় অপারেটিং সিস্টেম সমর্থন করতে, CTRL কীকোড এবং META কীকোড উভয়ের সাথে আপনার শর্টকাট নিবন্ধন করুন৷

const ctrlC = Blockly.ShortcutRegistry.registry.createSerializedKey(
  Blockly.utils.KeyCodes.C,
  [Blockly.utils.KeyCodes.CTRL],
);
const metaC = Blockly.ShortcutRegistry.registry.createSerializedKey(
  Blockly.utils.KeyCodes.C,
  [Blockly.utils.KeyCodes.META],
);

const copyShortcut = {
  // ...
  keyCodes: [ctrlC, metaC],
  // ...
};

বাস্তবায়ন নোট

Blockly-এর কীবোর্ড ইভেন্ট হ্যান্ডলাররা KeyboardEvent এর keycode বৈশিষ্ট্য ব্যবহার করে যদিও এটি অবমূল্যায়িত হয়।

অনুমতি সংঘর্ষ (ঐচ্ছিক)

ডিফল্টরূপে, আপনি একটি প্রদত্ত কী বা কী সমন্বয়ের জন্য শুধুমাত্র একটি শর্টকাট নিবন্ধন করতে পারেন। এই বৈশিষ্ট্যটিকে true হিসাবে সেট করা আপনাকে একটি কী (বা কী সংমিশ্রণ) নিবন্ধন করতে দেয় এমনকি যদি একই কী (বা কী সমন্বয়) সহ একটি শর্টকাট ইতিমধ্যে নিবন্ধিত হয়ে থাকে।

মনে রাখবেন যে এই সম্পত্তি শুধুমাত্র এই শর্টকাট নিবন্ধন করার চেষ্টা করার সময় প্রযোজ্য. এটি একই কী (বা কী সমন্বয়) ব্যবহার করা থেকে অন্যান্য শর্টকাটগুলিকে বাধা দেয় না। তারা নিবন্ধিত হতে পারে কিনা তা নির্ভর করে তাদের allowCollision সম্পত্তির মূল্যের উপর।

প্রদত্ত কী বা কী সমন্বয়ের জন্য কতগুলি শর্টকাট নিবন্ধিত হোক না কেন, সর্বাধিক একটি সফলভাবে কার্যকর করা হবে। শর্টকাটগুলি নিবন্ধকরণের বিপরীত ক্রমে চেষ্টা করা হয় (শেষ নিবন্ধিত থেকে প্রথম নিবন্ধিত পর্যন্ত)। তাদের একটি তাদের কলব্যাক থেকে true ফিরে আসার পরে, অন্য কোন শর্টকাট চেষ্টা করা হয় না।

মেটাডেটা (ঐচ্ছিক)

এটি অতিরিক্ত তথ্য ধারণকারী একটি নির্বিচারে বস্তু. এটি shortcut প্যারামিটারের মাধ্যমে callback জন্য উপলব্ধ।

শর্টকাট যোগ করুন, মুছুন এবং সংশোধন করুন

একটি নতুন কীবোর্ড শর্টকাট যোগ করতে, Blockly.ShortcutRegistry.registry.register কল করুন:

Blockly.ShortcutRegistry.registry.register(logFieldsShortcut);

এই ফাংশনটির একটি দ্বিতীয় প্যারামিটার রয়েছে ( allowOverrides ) যা আপনাকে আপনার শর্টকাটের মতো একই নামের সাথে একটি বিদ্যমান শর্টকাট প্রতিস্থাপন করতে দেয়। মনে রাখবেন যে এটি KeyboardShortcut.allowCollision থেকে ভিন্ন, যা আপনাকে একটি ভিন্ন নামের একটি শর্টকাট যোগ করতে দেয় কিন্তু বিদ্যমান শর্টকাট হিসাবে একই কী বা কী সমন্বয় ব্যবহার করে৷

একটি কীবোর্ড শর্টকাট মুছতে, Blockly.ShortcutRegistry.registry.unregister কল করুন এবং শর্টকাটের নামটি পাস করুন:

Blockly.ShortcutRegistry.registry.unregister('logFields');

আপনি জায়গায় একটি কীবোর্ড শর্টকাট পরিবর্তন করতে পারবেন না। পরিবর্তে, আপনাকে বিদ্যমান শর্টকাট মুছে ফেলতে হবে এবং একটি নতুন যোগ করতে হবে। যেমন:

// Get the existing shortcut. getRegistry returns an object keyed by shortcut name.
const allShortcuts = Blockly.ShortcutRegistry.registry.getRegistry();
const modLogFieldsShortcut = allShortcuts[logFieldsShortcut.name];
// Apply the shortcut only to math blocks,
modLogFieldsShortcut.preconditionFn = function (workspace, scope) {
  return (scope.focusedNode instanceof Blockly.BlockSvg &&
          scope.focusedNode.type.startsWith('math_'));
}
// Delete the existing shortcut and add the modified shortcut.
Blockly.ShortcutRegistry.registry.unregister(logFieldsShortcut.name);
Blockly.ShortcutRegistry.registry.register(modLogFieldsShortcut);

ডিফল্ট শর্টকাট

শর্টকাট রেজিস্ট্রি অনেকগুলি শর্টকাট দিয়ে তৈরি করা হয়েছে। আপনি এগুলি https://github.com/google/blockly/blob/master/core/shortcut_items.ts এ খুঁজে পেতে পারেন। শর্টকাটগুলি registerXxxx ফাংশনে সংজ্ঞায়িত করা হয়েছে।

কীবোর্ড নেভিগেশন শর্টকাট

কীবোর্ড নেভিগেশন প্লাগইনে শর্টকাট রয়েছে যা ব্যবহারকারীদের কীবোর্ড দিয়ে ব্লকলি নেভিগেট করতে দেয়, যেমন তীর কী ব্যবহার করে। যে সমস্ত ব্যবহারকারীরা মাউস ব্যবহার করতে পারে না, যেমন মোটর বা দৃষ্টি প্রতিবন্ধী তাদের জন্য কীবোর্ড নেভিগেশন অপরিহার্য। এটি ক্ষমতা ব্যবহারকারীদের জন্যও দরকারী যারা দক্ষতার জন্য কীবোর্ড শর্টকাট ব্যবহার করতে চান।