tksheet 7.0.6__py3-none-any.whl → 7.1.1__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/column_headers.py CHANGED
@@ -9,7 +9,6 @@ from functools import (
9
9
  partial,
10
10
  )
11
11
  from itertools import (
12
- chain,
13
12
  cycle,
14
13
  islice,
15
14
  )
@@ -21,7 +20,6 @@ from .colors import (
21
20
  from .formatters import is_bool_like, try_to_bool
22
21
  from .functions import (
23
22
  consecutive_chunks,
24
- coords_tag_to_int_tuple,
25
23
  ev_stack_dict,
26
24
  event_dict,
27
25
  get_checkbox_points,
@@ -32,6 +30,8 @@ from .functions import (
32
30
  from .other_classes import (
33
31
  DotDict,
34
32
  DraggedRowColumn,
33
+ DropdownStorage,
34
+ TextEditorStorage,
35
35
  )
36
36
  from .text_editor import (
37
37
  TextEditor,
@@ -59,14 +59,9 @@ class ColumnHeaders(tk.Canvas):
59
59
  self.popup_menu_loc = None
60
60
  self.extra_begin_edit_cell_func = None
61
61
  self.extra_end_edit_cell_func = None
62
- self.text_editor = None
63
- self.text_editor_id = None
64
- self.text_editor_loc = None
65
62
  self.centre_alignment_text_mod_indexes = (slice(1, None), slice(None, -1))
66
63
  self.c_align_cyc = cycle(self.centre_alignment_text_mod_indexes)
67
64
  self.b1_pressed_loc = None
68
- self.existing_dropdown_canvas_id = None
69
- self.existing_dropdown_window = None
70
65
  self.closed_dropdown = None
71
66
  self.being_drawn_item = None
72
67
  self.extra_motion_func = None
@@ -102,6 +97,8 @@ class ColumnHeaders(tk.Canvas):
102
97
  self.currently_resizing_width = False
103
98
  self.currently_resizing_height = False
104
99
  self.ch_rc_popup_menu = None
100
+ self.dropdown = DropdownStorage()
101
+ self.text_editor = TextEditorStorage()
105
102
 
106
103
  self.disp_text = {}
107
104
  self.disp_high = {}
@@ -110,6 +107,7 @@ class ColumnHeaders(tk.Canvas):
110
107
  self.disp_resize_lines = {}
111
108
  self.disp_dropdown = {}
112
109
  self.disp_checkbox = {}
110
+ self.disp_boxes = set()
113
111
  self.hidd_text = {}
114
112
  self.hidd_high = {}
115
113
  self.hidd_grid = {}
@@ -117,6 +115,7 @@ class ColumnHeaders(tk.Canvas):
117
115
  self.hidd_resize_lines = {}
118
116
  self.hidd_dropdown = {}
119
117
  self.hidd_checkbox = {}
118
+ self.hidd_boxes = set()
120
119
 
121
120
  self.default_header = kwargs["default_header"].lower()
122
121
  self.align = kwargs["header_align"]
@@ -241,14 +240,17 @@ class ColumnHeaders(tk.Canvas):
241
240
  if c < len(self.MT.col_positions) - 1:
242
241
  c_selected = self.MT.col_selected(c)
243
242
  if not c_selected and self.col_selection_enabled:
244
- currently_selected = self.MT.currently_selected()
245
- self.MT.delete_item(self.MT.currently_selected().tags[2])
246
- if currently_selected and currently_selected.type_ == "column":
247
- box = self.get_shift_select_box(c, currently_selected.column)
248
- self.being_drawn_item = self.MT.create_selection_box(*box, set_current=currently_selected)
243
+ if self.MT.selected and self.MT.selected.type_ == "columns":
244
+ self.being_drawn_item = self.MT.recreate_selection_box(
245
+ *self.get_shift_select_box(c, self.MT.selected.column),
246
+ fill_iid=self.MT.selected.fill_iid,
247
+ )
249
248
  else:
250
- self.being_drawn_item = self.add_selection(c, run_binding_func=False, set_as_current=True)
251
- box = self.MT.get_box_from_item(self.being_drawn_item)
249
+ self.being_drawn_item = self.add_selection(
250
+ c,
251
+ run_binding_func=False,
252
+ set_as_current=True,
253
+ )
252
254
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
253
255
  if self.ctrl_selection_binding_func is not None:
254
256
  self.ctrl_selection_binding_func(
@@ -270,14 +272,13 @@ class ColumnHeaders(tk.Canvas):
270
272
  if c < len(self.MT.col_positions) - 1:
271
273
  c_selected = self.MT.col_selected(c)
272
274
  if not c_selected and self.col_selection_enabled:
273
- currently_selected = self.MT.currently_selected()
274
- if currently_selected and currently_selected.type_ == "column":
275
+ if self.MT.selected and self.MT.selected.type_ == "columns":
276
+ r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
275
277
  self.MT.deselect("all", redraw=False)
276
- box = self.get_shift_select_box(c, currently_selected.column)
277
- self.being_drawn_item = self.MT.create_selection_box(*box, set_current=currently_selected)
278
+ self.being_drawn_item = self.MT.create_selection_box(*self.get_shift_select_box(c, c_to_sel))
279
+ self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
278
280
  else:
279
- self.being_drawn_item = self.add_selection(c, run_binding_func=False, set_as_current=True)
280
- box = self.MT.get_box_from_item(self.being_drawn_item)
281
+ self.being_drawn_item = self.select_col(c, run_binding_func=False)
281
282
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
282
283
  if self.shift_selection_binding_func is not None:
283
284
  self.shift_selection_binding_func(
@@ -291,9 +292,9 @@ class ColumnHeaders(tk.Canvas):
291
292
 
292
293
  def get_shift_select_box(self, c: int, min_c: int) -> tuple[int, int, int, int, str]:
293
294
  if c > min_c:
294
- return (0, min_c, len(self.MT.row_positions) - 1, c + 1, "columns")
295
+ return 0, min_c, len(self.MT.row_positions) - 1, c + 1
295
296
  elif c < min_c:
296
- return (0, c, len(self.MT.row_positions) - 1, min_c + 1, "columns")
297
+ return 0, c, len(self.MT.row_positions) - 1, min_c + 1
297
298
 
298
299
  def create_resize_line(
299
300
  self,
@@ -486,7 +487,7 @@ class ColumnHeaders(tk.Canvas):
486
487
  x = self.canvasx(event.x)
487
488
  size = x - self.MT.col_positions[self.rsz_w - 1]
488
489
  if size >= self.MT.min_column_width and size < self.MT.max_column_width:
489
- self.delete_all_resize_and_ctrl_lines(ctrl_lines=False)
490
+ self.hide_resize_and_ctrl_lines(ctrl_lines=False)
490
491
  line2x = self.MT.col_positions[self.rsz_w - 1]
491
492
  self.create_resize_line(
492
493
  x,
@@ -518,7 +519,7 @@ class ColumnHeaders(tk.Canvas):
518
519
  )
519
520
  elif self.height_resizing_enabled and self.rsz_h is not None and self.currently_resizing_height:
520
521
  evy = event.y
521
- self.delete_all_resize_and_ctrl_lines(ctrl_lines=False)
522
+ self.hide_resize_and_ctrl_lines(ctrl_lines=False)
522
523
  if evy > self.current_height:
523
524
  y = self.MT.canvasy(evy - self.current_height)
524
525
  if evy > self.MT.max_header_height:
@@ -553,20 +554,21 @@ class ColumnHeaders(tk.Canvas):
553
554
  ):
554
555
  need_redraw = False
555
556
  end_col = self.MT.identify_col(x=event.x)
556
- currently_selected = self.MT.currently_selected()
557
- if end_col < len(self.MT.col_positions) - 1 and currently_selected:
558
- if currently_selected.type_ == "column":
559
- box = self.get_b1_motion_box(currently_selected.column, end_col)
557
+ if end_col < len(self.MT.col_positions) - 1 and self.MT.selected:
558
+ if self.MT.selected.type_ == "columns":
559
+ box = self.get_b1_motion_box(self.MT.selected.column, end_col)
560
560
  if (
561
561
  box is not None
562
562
  and self.being_drawn_item is not None
563
- and self.MT.get_box_from_item(self.being_drawn_item) != box
563
+ and self.MT.coords_and_type(self.being_drawn_item) != box
564
564
  ):
565
- self.MT.deselect("all", redraw=False)
566
565
  if box[3] - box[1] != 1:
567
- self.being_drawn_item = self.MT.create_selection_box(*box, set_current=currently_selected)
566
+ self.being_drawn_item = self.MT.recreate_selection_box(
567
+ *box[:-1],
568
+ fill_iid=self.MT.selected.fill_iid,
569
+ )
568
570
  else:
569
- self.being_drawn_item = self.select_col(currently_selected.column, run_binding_func=False)
571
+ self.being_drawn_item = self.select_col(self.MT.selected.column, run_binding_func=False)
570
572
  need_redraw = True
571
573
  if self.drag_selection_binding_func is not None:
572
574
  self.drag_selection_binding_func(
@@ -581,21 +583,9 @@ class ColumnHeaders(tk.Canvas):
581
583
 
582
584
  def get_b1_motion_box(self, start_col, end_col):
583
585
  if end_col >= start_col:
584
- return (
585
- 0,
586
- start_col,
587
- len(self.MT.row_positions) - 1,
588
- end_col + 1,
589
- "columns",
590
- )
586
+ return 0, start_col, len(self.MT.row_positions) - 1, end_col + 1, "columns"
591
587
  elif end_col < start_col:
592
- return (
593
- 0,
594
- end_col,
595
- len(self.MT.row_positions) - 1,
596
- start_col + 1,
597
- "columns",
598
- )
588
+ return 0, end_col, len(self.MT.row_positions) - 1, start_col + 1, "columns"
599
589
 
600
590
  def ctrl_b1_motion(self, event: object):
601
591
  x1, y1, x2, y2 = self.MT.get_canvas_visible_area()
@@ -624,22 +614,22 @@ class ColumnHeaders(tk.Canvas):
624
614
  ):
625
615
  need_redraw = False
626
616
  end_col = self.MT.identify_col(x=event.x)
627
- currently_selected = self.MT.currently_selected()
628
- if end_col < len(self.MT.col_positions) - 1 and currently_selected:
629
- if currently_selected.type_ == "column":
630
- box = self.get_b1_motion_box(currently_selected.column, end_col)
617
+ if end_col < len(self.MT.col_positions) - 1 and self.MT.selected:
618
+ if self.MT.selected.type_ == "columns":
619
+ box = self.get_b1_motion_box(self.MT.selected.column, end_col)
631
620
  if (
632
621
  box is not None
633
622
  and self.being_drawn_item is not None
634
- and self.MT.get_box_from_item(self.being_drawn_item) != box
623
+ and self.MT.coords_and_type(self.being_drawn_item) != box
635
624
  ):
636
- self.MT.delete_item(self.being_drawn_item)
637
625
  if box[3] - box[1] != 1:
638
- self.being_drawn_item = self.MT.create_selection_box(*box, set_current=currently_selected)
639
- else:
640
- self.being_drawn_item = self.add_selection(
641
- currently_selected.column, run_binding_func=False
626
+ self.being_drawn_item = self.MT.recreate_selection_box(
627
+ *box[:-1],
628
+ self.MT.selected.fill_iid,
642
629
  )
630
+ else:
631
+ self.MT.hide_selection_box(self.MT.selected.fill_iid)
632
+ self.being_drawn_item = self.add_selection(box[1], run_binding_func=False)
643
633
  need_redraw = True
644
634
  if self.drag_selection_binding_func is not None:
645
635
  self.drag_selection_binding_func(
@@ -694,7 +684,7 @@ class ColumnHeaders(tk.Canvas):
694
684
  y2,
695
685
  cols,
696
686
  ):
697
- self.delete_all_resize_and_ctrl_lines()
687
+ self.hide_resize_and_ctrl_lines()
698
688
  self.create_resize_line(
699
689
  xpos,
700
690
  0,
@@ -714,7 +704,7 @@ class ColumnHeaders(tk.Canvas):
714
704
  delete_on_timer=False,
715
705
  )
716
706
 
717
- def delete_all_resize_and_ctrl_lines(self, ctrl_lines=True):
707
+ def hide_resize_and_ctrl_lines(self, ctrl_lines=True):
718
708
  self.delete_resize_lines()
719
709
  self.MT.delete_resize_lines()
720
710
  if ctrl_lines:
@@ -771,11 +761,15 @@ class ColumnHeaders(tk.Canvas):
771
761
 
772
762
  def b1_release(self, event: object):
773
763
  if self.being_drawn_item is not None:
774
- currently_selected = self.MT.currently_selected()
775
- to_sel = self.MT.get_box_from_item(self.being_drawn_item)
776
- self.MT.delete_item(self.being_drawn_item)
764
+ to_sel = self.MT.coords_and_type(self.being_drawn_item)
765
+ r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
766
+ self.MT.hide_selection_box(self.being_drawn_item)
777
767
  self.being_drawn_item = None
778
- self.MT.create_selection_box(*to_sel, set_current=currently_selected)
768
+ self.MT.set_currently_selected(
769
+ r_to_sel,
770
+ c_to_sel,
771
+ item=self.MT.create_selection_box(*to_sel, set_current=False),
772
+ )
779
773
  if self.drag_selection_binding_func is not None:
780
774
  self.drag_selection_binding_func(
781
775
  self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
@@ -784,7 +778,7 @@ class ColumnHeaders(tk.Canvas):
784
778
  if self.width_resizing_enabled and self.rsz_w is not None and self.currently_resizing_width:
785
779
  self.currently_resizing_width = False
786
780
  new_col_pos = int(self.coords("rwl")[0])
787
- self.delete_all_resize_and_ctrl_lines(ctrl_lines=False)
781
+ self.hide_resize_and_ctrl_lines(ctrl_lines=False)
788
782
  old_width = self.MT.col_positions[self.rsz_w] - self.MT.col_positions[self.rsz_w - 1]
789
783
  size = new_col_pos - self.MT.col_positions[self.rsz_w - 1]
790
784
  if size < self.MT.min_column_width:
@@ -810,7 +804,7 @@ class ColumnHeaders(tk.Canvas):
810
804
  )
811
805
  elif self.height_resizing_enabled and self.rsz_h is not None and self.currently_resizing_height:
812
806
  self.currently_resizing_height = False
813
- self.delete_all_resize_and_ctrl_lines(ctrl_lines=False)
807
+ self.hide_resize_and_ctrl_lines(ctrl_lines=False)
814
808
  self.set_height(self.new_col_height, set_TL=True)
815
809
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
816
810
  elif (
@@ -822,7 +816,7 @@ class ColumnHeaders(tk.Canvas):
822
816
  and self.dragged_col is not None
823
817
  and self.find_withtag("move_columns")
824
818
  ):
825
- self.delete_all_resize_and_ctrl_lines()
819
+ self.hide_resize_and_ctrl_lines()
826
820
  c = self.MT.identify_col(x=event.x)
827
821
  totalcols = len(self.dragged_col.to_move)
828
822
  if (
@@ -840,7 +834,7 @@ class ColumnHeaders(tk.Canvas):
840
834
  name="move_columns",
841
835
  sheet=self.PAR.name,
842
836
  boxes=self.MT.get_boxes(),
843
- selected=self.MT.currently_selected(),
837
+ selected=self.MT.selected,
844
838
  value=c,
845
839
  )
846
840
  if try_binding(self.ch_extra_begin_drag_drop_func, event_data, "begin_move_columns"):
@@ -932,6 +926,32 @@ class ColumnHeaders(tk.Canvas):
932
926
  self.MT.run_selection_binding("columns")
933
927
  return fill_iid
934
928
 
929
+ def display_box(
930
+ self,
931
+ x1: int,
932
+ y1: int,
933
+ x2: int,
934
+ y2: int,
935
+ fill: str,
936
+ outline: str,
937
+ state: str,
938
+ tags: str | tuple[str],
939
+ ) -> int:
940
+ if self.hidd_boxes:
941
+ iid = self.hidd_boxes.pop()
942
+ self.coords(iid, x1, y1, x2, y2)
943
+ self.itemconfig(iid, fill=fill, outline=outline, state=state, tags=tags)
944
+ else:
945
+ iid = self.create_rectangle(x1, y1, x2, y2, fill=fill, outline=outline, state=state, tags=tags)
946
+ self.disp_boxes.add(iid)
947
+ return iid
948
+
949
+ def hide_box(self, item: int) -> None:
950
+ if isinstance(item, int):
951
+ self.disp_boxes.discard(item)
952
+ self.hidd_boxes.add(item)
953
+ self.itemconfig(item, state="hidden")
954
+
935
955
  def get_cell_dimensions(self, datacn):
936
956
  txt = self.get_valid_cell_data_as_str(datacn, fix=False)
937
957
  if txt:
@@ -1213,27 +1233,30 @@ class ColumnHeaders(tk.Canvas):
1213
1233
  if draw_outline and self.PAR.ops.show_dropdown_borders:
1214
1234
  self.redraw_highlight(x1 + 1, y1 + 1, x2, y2, fill="", outline=self.PAR.ops.header_fg, tag=tag)
1215
1235
  if draw_arrow:
1216
- topysub = floor(self.MT.header_half_txt_height / 2)
1217
- mid_y = y1 + floor(self.MT.min_header_height / 2)
1218
- if mid_y + topysub + 1 >= y1 + self.MT.header_txt_height - 1:
1219
- mid_y -= 1
1220
- if mid_y - topysub + 2 <= y1 + 4 + topysub:
1221
- mid_y -= 1
1222
- ty1 = mid_y + topysub + 1 if dd_is_open else mid_y - topysub + 3
1223
- ty2 = mid_y - topysub + 3 if dd_is_open else mid_y + topysub + 1
1224
- ty3 = mid_y + topysub + 1 if dd_is_open else mid_y - topysub + 3
1236
+ mod = (self.MT.header_txt_height - 1) if self.MT.header_txt_height % 2 else self.MT.header_txt_height
1237
+ half_mod = mod / 2
1238
+ qtr_mod = mod / 4
1239
+ mid_y = (
1240
+ (self.MT.header_first_ln_ins - 1) if self.MT.header_first_ln_ins % 2 else self.MT.header_first_ln_ins
1241
+ )
1242
+ if dd_is_open:
1243
+ points = (
1244
+ x2 - 3 - mod,
1245
+ y1 + mid_y + qtr_mod,
1246
+ x2 - 3 - half_mod,
1247
+ y1 + mid_y - qtr_mod,
1248
+ x2 - 3,
1249
+ y1 + mid_y + qtr_mod,
1250
+ )
1225
1251
  else:
1226
- ty1 = mid_y + topysub + 1 if dd_is_open else mid_y - topysub + 2
1227
- ty2 = mid_y - topysub + 2 if dd_is_open else mid_y + topysub + 1
1228
- ty3 = mid_y + topysub + 1 if dd_is_open else mid_y - topysub + 2
1229
- tx1 = x2 - self.MT.header_txt_height + 1
1230
- tx2 = x2 - self.MT.header_half_txt_height - 1
1231
- tx3 = x2 - 3
1232
- if tx2 - tx1 > tx3 - tx2:
1233
- tx1 += (tx2 - tx1) - (tx3 - tx2)
1234
- elif tx2 - tx1 < tx3 - tx2:
1235
- tx1 -= (tx3 - tx2) - (tx2 - tx1)
1236
- points = (tx1, ty1, tx2, ty2, tx3, ty3)
1252
+ points = (
1253
+ x2 - 3 - mod,
1254
+ y1 + mid_y - qtr_mod,
1255
+ x2 - 3 - half_mod,
1256
+ y1 + mid_y + qtr_mod,
1257
+ x2 - 3,
1258
+ y1 + mid_y - qtr_mod,
1259
+ )
1237
1260
  if self.hidd_dropdown:
1238
1261
  t, sh = self.hidd_dropdown.popitem()
1239
1262
  self.coords(t, points)
@@ -1364,7 +1387,7 @@ class ColumnHeaders(tk.Canvas):
1364
1387
  )
1365
1388
  font = self.PAR.ops.header_font
1366
1389
  selections = self.get_redraw_selections(start_col, end_col)
1367
- dd_coords = self.get_existing_dropdown_coords()
1390
+ dd_coords = self.dropdown.get_coords()
1368
1391
  for c in range(start_col, end_col - 1):
1369
1392
  draw_y = self.MT.header_first_ln_ins
1370
1393
  cleftgridln = self.MT.col_positions[c]
@@ -1554,10 +1577,8 @@ class ColumnHeaders(tk.Canvas):
1554
1577
 
1555
1578
  def get_redraw_selections(self, startc, endc):
1556
1579
  d = defaultdict(list)
1557
- for item in chain(self.find_withtag("cells"), self.find_withtag("columns")):
1558
- tags = self.gettags(item)
1559
- if tags:
1560
- d[tags[0]].append(coords_tag_to_int_tuple(tags[1]))
1580
+ for item, box in self.MT.get_selection_items(rows=False):
1581
+ d[box.type_].append(box.coords)
1561
1582
  d2 = {}
1562
1583
  if "cells" in d:
1563
1584
  d2["cells"] = {c for c in range(startc, endc) for r1, c1, r2, c2 in d["cells"] if c1 <= c and c2 > c}
@@ -1566,23 +1587,22 @@ class ColumnHeaders(tk.Canvas):
1566
1587
  return d2
1567
1588
 
1568
1589
  def open_cell(self, event: object = None, ignore_existing_editor=False):
1569
- if not self.MT.anything_selected() or (not ignore_existing_editor and self.text_editor_id is not None):
1590
+ if not self.MT.anything_selected() or (not ignore_existing_editor and self.text_editor.open):
1570
1591
  return
1571
- currently_selected = self.MT.currently_selected()
1572
- if not currently_selected:
1592
+ if not self.MT.selected:
1573
1593
  return
1574
- x1 = currently_selected[1]
1575
- datacn = x1 if self.MT.all_columns_displayed else self.MT.displayed_columns[x1]
1594
+ c = self.MT.selected.column
1595
+ datacn = self.MT.datacn(c)
1576
1596
  if self.get_cell_kwargs(datacn, key="readonly"):
1577
1597
  return
1578
1598
  elif self.get_cell_kwargs(datacn, key="dropdown") or self.get_cell_kwargs(datacn, key="checkbox"):
1579
1599
  if self.MT.event_opens_dropdown_or_checkbox(event):
1580
1600
  if self.get_cell_kwargs(datacn, key="dropdown"):
1581
- self.open_dropdown_window(x1, event=event)
1601
+ self.open_dropdown_window(c, event=event)
1582
1602
  elif self.get_cell_kwargs(datacn, key="checkbox"):
1583
- self.click_checkbox(x1, datacn)
1603
+ self.click_checkbox(c, datacn)
1584
1604
  elif self.edit_cell_enabled:
1585
- self.open_text_editor(event=event, c=x1, dropdown=False)
1605
+ self.open_text_editor(event=event, c=c, dropdown=False)
1586
1606
 
1587
1607
  # displayed indexes
1588
1608
  def get_cell_align(self, c: int) -> str:
@@ -1626,7 +1646,6 @@ class ColumnHeaders(tk.Canvas):
1626
1646
  text = event.char
1627
1647
  else:
1628
1648
  return False
1629
- self.text_editor_loc = c
1630
1649
  if self.extra_begin_edit_cell_func is not None:
1631
1650
  try:
1632
1651
  text = self.extra_begin_edit_cell_func(
@@ -1637,7 +1656,7 @@ class ColumnHeaders(tk.Canvas):
1637
1656
  value=text,
1638
1657
  loc=c,
1639
1658
  boxes=self.MT.get_boxes(),
1640
- selected=self.MT.currently_selected(),
1659
+ selected=self.MT.selected,
1641
1660
  )
1642
1661
  )
1643
1662
  except Exception:
@@ -1651,14 +1670,13 @@ class ColumnHeaders(tk.Canvas):
1651
1670
  if self.height_resizing_enabled:
1652
1671
  self.set_height_of_header_to_text(text)
1653
1672
  self.set_col_width_run_binding(c)
1654
- if c == self.text_editor_loc and self.text_editor is not None:
1673
+ if self.text_editor.open and c == self.text_editor.column:
1655
1674
  self.text_editor.set_text(self.text_editor.get() + "" if not isinstance(text, str) else text)
1656
1675
  return
1657
- if self.text_editor is not None:
1658
- self.destroy_text_editor()
1676
+ if self.text_editor.open:
1677
+ self.hide_text_editor()
1659
1678
  if not self.MT.see(r=0, c=c, keep_yscroll=True, check_cell_visibility=True):
1660
1679
  self.MT.refresh()
1661
- self.text_editor_loc = c
1662
1680
  x = self.MT.col_positions[c] + 1
1663
1681
  y = 0
1664
1682
  w = self.MT.col_positions[c + 1] - x
@@ -1667,72 +1685,76 @@ class ColumnHeaders(tk.Canvas):
1667
1685
  if text is None:
1668
1686
  text = self.get_cell_data(datacn, none_to_empty_str=True, redirect_int=True)
1669
1687
  bg, fg = self.PAR.ops.header_bg, self.PAR.ops.header_fg
1670
- self.text_editor = TextEditor(
1671
- self,
1672
- menu_kwargs=DotDict(
1688
+ kwargs = {
1689
+ "menu_kwargs": DotDict(
1673
1690
  {
1674
- "font": self.PAR.ops.header_font,
1691
+ "font": self.PAR.ops.table_font,
1675
1692
  "foreground": self.PAR.ops.popup_menu_fg,
1676
1693
  "background": self.PAR.ops.popup_menu_bg,
1677
1694
  "activebackground": self.PAR.ops.popup_menu_highlight_bg,
1678
1695
  "activeforeground": self.PAR.ops.popup_menu_highlight_fg,
1679
1696
  }
1680
1697
  ),
1681
- sheet_ops=self.PAR.ops,
1682
- border_color=self.PAR.ops.table_selected_columns_border_fg,
1683
- text=text,
1684
- state=state,
1685
- width=w,
1686
- height=h,
1687
- show_border=False,
1688
- bg=bg,
1689
- fg=fg,
1690
- align=self.get_cell_align(c),
1691
- c=c,
1692
- newline_binding=self.text_editor_has_wrapped,
1693
- )
1694
- self.text_editor.update_idletasks()
1695
- self.text_editor_id = self.create_window((x, y), window=self.text_editor, anchor="nw")
1698
+ "sheet_ops": self.PAR.ops,
1699
+ "border_color": self.PAR.ops.table_selected_cells_border_fg,
1700
+ "text": text,
1701
+ "state": state,
1702
+ "width": w,
1703
+ "height": h,
1704
+ "show_border": self.PAR.ops.show_selected_cells_border,
1705
+ "bg": bg,
1706
+ "fg": fg,
1707
+ "align": self.get_cell_align(c),
1708
+ "c": c,
1709
+ }
1710
+ if not self.text_editor.window:
1711
+ self.text_editor.window = TextEditor(self, newline_binding=self.text_editor_newline_binding)
1712
+ self.text_editor.canvas_id = self.create_window((x, y), window=self.text_editor.window, anchor="nw")
1713
+ self.text_editor.window.reset(**kwargs)
1714
+ if not self.text_editor.open:
1715
+ self.itemconfig(self.text_editor.canvas_id, state="normal")
1716
+ self.text_editor.open = True
1717
+ self.coords(self.text_editor.canvas_id, x, y)
1696
1718
  if not dropdown:
1697
- self.text_editor.textedit.focus_set()
1698
- self.text_editor.scroll_to_bottom()
1699
- self.text_editor.textedit.bind("<Alt-Return>", lambda _x: self.text_editor_newline_binding(c=c))
1719
+ self.text_editor.tktext.focus_set()
1720
+ self.text_editor.window.scroll_to_bottom()
1721
+ self.text_editor.tktext.bind("<Alt-Return>", lambda _x: self.text_editor_newline_binding(c=c))
1700
1722
  if USER_OS == "darwin":
1701
- self.text_editor.textedit.bind("<Option-Return>", lambda _x: self.text_editor_newline_binding(c=c))
1723
+ self.text_editor.tktext.bind("<Option-Return>", lambda _x: self.text_editor_newline_binding(c=c))
1702
1724
  for key, func in self.MT.text_editor_user_bound_keys.items():
1703
- self.text_editor.textedit.bind(key, func)
1704
- self.text_editor.textedit.bind("<Tab>", lambda _x: self.close_text_editor((c, "Tab")))
1705
- self.text_editor.textedit.bind("<Return>", lambda _x: self.close_text_editor((c, "Return")))
1725
+ self.text_editor.tktext.bind(key, func)
1726
+ self.text_editor.tktext.bind("<Tab>", lambda _x: self.close_text_editor((c, "Tab")))
1727
+ self.text_editor.tktext.bind("<Return>", lambda _x: self.close_text_editor((c, "Return")))
1706
1728
  if not dropdown:
1707
- self.text_editor.textedit.bind("<FocusOut>", lambda _x: self.close_text_editor((c, "FocusOut")))
1708
- self.text_editor.textedit.bind("<Escape>", lambda _x: self.close_text_editor((c, "Escape")))
1729
+ self.text_editor.tktext.bind("<FocusOut>", lambda _x: self.close_text_editor((c, "FocusOut")))
1730
+ self.text_editor.tktext.bind("<Escape>", lambda _x: self.close_text_editor((c, "Escape")))
1709
1731
  return True
1710
1732
 
1711
1733
  # displayed indexes #just here to receive text editor arg
1712
1734
  def text_editor_has_wrapped(self, r=0, c=0, check_lines=None):
1713
1735
  if self.width_resizing_enabled:
1714
- datacn = c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
1715
- curr_width = self.text_editor.winfo_width()
1736
+ curr_width = self.text_editor.window.winfo_width()
1716
1737
  new_width = curr_width + (self.MT.header_txt_height * 2)
1717
1738
  if new_width != curr_width:
1718
- self.text_editor.config(width=new_width)
1739
+ self.text_editor.window.config(width=new_width)
1719
1740
  self.set_col_width_run_binding(c, width=new_width, only_set_if_too_small=False)
1720
- kwargs = self.get_cell_kwargs(datacn, key="dropdown")
1721
- if kwargs:
1722
- self.itemconfig(kwargs["canvas_id"], width=new_width)
1723
- kwargs["window"].update_idletasks()
1724
- kwargs["window"]._reselect()
1741
+ if self.dropdown.open and self.dropdown.get_coords() == c:
1742
+ self.itemconfig(self.dropdown.canvas_id, width=new_width)
1743
+ self.dropdown.window.update_idletasks()
1744
+ self.dropdown.window._reselect()
1725
1745
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False, redraw_table=True)
1726
- self.coords(self.text_editor_id, self.MT.col_positions[c] + 1, 0)
1746
+ self.coords(self.text_editor.canvas_id, self.MT.col_positions[c] + 1, 0)
1727
1747
 
1728
1748
  # displayed indexes
1729
1749
  def text_editor_newline_binding(self, r=0, c=0, event: object = None, check_lines=True):
1730
1750
  if self.height_resizing_enabled:
1731
- datacn = c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
1732
- curr_height = self.text_editor.winfo_height()
1751
+ curr_height = self.text_editor.window.winfo_height()
1733
1752
  if (
1734
1753
  not check_lines
1735
- or self.MT.get_lines_cell_height(self.text_editor.get_num_lines() + 1, font=self.PAR.ops.header_font)
1754
+ or self.MT.get_lines_cell_height(
1755
+ self.text_editor.window.get_num_lines() + 1,
1756
+ font=self.PAR.ops.header_font,
1757
+ )
1736
1758
  > curr_height
1737
1759
  ):
1738
1760
  new_height = curr_height + self.MT.header_xtra_lines_increment
@@ -1740,69 +1762,54 @@ class ColumnHeaders(tk.Canvas):
1740
1762
  if new_height > space_bot:
1741
1763
  new_height = space_bot
1742
1764
  if new_height != curr_height:
1743
- self.text_editor.config(height=new_height)
1765
+ self.text_editor.window.config(height=new_height)
1744
1766
  self.set_height(new_height, set_TL=True)
1745
- kwargs = self.get_cell_kwargs(datacn, key="dropdown")
1746
- if kwargs:
1767
+ if self.dropdown.open and self.dropdown.get_coords() == c:
1747
1768
  win_h, anchor = self.get_dropdown_height_anchor(c, new_height)
1748
1769
  self.coords(
1749
- kwargs["canvas_id"],
1770
+ self.dropdown.canvas_id,
1750
1771
  self.MT.col_positions[c],
1751
1772
  new_height - 1,
1752
1773
  )
1753
- self.itemconfig(kwargs["canvas_id"], anchor=anchor, height=win_h)
1774
+ self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1754
1775
 
1755
1776
  def refresh_open_window_positions(self):
1756
- if self.text_editor is not None:
1757
- c = self.text_editor_loc
1758
- self.text_editor.config(height=self.MT.col_positions[c + 1] - self.MT.col_positions[c])
1777
+ if self.text_editor.open:
1778
+ c = self.text_editor.column
1779
+ self.text_editor.window.config(height=self.MT.col_positions[c + 1] - self.MT.col_positions[c])
1759
1780
  self.coords(
1760
- self.text_editor_id,
1781
+ self.text_editor.canvas_id,
1761
1782
  0,
1762
1783
  self.MT.col_positions[c],
1763
1784
  )
1764
- if self.existing_dropdown_window is not None:
1765
- c = self.get_existing_dropdown_coords()
1766
- if self.text_editor is None:
1767
- text_editor_h = self.MT.col_positions[c + 1] - self.MT.col_positions[c]
1768
- anchor = self.itemcget(self.existing_dropdown_canvas_id, "anchor")
1769
- win_h = 0
1770
- else:
1771
- text_editor_h = self.text_editor.winfo_height()
1785
+ if self.dropdown.open:
1786
+ c = self.dropdown.get_coords()
1787
+ if self.text_editor.open:
1788
+ text_editor_h = self.text_editor.window.winfo_height()
1772
1789
  win_h, anchor = self.get_dropdown_height_anchor(c, text_editor_h)
1790
+ else:
1791
+ text_editor_h = self.MT.col_positions[c + 1] - self.MT.col_positions[c]
1792
+ anchor = self.itemcget(self.dropdown.canvas_id, "anchor")
1793
+ # win_h = 0
1773
1794
  if anchor == "nw":
1774
1795
  self.coords(
1775
- self.existing_dropdown_canvas_id,
1796
+ self.dropdown.canvas_id,
1776
1797
  0,
1777
1798
  self.MT.col_positions[c] + text_editor_h - 1,
1778
1799
  )
1779
- # self.itemconfig(self.existing_dropdown_canvas_id, anchor=anchor, height=win_h)
1800
+ # self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1780
1801
  elif anchor == "sw":
1781
1802
  self.coords(
1782
- self.existing_dropdown_canvas_id,
1803
+ self.dropdown.canvas_id,
1783
1804
  0,
1784
1805
  self.MT.col_positions[c],
1785
1806
  )
1786
- # self.itemconfig(self.existing_dropdown_canvas_id, anchor=anchor, height=win_h)
1807
+ # self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1787
1808
 
1788
- def bind_text_editor_destroy(self, binding, c):
1789
- self.text_editor.textedit.bind("<Return>", lambda _x: binding((c, "Return")))
1790
- self.text_editor.textedit.bind("<FocusOut>", lambda _x: binding((c, "FocusOut")))
1791
- self.text_editor.textedit.bind("<Escape>", lambda _x: binding((c, "Escape")))
1792
- self.text_editor.textedit.focus_set()
1793
-
1794
- def destroy_text_editor(self, reason: None | str = None) -> None:
1795
- self.text_editor_loc = None
1796
- try:
1797
- self.delete(self.text_editor_id)
1798
- except Exception:
1799
- pass
1800
- try:
1801
- self.text_editor.destroy()
1802
- except Exception:
1803
- pass
1804
- self.text_editor = None
1805
- self.text_editor_id = None
1809
+ def hide_text_editor(self, reason: None | str = None) -> None:
1810
+ if self.text_editor.open:
1811
+ self.itemconfig(self.text_editor.canvas_id, state="hidden")
1812
+ self.text_editor.open = False
1806
1813
  if reason == "Escape":
1807
1814
  self.focus_set()
1808
1815
 
@@ -1814,19 +1821,17 @@ class ColumnHeaders(tk.Canvas):
1814
1821
  # checking if text editor should be closed or not
1815
1822
  focused = self.focus_get()
1816
1823
  try:
1817
- if focused == self.text_editor.textedit.rc_popup_menu:
1824
+ if focused == self.text_editor.tktext.rc_popup_menu:
1818
1825
  return "break"
1819
1826
  except Exception:
1820
1827
  pass
1821
1828
  if focused is None and editor_info:
1822
1829
  return "break"
1823
1830
  if editor_info[1] == "Escape":
1824
- self.destroy_text_editor("Escape")
1825
- self.close_dropdown_window()
1831
+ self.hide_text_editor_and_dropdown()
1826
1832
  return
1827
1833
  # setting cell data with text editor value
1828
1834
  self.text_editor_value = self.text_editor.get()
1829
- self.destroy_text_editor()
1830
1835
  c = editor_info[0]
1831
1836
  datacn = c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
1832
1837
  event_data = event_dict(
@@ -1837,7 +1842,7 @@ class ColumnHeaders(tk.Canvas):
1837
1842
  value=self.text_editor_value,
1838
1843
  loc=c,
1839
1844
  boxes=self.MT.get_boxes(),
1840
- selected=self.MT.currently_selected(),
1845
+ selected=self.MT.selected,
1841
1846
  )
1842
1847
  edited = False
1843
1848
  set_data = partial(
@@ -1854,9 +1859,8 @@ class ColumnHeaders(tk.Canvas):
1854
1859
  edited = set_data(value=self.text_editor_value)
1855
1860
  if edited:
1856
1861
  try_binding(self.extra_end_edit_cell_func, event_data)
1857
- self.close_dropdown_window(c)
1858
1862
  self.MT.recreate_all_selection_boxes()
1859
- self.MT.refresh()
1863
+ self.hide_text_editor_and_dropdown()
1860
1864
  if editor_info[1] != "FocusOut":
1861
1865
  self.focus_set()
1862
1866
  return "break"
@@ -1897,8 +1901,7 @@ class ColumnHeaders(tk.Canvas):
1897
1901
  dd_window.search_and_see(event)
1898
1902
 
1899
1903
  def open_dropdown_window(self, c, datacn=None, event: object = None):
1900
- self.destroy_text_editor("Escape")
1901
- self.destroy_opened_dropdown_window()
1904
+ self.hide_text_editor("Escape")
1902
1905
  if datacn is None:
1903
1906
  datacn = c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
1904
1907
  kwargs = self.get_cell_kwargs(datacn, key="dropdown")
@@ -1906,61 +1909,68 @@ class ColumnHeaders(tk.Canvas):
1906
1909
  if not self.open_text_editor(event=event, c=c, dropdown=True):
1907
1910
  return
1908
1911
  win_h, anchor = self.get_dropdown_height_anchor(c)
1909
- window = self.PAR.dropdown_class(
1910
- self.MT.winfo_toplevel(),
1911
- 0,
1912
- c,
1913
- width=self.MT.col_positions[c + 1] - self.MT.col_positions[c] + 1,
1914
- height=win_h,
1915
- font=self.PAR.ops.header_font,
1916
- colors={
1917
- "bg": self.PAR.ops.popup_menu_bg,
1918
- "fg": self.PAR.ops.popup_menu_fg,
1919
- "highlight_bg": self.PAR.ops.popup_menu_highlight_bg,
1920
- "highlight_fg": self.PAR.ops.popup_menu_highlight_fg,
1921
- },
1922
- outline_color=self.PAR.ops.popup_menu_fg,
1923
- values=kwargs["values"],
1924
- close_dropdown_window=self.close_dropdown_window,
1925
- search_function=kwargs["search_function"],
1926
- arrowkey_RIGHT=self.MT.arrowkey_RIGHT,
1927
- arrowkey_LEFT=self.MT.arrowkey_LEFT,
1928
- align="w",
1929
- single_index="c",
1930
- )
1931
1912
  ypos = self.current_height - 1
1932
- kwargs["canvas_id"] = self.create_window((self.MT.col_positions[c], ypos), window=window, anchor=anchor)
1913
+ if self.dropdown.window is not None:
1914
+ self.dropdown.window.search_function = kwargs["search_function"]
1915
+ self.dropdown.window.c = c
1916
+ self.dropdown.window.row = -1
1917
+ self.dropdown.window.set_options()
1918
+ self.dropdown.window.values(kwargs["values"])
1919
+ if not self.dropdown.open:
1920
+ self.itemconfig(self.dropdown.canvas_id, state="normal")
1921
+ self.coords(self.dropdown.canvas_id, self.MT.col_positions[c], ypos)
1922
+ else:
1923
+ self.dropdown.window = self.PAR.dropdown_class(
1924
+ self.MT.winfo_toplevel(),
1925
+ 0,
1926
+ c,
1927
+ width=self.MT.col_positions[c + 1] - self.MT.col_positions[c] + 1,
1928
+ height=win_h,
1929
+ font=self.PAR.ops.header_font,
1930
+ ops=self.PAR.ops,
1931
+ outline_color=self.PAR.ops.popup_menu_fg,
1932
+ values=kwargs["values"],
1933
+ close_dropdown_window=self.close_dropdown_window,
1934
+ search_function=kwargs["search_function"],
1935
+ arrowkey_RIGHT=self.MT.arrowkey_RIGHT,
1936
+ arrowkey_LEFT=self.MT.arrowkey_LEFT,
1937
+ align="w",
1938
+ single_index="c",
1939
+ )
1940
+ self.dropdown.canvas_id = self.create_window(
1941
+ (self.MT.col_positions[c], ypos),
1942
+ window=self.dropdown.window,
1943
+ anchor=anchor,
1944
+ )
1933
1945
  if kwargs["state"] == "normal":
1934
- self.text_editor.textedit.bind(
1946
+ self.text_editor.tktext.bind(
1935
1947
  "<<TextModified>>",
1936
1948
  lambda _x: self.dropdown_text_editor_modified(
1937
- window,
1949
+ self.dropdown.window,
1938
1950
  event_dict(
1939
1951
  name="header_dropdown_modified",
1940
1952
  sheet=self.PAR.name,
1941
1953
  value=self.text_editor.get(),
1942
1954
  loc=c,
1943
1955
  boxes=self.MT.get_boxes(),
1944
- selected=self.MT.currently_selected(),
1956
+ selected=self.MT.selected,
1945
1957
  ),
1946
1958
  kwargs["modified_function"],
1947
1959
  ),
1948
1960
  )
1949
1961
  self.update_idletasks()
1950
1962
  try:
1951
- self.after(1, lambda: self.text_editor.textedit.focus())
1952
- self.after(2, self.text_editor.scroll_to_bottom())
1963
+ self.after(1, lambda: self.text_editor.tktext.focus())
1964
+ self.after(2, self.text_editor.window.scroll_to_bottom())
1953
1965
  except Exception:
1954
1966
  return
1955
1967
  redraw = False
1956
1968
  else:
1957
- window.bind("<FocusOut>", lambda _x: self.close_dropdown_window(c))
1969
+ self.dropdown.window.bind("<FocusOut>", lambda _x: self.close_dropdown_window(c))
1958
1970
  self.update_idletasks()
1959
- window.focus_set()
1971
+ self.dropdown.window.focus_set()
1960
1972
  redraw = True
1961
- self.existing_dropdown_window = window
1962
- kwargs["window"] = window
1963
- self.existing_dropdown_canvas_id = kwargs["canvas_id"]
1973
+ self.dropdown.open = True
1964
1974
  if redraw:
1965
1975
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False, redraw_table=False)
1966
1976
 
@@ -1978,7 +1988,7 @@ class ColumnHeaders(tk.Canvas):
1978
1988
  value=selection,
1979
1989
  loc=c,
1980
1990
  boxes=self.MT.get_boxes(),
1981
- selected=self.MT.currently_selected(),
1991
+ selected=self.MT.selected,
1982
1992
  )
1983
1993
  if kwargs["select_function"] is not None:
1984
1994
  kwargs["select_function"](event_data)
@@ -1992,23 +2002,20 @@ class ColumnHeaders(tk.Canvas):
1992
2002
  try_binding(self.extra_end_edit_cell_func, event_data)
1993
2003
  self.focus_set()
1994
2004
  self.MT.recreate_all_selection_boxes()
1995
- self.destroy_text_editor("Escape")
1996
- self.destroy_opened_dropdown_window(c)
2005
+ self.hide_text_editor_and_dropdown(redraw=redraw)
2006
+
2007
+ def hide_text_editor_and_dropdown(self, redraw: bool = True) -> None:
2008
+ self.hide_text_editor("Escape")
2009
+ self.hide_dropdown_window()
1997
2010
  if redraw:
1998
2011
  self.MT.refresh()
1999
2012
 
2000
- def get_existing_dropdown_coords(self):
2001
- if self.existing_dropdown_window is not None:
2002
- return int(self.existing_dropdown_window.c)
2003
- return None
2004
-
2005
2013
  def mouseclick_outside_editor_or_dropdown(self, inside: bool = False):
2006
- closed_dd_coords = self.get_existing_dropdown_coords()
2007
- if self.text_editor_loc is not None and self.text_editor is not None:
2008
- self.close_text_editor((self.text_editor_loc, "ButtonPress-1"))
2014
+ closed_dd_coords = self.dropdown.get_coords()
2015
+ if self.text_editor.open:
2016
+ self.close_text_editor((self.text_editor.column, "ButtonPress-1"))
2009
2017
  if closed_dd_coords is not None:
2010
- # displayed coords not data, necessary for b1 function
2011
- self.destroy_opened_dropdown_window(closed_dd_coords)
2018
+ self.hide_dropdown_window()
2012
2019
  if inside:
2013
2020
  self.MT.main_table_redraw_grid_and_text(
2014
2021
  redraw_header=True,
@@ -2022,35 +2029,10 @@ class ColumnHeaders(tk.Canvas):
2022
2029
  self.MT.mouseclick_outside_editor_or_dropdown()
2023
2030
  return self.mouseclick_outside_editor_or_dropdown(inside)
2024
2031
 
2025
- # function can receive two None args
2026
- def destroy_opened_dropdown_window(self, c=None, datacn=None):
2027
- if c is None and datacn is None and self.existing_dropdown_window is not None:
2028
- c = self.get_existing_dropdown_coords()
2029
- if c is not None or datacn is not None:
2030
- if datacn is None:
2031
- datacn_ = c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
2032
- else:
2033
- datacn_ = datacn
2034
- else:
2035
- datacn_ = None
2036
- try:
2037
- self.delete(self.existing_dropdown_canvas_id)
2038
- except Exception:
2039
- pass
2040
- self.existing_dropdown_canvas_id = None
2041
- try:
2042
- self.existing_dropdown_window.destroy()
2043
- except Exception:
2044
- pass
2045
- kwargs = self.get_cell_kwargs(datacn_, key="dropdown")
2046
- if kwargs:
2047
- kwargs["canvas_id"] = "no dropdown open"
2048
- kwargs["window"] = "no dropdown open"
2049
- try:
2050
- self.delete(kwargs["canvas_id"])
2051
- except Exception:
2052
- pass
2053
- self.existing_dropdown_window = None
2032
+ def hide_dropdown_window(self) -> None:
2033
+ if self.dropdown.open:
2034
+ self.itemconfig(self.dropdown.canvas_id, state="hidden")
2035
+ self.dropdown.open = False
2054
2036
 
2055
2037
  # internal event use
2056
2038
  def set_cell_data_undo(
@@ -2070,7 +2052,7 @@ class ColumnHeaders(tk.Canvas):
2070
2052
  sheet=self.PAR.name,
2071
2053
  cells_header={datacn: self.get_cell_data(datacn)},
2072
2054
  boxes=self.MT.get_boxes(),
2073
- selected=self.MT.currently_selected(),
2055
+ selected=self.MT.selected,
2074
2056
  )
2075
2057
  edited = False
2076
2058
  if isinstance(self.MT._headers, int):
@@ -2230,7 +2212,7 @@ class ColumnHeaders(tk.Canvas):
2230
2212
  value=value,
2231
2213
  loc=c,
2232
2214
  boxes=self.MT.get_boxes(),
2233
- selected=self.MT.currently_selected(),
2215
+ selected=self.MT.selected,
2234
2216
  )
2235
2217
  if kwargs["check_function"] is not None:
2236
2218
  kwargs["check_function"](event_data)