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/__init__.py +1 -1
- tksheet/column_headers.py +91 -73
- tksheet/functions.py +39 -11
- tksheet/main_table.py +240 -163
- tksheet/row_index.py +100 -79
- tksheet/sheet.py +101 -73
- tksheet/text_editor.py +8 -6
- {tksheet-7.1.4.dist-info → tksheet-7.1.6.dist-info}/METADATA +1 -1
- tksheet-7.1.6.dist-info/RECORD +20 -0
- tksheet-7.1.4.dist-info/RECORD +0 -20
- {tksheet-7.1.4.dist-info → tksheet-7.1.6.dist-info}/LICENSE.txt +0 -0
- {tksheet-7.1.4.dist-info → tksheet-7.1.6.dist-info}/WHEEL +0 -0
- {tksheet-7.1.4.dist-info → tksheet-7.1.6.dist-info}/top_level.txt +0 -0
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
|
-
|
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
|
964
|
+
for boxst, boxend in consecutive_ranges(sorted(disp_new_idxs.values())):
|
964
965
|
self.create_selection_box(
|
965
966
|
0,
|
966
|
-
|
967
|
+
boxst,
|
967
968
|
len(self.row_positions) - 1,
|
968
|
-
|
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
|
1185
|
+
for boxst, boxend in consecutive_ranges(sorted(disp_new_idxs.values())):
|
1185
1186
|
self.create_selection_box(
|
1186
|
-
|
1187
|
+
boxst,
|
1187
1188
|
0,
|
1188
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
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,
|
1985
|
-
elif r
|
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
|
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.
|
2075
|
-
self.
|
2069
|
+
if self.selected.row == len(self.row_positions) - 2:
|
2070
|
+
r = self.selected.row
|
2076
2071
|
else:
|
2077
|
-
self.
|
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
|
-
|
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
|
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
|
2137
|
-
|
2138
|
-
|
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(
|
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.
|
3288
|
-
self.
|
3289
|
-
self.
|
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=
|
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
|
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
|
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
|
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,
|
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
|
-
|
3573
|
-
|
3574
|
-
|
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(
|
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
|
-
|
3595
|
-
|
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
|
-
|
3601
|
-
b =
|
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(
|
3608
|
-
datarn,
|
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 +=
|
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=
|
3625
|
-
self.set_col_positions(itr=
|
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
|
4256
|
+
for boxst, boxend in consecutive_ranges(tuple(reversed(column_widths))):
|
4197
4257
|
self.create_selection_box(
|
4198
4258
|
0,
|
4199
|
-
|
4259
|
+
boxst,
|
4200
4260
|
len(self.row_positions) - 1,
|
4201
|
-
|
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
|
4385
|
+
for boxst, boxend in consecutive_ranges(tuple(reversed(row_heights))):
|
4326
4386
|
self.create_selection_box(
|
4327
|
-
|
4387
|
+
boxst,
|
4328
4388
|
0,
|
4329
|
-
|
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.
|
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
|
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) ->
|
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
|
-
|
5882
|
-
self.
|
5883
|
-
|
5884
|
-
self.
|
5885
|
-
|
5886
|
-
self.
|
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"
|
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.
|
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":
|
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
|
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
|
-
|
6772
|
-
|
6773
|
-
|
6774
|
-
|
6775
|
-
|
6776
|
-
self.
|
6777
|
-
self.
|
6778
|
-
|
6779
|
-
|
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
|
-
|
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(
|
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:
|
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:
|
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:
|