Blockly มีรีจิสทรีของแป้นพิมพ์ลัดที่แมปแป้น (หรือชุดแป้น เช่น ctrl-C
) กับการดำเนินการ รีจิสทรีจะป้อนข้อมูลล่วงหน้าด้วยแป้นพิมพ์ลัดจำนวนหนึ่ง เช่น ctrl-C
และ meta-C
สำหรับการคัดลอก คุณเพิ่มและลบทางลัดจากรีจิสทรีได้
วิธีการทำงานของแป้นพิมพ์ลัด
รีจิสทรีแป้นพิมพ์ลัดมีออบเจ็กต์ที่จำลองแป้นพิมพ์ลัด เมื่อ ผู้ใช้กดแป้น (หรือชุดแป้น) Blockly จะทำดังนี้
ตรวจสอบรีจิสทรีเพื่อดูว่ามีทางลัดใดที่ใช้กับคีย์หรือไม่ หากแป้นพิมพ์ลัดมากกว่า 1 รายการใช้แป้นดังกล่าว ระบบจะลองใช้แป้นพิมพ์ลัดตามลำดับการลงทะเบียนย้อนหลัง กล่าวคือ ระบบจะลองใช้แป้นพิมพ์ลัดที่ลงทะเบียนล่าสุดก่อน
เรียกใช้ฟังก์ชัน
preconditionFn
ของทางลัด ซึ่งจะพิจารณาว่าทางลัดใช้ได้กับสถานการณ์ปัจจุบันหรือไม่ ตัวอย่างเช่น ทางลัดการคัดลอก จะมีผลกับบล็อกแต่ไม่มีผลกับพื้นที่ทำงาน หากใช้แป้นพิมพ์ลัดไม่ได้ Blockly จะลองใช้แป้นพิมพ์ลัดถัดไปในรายการ หากมีเรียกใช้ฟังก์ชัน
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
อินเทอร์เฟซ ซึ่งมีพร็อพเพอร์ตี้ต่อไปนี้
name (ต้องระบุ)
ชื่อที่ไม่ซ้ำกันสำหรับทางลัด ซึ่งไม่ได้แสดงต่อผู้ใช้และไม่จำเป็นต้อง เป็นข้อความที่มนุษย์อ่านได้ ไม่ควรแปล
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 ทำสิ่งต่างๆ เช่น สร้างเมนูความช่วยเหลือตามบริบท
ที่แสดงแป้นพิมพ์ลัดที่ใช้ได้
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
จะเป็นตัวเลือก แต่โดยทั่วไปแล้วไม่มีเหตุผลที่จะไม่ใช้
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
// ...
};
Control และ Meta
ใน Windows แป้นพิมพ์ลัดหลายรายการจะเปิดใช้งานด้วยปุ่ม Control
ใน Mac แป้นพิมพ์ลัดเหล่านี้จะใช้ปุ่ม Command
แทน ซึ่งระบบจะจดจำเป็นรหัสแป้น META
หากต้องการรองรับทั้ง 2 ระบบปฏิบัติการ ให้ลงทะเบียนแป้นพิมพ์ลัดด้วยทั้งรหัสคีย์ 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 ใช้พร็อพเพอร์ตี้ keycode
ของ
KeyboardEvent
แม้ว่าจะเลิกใช้งานแล้วก็ตาม
allowCollision (ไม่บังคับ)
โดยค่าเริ่มต้น คุณจะลงทะเบียนแป้นพิมพ์ลัดสำหรับแป้นหรือชุดแป้นที่กดร่วมกันได้เพียงรายการเดียว การตั้งค่าพร็อพเพอร์ตี้นี้เป็น true
จะช่วยให้คุณลงทะเบียนแป้น (หรือชุดแป้นที่กดร่วมกัน) ได้แม้ว่าจะมีการลงทะเบียนแป้นพิมพ์ลัดที่มีแป้น (หรือชุดแป้นที่กดร่วมกัน) เดียวกันอยู่แล้วก็ตาม
โปรดทราบว่าพร็อพเพอร์ตี้นี้จะมีผลเมื่อพยายามลงทะเบียนแป้นพิมพ์ลัดนี้เท่านั้น
แต่จะไม่ป้องกันไม่ให้แป้นพิมพ์ลัดอื่นๆ ใช้แป้น (หรือชุดแป้น) เดียวกัน จะลงทะเบียนได้หรือไม่ขึ้นอยู่กับค่าของพร็อพเพอร์ตี้ allowCollision
ไม่ว่าจะลงทะเบียนแป้นพิมพ์ลัดกี่รายการสำหรับแป้นหรือชุดแป้นที่กำหนด ระบบจะดำเนินการได้สำเร็จเพียงรายการเดียวเท่านั้น ระบบจะลองใช้ทางลัดตามลำดับการลงทะเบียนย้อนหลัง (จากที่ลงทะเบียนล่าสุดไปจนถึงที่ลงทะเบียนครั้งแรก)
หลังจากฟังก์ชันใดฟังก์ชันหนึ่งส่งคืน true
จากการเรียกกลับแล้ว ระบบจะไม่ลองใช้แป้นพิมพ์ลัดอื่นๆ
ข้อมูลเมตา (ไม่บังคับ)
ซึ่งเป็นออบเจ็กต์ที่กำหนดเองซึ่งมีข้อมูลเพิ่มเติม โดยมีให้บริการ
แก่ callback
ผ่านพารามิเตอร์ shortcut
เพิ่ม ลบ และแก้ไขทางลัด
หากต้องการเพิ่มแป้นพิมพ์ลัดใหม่ ให้เรียกใช้
Blockly.ShortcutRegistry.registry.register
ดังนี้
Blockly.ShortcutRegistry.registry.register(logFieldsShortcut);
ฟังก์ชันนี้มีพารามิเตอร์ที่ 2 (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
ฟังก์ชัน
แป้นพิมพ์ลัดสำหรับการไปยังส่วนต่างๆ
ปลั๊กอินการไปยังส่วนต่างๆ ด้วยแป้นพิมพ์ มีแป้นพิมพ์ลัดที่ช่วยให้ผู้ใช้ไปยังส่วนต่างๆ ของ Blockly ด้วยแป้นพิมพ์ได้ เช่น การใช้ปุ่มลูกศร การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์เป็นสิ่งจำเป็นสำหรับผู้ใช้ที่ไม่สามารถใช้เมาส์ได้ เช่น ผู้ที่มีความบกพร่องทางการเคลื่อนไหวหรือความบกพร่องทางสายตา นอกจากนี้ ยังมีประโยชน์ สำหรับผู้ใช้ขั้นสูงที่อาจต้องการใช้แป้นพิมพ์ลัดเพื่อประสิทธิภาพด้วย