tksheet 7.4.3__py3-none-any.whl → 7.4.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 -2
- tksheet/column_headers.py +74 -69
- tksheet/constants.py +2 -2
- tksheet/formatters.py +20 -36
- tksheet/functions.py +37 -47
- tksheet/main_table.py +239 -376
- tksheet/other_classes.py +10 -16
- tksheet/row_index.py +116 -83
- tksheet/sheet.py +133 -152
- tksheet/sheet_options.py +2 -0
- tksheet/sorting.py +279 -66
- tksheet/text_editor.py +9 -3
- tksheet/top_left_rectangle.py +5 -6
- {tksheet-7.4.3.dist-info → tksheet-7.4.5.dist-info}/METADATA +4 -2
- tksheet-7.4.5.dist-info/RECORD +22 -0
- {tksheet-7.4.3.dist-info → tksheet-7.4.5.dist-info}/WHEEL +1 -1
- tksheet-7.4.3.dist-info/RECORD +0 -22
- {tksheet-7.4.3.dist-info → tksheet-7.4.5.dist-info}/LICENSE.txt +0 -0
- {tksheet-7.4.3.dist-info → tksheet-7.4.5.dist-info}/top_level.txt +0 -0
tksheet/main_table.py
CHANGED
@@ -50,7 +50,6 @@ from .functions import (
|
|
50
50
|
consecutive_ranges,
|
51
51
|
data_to_displayed_idxs,
|
52
52
|
diff_gen,
|
53
|
-
diff_list,
|
54
53
|
down_cell_within_box,
|
55
54
|
event_dict,
|
56
55
|
event_has_char_key,
|
@@ -72,6 +71,7 @@ from .functions import (
|
|
72
71
|
mod_span,
|
73
72
|
mod_span_widget,
|
74
73
|
move_elements_by_mapping,
|
74
|
+
move_elements_by_mapping_gen,
|
75
75
|
new_tk_event,
|
76
76
|
next_cell,
|
77
77
|
push_n,
|
@@ -122,7 +122,7 @@ class MainTable(tk.Canvas):
|
|
122
122
|
self.PAR_height = 0
|
123
123
|
self.cells_cache = None
|
124
124
|
self.table_txt_height, self.index_txt_height, self.header_txt_height = 0, 0, 0
|
125
|
-
self.scrollregion =
|
125
|
+
self.scrollregion = ()
|
126
126
|
self.current_cursor = ""
|
127
127
|
self.ctrl_b1_pressed = False
|
128
128
|
self.b1_pressed_loc = None
|
@@ -164,7 +164,7 @@ class MainTable(tk.Canvas):
|
|
164
164
|
self.hidd_boxes = set()
|
165
165
|
|
166
166
|
self.selection_boxes = {}
|
167
|
-
self.selected =
|
167
|
+
self.selected = ()
|
168
168
|
self.named_spans = {}
|
169
169
|
self.reset_tags()
|
170
170
|
self.cell_options = {}
|
@@ -305,14 +305,13 @@ class MainTable(tk.Canvas):
|
|
305
305
|
self.data = kwargs["data_reference"]
|
306
306
|
else:
|
307
307
|
self.data = []
|
308
|
-
if not self.data
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
)
|
315
|
-
self.data = [list(repeat("", kwargs["total_cols"])) for i in range(kwargs["total_rows"])]
|
308
|
+
if not self.data and (
|
309
|
+
isinstance(kwargs["total_rows"], int)
|
310
|
+
and isinstance(kwargs["total_cols"], int)
|
311
|
+
and kwargs["total_rows"] > 0
|
312
|
+
and kwargs["total_cols"] > 0
|
313
|
+
):
|
314
|
+
self.data = [list(repeat("", kwargs["total_cols"])) for i in range(kwargs["total_rows"])]
|
316
315
|
_header = kwargs["header"] if kwargs["header"] is not None else kwargs["headers"]
|
317
316
|
if isinstance(_header, int):
|
318
317
|
self._headers = _header
|
@@ -336,14 +335,14 @@ class MainTable(tk.Canvas):
|
|
336
335
|
self.set_col_positions(itr=[])
|
337
336
|
self.set_row_positions(itr=[])
|
338
337
|
self.display_rows(
|
339
|
-
rows=kwargs["displayed_rows"],
|
338
|
+
rows=kwargs["displayed_rows"] if isinstance(kwargs["displayed_rows"], list) else [],
|
340
339
|
all_rows_displayed=kwargs["all_rows_displayed"],
|
341
340
|
reset_row_positions=False,
|
342
341
|
deselect_all=False,
|
343
342
|
)
|
344
343
|
self.reset_row_positions()
|
345
344
|
self.display_columns(
|
346
|
-
columns=kwargs["displayed_columns"],
|
345
|
+
columns=kwargs["displayed_columns"] if isinstance(kwargs["displayed_columns"], list) else [],
|
347
346
|
all_columns_displayed=kwargs["all_columns_displayed"],
|
348
347
|
reset_col_positions=False,
|
349
348
|
deselect_all=False,
|
@@ -551,15 +550,7 @@ class MainTable(tk.Canvas):
|
|
551
550
|
self.set_currently_selected(row, column, item=item)
|
552
551
|
else:
|
553
552
|
self.select_cell(row, column, redraw=False)
|
554
|
-
if not self.see(
|
555
|
-
row,
|
556
|
-
column,
|
557
|
-
keep_yscroll=False,
|
558
|
-
keep_xscroll=False,
|
559
|
-
bottom_right_corner=False,
|
560
|
-
check_cell_visibility=True,
|
561
|
-
redraw=True,
|
562
|
-
):
|
553
|
+
if not self.see(row, column):
|
563
554
|
self.refresh()
|
564
555
|
return coords
|
565
556
|
|
@@ -817,7 +808,7 @@ class MainTable(tk.Canvas):
|
|
817
808
|
if self.selected.type_ in ("cells", "columns"):
|
818
809
|
for rn in range(maxrows):
|
819
810
|
row = []
|
820
|
-
for r1, c1,
|
811
|
+
for r1, c1, _, c2 in boxes:
|
821
812
|
datarn = (r1 + rn) if self.all_rows_displayed else self.displayed_rows[r1 + rn]
|
822
813
|
for c in range(c1, c2):
|
823
814
|
datacn = self.datacn(c)
|
@@ -932,19 +923,21 @@ class MainTable(tk.Canvas):
|
|
932
923
|
def sort_boxes(
|
933
924
|
self,
|
934
925
|
event: tk.Event | None = None,
|
935
|
-
boxes:
|
926
|
+
boxes: dict[tuple[int, int, int, int], Literal["cells", "rows", "columns"]] | None = None,
|
936
927
|
reverse: bool = False,
|
937
928
|
row_wise: bool = False,
|
938
929
|
validation: bool = True,
|
939
930
|
key: Callable | None = None,
|
940
931
|
undo: bool = True,
|
941
932
|
) -> EventDataDict:
|
942
|
-
if boxes
|
933
|
+
if not boxes:
|
943
934
|
boxes = self.get_boxes()
|
944
935
|
if not boxes:
|
945
|
-
boxes =
|
936
|
+
boxes = {Box_nt(0, 0, len(self.row_positions) - 1, len(self.col_positions) - 1): "cells"}
|
946
937
|
event_data = self.new_event_dict("edit_table", boxes=boxes)
|
947
938
|
try_binding(self.extra_begin_sort_cells_func, event_data)
|
939
|
+
if key is None:
|
940
|
+
key = self.PAR.ops.sort_key
|
948
941
|
for r1, c1, r2, c2 in boxes:
|
949
942
|
data = sort_selection(
|
950
943
|
[[self.get_cell_data(self.datarn(r), self.datacn(c)) for c in range(c1, c2)] for r in range(r1, r2)],
|
@@ -1041,23 +1034,21 @@ class MainTable(tk.Canvas):
|
|
1041
1034
|
added_rows = 0
|
1042
1035
|
added_cols = 0
|
1043
1036
|
total_data_cols = None
|
1044
|
-
if self.PAR.ops.paste_can_expand_x:
|
1045
|
-
|
1046
|
-
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
)
|
1052
|
-
|
1053
|
-
|
1054
|
-
if
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
):
|
1060
|
-
added_rows = self.PAR.ops.paste_insert_row_limit - len(self.row_positions) - 1
|
1037
|
+
if self.PAR.ops.paste_can_expand_x and selected_c + new_data_numcols > len(self.col_positions) - 1:
|
1038
|
+
total_data_cols = self.equalize_data_row_lengths()
|
1039
|
+
added_cols = selected_c + new_data_numcols - len(self.col_positions) + 1
|
1040
|
+
if (
|
1041
|
+
isinstance(self.PAR.ops.paste_insert_column_limit, int)
|
1042
|
+
and self.PAR.ops.paste_insert_column_limit < len(self.col_positions) - 1 + added_cols
|
1043
|
+
):
|
1044
|
+
added_cols = self.PAR.ops.paste_insert_column_limit - len(self.col_positions) - 1
|
1045
|
+
if self.PAR.ops.paste_can_expand_y and selected_r + new_data_numrows > len(self.row_positions) - 1:
|
1046
|
+
added_rows = selected_r + new_data_numrows - len(self.row_positions) + 1
|
1047
|
+
if (
|
1048
|
+
isinstance(self.PAR.ops.paste_insert_row_limit, int)
|
1049
|
+
and self.PAR.ops.paste_insert_row_limit < len(self.row_positions) - 1 + added_rows
|
1050
|
+
):
|
1051
|
+
added_rows = self.PAR.ops.paste_insert_row_limit - len(self.row_positions) - 1
|
1061
1052
|
if selected_c + new_data_numcols > len(self.col_positions) - 1:
|
1062
1053
|
adjusted_new_data_numcols = len(self.col_positions) - 1 - selected_c
|
1063
1054
|
else:
|
@@ -1200,14 +1191,8 @@ class MainTable(tk.Canvas):
|
|
1200
1191
|
event_data=event_data,
|
1201
1192
|
mod_event_boxes=False,
|
1202
1193
|
)
|
1203
|
-
if added_rows
|
1204
|
-
|
1205
|
-
else:
|
1206
|
-
selboxr = selected_r_adjusted_new_data_numrows
|
1207
|
-
if added_cols:
|
1208
|
-
selboxc = selected_c + new_data_numcols
|
1209
|
-
else:
|
1210
|
-
selboxc = selected_c_adjusted_new_data_numcols
|
1194
|
+
selboxr = selected_r + new_data_numrows if added_rows else selected_r_adjusted_new_data_numrows
|
1195
|
+
selboxc = selected_c + new_data_numcols if added_cols else selected_c_adjusted_new_data_numcols
|
1211
1196
|
self.deselect("all", redraw=False)
|
1212
1197
|
self.set_currently_selected(
|
1213
1198
|
*curr_coords,
|
@@ -1223,15 +1208,7 @@ class MainTable(tk.Canvas):
|
|
1223
1208
|
)
|
1224
1209
|
event_data["selection_boxes"] = self.get_boxes()
|
1225
1210
|
event_data["selected"] = self.selected
|
1226
|
-
self.see(
|
1227
|
-
r=selected_r,
|
1228
|
-
c=selected_c,
|
1229
|
-
keep_yscroll=False,
|
1230
|
-
keep_xscroll=False,
|
1231
|
-
bottom_right_corner=False,
|
1232
|
-
check_cell_visibility=True,
|
1233
|
-
redraw=False,
|
1234
|
-
)
|
1211
|
+
self.see(selected_r, selected_c, redraw=False)
|
1235
1212
|
self.refresh()
|
1236
1213
|
if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
|
1237
1214
|
self.undo_stack.append(stored_event_dict(event_data))
|
@@ -1287,26 +1264,36 @@ class MainTable(tk.Canvas):
|
|
1287
1264
|
data_indexes: bool = False,
|
1288
1265
|
) -> tuple[dict[int, int], dict[int, int], int, dict[int, int]]:
|
1289
1266
|
if not data_indexes or self.all_columns_displayed:
|
1290
|
-
disp_new_idxs = get_new_indexes(
|
1267
|
+
disp_new_idxs = get_new_indexes(
|
1268
|
+
move_to=move_to,
|
1269
|
+
to_move=to_move,
|
1270
|
+
)
|
1271
|
+
data_new_idxs = dict(disp_new_idxs)
|
1291
1272
|
else:
|
1292
1273
|
disp_new_idxs = {}
|
1274
|
+
data_new_idxs = get_new_indexes(
|
1275
|
+
move_to=move_to,
|
1276
|
+
to_move=to_move,
|
1277
|
+
)
|
1293
1278
|
# at_least_cols should not be len in this case as move_to can be len
|
1294
1279
|
fix_len = (move_to - 1) if move_to else move_to
|
1295
1280
|
if not self.all_columns_displayed and not data_indexes:
|
1296
1281
|
fix_len = self.datacn(fix_len)
|
1297
1282
|
totalcols = self.equalize_data_row_lengths(at_least_cols=fix_len)
|
1298
|
-
data_new_idxs = get_new_indexes(move_to=move_to, to_move=to_move)
|
1299
1283
|
if not self.all_columns_displayed and not data_indexes:
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1284
|
+
keep = set(map(self.datacn, to_move))
|
1285
|
+
data_new_idxs = {
|
1286
|
+
k: v
|
1287
|
+
for k, v in zip(
|
1288
|
+
move_elements_by_mapping_gen(
|
1303
1289
|
self.displayed_columns,
|
1304
1290
|
data_new_idxs,
|
1305
1291
|
dict(zip(data_new_idxs.values(), data_new_idxs)),
|
1306
1292
|
),
|
1307
1293
|
self.displayed_columns,
|
1308
|
-
)
|
1309
|
-
|
1294
|
+
)
|
1295
|
+
if k in keep
|
1296
|
+
}
|
1310
1297
|
return data_new_idxs, dict(zip(data_new_idxs.values(), data_new_idxs)), totalcols, disp_new_idxs
|
1311
1298
|
|
1312
1299
|
def move_columns_adjust_options_dict(
|
@@ -1338,7 +1325,7 @@ class MainTable(tk.Canvas):
|
|
1338
1325
|
|
1339
1326
|
if move_widths and disp_new_idxs:
|
1340
1327
|
self.set_col_positions(
|
1341
|
-
itr=
|
1328
|
+
itr=move_elements_by_mapping_gen(
|
1342
1329
|
self.get_column_widths(),
|
1343
1330
|
disp_new_idxs,
|
1344
1331
|
dict(
|
@@ -1409,7 +1396,7 @@ class MainTable(tk.Canvas):
|
|
1409
1396
|
"c",
|
1410
1397
|
)
|
1411
1398
|
# add cell/col kwargs for columns that are new to the span
|
1412
|
-
old_span_idxs =
|
1399
|
+
old_span_idxs = {full_new_idxs[k] for k in range(span["from_c"], oldupto_colrange)}
|
1413
1400
|
for k in range(newfrom, newupto_colrange):
|
1414
1401
|
if k not in old_span_idxs:
|
1415
1402
|
oldidx = full_old_idxs[k]
|
@@ -1537,7 +1524,7 @@ class MainTable(tk.Canvas):
|
|
1537
1524
|
data_new_idxs = {
|
1538
1525
|
k: v
|
1539
1526
|
for k, v in zip(
|
1540
|
-
|
1527
|
+
move_elements_by_mapping_gen(
|
1541
1528
|
self.displayed_rows,
|
1542
1529
|
data_new_idxs,
|
1543
1530
|
dict(zip(data_new_idxs.values(), data_new_idxs)),
|
@@ -1647,7 +1634,7 @@ class MainTable(tk.Canvas):
|
|
1647
1634
|
"r",
|
1648
1635
|
)
|
1649
1636
|
# add cell/row kwargs for rows that are new to the span
|
1650
|
-
old_span_idxs =
|
1637
|
+
old_span_idxs = {full_new_idxs[k] for k in range(span["from_r"], oldupto_rowrange)}
|
1651
1638
|
for k in range(newfrom, newupto_rowrange):
|
1652
1639
|
if k not in old_span_idxs:
|
1653
1640
|
oldidx = full_old_idxs[k]
|
@@ -1730,9 +1717,9 @@ class MainTable(tk.Canvas):
|
|
1730
1717
|
# finally, change the span coords
|
1731
1718
|
span["from_r"], span["upto_r"] = newfrom, newupto
|
1732
1719
|
|
1733
|
-
if move_heights and disp_new_idxs:
|
1720
|
+
if (not self.PAR.ops.treeview or not undo_modification) and (move_heights and disp_new_idxs):
|
1734
1721
|
self.set_row_positions(
|
1735
|
-
itr=
|
1722
|
+
itr=move_elements_by_mapping_gen(
|
1736
1723
|
self.get_row_heights(),
|
1737
1724
|
disp_new_idxs,
|
1738
1725
|
dict(
|
@@ -1788,7 +1775,7 @@ class MainTable(tk.Canvas):
|
|
1788
1775
|
old_idxs = dict(zip(new_idxs.values(), new_idxs))
|
1789
1776
|
return dict(
|
1790
1777
|
zip(
|
1791
|
-
|
1778
|
+
move_elements_by_mapping_gen(tuple(range(max_idx + 1)), new_idxs, old_idxs),
|
1792
1779
|
range(max_idx + 1),
|
1793
1780
|
)
|
1794
1781
|
)
|
@@ -2036,15 +2023,7 @@ class MainTable(tk.Canvas):
|
|
2036
2023
|
)
|
2037
2024
|
|
2038
2025
|
if self.selected:
|
2039
|
-
self.see(
|
2040
|
-
r=self.selected.row,
|
2041
|
-
c=self.selected.column,
|
2042
|
-
keep_yscroll=False,
|
2043
|
-
keep_xscroll=False,
|
2044
|
-
bottom_right_corner=False,
|
2045
|
-
check_cell_visibility=True,
|
2046
|
-
redraw=False,
|
2047
|
-
)
|
2026
|
+
self.see(self.selected.row, self.selected.column, redraw=False)
|
2048
2027
|
|
2049
2028
|
self.refresh()
|
2050
2029
|
return event_data
|
@@ -2055,18 +2034,27 @@ class MainTable(tk.Canvas):
|
|
2055
2034
|
c: int | None = None,
|
2056
2035
|
keep_yscroll: bool = False,
|
2057
2036
|
keep_xscroll: bool = False,
|
2058
|
-
bottom_right_corner: bool =
|
2037
|
+
bottom_right_corner: bool | None = None,
|
2059
2038
|
check_cell_visibility: bool = True,
|
2060
2039
|
redraw: bool = True,
|
2061
2040
|
r_pc: float = 0.0,
|
2062
2041
|
c_pc: float = 0.0,
|
2063
2042
|
) -> bool:
|
2064
2043
|
need_redraw = False
|
2065
|
-
|
2066
|
-
|
2067
|
-
|
2068
|
-
|
2069
|
-
|
2044
|
+
vis_info = self.cell_visibility_info(r, c)
|
2045
|
+
yvis, xvis = vis_info["yvis"], vis_info["xvis"]
|
2046
|
+
top_left_x, top_left_y, bottom_right_x, bottom_right_y = vis_info["visible_region"]
|
2047
|
+
x1, y1, x2, y2 = vis_info["cell_coords"]
|
2048
|
+
# y scroll
|
2049
|
+
if not check_cell_visibility or (check_cell_visibility and not yvis) and len(self.row_positions) > 1:
|
2050
|
+
if bottom_right_corner is None:
|
2051
|
+
both_above = y1 < top_left_y and y2 < top_left_y
|
2052
|
+
y1_above_y2_below = y1 < top_left_y and y2 > bottom_right_y
|
2053
|
+
y1_above_y2_visible = y1 < top_left_y and top_left_y <= y2 <= bottom_right_y
|
2054
|
+
brc = not (both_above or y1_above_y2_below or y1_above_y2_visible)
|
2055
|
+
else:
|
2056
|
+
brc = bottom_right_corner
|
2057
|
+
if brc:
|
2070
2058
|
if r is not None and not keep_yscroll:
|
2071
2059
|
winfo_height = self.winfo_height()
|
2072
2060
|
if self.row_positions[r + 1] - self.row_positions[r] > winfo_height:
|
@@ -2092,8 +2080,16 @@ class MainTable(tk.Canvas):
|
|
2092
2080
|
]
|
2093
2081
|
self.set_yviews(*args, redraw=False)
|
2094
2082
|
need_redraw = True
|
2095
|
-
|
2096
|
-
|
2083
|
+
# x scroll
|
2084
|
+
if not check_cell_visibility or (check_cell_visibility and not xvis) and len(self.col_positions) > 1:
|
2085
|
+
if bottom_right_corner is None:
|
2086
|
+
both_left = x1 < top_left_x and x2 < top_left_x
|
2087
|
+
x1_left_x2_right = x1 < top_left_x and x2 > bottom_right_x
|
2088
|
+
x1_left_x2_visible = x1 < top_left_x and top_left_x <= x2 <= bottom_right_x
|
2089
|
+
brc = not (both_left or x1_left_x2_right or x1_left_x2_visible)
|
2090
|
+
else:
|
2091
|
+
brc = bottom_right_corner
|
2092
|
+
if brc:
|
2097
2093
|
if c is not None and not keep_xscroll:
|
2098
2094
|
winfo_width = self.winfo_width()
|
2099
2095
|
if self.col_positions[c + 1] - self.col_positions[c] > winfo_width:
|
@@ -2132,17 +2128,24 @@ class MainTable(tk.Canvas):
|
|
2132
2128
|
0 if not r else self.row_positions[r + 1],
|
2133
2129
|
)
|
2134
2130
|
|
2135
|
-
def cell_completely_visible(
|
2131
|
+
def cell_completely_visible(self, r: int | None = 0, c: int | None = 0) -> bool:
|
2132
|
+
cx1, cy1, cx2, cy2 = self.get_canvas_visible_area()
|
2133
|
+
x1, y1, x2, y2 = self.get_cell_coords(r, c)
|
2134
|
+
return cy1 <= y1 and cy2 >= y2 and cx1 <= x1 and cx2 >= x2
|
2135
|
+
|
2136
|
+
def cell_visibility_info(
|
2136
2137
|
self,
|
2137
|
-
r: int
|
2138
|
-
c: int
|
2139
|
-
|
2140
|
-
) -> bool | tuple[bool, bool]:
|
2138
|
+
r: int,
|
2139
|
+
c: int,
|
2140
|
+
) -> dict[Literal["yvis", "xvis", "visible_region", "cell_coords"], bool | tuple[int, int, int, int]]:
|
2141
2141
|
cx1, cy1, cx2, cy2 = self.get_canvas_visible_area()
|
2142
2142
|
x1, y1, x2, y2 = self.get_cell_coords(r, c)
|
2143
|
-
|
2144
|
-
|
2145
|
-
|
2143
|
+
return {
|
2144
|
+
"yvis": cy1 <= y1 and cy2 >= y2,
|
2145
|
+
"xvis": cx1 <= x1 and cx2 >= x2,
|
2146
|
+
"visible_region": (cx1, cy1, cx2, cy2),
|
2147
|
+
"cell_coords": (x1, y1, x2, y2),
|
2148
|
+
}
|
2146
2149
|
|
2147
2150
|
def cell_visible(self, r: int = 0, c: int = 0) -> bool:
|
2148
2151
|
cx1, cy1, cx2, cy2 = self.get_canvas_visible_area()
|
@@ -2289,10 +2292,10 @@ class MainTable(tk.Canvas):
|
|
2289
2292
|
curr_box = self.selected.fill_iid
|
2290
2293
|
if r == "all" or (r is None and c is None and cell is None):
|
2291
2294
|
self.hide_dropdown_editor_all_canvases()
|
2292
|
-
for item,
|
2295
|
+
for item, _ in self.get_selection_items():
|
2293
2296
|
self.hide_selection_box(item)
|
2294
2297
|
elif r in ("allrows", "allcols"):
|
2295
|
-
for item,
|
2298
|
+
for item, _ in self.get_selection_items(
|
2296
2299
|
columns=r == "allcols",
|
2297
2300
|
rows=r == "allrows",
|
2298
2301
|
cells=False,
|
@@ -2517,156 +2520,76 @@ class MainTable(tk.Canvas):
|
|
2517
2520
|
def arrowkey_UP(self, event: object = None) -> None:
|
2518
2521
|
if not self.selected:
|
2519
2522
|
return
|
2520
|
-
|
2521
|
-
|
2522
|
-
|
2523
|
-
|
2524
|
-
|
2525
|
-
|
2526
|
-
|
2527
|
-
|
2528
|
-
elif self.selected.type_ in ("cells", "columns"):
|
2529
|
-
r = self.selected.row
|
2530
|
-
c = self.selected.column
|
2531
|
-
if not r and self.CH.col_selection_enabled and not self.cell_completely_visible(r=r, c=c):
|
2532
|
-
self.see(r, c, check_cell_visibility=False)
|
2533
|
-
elif r and (self.single_selection_enabled or self.toggle_selection_enabled):
|
2534
|
-
if self.cell_completely_visible(r=r - 1, c=c):
|
2535
|
-
self.select_cell(r - 1, c, redraw=True)
|
2536
|
-
else:
|
2537
|
-
self.select_cell(r - 1, c)
|
2538
|
-
self.see(r - 1, c, keep_xscroll=True, check_cell_visibility=False)
|
2523
|
+
r = self.selected.row
|
2524
|
+
c = self.selected.column
|
2525
|
+
if not r:
|
2526
|
+
self.see(r, c)
|
2527
|
+
else:
|
2528
|
+
self.see(r - 1, c, redraw=False)
|
2529
|
+
if self.selected.type_ == "rows" and self.RI.row_selection_enabled:
|
2530
|
+
self.RI.select_row(r - 1, redraw=True)
|
2539
2531
|
|
2540
|
-
|
2532
|
+
elif self.selected.type_ in ("cells", "columns") and (
|
2533
|
+
self.single_selection_enabled or self.toggle_selection_enabled
|
2534
|
+
):
|
2535
|
+
self.select_cell(r - 1, c, redraw=True)
|
2536
|
+
|
2537
|
+
def arrowkey_LEFT(self, event: object = None) -> None:
|
2541
2538
|
if not self.selected:
|
2542
2539
|
return
|
2543
|
-
|
2544
|
-
|
2545
|
-
|
2546
|
-
|
2547
|
-
self.RI.select_row(r + 1, redraw=True)
|
2548
|
-
else:
|
2549
|
-
self.RI.select_row(r + 1)
|
2550
|
-
self.see(
|
2551
|
-
r + 1,
|
2552
|
-
0,
|
2553
|
-
keep_xscroll=True,
|
2554
|
-
bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
|
2555
|
-
check_cell_visibility=False,
|
2556
|
-
)
|
2557
|
-
|
2558
|
-
elif self.selected.type_ == "columns":
|
2559
|
-
c = self.selected.column
|
2560
|
-
if self.single_selection_enabled or self.toggle_selection_enabled:
|
2561
|
-
if self.selected.row == len(self.row_positions) - 2:
|
2562
|
-
r = self.selected.row
|
2563
|
-
else:
|
2564
|
-
r = self.selected.row + 1
|
2565
|
-
if self.cell_completely_visible(r=r, c=c):
|
2566
|
-
self.select_cell(r, c, redraw=True)
|
2567
|
-
else:
|
2568
|
-
self.select_cell(r, c)
|
2569
|
-
self.see(
|
2570
|
-
r,
|
2571
|
-
c,
|
2572
|
-
check_cell_visibility=False,
|
2573
|
-
)
|
2540
|
+
r = self.selected.row
|
2541
|
+
c = self.selected.column
|
2542
|
+
if not c:
|
2543
|
+
self.see(r, c)
|
2574
2544
|
else:
|
2575
|
-
r =
|
2576
|
-
|
2577
|
-
|
2578
|
-
if self.cell_completely_visible(r=r + 1, c=c):
|
2579
|
-
self.select_cell(r + 1, c, redraw=True)
|
2580
|
-
else:
|
2581
|
-
self.select_cell(r + 1, c)
|
2582
|
-
self.see(
|
2583
|
-
r + 1,
|
2584
|
-
c,
|
2585
|
-
keep_xscroll=True,
|
2586
|
-
bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
|
2587
|
-
check_cell_visibility=False,
|
2588
|
-
)
|
2545
|
+
self.see(r, c - 1, redraw=False)
|
2546
|
+
if self.selected.type_ == "columns":
|
2547
|
+
self.CH.select_col(c - 1, redraw=True)
|
2589
2548
|
|
2590
|
-
|
2549
|
+
elif self.selected.type_ in ("cells", "rows"):
|
2550
|
+
self.select_cell(r, c - 1, redraw=True)
|
2551
|
+
|
2552
|
+
def arrowkey_DOWN(self, event: object = None) -> None:
|
2591
2553
|
if not self.selected:
|
2592
2554
|
return
|
2593
|
-
|
2594
|
-
|
2595
|
-
|
2596
|
-
|
2597
|
-
|
2598
|
-
|
2599
|
-
|
2600
|
-
|
2601
|
-
|
2602
|
-
|
2603
|
-
|
2604
|
-
|
2605
|
-
|
2606
|
-
|
2607
|
-
|
2608
|
-
|
2609
|
-
|
2610
|
-
elif self.selected.type_ == "cells":
|
2611
|
-
r = self.selected.row
|
2612
|
-
c = self.selected.column
|
2613
|
-
if not c and not self.cell_completely_visible(r=r, c=c):
|
2614
|
-
self.see(r, c, keep_yscroll=True, check_cell_visibility=False)
|
2615
|
-
elif c and (self.single_selection_enabled or self.toggle_selection_enabled):
|
2616
|
-
if self.cell_completely_visible(r=r, c=c - 1):
|
2617
|
-
self.select_cell(r, c - 1, redraw=True)
|
2618
|
-
else:
|
2619
|
-
self.select_cell(r, c - 1)
|
2620
|
-
self.see(r, c - 1, keep_yscroll=True, check_cell_visibility=False)
|
2555
|
+
r = self.selected.row
|
2556
|
+
c = self.selected.column
|
2557
|
+
if self.selected.row == len(self.row_positions) - 2:
|
2558
|
+
self.see(r, c)
|
2559
|
+
else:
|
2560
|
+
brc = False if self.PAR.ops.arrow_key_down_right_scroll_page else None
|
2561
|
+
self.see(
|
2562
|
+
r + 1,
|
2563
|
+
c,
|
2564
|
+
bottom_right_corner=brc,
|
2565
|
+
redraw=False,
|
2566
|
+
)
|
2567
|
+
if self.selected.type_ == "rows":
|
2568
|
+
self.RI.select_row(r + 1, redraw=True)
|
2569
|
+
|
2570
|
+
elif self.selected.type_ in ("cells", "columns"):
|
2571
|
+
self.select_cell(r + 1, c, redraw=True)
|
2621
2572
|
|
2622
2573
|
def arrowkey_RIGHT(self, event: object = None) -> None:
|
2623
2574
|
if not self.selected:
|
2624
2575
|
return
|
2625
|
-
|
2626
|
-
|
2627
|
-
|
2628
|
-
|
2629
|
-
c = self.selected.column
|
2630
|
-
else:
|
2631
|
-
c = self.selected.column + 1
|
2632
|
-
if self.cell_completely_visible(r=r, c=c):
|
2633
|
-
self.select_cell(r, c, redraw=True)
|
2634
|
-
else:
|
2635
|
-
self.select_cell(r, c)
|
2636
|
-
self.see(
|
2637
|
-
r,
|
2638
|
-
c,
|
2639
|
-
check_cell_visibility=False,
|
2640
|
-
)
|
2641
|
-
elif self.selected.type_ == "columns":
|
2642
|
-
c = self.selected.column
|
2643
|
-
if c < len(self.col_positions) - 2 and self.CH.col_selection_enabled:
|
2644
|
-
if self.cell_completely_visible(r=0, c=c + 1):
|
2645
|
-
self.CH.select_col(c + 1, redraw=True)
|
2646
|
-
else:
|
2647
|
-
self.CH.select_col(c + 1)
|
2648
|
-
self.see(
|
2649
|
-
0,
|
2650
|
-
c + 1,
|
2651
|
-
keep_yscroll=True,
|
2652
|
-
bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
|
2653
|
-
check_cell_visibility=False,
|
2654
|
-
)
|
2576
|
+
r = self.selected.row
|
2577
|
+
c = self.selected.column
|
2578
|
+
if self.selected.column == len(self.col_positions) - 2:
|
2579
|
+
self.see(r, c)
|
2655
2580
|
else:
|
2656
|
-
|
2657
|
-
|
2658
|
-
|
2659
|
-
|
2660
|
-
|
2661
|
-
|
2662
|
-
|
2663
|
-
|
2664
|
-
|
2665
|
-
|
2666
|
-
|
2667
|
-
|
2668
|
-
check_cell_visibility=False,
|
2669
|
-
)
|
2581
|
+
brc = False if self.PAR.ops.arrow_key_down_right_scroll_page else None
|
2582
|
+
self.see(
|
2583
|
+
r,
|
2584
|
+
c + 1,
|
2585
|
+
bottom_right_corner=brc,
|
2586
|
+
redraw=False,
|
2587
|
+
)
|
2588
|
+
if self.selected.type_ == "columns":
|
2589
|
+
self.CH.select_col(c + 1, redraw=True)
|
2590
|
+
|
2591
|
+
elif self.selected.type_ in ("cells", "rows"):
|
2592
|
+
self.select_cell(r, c + 1, redraw=True)
|
2670
2593
|
|
2671
2594
|
def shift_arrowkey_select_box(
|
2672
2595
|
self,
|
@@ -4363,14 +4286,8 @@ class MainTable(tk.Canvas):
|
|
4363
4286
|
qfont = self.PAR.ops.table_font
|
4364
4287
|
numrows = self.total_data_rows()
|
4365
4288
|
numcols = self.total_data_cols()
|
4366
|
-
if self.all_columns_displayed
|
4367
|
-
|
4368
|
-
else:
|
4369
|
-
itercols = self.displayed_columns
|
4370
|
-
if self.all_rows_displayed:
|
4371
|
-
iterrows = range(numrows)
|
4372
|
-
else:
|
4373
|
-
iterrows = self.displayed_rows
|
4289
|
+
itercols = range(numcols) if self.all_columns_displayed else self.displayed_columns
|
4290
|
+
iterrows = range(numrows) if self.all_rows_displayed else self.displayed_rows
|
4374
4291
|
if is_iterable(self._row_index):
|
4375
4292
|
for datarn in iterrows:
|
4376
4293
|
w_, h = self.RI.get_cell_dimensions(datarn)
|
@@ -4383,10 +4300,7 @@ class MainTable(tk.Canvas):
|
|
4383
4300
|
added_w_space = 1 if slim else 7
|
4384
4301
|
for datacn in itercols:
|
4385
4302
|
w = min_column_width if width is None else width
|
4386
|
-
if (hw := self.CH.get_cell_dimensions(datacn)[0]) > w
|
4387
|
-
w = hw
|
4388
|
-
else:
|
4389
|
-
w = min_column_width
|
4303
|
+
w = hw if (hw := self.CH.get_cell_dimensions(datacn)[0]) > w else min_column_width
|
4390
4304
|
for datarn in iterrows:
|
4391
4305
|
if txt := self.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True):
|
4392
4306
|
qconf(qtxtm, text=txt, font=qfont)
|
@@ -4489,10 +4403,10 @@ class MainTable(tk.Canvas):
|
|
4489
4403
|
self.set_row_positions(itr=(h for i, h in enumerate(self.gen_row_heights()) if i not in idxs))
|
4490
4404
|
|
4491
4405
|
def get_column_widths(self) -> list[int]:
|
4492
|
-
return
|
4406
|
+
return list(diff_gen(self.col_positions))
|
4493
4407
|
|
4494
4408
|
def get_row_heights(self) -> list[int]:
|
4495
|
-
return
|
4409
|
+
return list(diff_gen(self.row_positions))
|
4496
4410
|
|
4497
4411
|
def gen_column_widths(self) -> Generator[int]:
|
4498
4412
|
return diff_gen(self.col_positions)
|
@@ -5178,12 +5092,9 @@ class MainTable(tk.Canvas):
|
|
5178
5092
|
for datacn in reversed(range(data_ins_col, data_ins_col + numcols))
|
5179
5093
|
}
|
5180
5094
|
else:
|
5181
|
-
if headers
|
5182
|
-
start = 1
|
5183
|
-
else:
|
5184
|
-
start = 0
|
5095
|
+
start = 1 if headers else 0
|
5185
5096
|
columns = {
|
5186
|
-
datacn:
|
5097
|
+
datacn: dict(enumerate(islice(column, start, None)))
|
5187
5098
|
for datacn, column in zip(reversed(range(data_ins_col, data_ins_col + numcols)), reversed(columns))
|
5188
5099
|
}
|
5189
5100
|
if widths is None:
|
@@ -5192,10 +5103,7 @@ class MainTable(tk.Canvas):
|
|
5192
5103
|
for c in reversed(range(displayed_ins_col, displayed_ins_col + numcols))
|
5193
5104
|
}
|
5194
5105
|
else:
|
5195
|
-
widths =
|
5196
|
-
c: width
|
5197
|
-
for c, width in zip(reversed(range(displayed_ins_col, displayed_ins_col + numcols)), reversed(widths))
|
5198
|
-
}
|
5106
|
+
widths = dict(zip(reversed(range(displayed_ins_col, displayed_ins_col + numcols)), reversed(widths)))
|
5199
5107
|
return columns, header_data, widths
|
5200
5108
|
|
5201
5109
|
def get_args_for_add_rows(
|
@@ -5233,10 +5141,7 @@ class MainTable(tk.Canvas):
|
|
5233
5141
|
for datarn in reversed(range(data_ins_row, data_ins_row + numrows))
|
5234
5142
|
}
|
5235
5143
|
else:
|
5236
|
-
if row_index
|
5237
|
-
start = 1
|
5238
|
-
else:
|
5239
|
-
start = 0
|
5144
|
+
start = 1 if row_index else 0
|
5240
5145
|
rows = {
|
5241
5146
|
datarn: v[start:] if start and v else v
|
5242
5147
|
for datarn, v in zip(reversed(range(data_ins_row, data_ins_row + numrows)), reversed(rows))
|
@@ -5245,10 +5150,7 @@ class MainTable(tk.Canvas):
|
|
5245
5150
|
default_row_height = self.get_default_row_height()
|
5246
5151
|
heights = {r: default_row_height for r in reversed(range(displayed_ins_row, displayed_ins_row + numrows))}
|
5247
5152
|
else:
|
5248
|
-
heights =
|
5249
|
-
r: height
|
5250
|
-
for r, height in zip(reversed(range(displayed_ins_row, displayed_ins_row + numrows)), reversed(heights))
|
5251
|
-
}
|
5153
|
+
heights = dict(zip(reversed(range(displayed_ins_row, displayed_ins_row + numrows)), reversed(heights)))
|
5252
5154
|
return rows, index_data, heights
|
5253
5155
|
|
5254
5156
|
def copy_options(self) -> dict:
|
@@ -5340,9 +5242,8 @@ class MainTable(tk.Canvas):
|
|
5340
5242
|
emit_event: bool = True,
|
5341
5243
|
) -> EventDataDict:
|
5342
5244
|
event_data = self.new_event_dict("delete_columns", state=True)
|
5343
|
-
if not columns:
|
5344
|
-
|
5345
|
-
return event_data
|
5245
|
+
if not columns and not (columns := sorted(self.get_selected_cols())):
|
5246
|
+
return event_data
|
5346
5247
|
if not try_binding(self.extra_begin_del_cols_rc_func, event_data, "begin_delete_columns"):
|
5347
5248
|
return
|
5348
5249
|
if self.all_columns_displayed:
|
@@ -5425,11 +5326,10 @@ class MainTable(tk.Canvas):
|
|
5425
5326
|
data_indexes: bool = False,
|
5426
5327
|
undo: bool = True,
|
5427
5328
|
emit_event: bool = True,
|
5428
|
-
) -> EventDataDict:
|
5329
|
+
) -> None | EventDataDict:
|
5429
5330
|
event_data = self.new_event_dict("delete_rows", state=True)
|
5430
|
-
if not rows:
|
5431
|
-
|
5432
|
-
return
|
5331
|
+
if not rows and not (rows := sorted(self.get_selected_rows())):
|
5332
|
+
return
|
5433
5333
|
if not try_binding(self.extra_begin_del_rows_rc_func, event_data, "begin_delete_rows"):
|
5434
5334
|
return
|
5435
5335
|
if self.all_rows_displayed:
|
@@ -5577,13 +5477,13 @@ class MainTable(tk.Canvas):
|
|
5577
5477
|
elif not isinstance(newheaders, (list, tuple, int)) and index is None:
|
5578
5478
|
try:
|
5579
5479
|
self._headers = list(newheaders)
|
5580
|
-
except
|
5480
|
+
except ValueError as error:
|
5581
5481
|
raise ValueError(
|
5582
5482
|
"""
|
5583
5483
|
New header must be iterable or int \
|
5584
5484
|
(use int to use a row as the header
|
5585
5485
|
"""
|
5586
|
-
)
|
5486
|
+
) from error
|
5587
5487
|
if reset_col_positions:
|
5588
5488
|
self.reset_col_positions()
|
5589
5489
|
elif (
|
@@ -5626,13 +5526,13 @@ class MainTable(tk.Canvas):
|
|
5626
5526
|
elif not isinstance(newindex, (list, tuple, int)) and index is None:
|
5627
5527
|
try:
|
5628
5528
|
self._row_index = list(newindex)
|
5629
|
-
except
|
5529
|
+
except ValueError as error:
|
5630
5530
|
raise ValueError(
|
5631
5531
|
"""
|
5632
5532
|
New index must be iterable or int \
|
5633
5533
|
(use int to use a column as the index
|
5634
5534
|
"""
|
5635
|
-
)
|
5535
|
+
) from error
|
5636
5536
|
if reset_row_positions:
|
5637
5537
|
self.reset_row_positions()
|
5638
5538
|
elif (
|
@@ -6026,7 +5926,7 @@ class MainTable(tk.Canvas):
|
|
6026
5926
|
widths[i] = min_column_width
|
6027
5927
|
if diffs and len(diffs) < len(widths):
|
6028
5928
|
change = sum(diffs.values()) / (len(widths) - len(diffs))
|
6029
|
-
for i
|
5929
|
+
for i in range(len(widths)):
|
6030
5930
|
if i not in diffs:
|
6031
5931
|
widths[i] -= change
|
6032
5932
|
self.col_positions = list(accumulate(chain([0], widths)))
|
@@ -6053,7 +5953,7 @@ class MainTable(tk.Canvas):
|
|
6053
5953
|
heights[i] = min_row_height
|
6054
5954
|
if diffs and len(diffs) < len(heights):
|
6055
5955
|
change = sum(diffs.values()) / (len(heights) - len(diffs))
|
6056
|
-
for i
|
5956
|
+
for i in range(len(heights)):
|
6057
5957
|
if i not in diffs:
|
6058
5958
|
heights[i] -= change
|
6059
5959
|
self.row_positions = list(accumulate(chain([0], heights)))
|
@@ -6240,10 +6140,7 @@ class MainTable(tk.Canvas):
|
|
6240
6140
|
if self.PAR.ops.horizontal_grid_to_end_of_window:
|
6241
6141
|
x_grid_stop = scrollpos_right + can_width
|
6242
6142
|
else:
|
6243
|
-
if last_col_line_pos > scrollpos_right
|
6244
|
-
x_grid_stop = x_stop + 1
|
6245
|
-
else:
|
6246
|
-
x_grid_stop = x_stop - 1
|
6143
|
+
x_grid_stop = x_stop + 1 if last_col_line_pos > scrollpos_right else x_stop - 1
|
6247
6144
|
self.redraw_gridline(
|
6248
6145
|
points=tuple(
|
6249
6146
|
chain.from_iterable(
|
@@ -6266,10 +6163,7 @@ class MainTable(tk.Canvas):
|
|
6266
6163
|
if self.PAR.ops.vertical_grid_to_end_of_window:
|
6267
6164
|
y_grid_stop = scrollpos_bot + can_height
|
6268
6165
|
else:
|
6269
|
-
if last_row_line_pos > scrollpos_bot
|
6270
|
-
y_grid_stop = y_stop + 1
|
6271
|
-
else:
|
6272
|
-
y_grid_stop = y_stop - 1
|
6166
|
+
y_grid_stop = y_stop + 1 if last_row_line_pos > scrollpos_bot else y_stop - 1
|
6273
6167
|
self.redraw_gridline(
|
6274
6168
|
points=tuple(
|
6275
6169
|
chain.from_iterable(
|
@@ -6293,10 +6187,7 @@ class MainTable(tk.Canvas):
|
|
6293
6187
|
sel_cells_bg = color_tup(self.PAR.ops.table_selected_cells_bg)
|
6294
6188
|
sel_cols_bg = color_tup(self.PAR.ops.table_selected_columns_bg)
|
6295
6189
|
sel_rows_bg = color_tup(self.PAR.ops.table_selected_rows_bg)
|
6296
|
-
if self.selected
|
6297
|
-
current_loc = (self.selected.row, self.selected.column)
|
6298
|
-
else:
|
6299
|
-
current_loc = tuple()
|
6190
|
+
current_loc = (self.selected.row, self.selected.column) if self.selected else ()
|
6300
6191
|
if self.PAR.ops.alternate_color:
|
6301
6192
|
alternate_color = Highlight(
|
6302
6193
|
bg=self.PAR.ops.alternate_color,
|
@@ -6306,10 +6197,10 @@ class MainTable(tk.Canvas):
|
|
6306
6197
|
if self.selected and box_is_single_cell(*self.selected.box) and self.PAR.ops.show_selected_cells_border:
|
6307
6198
|
dont_blend = current_loc
|
6308
6199
|
else:
|
6309
|
-
dont_blend =
|
6200
|
+
dont_blend = ()
|
6310
6201
|
else:
|
6311
6202
|
alternate_color = None
|
6312
|
-
dont_blend =
|
6203
|
+
dont_blend = ()
|
6313
6204
|
if not self.PAR.ops.show_selected_cells_border:
|
6314
6205
|
override = (
|
6315
6206
|
color_tup(self.PAR.ops.table_selected_cells_fg),
|
@@ -6317,7 +6208,7 @@ class MainTable(tk.Canvas):
|
|
6317
6208
|
color_tup(self.PAR.ops.table_selected_rows_fg),
|
6318
6209
|
)
|
6319
6210
|
else:
|
6320
|
-
override =
|
6211
|
+
override = ()
|
6321
6212
|
allow_overflow = self.PAR.ops.allow_cell_overflow
|
6322
6213
|
wrap = self.PAR.ops.table_wrap
|
6323
6214
|
cells = self._redraw_precache_cells(
|
@@ -6514,7 +6405,7 @@ class MainTable(tk.Canvas):
|
|
6514
6405
|
self.itemconfig(iid, state="hidden")
|
6515
6406
|
dct[iid] = False
|
6516
6407
|
if self.PAR.ops.show_selected_cells_border:
|
6517
|
-
for
|
6408
|
+
for _, box in self.selection_boxes.items():
|
6518
6409
|
if box.bd_iid:
|
6519
6410
|
self.tag_raise(box.bd_iid)
|
6520
6411
|
if self.selected:
|
@@ -6576,7 +6467,7 @@ class MainTable(tk.Canvas):
|
|
6576
6467
|
def reselect_from_get_boxes(
|
6577
6468
|
self,
|
6578
6469
|
boxes: dict,
|
6579
|
-
selected: tuple =
|
6470
|
+
selected: tuple = (),
|
6580
6471
|
) -> None:
|
6581
6472
|
for (r1, c1, r2, c2), v in boxes.items():
|
6582
6473
|
if r2 < len(self.row_positions) and c2 < len(self.col_positions):
|
@@ -6610,14 +6501,15 @@ class MainTable(tk.Canvas):
|
|
6610
6501
|
|
6611
6502
|
# set current to any existing selection box with coordinates: box
|
6612
6503
|
if isinstance(box, tuple):
|
6613
|
-
for
|
6614
|
-
if box == selection_box.coords
|
6615
|
-
|
6616
|
-
|
6504
|
+
for _, selection_box in self.get_selection_items(reverse=True):
|
6505
|
+
if box == selection_box.coords and box_created(
|
6506
|
+
box[0] if r is None else r, box[1] if c is None else c, selection_box
|
6507
|
+
):
|
6508
|
+
return
|
6617
6509
|
|
6618
6510
|
# set current to a coordinate, find the top most box there
|
6619
6511
|
if isinstance(r, int) and isinstance(c, int):
|
6620
|
-
for
|
6512
|
+
for _, selection_box in self.get_selection_items(reverse=True):
|
6621
6513
|
if box_created(r, c, selection_box):
|
6622
6514
|
return
|
6623
6515
|
|
@@ -6636,15 +6528,15 @@ class MainTable(tk.Canvas):
|
|
6636
6528
|
def coords_and_type(self, item: int) -> tuple:
|
6637
6529
|
if item in self.selection_boxes:
|
6638
6530
|
return Box_t(*(self.selection_boxes[item].coords + (self.selection_boxes[item].type_,)))
|
6639
|
-
return
|
6531
|
+
return ()
|
6640
6532
|
|
6641
6533
|
def get_selected_box_bg_fg(self, type_: str) -> tuple:
|
6642
|
-
|
6643
|
-
|
6644
|
-
|
6645
|
-
|
6646
|
-
|
6647
|
-
|
6534
|
+
type_map = {
|
6535
|
+
"cells": (self.PAR.ops.table_selected_cells_bg, self.PAR.ops.table_selected_box_cells_fg),
|
6536
|
+
"rows": (self.PAR.ops.table_selected_rows_bg, self.PAR.ops.table_selected_box_rows_fg),
|
6537
|
+
"columns": (self.PAR.ops.table_selected_columns_bg, self.PAR.ops.table_selected_box_columns_fg),
|
6538
|
+
}
|
6539
|
+
return type_map[type_]
|
6648
6540
|
|
6649
6541
|
def create_currently_selected_box(
|
6650
6542
|
self,
|
@@ -6701,10 +6593,7 @@ class MainTable(tk.Canvas):
|
|
6701
6593
|
width: int,
|
6702
6594
|
iid: None | int = None,
|
6703
6595
|
) -> int:
|
6704
|
-
if not self.PAR.ops.rounded_boxes or not x2 - x1 or not y2 - y1
|
6705
|
-
radius = 0
|
6706
|
-
else:
|
6707
|
-
radius = 5
|
6596
|
+
radius = 0 if not self.PAR.ops.rounded_boxes or not x2 - x1 or not y2 - y1 else 5
|
6708
6597
|
coords = rounded_box_coords(
|
6709
6598
|
x1,
|
6710
6599
|
y1,
|
@@ -6761,7 +6650,7 @@ class MainTable(tk.Canvas):
|
|
6761
6650
|
def hide_selected(self) -> None:
|
6762
6651
|
if self.selected:
|
6763
6652
|
self.hide_box(self.selected.iid)
|
6764
|
-
self.selected =
|
6653
|
+
self.selected = ()
|
6765
6654
|
|
6766
6655
|
def create_selection_box(
|
6767
6656
|
self,
|
@@ -7271,7 +7160,7 @@ class MainTable(tk.Canvas):
|
|
7271
7160
|
self.text_editor.window.set_text(self.text_editor.get() + "" if not isinstance(text, str) else text)
|
7272
7161
|
return False
|
7273
7162
|
self.hide_text_editor()
|
7274
|
-
if not self.see(r
|
7163
|
+
if not self.see(r, c):
|
7275
7164
|
self.main_table_redraw_grid_and_text(True, True)
|
7276
7165
|
x = self.col_positions[c]
|
7277
7166
|
y = self.row_positions[r]
|
@@ -7505,13 +7394,7 @@ class MainTable(tk.Canvas):
|
|
7505
7394
|
new_r, new_c = None, None
|
7506
7395
|
if isinstance(new_r, int):
|
7507
7396
|
self.set_currently_selected(new_r, new_c, item=self.selected.fill_iid)
|
7508
|
-
self.see(
|
7509
|
-
new_r,
|
7510
|
-
new_c,
|
7511
|
-
keep_xscroll=False,
|
7512
|
-
bottom_right_corner=True,
|
7513
|
-
check_cell_visibility=True,
|
7514
|
-
)
|
7397
|
+
self.see(new_r, new_c)
|
7515
7398
|
self.recreate_all_selection_boxes()
|
7516
7399
|
self.hide_text_editor_and_dropdown()
|
7517
7400
|
if event.keysym != "FocusOut":
|
@@ -7524,17 +7407,11 @@ class MainTable(tk.Canvas):
|
|
7524
7407
|
r,
|
7525
7408
|
c + 1 if c < len(self.col_positions) - 2 else c,
|
7526
7409
|
bottom_right_corner=True,
|
7527
|
-
check_cell_visibility=True,
|
7528
7410
|
)
|
7529
7411
|
|
7530
7412
|
def select_down(self, r: int, c: int) -> None:
|
7531
7413
|
self.select_cell(r + 1 if r < len(self.row_positions) - 2 else r, c)
|
7532
|
-
self.see(
|
7533
|
-
r + 1 if r < len(self.row_positions) - 2 else r,
|
7534
|
-
c,
|
7535
|
-
bottom_right_corner=True,
|
7536
|
-
check_cell_visibility=True,
|
7537
|
-
)
|
7414
|
+
self.see(r + 1 if r < len(self.row_positions) - 2 else r, c)
|
7538
7415
|
|
7539
7416
|
def tab_key(self, event: object = None) -> str:
|
7540
7417
|
if not self.selected:
|
@@ -7550,13 +7427,7 @@ class MainTable(tk.Canvas):
|
|
7550
7427
|
else:
|
7551
7428
|
new_r, new_c = cell_right_within_box(r, c, r1, c1, r2, c2, numrows, numcols)
|
7552
7429
|
self.set_currently_selected(new_r, new_c, item=self.selected.fill_iid)
|
7553
|
-
self.see(
|
7554
|
-
new_r,
|
7555
|
-
new_c,
|
7556
|
-
keep_xscroll=False,
|
7557
|
-
bottom_right_corner=True,
|
7558
|
-
check_cell_visibility=True,
|
7559
|
-
)
|
7430
|
+
self.see(new_r, new_c, bottom_right_corner=True)
|
7560
7431
|
if not self.PAR.ops.show_selected_cells_border:
|
7561
7432
|
self.refresh()
|
7562
7433
|
return "break"
|
@@ -7867,7 +7738,7 @@ class MainTable(tk.Canvas):
|
|
7867
7738
|
datarn: int,
|
7868
7739
|
datacn: int,
|
7869
7740
|
value: object,
|
7870
|
-
kwargs: dict =
|
7741
|
+
kwargs: dict | None = None,
|
7871
7742
|
expand_sheet: bool = True,
|
7872
7743
|
) -> None:
|
7873
7744
|
if expand_sheet:
|
@@ -7893,26 +7764,20 @@ class MainTable(tk.Canvas):
|
|
7893
7764
|
self.data[datarn][datacn] = value
|
7894
7765
|
|
7895
7766
|
def get_value_for_empty_cell(self, datarn: int, datacn: int, r_ops: bool = True, c_ops: bool = True) -> object:
|
7896
|
-
if self.get_cell_kwargs(
|
7897
|
-
datarn,
|
7898
|
-
datacn,
|
7899
|
-
key="checkbox",
|
7900
|
-
cell=r_ops and c_ops,
|
7901
|
-
row=r_ops,
|
7902
|
-
column=c_ops,
|
7903
|
-
):
|
7904
|
-
return False
|
7905
7767
|
kwargs = self.get_cell_kwargs(
|
7906
7768
|
datarn,
|
7907
7769
|
datacn,
|
7908
|
-
key=
|
7770
|
+
key=None,
|
7909
7771
|
cell=r_ops and c_ops,
|
7910
7772
|
row=r_ops,
|
7911
7773
|
column=c_ops,
|
7912
7774
|
)
|
7913
|
-
if
|
7775
|
+
if "checkbox" in kwargs:
|
7776
|
+
return False
|
7777
|
+
elif (kwargs := kwargs.get("dropdown", {})) and kwargs["validate_input"] and kwargs["values"]:
|
7914
7778
|
return kwargs["values"][0]
|
7915
|
-
|
7779
|
+
else:
|
7780
|
+
return ""
|
7916
7781
|
|
7917
7782
|
def get_empty_row_seq(
|
7918
7783
|
self,
|
@@ -7981,10 +7846,7 @@ class MainTable(tk.Canvas):
|
|
7981
7846
|
self.set_cell_data(*key, get_val(*key), expand_sheet=False)
|
7982
7847
|
|
7983
7848
|
def delete_row_format(self, datarn: Literal["all"] | int = "all", clear_values: bool = False) -> None:
|
7984
|
-
if isinstance(datarn, str) and datarn.lower() == "all"
|
7985
|
-
itr = gen_formatted(self.row_options)
|
7986
|
-
else:
|
7987
|
-
itr = (datarn,)
|
7849
|
+
itr = gen_formatted(self.row_options) if isinstance(datarn, str) and datarn.lower() == "all" else (datarn,)
|
7988
7850
|
get_val = self.get_value_for_empty_cell
|
7989
7851
|
for datarn in itr:
|
7990
7852
|
try:
|
@@ -7996,10 +7858,7 @@ class MainTable(tk.Canvas):
|
|
7996
7858
|
self.set_cell_data(datarn, datacn, get_val(datarn, datacn), expand_sheet=False)
|
7997
7859
|
|
7998
7860
|
def delete_column_format(self, datacn: Literal["all"] | int = "all", clear_values: bool = False) -> None:
|
7999
|
-
if isinstance(datacn, str) and datacn.lower() == "all"
|
8000
|
-
itr = gen_formatted(self.col_options)
|
8001
|
-
else:
|
8002
|
-
itr = (datacn,)
|
7861
|
+
itr = gen_formatted(self.col_options) if isinstance(datacn, str) and datacn.lower() == "all" else (datacn,)
|
8003
7862
|
get_val = self.get_value_for_empty_cell
|
8004
7863
|
for datacn in itr:
|
8005
7864
|
try:
|
@@ -8072,18 +7931,19 @@ class MainTable(tk.Canvas):
|
|
8072
7931
|
check_readonly: bool = True,
|
8073
7932
|
ignore_empty: bool = False,
|
8074
7933
|
) -> bool:
|
8075
|
-
|
7934
|
+
kwargs = self.get_cell_kwargs(datarn, datacn, key=None)
|
7935
|
+
if check_readonly and "readonly" in kwargs:
|
8076
7936
|
return False
|
8077
|
-
|
7937
|
+
elif "format" in kwargs:
|
8078
7938
|
return True
|
8079
|
-
|
8080
|
-
|
8081
|
-
|
8082
|
-
if kwargs and kwargs["validate_input"] and value not in kwargs["values"]:
|
7939
|
+
elif self.cell_equal_to(datarn, datacn, value, ignore_empty=ignore_empty) or (
|
7940
|
+
(dropdown := kwargs.get("dropdown", {})) and dropdown["validate_input"] and value not in dropdown["values"]
|
7941
|
+
):
|
8083
7942
|
return False
|
8084
|
-
|
7943
|
+
elif "checkbox" in kwargs:
|
8085
7944
|
return is_bool_like(value)
|
8086
|
-
|
7945
|
+
else:
|
7946
|
+
return True
|
8087
7947
|
|
8088
7948
|
def cell_equal_to(self, datarn: int, datacn: int, value: object, ignore_empty: bool = False, **kwargs) -> bool:
|
8089
7949
|
v = self.get_cell_data(datarn, datacn)
|
@@ -8118,18 +7978,21 @@ class MainTable(tk.Canvas):
|
|
8118
7978
|
self,
|
8119
7979
|
datarn: int,
|
8120
7980
|
datacn: int,
|
8121
|
-
key: Hashable = "format",
|
7981
|
+
key: Hashable | None = "format",
|
8122
7982
|
cell: bool = True,
|
8123
7983
|
row: bool = True,
|
8124
7984
|
column: bool = True,
|
8125
7985
|
) -> dict:
|
8126
|
-
if cell and (datarn, datacn) in self.cell_options
|
8127
|
-
return
|
8128
|
-
|
8129
|
-
|
8130
|
-
|
8131
|
-
return self.
|
8132
|
-
|
7986
|
+
if cell and (datarn, datacn) in self.cell_options:
|
7987
|
+
return (
|
7988
|
+
self.cell_options[(datarn, datacn)] if key is None else self.cell_options[(datarn, datacn)].get(key, {})
|
7989
|
+
)
|
7990
|
+
elif row and datarn in self.row_options:
|
7991
|
+
return self.row_options[datarn] if key is None else self.row_options[datarn].get(key, {})
|
7992
|
+
elif column and datacn in self.col_options:
|
7993
|
+
return self.col_options[datacn] if key is None else self.col_options[datacn].get(key, {})
|
7994
|
+
else:
|
7995
|
+
return {}
|
8133
7996
|
|
8134
7997
|
def datacn(self, c: int) -> int:
|
8135
7998
|
return c if self.all_columns_displayed else self.displayed_columns[c]
|