tksheet 7.4.4__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
@@ -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)
@@ -1043,23 +1034,21 @@ class MainTable(tk.Canvas):
1043
1034
  added_rows = 0
1044
1035
  added_cols = 0
1045
1036
  total_data_cols = None
1046
- if self.PAR.ops.paste_can_expand_x:
1047
- if selected_c + new_data_numcols > len(self.col_positions) - 1:
1048
- total_data_cols = self.equalize_data_row_lengths()
1049
- added_cols = selected_c + new_data_numcols - len(self.col_positions) + 1
1050
- if (
1051
- isinstance(self.PAR.ops.paste_insert_column_limit, int)
1052
- and self.PAR.ops.paste_insert_column_limit < len(self.col_positions) - 1 + added_cols
1053
- ):
1054
- added_cols = self.PAR.ops.paste_insert_column_limit - len(self.col_positions) - 1
1055
- if self.PAR.ops.paste_can_expand_y:
1056
- if selected_r + new_data_numrows > len(self.row_positions) - 1:
1057
- added_rows = selected_r + new_data_numrows - len(self.row_positions) + 1
1058
- if (
1059
- isinstance(self.PAR.ops.paste_insert_row_limit, int)
1060
- and self.PAR.ops.paste_insert_row_limit < len(self.row_positions) - 1 + added_rows
1061
- ):
1062
- 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
1063
1052
  if selected_c + new_data_numcols > len(self.col_positions) - 1:
1064
1053
  adjusted_new_data_numcols = len(self.col_positions) - 1 - selected_c
1065
1054
  else:
@@ -1202,14 +1191,8 @@ class MainTable(tk.Canvas):
1202
1191
  event_data=event_data,
1203
1192
  mod_event_boxes=False,
1204
1193
  )
1205
- if added_rows:
1206
- selboxr = selected_r + new_data_numrows
1207
- else:
1208
- selboxr = selected_r_adjusted_new_data_numrows
1209
- if added_cols:
1210
- selboxc = selected_c + new_data_numcols
1211
- else:
1212
- 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
1213
1196
  self.deselect("all", redraw=False)
1214
1197
  self.set_currently_selected(
1215
1198
  *curr_coords,
@@ -1225,15 +1208,7 @@ class MainTable(tk.Canvas):
1225
1208
  )
1226
1209
  event_data["selection_boxes"] = self.get_boxes()
1227
1210
  event_data["selected"] = self.selected
1228
- self.see(
1229
- r=selected_r,
1230
- c=selected_c,
1231
- keep_yscroll=False,
1232
- keep_xscroll=False,
1233
- bottom_right_corner=False,
1234
- check_cell_visibility=True,
1235
- redraw=False,
1236
- )
1211
+ self.see(selected_r, selected_c, redraw=False)
1237
1212
  self.refresh()
1238
1213
  if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
1239
1214
  self.undo_stack.append(stored_event_dict(event_data))
@@ -1421,7 +1396,7 @@ class MainTable(tk.Canvas):
1421
1396
  "c",
1422
1397
  )
1423
1398
  # add cell/col kwargs for columns that are new to the span
1424
- 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)}
1425
1400
  for k in range(newfrom, newupto_colrange):
1426
1401
  if k not in old_span_idxs:
1427
1402
  oldidx = full_old_idxs[k]
@@ -1659,7 +1634,7 @@ class MainTable(tk.Canvas):
1659
1634
  "r",
1660
1635
  )
1661
1636
  # add cell/row kwargs for rows that are new to the span
1662
- 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)}
1663
1638
  for k in range(newfrom, newupto_rowrange):
1664
1639
  if k not in old_span_idxs:
1665
1640
  oldidx = full_old_idxs[k]
@@ -1742,7 +1717,7 @@ class MainTable(tk.Canvas):
1742
1717
  # finally, change the span coords
1743
1718
  span["from_r"], span["upto_r"] = newfrom, newupto
1744
1719
 
1745
- 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):
1746
1721
  self.set_row_positions(
1747
1722
  itr=move_elements_by_mapping_gen(
1748
1723
  self.get_row_heights(),
@@ -2048,15 +2023,7 @@ class MainTable(tk.Canvas):
2048
2023
  )
2049
2024
 
2050
2025
  if self.selected:
2051
- self.see(
2052
- r=self.selected.row,
2053
- c=self.selected.column,
2054
- keep_yscroll=False,
2055
- keep_xscroll=False,
2056
- bottom_right_corner=False,
2057
- check_cell_visibility=True,
2058
- redraw=False,
2059
- )
2026
+ self.see(self.selected.row, self.selected.column, redraw=False)
2060
2027
 
2061
2028
  self.refresh()
2062
2029
  return event_data
@@ -2067,18 +2034,27 @@ class MainTable(tk.Canvas):
2067
2034
  c: int | None = None,
2068
2035
  keep_yscroll: bool = False,
2069
2036
  keep_xscroll: bool = False,
2070
- bottom_right_corner: bool = False,
2037
+ bottom_right_corner: bool | None = None,
2071
2038
  check_cell_visibility: bool = True,
2072
2039
  redraw: bool = True,
2073
2040
  r_pc: float = 0.0,
2074
2041
  c_pc: float = 0.0,
2075
2042
  ) -> bool:
2076
2043
  need_redraw = False
2077
- yvis, xvis = False, False
2078
- if check_cell_visibility:
2079
- yvis, xvis = self.cell_completely_visible(r=r, c=c, separate_axes=True)
2080
- if not yvis and len(self.row_positions) > 1:
2081
- 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:
2082
2058
  if r is not None and not keep_yscroll:
2083
2059
  winfo_height = self.winfo_height()
2084
2060
  if self.row_positions[r + 1] - self.row_positions[r] > winfo_height:
@@ -2104,8 +2080,16 @@ class MainTable(tk.Canvas):
2104
2080
  ]
2105
2081
  self.set_yviews(*args, redraw=False)
2106
2082
  need_redraw = True
2107
- if not xvis and len(self.col_positions) > 1:
2108
- 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:
2109
2093
  if c is not None and not keep_xscroll:
2110
2094
  winfo_width = self.winfo_width()
2111
2095
  if self.col_positions[c + 1] - self.col_positions[c] > winfo_width:
@@ -2144,17 +2128,24 @@ class MainTable(tk.Canvas):
2144
2128
  0 if not r else self.row_positions[r + 1],
2145
2129
  )
2146
2130
 
2147
- 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(
2148
2137
  self,
2149
- r: int | None = 0,
2150
- c: int | None = 0,
2151
- separate_axes: bool = False,
2152
- ) -> 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]]:
2153
2141
  cx1, cy1, cx2, cy2 = self.get_canvas_visible_area()
2154
2142
  x1, y1, x2, y2 = self.get_cell_coords(r, c)
2155
- x_vis = cx1 <= x1 and cx2 >= x2
2156
- y_vis = cy1 <= y1 and cy2 >= y2
2157
- 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
+ }
2158
2149
 
2159
2150
  def cell_visible(self, r: int = 0, c: int = 0) -> bool:
2160
2151
  cx1, cy1, cx2, cy2 = self.get_canvas_visible_area()
@@ -2301,10 +2292,10 @@ class MainTable(tk.Canvas):
2301
2292
  curr_box = self.selected.fill_iid
2302
2293
  if r == "all" or (r is None and c is None and cell is None):
2303
2294
  self.hide_dropdown_editor_all_canvases()
2304
- for item, box in self.get_selection_items():
2295
+ for item, _ in self.get_selection_items():
2305
2296
  self.hide_selection_box(item)
2306
2297
  elif r in ("allrows", "allcols"):
2307
- for item, box in self.get_selection_items(
2298
+ for item, _ in self.get_selection_items(
2308
2299
  columns=r == "allcols",
2309
2300
  rows=r == "allrows",
2310
2301
  cells=False,
@@ -2529,156 +2520,76 @@ class MainTable(tk.Canvas):
2529
2520
  def arrowkey_UP(self, event: object = None) -> None:
2530
2521
  if not self.selected:
2531
2522
  return
2532
- if self.selected.type_ == "rows":
2533
- r = self.selected.row
2534
- if r and self.RI.row_selection_enabled:
2535
- if self.cell_completely_visible(r=r - 1, c=0):
2536
- self.RI.select_row(r - 1, redraw=True)
2537
- else:
2538
- self.RI.select_row(r - 1)
2539
- self.see(r - 1, 0, keep_xscroll=True, check_cell_visibility=False)
2540
- elif self.selected.type_ in ("cells", "columns"):
2541
- r = self.selected.row
2542
- c = self.selected.column
2543
- if not r and self.CH.col_selection_enabled and not self.cell_completely_visible(r=r, c=c):
2544
- self.see(r, c, check_cell_visibility=False)
2545
- elif r and (self.single_selection_enabled or self.toggle_selection_enabled):
2546
- if self.cell_completely_visible(r=r - 1, c=c):
2547
- self.select_cell(r - 1, c, redraw=True)
2548
- else:
2549
- self.select_cell(r - 1, c)
2550
- 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)
2551
2531
 
2552
- 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:
2553
2538
  if not self.selected:
2554
2539
  return
2555
- if self.selected.type_ == "rows":
2556
- r = self.selected.row
2557
- if r < len(self.row_positions) - 2 and self.RI.row_selection_enabled:
2558
- if self.cell_completely_visible(r=r + 1, c=0):
2559
- self.RI.select_row(r + 1, redraw=True)
2560
- else:
2561
- self.RI.select_row(r + 1)
2562
- self.see(
2563
- r + 1,
2564
- 0,
2565
- keep_xscroll=True,
2566
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2567
- check_cell_visibility=False,
2568
- )
2569
-
2570
- elif self.selected.type_ == "columns":
2571
- c = self.selected.column
2572
- if self.single_selection_enabled or self.toggle_selection_enabled:
2573
- if self.selected.row == len(self.row_positions) - 2:
2574
- r = self.selected.row
2575
- else:
2576
- r = self.selected.row + 1
2577
- if self.cell_completely_visible(r=r, c=c):
2578
- self.select_cell(r, c, redraw=True)
2579
- else:
2580
- self.select_cell(r, c)
2581
- self.see(
2582
- r,
2583
- c,
2584
- check_cell_visibility=False,
2585
- )
2540
+ r = self.selected.row
2541
+ c = self.selected.column
2542
+ if not c:
2543
+ self.see(r, c)
2586
2544
  else:
2587
- r = self.selected.row
2588
- c = self.selected.column
2589
- if r < len(self.row_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
2590
- if self.cell_completely_visible(r=r + 1, c=c):
2591
- self.select_cell(r + 1, c, redraw=True)
2592
- else:
2593
- self.select_cell(r + 1, c)
2594
- self.see(
2595
- r + 1,
2596
- c,
2597
- keep_xscroll=True,
2598
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2599
- check_cell_visibility=False,
2600
- )
2545
+ self.see(r, c - 1, redraw=False)
2546
+ if self.selected.type_ == "columns":
2547
+ self.CH.select_col(c - 1, redraw=True)
2601
2548
 
2602
- 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:
2603
2553
  if not self.selected:
2604
2554
  return
2605
- if self.selected.type_ == "columns":
2606
- c = self.selected.column
2607
- if c and self.CH.col_selection_enabled:
2608
- if self.cell_completely_visible(r=0, c=c - 1):
2609
- self.CH.select_col(c - 1, redraw=True)
2610
- else:
2611
- self.CH.select_col(c - 1)
2612
- self.see(
2613
- 0,
2614
- c - 1,
2615
- keep_yscroll=True,
2616
- bottom_right_corner=True,
2617
- check_cell_visibility=False,
2618
- )
2619
- elif self.selected.type_ == "rows" and self.selected.column:
2620
- self.select_cell(self.selected.row, self.selected.column - 1)
2621
- self.see(self.selected.row, self.selected.column, check_cell_visibility=True)
2622
- elif self.selected.type_ == "cells":
2623
- r = self.selected.row
2624
- c = self.selected.column
2625
- if not c and not self.cell_completely_visible(r=r, c=c):
2626
- self.see(r, c, keep_yscroll=True, check_cell_visibility=False)
2627
- elif c and (self.single_selection_enabled or self.toggle_selection_enabled):
2628
- if self.cell_completely_visible(r=r, c=c - 1):
2629
- self.select_cell(r, c - 1, redraw=True)
2630
- else:
2631
- self.select_cell(r, c - 1)
2632
- 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)
2633
2572
 
2634
2573
  def arrowkey_RIGHT(self, event: object = None) -> None:
2635
2574
  if not self.selected:
2636
2575
  return
2637
- if self.selected.type_ == "rows":
2638
- r = self.selected.row
2639
- if self.single_selection_enabled or self.toggle_selection_enabled:
2640
- if self.selected.column == len(self.col_positions) - 2:
2641
- c = self.selected.column
2642
- else:
2643
- c = self.selected.column + 1
2644
- if self.cell_completely_visible(r=r, c=c):
2645
- self.select_cell(r, c, redraw=True)
2646
- else:
2647
- self.select_cell(r, c)
2648
- self.see(
2649
- r,
2650
- c,
2651
- check_cell_visibility=False,
2652
- )
2653
- elif self.selected.type_ == "columns":
2654
- c = self.selected.column
2655
- if c < len(self.col_positions) - 2 and self.CH.col_selection_enabled:
2656
- if self.cell_completely_visible(r=0, c=c + 1):
2657
- self.CH.select_col(c + 1, redraw=True)
2658
- else:
2659
- self.CH.select_col(c + 1)
2660
- self.see(
2661
- 0,
2662
- c + 1,
2663
- keep_yscroll=True,
2664
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2665
- check_cell_visibility=False,
2666
- )
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)
2667
2580
  else:
2668
- r = self.selected.row
2669
- c = self.selected.column
2670
- if c < len(self.col_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
2671
- if self.cell_completely_visible(r=r, c=c + 1):
2672
- self.select_cell(r, c + 1, redraw=True)
2673
- else:
2674
- self.select_cell(r, c + 1)
2675
- self.see(
2676
- r,
2677
- c + 1,
2678
- keep_yscroll=True,
2679
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2680
- check_cell_visibility=False,
2681
- )
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)
2682
2593
 
2683
2594
  def shift_arrowkey_select_box(
2684
2595
  self,
@@ -4375,14 +4286,8 @@ class MainTable(tk.Canvas):
4375
4286
  qfont = self.PAR.ops.table_font
4376
4287
  numrows = self.total_data_rows()
4377
4288
  numcols = self.total_data_cols()
4378
- if self.all_columns_displayed:
4379
- itercols = range(numcols)
4380
- else:
4381
- itercols = self.displayed_columns
4382
- if self.all_rows_displayed:
4383
- iterrows = range(numrows)
4384
- else:
4385
- 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
4386
4291
  if is_iterable(self._row_index):
4387
4292
  for datarn in iterrows:
4388
4293
  w_, h = self.RI.get_cell_dimensions(datarn)
@@ -4395,10 +4300,7 @@ class MainTable(tk.Canvas):
4395
4300
  added_w_space = 1 if slim else 7
4396
4301
  for datacn in itercols:
4397
4302
  w = min_column_width if width is None else width
4398
- if (hw := self.CH.get_cell_dimensions(datacn)[0]) > w:
4399
- w = hw
4400
- else:
4401
- w = min_column_width
4303
+ w = hw if (hw := self.CH.get_cell_dimensions(datacn)[0]) > w else min_column_width
4402
4304
  for datarn in iterrows:
4403
4305
  if txt := self.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True):
4404
4306
  qconf(qtxtm, text=txt, font=qfont)
@@ -5190,12 +5092,9 @@ class MainTable(tk.Canvas):
5190
5092
  for datacn in reversed(range(data_ins_col, data_ins_col + numcols))
5191
5093
  }
5192
5094
  else:
5193
- if headers:
5194
- start = 1
5195
- else:
5196
- start = 0
5095
+ start = 1 if headers else 0
5197
5096
  columns = {
5198
- datacn: {datarn: v for datarn, v in enumerate(islice(column, start, None))}
5097
+ datacn: dict(enumerate(islice(column, start, None)))
5199
5098
  for datacn, column in zip(reversed(range(data_ins_col, data_ins_col + numcols)), reversed(columns))
5200
5099
  }
5201
5100
  if widths is None:
@@ -5204,10 +5103,7 @@ class MainTable(tk.Canvas):
5204
5103
  for c in reversed(range(displayed_ins_col, displayed_ins_col + numcols))
5205
5104
  }
5206
5105
  else:
5207
- widths = {
5208
- c: width
5209
- for c, width in zip(reversed(range(displayed_ins_col, displayed_ins_col + numcols)), reversed(widths))
5210
- }
5106
+ widths = dict(zip(reversed(range(displayed_ins_col, displayed_ins_col + numcols)), reversed(widths)))
5211
5107
  return columns, header_data, widths
5212
5108
 
5213
5109
  def get_args_for_add_rows(
@@ -5245,10 +5141,7 @@ class MainTable(tk.Canvas):
5245
5141
  for datarn in reversed(range(data_ins_row, data_ins_row + numrows))
5246
5142
  }
5247
5143
  else:
5248
- if row_index:
5249
- start = 1
5250
- else:
5251
- start = 0
5144
+ start = 1 if row_index else 0
5252
5145
  rows = {
5253
5146
  datarn: v[start:] if start and v else v
5254
5147
  for datarn, v in zip(reversed(range(data_ins_row, data_ins_row + numrows)), reversed(rows))
@@ -5257,10 +5150,7 @@ class MainTable(tk.Canvas):
5257
5150
  default_row_height = self.get_default_row_height()
5258
5151
  heights = {r: default_row_height for r in reversed(range(displayed_ins_row, displayed_ins_row + numrows))}
5259
5152
  else:
5260
- heights = {
5261
- r: height
5262
- for r, height in zip(reversed(range(displayed_ins_row, displayed_ins_row + numrows)), reversed(heights))
5263
- }
5153
+ heights = dict(zip(reversed(range(displayed_ins_row, displayed_ins_row + numrows)), reversed(heights)))
5264
5154
  return rows, index_data, heights
5265
5155
 
5266
5156
  def copy_options(self) -> dict:
@@ -5352,9 +5242,8 @@ class MainTable(tk.Canvas):
5352
5242
  emit_event: bool = True,
5353
5243
  ) -> EventDataDict:
5354
5244
  event_data = self.new_event_dict("delete_columns", state=True)
5355
- if not columns:
5356
- if not (columns := sorted(self.get_selected_cols())):
5357
- return event_data
5245
+ if not columns and not (columns := sorted(self.get_selected_cols())):
5246
+ return event_data
5358
5247
  if not try_binding(self.extra_begin_del_cols_rc_func, event_data, "begin_delete_columns"):
5359
5248
  return
5360
5249
  if self.all_columns_displayed:
@@ -5437,11 +5326,10 @@ class MainTable(tk.Canvas):
5437
5326
  data_indexes: bool = False,
5438
5327
  undo: bool = True,
5439
5328
  emit_event: bool = True,
5440
- ) -> EventDataDict:
5329
+ ) -> None | EventDataDict:
5441
5330
  event_data = self.new_event_dict("delete_rows", state=True)
5442
- if not rows:
5443
- if not (rows := sorted(self.get_selected_rows())):
5444
- return
5331
+ if not rows and not (rows := sorted(self.get_selected_rows())):
5332
+ return
5445
5333
  if not try_binding(self.extra_begin_del_rows_rc_func, event_data, "begin_delete_rows"):
5446
5334
  return
5447
5335
  if self.all_rows_displayed:
@@ -5589,13 +5477,13 @@ class MainTable(tk.Canvas):
5589
5477
  elif not isinstance(newheaders, (list, tuple, int)) and index is None:
5590
5478
  try:
5591
5479
  self._headers = list(newheaders)
5592
- except Exception:
5480
+ except ValueError as error:
5593
5481
  raise ValueError(
5594
5482
  """
5595
5483
  New header must be iterable or int \
5596
5484
  (use int to use a row as the header
5597
5485
  """
5598
- )
5486
+ ) from error
5599
5487
  if reset_col_positions:
5600
5488
  self.reset_col_positions()
5601
5489
  elif (
@@ -5638,13 +5526,13 @@ class MainTable(tk.Canvas):
5638
5526
  elif not isinstance(newindex, (list, tuple, int)) and index is None:
5639
5527
  try:
5640
5528
  self._row_index = list(newindex)
5641
- except Exception:
5529
+ except ValueError as error:
5642
5530
  raise ValueError(
5643
5531
  """
5644
5532
  New index must be iterable or int \
5645
5533
  (use int to use a column as the index
5646
5534
  """
5647
- )
5535
+ ) from error
5648
5536
  if reset_row_positions:
5649
5537
  self.reset_row_positions()
5650
5538
  elif (
@@ -6038,7 +5926,7 @@ class MainTable(tk.Canvas):
6038
5926
  widths[i] = min_column_width
6039
5927
  if diffs and len(diffs) < len(widths):
6040
5928
  change = sum(diffs.values()) / (len(widths) - len(diffs))
6041
- for i, w in enumerate(widths):
5929
+ for i in range(len(widths)):
6042
5930
  if i not in diffs:
6043
5931
  widths[i] -= change
6044
5932
  self.col_positions = list(accumulate(chain([0], widths)))
@@ -6065,7 +5953,7 @@ class MainTable(tk.Canvas):
6065
5953
  heights[i] = min_row_height
6066
5954
  if diffs and len(diffs) < len(heights):
6067
5955
  change = sum(diffs.values()) / (len(heights) - len(diffs))
6068
- for i, h in enumerate(heights):
5956
+ for i in range(len(heights)):
6069
5957
  if i not in diffs:
6070
5958
  heights[i] -= change
6071
5959
  self.row_positions = list(accumulate(chain([0], heights)))
@@ -6252,10 +6140,7 @@ class MainTable(tk.Canvas):
6252
6140
  if self.PAR.ops.horizontal_grid_to_end_of_window:
6253
6141
  x_grid_stop = scrollpos_right + can_width
6254
6142
  else:
6255
- if last_col_line_pos > scrollpos_right:
6256
- x_grid_stop = x_stop + 1
6257
- else:
6258
- x_grid_stop = x_stop - 1
6143
+ x_grid_stop = x_stop + 1 if last_col_line_pos > scrollpos_right else x_stop - 1
6259
6144
  self.redraw_gridline(
6260
6145
  points=tuple(
6261
6146
  chain.from_iterable(
@@ -6278,10 +6163,7 @@ class MainTable(tk.Canvas):
6278
6163
  if self.PAR.ops.vertical_grid_to_end_of_window:
6279
6164
  y_grid_stop = scrollpos_bot + can_height
6280
6165
  else:
6281
- if last_row_line_pos > scrollpos_bot:
6282
- y_grid_stop = y_stop + 1
6283
- else:
6284
- y_grid_stop = y_stop - 1
6166
+ y_grid_stop = y_stop + 1 if last_row_line_pos > scrollpos_bot else y_stop - 1
6285
6167
  self.redraw_gridline(
6286
6168
  points=tuple(
6287
6169
  chain.from_iterable(
@@ -6305,10 +6187,7 @@ class MainTable(tk.Canvas):
6305
6187
  sel_cells_bg = color_tup(self.PAR.ops.table_selected_cells_bg)
6306
6188
  sel_cols_bg = color_tup(self.PAR.ops.table_selected_columns_bg)
6307
6189
  sel_rows_bg = color_tup(self.PAR.ops.table_selected_rows_bg)
6308
- if self.selected:
6309
- current_loc = (self.selected.row, self.selected.column)
6310
- else:
6311
- current_loc = tuple()
6190
+ current_loc = (self.selected.row, self.selected.column) if self.selected else ()
6312
6191
  if self.PAR.ops.alternate_color:
6313
6192
  alternate_color = Highlight(
6314
6193
  bg=self.PAR.ops.alternate_color,
@@ -6318,10 +6197,10 @@ class MainTable(tk.Canvas):
6318
6197
  if self.selected and box_is_single_cell(*self.selected.box) and self.PAR.ops.show_selected_cells_border:
6319
6198
  dont_blend = current_loc
6320
6199
  else:
6321
- dont_blend = tuple()
6200
+ dont_blend = ()
6322
6201
  else:
6323
6202
  alternate_color = None
6324
- dont_blend = tuple()
6203
+ dont_blend = ()
6325
6204
  if not self.PAR.ops.show_selected_cells_border:
6326
6205
  override = (
6327
6206
  color_tup(self.PAR.ops.table_selected_cells_fg),
@@ -6329,7 +6208,7 @@ class MainTable(tk.Canvas):
6329
6208
  color_tup(self.PAR.ops.table_selected_rows_fg),
6330
6209
  )
6331
6210
  else:
6332
- override = tuple()
6211
+ override = ()
6333
6212
  allow_overflow = self.PAR.ops.allow_cell_overflow
6334
6213
  wrap = self.PAR.ops.table_wrap
6335
6214
  cells = self._redraw_precache_cells(
@@ -6526,7 +6405,7 @@ class MainTable(tk.Canvas):
6526
6405
  self.itemconfig(iid, state="hidden")
6527
6406
  dct[iid] = False
6528
6407
  if self.PAR.ops.show_selected_cells_border:
6529
- for iid, box in self.selection_boxes.items():
6408
+ for _, box in self.selection_boxes.items():
6530
6409
  if box.bd_iid:
6531
6410
  self.tag_raise(box.bd_iid)
6532
6411
  if self.selected:
@@ -6588,7 +6467,7 @@ class MainTable(tk.Canvas):
6588
6467
  def reselect_from_get_boxes(
6589
6468
  self,
6590
6469
  boxes: dict,
6591
- selected: tuple = tuple(),
6470
+ selected: tuple = (),
6592
6471
  ) -> None:
6593
6472
  for (r1, c1, r2, c2), v in boxes.items():
6594
6473
  if r2 < len(self.row_positions) and c2 < len(self.col_positions):
@@ -6622,14 +6501,15 @@ class MainTable(tk.Canvas):
6622
6501
 
6623
6502
  # set current to any existing selection box with coordinates: box
6624
6503
  if isinstance(box, tuple):
6625
- for item, selection_box in self.get_selection_items(reverse=True):
6626
- if box == selection_box.coords:
6627
- if box_created(box[0] if r is None else r, box[1] if c is None else c, selection_box):
6628
- 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
6629
6509
 
6630
6510
  # set current to a coordinate, find the top most box there
6631
6511
  if isinstance(r, int) and isinstance(c, int):
6632
- for item, selection_box in self.get_selection_items(reverse=True):
6512
+ for _, selection_box in self.get_selection_items(reverse=True):
6633
6513
  if box_created(r, c, selection_box):
6634
6514
  return
6635
6515
 
@@ -6648,15 +6528,15 @@ class MainTable(tk.Canvas):
6648
6528
  def coords_and_type(self, item: int) -> tuple:
6649
6529
  if item in self.selection_boxes:
6650
6530
  return Box_t(*(self.selection_boxes[item].coords + (self.selection_boxes[item].type_,)))
6651
- return tuple()
6531
+ return ()
6652
6532
 
6653
6533
  def get_selected_box_bg_fg(self, type_: str) -> tuple:
6654
- if type_ == "cells":
6655
- return self.PAR.ops.table_selected_cells_bg, self.PAR.ops.table_selected_box_cells_fg
6656
- elif type_ == "rows":
6657
- return self.PAR.ops.table_selected_rows_bg, self.PAR.ops.table_selected_box_rows_fg
6658
- elif type_ == "columns":
6659
- 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_]
6660
6540
 
6661
6541
  def create_currently_selected_box(
6662
6542
  self,
@@ -6713,10 +6593,7 @@ class MainTable(tk.Canvas):
6713
6593
  width: int,
6714
6594
  iid: None | int = None,
6715
6595
  ) -> int:
6716
- if not self.PAR.ops.rounded_boxes or not x2 - x1 or not y2 - y1:
6717
- radius = 0
6718
- else:
6719
- radius = 5
6596
+ radius = 0 if not self.PAR.ops.rounded_boxes or not x2 - x1 or not y2 - y1 else 5
6720
6597
  coords = rounded_box_coords(
6721
6598
  x1,
6722
6599
  y1,
@@ -6773,7 +6650,7 @@ class MainTable(tk.Canvas):
6773
6650
  def hide_selected(self) -> None:
6774
6651
  if self.selected:
6775
6652
  self.hide_box(self.selected.iid)
6776
- self.selected = tuple()
6653
+ self.selected = ()
6777
6654
 
6778
6655
  def create_selection_box(
6779
6656
  self,
@@ -7283,7 +7160,7 @@ class MainTable(tk.Canvas):
7283
7160
  self.text_editor.window.set_text(self.text_editor.get() + "" if not isinstance(text, str) else text)
7284
7161
  return False
7285
7162
  self.hide_text_editor()
7286
- if not self.see(r=r, c=c, check_cell_visibility=True):
7163
+ if not self.see(r, c):
7287
7164
  self.main_table_redraw_grid_and_text(True, True)
7288
7165
  x = self.col_positions[c]
7289
7166
  y = self.row_positions[r]
@@ -7517,13 +7394,7 @@ class MainTable(tk.Canvas):
7517
7394
  new_r, new_c = None, None
7518
7395
  if isinstance(new_r, int):
7519
7396
  self.set_currently_selected(new_r, new_c, item=self.selected.fill_iid)
7520
- self.see(
7521
- new_r,
7522
- new_c,
7523
- keep_xscroll=False,
7524
- bottom_right_corner=True,
7525
- check_cell_visibility=True,
7526
- )
7397
+ self.see(new_r, new_c)
7527
7398
  self.recreate_all_selection_boxes()
7528
7399
  self.hide_text_editor_and_dropdown()
7529
7400
  if event.keysym != "FocusOut":
@@ -7536,17 +7407,11 @@ class MainTable(tk.Canvas):
7536
7407
  r,
7537
7408
  c + 1 if c < len(self.col_positions) - 2 else c,
7538
7409
  bottom_right_corner=True,
7539
- check_cell_visibility=True,
7540
7410
  )
7541
7411
 
7542
7412
  def select_down(self, r: int, c: int) -> None:
7543
7413
  self.select_cell(r + 1 if r < len(self.row_positions) - 2 else r, c)
7544
- self.see(
7545
- r + 1 if r < len(self.row_positions) - 2 else r,
7546
- c,
7547
- bottom_right_corner=True,
7548
- check_cell_visibility=True,
7549
- )
7414
+ self.see(r + 1 if r < len(self.row_positions) - 2 else r, c)
7550
7415
 
7551
7416
  def tab_key(self, event: object = None) -> str:
7552
7417
  if not self.selected:
@@ -7562,13 +7427,7 @@ class MainTable(tk.Canvas):
7562
7427
  else:
7563
7428
  new_r, new_c = cell_right_within_box(r, c, r1, c1, r2, c2, numrows, numcols)
7564
7429
  self.set_currently_selected(new_r, new_c, item=self.selected.fill_iid)
7565
- self.see(
7566
- new_r,
7567
- new_c,
7568
- keep_xscroll=False,
7569
- bottom_right_corner=True,
7570
- check_cell_visibility=True,
7571
- )
7430
+ self.see(new_r, new_c, bottom_right_corner=True)
7572
7431
  if not self.PAR.ops.show_selected_cells_border:
7573
7432
  self.refresh()
7574
7433
  return "break"
@@ -7879,7 +7738,7 @@ class MainTable(tk.Canvas):
7879
7738
  datarn: int,
7880
7739
  datacn: int,
7881
7740
  value: object,
7882
- kwargs: dict = {},
7741
+ kwargs: dict | None = None,
7883
7742
  expand_sheet: bool = True,
7884
7743
  ) -> None:
7885
7744
  if expand_sheet:
@@ -7987,10 +7846,7 @@ class MainTable(tk.Canvas):
7987
7846
  self.set_cell_data(*key, get_val(*key), expand_sheet=False)
7988
7847
 
7989
7848
  def delete_row_format(self, datarn: Literal["all"] | int = "all", clear_values: bool = False) -> None:
7990
- if isinstance(datarn, str) and datarn.lower() == "all":
7991
- itr = gen_formatted(self.row_options)
7992
- else:
7993
- itr = (datarn,)
7849
+ itr = gen_formatted(self.row_options) if isinstance(datarn, str) and datarn.lower() == "all" else (datarn,)
7994
7850
  get_val = self.get_value_for_empty_cell
7995
7851
  for datarn in itr:
7996
7852
  try:
@@ -8002,10 +7858,7 @@ class MainTable(tk.Canvas):
8002
7858
  self.set_cell_data(datarn, datacn, get_val(datarn, datacn), expand_sheet=False)
8003
7859
 
8004
7860
  def delete_column_format(self, datacn: Literal["all"] | int = "all", clear_values: bool = False) -> None:
8005
- if isinstance(datacn, str) and datacn.lower() == "all":
8006
- itr = gen_formatted(self.col_options)
8007
- else:
8008
- itr = (datacn,)
7861
+ itr = gen_formatted(self.col_options) if isinstance(datacn, str) and datacn.lower() == "all" else (datacn,)
8009
7862
  get_val = self.get_value_for_empty_cell
8010
7863
  for datacn in itr:
8011
7864
  try:
@@ -8083,9 +7936,7 @@ class MainTable(tk.Canvas):
8083
7936
  return False
8084
7937
  elif "format" in kwargs:
8085
7938
  return True
8086
- elif self.cell_equal_to(datarn, datacn, value, ignore_empty=ignore_empty):
8087
- return False
8088
- elif (
7939
+ elif self.cell_equal_to(datarn, datacn, value, ignore_empty=ignore_empty) or (
8089
7940
  (dropdown := kwargs.get("dropdown", {})) and dropdown["validate_input"] and value not in dropdown["values"]
8090
7941
  ):
8091
7942
  return False