summaryrefslogtreecommitdiff
path: root/lib/python
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python')
-rwxr-xr-xlib/python/qmk/cli/new/keymap.py56
1 files changed, 55 insertions, 1 deletions
diff --git a/lib/python/qmk/cli/new/keymap.py b/lib/python/qmk/cli/new/keymap.py
index 8b7160f5f2..16865ceb00 100755
--- a/lib/python/qmk/cli/new/keymap.py
+++ b/lib/python/qmk/cli/new/keymap.py
@@ -1,10 +1,12 @@
1"""This script automates the copying of the default keymap into your own keymap. 1"""This script automates the copying of the default keymap into your own keymap.
2""" 2"""
3import re 3import re
4import json
4import shutil 5import shutil
6from pathlib import Path
5 7
6from milc import cli 8from milc import cli
7from milc.questions import question 9from milc.questions import question, choice
8 10
9from qmk.constants import HAS_QMK_USERSPACE, QMK_USERSPACE 11from qmk.constants import HAS_QMK_USERSPACE, QMK_USERSPACE
10from qmk.path import is_keyboard, keymaps, keymap 12from qmk.path import is_keyboard, keymaps, keymap
@@ -12,6 +14,34 @@ from qmk.git import git_get_username
12from qmk.decorators import automagic_keyboard, automagic_keymap 14from qmk.decorators import automagic_keyboard, automagic_keymap
13from qmk.keyboard import keyboard_completer, keyboard_folder 15from qmk.keyboard import keyboard_completer, keyboard_folder
14from qmk.userspace import UserspaceDefs 16from qmk.userspace import UserspaceDefs
17from qmk.json_schema import json_load
18from qmk.json_encoders import KeymapJSONEncoder
19from qmk.info import info_json
20
21
22def _list_available_converters(kb_name):
23 """Search for converters that can be applied to a given keyboard
24 """
25 if not is_keyboard(kb_name):
26 return None
27
28 info = info_json(kb_name)
29 pin_compatible = info.get('pin_compatible')
30 if not pin_compatible:
31 return None
32
33 return sorted(folder.name.split('_to_')[-1] for folder in Path('platforms').glob(f'*/converters/{pin_compatible}_to_*'))
34
35
36def _set_converter(file, converter):
37 """add/overwrite any existing converter specified in keymap.json
38 """
39 json_data = json_load(file) if file.exists() else {}
40
41 json_data['converter'] = converter
42
43 output = json.dumps(json_data, cls=KeymapJSONEncoder, sort_keys=True)
44 file.write_text(output + '\n', encoding='utf-8')
15 45
16 46
17def validate_keymap_name(name): 47def validate_keymap_name(name):
@@ -37,8 +67,28 @@ Keymap name? """
37 return question(prompt, default=git_get_username()) 67 return question(prompt, default=git_get_username())
38 68
39 69
70def prompt_converter(kb_name):
71 prompt = """
72{fg_yellow}Configure Development Board{style_reset_all}
73For more information, see:
74https://docs.qmk.fm/feature_converters
75
76Use converter? """
77
78 converters = _list_available_converters(kb_name)
79 if not converters:
80 return None
81
82 choices = ['No (default)', *converters]
83
84 answer = choice(prompt, options=choices, default=0)
85 return None if choices.index(answer) == 0 else answer
86
87
40@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Specify keyboard name. Example: 1upkeyboards/1up60hse') 88@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Specify keyboard name. Example: 1upkeyboards/1up60hse')
41@cli.argument('-km', '--keymap', help='Specify the name for the new keymap directory') 89@cli.argument('-km', '--keymap', help='Specify the name for the new keymap directory')
90@cli.argument('--converter', help='Specify the name of a converter to configure')
91@cli.argument('--skip-converter', arg_only=True, action='store_true', help='Skip converter')
42@cli.subcommand('Creates a new keymap for the keyboard of your choosing') 92@cli.subcommand('Creates a new keymap for the keyboard of your choosing')
43@automagic_keyboard 93@automagic_keyboard
44@automagic_keymap 94@automagic_keymap
@@ -51,6 +101,7 @@ def new_keymap(cli):
51 # ask for user input if keyboard or keymap was not provided in the command line 101 # ask for user input if keyboard or keymap was not provided in the command line
52 kb_name = cli.config.new_keymap.keyboard if cli.config.new_keymap.keyboard else prompt_keyboard() 102 kb_name = cli.config.new_keymap.keyboard if cli.config.new_keymap.keyboard else prompt_keyboard()
53 user_name = cli.config.new_keymap.keymap if cli.config.new_keymap.keymap else prompt_user() 103 user_name = cli.config.new_keymap.keymap if cli.config.new_keymap.keymap else prompt_user()
104 converter = cli.config.new_keymap.converter if cli.args.skip_converter or cli.config.new_keymap.converter else prompt_converter(kb_name)
54 105
55 # check directories 106 # check directories
56 if not is_keyboard(kb_name): 107 if not is_keyboard(kb_name):
@@ -77,6 +128,9 @@ def new_keymap(cli):
77 # create user directory with default keymap files 128 # create user directory with default keymap files
78 shutil.copytree(keymap_path_default, keymap_path_new, symlinks=True) 129 shutil.copytree(keymap_path_default, keymap_path_new, symlinks=True)
79 130
131 if converter:
132 _set_converter(keymap_path_new / 'keymap.json', converter)
133
80 # end message to user 134 # end message to user
81 cli.log.info(f'{{fg_green}}Created a new keymap called {{fg_cyan}}{user_name}{{fg_green}} in: {{fg_cyan}}{keymap_path_new}.{{fg_reset}}') 135 cli.log.info(f'{{fg_green}}Created a new keymap called {{fg_cyan}}{user_name}{{fg_green}} in: {{fg_cyan}}{keymap_path_new}.{{fg_reset}}')
82 cli.log.info(f"Compile a firmware with your new keymap by typing: {{fg_yellow}}qmk compile -kb {kb_name} -km {user_name}{{fg_reset}}.") 136 cli.log.info(f"Compile a firmware with your new keymap by typing: {{fg_yellow}}qmk compile -kb {kb_name} -km {user_name}{{fg_reset}}.")