tksheet 7.2.4__py3-none-any.whl → 7.2.5__py3-none-any.whl
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/__init__.py +2 -1
- tksheet/functions.py +7 -12
- tksheet/main_table.py +27 -27
- tksheet/row_index.py +8 -0
- tksheet/sheet.py +102 -53
- {tksheet-7.2.4.dist-info → tksheet-7.2.5.dist-info}/METADATA +1 -1
- {tksheet-7.2.4.dist-info → tksheet-7.2.5.dist-info}/RECORD +10 -10
- {tksheet-7.2.4.dist-info → tksheet-7.2.5.dist-info}/LICENSE.txt +0 -0
- {tksheet-7.2.4.dist-info → tksheet-7.2.5.dist-info}/WHEEL +0 -0
- {tksheet-7.2.4.dist-info → tksheet-7.2.5.dist-info}/top_level.txt +0 -0
tksheet/__init__.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
tksheet - A Python tkinter table widget
|
5
5
|
"""
|
6
6
|
|
7
|
-
__version__ = "7.2.
|
7
|
+
__version__ = "7.2.5"
|
8
8
|
|
9
9
|
from .colors import (
|
10
10
|
color_map,
|
@@ -53,6 +53,7 @@ from .functions import (
|
|
53
53
|
get_new_indexes,
|
54
54
|
get_seq_without_gaps_at_index,
|
55
55
|
insert_items,
|
56
|
+
is_contiguous,
|
56
57
|
is_iterable,
|
57
58
|
move_elements_by_mapping,
|
58
59
|
move_elements_to,
|
tksheet/functions.py
CHANGED
@@ -412,8 +412,8 @@ def consecutive_ranges(seq: Sequence[int]) -> Generator[tuple[int, int]]:
|
|
412
412
|
yield seq[start], seq[-1] + 1
|
413
413
|
|
414
414
|
|
415
|
-
def is_contiguous(
|
416
|
-
itr = iter(
|
415
|
+
def is_contiguous(iterable: Iterator[int]) -> bool:
|
416
|
+
itr = iter(iterable)
|
417
417
|
prev = next(itr)
|
418
418
|
return all(i == (prev := prev + 1) for i in itr)
|
419
419
|
|
@@ -485,7 +485,6 @@ def move_elements_to(
|
|
485
485
|
return move_elements_by_mapping(
|
486
486
|
seq,
|
487
487
|
*get_new_indexes(
|
488
|
-
len(seq),
|
489
488
|
move_to,
|
490
489
|
to_move,
|
491
490
|
get_inverse=True,
|
@@ -494,19 +493,15 @@ def move_elements_to(
|
|
494
493
|
|
495
494
|
|
496
495
|
def get_new_indexes(
|
497
|
-
seqlen: int,
|
498
496
|
move_to: int,
|
499
497
|
to_move: list[int],
|
500
|
-
keep_len: bool = True,
|
501
498
|
get_inverse: bool = False,
|
502
499
|
) -> tuple[dict]:
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
if
|
507
|
-
|
508
|
-
else:
|
509
|
-
new_idxs = range(move_to - offset, move_to - offset + len(to_move))
|
500
|
+
"""
|
501
|
+
returns {old idx: new idx, ...}
|
502
|
+
"""
|
503
|
+
offset = sum(1 for i in to_move if i < move_to)
|
504
|
+
new_idxs = range(move_to - offset, move_to - offset + len(to_move))
|
510
505
|
new_idxs = {old: new for old, new in zip(to_move, new_idxs)}
|
511
506
|
if get_inverse:
|
512
507
|
return new_idxs, dict(zip(new_idxs.values(), new_idxs))
|
tksheet/main_table.py
CHANGED
@@ -996,18 +996,15 @@ class MainTable(tk.Canvas):
|
|
996
996
|
data_indexes: bool = False,
|
997
997
|
) -> tuple[dict[int, int], dict[int, int], int, dict[int, int]]:
|
998
998
|
if not data_indexes or self.all_columns_displayed:
|
999
|
-
disp_new_idxs = get_new_indexes(
|
1000
|
-
seqlen=len(self.col_positions) - 1,
|
1001
|
-
move_to=move_to,
|
1002
|
-
to_move=to_move,
|
1003
|
-
)
|
999
|
+
disp_new_idxs = get_new_indexes(move_to=move_to, to_move=to_move)
|
1004
1000
|
else:
|
1005
1001
|
disp_new_idxs = {}
|
1006
|
-
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1002
|
+
if not self.all_columns_displayed and not data_indexes:
|
1003
|
+
totalcols = self.equalize_data_row_lengths(at_least_cols=self.datacn(move_to) + 1)
|
1004
|
+
else:
|
1005
|
+
totalcols = self.equalize_data_row_lengths(at_least_cols=move_to + 1)
|
1006
|
+
data_new_idxs = get_new_indexes(move_to=move_to, to_move=to_move)
|
1007
|
+
if not self.all_columns_displayed and not data_indexes:
|
1011
1008
|
moved = {self.displayed_columns[i] for i in to_move}
|
1012
1009
|
data_new_idxs = dict(
|
1013
1010
|
filter(
|
@@ -1233,22 +1230,13 @@ class MainTable(tk.Canvas):
|
|
1233
1230
|
data_indexes: bool = False,
|
1234
1231
|
) -> tuple[dict[int, int], dict[int, int], int, dict[int, int]]:
|
1235
1232
|
if not data_indexes or self.all_rows_displayed:
|
1236
|
-
disp_new_idxs = get_new_indexes(
|
1237
|
-
seqlen=len(self.row_positions) - 1,
|
1238
|
-
move_to=move_to,
|
1239
|
-
to_move=to_move,
|
1240
|
-
)
|
1233
|
+
disp_new_idxs = get_new_indexes(move_to=move_to, to_move=to_move)
|
1241
1234
|
else:
|
1242
1235
|
disp_new_idxs = {}
|
1243
|
-
self.fix_data_len(move_to)
|
1244
|
-
totalrows = max(
|
1245
|
-
|
1246
|
-
|
1247
|
-
)
|
1248
|
-
if self.all_rows_displayed or data_indexes:
|
1249
|
-
data_new_idxs = get_new_indexes(seqlen=totalrows, move_to=move_to, to_move=to_move)
|
1250
|
-
elif not self.all_rows_displayed and not data_indexes:
|
1251
|
-
data_new_idxs = get_new_indexes(seqlen=len(self.displayed_rows), move_to=move_to, to_move=to_move)
|
1236
|
+
self.fix_data_len(self.datarn(move_to) if not self.all_rows_displayed and not data_indexes else move_to)
|
1237
|
+
totalrows = max(self.total_data_rows(), len(self.row_positions) - 1)
|
1238
|
+
data_new_idxs = get_new_indexes(move_to=move_to, to_move=to_move)
|
1239
|
+
if not self.all_rows_displayed and not data_indexes:
|
1252
1240
|
moved = {self.displayed_rows[i] for i in to_move}
|
1253
1241
|
data_new_idxs = dict(
|
1254
1242
|
filter(
|
@@ -1284,7 +1272,7 @@ class MainTable(tk.Canvas):
|
|
1284
1272
|
len(self.row_positions) - 1,
|
1285
1273
|
max(data_new_idxs.values(), default=0),
|
1286
1274
|
)
|
1287
|
-
self.fix_data_len(totalrows)
|
1275
|
+
self.fix_data_len(totalrows - 1)
|
1288
1276
|
if event_data is None:
|
1289
1277
|
event_data = event_dict(
|
1290
1278
|
name="move_rows",
|
@@ -4373,7 +4361,7 @@ class MainTable(tk.Canvas):
|
|
4373
4361
|
create_ops=create_ops,
|
4374
4362
|
)
|
4375
4363
|
if create_selections:
|
4376
|
-
self.deselect("all")
|
4364
|
+
self.deselect("all", redraw=False)
|
4377
4365
|
for boxst, boxend in consecutive_ranges(tuple(reversed(column_widths))):
|
4378
4366
|
self.create_selection_box(
|
4379
4367
|
0,
|
@@ -4517,7 +4505,7 @@ class MainTable(tk.Canvas):
|
|
4517
4505
|
create_ops=create_ops,
|
4518
4506
|
)
|
4519
4507
|
if create_selections:
|
4520
|
-
self.deselect("all")
|
4508
|
+
self.deselect("all", redraw=False)
|
4521
4509
|
for boxst, boxend in consecutive_ranges(tuple(reversed(row_heights))):
|
4522
4510
|
self.create_selection_box(
|
4523
4511
|
boxst,
|
@@ -6378,6 +6366,18 @@ class MainTable(tk.Canvas):
|
|
6378
6366
|
for c in range(box.coords.from_c, box.coords.upto_c)
|
6379
6367
|
}
|
6380
6368
|
|
6369
|
+
def gen_selected_cells(
|
6370
|
+
self,
|
6371
|
+
get_rows: bool = False,
|
6372
|
+
get_cols: bool = False,
|
6373
|
+
) -> Generator[tuple[int, int]]:
|
6374
|
+
yield from (
|
6375
|
+
(r, c)
|
6376
|
+
for item, box in self.get_selection_items(rows=get_rows, columns=get_cols)
|
6377
|
+
for r in range(box.coords.from_r, box.coords.upto_r)
|
6378
|
+
for c in range(box.coords.from_c, box.coords.upto_c)
|
6379
|
+
)
|
6380
|
+
|
6381
6381
|
def get_all_selection_boxes(self) -> tuple[tuple[int, int, int, int]]:
|
6382
6382
|
return tuple(box.coords for item, box in self.get_selection_items())
|
6383
6383
|
|
tksheet/row_index.py
CHANGED
@@ -2488,6 +2488,14 @@ class RowIndex(tk.Canvas):
|
|
2488
2488
|
):
|
2489
2489
|
yield from self.get_iid_descendants(cnode.iid, check_open)
|
2490
2490
|
|
2491
|
+
def items_parent(self, iid: str) -> str:
|
2492
|
+
if self.tree[iid].parent:
|
2493
|
+
return self.tree[iid].parent.iid
|
2494
|
+
return ""
|
2495
|
+
|
2496
|
+
def gen_top_nodes(self) -> Generator[Node]:
|
2497
|
+
yield from (node for node in self.MT._row_index if node.parent == "")
|
2498
|
+
|
2491
2499
|
def get_treeview_indent(self, iid: str) -> int:
|
2492
2500
|
if isinstance(self.PAR.ops.treeview_indent, str):
|
2493
2501
|
indent = self.MT.index_txt_width * int(self.PAR.ops.treeview_indent)
|
tksheet/sheet.py
CHANGED
@@ -19,6 +19,7 @@ from .column_headers import ColumnHeaders
|
|
19
19
|
from .functions import (
|
20
20
|
add_highlight,
|
21
21
|
add_to_options,
|
22
|
+
consecutive_ranges,
|
22
23
|
convert_align,
|
23
24
|
data_to_displayed_idxs,
|
24
25
|
del_from_options,
|
@@ -2440,23 +2441,29 @@ class Sheet(tk.Frame):
|
|
2440
2441
|
include_header=include_header,
|
2441
2442
|
)
|
2442
2443
|
|
2443
|
-
def full_move_rows_idxs(self, data_idxs: dict[int, int]) -> dict[int, int]:
|
2444
|
+
def full_move_rows_idxs(self, data_idxs: dict[int, int], max_idx: int | None = None) -> dict[int, int]:
|
2444
2445
|
"""
|
2445
2446
|
Converts the dict provided by moving rows event data
|
2446
2447
|
Under the keys ['moved']['rows']['data']
|
2447
2448
|
Into a dict of {old index: new index} for every row
|
2448
2449
|
Includes row numbers in cell options, spans, etc.
|
2449
2450
|
"""
|
2450
|
-
return self.MT.get_full_new_idxs(
|
2451
|
+
return self.MT.get_full_new_idxs(
|
2452
|
+
self.MT.get_max_row_idx() if max_idx is None else max_idx,
|
2453
|
+
data_idxs,
|
2454
|
+
)
|
2451
2455
|
|
2452
|
-
def full_move_columns_idxs(self, data_idxs: dict[int, int]) -> dict[int, int]:
|
2456
|
+
def full_move_columns_idxs(self, data_idxs: dict[int, int], max_idx: int | None = None) -> dict[int, int]:
|
2453
2457
|
"""
|
2454
2458
|
Converts the dict provided by moving columns event data
|
2455
2459
|
Under the keys ['moved']['columns']['data']
|
2456
2460
|
Into a dict of {old index: new index} for every column
|
2457
2461
|
Includes column numbers in cell options, spans, etc.
|
2458
2462
|
"""
|
2459
|
-
return self.MT.get_full_new_idxs(
|
2463
|
+
return self.MT.get_full_new_idxs(
|
2464
|
+
self.MT.get_max_column_idx() if max_idx is None else max_idx,
|
2465
|
+
data_idxs,
|
2466
|
+
)
|
2460
2467
|
|
2461
2468
|
# Highlighting Cells
|
2462
2469
|
|
@@ -3005,8 +3012,8 @@ class Sheet(tk.Frame):
|
|
3005
3012
|
box=selected[3],
|
3006
3013
|
)
|
3007
3014
|
else:
|
3008
|
-
self.MT.deselect()
|
3009
|
-
return self
|
3015
|
+
self.MT.deselect(redraw=False)
|
3016
|
+
return self.set_refresh_timer()
|
3010
3017
|
|
3011
3018
|
def get_selected_rows(
|
3012
3019
|
self,
|
@@ -3053,6 +3060,13 @@ class Sheet(tk.Frame):
|
|
3053
3060
|
)
|
3054
3061
|
return self.MT.get_selected_cells(get_rows=get_rows, get_cols=get_columns)
|
3055
3062
|
|
3063
|
+
def gen_selected_cells(
|
3064
|
+
self,
|
3065
|
+
get_rows: bool = False,
|
3066
|
+
get_columns: bool = False,
|
3067
|
+
) -> Generator[tuple[int, int]]:
|
3068
|
+
yield from self.MT.gen_selected_cells(get_rows=get_rows, get_cols=get_columns)
|
3069
|
+
|
3056
3070
|
def get_all_selection_boxes(self) -> tuple[tuple[int, int, int, int]]:
|
3057
3071
|
return self.MT.get_all_selection_boxes()
|
3058
3072
|
|
@@ -3065,11 +3079,11 @@ class Sheet(tk.Frame):
|
|
3065
3079
|
|
3066
3080
|
@boxes.setter
|
3067
3081
|
def boxes(self, boxes: Sequence[tuple[tuple[int, int, int, int], str]]) -> Sheet:
|
3068
|
-
self.MT.deselect()
|
3082
|
+
self.MT.deselect(redraw=False)
|
3069
3083
|
self.MT.reselect_from_get_boxes(
|
3070
3084
|
boxes={box[0] if isinstance(box[0], tuple) else tuple(box[0]): box[1] for box in boxes}
|
3071
3085
|
)
|
3072
|
-
return self
|
3086
|
+
return self.set_refresh_timer()
|
3073
3087
|
|
3074
3088
|
@property
|
3075
3089
|
def canvas_boxes(self) -> dict[int, SelectionBox]:
|
@@ -4700,6 +4714,7 @@ class Sheet(tk.Frame):
|
|
4700
4714
|
create_selections=False,
|
4701
4715
|
fill=False,
|
4702
4716
|
push_ops=push_ops,
|
4717
|
+
redraw=False,
|
4703
4718
|
)
|
4704
4719
|
self.MT.all_rows_displayed = False
|
4705
4720
|
self.MT.displayed_rows = list(range(len(self.MT._row_index)))
|
@@ -4740,9 +4755,8 @@ class Sheet(tk.Frame):
|
|
4740
4755
|
open_ids = set(filter(self.exists, map(str.lower, open_ids)))
|
4741
4756
|
self.RI.tree_open_ids = set()
|
4742
4757
|
if open_ids:
|
4743
|
-
to_open = self._tree_open(open_ids)
|
4744
4758
|
self.show_rows(
|
4745
|
-
rows=
|
4759
|
+
rows=self._tree_open(open_ids),
|
4746
4760
|
redraw=False,
|
4747
4761
|
deselect_all=False,
|
4748
4762
|
)
|
@@ -4991,13 +5005,11 @@ class Sheet(tk.Frame):
|
|
4991
5005
|
self.move(iid, parent)
|
4992
5006
|
return self
|
4993
5007
|
|
4994
|
-
def
|
4995
|
-
|
4996
|
-
|
4997
|
-
|
4998
|
-
|
4999
|
-
return rn
|
5000
|
-
wo_par += 1
|
5008
|
+
def top_index_row(self, index: int) -> int:
|
5009
|
+
try:
|
5010
|
+
return next(self.RI.tree_rns[n.iid] for i, n in enumerate(self.RI.gen_top_nodes()) if i == index)
|
5011
|
+
except Exception:
|
5012
|
+
return None
|
5001
5013
|
|
5002
5014
|
def move(self, item: str, parent: str, index: int | None = None) -> Sheet:
|
5003
5015
|
"""
|
@@ -5020,8 +5032,6 @@ class Sheet(tk.Frame):
|
|
5020
5032
|
index = len(parent_node.children) - 1
|
5021
5033
|
item_r = self.RI.tree_rns[item]
|
5022
5034
|
new_r = self.RI.tree_rns[parent_node.children[index].iid]
|
5023
|
-
if item_node not in parent_node.children:
|
5024
|
-
new_r += 1
|
5025
5035
|
new_r_desc = sum(1 for _ in self.RI.get_iid_descendants(parent_node.children[index].iid))
|
5026
5036
|
item_desc = sum(1 for _ in self.RI.get_iid_descendants(item))
|
5027
5037
|
if item_r < new_r:
|
@@ -5029,6 +5039,8 @@ class Sheet(tk.Frame):
|
|
5029
5039
|
else:
|
5030
5040
|
r_ctr = new_r
|
5031
5041
|
else:
|
5042
|
+
if index is None:
|
5043
|
+
index = 0
|
5032
5044
|
r_ctr = self.RI.tree_rns[parent_node.iid] + 1
|
5033
5045
|
mapping[item_r] = r_ctr
|
5034
5046
|
if parent in self.RI.tree_open_ids and self.item_displayed(parent):
|
@@ -5039,11 +5051,19 @@ class Sheet(tk.Frame):
|
|
5039
5051
|
if to_show and self.RI.ancestors_all_open(did, item_node.parent):
|
5040
5052
|
to_show.append(r_ctr)
|
5041
5053
|
r_ctr += 1
|
5042
|
-
self.RI.
|
5043
|
-
|
5044
|
-
|
5054
|
+
if parent == self.RI.items_parent(item):
|
5055
|
+
pop_index = parent_node.children.index(item_node)
|
5056
|
+
parent_node.children.insert(index, parent_node.children.pop(pop_index))
|
5057
|
+
else:
|
5058
|
+
self.RI.remove_node_from_parents_children(item_node)
|
5059
|
+
item_node.parent = parent_node
|
5060
|
+
parent_node.children.insert(index, item_node)
|
5045
5061
|
else:
|
5046
|
-
|
5062
|
+
if index is None:
|
5063
|
+
new_r = self.top_index_row((sum(1 for _ in self.RI.gen_top_nodes()) - 1))
|
5064
|
+
else:
|
5065
|
+
if (new_r := self.top_index_row(index)) is None:
|
5066
|
+
new_r = self.top_index_row((sum(1 for _ in self.RI.gen_top_nodes()) - 1))
|
5047
5067
|
item_r = self.RI.tree_rns[item]
|
5048
5068
|
if item_r < new_r:
|
5049
5069
|
par_desc = sum(1 for _ in self.RI.get_iid_descendants(self.rowitem(new_r, data_index=True)))
|
@@ -5086,7 +5106,7 @@ class Sheet(tk.Frame):
|
|
5086
5106
|
if (item := item.lower()) not in self.RI.tree:
|
5087
5107
|
raise ValueError(f"Item '{item}' does not exist.")
|
5088
5108
|
if not self.RI.tree[item].parent:
|
5089
|
-
return
|
5109
|
+
return next(index for index, node in enumerate(self.RI.gen_top_nodes()) if node == self.RI.tree[item])
|
5090
5110
|
return self.RI.tree[item].parent.children.index(self.RI.tree[item])
|
5091
5111
|
|
5092
5112
|
def item_displayed(self, item: str) -> bool:
|
@@ -5098,7 +5118,7 @@ class Sheet(tk.Frame):
|
|
5098
5118
|
raise ValueError(f"Item '{item}' does not exist.")
|
5099
5119
|
return self.RI.tree_rns[item] in self.MT.displayed_rows
|
5100
5120
|
|
5101
|
-
def display_item(self, item: str) -> Sheet:
|
5121
|
+
def display_item(self, item: str, redraw=False) -> Sheet:
|
5102
5122
|
"""
|
5103
5123
|
Ensure that item is displayed in the tree
|
5104
5124
|
- Opens all of an item's ancestors
|
@@ -5109,16 +5129,22 @@ class Sheet(tk.Frame):
|
|
5109
5129
|
raise ValueError(f"Item '{item}' does not exist.")
|
5110
5130
|
if self.RI.tree[item].parent:
|
5111
5131
|
for iid in self.RI.get_iid_ancestors(item):
|
5112
|
-
self.item(iid, open_=True)
|
5132
|
+
self.item(iid, open_=True, redraw=False)
|
5133
|
+
return self.set_refresh_timer(redraw)
|
5113
5134
|
|
5114
|
-
def scroll_to_item(self, item: str) -> Sheet:
|
5135
|
+
def scroll_to_item(self, item: str, redraw=False) -> Sheet:
|
5115
5136
|
"""
|
5116
5137
|
Scrolls to an item and ensures that it is displayed
|
5117
5138
|
"""
|
5118
5139
|
if (item := item.lower()) not in self.RI.tree:
|
5119
5140
|
raise ValueError(f"Item '{item}' does not exist.")
|
5120
|
-
self.display_item(item)
|
5121
|
-
self.see(
|
5141
|
+
self.display_item(item, redraw=False)
|
5142
|
+
self.see(
|
5143
|
+
row=bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]),
|
5144
|
+
keep_xscroll=True,
|
5145
|
+
redraw=False,
|
5146
|
+
)
|
5147
|
+
return self.set_refresh_timer(redraw)
|
5122
5148
|
|
5123
5149
|
def selection(self, cells: bool = False) -> list[str]:
|
5124
5150
|
"""
|
@@ -5129,45 +5155,68 @@ class Sheet(tk.Frame):
|
|
5129
5155
|
for rn in self.get_selected_rows(get_cells_as_rows=cells)
|
5130
5156
|
]
|
5131
5157
|
|
5132
|
-
def selection_set(self, *items) -> Sheet:
|
5158
|
+
def selection_set(self, *items, redraw: bool = True) -> Sheet:
|
5133
5159
|
if any(item.lower() in self.RI.tree for item in unpack(items)):
|
5134
|
-
self.deselect()
|
5135
|
-
self.selection_add(*items)
|
5136
|
-
return self
|
5160
|
+
self.deselect(redraw=False)
|
5161
|
+
self.selection_add(*items, redraw=False)
|
5162
|
+
return self.set_refresh_timer(redraw)
|
5137
5163
|
|
5138
|
-
def selection_add(self, *items) -> Sheet:
|
5164
|
+
def selection_add(self, *items, redraw: bool = True) -> Sheet:
|
5165
|
+
to_open = []
|
5166
|
+
quick_displayed_check = set(self.MT.displayed_rows)
|
5139
5167
|
for item in unpack(items):
|
5140
|
-
if (item := item.lower()) not in self.RI.tree:
|
5141
|
-
|
5142
|
-
|
5143
|
-
|
5144
|
-
|
5145
|
-
|
5168
|
+
if self.RI.tree_rns[(item := item.lower())] not in quick_displayed_check and self.RI.tree[item].parent:
|
5169
|
+
to_open.extend(list(self.RI.get_iid_ancestors(item)))
|
5170
|
+
if to_open:
|
5171
|
+
self.show_rows(
|
5172
|
+
rows=self._tree_open(to_open),
|
5173
|
+
redraw=False,
|
5174
|
+
deselect_all=False,
|
5175
|
+
)
|
5176
|
+
for startr, endr in consecutive_ranges(
|
5177
|
+
sorted(
|
5178
|
+
bisect_left(
|
5179
|
+
self.MT.displayed_rows,
|
5180
|
+
self.RI.tree_rns[item.lower()],
|
5181
|
+
)
|
5182
|
+
for item in unpack(items)
|
5183
|
+
)
|
5184
|
+
):
|
5185
|
+
self.MT.create_selection_box(
|
5186
|
+
startr,
|
5187
|
+
0,
|
5188
|
+
endr,
|
5189
|
+
len(self.MT.col_positions) - 1,
|
5190
|
+
"rows",
|
5191
|
+
set_current=True,
|
5192
|
+
ext=True,
|
5193
|
+
)
|
5194
|
+
self.MT.run_selection_binding("rows")
|
5195
|
+
return self.set_refresh_timer(redraw)
|
5146
5196
|
|
5147
|
-
def selection_remove(self, *items) -> Sheet:
|
5197
|
+
def selection_remove(self, *items, redraw: bool = True) -> Sheet:
|
5148
5198
|
for item in unpack(items):
|
5149
5199
|
if (item := item.lower()) not in self.RI.tree:
|
5150
5200
|
continue
|
5151
5201
|
try:
|
5152
|
-
self.deselect(bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]))
|
5202
|
+
self.deselect(bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]), redraw=False)
|
5153
5203
|
except Exception:
|
5154
5204
|
continue
|
5155
|
-
return self
|
5205
|
+
return self.set_refresh_timer(redraw)
|
5156
5206
|
|
5157
|
-
def selection_toggle(self, *items) -> Sheet:
|
5207
|
+
def selection_toggle(self, *items, redraw: bool = True) -> Sheet:
|
5158
5208
|
selected = set(self.MT._row_index[self.displayed_row_to_data(rn)].iid for rn in self.get_selected_rows())
|
5159
5209
|
add = []
|
5160
5210
|
remove = []
|
5161
5211
|
for item in unpack(items):
|
5162
|
-
if (item := item.lower())
|
5163
|
-
|
5164
|
-
|
5165
|
-
|
5166
|
-
|
5167
|
-
|
5168
|
-
self.
|
5169
|
-
self.
|
5170
|
-
return self
|
5212
|
+
if (item := item.lower()) in self.RI.tree:
|
5213
|
+
if item in selected:
|
5214
|
+
remove.append(item)
|
5215
|
+
else:
|
5216
|
+
add.append(item)
|
5217
|
+
self.selection_remove(*remove, redraw=False)
|
5218
|
+
self.selection_add(*add, redraw=False)
|
5219
|
+
return self.set_refresh_timer(redraw)
|
5171
5220
|
|
5172
5221
|
# Functions not in docs
|
5173
5222
|
|
@@ -1,20 +1,20 @@
|
|
1
|
-
tksheet/__init__.py,sha256=
|
1
|
+
tksheet/__init__.py,sha256=jxysTI4P2sqhdCWqckgkzFoja_LNIxd-Xbd57GWir6A,2144
|
2
2
|
tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
|
3
3
|
tksheet/column_headers.py,sha256=PTkKI8OHWn4GzBhPJYU7c8Lz0X52DldV-0J4mPQbjkE,102045
|
4
4
|
tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
|
5
|
-
tksheet/functions.py,sha256=
|
6
|
-
tksheet/main_table.py,sha256=
|
5
|
+
tksheet/functions.py,sha256=Ie53z5GWbGoUXUiTf0DtoyOadWFbMFXMFwUjM67vetI,40706
|
6
|
+
tksheet/main_table.py,sha256=tC3spF57o_yEc-o5b0USonf25d3dCZT9LS1UFKWfjaU,327559
|
7
7
|
tksheet/other_classes.py,sha256=CDN38ZjKxZro9YOS_g0DjMC82-Mi9udedny4wdd90W0,14347
|
8
|
-
tksheet/row_index.py,sha256=
|
9
|
-
tksheet/sheet.py,sha256=
|
8
|
+
tksheet/row_index.py,sha256=IdmELtqq5siD2dLtCMdP2IkW6XljCVJyBwZo3GFWoOE,108497
|
9
|
+
tksheet/sheet.py,sha256=hWNp4E0UtbUbbbBNfTOecfadGWoWrRbxbfcLQEVW7pw,272364
|
10
10
|
tksheet/sheet_options.py,sha256=Azo7_-H0e0ssYEoU7Mq_OWy3S-U05rp4_6Q2E2Ffuu8,12262
|
11
11
|
tksheet/text_editor.py,sha256=aRm1Y5GfORiEAJthtN1uQ30CT3VoF8mRWvR-SIXPrJU,6548
|
12
12
|
tksheet/themes.py,sha256=N9nAj6vcWk4UdcrAakvz2LPbJEJWXdv3j7Om6AnvX5k,14474
|
13
13
|
tksheet/top_left_rectangle.py,sha256=o-M6i5NjaJwo60tV-BDP9SbaT1CzQNoPjuoC7p-nb5Q,8436
|
14
14
|
tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
|
15
15
|
tksheet/vars.py,sha256=86ubZZElsnQuC6Lv6bW2lt2NhD9wAp6PxtkK7ufKqq0,3452
|
16
|
-
tksheet-7.2.
|
17
|
-
tksheet-7.2.
|
18
|
-
tksheet-7.2.
|
19
|
-
tksheet-7.2.
|
20
|
-
tksheet-7.2.
|
16
|
+
tksheet-7.2.5.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
|
17
|
+
tksheet-7.2.5.dist-info/METADATA,sha256=svT0ORmBRA9KUD05sBQFVDLkvLBjFWicOi-pJvnw3HQ,6284
|
18
|
+
tksheet-7.2.5.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
19
|
+
tksheet-7.2.5.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
|
20
|
+
tksheet-7.2.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|