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/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 = tuple()
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 = tuple()
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
- if (
310
- isinstance(kwargs["total_rows"], int)
311
- and isinstance(kwargs["total_cols"], int)
312
- and kwargs["total_rows"] > 0
313
- and kwargs["total_cols"] > 0
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, r2, c2 in boxes:
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: AnyIter[int, int, int, int] | None = None,
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 is None:
933
+ if not boxes:
943
934
  boxes = self.get_boxes()
944
935
  if not boxes:
945
- boxes = [(0, 0, len(self.row_positions) - 1, len(self.col_positions) - 1)]
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
- if selected_c + new_data_numcols > len(self.col_positions) - 1:
1046
- total_data_cols = self.equalize_data_row_lengths()
1047
- added_cols = selected_c + new_data_numcols - len(self.col_positions) + 1
1048
- if (
1049
- isinstance(self.PAR.ops.paste_insert_column_limit, int)
1050
- and self.PAR.ops.paste_insert_column_limit < len(self.col_positions) - 1 + added_cols
1051
- ):
1052
- added_cols = self.PAR.ops.paste_insert_column_limit - len(self.col_positions) - 1
1053
- if self.PAR.ops.paste_can_expand_y:
1054
- if selected_r + new_data_numrows > len(self.row_positions) - 1:
1055
- added_rows = selected_r + new_data_numrows - len(self.row_positions) + 1
1056
- if (
1057
- isinstance(self.PAR.ops.paste_insert_row_limit, int)
1058
- and self.PAR.ops.paste_insert_row_limit < len(self.row_positions) - 1 + added_rows
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
- selboxr = selected_r + new_data_numrows
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(move_to=move_to, to_move=to_move)
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
- data_new_idxs = dict(
1301
- zip(
1302
- move_elements_by_mapping(
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=move_elements_by_mapping(
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 = set(full_new_idxs[k] for k in range(span["from_c"], oldupto_colrange))
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
- move_elements_by_mapping(
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 = set(full_new_idxs[k] for k in range(span["from_r"], oldupto_rowrange))
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=move_elements_by_mapping(
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
- move_elements_by_mapping(tuple(range(max_idx + 1)), new_idxs, old_idxs),
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 = False,
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
- yvis, xvis = False, False
2066
- if check_cell_visibility:
2067
- yvis, xvis = self.cell_completely_visible(r=r, c=c, separate_axes=True)
2068
- if not yvis and len(self.row_positions) > 1:
2069
- if bottom_right_corner:
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
- if not xvis and len(self.col_positions) > 1:
2096
- if bottom_right_corner:
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 | None = 0,
2138
- c: int | None = 0,
2139
- separate_axes: bool = False,
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
- x_vis = cx1 <= x1 and cx2 >= x2
2144
- y_vis = cy1 <= y1 and cy2 >= y2
2145
- return (y_vis, x_vis) if separate_axes else y_vis and x_vis
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, box in self.get_selection_items():
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, box in self.get_selection_items(
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
- if self.selected.type_ == "rows":
2521
- r = self.selected.row
2522
- if r and self.RI.row_selection_enabled:
2523
- if self.cell_completely_visible(r=r - 1, c=0):
2524
- self.RI.select_row(r - 1, redraw=True)
2525
- else:
2526
- self.RI.select_row(r - 1)
2527
- self.see(r - 1, 0, keep_xscroll=True, check_cell_visibility=False)
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
- def arrowkey_DOWN(self, event: object = None) -> None:
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
- if self.selected.type_ == "rows":
2544
- r = self.selected.row
2545
- if r < len(self.row_positions) - 2 and self.RI.row_selection_enabled:
2546
- if self.cell_completely_visible(r=r + 1, c=0):
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 = self.selected.row
2576
- c = self.selected.column
2577
- if r < len(self.row_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
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
- def arrowkey_LEFT(self, event: object = None) -> None:
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
- if self.selected.type_ == "columns":
2594
- c = self.selected.column
2595
- if c and self.CH.col_selection_enabled:
2596
- if self.cell_completely_visible(r=0, c=c - 1):
2597
- self.CH.select_col(c - 1, redraw=True)
2598
- else:
2599
- self.CH.select_col(c - 1)
2600
- self.see(
2601
- 0,
2602
- c - 1,
2603
- keep_yscroll=True,
2604
- bottom_right_corner=True,
2605
- check_cell_visibility=False,
2606
- )
2607
- elif self.selected.type_ == "rows" and self.selected.column:
2608
- self.select_cell(self.selected.row, self.selected.column - 1)
2609
- self.see(self.selected.row, self.selected.column, check_cell_visibility=True)
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
- if self.selected.type_ == "rows":
2626
- r = self.selected.row
2627
- if self.single_selection_enabled or self.toggle_selection_enabled:
2628
- if self.selected.column == len(self.col_positions) - 2:
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
- r = self.selected.row
2657
- c = self.selected.column
2658
- if c < len(self.col_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
2659
- if self.cell_completely_visible(r=r, c=c + 1):
2660
- self.select_cell(r, c + 1, redraw=True)
2661
- else:
2662
- self.select_cell(r, c + 1)
2663
- self.see(
2664
- r,
2665
- c + 1,
2666
- keep_yscroll=True,
2667
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
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
- itercols = range(numcols)
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 diff_list(self.col_positions)
4406
+ return list(diff_gen(self.col_positions))
4493
4407
 
4494
4408
  def get_row_heights(self) -> list[int]:
4495
- return diff_list(self.row_positions)
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: {datarn: v for datarn, v in enumerate(islice(column, start, None))}
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
- if not (columns := sorted(self.get_selected_cols())):
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
- if not (rows := sorted(self.get_selected_rows())):
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 Exception:
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 Exception:
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, w in enumerate(widths):
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, h in enumerate(heights):
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 = tuple()
6200
+ dont_blend = ()
6310
6201
  else:
6311
6202
  alternate_color = None
6312
- dont_blend = tuple()
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 = tuple()
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 iid, box in self.selection_boxes.items():
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 = 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 item, selection_box in self.get_selection_items(reverse=True):
6614
- if box == selection_box.coords:
6615
- if box_created(box[0] if r is None else r, box[1] if c is None else c, selection_box):
6616
- return
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 item, selection_box in self.get_selection_items(reverse=True):
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 tuple()
6531
+ return ()
6640
6532
 
6641
6533
  def get_selected_box_bg_fg(self, type_: str) -> tuple:
6642
- if type_ == "cells":
6643
- return self.PAR.ops.table_selected_cells_bg, self.PAR.ops.table_selected_box_cells_fg
6644
- elif type_ == "rows":
6645
- return self.PAR.ops.table_selected_rows_bg, self.PAR.ops.table_selected_box_rows_fg
6646
- elif type_ == "columns":
6647
- return self.PAR.ops.table_selected_columns_bg, self.PAR.ops.table_selected_box_columns_fg
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 = tuple()
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=r, c=c, check_cell_visibility=True):
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="dropdown",
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 kwargs and kwargs["validate_input"] and kwargs["values"]:
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
- return ""
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
- if check_readonly and self.get_cell_kwargs(datarn, datacn, key="readonly"):
7934
+ kwargs = self.get_cell_kwargs(datarn, datacn, key=None)
7935
+ if check_readonly and "readonly" in kwargs:
8076
7936
  return False
8077
- if self.get_cell_kwargs(datarn, datacn, key="format"):
7937
+ elif "format" in kwargs:
8078
7938
  return True
8079
- if self.cell_equal_to(datarn, datacn, value, ignore_empty=ignore_empty):
8080
- return False
8081
- kwargs = self.get_cell_kwargs(datarn, datacn, key="dropdown")
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
- if self.get_cell_kwargs(datarn, datacn, key="checkbox"):
7943
+ elif "checkbox" in kwargs:
8085
7944
  return is_bool_like(value)
8086
- return True
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 and key in self.cell_options[(datarn, datacn)]:
8127
- return self.cell_options[(datarn, datacn)][key]
8128
- if row and datarn in self.row_options and key in self.row_options[datarn]:
8129
- return self.row_options[datarn][key]
8130
- if column and datacn in self.col_options and key in self.col_options[datacn]:
8131
- return self.col_options[datacn][key]
8132
- return {}
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]