tksheet 7.2.20__py3-none-any.whl → 7.2.22__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
@@ -51,9 +51,10 @@ from .formatters import (
51
51
  from .functions import (
52
52
  add_to_displayed,
53
53
  b_index,
54
+ box_is_single_cell,
54
55
  cell_right_within_box,
56
+ color_tup,
55
57
  consecutive_ranges,
56
- decompress_load,
57
58
  diff_gen,
58
59
  diff_list,
59
60
  down_cell_within_box,
@@ -73,10 +74,9 @@ from .functions import (
73
74
  mod_span_widget,
74
75
  move_elements_by_mapping,
75
76
  new_tk_event,
76
- pickle_obj,
77
- pickled_event_dict,
78
77
  rounded_box_coords,
79
78
  span_idxs_post_move,
79
+ stored_event_dict,
80
80
  try_binding,
81
81
  unpickle_obj,
82
82
  )
@@ -88,6 +88,7 @@ from .other_classes import (
88
88
  DropdownStorage,
89
89
  EventDataDict,
90
90
  FontTuple,
91
+ Highlight,
91
92
  Loc,
92
93
  ProgressBar,
93
94
  Selected,
@@ -682,7 +683,7 @@ class MainTable(tk.Canvas):
682
683
  for r1, c1, r2, c2 in boxes:
683
684
  self.show_ctrl_outline(canvas="table", start_cell=(c1, r1), end_cell=(c2, r2))
684
685
  if event_data["cells"]["table"]:
685
- self.undo_stack.append(pickled_event_dict(event_data))
686
+ self.undo_stack.append(stored_event_dict(event_data))
686
687
  try_binding(self.extra_end_ctrl_x_func, event_data, "end_ctrl_x")
687
688
  self.sheet_modified(event_data)
688
689
  self.PAR.emit_event("<<Cut>>", event_data)
@@ -946,7 +947,7 @@ class MainTable(tk.Canvas):
946
947
  )
947
948
  self.refresh()
948
949
  if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
949
- self.undo_stack.append(pickled_event_dict(event_data))
950
+ self.undo_stack.append(stored_event_dict(event_data))
950
951
  try_binding(self.extra_end_ctrl_v_func, event_data, "end_ctrl_v")
951
952
  self.sheet_modified(event_data)
952
953
  self.PAR.emit_event("<<Paste>>", event_data)
@@ -986,7 +987,7 @@ class MainTable(tk.Canvas):
986
987
  )
987
988
  if event_data["cells"]["table"]:
988
989
  self.refresh()
989
- self.undo_stack.append(pickled_event_dict(event_data))
990
+ self.undo_stack.append(stored_event_dict(event_data))
990
991
  try_binding(self.extra_end_delete_key_func, event_data, "end_delete")
991
992
  self.sheet_modified(event_data)
992
993
  self.PAR.emit_event("<<Delete>>", event_data)
@@ -1057,7 +1058,7 @@ class MainTable(tk.Canvas):
1057
1058
  "data": data_new_idxs,
1058
1059
  "displayed": {} if disp_new_idxs is None else disp_new_idxs,
1059
1060
  }
1060
- event_data["options"] = self.pickle_options()
1061
+ event_data["options"] = self.copy_options()
1061
1062
  event_data["named_spans"] = {k: span.pickle_self() for k, span in self.named_spans.items()}
1062
1063
  if move_widths and disp_new_idxs and (not data_indexes or self.all_columns_displayed):
1063
1064
  self.deselect("all", run_binding=False, redraw=False)
@@ -1291,7 +1292,7 @@ class MainTable(tk.Canvas):
1291
1292
  "data": data_new_idxs,
1292
1293
  "displayed": {} if disp_new_idxs is None else disp_new_idxs,
1293
1294
  }
1294
- event_data["options"] = self.pickle_options()
1295
+ event_data["options"] = self.copy_options()
1295
1296
  event_data["named_spans"] = {k: span.pickle_self() for k, span in self.named_spans.items()}
1296
1297
  if move_heights and disp_new_idxs and (not data_indexes or self.all_rows_displayed):
1297
1298
  self.deselect("all", run_binding=False, redraw=False)
@@ -1482,11 +1483,11 @@ class MainTable(tk.Canvas):
1482
1483
  def undo(self, event: object = None) -> None | EventDataDict:
1483
1484
  if not self.undo_stack:
1484
1485
  return
1485
- modification = decompress_load(self.undo_stack[-1]["data"])
1486
+ modification = self.undo_stack[-1]["data"]
1486
1487
  if not try_binding(self.extra_begin_ctrl_z_func, modification, "begin_undo"):
1487
1488
  return
1488
1489
  event_data = self.undo_modification_invert_event(modification)
1489
- self.redo_stack.append(pickled_event_dict(event_data))
1490
+ self.redo_stack.append(stored_event_dict(event_data))
1490
1491
  self.undo_stack.pop()
1491
1492
  self.sheet_modified(event_data, purge_redo=False)
1492
1493
  try_binding(self.extra_end_ctrl_z_func, event_data, "end_undo")
@@ -1496,11 +1497,11 @@ class MainTable(tk.Canvas):
1496
1497
  def redo(self, event: object = None) -> None | EventDataDict:
1497
1498
  if not self.redo_stack:
1498
1499
  return
1499
- modification = decompress_load(self.redo_stack[-1]["data"])
1500
+ modification = self.redo_stack[-1]["data"]
1500
1501
  if not try_binding(self.extra_begin_ctrl_z_func, modification, "begin_redo"):
1501
1502
  return
1502
1503
  event_data = self.undo_modification_invert_event(modification, name="redo")
1503
- self.undo_stack.append(pickled_event_dict(event_data))
1504
+ self.undo_stack.append(stored_event_dict(event_data))
1504
1505
  self.redo_stack.pop()
1505
1506
  self.sheet_modified(event_data, purge_redo=False)
1506
1507
  try_binding(self.extra_end_ctrl_z_func, event_data, "end_redo")
@@ -1535,8 +1536,6 @@ class MainTable(tk.Canvas):
1535
1536
  return event_data
1536
1537
 
1537
1538
  def restore_options_named_spans(self, modification: EventDataDict) -> None:
1538
- if not isinstance(modification["options"], dict):
1539
- modification["options"] = unpickle_obj(modification["options"])
1540
1539
  if "cell_options" in modification["options"]:
1541
1540
  self.cell_options = modification["options"]["cell_options"]
1542
1541
  if "column_options" in modification["options"]:
@@ -2763,7 +2762,7 @@ class MainTable(tk.Canvas):
2763
2762
  self.rc_insert_row_enabled = True
2764
2763
  self.rc_popup_menus_enabled = True
2765
2764
  self.rc_select_enabled = True
2766
- if binding in ("all", "right_click_popup_menu", "rc_popup_menu"):
2765
+ if binding in ("all", "right_click_popup_menu", "rc_popup_menu", "rc_menu"):
2767
2766
  self.rc_popup_menus_enabled = True
2768
2767
  self.rc_select_enabled = True
2769
2768
  if binding in ("all", "right_click_select", "rc_select"):
@@ -2826,7 +2825,7 @@ class MainTable(tk.Canvas):
2826
2825
  self.rc_insert_column_enabled = False
2827
2826
  if binding in bind_add_rows:
2828
2827
  self.rc_insert_row_enabled = False
2829
- if binding in ("all", "right_click_popup_menu", "rc_popup_menu"):
2828
+ if binding in ("all", "right_click_popup_menu", "rc_popup_menu", "rc_menu"):
2830
2829
  self.rc_popup_menus_enabled = False
2831
2830
  if binding in ("all", "right_click_select", "rc_select"):
2832
2831
  self.rc_select_enabled = False
@@ -2993,8 +2992,7 @@ class MainTable(tk.Canvas):
2993
2992
  self.being_drawn_item = True
2994
2993
  self.being_drawn_item = self.add_selection(rowsel, colsel, set_as_current=True, run_binding_func=False)
2995
2994
  sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
2996
- if self.ctrl_selection_binding_func:
2997
- self.ctrl_selection_binding_func(sel_event)
2995
+ try_binding(self.ctrl_selection_binding_func, sel_event)
2998
2996
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True, redraw_table=True)
2999
2997
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
3000
2998
  elif not self.ctrl_select_enabled:
@@ -3023,8 +3021,7 @@ class MainTable(tk.Canvas):
3023
3021
  )
3024
3022
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True, redraw_table=True)
3025
3023
  sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
3026
- if self.shift_selection_binding_func:
3027
- self.shift_selection_binding_func(sel_event)
3024
+ try_binding(self.shift_selection_binding_func, sel_event)
3028
3025
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
3029
3026
  elif not self.ctrl_select_enabled:
3030
3027
  self.shift_b1_press(event)
@@ -3053,8 +3050,7 @@ class MainTable(tk.Canvas):
3053
3050
  )
3054
3051
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True, redraw_table=True)
3055
3052
  sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
3056
- if self.shift_selection_binding_func:
3057
- self.shift_selection_binding_func(sel_event)
3053
+ try_binding(self.shift_selection_binding_func, sel_event)
3058
3054
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
3059
3055
 
3060
3056
  def get_shift_select_box(self, min_r: int, rowsel: int, min_c: int, colsel: int):
@@ -3119,8 +3115,7 @@ class MainTable(tk.Canvas):
3119
3115
  )
3120
3116
  need_redraw = True
3121
3117
  sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
3122
- if self.drag_selection_binding_func:
3123
- self.drag_selection_binding_func(sel_event)
3118
+ try_binding(self.drag_selection_binding_func, sel_event)
3124
3119
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
3125
3120
  if self.scroll_if_event_offscreen(event):
3126
3121
  need_redraw = True
@@ -3162,8 +3157,7 @@ class MainTable(tk.Canvas):
3162
3157
  )
3163
3158
  need_redraw = True
3164
3159
  sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
3165
- if self.drag_selection_binding_func:
3166
- self.drag_selection_binding_func(sel_event)
3160
+ try_binding(self.drag_selection_binding_func, sel_event)
3167
3161
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
3168
3162
  if self.scroll_if_event_offscreen(event):
3169
3163
  need_redraw = True
@@ -3190,8 +3184,7 @@ class MainTable(tk.Canvas):
3190
3184
  ),
3191
3185
  )
3192
3186
  sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
3193
- if self.drag_selection_binding_func:
3194
- self.drag_selection_binding_func(sel_event)
3187
+ try_binding(self.drag_selection_binding_func, sel_event)
3195
3188
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
3196
3189
  else:
3197
3190
  self.being_drawn_item = None
@@ -4536,7 +4529,7 @@ class MainTable(tk.Canvas):
4536
4529
  event_data=event_data,
4537
4530
  )
4538
4531
  if self.undo_enabled:
4539
- self.undo_stack.append(pickled_event_dict(event_data))
4532
+ self.undo_stack.append(stored_event_dict(event_data))
4540
4533
  self.refresh()
4541
4534
  try_binding(self.extra_end_insert_cols_rc_func, event_data, "end_add_columns")
4542
4535
  self.sheet_modified(event_data)
@@ -4671,7 +4664,7 @@ class MainTable(tk.Canvas):
4671
4664
  event_data=event_data,
4672
4665
  )
4673
4666
  if self.undo_enabled:
4674
- self.undo_stack.append(pickled_event_dict(event_data))
4667
+ self.undo_stack.append(stored_event_dict(event_data))
4675
4668
  self.refresh()
4676
4669
  try_binding(self.extra_end_insert_rows_rc_func, event_data, "end_add_rows")
4677
4670
  self.sheet_modified(event_data)
@@ -4775,26 +4768,24 @@ class MainTable(tk.Canvas):
4775
4768
  }
4776
4769
  return rows, index_data, heights
4777
4770
 
4778
- def pickle_options(self) -> bytes:
4779
- return pickle_obj(
4780
- {
4781
- "cell_options": self.cell_options,
4782
- "column_options": self.col_options,
4783
- "row_options": self.row_options,
4784
- "CH_cell_options": self.CH.cell_options,
4785
- "RI_cell_options": self.RI.cell_options,
4786
- "tagged_cells": self.tagged_cells,
4787
- "tagged_rows": self.tagged_rows,
4788
- "tagged_columns": self.tagged_columns,
4789
- }
4790
- )
4771
+ def copy_options(self) -> dict:
4772
+ return {
4773
+ "cell_options": dict(self.cell_options),
4774
+ "column_options": dict(self.col_options),
4775
+ "row_options": dict(self.row_options),
4776
+ "CH_cell_options": dict(self.CH.cell_options),
4777
+ "RI_cell_options": dict(self.RI.cell_options),
4778
+ "tagged_cells": {f"{tag}": set(s) for tag, s in self.tagged_cells.items()},
4779
+ "tagged_rows": {f"{tag}": set(s) for tag, s in self.tagged_rows.items()},
4780
+ "tagged_columns": {f"{tag}": set(s) for tag, s in self.tagged_columns.items()},
4781
+ }
4791
4782
 
4792
4783
  def delete_columns_data(self, cols: list, event_data: dict) -> EventDataDict:
4793
4784
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
4794
4785
  event_data["deleted"]["displayed_columns"] = (
4795
4786
  list(self.displayed_columns) if not isinstance(self.displayed_columns, int) else int(self.displayed_columns)
4796
4787
  )
4797
- event_data["options"] = self.pickle_options()
4788
+ event_data["options"] = self.copy_options()
4798
4789
  event_data["named_spans"] = {k: span.pickle_self() for k, span in self.named_spans.items()}
4799
4790
  for datacn in reversed(cols):
4800
4791
  for rn in range(len(self.data)):
@@ -4846,7 +4837,7 @@ class MainTable(tk.Canvas):
4846
4837
  data_cols = selected if self.all_columns_displayed else [self.displayed_columns[c] for c in selected]
4847
4838
  event_data = self.delete_columns_data(data_cols, event_data)
4848
4839
  if self.undo_enabled:
4849
- self.undo_stack.append(pickled_event_dict(event_data))
4840
+ self.undo_stack.append(stored_event_dict(event_data))
4850
4841
  self.deselect("all")
4851
4842
  try_binding(self.extra_end_del_cols_rc_func, event_data, "end_delete_columns")
4852
4843
  self.sheet_modified(event_data)
@@ -4856,7 +4847,7 @@ class MainTable(tk.Canvas):
4856
4847
  event_data["deleted"]["displayed_rows"] = (
4857
4848
  list(self.displayed_rows) if not isinstance(self.displayed_rows, int) else int(self.displayed_rows)
4858
4849
  )
4859
- event_data["options"] = self.pickle_options()
4850
+ event_data["options"] = self.copy_options()
4860
4851
  event_data["named_spans"] = {k: span.pickle_self() for k, span in self.named_spans.items()}
4861
4852
  for datarn in reversed(rows):
4862
4853
  event_data["deleted"]["rows"][datarn] = self.data.pop(datarn)
@@ -4902,7 +4893,7 @@ class MainTable(tk.Canvas):
4902
4893
  data_rows = selected if self.all_rows_displayed else [self.displayed_rows[r] for r in selected]
4903
4894
  event_data = self.delete_rows_data(data_rows, event_data)
4904
4895
  if self.undo_enabled:
4905
- self.undo_stack.append(pickled_event_dict(event_data))
4896
+ self.undo_stack.append(stored_event_dict(event_data))
4906
4897
  self.deselect("all")
4907
4898
  try_binding(self.extra_end_del_rows_rc_func, event_data, "end_delete_rows")
4908
4899
  self.sheet_modified(event_data)
@@ -5168,63 +5159,82 @@ class MainTable(tk.Canvas):
5168
5159
  fr: int | float,
5169
5160
  sc: int | float,
5170
5161
  sr: int | float,
5171
- c_2_: tuple[int, int, int],
5172
- c_3_: tuple[int, int, int],
5173
- c_4_: tuple[int, int, int],
5162
+ sel_cells_bg: tuple[int, int, int],
5163
+ sel_cols_bg: tuple[int, int, int],
5164
+ sel_rows_bg: tuple[int, int, int],
5174
5165
  selections: dict,
5175
5166
  datarn: int,
5176
5167
  datacn: int,
5177
5168
  can_width: int | None,
5169
+ dont_blend: bool,
5170
+ alternate_color: Highlight | None,
5178
5171
  ) -> str:
5179
5172
  redrawn = False
5180
5173
  if (datarn, datacn) in self.progress_bars:
5181
5174
  kwargs = self.progress_bars[(datarn, datacn)]
5182
5175
  else:
5183
5176
  kwargs = self.get_cell_kwargs(datarn, datacn, key="highlight")
5177
+ if alt := bool(not kwargs and alternate_color and r % 2):
5178
+ kwargs = alternate_color
5179
+
5184
5180
  if kwargs:
5185
- if kwargs[0] is not None:
5186
- c_1 = kwargs[0] if kwargs[0].startswith("#") else color_map[kwargs[0]]
5187
- if "cells" in selections and (r, c) in selections["cells"]:
5188
- tf = (
5181
+ fill = kwargs[0]
5182
+ if fill and not fill.startswith("#"):
5183
+ fill = color_map[fill]
5184
+
5185
+ # cell is a single currently selected cell box
5186
+ # not highlighted
5187
+ # on an alternate row color
5188
+ if alt and dont_blend:
5189
+ txtfg = self.PAR.ops.table_fg
5190
+
5191
+ # cell is highlighted and cell selected
5192
+ elif "cells" in selections and (r, c) in selections["cells"]:
5193
+ txtfg = (
5189
5194
  self.PAR.ops.table_selected_cells_fg
5190
5195
  if kwargs[1] is None or self.PAR.ops.display_selected_fg_over_highlights
5191
5196
  else kwargs[1]
5192
5197
  )
5193
- if kwargs[0] is not None:
5198
+ if fill:
5194
5199
  fill = (
5195
- f"#{int((int(c_1[1:3], 16) + c_2_[0]) / 2):02X}"
5196
- + f"{int((int(c_1[3:5], 16) + c_2_[1]) / 2):02X}"
5197
- + f"{int((int(c_1[5:], 16) + c_2_[2]) / 2):02X}"
5200
+ f"#{int((int(fill[1:3], 16) + sel_cells_bg[0]) / 2):02X}"
5201
+ + f"{int((int(fill[3:5], 16) + sel_cells_bg[1]) / 2):02X}"
5202
+ + f"{int((int(fill[5:], 16) + sel_cells_bg[2]) / 2):02X}"
5198
5203
  )
5204
+
5205
+ # cell is highlighted and row selected
5199
5206
  elif "rows" in selections and r in selections["rows"]:
5200
- tf = (
5207
+ txtfg = (
5201
5208
  self.PAR.ops.table_selected_rows_fg
5202
5209
  if kwargs[1] is None or self.PAR.ops.display_selected_fg_over_highlights
5203
5210
  else kwargs[1]
5204
5211
  )
5205
- if kwargs[0] is not None:
5212
+ if fill:
5206
5213
  fill = (
5207
- f"#{int((int(c_1[1:3], 16) + c_4_[0]) / 2):02X}"
5208
- + f"{int((int(c_1[3:5], 16) + c_4_[1]) / 2):02X}"
5209
- + f"{int((int(c_1[5:], 16) + c_4_[2]) / 2):02X}"
5214
+ f"#{int((int(fill[1:3], 16) + sel_rows_bg[0]) / 2):02X}"
5215
+ + f"{int((int(fill[3:5], 16) + sel_rows_bg[1]) / 2):02X}"
5216
+ + f"{int((int(fill[5:], 16) + sel_rows_bg[2]) / 2):02X}"
5210
5217
  )
5218
+
5219
+ # cell is highlighted and column selected
5211
5220
  elif "columns" in selections and c in selections["columns"]:
5212
- tf = (
5221
+ txtfg = (
5213
5222
  self.PAR.ops.table_selected_columns_fg
5214
5223
  if kwargs[1] is None or self.PAR.ops.display_selected_fg_over_highlights
5215
5224
  else kwargs[1]
5216
5225
  )
5217
- if kwargs[0] is not None:
5226
+ if fill:
5218
5227
  fill = (
5219
- f"#{int((int(c_1[1:3], 16) + c_3_[0]) / 2):02X}"
5220
- + f"{int((int(c_1[3:5], 16) + c_3_[1]) / 2):02X}"
5221
- + f"{int((int(c_1[5:], 16) + c_3_[2]) / 2):02X}"
5228
+ f"#{int((int(fill[1:3], 16) + sel_cols_bg[0]) / 2):02X}"
5229
+ + f"{int((int(fill[3:5], 16) + sel_cols_bg[1]) / 2):02X}"
5230
+ + f"{int((int(fill[5:], 16) + sel_cols_bg[2]) / 2):02X}"
5222
5231
  )
5232
+
5233
+ # cell is just highlighted
5223
5234
  else:
5224
- tf = self.PAR.ops.table_fg if kwargs[1] is None else kwargs[1]
5225
- if kwargs[0] is not None:
5226
- fill = kwargs[0]
5227
- if kwargs[0] is not None:
5235
+ txtfg = self.PAR.ops.table_fg if kwargs[1] is None else kwargs[1]
5236
+
5237
+ if fill:
5228
5238
  highlight_fn = partial(
5229
5239
  self.redraw_highlight,
5230
5240
  x1=fc + 1,
@@ -5254,14 +5264,14 @@ class MainTable(tk.Canvas):
5254
5264
  )
5255
5265
  elif not kwargs:
5256
5266
  if "cells" in selections and (r, c) in selections["cells"]:
5257
- tf = self.PAR.ops.table_selected_cells_fg
5267
+ txtfg = self.PAR.ops.table_selected_cells_fg
5258
5268
  elif "rows" in selections and r in selections["rows"]:
5259
- tf = self.PAR.ops.table_selected_rows_fg
5269
+ txtfg = self.PAR.ops.table_selected_rows_fg
5260
5270
  elif "columns" in selections and c in selections["columns"]:
5261
- tf = self.PAR.ops.table_selected_columns_fg
5271
+ txtfg = self.PAR.ops.table_selected_columns_fg
5262
5272
  else:
5263
- tf = self.PAR.ops.table_fg
5264
- return tf, redrawn
5273
+ txtfg = self.PAR.ops.table_fg
5274
+ return txtfg, redrawn
5265
5275
 
5266
5276
  def redraw_highlight(self, x1, y1, x2, y2, fill, outline, tag, can_width=None, pc=None):
5267
5277
  if not is_type_int(pc) or pc >= 100:
@@ -5643,24 +5653,36 @@ class MainTable(tk.Canvas):
5643
5653
  )
5644
5654
  if redraw_table:
5645
5655
  selections = self.get_redraw_selections(text_start_row, grid_end_row, text_start_col, grid_end_col)
5646
- c_2 = (
5647
- self.PAR.ops.table_selected_cells_bg
5648
- if self.PAR.ops.table_selected_cells_bg.startswith("#")
5649
- else color_map[self.PAR.ops.table_selected_cells_bg]
5650
- )
5651
- c_2_ = (int(c_2[1:3], 16), int(c_2[3:5], 16), int(c_2[5:], 16))
5652
- c_3 = (
5653
- self.PAR.ops.table_selected_columns_bg
5654
- if self.PAR.ops.table_selected_columns_bg.startswith("#")
5655
- else color_map[self.PAR.ops.table_selected_columns_bg]
5656
- )
5657
- c_3_ = (int(c_3[1:3], 16), int(c_3[3:5], 16), int(c_3[5:], 16))
5658
- c_4 = (
5659
- self.PAR.ops.table_selected_rows_bg
5660
- if self.PAR.ops.table_selected_rows_bg.startswith("#")
5661
- else color_map[self.PAR.ops.table_selected_rows_bg]
5662
- )
5663
- c_4_ = (int(c_4[1:3], 16), int(c_4[3:5], 16), int(c_4[5:], 16))
5656
+ sel_cells_bg = color_tup(self.PAR.ops.table_selected_cells_bg)
5657
+ sel_cols_bg = color_tup(self.PAR.ops.table_selected_columns_bg)
5658
+ sel_rows_bg = color_tup(self.PAR.ops.table_selected_rows_bg)
5659
+ if self.selected:
5660
+ current_loc = (self.selected.row, self.selected.column)
5661
+ else:
5662
+ current_loc = tuple()
5663
+ if self.PAR.ops.alternate_color:
5664
+ alternate_color = Highlight(
5665
+ bg=self.PAR.ops.alternate_color,
5666
+ fg=None,
5667
+ end=False,
5668
+ )
5669
+ if self.selected and box_is_single_cell(*self.selected.box) and self.PAR.ops.show_selected_cells_border:
5670
+ dont_blend = current_loc
5671
+ else:
5672
+ dont_blend = tuple()
5673
+ else:
5674
+ alternate_color = None
5675
+ dont_blend = tuple()
5676
+
5677
+ if not self.PAR.ops.show_selected_cells_border:
5678
+ override = (
5679
+ color_tup(self.PAR.ops.table_selected_cells_fg),
5680
+ color_tup(self.PAR.ops.table_selected_columns_fg),
5681
+ color_tup(self.PAR.ops.table_selected_rows_fg),
5682
+ )
5683
+ else:
5684
+ override = tuple()
5685
+
5664
5686
  rows_ = tuple(range(text_start_row, text_end_row))
5665
5687
  font = self.PAR.ops.table_font
5666
5688
  dd_coords = self.dropdown.get_coords()
@@ -5677,19 +5699,21 @@ class MainTable(tk.Canvas):
5677
5699
  datacn = self.datacn(c)
5678
5700
 
5679
5701
  fill, dd_drawn = self.redraw_highlight_get_text_fg(
5680
- r,
5681
- c,
5682
- cleftgridln,
5683
- rtopgridln,
5684
- crightgridln,
5685
- rbotgridln,
5686
- c_2_,
5687
- c_3_,
5688
- c_4_,
5689
- selections,
5690
- datarn,
5691
- datacn,
5692
- can_width,
5702
+ r=r,
5703
+ c=c,
5704
+ fc=cleftgridln,
5705
+ fr=rtopgridln,
5706
+ sc=crightgridln,
5707
+ sr=rbotgridln,
5708
+ sel_cells_bg=override[0] if override and (r, c) == current_loc else sel_cells_bg,
5709
+ sel_cols_bg=override[1] if override and (r, c) == current_loc else sel_cols_bg,
5710
+ sel_rows_bg=override[2] if override and (r, c) == current_loc else sel_rows_bg,
5711
+ selections=selections,
5712
+ datarn=datarn,
5713
+ datacn=datacn,
5714
+ can_width=can_width,
5715
+ dont_blend=(r, c) == dont_blend,
5716
+ alternate_color=alternate_color,
5693
5717
  )
5694
5718
  align = self.get_cell_kwargs(datarn, datacn, key="align")
5695
5719
  if align:
@@ -5706,7 +5730,7 @@ class MainTable(tk.Canvas):
5706
5730
  rtopgridln,
5707
5731
  crightgridln,
5708
5732
  self.row_positions[r + 1],
5709
- fill=fill,
5733
+ fill=fill if kwargs["state"] != "disabled" else self.PAR.ops.table_grid_fg,
5710
5734
  outline=fill,
5711
5735
  tag=f"dd_{r}_{c}",
5712
5736
  draw_outline=not dd_drawn,
@@ -5724,7 +5748,7 @@ class MainTable(tk.Canvas):
5724
5748
  rtopgridln,
5725
5749
  crightgridln,
5726
5750
  self.row_positions[r + 1],
5727
- fill=fill,
5751
+ fill=fill if kwargs["state"] != "disabled" else self.PAR.ops.table_grid_fg,
5728
5752
  outline=fill,
5729
5753
  tag=f"dd_{r}_{c}",
5730
5754
  draw_outline=not dd_drawn,
@@ -5743,7 +5767,7 @@ class MainTable(tk.Canvas):
5743
5767
  rtopgridln,
5744
5768
  crightgridln,
5745
5769
  self.row_positions[r + 1],
5746
- fill=fill,
5770
+ fill=fill if kwargs["state"] != "disabled" else self.PAR.ops.table_grid_fg,
5747
5771
  outline=fill,
5748
5772
  tag=f"dd_{r}_{c}",
5749
5773
  draw_outline=not dd_drawn,
@@ -5859,7 +5883,13 @@ class MainTable(tk.Canvas):
5859
5883
  if draw_y + self.table_half_txt_height - 1 > rbotgridln:
5860
5884
  break
5861
5885
  if redraw_table:
5862
- for dct in (self.hidd_text, self.hidd_high, self.hidd_grid, self.hidd_dropdown, self.hidd_checkbox):
5886
+ for dct in (
5887
+ self.hidd_text,
5888
+ self.hidd_high,
5889
+ self.hidd_grid,
5890
+ self.hidd_dropdown,
5891
+ self.hidd_checkbox,
5892
+ ):
5863
5893
  for iid, showing in dct.items():
5864
5894
  if showing:
5865
5895
  self.itemconfig(iid, state="hidden")
@@ -6903,6 +6933,8 @@ class MainTable(tk.Canvas):
6903
6933
  new_r, new_c = down_cell_within_box(r, c, r1, c1, r2, c2, numrows, numcols)
6904
6934
  else:
6905
6935
  new_r, new_c = None, None
6936
+ else:
6937
+ new_r, new_c = None, None
6906
6938
  if isinstance(new_r, int):
6907
6939
  self.set_currently_selected(new_r, new_c, item=self.selected.fill_iid)
6908
6940
  self.see(
@@ -6957,6 +6989,8 @@ class MainTable(tk.Canvas):
6957
6989
  bottom_right_corner=True,
6958
6990
  check_cell_visibility=True,
6959
6991
  )
6992
+ if not self.PAR.ops.show_selected_cells_border:
6993
+ self.refresh()
6960
6994
  return "break"
6961
6995
 
6962
6996
  def get_space_bot(self, r: int, text_editor_h: int | None = None) -> int:
@@ -7014,13 +7048,34 @@ class MainTable(tk.Canvas):
7014
7048
 
7015
7049
  def dropdown_text_editor_modified(
7016
7050
  self,
7017
- dd_window: object,
7018
- event: dict,
7019
- modified_func: Callable | None,
7051
+ event: tk.Misc,
7020
7052
  ) -> None:
7021
- if modified_func:
7022
- modified_func(event)
7023
- dd_window.search_and_see(event)
7053
+ r, c = self.dropdown.get_coords()
7054
+ event_data = event_dict(
7055
+ name="table_dropdown_modified",
7056
+ sheet=self.PAR.name,
7057
+ value=self.text_editor.get(),
7058
+ loc=Loc(r, c),
7059
+ row=r,
7060
+ column=c,
7061
+ boxes=self.get_boxes(),
7062
+ selected=self.selected,
7063
+ )
7064
+ try_binding(self.dropdown.window.modified_function, event_data)
7065
+ val = self.dropdown.window.search_and_see(event_data)
7066
+ # return to tk.Text action if control/command is held down
7067
+ # or keysym was not a character
7068
+ if (hasattr(event, "state") and event.state & (0x0004 | 0x00000010)) or (
7069
+ hasattr(event, "keysym") and len(event.keysym) > 2
7070
+ ):
7071
+ return
7072
+ self.text_editor.tktext.unbind("<KeyRelease>")
7073
+ self.text_editor.autocomplete(val)
7074
+ self.text_editor.tktext.bind(
7075
+ "<KeyRelease>",
7076
+ self.dropdown_text_editor_modified,
7077
+ )
7078
+ return "break"
7024
7079
 
7025
7080
  # c is displayed col
7026
7081
  def open_dropdown_window(
@@ -7033,9 +7088,10 @@ class MainTable(tk.Canvas):
7033
7088
  datarn = self.datarn(r)
7034
7089
  datacn = self.datacn(c)
7035
7090
  kwargs = self.get_cell_kwargs(datarn, datacn, key="dropdown")
7036
- if kwargs["state"] == "normal":
7037
- if not self.open_text_editor(event=event, r=r, c=c, dropdown=True):
7038
- return
7091
+ if kwargs["state"] == "disabled":
7092
+ return
7093
+ if kwargs["state"] == "normal" and not self.open_text_editor(event=event, r=r, c=c, dropdown=True):
7094
+ return
7039
7095
  win_h, anchor = self.get_dropdown_height_anchor(r, c)
7040
7096
  win_w = self.col_positions[c + 1] - self.col_positions[c] + 1
7041
7097
  if anchor == "nw":
@@ -7056,6 +7112,8 @@ class MainTable(tk.Canvas):
7056
7112
  "outline_color": self.get_selected_box_bg_fg(type_="cells")[1],
7057
7113
  "align": self.get_cell_align(r, c),
7058
7114
  "values": kwargs["values"],
7115
+ "search_function": kwargs["search_function"],
7116
+ "modified_function": kwargs["modified_function"],
7059
7117
  }
7060
7118
  if self.dropdown.window:
7061
7119
  self.dropdown.window.reset(**reset_kwargs)
@@ -7067,7 +7125,6 @@ class MainTable(tk.Canvas):
7067
7125
  self.winfo_toplevel(),
7068
7126
  **reset_kwargs,
7069
7127
  close_dropdown_window=self.close_dropdown_window,
7070
- search_function=kwargs["search_function"],
7071
7128
  arrowkey_RIGHT=self.arrowkey_RIGHT,
7072
7129
  arrowkey_LEFT=self.arrowkey_LEFT,
7073
7130
  )
@@ -7078,22 +7135,9 @@ class MainTable(tk.Canvas):
7078
7135
  )
7079
7136
  if kwargs["state"] == "normal":
7080
7137
  self.text_editor.tktext.bind(
7081
- "<<TextModified>>",
7082
- lambda _: self.dropdown.window.search_and_see(
7083
- event_dict(
7084
- name="table_dropdown_modified",
7085
- sheet=self.PAR.name,
7086
- value=self.text_editor.get(),
7087
- loc=Loc(r, c),
7088
- row=r,
7089
- column=c,
7090
- boxes=self.get_boxes(),
7091
- selected=self.selected,
7092
- )
7093
- ),
7138
+ "<KeyRelease>",
7139
+ self.dropdown_text_editor_modified,
7094
7140
  )
7095
- if kwargs["modified_function"] is not None:
7096
- self.dropdown.window.modified_function = kwargs["modified_function"]
7097
7141
  self.update_idletasks()
7098
7142
  try:
7099
7143
  self.after(1, lambda: self.text_editor.tktext.focus())
@@ -7268,7 +7312,7 @@ class MainTable(tk.Canvas):
7268
7312
  )
7269
7313
  if not check_input_valid or self.input_valid_for_cell(datarn, datacn, value):
7270
7314
  if self.undo_enabled and undo:
7271
- self.undo_stack.append(pickled_event_dict(event_data))
7315
+ self.undo_stack.append(stored_event_dict(event_data))
7272
7316
  self.set_cell_data(datarn, datacn, value)
7273
7317
  if cell_resize and self.PAR.ops.cell_auto_resize_enabled:
7274
7318
  self.set_cell_size_to_text(r, c, only_if_too_small=True, redraw=redraw, run_binding=True)