diff --git a/README.md b/README.md index 3ef0a9d..7405c30 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,13 @@ Exported functions: ### `deck.menu` -A library for easy menu systems for T-DeckARD programs. Allows displaying up to 10 menu items with the ability to select them with a single digit or a key on the `QWERTYUIOP` keyboard row. +A library for easy menu systems for T-DeckARD programs. -Exports the only function, `menu(choices)`, which accepts a list of **tuples**, each in the format `(id, label)`. The `label` field is what's displayed on the screen, the `id` field is the string that gets returned upon selection. If the user selects `c`, the operation is canceled and an empty `id` string is returned. +Exported functions: + +- `confirm(msg, yes='y', no='n', alt_prompt=None)`: prompt for yes/no confirmation, using a standard prompt in `msg` and the `yes`/`no` message in the corresponding parameters, or a completely alternative prompt in `alt_prompt`.Returns True or False as the result. +- `shortmenu(choices, suffix=': ')`: display several menu items from the `choices` list, automatically labeling the first fitting letter from the item as the selection shortcut. Returns a tuple (`result`, `label`), or (``,``) in case the selection doesn't match. +- `menu(choices)`: display up to 10 menu items with the ability to select them with a single digit or a key on the `QWERTYUIOP` keyboard row. Accepts a list of **tuples**, each in the format `(id, label)`. The `label` field is what's displayed on the screen, the `id` field is the string that gets returned upon selection. If the user selects `c`, the operation is canceled and an empty `id` string is returned. ### `deck.time` diff --git a/deck/menu.py b/deck/menu.py index 5ed9f75..1542771 100644 --- a/deck/menu.py +++ b/deck/menu.py @@ -64,3 +64,28 @@ def menu(choices, max_size = 10): else: print('Invalid choice!') return menu(choices) + +def shortmenu(choices, suffix=': '): + letters = {} + cmap = [] + for c in choices: + l = '?' + cl = len(c) + i = 0 + while i < cl: + l = c[i].lower() + if l not in letters: + break + i += 1 + if i == 0: + letters[l] = (c, l + ')' + c[1:]) + cmap.append(letters[l][1]) + elif i < cl: + letters[l] = (c, c[0:i] + '(' + l + ')' + c[i+1:]) + cmap.append(letters[l][1]) + prompt = ' '.join(cmap) + suffix + res = input(prompt).strip()[0].lower() + if res in letters: + return (res, letters[res][0]) + else: + return ('', '') diff --git a/tdeckboot.py b/tdeckboot.py index 61fb516..f483e54 100644 --- a/tdeckboot.py +++ b/tdeckboot.py @@ -7,7 +7,7 @@ from deck.fs import unlock_rootfs, lock_rootfs, mount_sd, umount_sd, env, rnd from deck.fs import du, df, sep, pwd, ls, md, cd, rd, rm, mv, cp, sync from deck.input import input, input_multi from deck.pager import print_paged, term_size -from deck.menu import menu +from deck.menu import menu, shortmenu, confirm from deck.time import * from deck.hwinfo import board_id, battery_v, cpu_f, REAL_HW from deck.http import wget, wput, http_fetch, http_set_ua