Blockly verwaltet eine Registrierung von Tastenkombinationen, in der Tasten (oder Tastenkombinationen wie ctrl-C
) Aktionen zugeordnet werden. Die Registrierung ist mit einer Reihe von Tastenkombinationen vorab ausgefüllt, z. B. ctrl-C
und meta-C
für „Kopieren“. Sie können Verknüpfungen in der Registrierung hinzufügen und löschen.
So funktionieren Tastenkombinationen
Die Tastenkombinationsregistrierung enthält Objekte, die Tastenkombinationen modellieren. Wenn der Nutzer eine Taste (oder eine Tastenkombination) drückt, führt Blockly Folgendes aus:
Prüft die Registrierung, um festzustellen, ob für den Schlüssel Verknüpfungen gelten. Wenn mehrere Tastenkombinationen die Taste verwenden, werden die Tastenkombinationen in umgekehrter Reihenfolge der Registrierung ausprobiert. Das heißt, die zuletzt registrierte Tastenkombination wird zuerst ausprobiert.
Ruft die
preconditionFn
-Funktion des Kurzbefehls auf, die bestimmt, ob der Kurzbefehl auf die aktuelle Situation zutrifft. Die Tastenkombination zum Kopieren gilt beispielsweise für Blöcke, aber nicht für den Arbeitsbereich. Wenn die Tastenkombination nicht angewendet wird, versucht Blockly die nächste Tastenkombination in der Liste, sofern vorhanden.Ruft die
callback
-Funktion des Kurzbefehls auf, die die Aktion des Kurzbefehls ausführt. Mit dem Kopiershortcut wird beispielsweise eine Kopie des aktuell ausgewählten Objekts, z. B. eines Blocks, erstellt. Wenn diese Funktiontrue
zurückgibt, wird die Verarbeitung beendet. Wennfalse
zurückgegeben wird, versucht Blockly den nächsten Shortcut in der Liste, sofern vorhanden.
Umfang
Ein Scope
-Objekt gibt die Blockly-Komponente an, die derzeit den Fokus hat. Bereichsobjekte werden an preconditionFn
und callback
übergeben. Diese verwenden sie, um zu entscheiden, ob eine Tastenkombination für eine bestimmte Komponente gilt und, falls ja, wie sie angewendet werden soll.
Wenn Sie ein Scope
-Objekt verwenden möchten, verwenden Sie die zugehörige focusedNode
-Property. Dies ist ein Objekt, das IFocusableNode
implementiert. Diese Schnittstelle wird von allen Blockly-Komponenten implementiert, auf die der Nutzer den Fokus legen kann, einschließlich Arbeitsbereichen, Blöcken, Feldern, Kommentaren und Ihren eigenen benutzerdefinierten Komponenten. Weitere Informationen finden Sie unter Fokussierungssystem.
Beispiel: Ein preconditionFn
kann focusedNode
verwenden, um sicherzustellen, dass eine Tastenkombination nur für Blöcke gilt.
preconditionFn(workspace, scope) {
return (scope.focusedNode instanceof Blockly.BlockSvg);
}
Die „KeyboardShortcut“-Schnittstelle
Objekte in der Verknüpfungsregistrierung implementieren die KeyboardShortcut
-Schnittstelle. Es enthält die folgenden Attribute.
name (erforderlich)
Ein eindeutiger Name für die Verknüpfung. Diese wird Nutzern nicht angezeigt und muss nicht lesbar sein. Sollte nicht übersetzt werden.
const logFieldsShortcut = {
name: 'logFields',
// ...
};
preconditionFn (optional)
Blockly ruft diese Funktion auf, um zu entscheiden, ob ein Kurzbefehl auf die aktuelle Situation angewendet werden soll. Wenn true
zurückgegeben wird, ruft Blockly callback
auf. Wenn false
zurückgegeben wird, ignoriert Blockly diese Tastenkombination. Beispiel:
const logFieldsShortcut = {
// ...
preconditionFn(workspace, scope) {
// This shortcut only applies to blocks.
return (scope.focusedNode instanceof Blockly.BlockSvg);
},
// ...
};
Bei einer Tastenkombination kann diese Funktion ausgelassen werden, wenn die Tastenkombination immer angewendet wird (ungewöhnlich).
Kurzbefehle sollten diese Funktion nicht auslassen und dann bedingt in callback
Maßnahmen ergreifen. Dadurch wird verhindert, dass Blockly beispielsweise kontextbezogene Hilfemenüs mit anwendbaren Tastenkombinationen erstellt.
callback (optional)
Diese Funktion führt die mit der Tastenkombination verknüpfte Aktion aus. Sie wird nur aufgerufen, wenn preconditionFn
true
zurückgibt oder nicht vorhanden ist. Die Parameter sind:
workspace
: Die aktuelleWorkspaceSvg
.e
: DieEvent
, die die Verknüpfung initiiert hat.shortcut
: DasKeyboardShortcut
selbst.scope
: DerScope
, auf den sich die Verknüpfung bezieht.
Sie gibt true
zurück, wenn sie erfolgreich ist, und false
, wenn sie fehlschlägt.
Beispiel:
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
ist zwar optional, aber es gibt in der Regel keinen Grund, es nicht zu implementieren.
keyCodes (optional)
Ein Array von Tasten (oder Tastenkombinationen), die diese Tastenkombination aktivieren. Verwenden Sie zum Identifizieren von Tasten die Tastencodes in Blockly.utils.KeyCodes
.
Beispiel:
const logFieldsShortcut = {
// ...
keyCodes: [Blockly.utils.KeyCodes.L],
// ...
};
Wenn Sie einem vorhandenen Shortcut zusätzliche Tasten zuordnen möchten, z. B. einem Standard-Shortcut, können Sie Blockly.ShortcutRegistry.registry.addKeyMapping
aufrufen.
Das kommt nicht häufig vor.
Tastenkombinationen
Wenn Ihre Tastenkombination durch eine Kombination von Tasten aktiviert wird, z. B. durch gleichzeitiges Drücken von Control
und C
, erstellen Sie einen serialisierten Tastencode, indem Sie Blockly.ShortcutRegistry.registry.createSerializedKey
aufrufen:
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
// ...
};
Kontroll- und Meta-Variablen
Unter Windows werden viele Tastenkombinationen mit der Control
-Taste aktiviert. Auf einem Mac wird für diese Tastenkombinationen stattdessen die Command
-Taste verwendet, die als META
-Tastencode erkannt wird. Wenn Sie beide Betriebssysteme unterstützen möchten, registrieren Sie Ihre Tastenkürzel sowohl mit dem CTRL
- als auch mit dem META
-Tastencode.
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],
// ...
};
Hinweis zur Implementierung
Die Tastatur-Event-Handler von Blockly verwenden die keycode
-Eigenschaft von KeyboardEvent
, obwohl sie nicht mehr unterstützt wird.
allowCollision (optional)
Standardmäßig können Sie nur eine Tastenkombination für eine bestimmte Taste oder Tastenkombination registrieren. Wenn Sie diese Eigenschaft auf true
festlegen, können Sie einen Schlüssel (oder eine Tastenkombination) registrieren, auch wenn bereits eine Tastenkombination mit demselben Schlüssel (oder derselben Tastenkombination) registriert wurde.
Diese Property gilt nur, wenn Sie versuchen, diese Tastenkombination zu registrieren.
Es wird nicht verhindert, dass andere Tastenkombinationen denselben Schlüssel (oder dieselbe Tastenkombination) verwenden. Ob sie registriert werden können, hängt vom Wert ihrer allowCollision
-Property ab.
Unabhängig davon, wie viele Tastenkombinationen für eine bestimmte Taste oder Tastenkombination registriert sind, wird höchstens eine erfolgreich ausgeführt. Tastenkombinationen werden in umgekehrter Reihenfolge der Registrierung ausprobiert (von der zuletzt registrierten zur zuerst registrierten).
Nachdem einer der beiden true
aus seinem Callback zurückgegeben hat, werden keine anderen Verknüpfungen mehr ausprobiert.
Metadaten (optional)
Dies ist ein beliebiges Objekt mit zusätzlichen Informationen. Sie ist für callback
über den Parameter shortcut
verfügbar.
Tastenkombinationen hinzufügen, löschen und ändern
Wenn Sie eine neue Tastenkombination hinzufügen möchten, rufen Sie Blockly.ShortcutRegistry.registry.register
auf:
Blockly.ShortcutRegistry.registry.register(logFieldsShortcut);
Diese Funktion hat einen zweiten Parameter (allowOverrides
), mit dem Sie eine vorhandene Verknüpfung mit demselben Namen wie Ihre Verknüpfung ersetzen können. Das ist anders als bei KeyboardShortcut.allowCollision
, mit dem Sie eine Tastenkombination mit einem anderen Namen hinzufügen können, die aber denselben Schlüssel oder dieselbe Tastenkombination wie eine vorhandene Tastenkombination verwendet.
Wenn Sie eine Tastenkombination löschen möchten, rufen Sie Blockly.ShortcutRegistry.registry.unregister
auf und übergeben Sie den Namen der Tastenkombination:
Blockly.ShortcutRegistry.registry.unregister('logFields');
Tastenkombinationen können nicht direkt bearbeitet werden. Stattdessen müssen Sie die vorhandene Verknüpfung löschen und eine neue hinzufügen. Beispiel:
// 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);
Standardverknüpfungen
Die Verknüpfungsregistrierung ist mit einer Reihe von Verknüpfungen vorab ausgefüllt. Sie finden sie unter https://github.com/google/blockly/blob/master/core/shortcut_items.ts.
Die Shortcuts sind in den registerXxxx
-Funktionen definiert.
Tastenkombinationen für die Tastaturnavigation
Das Plugin für die Tastaturnavigation enthält Tastenkombinationen, mit denen Nutzer Blockly über die Tastatur bedienen können, z. B. mit den Pfeiltasten. Die Tastaturnavigation ist für Nutzer, die keine Maus verwenden können, z. B. Nutzer mit motorischen oder visuellen Einschränkungen, unerlässlich. Sie ist auch für Poweruser nützlich, die Tastenkombinationen verwenden möchten, um effizienter zu arbeiten.