listpick 0.1.14.10__tar.gz → 0.1.14.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of listpick might be problematic. Click here for more details.
- {listpick-0.1.14.10 → listpick-0.1.14.11}/CHANGELOG.md +2 -0
- {listpick-0.1.14.10/src/listpick.egg-info → listpick-0.1.14.11}/PKG-INFO +1 -1
- {listpick-0.1.14.10 → listpick-0.1.14.11}/TODO.md +3 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/setup.py +1 -1
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/listpick_app.py +0 -5
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/ui/build_help.py +63 -28
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/ui/footer.py +3 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11/src/listpick.egg-info}/PKG-INFO +1 -1
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick.egg-info/SOURCES.txt +0 -1
- listpick-0.1.14.10/src/listpick/ui/git-bugreport-2025-08-16-1438.txt +0 -37
- {listpick-0.1.14.10 → listpick-0.1.14.11}/.gitignore +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/LICENSE.txt +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/README.md +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/assets/aria2tui_screenshot.png +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/assets/file_compare.png +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/assets/lpfman.png +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/data_generation/list_files.toml +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/data_generation/list_files_empty.toml +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/data_generation/video_duplicates.toml +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/data_generation/video_mediainfo.toml +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/input_files/polynomials.tsv +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/input_guides/gnuplot_graph.md +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/picker/auxiallary_files/2024-25_Premier_League.pkl +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/picker/footer_string_example.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/picker/picker_example.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/picker/template.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/examples/picker/wikipedia_table.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/listpick.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/requirements.txt +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/setup.cfg +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/__init__.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/__main__.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/ui/__init__.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/ui/help_screen.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/ui/input_field.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/ui/keys.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/ui/pane_stuff.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/ui/picker_colours.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/__init__.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/clipboard_operations.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/config.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/dump.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/filtering.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/generate_data.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/keycodes.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/options_selectors.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/paste_operations.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/picker_log.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/search_and_filter_utils.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/searching.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/sorting.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/table_to_list_of_lists.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/user_input.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick/utils/utils.py +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick.egg-info/dependency_links.txt +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick.egg-info/entry_points.txt +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick.egg-info/requires.txt +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/src/listpick.egg-info/top_level.txt +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/tests/kitty_control.sh +0 -0
- {listpick-0.1.14.10 → listpick-0.1.14.11}/tests/sorting_dates.csv +0 -0
|
@@ -16,6 +16,7 @@ Note that the changes between 0.1.11.0 and 1.1.12.0 are listed under 0.1.11
|
|
|
16
16
|
- Closing files causes issues switching between files.
|
|
17
17
|
- Fixed crash when loading non-existent config file.
|
|
18
18
|
- Fixed highlighted cell not being aligned in the way that we expect.
|
|
19
|
+
- Fixed search query covering last row of data.
|
|
19
20
|
- Create ~/.config/listpick directory for storing input history if it doesn't already exist.
|
|
20
21
|
- Added error checking when opening files.
|
|
21
22
|
- Added --headerless flag to prevent interpreting the first line of the input as the header.
|
|
@@ -27,6 +28,7 @@ Note that the changes between 0.1.11.0 and 1.1.12.0 are listed under 0.1.11
|
|
|
27
28
|
- Ensured that main picker elements resize if the terminal is resized when other dialogues are in focus: notifications, options, settings.
|
|
28
29
|
- Added method to check for terminal resize.
|
|
29
30
|
- Was necessary since we are no longer using getch from curses so we can't test whether getch() == curses.KEY_RESIZE.
|
|
31
|
+
- Added Alt+keys in build_help.
|
|
30
32
|
|
|
31
33
|
## [0.1.14] 2025-08-20
|
|
32
34
|
- Fixed bug when cells are centred vertically.
|
|
@@ -21,6 +21,7 @@ ASAP
|
|
|
21
21
|
> - [x] Delete, shift+delete
|
|
22
22
|
> - [x] Alt+KEY
|
|
23
23
|
> - [x] Arrow keys
|
|
24
|
+
> - [x] Add new keycodes to build_help().
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
|
|
@@ -369,6 +370,8 @@ ASAP
|
|
|
369
370
|
> - [x] Some can't be switched to...
|
|
370
371
|
> - [x] Fixed.
|
|
371
372
|
> - [x] Highlighted cells display padded cell string when it should not be padded.
|
|
373
|
+
> - [x] When there is an active search it overlaps the last row.
|
|
374
|
+
> - [x] Update footer height when there is a search query.
|
|
372
375
|
|
|
373
376
|
|
|
374
377
|
|
|
@@ -16,7 +16,7 @@ with open("README.md", "r", encoding = "utf-8") as fh:
|
|
|
16
16
|
|
|
17
17
|
setuptools.setup(
|
|
18
18
|
name = "listpick",
|
|
19
|
-
version = "0.1.14.
|
|
19
|
+
version = "0.1.14.11",
|
|
20
20
|
author = "Grim",
|
|
21
21
|
author_email = "grimandgreedy@protonmail.com",
|
|
22
22
|
description = "Listpick is a powerful TUI data tool for creating TUI apps or viewing/comparing tabulated data.",
|
|
@@ -188,7 +188,6 @@ class Picker:
|
|
|
188
188
|
sheet_index = 0,
|
|
189
189
|
sheet_states = [{}],
|
|
190
190
|
|
|
191
|
-
redraw_screen_accessory: Callable = lambda : None,
|
|
192
191
|
|
|
193
192
|
):
|
|
194
193
|
self.stdscr = stdscr
|
|
@@ -338,7 +337,6 @@ class Picker:
|
|
|
338
337
|
self.sheet_states = sheet_states
|
|
339
338
|
self.sheets = sheets
|
|
340
339
|
|
|
341
|
-
self.redraw_screen_accessory = redraw_screen_accessory
|
|
342
340
|
self.initialise_picker_state(reset_colours=self.reset_colours)
|
|
343
341
|
|
|
344
342
|
# Note: We have to set the footer after initialising the picker state so that the footer can use the get_function_data method
|
|
@@ -752,7 +750,6 @@ class Picker:
|
|
|
752
750
|
def draw_screen_(self, indexed_items: list[Tuple[int, list[str]]], highlights: list[dict] = [{}], clear: bool = True) -> None:
|
|
753
751
|
""" Draw Picker screen. """
|
|
754
752
|
|
|
755
|
-
self.redraw_screen_accessory()
|
|
756
753
|
self.logger.debug("Draw screen.")
|
|
757
754
|
|
|
758
755
|
if clear:
|
|
@@ -1242,7 +1239,6 @@ class Picker:
|
|
|
1242
1239
|
"sheets": self.sheets,
|
|
1243
1240
|
"sheet_name": self.sheet_name,
|
|
1244
1241
|
"sheet_states": self.sheet_states,
|
|
1245
|
-
"redraw_screen_accessory": self.redraw_screen_accessory,
|
|
1246
1242
|
}
|
|
1247
1243
|
return function_data
|
|
1248
1244
|
|
|
@@ -1277,7 +1273,6 @@ class Picker:
|
|
|
1277
1273
|
"centre_in_terminal_vertical",
|
|
1278
1274
|
"centre_in_cols",
|
|
1279
1275
|
"centre_in_terminal",
|
|
1280
|
-
"redraw_screen_accessory",
|
|
1281
1276
|
]
|
|
1282
1277
|
|
|
1283
1278
|
for var in variables:
|
|
@@ -7,16 +7,18 @@ Author: GrimAndGreedy
|
|
|
7
7
|
License: MIT
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
from listpick.ui.keys import picker_keys
|
|
10
|
+
from listpick.ui.keys import picker_keys, notification_keys
|
|
11
11
|
import curses
|
|
12
12
|
import logging
|
|
13
|
+
from listpick.utils import keycodes
|
|
13
14
|
|
|
14
15
|
logger = logging.getLogger('picker_log')
|
|
15
16
|
|
|
16
|
-
def build_help_rows(keys_dict: dict) -> list[list[str]]:
|
|
17
|
+
def build_help_rows(keys_dict: dict, debug: bool = False) -> list[list[str]]:
|
|
17
18
|
""" Build help rows based on the keys_dict. """
|
|
18
19
|
|
|
19
20
|
logger.info(f"function: build_help_rows() (build_help.py)")
|
|
21
|
+
|
|
20
22
|
## Key names
|
|
21
23
|
special_keys = {
|
|
22
24
|
|
|
@@ -35,16 +37,35 @@ def build_help_rows(keys_dict: dict) -> list[list[str]]:
|
|
|
35
37
|
ord('\n'): "\n",
|
|
36
38
|
curses.KEY_DC: "Delete",
|
|
37
39
|
383: "Shift+Delete",
|
|
40
|
+
ord("\t"): "Tab",
|
|
41
|
+
curses.KEY_BACKSPACE: "Backspace",
|
|
42
|
+
keycodes.META_BS: "Alt+Backspace",
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
# Ctrl + [a-z]
|
|
41
46
|
for i in range(26):
|
|
42
47
|
special_keys[i+1] = f"Ctrl+{chr(ord('a')+i)}"
|
|
48
|
+
if i == 8:
|
|
49
|
+
special_keys[i+1] = f"Tab/Ctrl+{chr(ord('a')+i)}"
|
|
50
|
+
|
|
43
51
|
|
|
44
52
|
# F1-F12
|
|
45
53
|
for i in range(12):
|
|
46
54
|
special_keys[curses.KEY_F1+i] = f"F{i+1}"
|
|
47
55
|
|
|
56
|
+
# Alt+[a-z]
|
|
57
|
+
for i in range(26):
|
|
58
|
+
special_keys[keycodes.META_a +i] = f"Alt+{chr(ord('a')+i)}"
|
|
59
|
+
|
|
60
|
+
# Alt+[A-Z]
|
|
61
|
+
for i in range(26):
|
|
62
|
+
special_keys[keycodes.META_A +i] = f"Alt+{chr(ord('A')+i)}"
|
|
63
|
+
|
|
64
|
+
# Alt+[0-9]
|
|
65
|
+
for i in range(10):
|
|
66
|
+
special_keys[keycodes.META_0] = f"Alt+{i}"
|
|
67
|
+
|
|
68
|
+
|
|
48
69
|
## Key descriptions
|
|
49
70
|
help_descriptions = {
|
|
50
71
|
"refresh": "Refresh the screen.",
|
|
@@ -119,14 +140,16 @@ def build_help_rows(keys_dict: dict) -> list[list[str]]:
|
|
|
119
140
|
"info": "Display info screen.",
|
|
120
141
|
"file_next": "Go to the next open file.",
|
|
121
142
|
"file_prev": "Go to the previous open file.",
|
|
143
|
+
"sheet_next": "Go to the next sheet.",
|
|
144
|
+
"sheet_prev": "Go to the previous sheet.",
|
|
122
145
|
}
|
|
123
146
|
sections = {
|
|
124
147
|
"Navigation:": [ "cursor_down", "cursor_up", "half_page_up", "half_page_down", "page_up", "page_down", "cursor_bottom", "cursor_top", "five_up", "five_down", "scroll_right", "scroll_left", "scroll_far_right", "scroll_far_left" ],
|
|
125
148
|
"Selection:": [ "toggle_select", "select_all", "select_none", "visual_selection_toggle", "visual_deselection_toggle", "enter" ],
|
|
126
149
|
"UI:": [ "toggle_footer", "redraw_screen", "decrease_lines_per_page", "increase_lines_per_page", "increase_column_width", "decrease_column_width", "notification_toggle" ],
|
|
127
150
|
"Sort:": [ "cycle_sort_method", "cycle_sort_method_reverse", "cycle_sort_order", ] ,
|
|
128
|
-
"Data manipulation:": [ "delete", "delete_column", "edit", "edit_picker", "edit_ipython", "
|
|
129
|
-
"Filter and sort:": [ "filter_input", "search_input", "continue_search_forward", "continue_search_backward", ] ,
|
|
151
|
+
"Data manipulation:": [ "delete", "delete_column", "edit", "edit_picker", "edit_ipython", "add_column_before", "add_column_after", "add_row_before", "add_row_after"],
|
|
152
|
+
"Filter and sort:": [ "filter_input", "x", "search_input", "continue_search_forward", "continue_search_backward", ] ,
|
|
130
153
|
"Settings:": [ "settings_input", "settings_options" ],
|
|
131
154
|
"Cancel:": [ "opts_input", "opts_select", "mode_next", "mode_prev", "pipe_input", "reset_opts", "col_select", "col_select_next", "col_select_prev", "col_hide" ],
|
|
132
155
|
"Save, load, copy and paste:": [ "save", "load", "open", "copy", "paste" ],
|
|
@@ -148,36 +171,48 @@ def build_help_rows(keys_dict: dict) -> list[list[str]]:
|
|
|
148
171
|
section_rows = []
|
|
149
172
|
|
|
150
173
|
for operation in section_operations:
|
|
151
|
-
|
|
152
|
-
|
|
174
|
+
keys = []
|
|
175
|
+
if operation in keys_dict:
|
|
176
|
+
for key in keys_dict[operation]:
|
|
177
|
+
if key in special_keys:
|
|
178
|
+
keys.append(special_keys[key])
|
|
179
|
+
else:
|
|
180
|
+
try:
|
|
181
|
+
keys.append(chr(int(key)))
|
|
182
|
+
except Exception as e:
|
|
183
|
+
keys.append(f"keycode={key}")
|
|
184
|
+
if debug: print(f"Error chr({key}): {e}")
|
|
185
|
+
else:
|
|
186
|
+
if debug: print(f"Note that {operation} is not in the keys_dict")
|
|
187
|
+
continue
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
if operation in help_descriptions:
|
|
153
192
|
description = help_descriptions[operation]
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
193
|
+
else:
|
|
194
|
+
if debug: print(f"Operation={operation} has no description.")
|
|
195
|
+
description = "..."
|
|
196
|
+
|
|
197
|
+
row = [f" {str(keys)[1:-1]}", description]
|
|
198
|
+
section_rows.append(row)
|
|
158
199
|
if section_rows:
|
|
159
200
|
items.append([section_name, ""])
|
|
160
201
|
items += section_rows
|
|
161
202
|
items.append(["",""])
|
|
162
203
|
|
|
163
|
-
# [[key_name, key_function_description], ...]
|
|
164
|
-
# for val, keys in keys_dict.items():
|
|
165
|
-
# try:
|
|
166
|
-
# row = [[chr(int(key)) if key not in special_keys else special_keys[key] for key in keys], help_descriptions[val]]
|
|
167
|
-
# items.append(row)
|
|
168
|
-
# except:
|
|
169
|
-
# pass
|
|
170
|
-
|
|
171
204
|
return items
|
|
172
205
|
|
|
173
206
|
if __name__ == "__main__":
|
|
174
|
-
|
|
175
|
-
items = build_help_rows(
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
207
|
+
items = build_help_rows(picker_keys, debug=True)
|
|
208
|
+
items = build_help_rows(notification_keys, debug=True)
|
|
209
|
+
|
|
210
|
+
# from listpick.listpick_app import Picker, start_curses, close_curses
|
|
211
|
+
# stdscr = start_curses()
|
|
212
|
+
# x = Picker(
|
|
213
|
+
# stdscr,
|
|
214
|
+
# items=items
|
|
215
|
+
# )
|
|
216
|
+
# x.run()
|
|
217
|
+
#
|
|
218
|
+
# close_curses(stdscr)
|
|
@@ -32,7 +32,6 @@ src/listpick.egg-info/top_level.txt
|
|
|
32
32
|
src/listpick/ui/__init__.py
|
|
33
33
|
src/listpick/ui/build_help.py
|
|
34
34
|
src/listpick/ui/footer.py
|
|
35
|
-
src/listpick/ui/git-bugreport-2025-08-16-1438.txt
|
|
36
35
|
src/listpick/ui/help_screen.py
|
|
37
36
|
src/listpick/ui/input_field.py
|
|
38
37
|
src/listpick/ui/keys.py
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
Thank you for filling out a Git bug report!
|
|
2
|
-
Please answer the following questions to help us understand your issue.
|
|
3
|
-
|
|
4
|
-
What did you do before the bug happened? (Steps to reproduce your issue)
|
|
5
|
-
|
|
6
|
-
What did you expect to happen? (Expected behavior)
|
|
7
|
-
|
|
8
|
-
What happened instead? (Actual behavior)
|
|
9
|
-
|
|
10
|
-
What's different between what you expected and what actually happened?
|
|
11
|
-
|
|
12
|
-
Anything else you want to add:
|
|
13
|
-
|
|
14
|
-
Please review the rest of the bug report below.
|
|
15
|
-
You can delete any lines you don't wish to share.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
[System Info]
|
|
19
|
-
git version:
|
|
20
|
-
git version 2.50.1
|
|
21
|
-
cpu: x86_64
|
|
22
|
-
built from commit: d82adb61ba2fd11d8f2587fca1b6bd7925ce4044
|
|
23
|
-
sizeof-long: 8
|
|
24
|
-
sizeof-size_t: 8
|
|
25
|
-
shell-path: /bin/sh
|
|
26
|
-
libcurl: 8.14.1
|
|
27
|
-
OpenSSL: OpenSSL 3.5.1 1 Jul 2025
|
|
28
|
-
zlib-ng: 2.2.4
|
|
29
|
-
SHA-1: SHA1_DC
|
|
30
|
-
SHA-256: SHA256_BLK
|
|
31
|
-
uname: Linux 6.15.9-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 02 Aug 2025 01:20:06 +0000 x86_64
|
|
32
|
-
compiler info: gnuc: 15.1
|
|
33
|
-
libc info: glibc: 2.42
|
|
34
|
-
$SHELL (typically, interactive shell): /usr/bin/zsh
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
[Enabled Hooks]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|