Tastenkombinationen

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:

  1. 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.

  2. 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.

  3. 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 Funktion true zurückgibt, wird die Verarbeitung beendet. Wenn false 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 aktuelle WorkspaceSvg.
  • e: Die Event, die die Verknüpfung initiiert hat.
  • shortcut: Das KeyboardShortcut selbst.
  • scope: Der Scope, 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.