tksheet 7.1.4__py3-none-any.whl → 7.1.6__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
@@ -49,7 +49,7 @@ from .formatters import (
49
49
  try_to_bool,
50
50
  )
51
51
  from .functions import (
52
- consecutive_chunks,
52
+ consecutive_ranges,
53
53
  decompress_load,
54
54
  diff_gen,
55
55
  diff_list,
@@ -61,6 +61,7 @@ from .functions import (
61
61
  get_seq_without_gaps_at_index,
62
62
  index_exists,
63
63
  insert_items,
64
+ int_x_iter,
64
65
  is_iterable,
65
66
  is_type_int,
66
67
  len_to_idx,
@@ -960,12 +961,12 @@ class MainTable(tk.Canvas):
960
961
  )
961
962
  )
962
963
  if create_selections:
963
- for chunk in consecutive_chunks(sorted(disp_new_idxs.values())):
964
+ for boxst, boxend in consecutive_ranges(sorted(disp_new_idxs.values())):
964
965
  self.create_selection_box(
965
966
  0,
966
- chunk[0],
967
+ boxst,
967
968
  len(self.row_positions) - 1,
968
- chunk[-1] + 1,
969
+ boxend,
969
970
  "columns",
970
971
  run_binding=True,
971
972
  )
@@ -1181,11 +1182,11 @@ class MainTable(tk.Canvas):
1181
1182
  )
1182
1183
  )
1183
1184
  if create_selections:
1184
- for chunk in consecutive_chunks(sorted(disp_new_idxs.values())):
1185
+ for boxst, boxend in consecutive_ranges(sorted(disp_new_idxs.values())):
1185
1186
  self.create_selection_box(
1186
- chunk[0],
1187
+ boxst,
1187
1188
  0,
1188
- chunk[-1] + 1,
1189
+ boxend,
1189
1190
  len(self.col_positions) - 1,
1190
1191
  "rows",
1191
1192
  run_binding=True,
@@ -1803,7 +1804,7 @@ class MainTable(tk.Canvas):
1803
1804
  cells=False,
1804
1805
  ):
1805
1806
  self.hide_selection_box(item)
1806
- elif r is not None and c is None and cell is None:
1807
+ elif isinstance(r, int) and c is None and cell is None:
1807
1808
  for item, box in self.get_selection_items(columns=False, cells=False):
1808
1809
  r1, c1, r2, c2 = box.coords
1809
1810
  if r >= r1 and r < r2:
@@ -1846,8 +1847,7 @@ class MainTable(tk.Canvas):
1846
1847
  "rows",
1847
1848
  set_current=resel and to_sel >= r + 1 and to_sel < r2,
1848
1849
  )
1849
- break
1850
- elif c is not None and r is None and cell is None:
1850
+ elif isinstance(c, int) and r is None and cell is None:
1851
1851
  for item, box in self.get_selection_items(rows=False, cells=False):
1852
1852
  r1, c1, r2, c2 = box.coords
1853
1853
  if c >= c1 and c < c2:
@@ -1890,15 +1890,13 @@ class MainTable(tk.Canvas):
1890
1890
  "columns",
1891
1891
  set_current=resel and to_sel >= c + 1 and to_sel < c2,
1892
1892
  )
1893
- break
1894
- elif (r is not None and c is not None and cell is None) or cell is not None:
1893
+ elif (isinstance(r, int) and isinstance(c, int) and cell is None) or cell is not None:
1895
1894
  if cell is not None:
1896
1895
  r, c = cell[0], cell[1]
1897
1896
  for item, box in self.get_selection_items(reverse=True):
1898
1897
  r1, c1, r2, c2 = box.coords
1899
1898
  if r >= r1 and c >= c1 and r < r2 and c < c2:
1900
1899
  self.hide_selection_box(item)
1901
- break
1902
1900
  if redraw:
1903
1901
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
1904
1902
  sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
@@ -1906,7 +1904,51 @@ class MainTable(tk.Canvas):
1906
1904
  try_binding(self.deselection_binding_func, sel_event)
1907
1905
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
1908
1906
 
1909
- def page_UP(self, event=None):
1907
+ def deselect_any(
1908
+ self,
1909
+ rows: Iterator[int] | int | None = None,
1910
+ columns: Iterator[int] | int | None = None,
1911
+ redraw: bool = True,
1912
+ ) -> None:
1913
+ rows = int_x_iter(rows)
1914
+ columns = int_x_iter(columns)
1915
+ if is_iterable(rows) and is_iterable(columns):
1916
+ rows = tuple(consecutive_ranges(sorted(rows)))
1917
+ columns = tuple(consecutive_ranges(sorted(columns)))
1918
+ for item, box in self.get_selection_items(reverse=True):
1919
+ r1, c1, r2, c2 = box.coords
1920
+ hidden = False
1921
+ for rows_st, rows_end in rows:
1922
+ if hidden:
1923
+ break
1924
+ for cols_st, cols_end in columns:
1925
+ if ((rows_end >= r1 and rows_end <= r2) or (rows_st >= r1 and rows_st < r2)) and (
1926
+ (cols_end >= c1 and cols_end <= c2) or (cols_st >= c1 and cols_st < c2)
1927
+ ):
1928
+ hidden = self.hide_selection_box(item)
1929
+ break
1930
+ elif is_iterable(rows):
1931
+ rows = tuple(consecutive_ranges(sorted(rows)))
1932
+ for item, box in self.get_selection_items(reverse=True):
1933
+ r1, c1, r2, c2 = box.coords
1934
+ for rows_st, rows_end in rows:
1935
+ if (rows_end >= r1 and rows_end <= r2) or (rows_st >= r1 and rows_st < r2):
1936
+ self.hide_selection_box(item)
1937
+ break
1938
+ elif is_iterable(columns):
1939
+ columns = tuple(consecutive_ranges(sorted(columns)))
1940
+ for item, box in self.get_selection_items(reverse=True):
1941
+ r1, c1, r2, c2 = box.coords
1942
+ for cols_st, cols_end in columns:
1943
+ if (cols_end >= c1 and cols_end <= c2) or (cols_st >= c1 and cols_st < c2):
1944
+ self.hide_selection_box(item)
1945
+ break
1946
+ else:
1947
+ self.deselect()
1948
+ if redraw:
1949
+ self.refresh()
1950
+
1951
+ def page_UP(self, event: object = None) -> None:
1910
1952
  height = self.winfo_height()
1911
1953
  top = self.canvasy(0)
1912
1954
  scrollto_y = top - height
@@ -1935,7 +1977,7 @@ class MainTable(tk.Canvas):
1935
1977
  self.RI.yview(*args)
1936
1978
  self.main_table_redraw_grid_and_text(redraw_row_index=True)
1937
1979
 
1938
- def page_DOWN(self, event=None):
1980
+ def page_DOWN(self, event: object = None) -> None:
1939
1981
  height = self.winfo_height()
1940
1982
  top = self.canvasy(0)
1941
1983
  scrollto = top + height
@@ -1965,12 +2007,12 @@ class MainTable(tk.Canvas):
1965
2007
  self.RI.yview(*args)
1966
2008
  self.main_table_redraw_grid_and_text(redraw_row_index=True)
1967
2009
 
1968
- def arrowkey_UP(self, event=None):
2010
+ def arrowkey_UP(self, event: object = None) -> None:
1969
2011
  if not self.selected:
1970
2012
  return
1971
2013
  if self.selected.type_ == "rows":
1972
2014
  r = self.selected.row
1973
- if r != 0 and self.RI.row_selection_enabled:
2015
+ if r and self.RI.row_selection_enabled:
1974
2016
  if self.cell_completely_visible(r=r - 1, c=0):
1975
2017
  self.RI.select_row(r - 1, redraw=True)
1976
2018
  else:
@@ -1979,64 +2021,17 @@ class MainTable(tk.Canvas):
1979
2021
  elif self.selected.type_ in ("cells", "columns"):
1980
2022
  r = self.selected.row
1981
2023
  c = self.selected.column
1982
- if r == 0 and self.CH.col_selection_enabled:
2024
+ if not r and self.CH.col_selection_enabled:
1983
2025
  if not self.cell_completely_visible(r=r, c=0):
1984
- self.see(r, c, keep_xscroll=True, check_cell_visibility=False)
1985
- elif r != 0 and (self.single_selection_enabled or self.toggle_selection_enabled):
2026
+ self.see(r, c, check_cell_visibility=False)
2027
+ elif r and (self.single_selection_enabled or self.toggle_selection_enabled):
1986
2028
  if self.cell_completely_visible(r=r - 1, c=c):
1987
2029
  self.select_cell(r - 1, c, redraw=True)
1988
2030
  else:
1989
2031
  self.select_cell(r - 1, c)
1990
2032
  self.see(r - 1, c, keep_xscroll=True, check_cell_visibility=False)
1991
2033
 
1992
- def arrowkey_RIGHT(self, event=None):
1993
- if not self.selected:
1994
- return
1995
- if self.selected.type_ == "rows":
1996
- r = self.selected.row
1997
- if self.single_selection_enabled or self.toggle_selection_enabled:
1998
- if self.cell_completely_visible(r=r, c=0):
1999
- self.select_cell(r, 0, redraw=True)
2000
- else:
2001
- self.select_cell(r, 0)
2002
- self.see(
2003
- r,
2004
- 0,
2005
- keep_yscroll=True,
2006
- bottom_right_corner=True,
2007
- check_cell_visibility=False,
2008
- )
2009
- elif self.selected.type_ == "columns":
2010
- c = self.selected.column
2011
- if c < len(self.col_positions) - 2 and self.CH.col_selection_enabled:
2012
- if self.cell_completely_visible(r=0, c=c + 1):
2013
- self.CH.select_col(c + 1, redraw=True)
2014
- else:
2015
- self.CH.select_col(c + 1)
2016
- self.see(
2017
- 0,
2018
- c + 1,
2019
- keep_yscroll=True,
2020
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2021
- check_cell_visibility=False,
2022
- )
2023
- else:
2024
- r = self.selected.row
2025
- c = self.selected.column
2026
- if c < len(self.col_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
2027
- if self.cell_completely_visible(r=r, c=c + 1):
2028
- self.select_cell(r, c + 1, redraw=True)
2029
- else:
2030
- self.select_cell(r, c + 1)
2031
- self.see(
2032
- r,
2033
- c + 1,
2034
- keep_yscroll=True,
2035
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2036
- check_cell_visibility=False,
2037
- )
2038
-
2039
- def arrowkey_DOWN(self, event=None):
2034
+ def arrowkey_DOWN(self, event: object = None) -> None:
2040
2035
  if not self.selected:
2041
2036
  return
2042
2037
  if self.selected.type_ == "rows":
@@ -2071,15 +2066,17 @@ class MainTable(tk.Canvas):
2071
2066
  elif self.selected.type_ == "columns":
2072
2067
  c = self.selected.column
2073
2068
  if self.single_selection_enabled or self.toggle_selection_enabled:
2074
- if self.cell_completely_visible(r=0, c=c):
2075
- self.select_cell(0, c, redraw=True)
2069
+ if self.selected.row == len(self.row_positions) - 2:
2070
+ r = self.selected.row
2076
2071
  else:
2077
- self.select_cell(0, c)
2072
+ r = self.selected.row + 1
2073
+ if self.cell_completely_visible(r=r, c=c):
2074
+ self.select_cell(r, c, redraw=True)
2075
+ else:
2076
+ self.select_cell(r, c)
2078
2077
  self.see(
2079
- 0,
2078
+ r,
2080
2079
  c,
2081
- keep_xscroll=True,
2082
- bottom_right_corner=True,
2083
2080
  check_cell_visibility=False,
2084
2081
  )
2085
2082
  else:
@@ -2113,12 +2110,12 @@ class MainTable(tk.Canvas):
2113
2110
  check_cell_visibility=False,
2114
2111
  )
2115
2112
 
2116
- def arrowkey_LEFT(self, event=None):
2113
+ def arrowkey_LEFT(self, event: object = None) -> None:
2117
2114
  if not self.selected:
2118
2115
  return
2119
2116
  if self.selected.type_ == "columns":
2120
2117
  c = self.selected.column
2121
- if c != 0 and self.CH.col_selection_enabled:
2118
+ if c and self.CH.col_selection_enabled:
2122
2119
  if self.cell_completely_visible(r=0, c=c - 1):
2123
2120
  self.CH.select_col(c - 1, redraw=True)
2124
2121
  else:
@@ -2130,19 +2127,70 @@ class MainTable(tk.Canvas):
2130
2127
  bottom_right_corner=True,
2131
2128
  check_cell_visibility=False,
2132
2129
  )
2130
+ elif self.selected.type_ == "rows" and self.selected.column:
2131
+ self.select_cell(self.selected.row, self.selected.column - 1)
2132
+ self.see(self.selected.row, self.selected.column, check_cell_visibility=True)
2133
2133
  elif self.selected.type_ == "cells":
2134
2134
  r = self.selected.row
2135
2135
  c = self.selected.column
2136
- if c == 0 and self.RI.row_selection_enabled:
2137
- if not self.cell_completely_visible(r=r, c=0):
2138
- self.see(r, c, keep_yscroll=True, check_cell_visibility=False)
2139
- elif c != 0 and (self.single_selection_enabled or self.toggle_selection_enabled):
2136
+ if not c and not self.cell_completely_visible(r=r, c=0):
2137
+ self.see(r, c, keep_yscroll=True, check_cell_visibility=False)
2138
+ elif c and (self.single_selection_enabled or self.toggle_selection_enabled):
2140
2139
  if self.cell_completely_visible(r=r, c=c - 1):
2141
2140
  self.select_cell(r, c - 1, redraw=True)
2142
2141
  else:
2143
2142
  self.select_cell(r, c - 1)
2144
2143
  self.see(r, c - 1, keep_yscroll=True, check_cell_visibility=False)
2145
2144
 
2145
+ def arrowkey_RIGHT(self, event: object = None) -> None:
2146
+ if not self.selected:
2147
+ return
2148
+ if self.selected.type_ == "rows":
2149
+ r = self.selected.row
2150
+ if self.single_selection_enabled or self.toggle_selection_enabled:
2151
+ if self.selected.column == len(self.col_positions) - 2:
2152
+ c = self.selected.column
2153
+ else:
2154
+ c = self.selected.column + 1
2155
+ if self.cell_completely_visible(r=r, c=c):
2156
+ self.select_cell(r, c, redraw=True)
2157
+ else:
2158
+ self.select_cell(r, c)
2159
+ self.see(
2160
+ r,
2161
+ c,
2162
+ check_cell_visibility=False,
2163
+ )
2164
+ elif self.selected.type_ == "columns":
2165
+ c = self.selected.column
2166
+ if c < len(self.col_positions) - 2 and self.CH.col_selection_enabled:
2167
+ if self.cell_completely_visible(r=0, c=c + 1):
2168
+ self.CH.select_col(c + 1, redraw=True)
2169
+ else:
2170
+ self.CH.select_col(c + 1)
2171
+ self.see(
2172
+ 0,
2173
+ c + 1,
2174
+ keep_yscroll=True,
2175
+ bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2176
+ check_cell_visibility=False,
2177
+ )
2178
+ else:
2179
+ r = self.selected.row
2180
+ c = self.selected.column
2181
+ if c < len(self.col_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
2182
+ if self.cell_completely_visible(r=r, c=c + 1):
2183
+ self.select_cell(r, c + 1, redraw=True)
2184
+ else:
2185
+ self.select_cell(r, c + 1)
2186
+ self.see(
2187
+ r,
2188
+ c + 1,
2189
+ keep_yscroll=True,
2190
+ bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2191
+ check_cell_visibility=False,
2192
+ )
2193
+
2146
2194
  def key_bindings(self) -> None:
2147
2195
  for widget in (self, self.RI, self.CH, self.TL):
2148
2196
  for binding in self.PAR.ops.copy_bindings:
@@ -3216,8 +3264,6 @@ class MainTable(tk.Canvas):
3216
3264
 
3217
3265
  def ctrl_mousewheel(self, event):
3218
3266
  if event.delta < 0 or event.num == 5:
3219
- if self.PAR.ops.table_font[1] < 2 or self.PAR.ops.index_font[1] < 2 or self.PAR.ops.header_font[1] < 2:
3220
- return
3221
3267
  self.zoom_out()
3222
3268
  elif event.delta >= 0 or event.num == 4:
3223
3269
  self.zoom_in()
@@ -3225,16 +3271,22 @@ class MainTable(tk.Canvas):
3225
3271
  def zoom_in(self, event=None):
3226
3272
  self.zoom_font(
3227
3273
  (self.PAR.ops.table_font[0], self.PAR.ops.table_font[1] + 1, self.PAR.ops.table_font[2]),
3274
+ (self.PAR.ops.index_font[0], self.PAR.ops.index_font[1] + 1, self.PAR.ops.index_font[2]),
3228
3275
  (self.PAR.ops.header_font[0], self.PAR.ops.header_font[1] + 1, self.PAR.ops.header_font[2]),
3276
+ "in",
3229
3277
  )
3230
3278
 
3231
3279
  def zoom_out(self, event=None):
3280
+ if self.PAR.ops.table_font[1] < 2 or self.PAR.ops.index_font[1] < 2 or self.PAR.ops.header_font[1] < 2:
3281
+ return
3232
3282
  self.zoom_font(
3233
3283
  (self.PAR.ops.table_font[0], self.PAR.ops.table_font[1] - 1, self.PAR.ops.table_font[2]),
3284
+ (self.PAR.ops.index_font[0], self.PAR.ops.index_font[1] - 1, self.PAR.ops.index_font[2]),
3234
3285
  (self.PAR.ops.header_font[0], self.PAR.ops.header_font[1] - 1, self.PAR.ops.header_font[2]),
3286
+ "out",
3235
3287
  )
3236
3288
 
3237
- def zoom_font(self, table_font: tuple, header_font: tuple):
3289
+ def zoom_font(self, table_font: tuple, index_font: tuple, header_font: tuple, zoom: Literal["in", "out"]) -> None:
3238
3290
  self.saved_column_widths = {}
3239
3291
  self.saved_row_heights = {}
3240
3292
  # should record position prior to change and then see after change
@@ -3256,7 +3308,7 @@ class MainTable(tk.Canvas):
3256
3308
  table_font,
3257
3309
  reset_row_positions=False,
3258
3310
  )
3259
- self.set_index_font(table_font)
3311
+ self.set_index_font(index_font)
3260
3312
  self.set_header_font(header_font)
3261
3313
  if self.PAR.ops.set_cell_sizes_on_zoom:
3262
3314
  self.set_all_cell_sizes_to_text()
@@ -3284,18 +3336,18 @@ class MainTable(tk.Canvas):
3284
3336
  )
3285
3337
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
3286
3338
  self.recreate_all_selection_boxes()
3287
- self.refresh_open_window_positions()
3288
- self.RI.refresh_open_window_positions()
3289
- self.CH.refresh_open_window_positions()
3339
+ self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
3340
+ self.refresh_open_window_positions(zoom=zoom)
3341
+ self.RI.refresh_open_window_positions(zoom=zoom)
3342
+ self.CH.refresh_open_window_positions(zoom=zoom)
3290
3343
  self.see(
3291
3344
  r,
3292
3345
  c,
3293
3346
  check_cell_visibility=False,
3294
- redraw=False,
3347
+ redraw=True,
3295
3348
  r_pc=r_pc,
3296
3349
  c_pc=c_pc,
3297
3350
  )
3298
- self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
3299
3351
 
3300
3352
  def get_txt_w(self, txt, font=None):
3301
3353
  self.txt_measure_canvas.itemconfig(
@@ -3376,7 +3428,7 @@ class MainTable(tk.Canvas):
3376
3428
  def set_table_font_help(self):
3377
3429
  self.table_txt_width, self.table_txt_height = self.get_txt_dimensions("|", self.PAR.ops.table_font)
3378
3430
  self.table_half_txt_height = ceil(self.table_txt_height / 2)
3379
- if self.table_half_txt_height % 2 == 0:
3431
+ if not self.table_half_txt_height % 2:
3380
3432
  self.table_first_ln_ins = self.table_half_txt_height + 2
3381
3433
  else:
3382
3434
  self.table_first_ln_ins = self.table_half_txt_height + 3
@@ -3404,7 +3456,7 @@ class MainTable(tk.Canvas):
3404
3456
  def set_header_font_help(self):
3405
3457
  self.header_txt_width, self.header_txt_height = self.get_txt_dimensions("|", self.PAR.ops.header_font)
3406
3458
  self.header_half_txt_height = ceil(self.header_txt_height / 2)
3407
- if self.header_half_txt_height % 2 == 0:
3459
+ if not self.header_half_txt_height % 2:
3408
3460
  self.header_first_ln_ins = self.header_half_txt_height + 2
3409
3461
  else:
3410
3462
  self.header_first_ln_ins = self.header_half_txt_height + 3
@@ -3435,7 +3487,7 @@ class MainTable(tk.Canvas):
3435
3487
  def set_index_font_help(self):
3436
3488
  self.index_txt_width, self.index_txt_height = self.get_txt_dimensions("|", self.PAR.ops.index_font)
3437
3489
  self.index_half_txt_height = ceil(self.index_txt_height / 2)
3438
- if self.index_half_txt_height % 2 == 0:
3490
+ if not self.index_half_txt_height % 2:
3439
3491
  self.index_first_ln_ins = self.index_half_txt_height + 2
3440
3492
  else:
3441
3493
  self.index_first_ln_ins = self.index_half_txt_height + 3
@@ -3562,19 +3614,22 @@ class MainTable(tk.Canvas):
3562
3614
  else:
3563
3615
  return False
3564
3616
 
3565
- def set_all_cell_sizes_to_text(self, include_index: bool = False) -> tuple[list[float], list[float]]:
3617
+ def set_all_cell_sizes_to_text(self, w: int | None = None) -> tuple[list[float], list[float]]:
3566
3618
  min_column_width = int(self.min_column_width)
3567
3619
  min_rh = int(self.min_row_height)
3568
- w = min_column_width
3620
+ w = min_column_width if w is None else w
3569
3621
  h = min_rh
3570
3622
  rhs = defaultdict(lambda: int(min_rh))
3571
3623
  cws = []
3572
- itmcon = self.txt_measure_canvas.itemconfig
3573
- itmbbx = self.txt_measure_canvas.bbox
3574
- self.txt_measure_canvas.itemconfig(self.txt_measure_canvas_text, font=self.PAR.ops.table_font)
3624
+ qconf = self.txt_measure_canvas.itemconfig
3625
+ qbbox = self.txt_measure_canvas.bbox
3626
+ qtxtm = self.txt_measure_canvas_text
3627
+ qtxth = self.table_txt_height
3628
+ qfont = self.PAR.ops.table_font
3575
3629
  numrows = self.total_data_rows()
3630
+ numcols = self.total_data_cols()
3576
3631
  if self.all_columns_displayed:
3577
- itercols = range(self.total_data_cols())
3632
+ itercols = range(numcols)
3578
3633
  else:
3579
3634
  itercols = self.displayed_columns
3580
3635
  if self.all_rows_displayed:
@@ -3591,23 +3646,28 @@ class MainTable(tk.Canvas):
3591
3646
  if h > rhs[datarn]:
3592
3647
  rhs[datarn] = h
3593
3648
  for datacn in itercols:
3594
- w, h_ = self.CH.get_cell_dimensions(datacn)
3595
- if self.all_rows_displayed:
3596
- iterrows = range(numrows)
3649
+ if (hw := self.CH.get_cell_dimensions(datacn)[0]) > w:
3650
+ w = hw
3597
3651
  for datarn in iterrows:
3598
3652
  txt = self.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
3599
3653
  if txt:
3600
- itmcon(self.txt_measure_canvas_text, text=txt)
3601
- b = itmbbx(self.txt_measure_canvas_text)
3654
+ qconf(qtxtm, text=txt, font=qfont)
3655
+ b = qbbox(qtxtm)
3602
3656
  tw = b[2] - b[0] + 7
3603
3657
  h = b[3] - b[1] + 5
3604
3658
  else:
3605
3659
  tw = min_column_width
3606
3660
  h = min_rh
3607
- if self.get_cell_kwargs(datarn, datacn, key="dropdown") or self.get_cell_kwargs(
3608
- datarn, datacn, key="checkbox"
3661
+ if self.get_cell_kwargs(
3662
+ datarn,
3663
+ datacn,
3664
+ key="dropdown",
3665
+ ) or self.get_cell_kwargs(
3666
+ datarn,
3667
+ datacn,
3668
+ key="checkbox",
3609
3669
  ):
3610
- tw += self.table_txt_height
3670
+ tw += qtxth
3611
3671
  if tw > w:
3612
3672
  w = tw
3613
3673
  if h < min_rh:
@@ -3621,8 +3681,8 @@ class MainTable(tk.Canvas):
3621
3681
  elif w > self.max_column_width:
3622
3682
  w = int(self.max_column_width)
3623
3683
  cws.append(w)
3624
- self.set_row_positions(itr=(height for height in rhs.values()))
3625
- self.set_col_positions(itr=(width for width in cws))
3684
+ self.set_row_positions(itr=rhs.values())
3685
+ self.set_col_positions(itr=cws)
3626
3686
  self.recreate_all_selection_boxes()
3627
3687
  return self.row_positions, self.col_positions
3628
3688
 
@@ -4193,12 +4253,12 @@ class MainTable(tk.Canvas):
4193
4253
  )
4194
4254
  if create_selections:
4195
4255
  self.deselect("all")
4196
- for chunk in consecutive_chunks(tuple(reversed(column_widths))):
4256
+ for boxst, boxend in consecutive_ranges(tuple(reversed(column_widths))):
4197
4257
  self.create_selection_box(
4198
4258
  0,
4199
- chunk[0],
4259
+ boxst,
4200
4260
  len(self.row_positions) - 1,
4201
- chunk[-1] + 1,
4261
+ boxend,
4202
4262
  "columns",
4203
4263
  run_binding=True,
4204
4264
  )
@@ -4322,11 +4382,11 @@ class MainTable(tk.Canvas):
4322
4382
  )
4323
4383
  if create_selections:
4324
4384
  self.deselect("all")
4325
- for chunk in consecutive_chunks(tuple(reversed(row_heights))):
4385
+ for boxst, boxend in consecutive_ranges(tuple(reversed(row_heights))):
4326
4386
  self.create_selection_box(
4327
- chunk[0],
4387
+ boxst,
4328
4388
  0,
4329
- chunk[-1] + 1,
4389
+ boxend,
4330
4390
  len(self.col_positions) - 1,
4331
4391
  "rows",
4332
4392
  run_binding=True,
@@ -5606,7 +5666,7 @@ class MainTable(tk.Canvas):
5606
5666
  if r2 < len(self.row_positions) and c2 < len(self.col_positions):
5607
5667
  self.create_selection_box(r1, c1, r2, c2, v, run_binding=True)
5608
5668
  if selected:
5609
- self.set_currently_selected(selected.row, selected.column, box=selected.coords)
5669
+ self.set_currently_selected(selected.row, selected.column, box=selected.box)
5610
5670
 
5611
5671
  def set_currently_selected(
5612
5672
  self,
@@ -5689,6 +5749,7 @@ class MainTable(tk.Canvas):
5689
5749
  c: int,
5690
5750
  type_: Literal["cells", "rows", "columns"],
5691
5751
  fill_iid: int,
5752
+ lower_selection_boxes: bool = True,
5692
5753
  ) -> int:
5693
5754
  fill, outline = self.get_selected_box_bg_fg(type_=type_)
5694
5755
  x1 = self.col_positions[c] + 1
@@ -5699,6 +5760,7 @@ class MainTable(tk.Canvas):
5699
5760
  if self.PAR.ops.show_selected_cells_border:
5700
5761
  fill = ""
5701
5762
  else:
5763
+ fill = outline
5702
5764
  outline = ""
5703
5765
  iid = self.display_box(
5704
5766
  x1,
@@ -5719,10 +5781,7 @@ class MainTable(tk.Canvas):
5719
5781
  iid=iid,
5720
5782
  fill_iid=fill_iid,
5721
5783
  )
5722
- if self.PAR.ops.show_selected_cells_border:
5723
- self.tag_raise(iid)
5724
- else:
5725
- self.tag_lower(iid)
5784
+ if lower_selection_boxes:
5726
5785
  self.lower_selection_boxes()
5727
5786
  return iid
5728
5787
 
@@ -5763,7 +5822,7 @@ class MainTable(tk.Canvas):
5763
5822
  self.hidd_boxes.add(item)
5764
5823
  self.itemconfig(item, state="hidden")
5765
5824
 
5766
- def hide_selection_box(self, item: int | None, set_current: bool = True) -> None:
5825
+ def hide_selection_box(self, item: int | None, set_current: bool = True) -> bool:
5767
5826
  if item is None:
5768
5827
  return
5769
5828
  box = self.selection_boxes.pop(item)
@@ -5774,6 +5833,7 @@ class MainTable(tk.Canvas):
5774
5833
  if self.selected.fill_iid == item:
5775
5834
  self.hide_selected()
5776
5835
  self.set_current_to_last()
5836
+ return True
5777
5837
 
5778
5838
  def hide_selected(self) -> None:
5779
5839
  if self.selected:
@@ -5871,19 +5931,25 @@ class MainTable(tk.Canvas):
5871
5931
  elif isinstance(set_current, tuple):
5872
5932
  curr_r = set_current[0]
5873
5933
  curr_c = set_current[1]
5874
- self.create_currently_selected_box(curr_r, curr_c, type_, fill_iid)
5934
+ self.create_currently_selected_box(curr_r, curr_c, type_, fill_iid, lower_selection_boxes=False)
5875
5935
  self.lower_selection_boxes()
5876
5936
  if run_binding:
5877
5937
  self.run_selection_binding(type_)
5878
5938
  return fill_iid
5879
5939
 
5880
5940
  def lower_selection_boxes(self) -> None:
5881
- for iid, box in reversed(self.selection_boxes.items()):
5882
- self.tag_lower(iid)
5883
- self.RI.tag_lower(box.index)
5884
- self.CH.tag_lower(box.header)
5885
- if self.PAR.ops.show_selected_cells_border and self.selected:
5886
- self.tag_raise(self.selected.iid)
5941
+ if self.selected:
5942
+ if not self.PAR.ops.show_selected_cells_border:
5943
+ self.tag_lower(self.selected.iid)
5944
+ self.tag_lower("rows")
5945
+ self.tag_lower("columns")
5946
+ self.tag_lower("cells")
5947
+ self.RI.tag_lower("rows")
5948
+ self.RI.tag_lower("cells")
5949
+ self.CH.tag_lower("columns")
5950
+ self.CH.tag_lower("cells")
5951
+ if self.PAR.ops.show_selected_cells_border:
5952
+ self.tag_raise(self.selected.iid)
5887
5953
 
5888
5954
  def recreate_selection_box(
5889
5955
  self,
@@ -6353,13 +6419,11 @@ class MainTable(tk.Canvas):
6353
6419
  extra_func_key = "Return"
6354
6420
  elif hasattr(event, "keysym") and event.keysym == "F2":
6355
6421
  extra_func_key = "F2"
6356
- datarn = r if self.all_rows_displayed else self.displayed_rows[r]
6357
- datacn = c if self.all_columns_displayed else self.displayed_columns[c]
6358
6422
  if event is not None and (hasattr(event, "keysym") and event.keysym == "BackSpace"):
6359
6423
  extra_func_key = "BackSpace"
6360
6424
  text = ""
6361
6425
  else:
6362
- text = f"{self.get_cell_data(datarn, datacn, none_to_empty_str = True)}"
6426
+ text = f"{self.get_cell_data(self.datarn(r), self.datacn(c), none_to_empty_str = True)}"
6363
6427
  elif event is not None and (
6364
6428
  (hasattr(event, "char") and event.char.isalpha())
6365
6429
  or (hasattr(event, "char") and event.char.isdigit())
@@ -6403,9 +6467,7 @@ class MainTable(tk.Canvas):
6403
6467
  w = self.col_positions[c + 1] - x + 1
6404
6468
  h = self.row_positions[r + 1] - y + 1
6405
6469
  if text is None:
6406
- text = f"""{self.get_cell_data(r if self.all_rows_displayed else self.displayed_rows[r],
6407
- c if self.all_columns_displayed else self.displayed_columns[c],
6408
- none_to_empty_str = True)}"""
6470
+ text = f"{self.get_cell_data(self.datarn(r), self.datacn(c), none_to_empty_str = True)}"
6409
6471
  bg, fg = self.PAR.ops.table_bg, self.PAR.ops.table_fg
6410
6472
  kwargs = {
6411
6473
  "menu_kwargs": DotDict(
@@ -6418,12 +6480,12 @@ class MainTable(tk.Canvas):
6418
6480
  }
6419
6481
  ),
6420
6482
  "sheet_ops": self.PAR.ops,
6421
- "border_color": self.PAR.ops.table_selected_cells_border_fg,
6483
+ "border_color": self.PAR.ops.table_selected_box_cells_fg,
6422
6484
  "text": text,
6423
6485
  "state": state,
6424
6486
  "width": w,
6425
6487
  "height": h,
6426
- "show_border": self.PAR.ops.show_selected_cells_border,
6488
+ "show_border": True,
6427
6489
  "bg": bg,
6428
6490
  "fg": fg,
6429
6491
  "align": self.get_cell_align(r, c),
@@ -6462,7 +6524,16 @@ class MainTable(tk.Canvas):
6462
6524
  check_lines: bool = True,
6463
6525
  ) -> None:
6464
6526
  curr_height = self.text_editor.window.winfo_height()
6465
- if not check_lines or self.get_lines_cell_height(self.text_editor.window.get_num_lines() + 1) > curr_height:
6527
+ if curr_height < self.min_row_height:
6528
+ return
6529
+ if (
6530
+ not check_lines
6531
+ or self.get_lines_cell_height(
6532
+ self.text_editor.window.get_num_lines() + 1,
6533
+ font=self.text_editor.tktext.cget("font"),
6534
+ )
6535
+ > curr_height
6536
+ ):
6466
6537
  new_height = curr_height + self.table_xtra_lines_increment
6467
6538
  space_bot = self.get_space_bot(r)
6468
6539
  if new_height > space_bot:
@@ -6487,24 +6558,30 @@ class MainTable(tk.Canvas):
6487
6558
  )
6488
6559
  self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
6489
6560
 
6490
- def refresh_open_window_positions(self):
6561
+ def refresh_open_window_positions(self, zoom: Literal["in", "out"]):
6491
6562
  if self.text_editor.open:
6492
6563
  r, c = self.text_editor.coords
6493
6564
  self.text_editor.window.config(height=self.row_positions[r + 1] - self.row_positions[r])
6565
+ self.text_editor.tktext.config(font=self.PAR.ops.table_font)
6494
6566
  self.coords(
6495
6567
  self.text_editor.canvas_id,
6496
6568
  self.col_positions[c],
6497
6569
  self.row_positions[r],
6498
6570
  )
6499
6571
  if self.dropdown.open:
6572
+ if zoom == "in":
6573
+ self.dropdown.window.zoom_in()
6574
+ elif zoom == "out":
6575
+ self.dropdown.window.zoom_out()
6500
6576
  r, c = self.dropdown.get_coords()
6501
6577
  if self.text_editor.open:
6502
6578
  text_editor_h = self.text_editor.window.winfo_height()
6503
6579
  win_h, anchor = self.get_dropdown_height_anchor(r, c, text_editor_h)
6504
6580
  else:
6505
- text_editor_h = self.row_positions[r + 1] - self.row_positions[r]
6581
+ text_editor_h = self.row_positions[r + 1] - self.row_positions[r] + 1
6506
6582
  anchor = self.itemcget(self.dropdown.canvas_id, "anchor")
6507
6583
  # win_h = 0
6584
+ self.dropdown.window.config(width=self.col_positions[c + 1] - self.col_positions[c] + 1)
6508
6585
  if anchor == "nw":
6509
6586
  self.coords(
6510
6587
  self.dropdown.canvas_id,
@@ -6527,7 +6604,6 @@ class MainTable(tk.Canvas):
6527
6604
  if reason == "Escape":
6528
6605
  self.focus_set()
6529
6606
 
6530
- # c is displayed col
6531
6607
  def close_text_editor(
6532
6608
  self,
6533
6609
  editor_info: tuple | None = None,
@@ -6650,8 +6726,7 @@ class MainTable(tk.Canvas):
6650
6726
  def tab_key(self, event: object = None) -> str:
6651
6727
  if not self.selected:
6652
6728
  return
6653
- r = self.selected.row
6654
- c = self.selected.column
6729
+ r, c = self.selected.row, self.selected.column
6655
6730
  r1, c1, r2, c2 = self.selection_boxes[self.selected.fill_iid].coords
6656
6731
  numcols = c2 - c1
6657
6732
  numrows = r2 - r1
@@ -6761,6 +6836,7 @@ class MainTable(tk.Canvas):
6761
6836
  if not self.open_text_editor(event=event, r=r, c=c, dropdown=True):
6762
6837
  return
6763
6838
  win_h, anchor = self.get_dropdown_height_anchor(r, c)
6839
+ win_w = self.col_positions[c + 1] - self.col_positions[c] + 1
6764
6840
  if anchor == "nw":
6765
6841
  if kwargs["state"] == "normal":
6766
6842
  ypos = self.row_positions[r] + self.text_editor.window.winfo_height() - 1
@@ -6768,33 +6844,29 @@ class MainTable(tk.Canvas):
6768
6844
  ypos = self.row_positions[r + 1]
6769
6845
  else:
6770
6846
  ypos = self.row_positions[r]
6771
- if self.dropdown.window is not None:
6772
- self.dropdown.window.search_function = kwargs["search_function"]
6773
- self.dropdown.window.r = r
6774
- self.dropdown.window.c = c
6775
- self.dropdown.window.row = -1
6776
- self.dropdown.window.set_options()
6777
- self.dropdown.window.values(kwargs["values"])
6778
- if not self.dropdown.open:
6779
- self.itemconfig(self.dropdown.canvas_id, state="normal")
6847
+ reset_kwargs = {
6848
+ "r": r,
6849
+ "c": c,
6850
+ "width": win_w,
6851
+ "height": win_h,
6852
+ "font": self.PAR.ops.table_font,
6853
+ "ops": self.PAR.ops,
6854
+ "outline_color": self.get_selected_box_bg_fg(type_="cells")[1],
6855
+ "align": self.get_cell_align(r, c),
6856
+ "values": kwargs["values"],
6857
+ }
6858
+ if self.dropdown.window:
6859
+ self.dropdown.window.reset(**reset_kwargs)
6860
+ self.itemconfig(self.dropdown.canvas_id, state="normal", anchor=anchor)
6780
6861
  self.coords(self.dropdown.canvas_id, self.col_positions[c], ypos)
6781
6862
  else:
6782
6863
  self.dropdown.window = self.PAR.dropdown_class(
6783
6864
  self.winfo_toplevel(),
6784
- r,
6785
- c,
6786
- width=self.col_positions[c + 1] - self.col_positions[c] + 1,
6787
- height=win_h,
6788
- font=self.PAR.ops.table_font,
6789
- ops=self.PAR.ops,
6790
- outline_color=self.get_selected_box_bg_fg(type_="cells")[1],
6791
- outline_thickness=2,
6792
- values=kwargs["values"],
6865
+ **reset_kwargs,
6793
6866
  close_dropdown_window=self.close_dropdown_window,
6794
6867
  search_function=kwargs["search_function"],
6795
6868
  arrowkey_RIGHT=self.arrowkey_RIGHT,
6796
6869
  arrowkey_LEFT=self.arrowkey_LEFT,
6797
- align="w", # self.get_cell_align(r, c)
6798
6870
  )
6799
6871
  self.dropdown.canvas_id = self.create_window(
6800
6872
  (self.col_positions[c], ypos),
@@ -7082,7 +7154,12 @@ class MainTable(tk.Canvas):
7082
7154
  self.delete_row_format("all", clear_values=clear_values)
7083
7155
  self.delete_column_format("all", clear_values=clear_values)
7084
7156
 
7085
- def delete_cell_format(self, datarn: str | int = "all", datacn: int = 0, clear_values: bool = False) -> None:
7157
+ def delete_cell_format(
7158
+ self,
7159
+ datarn: Literal["all"] | int = "all",
7160
+ datacn: int = 0,
7161
+ clear_values: bool = False,
7162
+ ) -> None:
7086
7163
  if isinstance(datarn, str) and datarn.lower() == "all":
7087
7164
  itr = gen_formatted(self.cell_options)
7088
7165
  else:
@@ -7096,7 +7173,7 @@ class MainTable(tk.Canvas):
7096
7173
  if clear_values:
7097
7174
  self.set_cell_data(*key, get_val(*key), expand_sheet=False)
7098
7175
 
7099
- def delete_row_format(self, datarn: str | int = "all", clear_values: bool = False) -> None:
7176
+ def delete_row_format(self, datarn: Literal["all"] | int = "all", clear_values: bool = False) -> None:
7100
7177
  if isinstance(datarn, str) and datarn.lower() == "all":
7101
7178
  itr = gen_formatted(self.row_options)
7102
7179
  else:
@@ -7111,7 +7188,7 @@ class MainTable(tk.Canvas):
7111
7188
  for datacn in range(len(self.data[datarn])):
7112
7189
  self.set_cell_data(datarn, datacn, get_val(datarn, datacn), expand_sheet=False)
7113
7190
 
7114
- def delete_column_format(self, datacn: str | int = "all", clear_values: bool = False) -> None:
7191
+ def delete_column_format(self, datacn: Literal["all"] | int = "all", clear_values: bool = False) -> None:
7115
7192
  if isinstance(datacn, str) and datacn.lower() == "all":
7116
7193
  itr = gen_formatted(self.col_options)
7117
7194
  else: