Change to be an extension
This commit is contained in:
		| @@ -73,13 +73,6 @@ print(dir(board)) | ||||
| keyboard.keymap = [[KC.A, KC.B]] | ||||
| ``` | ||||
|  | ||||
| - You can also define the keymap with strings. They get replaced with `Key` objects | ||||
|   when the keyboard is started: | ||||
|  | ||||
| ```python | ||||
| keyboard.keymap = [['A', 'B']] | ||||
| ``` | ||||
|  | ||||
| You can further define a bunch of other stuff: | ||||
|  | ||||
| - `keyboard.debug_enabled` which will spew a ton of debugging information to the serial | ||||
|   | ||||
							
								
								
									
										29
									
								
								docs/extension_keymap_string_keynames.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								docs/extension_keymap_string_keynames.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| # Keymap String KeyNames | ||||
|  | ||||
| Enables referring to keys by 'NAME' rather than KC.NAME. | ||||
|  | ||||
| For example: | ||||
|  | ||||
| ```python | ||||
| from kmk.extensions.keymap_string_keynames import keymap_string_keynames | ||||
|  | ||||
| # Normal | ||||
| # keyboard.keymap = [[ KC.A, KC.B, KC.RESET ]] | ||||
|  | ||||
| # Indexed | ||||
| # keyboard.keymap = [[ KC['A'], KC['B'], KC['RESET'] ]] | ||||
|  | ||||
| # String names | ||||
| keyboard.keymap = [[ 'A' , 'B', 'RESET' ]] | ||||
|  | ||||
| keymap_string_keynames = keymap_string_keynames() | ||||
|  | ||||
| # Enabling debug will show each replacement or failure. | ||||
| # This is recommended during the initial development of a keyboard. | ||||
| # keymap_string_keynames.debug_enable = True | ||||
|  | ||||
| keyboard.extensions.append(keymap_string_keynames) | ||||
| ``` | ||||
|  | ||||
| It should be noted that these are **not** ASCII. The string is **not** what | ||||
| will be sent to the computer. The examples above have no functional difference. | ||||
| @@ -1,9 +1,11 @@ | ||||
| # Extensions | ||||
|  | ||||
| Extensions add features that change the experience, but not the core features of | ||||
| the keyboard. They are meant to be easy to add, and create your own. These live in | ||||
| a sandbox to help prevent any bad code from crashing your keyboard. | ||||
|  | ||||
| ## Core Extensions | ||||
|  | ||||
| These extensions are provided in all builds and can be enabled. Currently offered | ||||
| extensions are | ||||
|  | ||||
| @@ -14,3 +16,4 @@ extensions are | ||||
| - [RGB](rgb.md): RGB lighting for underglow. Will work on most matrix RGB as will | ||||
|   be treated the same as underglow. | ||||
| - [Status LED](extension_statusled.md): Indicates which layer you are on with an array of single leds. | ||||
| - [KeyMap String KeyNames](extension_keymap_string_keynames): Enables referring to keys by 'NAME' rather than KC.NAME | ||||
|   | ||||
| @@ -19,8 +19,8 @@ mergulhar! | ||||
|   ter problemas de corrupção. ou você pode estar em um dia ruim e apagar o | ||||
|   arquivo errado. | ||||
|  | ||||
| - Atribuir uma instância `KMKKeyboard` a uma variável, por exemplo, | ||||
|   `keyboard = KMKKeyboard()` (note os parênteses). | ||||
| - Atribuir uma instância `KMKKeyboard` a uma variável, por exemplo, `keyboard = | ||||
|   KMKKeyboard()` (note os parênteses). | ||||
|  | ||||
| - Certificar-se quie esta instância de `KMKKeyboard` é realmente executada ao | ||||
| fim do arquivo usando um bloco como este: | ||||
| @@ -75,13 +75,6 @@ print(dir(board)) | ||||
| keyboard.keymap = [[KC.A, KC.B]] | ||||
| ``` | ||||
|  | ||||
| - Você também pode definir o mapa de teclas com strings. Eles são substituídos por | ||||
|   `Key` objetos quando o teclado é iniciado: | ||||
|  | ||||
| ```python | ||||
| keyboard.keymap = [['A', 'B']] | ||||
| ``` | ||||
|  | ||||
| Você pode definir um monte de outras coisas | ||||
|  | ||||
| - `keyboard.debug_enabled` que vai atirar um monte de informação de depuração | ||||
|   | ||||
							
								
								
									
										46
									
								
								kmk/extensions/keymap_string_keynames.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								kmk/extensions/keymap_string_keynames.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| from kmk.extensions import Extension | ||||
| from kmk.keys import KC | ||||
|  | ||||
|  | ||||
| class keymap_string_keynames(Extension): | ||||
|     ##### | ||||
|     # User-configurable | ||||
|     debug_enabled = False | ||||
|  | ||||
|     def on_runtime_enable(self, keyboard): | ||||
|         return | ||||
|  | ||||
|     def on_runtime_disable(self, keyboard): | ||||
|         return | ||||
|  | ||||
|     def during_bootup(self, keyboard): | ||||
|         for _, layer in enumerate(keyboard.keymap): | ||||
|             for key_idx, key in enumerate(layer): | ||||
|                 if isinstance(key, str): | ||||
|                     try: | ||||
|                         replacement = KC[key] | ||||
|                         layer[key_idx] = replacement | ||||
|                         if self.debug_enabled: | ||||
|                             print(f"Replacing '{key}' with {replacement}") | ||||
|                     except KeyError: | ||||
|                         layer[key_idx] = KC.NO | ||||
|                         if self.debug_enabled: | ||||
|                             print(f"Failed replacing '{key}'. Using KC.NO") | ||||
|  | ||||
|     def before_matrix_scan(self, keyboard): | ||||
|         return | ||||
|  | ||||
|     def after_matrix_scan(self, keyboard): | ||||
|         return | ||||
|  | ||||
|     def before_hid_send(self, keyboard): | ||||
|         return | ||||
|  | ||||
|     def after_hid_send(self, keyboard): | ||||
|         return | ||||
|  | ||||
|     def on_powersave_enable(self, keyboard): | ||||
|         return | ||||
|  | ||||
|     def on_powersave_disable(self, keyboard): | ||||
|         return | ||||
| @@ -293,15 +293,6 @@ class KMKKeyboard: | ||||
|                 cm.extend(m.coord_mapping) | ||||
|             self.coord_mapping = tuple(cm) | ||||
|  | ||||
|     def _init_replace_strings_in_keymap_with_keys(self): | ||||
|         for _, layer in enumerate(self.keymap): | ||||
|             for key_idx, key in enumerate(layer): | ||||
|                 if isinstance(key, str): | ||||
|                     replacement = KC[key] | ||||
|                     layer[key_idx] = replacement | ||||
|                     if self.debug_enabled: | ||||
|                         print(f"Replacing '{key}' with {replacement}") | ||||
|  | ||||
|     def _init_hid(self): | ||||
|         if self.hid_type == HIDModes.NOOP: | ||||
|             self._hid_helper = AbstractHID | ||||
| @@ -484,7 +475,6 @@ class KMKKeyboard: | ||||
|         self._init_sanity_check() | ||||
|         self._init_hid() | ||||
|         self._init_matrix() | ||||
|         self._init_replace_strings_in_keymap_with_keys() | ||||
|         self._init_coord_mapping() | ||||
|  | ||||
|         for module in self.modules: | ||||
|   | ||||
| @@ -16,7 +16,12 @@ class DigitalInOut(Mock): | ||||
|  | ||||
| class KeyboardTest: | ||||
|     def __init__( | ||||
|         self, modules, keymap, keyboard_debug_enabled=False, debug_enabled=False | ||||
|         self, | ||||
|         modules, | ||||
|         keymap, | ||||
|         keyboard_debug_enabled=False, | ||||
|         debug_enabled=False, | ||||
|         extensions={}, | ||||
|     ): | ||||
|         self.debug_enabled = debug_enabled | ||||
|  | ||||
| @@ -24,6 +29,7 @@ class KeyboardTest: | ||||
|         self.keyboard.debug_enabled = keyboard_debug_enabled | ||||
|  | ||||
|         self.keyboard.modules = modules | ||||
|         self.keyboard.extensions = extensions | ||||
|  | ||||
|         self.pins = tuple(DigitalInOut() for k in keymap[0]) | ||||
|  | ||||
|   | ||||
							
								
								
									
										25
									
								
								tests/test_kmk_extension_keymap_string_keynames.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								tests/test_kmk_extension_keymap_string_keynames.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| import unittest | ||||
|  | ||||
| from kmk.extensions.keymap_string_keynames import keymap_string_keynames | ||||
| from kmk.keys import KC | ||||
| from tests.keyboard_test import KeyboardTest | ||||
|  | ||||
|  | ||||
| class Test_extension_keymap_string_keynames(unittest.TestCase): | ||||
|     def test_basic_kmk_keyboard_replace_string_primary_name(self): | ||||
|         keyboard = KeyboardTest( | ||||
|             [], [['1', '2', '3', '4']], extensions={keymap_string_keynames()} | ||||
|         ) | ||||
|  | ||||
|         keyboard.test('Simple key press', [(0, True), (0, False)], [{KC.N1}, {}]) | ||||
|  | ||||
|     def test_basic_kmk_keyboard_replace_string_secondary_name(self): | ||||
|         keyboard = KeyboardTest( | ||||
|             [], [['N1', 'N2', 'N3', 'N4']], extensions={keymap_string_keynames()} | ||||
|         ) | ||||
|  | ||||
|         keyboard.test('Simple key press', [(0, True), (0, False)], [{KC.N1}, {}]) | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     unittest.main() | ||||
| @@ -10,20 +10,6 @@ class TestKmkKeyboard(unittest.TestCase): | ||||
|  | ||||
|         keyboard.test('Simple key press', [(0, True), (0, False)], [{KC.N1}, {}]) | ||||
|  | ||||
|     def test_basic_kmk_keyboard_replace_string_primary_name(self): | ||||
|         keyboard = KeyboardTest([], [['1', '2', '3', '4']]) | ||||
|  | ||||
|         keyboard.test('Simple key press', [(0, True), (0, False)], [{KC.N1}, {}]) | ||||
|  | ||||
|     def test_basic_kmk_keyboard_replace_string_secondary_name(self): | ||||
|         keyboard = KeyboardTest([], [['N1', 'N2', 'N3', 'N4']]) | ||||
|  | ||||
|         keyboard.test('Simple key press', [(0, True), (0, False)], [{KC.N1}, {}]) | ||||
|  | ||||
|     def test_basic_kmk_keyboard_unknown_replacement_string(self): | ||||
|         with self.assertRaises(ValueError): | ||||
|             KeyboardTest([], [['UNKNOWN1', 'UNKNOWN2', 'UNKNOWN3', 'UNKNOWN4']]) | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     unittest.main() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user