Klavye kısayolları

Blockly, tuşları (veya ctrl-C gibi tuş kombinasyonlarını) işlemlere eşleyen klavye kısayollarının bir kaydını tutar. Kayıt defterinde, kopyalama için ctrl-C ve meta-C gibi bir dizi kısayol önceden doldurulmuştur. Kayıt defterine kısayol ekleyebilir ve kayıt defterinden kısayol silebilirsiniz.

Klavye kısayolları nasıl çalışır?

Kısayol kayıt defteri, klavye kısayollarını modelleyen nesneler içerir. Kullanıcı bir tuşa (veya tuş kombinasyonuna) bastığında Blockly:

  1. Kayıt defterini kontrol ederek anahtara uygulanan kısayollar olup olmadığını belirler. Tuşu birden fazla kısayol kullanıyorsa kısayollar, kayıt sırasının tersine göre denenir. Yani en son kaydedilen kısayol önce denenir.

  2. Kısayolun preconditionFn işlevini çağırır. Bu işlev, kısayolun mevcut durum için geçerli olup olmadığını belirler. Örneğin, kopyalama kısayolu bloklar için geçerlidir ancak çalışma alanı için geçerli değildir. Kısayol uygulanmazsa Blockly, listedeki bir sonraki kısayolu (varsa) dener.

  3. Kısayolun callback işlevini çağırır. Bu işlev, kısayolun işlemini yürütür. Örneğin, kopyalama kısayolu, şu anda odaklanılmış nesnenin (ör. bir blok) kopyasını oluşturur. Bu işlev true değerini döndürürse işleme durdurulur. false döndürülürse Blockly, listede varsa bir sonraki kısayolu dener.

Kapsam

A Scope nesnesi, şu anda odaklanılan Blockly bileşenini tanımlar. Kapsam nesneleri, preconditionFn ve callback'ye iletilir. Bu nesneler, kısayolun belirli bir bileşen için geçerli olup olmadığına ve geçerliyse nasıl uygulanacağına karar vermek için kullanılır.

Scope nesnesini kullanmak için focusedNode özelliğini kullanın. Bu, IFocusableNode öğesini uygulayan bir nesnedir. Bu arayüz, kullanıcının odaklanabileceği tüm Blockly bileşenleri (çalışma alanları, bloklar, alanlar, yorumlar ve kendi özel bileşenleriniz dahil) tarafından uygulanır. Daha fazla bilgi için Odaklanma sistemi başlıklı makaleyi inceleyin.

Örneğin, bir preconditionFn, focusedNode kullanarak bir kısayolun yalnızca bloklar için geçerli olmasını sağlayabilir.

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

KeyboardShortcut arayüzü

Kısayol kayıt defterindeki nesneler, KeyboardShortcut arayüzünü uygular. Bu özellikler şunlardır:

name (zorunlu)

Kısayol için benzersiz bir ad. Bu, kullanıcılara gösterilmez ve okunabilir olması gerekmez. Çevrilmemelidir.

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

preconditionFn (isteğe bağlı)

Blockly, bir kısayolun geçerli duruma uygulanıp uygulanmayacağına karar vermek için bu işlevi çağırır. true döndürürse Blockly, callback çağrısı yapar. false döndürürse Blockly bu kısayolu yoksayar. Örneğin:

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

Kısayol her zaman geçerliyse bu işlev atlanabilir (yaygın değildir). Kısayollar bu işlevi atlamamalı ve ardından callback içinde koşullu olarak işlem yapmamalıdır. Bu işlem, Blockly'nin bağlama uygun kısayolları gösteren bağlamsal yardım menüleri oluşturması gibi işlemleri yapmasını engeller.

callback (isteğe bağlı)

Bu işlev, kısayolla ilişkili işlemi yürütür. Yalnızca preconditionFn, true değerini döndürürse veya mevcut değilse çağrılır. Parametreleri şunlardır:

  • workspace: Mevcut WorkspaceSvg.
  • e: Kısayolu başlatan Event.
  • shortcut: KeyboardShortcut öğesinin kendisi.
  • scope: Kısayolun uygulandığı Scope.

İşlem başarılı olursa true, başarısız olursa false değerini döndürür.

Örneğin:

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 isteğe bağlı olsa da genellikle uygulanmaması için bir neden yoktur.

keyCodes (isteğe bağlı)

Bu kısayolu etkinleştiren bir tuş dizisi (veya tuş kombinasyonları). Tuşları tanımlamak için Blockly.utils.KeyCodes'daki tuş kodlarını kullanın. Örneğin:

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

Mevcut bir kısayola ek tuşlar eşlemek istiyorsanız (ör. varsayılan bir kısayola tuş eklemek istiyorsanız) Blockly.ShortcutRegistry.registry.addKeyMapping işlevini çağırabilirsiniz. Bu durum yaygın değildir.

Tuş kombinasyonları

Klavye kısayolunuz, Control ve C tuşlarını aynı anda basılı tutmak gibi bir tuş kombinasyonuyla etkinleştiriliyorsa Blockly.ShortcutRegistry.registry.createSerializedKey işlevini çağırarak sıralı bir tuş kodu oluşturun:

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 ve Meta

Windows'da birçok kısayol Control tuşuyla etkinleştirilir. Mac'te bu klavye kısayollarında Command tuşu yerine META tuş kodu olarak tanınan Command tuşu kullanılır. Her iki işletim sistemini de desteklemek için kısayollarınızı hem CTRL tuş kodu hem de META tuş koduyla kaydedin.

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],
  // ...
};

Uygulamayla ilgili not

Blockly'nin klavye etkinliği işleyicileri, desteği sonlandırılmış olmasına rağmen keycode özelliğini KeyboardEvent kullanır.

allowCollision (isteğe bağlı)

Varsayılan olarak, belirli bir tuş veya tuş kombinasyonu için yalnızca bir kısayol kaydedebilirsiniz. Bu özelliği true olarak ayarladığınızda, aynı tuş (veya tuş kombinasyonu) ile kısayol daha önce kaydedilmiş olsa bile tuş (veya tuş kombinasyonu) kaydedebilirsiniz.

Bu özelliğin yalnızca bu kısayolu kaydetmeye çalışırken geçerli olduğunu unutmayın. Diğer kısayolların aynı tuşu (veya tuş kombinasyonunu) kullanmasını engellemez. Kaydedilip kaydedilemeyecekleri, allowCollision özelliğinin değerine bağlıdır.

Belirli bir tuş veya tuş kombinasyonu için kaç kısayol kaydedilmiş olursa olsun, en fazla biri başarıyla yürütülür. Kısayollar, kayıt sırasının tersine göre (son kaydedilenden ilk kaydedilene doğru) denenir. Bunlardan biri geri çağırmadan true döndükten sonra başka kısayollar denenmez.

meta veriler (isteğe bağlı)

Bu, ek bilgiler içeren rastgele bir nesnedir. shortcut parametresi aracılığıyla callback için kullanılabilir.

Kısayol ekleme, silme ve değiştirme

Yeni bir klavye kısayolu eklemek için Blockly.ShortcutRegistry.registry.register işlevini çağırın:

Blockly.ShortcutRegistry.registry.register(logFieldsShortcut);

Bu işlevde, mevcut bir kısayolu kısayolunuzla aynı ada sahip bir kısayolla değiştirmenize olanak tanıyan ikinci bir parametre (allowOverrides) bulunur. Bu özelliğin, farklı bir adla kısayol eklemenize olanak tanıyan ancak mevcut bir kısayolla aynı tuşu veya tuş kombinasyonunu kullanan KeyboardShortcut.allowCollision özelliğinden farklı olduğunu unutmayın.

Klavye kısayolunu silmek için Blockly.ShortcutRegistry.registry.unregister işlevini çağırın ve kısayolun adını iletin:

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

Klavye kısayollarını yerinde değiştiremezsiniz. Bunun yerine mevcut kısayolu silip yeni bir kısayol eklemeniz gerekir. Örneğin:

// 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);

Varsayılan kısayollar

Kısayol kayıt defteri, çeşitli kısayollarla önceden doldurulur. Bunları https://github.com/google/blockly/blob/master/core/shortcut_items.ts adresinde bulabilirsiniz. Kısayollar, registerXxxx işlevlerinde tanımlanır.

Klavye ile gezinme kısayolları

Klavyeyle gezinme eklentisi, kullanıcıların Blockly'de klavyeyle (ör. ok tuşlarını kullanarak) gezinmesine olanak tanıyan kısayollar içerir. Klavye ile gezinme, fare kullanamayan (ör. hareket veya görme engelli) kullanıcılar için çok önemlidir. Ayrıca, verimlilik için klavye kısayollarını kullanmak isteyen ileri düzey kullanıcılar için de faydalıdır.