कीबोर्ड शॉर्टकट

Blockly, कीबोर्ड शॉर्टकट की एक रजिस्ट्री बनाए रखता है. इसमें कुंजियों (या ctrl-C जैसे कुंजी कॉम्बिनेशन) को कार्रवाइयों से मैप किया जाता है. रजिस्ट्री में कई शॉर्टकट पहले से भरे होते हैं. जैसे, कॉपी करने के लिए ctrl-C और meta-C. रजिस्ट्री में शॉर्टकट जोड़े जा सकते हैं और उन्हें मिटाया जा सकता है.

कीबोर्ड शॉर्टकट कैसे काम करते हैं

शॉर्टकट रजिस्ट्री में ऐसे ऑब्जेक्ट होते हैं जो कीबोर्ड शॉर्टकट को मॉडल करते हैं. जब कोई उपयोगकर्ता किसी बटन (या बटनों के कॉम्बिनेशन) को दबाता है, तो Blockly:

  1. यह रजिस्ट्री की जांच करता है, ताकि यह पता चल सके कि कुंजी पर कोई शॉर्टकट लागू होता है या नहीं. अगर एक से ज़्यादा शॉर्टकट में एक ही कुंजी का इस्तेमाल किया जाता है, तो शॉर्टकट को रजिस्टर करने के क्रम के उलट क्रम में आज़माया जाता है. इसका मतलब है कि सबसे हाल ही में रजिस्टर किए गए शॉर्टकट को सबसे पहले आज़माया जाता है.

  2. यह कुकी, शॉर्टकट के preconditionFn फ़ंक्शन को कॉल करती है. इससे यह तय होता है कि शॉर्टकट मौजूदा स्थिति पर लागू होता है या नहीं. उदाहरण के लिए, कॉपी करने का शॉर्टकट, ब्लॉक पर लागू होता है, लेकिन वर्कस्पेस पर नहीं. अगर शॉर्टकट लागू नहीं होता है, तो Blockly सूची में मौजूद अगले शॉर्टकट को आज़माता है.

  3. यह शॉर्टकट के callback फ़ंक्शन को कॉल करता है. यह फ़ंक्शन, शॉर्टकट की कार्रवाई को पूरा करता है. उदाहरण के लिए, कॉपी करने का शॉर्टकट, फ़िलहाल फ़ोकस किए गए ऑब्जेक्ट की कॉपी बनाता है. जैसे, कोई ब्लॉक. अगर यह फ़ंक्शन true दिखाता है, तो प्रोसेसिंग बंद हो जाती है. अगर यह false दिखाता है, तो Blockly सूची में मौजूद अगले शॉर्टकट को आज़माता है.

दायरा

A Scope ऑब्जेक्ट, Blockly के उस कॉम्पोनेंट की पहचान करता है जिस पर फ़िलहाल फ़ोकस है. स्कोप ऑब्जेक्ट, preconditionFn और callback को पास किए जाते हैं. ये ऑब्जेक्ट, यह तय करने के लिए इनका इस्तेमाल करते हैं कि कोई शॉर्टकट किसी कॉम्पोनेंट पर लागू होता है या नहीं. अगर लागू होता है, तो इसे कैसे लागू किया जाए.

Scope ऑब्जेक्ट का इस्तेमाल करने के लिए, उसकी focusedNode प्रॉपर्टी का इस्तेमाल करें. यह एक ऐसा ऑब्जेक्ट है जो IFocusableNode को लागू करता है. इस इंटरफ़ेस को Blockly के उन सभी कॉम्पोनेंट में लागू किया जाता है जिन पर उपयोगकर्ता फ़ोकस कर सकता है. इनमें वर्कस्पेस, ब्लॉक, फ़ील्ड, टिप्पणियां, और आपके कस्टम कॉम्पोनेंट शामिल हैं. ज़्यादा जानकारी के लिए, फ़ोकस सिस्टम देखें.

उदाहरण के लिए, preconditionFn यह पक्का करने के लिए focusedNode का इस्तेमाल कर सकता है कि शॉर्टकट सिर्फ़ ब्लॉक पर लागू हो.

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

KeyboardShortcut इंटरफ़ेस

शॉर्टकट रजिस्ट्री में मौजूद ऑब्जेक्ट, KeyboardShortcut इंटरफ़ेस लागू करते हैं. इसमें ये प्रॉपर्टी शामिल हैं.

नाम (ज़रूरी है)

शॉर्टकट के लिए यूनीक नाम. यह उपयोगकर्ताओं को नहीं दिखता है. साथ ही, यह ज़रूरी नहीं है कि इसे आसानी से पढ़ा जा सके. इसका अनुवाद नहीं किया जाना चाहिए.

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

preconditionFn (ज़रूरी नहीं)

Blockly इस फ़ंक्शन को कॉल करता है, ताकि यह तय किया जा सके कि मौजूदा स्थिति में कोई शॉर्टकट लागू होता है या नहीं. अगर यह true दिखाता है, तो Blockly callback को कॉल करता है. अगर यह false दिखाता है, तो Blockly इस शॉर्टकट को अनदेखा कर देता है. उदाहरण के लिए:

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

अगर शॉर्टकट हमेशा लागू होता है, तो इस फ़ंक्शन को शॉर्टकट से हटाया जा सकता है. हालांकि, ऐसा कम ही होता है. शॉर्टकट में इस फ़ंक्शन को शामिल करना ज़रूरी है. इसके बाद, callback में शर्त के हिसाब से कार्रवाई की जा सकती है. ऐसा करने से, Blockly को कुछ काम करने से रोका जा सकता है. जैसे, कॉन्टेक्स्ट के हिसाब से मदद वाले मेन्यू बनाना, जिनमें लागू होने वाले शॉर्टकट दिखते हैं.

कॉलबैक (ज़रूरी नहीं)

यह फ़ंक्शन, शॉर्टकट से जुड़ी कार्रवाई को पूरा करता है. इसे सिर्फ़ तब कॉल किया जाता है, जब 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 को लागू करना ज़रूरी नहीं है. हालांकि, आम तौर पर इसे लागू न करने की कोई वजह नहीं होती.

keyCodes (ज़रूरी नहीं)

कुंजियों (या कुंजियों के कॉम्बिनेशन) का एक ऐसा कलेक्शन जो इस शॉर्टकट को चालू करता है. कुंजियों की पहचान करने के लिए, 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
  // ...
};

कंट्रोल और Meta

Windows में, कई शॉर्टकट Control बटन से चालू होते हैं. Mac पर, इन कीबोर्ड शॉर्टकट के लिए 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 प्रॉपर्टी का इस्तेमाल करते हैं. भले ही, इसे बंद कर दिया गया हो.

allowCollision (ज़रूरी नहीं)

डिफ़ॉल्ट रूप से, किसी बटन या बटन के कॉम्बिनेशन के लिए सिर्फ़ एक शॉर्टकट रजिस्टर किया जा सकता है. इस प्रॉपर्टी को true पर सेट करने से, किसी कुंजी (या कुंजी के कॉम्बिनेशन) को रजिस्टर किया जा सकता है. भले ही, उसी कुंजी (या कुंजी के कॉम्बिनेशन) के साथ कोई शॉर्टकट पहले से रजिस्टर हो.

ध्यान दें कि यह प्रॉपर्टी सिर्फ़ इस शॉर्टकट को रजिस्टर करने की कोशिश करते समय लागू होती है. इससे अन्य शॉर्टकट को एक ही बटन (या बटन के कॉम्बिनेशन) का इस्तेमाल करने से नहीं रोका जाता. इन्हें रजिस्टर किया जा सकता है या नहीं, यह इनकी allowCollision प्रॉपर्टी की वैल्यू पर निर्भर करता है.

किसी कुंजी या कुंजी के कॉम्बिनेशन के लिए कितने भी शॉर्टकट रजिस्टर किए गए हों, उनमें से ज़्यादा से ज़्यादा एक ही शॉर्टकट काम करेगा. शॉर्टकट को रजिस्टर करने के क्रम के हिसाब से इस्तेमाल किया जाता है. सबसे पहले, आखिरी बार रजिस्टर किए गए शॉर्टकट का इस्तेमाल किया जाता है. इसके बाद, उससे पहले रजिस्टर किए गए शॉर्टकट का इस्तेमाल किया जाता है. इनमें से किसी एक के कॉल बैक से true मिलने के बाद, कोई अन्य शॉर्टकट आज़माया नहीं जाता.

मेटाडेटा (ज़रूरी नहीं)

यह एक आर्बिट्ररी ऑब्जेक्ट है, जिसमें अतिरिक्त जानकारी शामिल होती है. यह shortcut पैरामीटर के ज़रिए callback के लिए उपलब्ध है.

शॉर्टकट जोड़ना, मिटाना, और उनमें बदलाव करना

नया कीबोर्ड शॉर्टकट जोड़ने के लिए, Blockly.ShortcutRegistry.registry.register को कॉल करें:

Blockly.ShortcutRegistry.registry.register(logFieldsShortcut);

इस फ़ंक्शन में दूसरा पैरामीटर (allowOverrides) होता है. इसकी मदद से, किसी मौजूदा शॉर्टकट को उसी नाम के शॉर्टकट से बदला जा सकता है. ध्यान दें कि यह KeyboardShortcut.allowCollision से अलग है. 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 फ़ंक्शन में तय किए जाते हैं.

कीबोर्ड से नेविगेट करने के शॉर्टकट

कीबोर्ड नेविगेशन प्लगिन में ऐसे शॉर्टकट होते हैं जिनकी मदद से उपयोगकर्ता, कीबोर्ड का इस्तेमाल करके Blockly पर नेविगेट कर सकते हैं. जैसे, ऐरो वाले बटन का इस्तेमाल करना. कीबोर्ड से नेविगेट करने की सुविधा उन लोगों के लिए ज़रूरी है जो माउस का इस्तेमाल नहीं कर सकते. जैसे, वे लोग जिन्हें देखने या चलने-फिरने में परेशानी होती है. यह उन लोगों के लिए भी काम का है जो कीबोर्ड शॉर्टकट का इस्तेमाल करके, ज़्यादा तेज़ी से काम करना चाहते हैं.