tksheet 7.3.0__tar.gz → 7.3.1__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.
- {tksheet-7.3.0/tksheet.egg-info → tksheet-7.3.1}/PKG-INFO +1 -1
- {tksheet-7.3.0 → tksheet-7.3.1}/pyproject.toml +1 -1
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/__init__.py +1 -1
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/column_headers.py +20 -5
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/functions.py +20 -9
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/main_table.py +100 -26
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/row_index.py +21 -6
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/sheet.py +90 -54
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/sheet_options.py +14 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/types.py +8 -0
- {tksheet-7.3.0 → tksheet-7.3.1/tksheet.egg-info}/PKG-INFO +1 -1
- {tksheet-7.3.0 → tksheet-7.3.1}/LICENSE.txt +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/README.md +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/setup.cfg +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/colors.py +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/formatters.py +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/other_classes.py +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/text_editor.py +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/themes.py +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/top_left_rectangle.py +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet/vars.py +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet.egg-info/SOURCES.txt +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet.egg-info/dependency_links.txt +0 -0
- {tksheet-7.3.0 → tksheet-7.3.1}/tksheet.egg-info/top_level.txt +0 -0
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|
6
6
|
name = "tksheet"
|
7
7
|
description = "Tkinter table / sheet widget"
|
8
8
|
readme = "README.md"
|
9
|
-
version = "7.3.
|
9
|
+
version = "7.3.1"
|
10
10
|
authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
|
11
11
|
requires-python = ">=3.8"
|
12
12
|
license = {file = "LICENSE.txt"}
|
@@ -28,10 +28,11 @@ from .functions import (
|
|
28
28
|
consecutive_ranges,
|
29
29
|
event_dict,
|
30
30
|
get_n2a,
|
31
|
+
int_x_tuple,
|
31
32
|
is_contiguous,
|
32
33
|
new_tk_event,
|
33
|
-
stored_event_dict,
|
34
34
|
rounded_box_coords,
|
35
|
+
stored_event_dict,
|
35
36
|
try_binding,
|
36
37
|
)
|
37
38
|
from .other_classes import (
|
@@ -43,6 +44,9 @@ from .other_classes import (
|
|
43
44
|
from .text_editor import (
|
44
45
|
TextEditor,
|
45
46
|
)
|
47
|
+
from .types import (
|
48
|
+
AnyIter,
|
49
|
+
)
|
46
50
|
from .vars import (
|
47
51
|
USER_OS,
|
48
52
|
rc_binding,
|
@@ -928,20 +932,31 @@ class ColumnHeaders(tk.Canvas):
|
|
928
932
|
|
929
933
|
def select_col(
|
930
934
|
self,
|
931
|
-
c: int,
|
935
|
+
c: int | AnyIter[int],
|
932
936
|
redraw: bool = False,
|
933
937
|
run_binding_func: bool = True,
|
934
938
|
ext: bool = False,
|
935
|
-
) -> int:
|
939
|
+
) -> int | list[int]:
|
936
940
|
boxes_to_hide = tuple(self.MT.selection_boxes)
|
937
|
-
|
941
|
+
fill_iids = [
|
942
|
+
self.MT.create_selection_box(
|
943
|
+
0,
|
944
|
+
start,
|
945
|
+
len(self.MT.row_positions) - 1,
|
946
|
+
end,
|
947
|
+
"columns",
|
948
|
+
set_current=True,
|
949
|
+
ext=ext,
|
950
|
+
)
|
951
|
+
for start, end in consecutive_ranges(int_x_tuple(c))
|
952
|
+
]
|
938
953
|
for iid in boxes_to_hide:
|
939
954
|
self.MT.hide_selection_box(iid)
|
940
955
|
if redraw:
|
941
956
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
942
957
|
if run_binding_func:
|
943
958
|
self.MT.run_selection_binding("columns")
|
944
|
-
return
|
959
|
+
return fill_iids[0] if len(fill_iids) == 1 else fill_iids
|
945
960
|
|
946
961
|
def add_selection(
|
947
962
|
self,
|
@@ -12,6 +12,8 @@ from collections import deque
|
|
12
12
|
from collections.abc import (
|
13
13
|
Callable,
|
14
14
|
Generator,
|
15
|
+
Hashable,
|
16
|
+
Iterable,
|
15
17
|
Iterator,
|
16
18
|
Sequence,
|
17
19
|
)
|
@@ -30,6 +32,9 @@ from .other_classes import (
|
|
30
32
|
Loc,
|
31
33
|
Span,
|
32
34
|
)
|
35
|
+
from .types import (
|
36
|
+
AnyIter,
|
37
|
+
)
|
33
38
|
|
34
39
|
unpickle_obj = pickle.loads
|
35
40
|
|
@@ -295,13 +300,19 @@ def is_iterable(o: object) -> bool:
|
|
295
300
|
return False
|
296
301
|
|
297
302
|
|
298
|
-
def int_x_iter(i:
|
303
|
+
def int_x_iter(i: AnyIter[int] | int) -> AnyIter[int]:
|
299
304
|
if isinstance(i, int):
|
300
305
|
return (i,)
|
301
306
|
return i
|
302
307
|
|
303
308
|
|
304
|
-
def
|
309
|
+
def int_x_tuple(i: AnyIter[int] | int) -> tuple[int]:
|
310
|
+
if isinstance(i, int):
|
311
|
+
return (i,)
|
312
|
+
return tuple(i)
|
313
|
+
|
314
|
+
|
315
|
+
def unpack(t: tuple[object] | tuple[AnyIter[object]]) -> tuple[object]:
|
305
316
|
if not len(t):
|
306
317
|
return t
|
307
318
|
if is_iterable(t[0]) and len(t) == 1:
|
@@ -427,7 +438,7 @@ def consecutive_ranges(seq: Sequence[int]) -> Generator[tuple[int, int]]:
|
|
427
438
|
yield seq[start], seq[-1] + 1
|
428
439
|
|
429
440
|
|
430
|
-
def is_contiguous(iterable:
|
441
|
+
def is_contiguous(iterable: Iterable[int]) -> bool:
|
431
442
|
itr = iter(iterable)
|
432
443
|
prev = next(itr)
|
433
444
|
return all(i == (prev := prev + 1) for i in itr)
|
@@ -500,7 +511,7 @@ def cell_right_within_box(
|
|
500
511
|
|
501
512
|
|
502
513
|
def get_last(
|
503
|
-
it:
|
514
|
+
it: AnyIter[object],
|
504
515
|
) -> object:
|
505
516
|
if hasattr(it, "__reversed__"):
|
506
517
|
try:
|
@@ -522,7 +533,7 @@ def index_exists(seq: Sequence[object], index: int) -> bool:
|
|
522
533
|
return False
|
523
534
|
|
524
535
|
|
525
|
-
def add_to_displayed(displayed: list[int], to_add:
|
536
|
+
def add_to_displayed(displayed: list[int], to_add: Iterable[int]) -> list[int]:
|
526
537
|
# assumes to_add is sorted in reverse
|
527
538
|
for i in reversed(to_add):
|
528
539
|
ins = bisect_left(displayed, i)
|
@@ -704,7 +715,7 @@ def diff_gen(seq: list[float]) -> Generator[int]:
|
|
704
715
|
)
|
705
716
|
|
706
717
|
|
707
|
-
def zip_fill_2nd_value(x:
|
718
|
+
def zip_fill_2nd_value(x: AnyIter[object], o: object) -> Generator[object, object]:
|
708
719
|
return zip(x, repeat(o))
|
709
720
|
|
710
721
|
|
@@ -1233,13 +1244,13 @@ def span_froms(
|
|
1233
1244
|
return from_r, from_c
|
1234
1245
|
|
1235
1246
|
|
1236
|
-
def del_named_span_options(options: dict, itr:
|
1247
|
+
def del_named_span_options(options: dict, itr: AnyIter[Hashable], type_: str) -> None:
|
1237
1248
|
for k in itr:
|
1238
1249
|
if k in options and type_ in options[k]:
|
1239
1250
|
del options[k][type_]
|
1240
1251
|
|
1241
1252
|
|
1242
|
-
def del_named_span_options_nested(options: dict, itr1:
|
1253
|
+
def del_named_span_options_nested(options: dict, itr1: AnyIter[Hashable], itr2: AnyIter[Hashable], type_: str) -> None:
|
1243
1254
|
for k1 in itr1:
|
1244
1255
|
for k2 in itr2:
|
1245
1256
|
k = (k1, k2)
|
@@ -1320,7 +1331,7 @@ def set_align(
|
|
1320
1331
|
def del_from_options(
|
1321
1332
|
options: dict,
|
1322
1333
|
key: str,
|
1323
|
-
coords: int |
|
1334
|
+
coords: int | AnyIter[int | tuple[int, int]] | None = None,
|
1324
1335
|
) -> dict:
|
1325
1336
|
if isinstance(coords, int):
|
1326
1337
|
if coords in options and key in options[coords]:
|
@@ -15,7 +15,6 @@ from collections.abc import (
|
|
15
15
|
Callable,
|
16
16
|
Generator,
|
17
17
|
Hashable,
|
18
|
-
Iterator,
|
19
18
|
Sequence,
|
20
19
|
)
|
21
20
|
from functools import (
|
@@ -99,6 +98,9 @@ from .other_classes import (
|
|
99
98
|
from .text_editor import (
|
100
99
|
TextEditor,
|
101
100
|
)
|
101
|
+
from .types import (
|
102
|
+
AnyIter,
|
103
|
+
)
|
102
104
|
from .vars import (
|
103
105
|
USER_OS,
|
104
106
|
bind_add_columns,
|
@@ -405,7 +407,9 @@ class MainTable(tk.Canvas):
|
|
405
407
|
("<Control-MouseWheel>", self.ctrl_mousewheel),
|
406
408
|
("<Control-plus>", self.zoom_in),
|
407
409
|
("<Control-equal>", self.zoom_in),
|
410
|
+
("<Meta-Command-equal>", self.zoom_in),
|
408
411
|
("<Control-minus>", self.zoom_out),
|
412
|
+
("<Meta-Command-minus>", self.zoom_out),
|
409
413
|
)
|
410
414
|
mt_ri_canvas_linux_bindings = {
|
411
415
|
("<Button-4>", self.mousewheel),
|
@@ -1844,14 +1848,43 @@ class MainTable(tk.Canvas):
|
|
1844
1848
|
if redraw:
|
1845
1849
|
self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
1846
1850
|
if run_binding_func:
|
1847
|
-
if self.select_all_binding_func:
|
1848
|
-
self.select_all_binding_func(
|
1849
|
-
self.get_select_event(being_drawn_item=self.being_drawn_item),
|
1850
|
-
)
|
1851
1851
|
event_data = self.get_select_event(self.being_drawn_item)
|
1852
|
+
try_binding(self.select_all_binding_func, event_data)
|
1852
1853
|
self.PAR.emit_event("<<SheetSelect>>", data=event_data)
|
1853
1854
|
self.PAR.emit_event("<<SelectAll>>", data=event_data)
|
1854
1855
|
|
1856
|
+
def select_columns(self, event: object) -> None:
|
1857
|
+
if not self.selected:
|
1858
|
+
return
|
1859
|
+
r1, c1, r2, c2 = self.selection_boxes[self.selected.fill_iid].coords
|
1860
|
+
r, c = self.selected.row, self.selected.column
|
1861
|
+
self.set_currently_selected(
|
1862
|
+
r=r,
|
1863
|
+
c=c,
|
1864
|
+
item=self.CH.select_col(range(c1, c2), redraw=True),
|
1865
|
+
)
|
1866
|
+
|
1867
|
+
def select_rows(self, event: object) -> None:
|
1868
|
+
if not self.selected:
|
1869
|
+
return
|
1870
|
+
r1, c1, r2, c2 = self.selection_boxes[self.selected.fill_iid].coords
|
1871
|
+
r, c = self.selected.row, self.selected.column
|
1872
|
+
self.set_currently_selected(
|
1873
|
+
r=r,
|
1874
|
+
c=c,
|
1875
|
+
item=self.RI.select_row(range(r1, r2), redraw=True),
|
1876
|
+
)
|
1877
|
+
|
1878
|
+
def select_row_start(self, event: object) -> None:
|
1879
|
+
if self.selected:
|
1880
|
+
self.select_cell(self.selected.row, 0)
|
1881
|
+
self.see(self.selected.row, 0)
|
1882
|
+
|
1883
|
+
def select_a1(self, event: object) -> None:
|
1884
|
+
if len(self.row_positions) > 1 and len(self.col_positions) > 1:
|
1885
|
+
self.select_cell(0, 0)
|
1886
|
+
self.see(0, 0)
|
1887
|
+
|
1855
1888
|
def select_cell(
|
1856
1889
|
self,
|
1857
1890
|
r: int,
|
@@ -1934,7 +1967,9 @@ class MainTable(tk.Canvas):
|
|
1934
1967
|
) -> None:
|
1935
1968
|
if not self.selected:
|
1936
1969
|
return
|
1970
|
+
curr_box = self.selected.fill_iid
|
1937
1971
|
if r == "all" or (r is None and c is None and cell is None):
|
1972
|
+
self.hide_dropdown_editor_all_canvases()
|
1938
1973
|
for item, box in self.get_selection_items():
|
1939
1974
|
self.hide_selection_box(item)
|
1940
1975
|
elif r in ("allrows", "allcols"):
|
@@ -1944,6 +1979,8 @@ class MainTable(tk.Canvas):
|
|
1944
1979
|
cells=False,
|
1945
1980
|
):
|
1946
1981
|
self.hide_selection_box(item)
|
1982
|
+
if item == curr_box:
|
1983
|
+
self.hide_dropdown_editor_all_canvases()
|
1947
1984
|
elif isinstance(r, int) and c is None and cell is None:
|
1948
1985
|
for item, box in self.get_selection_items(columns=False, cells=False):
|
1949
1986
|
r1, c1, r2, c2 = box.coords
|
@@ -1951,6 +1988,8 @@ class MainTable(tk.Canvas):
|
|
1951
1988
|
resel = self.selected.fill_iid == item
|
1952
1989
|
to_sel = self.selected.row
|
1953
1990
|
self.hide_selection_box(item)
|
1991
|
+
if item == curr_box:
|
1992
|
+
self.hide_dropdown_editor_all_canvases()
|
1954
1993
|
if r2 - r1 != 1:
|
1955
1994
|
if r == r1:
|
1956
1995
|
self.create_selection_box(
|
@@ -1994,6 +2033,8 @@ class MainTable(tk.Canvas):
|
|
1994
2033
|
resel = self.selected.fill_iid == item
|
1995
2034
|
to_sel = self.selected.column
|
1996
2035
|
self.hide_selection_box(item)
|
2036
|
+
if item == curr_box:
|
2037
|
+
self.hide_dropdown_editor_all_canvases()
|
1997
2038
|
if c2 - c1 != 1:
|
1998
2039
|
if c == c1:
|
1999
2040
|
self.create_selection_box(
|
@@ -2037,6 +2078,8 @@ class MainTable(tk.Canvas):
|
|
2037
2078
|
r1, c1, r2, c2 = box.coords
|
2038
2079
|
if r >= r1 and c >= c1 and r < r2 and c < c2:
|
2039
2080
|
self.hide_selection_box(item)
|
2081
|
+
if item == curr_box:
|
2082
|
+
self.hide_text_editor_and_dropdown(redraw=False)
|
2040
2083
|
if redraw:
|
2041
2084
|
self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
2042
2085
|
sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
|
@@ -2046,12 +2089,15 @@ class MainTable(tk.Canvas):
|
|
2046
2089
|
|
2047
2090
|
def deselect_any(
|
2048
2091
|
self,
|
2049
|
-
rows:
|
2050
|
-
columns:
|
2092
|
+
rows: AnyIter[int] | int | None = None,
|
2093
|
+
columns: AnyIter[int] | int | None = None,
|
2051
2094
|
redraw: bool = True,
|
2052
2095
|
) -> None:
|
2096
|
+
if not self.selected:
|
2097
|
+
return
|
2053
2098
|
rows = int_x_iter(rows)
|
2054
2099
|
columns = int_x_iter(columns)
|
2100
|
+
curr_box = self.selected.fill_iid
|
2055
2101
|
if is_iterable(rows) and is_iterable(columns):
|
2056
2102
|
rows = tuple(consecutive_ranges(sorted(rows)))
|
2057
2103
|
columns = tuple(consecutive_ranges(sorted(columns)))
|
@@ -2066,6 +2112,8 @@ class MainTable(tk.Canvas):
|
|
2066
2112
|
(cols_end >= c1 and cols_end <= c2) or (cols_st >= c1 and cols_st < c2)
|
2067
2113
|
):
|
2068
2114
|
hidden = self.hide_selection_box(item)
|
2115
|
+
if item == curr_box:
|
2116
|
+
self.hide_dropdown_editor_all_canvases()
|
2069
2117
|
break
|
2070
2118
|
elif is_iterable(rows):
|
2071
2119
|
rows = tuple(consecutive_ranges(sorted(rows)))
|
@@ -2074,6 +2122,8 @@ class MainTable(tk.Canvas):
|
|
2074
2122
|
for rows_st, rows_end in rows:
|
2075
2123
|
if (rows_end >= r1 and rows_end <= r2) or (rows_st >= r1 and rows_st < r2):
|
2076
2124
|
self.hide_selection_box(item)
|
2125
|
+
if item == curr_box:
|
2126
|
+
self.hide_dropdown_editor_all_canvases()
|
2077
2127
|
break
|
2078
2128
|
elif is_iterable(columns):
|
2079
2129
|
columns = tuple(consecutive_ranges(sorted(columns)))
|
@@ -2082,6 +2132,8 @@ class MainTable(tk.Canvas):
|
|
2082
2132
|
for cols_st, cols_end in columns:
|
2083
2133
|
if (cols_end >= c1 and cols_end <= c2) or (cols_st >= c1 and cols_st < c2):
|
2084
2134
|
self.hide_selection_box(item)
|
2135
|
+
if item == curr_box:
|
2136
|
+
self.hide_dropdown_editor_all_canvases()
|
2085
2137
|
break
|
2086
2138
|
else:
|
2087
2139
|
self.deselect()
|
@@ -2672,7 +2724,7 @@ class MainTable(tk.Canvas):
|
|
2672
2724
|
self._enable_binding(bindings.lower())
|
2673
2725
|
self.create_rc_menus()
|
2674
2726
|
|
2675
|
-
def disable_bindings(self, bindings):
|
2727
|
+
def disable_bindings(self, bindings: object) -> None:
|
2676
2728
|
if not bindings:
|
2677
2729
|
self._disable_binding("all")
|
2678
2730
|
elif isinstance(bindings, (list, tuple)):
|
@@ -2686,21 +2738,33 @@ class MainTable(tk.Canvas):
|
|
2686
2738
|
self._disable_binding(bindings)
|
2687
2739
|
self.create_rc_menus()
|
2688
2740
|
|
2689
|
-
def _enable_binding(self, binding):
|
2741
|
+
def _enable_binding(self, binding: str) -> None:
|
2690
2742
|
if binding == "enable_all":
|
2691
2743
|
binding = "all"
|
2692
|
-
if binding in (
|
2693
|
-
|
2694
|
-
|
2695
|
-
|
2696
|
-
|
2697
|
-
|
2744
|
+
if binding in (
|
2745
|
+
"all",
|
2746
|
+
"single",
|
2747
|
+
"single_selection_mode",
|
2748
|
+
"single_select",
|
2749
|
+
"toggle",
|
2750
|
+
"toggle_selection_mode",
|
2751
|
+
"toggle_select",
|
2752
|
+
):
|
2753
|
+
self._tksheet_bind("row_start_bindings", self.select_row_start)
|
2754
|
+
self._tksheet_bind("table_start_bindings", self.select_a1)
|
2755
|
+
if binding in ("all", "single", "single_selection_mode", "single_select"):
|
2756
|
+
self.single_selection_enabled = True
|
2757
|
+
self.toggle_selection_enabled = False
|
2758
|
+
elif binding in ("toggle", "toggle_selection_mode", "toggle_select"):
|
2759
|
+
self.toggle_selection_enabled = True
|
2760
|
+
self.single_selection_enabled = False
|
2698
2761
|
if binding in ("all", "drag_select"):
|
2699
2762
|
self.drag_selection_enabled = True
|
2700
2763
|
if binding in ("all", "column_width_resize"):
|
2701
2764
|
self.CH.width_resizing_enabled = True
|
2702
2765
|
if binding in ("all", "column_select"):
|
2703
2766
|
self.CH.col_selection_enabled = True
|
2767
|
+
self._tksheet_bind("select_columns_bindings", self.select_columns)
|
2704
2768
|
if binding in ("all", "column_height_resize"):
|
2705
2769
|
self.CH.height_resizing_enabled = True
|
2706
2770
|
self.TL.rh_state()
|
@@ -2717,6 +2781,7 @@ class MainTable(tk.Canvas):
|
|
2717
2781
|
self.TL.rw_state()
|
2718
2782
|
if binding in ("all", "row_select"):
|
2719
2783
|
self.RI.row_selection_enabled = True
|
2784
|
+
self._tksheet_bind("select_rows_bindings", self.select_rows)
|
2720
2785
|
if binding in ("all", "row_drag_and_drop", "move_rows"):
|
2721
2786
|
self.RI.drag_and_drop_enabled = True
|
2722
2787
|
if binding in ("all", "select_all"):
|
@@ -2802,21 +2867,29 @@ class MainTable(tk.Canvas):
|
|
2802
2867
|
for binding in self.PAR.ops[bindings_key]:
|
2803
2868
|
widget.bind(binding, func)
|
2804
2869
|
|
2805
|
-
def _disable_binding(self, binding):
|
2870
|
+
def _disable_binding(self, binding: str) -> None:
|
2806
2871
|
if binding == "disable_all":
|
2807
2872
|
binding = "all"
|
2808
|
-
if binding in (
|
2873
|
+
if binding in (
|
2874
|
+
"all",
|
2875
|
+
"single",
|
2876
|
+
"single_selection_mode",
|
2877
|
+
"single_select",
|
2878
|
+
"toggle",
|
2879
|
+
"toggle_selection_mode",
|
2880
|
+
"toggle_select",
|
2881
|
+
):
|
2882
|
+
self._tksheet_unbind("row_start_bindings")
|
2883
|
+
self._tksheet_unbind("table_start_bindings")
|
2809
2884
|
self.single_selection_enabled = False
|
2810
2885
|
self.toggle_selection_enabled = False
|
2811
|
-
elif binding in ("toggle", "toggle_selection_mode", "toggle_select"):
|
2812
|
-
self.toggle_selection_enabled = False
|
2813
|
-
self.single_selection_enabled = False
|
2814
2886
|
if binding in ("all", "drag_select"):
|
2815
2887
|
self.drag_selection_enabled = False
|
2816
2888
|
if binding in ("all", "column_width_resize"):
|
2817
2889
|
self.CH.width_resizing_enabled = False
|
2818
2890
|
if binding in ("all", "column_select"):
|
2819
2891
|
self.CH.col_selection_enabled = False
|
2892
|
+
self._tksheet_unbind("select_columns_bindings")
|
2820
2893
|
if binding in ("all", "column_height_resize"):
|
2821
2894
|
self.CH.height_resizing_enabled = False
|
2822
2895
|
self.TL.rh_state("hidden")
|
@@ -2833,6 +2906,7 @@ class MainTable(tk.Canvas):
|
|
2833
2906
|
self.TL.rw_state("hidden")
|
2834
2907
|
if binding in ("all", "row_select"):
|
2835
2908
|
self.RI.row_selection_enabled = False
|
2909
|
+
self._tksheet_unbind("select_rows_bindings")
|
2836
2910
|
if binding in ("all", "row_drag_and_drop", "move_rows"):
|
2837
2911
|
self.RI.drag_and_drop_enabled = False
|
2838
2912
|
if binding in bind_del_columns:
|
@@ -3880,7 +3954,7 @@ class MainTable(tk.Canvas):
|
|
3880
3954
|
self.recreate_all_selection_boxes()
|
3881
3955
|
return self.row_positions, self.col_positions
|
3882
3956
|
|
3883
|
-
def set_col_positions(self, itr:
|
3957
|
+
def set_col_positions(self, itr: AnyIter[float]) -> None:
|
3884
3958
|
self.col_positions = list(accumulate(chain([0], itr)))
|
3885
3959
|
|
3886
3960
|
def reset_col_positions(self, ncols: int | None = None):
|
@@ -3892,7 +3966,7 @@ class MainTable(tk.Canvas):
|
|
3892
3966
|
else:
|
3893
3967
|
self.set_col_positions(itr=repeat(colpos, len(self.displayed_columns)))
|
3894
3968
|
|
3895
|
-
def set_row_positions(self, itr:
|
3969
|
+
def set_row_positions(self, itr: AnyIter[float]) -> None:
|
3896
3970
|
self.row_positions = list(accumulate(chain([0], itr)))
|
3897
3971
|
|
3898
3972
|
def reset_row_positions(self, nrows: int | None = None):
|
@@ -3926,7 +4000,7 @@ class MainTable(tk.Canvas):
|
|
3926
4000
|
del self.row_positions[idx]
|
3927
4001
|
self.row_positions[idx:] = [e - w for e in islice(self.row_positions, idx, len(self.row_positions))]
|
3928
4002
|
|
3929
|
-
def del_col_positions(self, idxs:
|
4003
|
+
def del_col_positions(self, idxs: AnyIter[int] | None = None):
|
3930
4004
|
if idxs is None:
|
3931
4005
|
del self.col_positions[-1]
|
3932
4006
|
else:
|
@@ -3934,7 +4008,7 @@ class MainTable(tk.Canvas):
|
|
3934
4008
|
idxs = set(idxs)
|
3935
4009
|
self.set_col_positions(itr=(w for i, w in enumerate(self.gen_column_widths()) if i not in idxs))
|
3936
4010
|
|
3937
|
-
def del_row_positions(self, idxs:
|
4011
|
+
def del_row_positions(self, idxs: AnyIter[int] | None = None):
|
3938
4012
|
if idxs is None:
|
3939
4013
|
del self.row_positions[-1]
|
3940
4014
|
else:
|
@@ -4934,7 +5008,7 @@ class MainTable(tk.Canvas):
|
|
4934
5008
|
|
4935
5009
|
def display_rows(
|
4936
5010
|
self,
|
4937
|
-
rows: int |
|
5011
|
+
rows: int | AnyIter | None = None,
|
4938
5012
|
all_rows_displayed: bool | None = None,
|
4939
5013
|
reset_row_positions: bool = True,
|
4940
5014
|
deselect_all: bool = True,
|
@@ -4963,7 +5037,7 @@ class MainTable(tk.Canvas):
|
|
4963
5037
|
|
4964
5038
|
def display_columns(
|
4965
5039
|
self,
|
4966
|
-
columns: int |
|
5040
|
+
columns: int | AnyIter | None = None,
|
4967
5041
|
all_columns_displayed: bool | None = None,
|
4968
5042
|
reset_col_positions: bool = True,
|
4969
5043
|
deselect_all: bool = True,
|
@@ -5,7 +5,6 @@ from collections import defaultdict
|
|
5
5
|
from collections.abc import (
|
6
6
|
Generator,
|
7
7
|
Hashable,
|
8
|
-
Iterator,
|
9
8
|
Sequence,
|
10
9
|
)
|
11
10
|
from functools import (
|
@@ -35,13 +34,15 @@ from .formatters import (
|
|
35
34
|
)
|
36
35
|
from .functions import (
|
37
36
|
consecutive_chunks,
|
37
|
+
consecutive_ranges,
|
38
38
|
event_dict,
|
39
39
|
get_n2a,
|
40
|
+
int_x_tuple,
|
40
41
|
is_contiguous,
|
41
42
|
new_tk_event,
|
42
43
|
num2alpha,
|
43
|
-
stored_event_dict,
|
44
44
|
rounded_box_coords,
|
45
|
+
stored_event_dict,
|
45
46
|
try_binding,
|
46
47
|
)
|
47
48
|
from .other_classes import (
|
@@ -54,6 +55,9 @@ from .other_classes import (
|
|
54
55
|
from .text_editor import (
|
55
56
|
TextEditor,
|
56
57
|
)
|
58
|
+
from .types import (
|
59
|
+
AnyIter,
|
60
|
+
)
|
57
61
|
from .vars import (
|
58
62
|
rc_binding,
|
59
63
|
symbols_set,
|
@@ -944,20 +948,31 @@ class RowIndex(tk.Canvas):
|
|
944
948
|
|
945
949
|
def select_row(
|
946
950
|
self,
|
947
|
-
r: int,
|
951
|
+
r: int | AnyIter[int],
|
948
952
|
redraw: bool = False,
|
949
953
|
run_binding_func: bool = True,
|
950
954
|
ext: bool = False,
|
951
955
|
) -> int:
|
952
956
|
boxes_to_hide = tuple(self.MT.selection_boxes)
|
953
|
-
|
957
|
+
fill_iids = [
|
958
|
+
self.MT.create_selection_box(
|
959
|
+
start,
|
960
|
+
0,
|
961
|
+
end,
|
962
|
+
len(self.MT.col_positions) - 1,
|
963
|
+
"rows",
|
964
|
+
set_current=True,
|
965
|
+
ext=ext,
|
966
|
+
)
|
967
|
+
for start, end in consecutive_ranges(int_x_tuple(r))
|
968
|
+
]
|
954
969
|
for iid in boxes_to_hide:
|
955
970
|
self.MT.hide_selection_box(iid)
|
956
971
|
if redraw:
|
957
972
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
958
973
|
if run_binding_func:
|
959
974
|
self.MT.run_selection_binding("rows")
|
960
|
-
return
|
975
|
+
return fill_iids[0] if len(fill_iids) == 1 else fill_iids
|
961
976
|
|
962
977
|
def add_selection(
|
963
978
|
self,
|
@@ -1113,7 +1128,7 @@ class RowIndex(tk.Canvas):
|
|
1113
1128
|
|
1114
1129
|
def get_index_text_width(
|
1115
1130
|
self,
|
1116
|
-
only_rows:
|
1131
|
+
only_rows: AnyIter[int] | None = None,
|
1117
1132
|
) -> int:
|
1118
1133
|
self.fix_index()
|
1119
1134
|
w = self.PAR.ops.default_row_index_width
|
@@ -83,6 +83,7 @@ from .themes import (
|
|
83
83
|
)
|
84
84
|
from .top_left_rectangle import TopLeftRectangle
|
85
85
|
from .types import (
|
86
|
+
AnyIter,
|
86
87
|
CreateSpanTypes,
|
87
88
|
)
|
88
89
|
from .vars import (
|
@@ -544,7 +545,7 @@ class Sheet(tk.Frame):
|
|
544
545
|
def set_header_data(
|
545
546
|
self,
|
546
547
|
value: object,
|
547
|
-
c: int | None |
|
548
|
+
c: int | None | AnyIter[int] = None,
|
548
549
|
redraw: bool = True,
|
549
550
|
) -> Sheet:
|
550
551
|
if c is None:
|
@@ -580,7 +581,7 @@ class Sheet(tk.Frame):
|
|
580
581
|
def set_index_data(
|
581
582
|
self,
|
582
583
|
value: object,
|
583
|
-
r: int | None |
|
584
|
+
r: int | None | AnyIter[int] = None,
|
584
585
|
redraw: bool = True,
|
585
586
|
) -> Sheet:
|
586
587
|
if r is None:
|
@@ -2305,7 +2306,7 @@ class Sheet(tk.Frame):
|
|
2305
2306
|
|
2306
2307
|
def del_rows(
|
2307
2308
|
self,
|
2308
|
-
rows: int |
|
2309
|
+
rows: int | AnyIter[int],
|
2309
2310
|
data_indexes: bool = True,
|
2310
2311
|
undo: bool = False,
|
2311
2312
|
emit_event: bool = False,
|
@@ -2347,7 +2348,7 @@ class Sheet(tk.Frame):
|
|
2347
2348
|
|
2348
2349
|
def del_columns(
|
2349
2350
|
self,
|
2350
|
-
columns: int |
|
2351
|
+
columns: int | AnyIter[int],
|
2351
2352
|
data_indexes: bool = True,
|
2352
2353
|
undo: bool = False,
|
2353
2354
|
emit_event: bool = False,
|
@@ -3463,8 +3464,8 @@ class Sheet(tk.Frame):
|
|
3463
3464
|
|
3464
3465
|
def deselect_any(
|
3465
3466
|
self,
|
3466
|
-
rows:
|
3467
|
-
columns:
|
3467
|
+
rows: AnyIter[int] | int | None,
|
3468
|
+
columns: AnyIter[int] | int | None,
|
3468
3469
|
redraw: bool = True,
|
3469
3470
|
) -> Sheet:
|
3470
3471
|
self.MT.deselect_any(rows=rows, columns=columns, redraw=False)
|
@@ -3622,7 +3623,7 @@ class Sheet(tk.Frame):
|
|
3622
3623
|
|
3623
3624
|
def set_column_widths(
|
3624
3625
|
self,
|
3625
|
-
column_widths:
|
3626
|
+
column_widths: AnyIter[float] | None = None,
|
3626
3627
|
canvas_positions: bool = False,
|
3627
3628
|
reset: bool = False,
|
3628
3629
|
) -> Sheet:
|
@@ -3637,7 +3638,7 @@ class Sheet(tk.Frame):
|
|
3637
3638
|
|
3638
3639
|
def set_row_heights(
|
3639
3640
|
self,
|
3640
|
-
row_heights:
|
3641
|
+
row_heights: AnyIter[float] | None = None,
|
3641
3642
|
canvas_positions: bool = False,
|
3642
3643
|
reset: bool = False,
|
3643
3644
|
) -> Sheet:
|
@@ -3684,7 +3685,7 @@ class Sheet(tk.Frame):
|
|
3684
3685
|
|
3685
3686
|
delete_row_position = del_row_position
|
3686
3687
|
|
3687
|
-
def del_row_positions(self, idxs:
|
3688
|
+
def del_row_positions(self, idxs: AnyIter[int] | None = None) -> Sheet:
|
3688
3689
|
self.MT.del_row_positions(idxs=idxs)
|
3689
3690
|
self.set_refresh_timer()
|
3690
3691
|
return self
|
@@ -3695,7 +3696,7 @@ class Sheet(tk.Frame):
|
|
3695
3696
|
|
3696
3697
|
delete_column_position = del_column_position
|
3697
3698
|
|
3698
|
-
def del_column_positions(self, idxs:
|
3699
|
+
def del_column_positions(self, idxs: AnyIter[int] | None = None) -> Sheet:
|
3699
3700
|
self.MT.del_col_positions(idxs=idxs)
|
3700
3701
|
self.set_refresh_timer()
|
3701
3702
|
return self
|
@@ -3968,7 +3969,7 @@ class Sheet(tk.Frame):
|
|
3968
3969
|
|
3969
3970
|
def display_columns(
|
3970
3971
|
self,
|
3971
|
-
columns: None | Literal["all"] |
|
3972
|
+
columns: None | Literal["all"] | AnyIter[int] = None,
|
3972
3973
|
all_columns_displayed: None | bool = None,
|
3973
3974
|
reset_col_positions: bool = True,
|
3974
3975
|
redraw: bool = False,
|
@@ -3992,7 +3993,7 @@ class Sheet(tk.Frame):
|
|
3992
3993
|
|
3993
3994
|
def hide_columns(
|
3994
3995
|
self,
|
3995
|
-
columns: int | set[int] |
|
3996
|
+
columns: int | set[int] | AnyIter[int],
|
3996
3997
|
redraw: bool = True,
|
3997
3998
|
deselect_all: bool = True,
|
3998
3999
|
data_indexes: bool = False,
|
@@ -4036,7 +4037,7 @@ class Sheet(tk.Frame):
|
|
4036
4037
|
|
4037
4038
|
def show_columns(
|
4038
4039
|
self,
|
4039
|
-
columns: int |
|
4040
|
+
columns: int | AnyIter[int],
|
4040
4041
|
redraw: bool = True,
|
4041
4042
|
deselect_all: bool = True,
|
4042
4043
|
) -> Sheet:
|
@@ -4102,7 +4103,7 @@ class Sheet(tk.Frame):
|
|
4102
4103
|
|
4103
4104
|
def display_rows(
|
4104
4105
|
self,
|
4105
|
-
rows: None | Literal["all"] |
|
4106
|
+
rows: None | Literal["all"] | AnyIter[int] = None,
|
4106
4107
|
all_rows_displayed: None | bool = None,
|
4107
4108
|
reset_row_positions: bool = True,
|
4108
4109
|
redraw: bool = False,
|
@@ -4124,7 +4125,7 @@ class Sheet(tk.Frame):
|
|
4124
4125
|
|
4125
4126
|
def hide_rows(
|
4126
4127
|
self,
|
4127
|
-
rows: int | set[int] |
|
4128
|
+
rows: int | set[int] | AnyIter[int],
|
4128
4129
|
redraw: bool = True,
|
4129
4130
|
deselect_all: bool = True,
|
4130
4131
|
data_indexes: bool = False,
|
@@ -4170,7 +4171,7 @@ class Sheet(tk.Frame):
|
|
4170
4171
|
|
4171
4172
|
def show_rows(
|
4172
4173
|
self,
|
4173
|
-
rows: int |
|
4174
|
+
rows: int | AnyIter[int],
|
4174
4175
|
redraw: bool = True,
|
4175
4176
|
deselect_all: bool = True,
|
4176
4177
|
) -> Sheet:
|
@@ -4790,7 +4791,7 @@ class Sheet(tk.Frame):
|
|
4790
4791
|
def tag(
|
4791
4792
|
self,
|
4792
4793
|
*key: CreateSpanTypes,
|
4793
|
-
tags:
|
4794
|
+
tags: AnyIter[str] | str = "",
|
4794
4795
|
) -> Sheet:
|
4795
4796
|
span = self.span_from_key(*key)
|
4796
4797
|
rows, cols = self.ranges_from_span(span)
|
@@ -4835,7 +4836,7 @@ class Sheet(tk.Frame):
|
|
4835
4836
|
|
4836
4837
|
def tag_rows(
|
4837
4838
|
self,
|
4838
|
-
rows: int |
|
4839
|
+
rows: int | AnyIter[int],
|
4839
4840
|
*tags,
|
4840
4841
|
) -> Sheet:
|
4841
4842
|
if isinstance(rows, int):
|
@@ -4848,7 +4849,7 @@ class Sheet(tk.Frame):
|
|
4848
4849
|
|
4849
4850
|
def tag_columns(
|
4850
4851
|
self,
|
4851
|
-
columns: int |
|
4852
|
+
columns: int | AnyIter[int],
|
4852
4853
|
*tags,
|
4853
4854
|
) -> Sheet:
|
4854
4855
|
if isinstance(columns, int):
|
@@ -4862,8 +4863,8 @@ class Sheet(tk.Frame):
|
|
4862
4863
|
def untag(
|
4863
4864
|
self,
|
4864
4865
|
cell: tuple[int, int] | None = None,
|
4865
|
-
rows: int |
|
4866
|
-
columns: int |
|
4866
|
+
rows: int | AnyIter[int] | None = None,
|
4867
|
+
columns: int | AnyIter[int] | None = None,
|
4867
4868
|
) -> Sheet:
|
4868
4869
|
if isinstance(cell, tuple):
|
4869
4870
|
for tagged in self.MT.tagged_cells.values():
|
@@ -4923,7 +4924,7 @@ class Sheet(tk.Frame):
|
|
4923
4924
|
text_column: None | int | list[str] = None,
|
4924
4925
|
push_ops: bool = False,
|
4925
4926
|
row_heights: Sequence[int] | None | False = None,
|
4926
|
-
open_ids:
|
4927
|
+
open_ids: AnyIter[str] | None = None,
|
4927
4928
|
safety: bool = True,
|
4928
4929
|
ncols: int | None = None,
|
4929
4930
|
lower: bool = False,
|
@@ -4950,7 +4951,7 @@ class Sheet(tk.Frame):
|
|
4950
4951
|
if not iid:
|
4951
4952
|
continue
|
4952
4953
|
tally_of_ids[iid] += 1
|
4953
|
-
if tally_of_ids[iid]
|
4954
|
+
if tally_of_ids[iid]:
|
4954
4955
|
x = 1
|
4955
4956
|
while iid in tally_of_ids:
|
4956
4957
|
new = f"{row[iid_column]}_DUPLICATED_{x}"
|
@@ -5032,7 +5033,7 @@ class Sheet(tk.Frame):
|
|
5032
5033
|
"""
|
5033
5034
|
return self.RI.tree_open_ids
|
5034
5035
|
|
5035
|
-
def tree_set_open(self, open_ids:
|
5036
|
+
def tree_set_open(self, open_ids: AnyIter[str]) -> Sheet:
|
5036
5037
|
"""
|
5037
5038
|
Accepts set[str] of iids that are open in the treeview
|
5038
5039
|
Closes everything else
|
@@ -5087,7 +5088,7 @@ class Sheet(tk.Frame):
|
|
5087
5088
|
deselect_all=False,
|
5088
5089
|
)
|
5089
5090
|
|
5090
|
-
def _tree_close(self, items:
|
5091
|
+
def _tree_close(self, items: AnyIter[str]) -> list[int]:
|
5091
5092
|
"""
|
5092
5093
|
Only meant for internal use
|
5093
5094
|
"""
|
@@ -5129,6 +5130,9 @@ class Sheet(tk.Frame):
|
|
5129
5130
|
) -> str:
|
5130
5131
|
"""
|
5131
5132
|
Insert an item into the treeview
|
5133
|
+
|
5134
|
+
Returns:
|
5135
|
+
str: new item iid
|
5132
5136
|
"""
|
5133
5137
|
if not iid:
|
5134
5138
|
i = 0
|
@@ -5187,7 +5191,12 @@ class Sheet(tk.Frame):
|
|
5187
5191
|
include_text_column: bool = True,
|
5188
5192
|
) -> dict[str, int]:
|
5189
5193
|
"""
|
5190
|
-
Insert multiple items into the treeview at once, under the same parent
|
5194
|
+
Insert multiple items into the treeview at once, under the same parent.
|
5195
|
+
|
5196
|
+
Returns:
|
5197
|
+
dict:
|
5198
|
+
- Keys (str): iid
|
5199
|
+
- Values (int): row numbers
|
5191
5200
|
"""
|
5192
5201
|
to_insert = []
|
5193
5202
|
pid = parent
|
@@ -5778,7 +5787,7 @@ class Sheet(tk.Frame):
|
|
5778
5787
|
get_displayed: bool = False,
|
5779
5788
|
get_index: bool = False,
|
5780
5789
|
get_index_displayed: bool = True,
|
5781
|
-
only_columns: int |
|
5790
|
+
only_columns: int | AnyIter[int] | None = None,
|
5782
5791
|
) -> list[object]:
|
5783
5792
|
if only_columns is not None:
|
5784
5793
|
if isinstance(only_columns, int):
|
@@ -5804,7 +5813,7 @@ class Sheet(tk.Frame):
|
|
5804
5813
|
get_displayed: bool = False,
|
5805
5814
|
get_header: bool = False,
|
5806
5815
|
get_header_displayed: bool = True,
|
5807
|
-
only_rows: int |
|
5816
|
+
only_rows: int | AnyIter[int] | None = None,
|
5808
5817
|
) -> list[object]:
|
5809
5818
|
if only_rows is not None:
|
5810
5819
|
if isinstance(only_rows, int):
|
@@ -5823,8 +5832,8 @@ class Sheet(tk.Frame):
|
|
5823
5832
|
get_index: bool = False,
|
5824
5833
|
get_header_displayed: bool = True,
|
5825
5834
|
get_index_displayed: bool = True,
|
5826
|
-
only_rows:
|
5827
|
-
only_columns:
|
5835
|
+
only_rows: AnyIter[int] | int | None = None,
|
5836
|
+
only_columns: AnyIter[int] | int | None = None,
|
5828
5837
|
) -> list[object]:
|
5829
5838
|
if only_rows is not None:
|
5830
5839
|
if isinstance(only_rows, int):
|
@@ -5872,8 +5881,8 @@ class Sheet(tk.Frame):
|
|
5872
5881
|
get_index: bool = False,
|
5873
5882
|
get_index_displayed: bool = True,
|
5874
5883
|
get_header_displayed: bool = True,
|
5875
|
-
only_rows: int |
|
5876
|
-
only_columns: int |
|
5884
|
+
only_rows: int | AnyIter[int] | None = None,
|
5885
|
+
only_columns: int | AnyIter[int] | None = None,
|
5877
5886
|
) -> Iterator[list[object]]:
|
5878
5887
|
if only_rows is not None:
|
5879
5888
|
if isinstance(only_rows, int):
|
@@ -6142,7 +6151,7 @@ class Sheet(tk.Frame):
|
|
6142
6151
|
|
6143
6152
|
def highlight_rows(
|
6144
6153
|
self,
|
6145
|
-
rows:
|
6154
|
+
rows: AnyIter[int] | int,
|
6146
6155
|
bg: None | str = None,
|
6147
6156
|
fg: None | str = None,
|
6148
6157
|
highlight_index: bool = True,
|
@@ -6160,7 +6169,7 @@ class Sheet(tk.Frame):
|
|
6160
6169
|
|
6161
6170
|
def highlight_columns(
|
6162
6171
|
self,
|
6163
|
-
columns:
|
6172
|
+
columns: AnyIter[int] | int,
|
6164
6173
|
bg: bool | None | str = False,
|
6165
6174
|
fg: bool | None | str = False,
|
6166
6175
|
highlight_header: bool = True,
|
@@ -6460,7 +6469,12 @@ class Sheet(tk.Frame):
|
|
6460
6469
|
) -> None:
|
6461
6470
|
self.create_checkbox(r=r, c=c, **get_checkbox_kwargs(*args, **kwargs))
|
6462
6471
|
|
6463
|
-
def checkbox_row(
|
6472
|
+
def checkbox_row(
|
6473
|
+
self,
|
6474
|
+
r: AnyIter[int] | int | Literal["all"] = 0,
|
6475
|
+
*args,
|
6476
|
+
**kwargs,
|
6477
|
+
) -> None:
|
6464
6478
|
kwargs = get_checkbox_kwargs(*args, **kwargs)
|
6465
6479
|
d = get_checkbox_dict(**kwargs)
|
6466
6480
|
if isinstance(r, str) and r.lower() == "all":
|
@@ -6482,7 +6496,7 @@ class Sheet(tk.Frame):
|
|
6482
6496
|
|
6483
6497
|
def checkbox_column(
|
6484
6498
|
self,
|
6485
|
-
c:
|
6499
|
+
c: AnyIter[int] | int | Literal["all"] = 0,
|
6486
6500
|
*args,
|
6487
6501
|
**kwargs,
|
6488
6502
|
) -> None:
|
@@ -6505,7 +6519,12 @@ class Sheet(tk.Frame):
|
|
6505
6519
|
for r in range(self.MT.total_data_rows()):
|
6506
6520
|
self.MT.set_cell_data(r, c, v)
|
6507
6521
|
|
6508
|
-
def create_header_checkbox(
|
6522
|
+
def create_header_checkbox(
|
6523
|
+
self,
|
6524
|
+
c: AnyIter[int] | int | Literal["all"] = 0,
|
6525
|
+
*args,
|
6526
|
+
**kwargs,
|
6527
|
+
) -> None:
|
6509
6528
|
kwargs = get_checkbox_kwargs(*args, **kwargs)
|
6510
6529
|
d = get_checkbox_dict(**kwargs)
|
6511
6530
|
if isinstance(c, str) and c.lower() == "all":
|
@@ -6523,7 +6542,12 @@ class Sheet(tk.Frame):
|
|
6523
6542
|
add_to_options(self.CH.cell_options, c, "checkbox", d)
|
6524
6543
|
self.CH.set_cell_data(c, v)
|
6525
6544
|
|
6526
|
-
def create_index_checkbox(
|
6545
|
+
def create_index_checkbox(
|
6546
|
+
self,
|
6547
|
+
r: AnyIter[int] | int | Literal["all"] = 0,
|
6548
|
+
*args,
|
6549
|
+
**kwargs,
|
6550
|
+
) -> None:
|
6527
6551
|
kwargs = get_checkbox_kwargs(*args, **kwargs)
|
6528
6552
|
d = get_checkbox_dict(**kwargs)
|
6529
6553
|
if isinstance(r, str) and r.lower() == "all":
|
@@ -6568,7 +6592,10 @@ class Sheet(tk.Frame):
|
|
6568
6592
|
) -> None:
|
6569
6593
|
self.delete_checkbox(r, c)
|
6570
6594
|
|
6571
|
-
def delete_row_checkbox(
|
6595
|
+
def delete_row_checkbox(
|
6596
|
+
self,
|
6597
|
+
r: AnyIter[int] | int | Literal["all"] = 0,
|
6598
|
+
) -> None:
|
6572
6599
|
if isinstance(r, str) and r.lower() == "all":
|
6573
6600
|
for r_ in self.MT.row_options:
|
6574
6601
|
self.del_table_row_options_checkbox(r_)
|
@@ -6578,7 +6605,10 @@ class Sheet(tk.Frame):
|
|
6578
6605
|
for r_ in r:
|
6579
6606
|
self.del_table_row_options_checkbox(r_)
|
6580
6607
|
|
6581
|
-
def delete_column_checkbox(
|
6608
|
+
def delete_column_checkbox(
|
6609
|
+
self,
|
6610
|
+
c: AnyIter[int] | int | Literal["all"] = 0,
|
6611
|
+
) -> None:
|
6582
6612
|
if isinstance(c, str) and c.lower() == "all":
|
6583
6613
|
for c_ in self.MT.col_options:
|
6584
6614
|
self.del_table_column_options_checkbox(c_)
|
@@ -6588,7 +6618,10 @@ class Sheet(tk.Frame):
|
|
6588
6618
|
for c_ in c:
|
6589
6619
|
self.del_table_column_options_checkbox(c_)
|
6590
6620
|
|
6591
|
-
def delete_header_checkbox(
|
6621
|
+
def delete_header_checkbox(
|
6622
|
+
self,
|
6623
|
+
c: AnyIter[int] | int | Literal["all"] = 0,
|
6624
|
+
) -> None:
|
6592
6625
|
if isinstance(c, str) and c.lower() == "all":
|
6593
6626
|
for c_ in self.CH.cell_options:
|
6594
6627
|
if "checkbox" in self.CH.cell_options[c_]:
|
@@ -6599,7 +6632,10 @@ class Sheet(tk.Frame):
|
|
6599
6632
|
for c_ in c:
|
6600
6633
|
self.del_header_cell_options_checkbox(c_)
|
6601
6634
|
|
6602
|
-
def delete_index_checkbox(
|
6635
|
+
def delete_index_checkbox(
|
6636
|
+
self,
|
6637
|
+
r: AnyIter[int] | int | Literal["all"] = 0,
|
6638
|
+
) -> None:
|
6603
6639
|
if isinstance(r, str) and r.lower() == "all":
|
6604
6640
|
for r_ in self.RI.cell_options:
|
6605
6641
|
if "checkbox" in self.RI.cell_options[r_]:
|
@@ -6688,7 +6724,7 @@ class Sheet(tk.Frame):
|
|
6688
6724
|
|
6689
6725
|
def dropdown_row(
|
6690
6726
|
self,
|
6691
|
-
r:
|
6727
|
+
r: AnyIter[int] | int | Literal["all"] = 0,
|
6692
6728
|
*args,
|
6693
6729
|
**kwargs,
|
6694
6730
|
) -> Sheet:
|
@@ -6713,7 +6749,7 @@ class Sheet(tk.Frame):
|
|
6713
6749
|
|
6714
6750
|
def dropdown_column(
|
6715
6751
|
self,
|
6716
|
-
c:
|
6752
|
+
c: AnyIter[int] | int | Literal["all"] = 0,
|
6717
6753
|
*args,
|
6718
6754
|
**kwargs,
|
6719
6755
|
) -> Sheet:
|
@@ -6738,7 +6774,7 @@ class Sheet(tk.Frame):
|
|
6738
6774
|
|
6739
6775
|
def create_header_dropdown(
|
6740
6776
|
self,
|
6741
|
-
c:
|
6777
|
+
c: AnyIter[int] | int | Literal["all"] = 0,
|
6742
6778
|
*args,
|
6743
6779
|
**kwargs,
|
6744
6780
|
) -> Sheet:
|
@@ -6762,7 +6798,7 @@ class Sheet(tk.Frame):
|
|
6762
6798
|
|
6763
6799
|
def create_index_dropdown(
|
6764
6800
|
self,
|
6765
|
-
r:
|
6801
|
+
r: AnyIter[int] | int | Literal["all"] = 0,
|
6766
6802
|
*args,
|
6767
6803
|
**kwargs,
|
6768
6804
|
) -> Sheet:
|
@@ -6813,7 +6849,7 @@ class Sheet(tk.Frame):
|
|
6813
6849
|
|
6814
6850
|
def delete_row_dropdown(
|
6815
6851
|
self,
|
6816
|
-
r:
|
6852
|
+
r: AnyIter[int] | int | Literal["all"] = "all",
|
6817
6853
|
) -> None:
|
6818
6854
|
if isinstance(r, str) and r.lower() == "all":
|
6819
6855
|
for r_ in self.MT.row_options:
|
@@ -6827,7 +6863,7 @@ class Sheet(tk.Frame):
|
|
6827
6863
|
|
6828
6864
|
def delete_column_dropdown(
|
6829
6865
|
self,
|
6830
|
-
c:
|
6866
|
+
c: AnyIter[int] | int | Literal["all"] = "all",
|
6831
6867
|
) -> None:
|
6832
6868
|
if isinstance(c, str) and c.lower() == "all":
|
6833
6869
|
for c_ in self.MT.col_options:
|
@@ -6839,7 +6875,7 @@ class Sheet(tk.Frame):
|
|
6839
6875
|
for c_ in c:
|
6840
6876
|
self.del_column_options_dropdown(datacn=c_)
|
6841
6877
|
|
6842
|
-
def delete_header_dropdown(self, c:
|
6878
|
+
def delete_header_dropdown(self, c: AnyIter[int] | int | Literal["all"]) -> None:
|
6843
6879
|
if isinstance(c, str) and c.lower() == "all":
|
6844
6880
|
for c_ in self.CH.cell_options:
|
6845
6881
|
if "dropdown" in self.CH.cell_options[c_]:
|
@@ -6850,7 +6886,7 @@ class Sheet(tk.Frame):
|
|
6850
6886
|
for c_ in c:
|
6851
6887
|
self.del_header_cell_options_dropdown(c_)
|
6852
6888
|
|
6853
|
-
def delete_index_dropdown(self, r:
|
6889
|
+
def delete_index_dropdown(self, r: AnyIter[int] | int | Literal["all"]) -> None:
|
6854
6890
|
if isinstance(r, str) and r.lower() == "all":
|
6855
6891
|
for r_ in self.RI.cell_options:
|
6856
6892
|
if "dropdown" in self.RI.cell_options[r_]:
|
@@ -7079,7 +7115,7 @@ class Sheet(tk.Frame):
|
|
7079
7115
|
|
7080
7116
|
def format_row(
|
7081
7117
|
self,
|
7082
|
-
r:
|
7118
|
+
r: AnyIter[int] | int | Literal["all"],
|
7083
7119
|
formatter_options: dict = {},
|
7084
7120
|
formatter_class: object = None,
|
7085
7121
|
redraw: bool = True,
|
@@ -7109,7 +7145,7 @@ class Sheet(tk.Frame):
|
|
7109
7145
|
|
7110
7146
|
def delete_row_format(
|
7111
7147
|
self,
|
7112
|
-
r:
|
7148
|
+
r: AnyIter[int] | int | Literal["all"] = "all",
|
7113
7149
|
clear_values: bool = False,
|
7114
7150
|
) -> Sheet:
|
7115
7151
|
if is_iterable(r):
|
@@ -7121,7 +7157,7 @@ class Sheet(tk.Frame):
|
|
7121
7157
|
|
7122
7158
|
def format_column(
|
7123
7159
|
self,
|
7124
|
-
c:
|
7160
|
+
c: AnyIter[int] | int | Literal["all"],
|
7125
7161
|
formatter_options: dict = {},
|
7126
7162
|
formatter_class: object = None,
|
7127
7163
|
redraw: bool = True,
|
@@ -7151,7 +7187,7 @@ class Sheet(tk.Frame):
|
|
7151
7187
|
|
7152
7188
|
def delete_column_format(
|
7153
7189
|
self,
|
7154
|
-
c:
|
7190
|
+
c: AnyIter[int] | int | Literal["all"] = "all",
|
7155
7191
|
clear_values: bool = False,
|
7156
7192
|
) -> Sheet:
|
7157
7193
|
if is_iterable(c):
|
@@ -103,6 +103,20 @@ def new_sheet_options() -> DotDict:
|
|
103
103
|
"select_all_bindings": [
|
104
104
|
f"<{ctrl_key}-a>",
|
105
105
|
f"<{ctrl_key}-A>",
|
106
|
+
f"<{ctrl_key}-Shift-space>",
|
107
|
+
],
|
108
|
+
"select_columns_bindings": [
|
109
|
+
"<Control-space>",
|
110
|
+
],
|
111
|
+
"select_rows_bindings": [
|
112
|
+
"<Shift-space>",
|
113
|
+
],
|
114
|
+
"row_start_bindings": [
|
115
|
+
"<Command-Left>",
|
116
|
+
"<Home>",
|
117
|
+
],
|
118
|
+
"table_start_bindings": [
|
119
|
+
f"<{ctrl_key}-Home>",
|
106
120
|
],
|
107
121
|
"tab_bindings": [
|
108
122
|
"<Tab>",
|
@@ -1,3 +1,9 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from collections.abc import (
|
4
|
+
Iterable,
|
5
|
+
Iterator,
|
6
|
+
)
|
1
7
|
from typing import Tuple, Union
|
2
8
|
|
3
9
|
from .other_classes import (
|
@@ -15,3 +21,5 @@ CreateSpanTypes = Union[
|
|
15
21
|
Tuple[int, None, int, None, int, None, int, None],
|
16
22
|
Span,
|
17
23
|
]
|
24
|
+
|
25
|
+
AnyIter = Iterable | Iterator
|
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
|