Skip to content

Commit

Permalink
feat: added ability to quit early (#126)
Browse files Browse the repository at this point in the history
Co-authored-by: AN Long <aisk@users.noreply.github.com>
  • Loading branch information
Henri-ColibrITD and aisk committed Jun 27, 2024
1 parent c933aa0 commit 9178897
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 5 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,10 @@ interactive selection list in the terminal.
multiple items by hitting SPACE
- `min_selection_count`: (optional) for multi select feature to
dictate a minimum of selected items before continuing
- `screen`: (optional), if you are using `pick` within an existing curses application set this to your existing `screen` object. It is assumed this has initialised in the standard way (e.g. via `curses.wrapper()`, or `curses.noecho(); curses.cbreak(); screen.kepad(True)`)
- `screen`: (optional), if you are using `pick` within an existing curses application set this to your existing `screen` object. It is assumed this has initialised in the standard way (e.g. via `curses.wrapper()`, or `curses.noecho(); curses.cbreak(); screen.kepad(True)`)
- `position`: (optional), if you are using `pick` within an existing curses application use this to set the first position to write to. e.g., `position=pick.Position(y=1, x=1)`
- `quit_keys`: (optional), if you want to quit early, you can pass a key codes.
If the corresponding key are pressed, it will quit the menu.

## Community Projects

Expand Down
8 changes: 7 additions & 1 deletion example/basic.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
from pick import pick

KEY_CTRL_C = 3
KEY_ESCAPE = 27
QUIT_KEYS = (KEY_CTRL_C, KEY_ESCAPE, ord("q"))

title = "Please choose your favorite programming language: "
options = ["Java", "JavaScript", "Python", "PHP", "C++", "Erlang", "Haskell"]
option, index = pick(options, title, indicator="=>", default_index=2)
option, index = pick(
options, title, indicator="=>", default_index=2, quit_keys=QUIT_KEYS
)
print(f"You chose {option} at index {index}")
14 changes: 11 additions & 3 deletions src/pick/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import textwrap
from collections import namedtuple
from dataclasses import dataclass, field
from typing import Any, Generic, List, Optional, Sequence, Tuple, TypeVar, Union
from typing import Any, Container, Generic, Iterable, List, Optional, Sequence, Tuple, TypeVar, Union

__all__ = ["Picker", "pick", "Option"]

Expand Down Expand Up @@ -40,6 +40,7 @@ class Picker(Generic[OPTION_T]):
screen: Optional["curses._CursesWindow"] = None
position: Position = Position(0, 0)
clear_screen: bool = True
quit_keys: Optional[Union[Container[int], Iterable[int]]] = None

def __post_init__(self) -> None:
if len(self.options) == 0:
Expand Down Expand Up @@ -166,7 +167,12 @@ def run_loop(
while True:
self.draw(screen)
c = screen.getch()
if c in KEYS_UP:
if self.quit_keys is not None and c in self.quit_keys:
if self.multiselect:
return []
else:
return None, -1
elif c in KEYS_UP:
self.move_up()
elif c in KEYS_DOWN:
self.move_down()
Expand Down Expand Up @@ -215,7 +221,8 @@ def pick(
min_selection_count: int = 0,
screen: Optional["curses._CursesWindow"] = None,
position: Position = Position(0, 0),
clear_screen = True,
clear_screen: bool = True,
quit_keys: Optional[Union[Container[int], Iterable[int]]] = None,
):
picker: Picker = Picker(
options,
Expand All @@ -227,5 +234,6 @@ def pick(
screen,
position,
clear_screen,
quit_keys,
)
return picker.start()

0 comments on commit 9178897

Please sign in to comment.