tksheet 7.4.8__py3-none-any.whl → 7.4.10__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 +24 -21
- tksheet/functions.py +18 -15
- tksheet/main_table.py +179 -153
- tksheet/row_index.py +292 -137
- tksheet/sheet.py +251 -300
- tksheet/sorting.py +61 -50
- tksheet/tksheet_types.py +0 -3
- {tksheet-7.4.8.dist-info → tksheet-7.4.10.dist-info}/METADATA +1 -1
- tksheet-7.4.10.dist-info/RECORD +22 -0
- tksheet-7.4.8.dist-info/RECORD +0 -22
- {tksheet-7.4.8.dist-info → tksheet-7.4.10.dist-info}/LICENSE.txt +0 -0
- {tksheet-7.4.8.dist-info → tksheet-7.4.10.dist-info}/WHEEL +0 -0
- {tksheet-7.4.8.dist-info → tksheet-7.4.10.dist-info}/top_level.txt +0 -0
tksheet/sheet.py
CHANGED
@@ -87,7 +87,7 @@ from .themes import (
|
|
87
87
|
theme_light_blue,
|
88
88
|
theme_light_green,
|
89
89
|
)
|
90
|
-
from .tksheet_types import
|
90
|
+
from .tksheet_types import Binding, CellPropertyKey, CreateSpanTypes, ExtraBinding
|
91
91
|
from .top_left_rectangle import TopLeftRectangle
|
92
92
|
|
93
93
|
|
@@ -543,7 +543,7 @@ class Sheet(tk.Frame):
|
|
543
543
|
def set_header_data(
|
544
544
|
self,
|
545
545
|
value: Any,
|
546
|
-
c: int | None |
|
546
|
+
c: int | None | Iterator[int] = None,
|
547
547
|
redraw: bool = True,
|
548
548
|
) -> Sheet:
|
549
549
|
if c is None:
|
@@ -579,7 +579,7 @@ class Sheet(tk.Frame):
|
|
579
579
|
def set_index_data(
|
580
580
|
self,
|
581
581
|
value: Any,
|
582
|
-
r: int | None |
|
582
|
+
r: int | None | Iterator[int] = None,
|
583
583
|
redraw: bool = True,
|
584
584
|
) -> Sheet:
|
585
585
|
if r is None:
|
@@ -1048,7 +1048,7 @@ class Sheet(tk.Frame):
|
|
1048
1048
|
def get_data(self, *key: CreateSpanTypes) -> Any:
|
1049
1049
|
"""
|
1050
1050
|
e.g. retrieves entire table as pandas dataframe
|
1051
|
-
sheet["A1"].expand().options(pandas.DataFrame).data
|
1051
|
+
sheet["A1"].expand().options(convert=pandas.DataFrame).data
|
1052
1052
|
|
1053
1053
|
must deal with
|
1054
1054
|
- format
|
@@ -1107,56 +1107,48 @@ class Sheet(tk.Frame):
|
|
1107
1107
|
"""
|
1108
1108
|
span = self.span_from_key(*key)
|
1109
1109
|
rows, cols = self.ranges_from_span(span)
|
1110
|
-
tdisp, idisp, hdisp = span.tdisp, span.idisp, span.hdisp
|
1111
1110
|
table, index, header = span.table, span.index, span.header
|
1112
1111
|
fmt_kw = span.kwargs if span.type_ == "format" and span.kwargs else None
|
1113
|
-
|
1112
|
+
t_data = partial(self.MT.get_cell_data, get_displayed=True) if span.tdisp else self.MT.get_cell_data
|
1113
|
+
i_data = self.RI.cell_str if span.idisp else self.RI.get_cell_data
|
1114
|
+
h_data = self.CH.cell_str if span.hdisp else self.CH.get_cell_data
|
1114
1115
|
res = []
|
1115
1116
|
if span.transposed:
|
1117
|
+
# Index row (first row when transposed)
|
1116
1118
|
if index:
|
1117
|
-
if
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
res.append([quick_idata(r, get_displayed=idisp) for r in rows])
|
1122
|
-
else:
|
1123
|
-
res.append([quick_idata(r, get_displayed=idisp) for r in rows])
|
1119
|
+
index_row = [""] if header and table else []
|
1120
|
+
index_row.extend(i_data(r) for r in rows)
|
1121
|
+
res.append(index_row)
|
1122
|
+
# Header and/or table data as columns
|
1124
1123
|
if header:
|
1125
|
-
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1130
|
-
)
|
1131
|
-
else:
|
1132
|
-
res.extend([quick_hdata(c, get_displayed=hdisp)] for c in cols)
|
1124
|
+
for c in cols:
|
1125
|
+
col = [h_data(c)]
|
1126
|
+
if table:
|
1127
|
+
col.extend(t_data(r, c, fmt_kw=fmt_kw) for r in rows)
|
1128
|
+
res.append(col)
|
1133
1129
|
elif table:
|
1134
|
-
res.extend([
|
1135
|
-
|
1130
|
+
res.extend([t_data(r, c, fmt_kw=fmt_kw) for r in rows] for c in cols)
|
1131
|
+
else:
|
1132
|
+
# Header row
|
1136
1133
|
if header:
|
1137
|
-
if
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
res.append([quick_hdata(c, get_displayed=hdisp) for c in cols])
|
1142
|
-
else:
|
1143
|
-
res.append([quick_hdata(c, get_displayed=hdisp) for c in cols])
|
1134
|
+
header_row = [""] if index and table else []
|
1135
|
+
header_row.extend(h_data(c) for c in cols)
|
1136
|
+
res.append(header_row)
|
1137
|
+
# Index and/or table data as rows
|
1144
1138
|
if index:
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
)
|
1151
|
-
else:
|
1152
|
-
res.extend([quick_idata(r, get_displayed=idisp)] for r in rows)
|
1139
|
+
for r in rows:
|
1140
|
+
row = [i_data(r)]
|
1141
|
+
if table:
|
1142
|
+
row.extend(t_data(r, c, fmt_kw=fmt_kw) for c in cols)
|
1143
|
+
res.append(row)
|
1153
1144
|
elif table:
|
1154
|
-
res.extend([
|
1145
|
+
res.extend([t_data(r, c, fmt_kw=fmt_kw) for c in cols] for r in rows)
|
1146
|
+
|
1155
1147
|
if not span.ndim:
|
1156
1148
|
# it's a cell
|
1157
1149
|
if len(res) == 1 and len(res[0]) == 1:
|
1158
1150
|
res = res[0][0]
|
1159
|
-
# it's a single
|
1151
|
+
# it's a single sublist
|
1160
1152
|
elif len(res) == 1:
|
1161
1153
|
res = res[0]
|
1162
1154
|
# retrieving a list of index cells or
|
@@ -1168,11 +1160,12 @@ class Sheet(tk.Frame):
|
|
1168
1160
|
elif span.ndim == 1:
|
1169
1161
|
# flatten sublists
|
1170
1162
|
res = res[0] if len(res) == 1 and len(res[0]) == 1 else list(chain.from_iterable(res))
|
1171
|
-
# if span.ndim == 2 res keeps its current
|
1172
|
-
|
1173
|
-
if span.convert is
|
1163
|
+
# if span.ndim == 2 res keeps its current dimensions as a list of lists
|
1164
|
+
|
1165
|
+
if span.convert is None:
|
1166
|
+
return res
|
1167
|
+
else:
|
1174
1168
|
return span.convert(res)
|
1175
|
-
return res
|
1176
1169
|
|
1177
1170
|
def get_total_rows(self, include_index: bool = False) -> int:
|
1178
1171
|
return self.MT.total_data_rows(include_index=include_index)
|
@@ -1308,6 +1301,7 @@ class Sheet(tk.Frame):
|
|
1308
1301
|
undo: bool | None = None,
|
1309
1302
|
emit_event: bool | None = None,
|
1310
1303
|
redraw: bool = True,
|
1304
|
+
event_data: EventDataDict | None = None,
|
1311
1305
|
) -> EventDataDict:
|
1312
1306
|
"""
|
1313
1307
|
e.g.
|
@@ -1364,12 +1358,13 @@ class Sheet(tk.Frame):
|
|
1364
1358
|
fmt_kw = span.kwargs if span.type_ == "format" and span.kwargs else None
|
1365
1359
|
transposed = span.transposed
|
1366
1360
|
maxr, maxc = startr, startc
|
1367
|
-
event_data
|
1368
|
-
|
1369
|
-
|
1370
|
-
|
1371
|
-
|
1372
|
-
|
1361
|
+
if event_data is None:
|
1362
|
+
event_data = event_dict(
|
1363
|
+
name="edit_table",
|
1364
|
+
sheet=self.name,
|
1365
|
+
widget=self,
|
1366
|
+
selected=self.MT.selected,
|
1367
|
+
)
|
1373
1368
|
set_t = self.event_data_set_table_cell
|
1374
1369
|
set_i, set_h = self.event_data_set_index_cell, self.event_data_set_header_cell
|
1375
1370
|
istart = 1 if index else 0
|
@@ -1540,28 +1535,32 @@ class Sheet(tk.Frame):
|
|
1540
1535
|
event_data = set_h(startc, data, event_data)
|
1541
1536
|
# add row/column lines (positions) if required
|
1542
1537
|
if self.MT.all_columns_displayed and maxc >= (ncols := len(self.MT.col_positions) - 1):
|
1538
|
+
_, _, widths = self.MT.get_args_for_add_columns(
|
1539
|
+
data_ins_col=len(self.MT.col_positions) - 1,
|
1540
|
+
displayed_ins_col=len(self.MT.col_positions) - 1,
|
1541
|
+
columns=maxc + 1 - ncols,
|
1542
|
+
widths=None,
|
1543
|
+
headers=False,
|
1544
|
+
)
|
1543
1545
|
event_data = self.MT.add_columns(
|
1544
|
-
|
1545
|
-
|
1546
|
-
|
1547
|
-
numcols=maxc + 1 - ncols,
|
1548
|
-
columns=[],
|
1549
|
-
widths=None,
|
1550
|
-
headers=False,
|
1551
|
-
),
|
1546
|
+
columns={},
|
1547
|
+
header={},
|
1548
|
+
column_widths=widths,
|
1552
1549
|
event_data=event_data,
|
1553
1550
|
create_selections=False,
|
1554
1551
|
)
|
1555
1552
|
if self.MT.all_rows_displayed and maxr >= (nrows := len(self.MT.row_positions) - 1):
|
1553
|
+
_, _, heights = self.MT.get_args_for_add_rows(
|
1554
|
+
data_ins_row=len(self.MT.row_positions) - 1,
|
1555
|
+
displayed_ins_row=len(self.MT.row_positions) - 1,
|
1556
|
+
rows=maxr + 1 - nrows,
|
1557
|
+
heights=None,
|
1558
|
+
row_index=False,
|
1559
|
+
)
|
1556
1560
|
event_data = self.MT.add_rows(
|
1557
|
-
|
1558
|
-
|
1559
|
-
|
1560
|
-
numrows=maxr + 1 - nrows,
|
1561
|
-
rows=[],
|
1562
|
-
heights=None,
|
1563
|
-
row_index=False,
|
1564
|
-
),
|
1561
|
+
rows={},
|
1562
|
+
index={},
|
1563
|
+
row_heights=heights,
|
1565
1564
|
event_data=event_data,
|
1566
1565
|
create_selections=False,
|
1567
1566
|
)
|
@@ -1703,7 +1702,7 @@ class Sheet(tk.Frame):
|
|
1703
1702
|
|
1704
1703
|
def insert_rows(
|
1705
1704
|
self,
|
1706
|
-
rows:
|
1705
|
+
rows: Iterator[list[Any]] | int = 1,
|
1707
1706
|
idx: str | int | None = None,
|
1708
1707
|
heights: list[int] | tuple[int] | None = None,
|
1709
1708
|
row_index: bool = False,
|
@@ -1722,34 +1721,10 @@ class Sheet(tk.Frame):
|
|
1722
1721
|
if isinstance(rows, int):
|
1723
1722
|
if rows < 1:
|
1724
1723
|
raise ValueError(f"rows arg must be greater than 0, not {rows}")
|
1725
|
-
|
1726
|
-
if row_index:
|
1727
|
-
data = [
|
1728
|
-
[self.RI.get_value_for_empty_cell(idx + i, r_ops=False)]
|
1729
|
-
+ self.MT.get_empty_row_seq(
|
1730
|
-
idx + i,
|
1731
|
-
total_cols,
|
1732
|
-
r_ops=False,
|
1733
|
-
c_ops=False,
|
1734
|
-
)
|
1735
|
-
for i in range(rows)
|
1736
|
-
]
|
1737
|
-
else:
|
1738
|
-
data = [
|
1739
|
-
self.MT.get_empty_row_seq(
|
1740
|
-
idx + i,
|
1741
|
-
total_cols,
|
1742
|
-
r_ops=False,
|
1743
|
-
c_ops=False,
|
1744
|
-
)
|
1745
|
-
for i in range(rows)
|
1746
|
-
]
|
1747
|
-
else:
|
1748
|
-
data = rows
|
1749
|
-
if not isinstance(rows, int) and fill:
|
1724
|
+
elif fill:
|
1750
1725
|
total_cols = self.MT.total_data_cols() if total_cols is None else total_cols
|
1751
1726
|
len_check = (total_cols + 1) if row_index else total_cols
|
1752
|
-
for rn, r in enumerate(
|
1727
|
+
for rn, r in enumerate(rows):
|
1753
1728
|
if len_check > (lnr := len(r)):
|
1754
1729
|
r += self.MT.get_empty_row_seq(
|
1755
1730
|
rn,
|
@@ -1758,14 +1733,11 @@ class Sheet(tk.Frame):
|
|
1758
1733
|
r_ops=False,
|
1759
1734
|
c_ops=False,
|
1760
1735
|
)
|
1761
|
-
numrows = len(data)
|
1762
|
-
displayed_ins_idx = idx if self.MT.all_rows_displayed else bisect_left(self.MT.displayed_rows, idx)
|
1763
1736
|
event_data = self.MT.add_rows(
|
1764
1737
|
*self.MT.get_args_for_add_rows(
|
1765
1738
|
data_ins_row=idx,
|
1766
|
-
displayed_ins_row=
|
1767
|
-
|
1768
|
-
rows=data,
|
1739
|
+
displayed_ins_row=idx if self.MT.all_rows_displayed else bisect_left(self.MT.displayed_rows, idx),
|
1740
|
+
rows=rows,
|
1769
1741
|
heights=heights,
|
1770
1742
|
row_index=row_index,
|
1771
1743
|
),
|
@@ -1784,7 +1756,7 @@ class Sheet(tk.Frame):
|
|
1784
1756
|
|
1785
1757
|
def insert_columns(
|
1786
1758
|
self,
|
1787
|
-
columns:
|
1759
|
+
columns: Iterator[list[Any]] | int = 1,
|
1788
1760
|
idx: str | int | None = None,
|
1789
1761
|
widths: list[int] | tuple[int] | None = None,
|
1790
1762
|
headers: bool = False,
|
@@ -1803,60 +1775,24 @@ class Sheet(tk.Frame):
|
|
1803
1775
|
if isinstance(columns, int):
|
1804
1776
|
if columns < 1:
|
1805
1777
|
raise ValueError(f"columns arg must be greater than 0, not {columns}")
|
1806
|
-
|
1807
|
-
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
datarn,
|
1812
|
-
datacn,
|
1813
|
-
r_ops=False,
|
1814
|
-
c_ops=False,
|
1815
|
-
)
|
1816
|
-
for datarn in range(total_rows)
|
1817
|
-
]
|
1818
|
-
for datacn in range(idx, idx + columns)
|
1819
|
-
]
|
1820
|
-
else:
|
1821
|
-
data = [
|
1822
|
-
[
|
1778
|
+
elif fill:
|
1779
|
+
len_check = (total_rows + 1) if headers else total_rows
|
1780
|
+
for i, column in enumerate(columns):
|
1781
|
+
if (col_len := len(column)) < len_check:
|
1782
|
+
column += [
|
1823
1783
|
self.MT.get_value_for_empty_cell(
|
1824
|
-
|
1825
|
-
|
1784
|
+
r,
|
1785
|
+
idx + i,
|
1826
1786
|
r_ops=False,
|
1827
1787
|
c_ops=False,
|
1828
1788
|
)
|
1829
|
-
for
|
1789
|
+
for r in range((col_len - 1) if headers else col_len, total_rows)
|
1830
1790
|
]
|
1831
|
-
for datacn in range(idx, idx + columns)
|
1832
|
-
]
|
1833
|
-
numcols = columns
|
1834
|
-
else:
|
1835
|
-
data = columns
|
1836
|
-
numcols = len(columns)
|
1837
|
-
if fill:
|
1838
|
-
len_check = (total_rows + 1) if headers else total_rows
|
1839
|
-
for i, column in enumerate(data):
|
1840
|
-
if (col_len := len(column)) < len_check:
|
1841
|
-
column += [
|
1842
|
-
self.MT.get_value_for_empty_cell(
|
1843
|
-
r,
|
1844
|
-
idx + i,
|
1845
|
-
r_ops=False,
|
1846
|
-
c_ops=False,
|
1847
|
-
)
|
1848
|
-
for r in range((col_len - 1) if headers else col_len, total_rows)
|
1849
|
-
]
|
1850
|
-
if self.MT.all_columns_displayed:
|
1851
|
-
displayed_ins_idx = idx
|
1852
|
-
elif not self.MT.all_columns_displayed:
|
1853
|
-
displayed_ins_idx = bisect_left(self.MT.displayed_columns, idx)
|
1854
1791
|
event_data = self.MT.add_columns(
|
1855
1792
|
*self.MT.get_args_for_add_columns(
|
1856
1793
|
data_ins_col=idx,
|
1857
|
-
displayed_ins_col=
|
1858
|
-
|
1859
|
-
columns=data,
|
1794
|
+
displayed_ins_col=idx if self.MT.all_columns_displayed else bisect_left(self.MT.displayed_columns, idx),
|
1795
|
+
columns=columns,
|
1860
1796
|
widths=widths,
|
1861
1797
|
headers=headers,
|
1862
1798
|
),
|
@@ -1874,7 +1810,7 @@ class Sheet(tk.Frame):
|
|
1874
1810
|
|
1875
1811
|
def del_rows(
|
1876
1812
|
self,
|
1877
|
-
rows: int |
|
1813
|
+
rows: int | Iterator[int],
|
1878
1814
|
data_indexes: bool = True,
|
1879
1815
|
undo: bool = True,
|
1880
1816
|
emit_event: bool = False,
|
@@ -1895,7 +1831,7 @@ class Sheet(tk.Frame):
|
|
1895
1831
|
|
1896
1832
|
def del_columns(
|
1897
1833
|
self,
|
1898
|
-
columns: int |
|
1834
|
+
columns: int | Iterator[int],
|
1899
1835
|
data_indexes: bool = True,
|
1900
1836
|
undo: bool = True,
|
1901
1837
|
emit_event: bool = False,
|
@@ -2187,7 +2123,7 @@ class Sheet(tk.Frame):
|
|
2187
2123
|
|
2188
2124
|
def sort_rows(
|
2189
2125
|
self,
|
2190
|
-
rows:
|
2126
|
+
rows: Iterator[int] | Span | int | None = None,
|
2191
2127
|
reverse: bool = False,
|
2192
2128
|
validation: bool = True,
|
2193
2129
|
key: Callable | None = None,
|
@@ -2201,7 +2137,7 @@ class Sheet(tk.Frame):
|
|
2201
2137
|
|
2202
2138
|
def sort_columns(
|
2203
2139
|
self,
|
2204
|
-
columns:
|
2140
|
+
columns: Iterator[int] | Span | int | None = None,
|
2205
2141
|
reverse: bool = False,
|
2206
2142
|
validation: bool = True,
|
2207
2143
|
key: Callable | None = None,
|
@@ -2533,13 +2469,13 @@ class Sheet(tk.Frame):
|
|
2533
2469
|
self.del_index_cell_options_dropdown_and_checkbox(r)
|
2534
2470
|
add_to_options(self.RI.cell_options, r, "checkbox", d)
|
2535
2471
|
if edit_data:
|
2536
|
-
set_idata(r, checked if isinstance(checked, bool) else force_bool(self.
|
2472
|
+
set_idata(r, checked if isinstance(checked, bool) else force_bool(self.RI.get_cell_data(r)))
|
2537
2473
|
if header:
|
2538
2474
|
for c in cols:
|
2539
2475
|
self.del_header_cell_options_dropdown_and_checkbox(c)
|
2540
2476
|
add_to_options(self.CH.cell_options, c, "checkbox", d)
|
2541
2477
|
if edit_data:
|
2542
|
-
set_hdata(c, checked if isinstance(checked, bool) else force_bool(self.
|
2478
|
+
set_hdata(c, checked if isinstance(checked, bool) else force_bool(self.CH.get_cell_data(c)))
|
2543
2479
|
if table:
|
2544
2480
|
if span.kind == "cell":
|
2545
2481
|
for r in rows:
|
@@ -3190,8 +3126,8 @@ class Sheet(tk.Frame):
|
|
3190
3126
|
|
3191
3127
|
def deselect_any(
|
3192
3128
|
self,
|
3193
|
-
rows:
|
3194
|
-
columns:
|
3129
|
+
rows: Iterator[int] | int | None,
|
3130
|
+
columns: Iterator[int] | int | None,
|
3195
3131
|
redraw: bool = True,
|
3196
3132
|
) -> Sheet:
|
3197
3133
|
self.MT.deselect_any(rows=rows, columns=columns, redraw=False)
|
@@ -3393,7 +3329,7 @@ class Sheet(tk.Frame):
|
|
3393
3329
|
|
3394
3330
|
def set_column_widths(
|
3395
3331
|
self,
|
3396
|
-
column_widths:
|
3332
|
+
column_widths: Iterator[float] | None = None,
|
3397
3333
|
canvas_positions: bool = False,
|
3398
3334
|
reset: bool = False,
|
3399
3335
|
) -> Sheet:
|
@@ -3408,7 +3344,7 @@ class Sheet(tk.Frame):
|
|
3408
3344
|
|
3409
3345
|
def set_row_heights(
|
3410
3346
|
self,
|
3411
|
-
row_heights:
|
3347
|
+
row_heights: Iterator[float] | None = None,
|
3412
3348
|
canvas_positions: bool = False,
|
3413
3349
|
reset: bool = False,
|
3414
3350
|
) -> Sheet:
|
@@ -3455,7 +3391,7 @@ class Sheet(tk.Frame):
|
|
3455
3391
|
|
3456
3392
|
delete_row_position = del_row_position
|
3457
3393
|
|
3458
|
-
def del_row_positions(self, idxs:
|
3394
|
+
def del_row_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
|
3459
3395
|
self.MT.del_row_positions(idxs=idxs)
|
3460
3396
|
self.set_refresh_timer()
|
3461
3397
|
return self
|
@@ -3466,7 +3402,7 @@ class Sheet(tk.Frame):
|
|
3466
3402
|
|
3467
3403
|
delete_column_position = del_column_position
|
3468
3404
|
|
3469
|
-
def del_column_positions(self, idxs:
|
3405
|
+
def del_column_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
|
3470
3406
|
self.MT.del_col_positions(idxs=idxs)
|
3471
3407
|
self.set_refresh_timer()
|
3472
3408
|
return self
|
@@ -3743,7 +3679,7 @@ class Sheet(tk.Frame):
|
|
3743
3679
|
|
3744
3680
|
def display_columns(
|
3745
3681
|
self,
|
3746
|
-
columns: None | Literal["all"] |
|
3682
|
+
columns: None | Literal["all"] | Iterator[int] = None,
|
3747
3683
|
all_columns_displayed: None | bool = None,
|
3748
3684
|
reset_col_positions: bool = True,
|
3749
3685
|
redraw: bool = False,
|
@@ -3767,7 +3703,7 @@ class Sheet(tk.Frame):
|
|
3767
3703
|
|
3768
3704
|
def hide_columns(
|
3769
3705
|
self,
|
3770
|
-
columns: int | set[int] |
|
3706
|
+
columns: int | set[int] | Iterator[int],
|
3771
3707
|
redraw: bool = True,
|
3772
3708
|
deselect_all: bool = True,
|
3773
3709
|
data_indexes: bool = False,
|
@@ -3811,7 +3747,7 @@ class Sheet(tk.Frame):
|
|
3811
3747
|
|
3812
3748
|
def show_columns(
|
3813
3749
|
self,
|
3814
|
-
columns: int |
|
3750
|
+
columns: int | Iterator[int],
|
3815
3751
|
redraw: bool = True,
|
3816
3752
|
deselect_all: bool = True,
|
3817
3753
|
) -> Sheet:
|
@@ -3878,7 +3814,7 @@ class Sheet(tk.Frame):
|
|
3878
3814
|
|
3879
3815
|
def display_rows(
|
3880
3816
|
self,
|
3881
|
-
rows: None | Literal["all"] |
|
3817
|
+
rows: None | Literal["all"] | Iterator[int] = None,
|
3882
3818
|
all_rows_displayed: None | bool = None,
|
3883
3819
|
reset_row_positions: bool = True,
|
3884
3820
|
redraw: bool = False,
|
@@ -3900,7 +3836,7 @@ class Sheet(tk.Frame):
|
|
3900
3836
|
|
3901
3837
|
def hide_rows(
|
3902
3838
|
self,
|
3903
|
-
rows: int | set[int] |
|
3839
|
+
rows: int | set[int] | Iterator[int],
|
3904
3840
|
redraw: bool = True,
|
3905
3841
|
deselect_all: bool = True,
|
3906
3842
|
data_indexes: bool = False,
|
@@ -3946,7 +3882,7 @@ class Sheet(tk.Frame):
|
|
3946
3882
|
|
3947
3883
|
def show_rows(
|
3948
3884
|
self,
|
3949
|
-
rows: int |
|
3885
|
+
rows: int | Iterator[int],
|
3950
3886
|
redraw: bool = True,
|
3951
3887
|
deselect_all: bool = True,
|
3952
3888
|
) -> Sheet:
|
@@ -4506,7 +4442,7 @@ class Sheet(tk.Frame):
|
|
4506
4442
|
def tag(
|
4507
4443
|
self,
|
4508
4444
|
*key: CreateSpanTypes,
|
4509
|
-
tags:
|
4445
|
+
tags: Iterator[str] | str = "",
|
4510
4446
|
) -> Sheet:
|
4511
4447
|
span = self.span_from_key(*key)
|
4512
4448
|
rows, cols = self.ranges_from_span(span)
|
@@ -4551,7 +4487,7 @@ class Sheet(tk.Frame):
|
|
4551
4487
|
|
4552
4488
|
def tag_rows(
|
4553
4489
|
self,
|
4554
|
-
rows: int |
|
4490
|
+
rows: int | Iterator[int],
|
4555
4491
|
*tags,
|
4556
4492
|
) -> Sheet:
|
4557
4493
|
if isinstance(rows, int):
|
@@ -4564,7 +4500,7 @@ class Sheet(tk.Frame):
|
|
4564
4500
|
|
4565
4501
|
def tag_columns(
|
4566
4502
|
self,
|
4567
|
-
columns: int |
|
4503
|
+
columns: int | Iterator[int],
|
4568
4504
|
*tags,
|
4569
4505
|
) -> Sheet:
|
4570
4506
|
if isinstance(columns, int):
|
@@ -4578,8 +4514,8 @@ class Sheet(tk.Frame):
|
|
4578
4514
|
def untag(
|
4579
4515
|
self,
|
4580
4516
|
cell: tuple[int, int] | None = None,
|
4581
|
-
rows: int |
|
4582
|
-
columns: int |
|
4517
|
+
rows: int | Iterator[int] | None = None,
|
4518
|
+
columns: int | Iterator[int] | None = None,
|
4583
4519
|
) -> Sheet:
|
4584
4520
|
if isinstance(cell, tuple):
|
4585
4521
|
for tagged in self.MT.tagged_cells.values():
|
@@ -4639,7 +4575,7 @@ class Sheet(tk.Frame):
|
|
4639
4575
|
text_column: None | int | list[str] = None,
|
4640
4576
|
push_ops: bool = False,
|
4641
4577
|
row_heights: Sequence[int] | None | False = None,
|
4642
|
-
open_ids:
|
4578
|
+
open_ids: Iterator[str] | None = None,
|
4643
4579
|
safety: bool = True,
|
4644
4580
|
ncols: int | None = None,
|
4645
4581
|
lower: bool = False,
|
@@ -4647,7 +4583,9 @@ class Sheet(tk.Frame):
|
|
4647
4583
|
include_parent_column: bool = True,
|
4648
4584
|
include_text_column: bool = True,
|
4649
4585
|
) -> Sheet:
|
4650
|
-
self.RI.tree_build
|
4586
|
+
build = self.RI.safe_tree_build if safety else self.RI.tree_build
|
4587
|
+
self.reset(cell_options=False, column_widths=False, header=False, redraw=False)
|
4588
|
+
build(
|
4651
4589
|
data=data,
|
4652
4590
|
iid_column=iid_column,
|
4653
4591
|
parent_column=parent_column,
|
@@ -4655,7 +4593,6 @@ class Sheet(tk.Frame):
|
|
4655
4593
|
push_ops=push_ops,
|
4656
4594
|
row_heights=row_heights,
|
4657
4595
|
open_ids=open_ids,
|
4658
|
-
safety=safety,
|
4659
4596
|
ncols=ncols,
|
4660
4597
|
lower=lower,
|
4661
4598
|
include_iid_column=include_iid_column,
|
@@ -4675,7 +4612,7 @@ class Sheet(tk.Frame):
|
|
4675
4612
|
"""
|
4676
4613
|
return self.RI.tree_open_ids
|
4677
4614
|
|
4678
|
-
def tree_set_open(self, open_ids:
|
4615
|
+
def tree_set_open(self, open_ids: Iterator[str]) -> Sheet:
|
4679
4616
|
"""
|
4680
4617
|
Accepts set[str] of iids that are open in the treeview
|
4681
4618
|
Closes everything else
|
@@ -4702,12 +4639,12 @@ class Sheet(tk.Frame):
|
|
4702
4639
|
"""
|
4703
4640
|
to_open = []
|
4704
4641
|
disp_set = set(self.MT.displayed_rows)
|
4705
|
-
|
4706
|
-
rns = self.RI.
|
4642
|
+
index = self.MT._row_index
|
4643
|
+
rns = self.RI.rns
|
4707
4644
|
open_ids = self.RI.tree_open_ids
|
4708
4645
|
descendants = self.RI.get_iid_descendants
|
4709
4646
|
for item in filter(items.__contains__, self.get_children()):
|
4710
|
-
if
|
4647
|
+
if index[rns[item]].children:
|
4711
4648
|
open_ids.add(item)
|
4712
4649
|
if rns[item] in disp_set:
|
4713
4650
|
to_disp = [rns[did] for did in descendants(item, check_open=True)]
|
@@ -4727,20 +4664,22 @@ class Sheet(tk.Frame):
|
|
4727
4664
|
deselect_all=False,
|
4728
4665
|
)
|
4729
4666
|
|
4730
|
-
def _tree_close(self, items:
|
4667
|
+
def _tree_close(self, items: Iterator[str]) -> list[int]:
|
4731
4668
|
"""
|
4732
4669
|
Only meant for internal use
|
4733
4670
|
"""
|
4734
4671
|
to_close = set()
|
4735
4672
|
disp_set = set(self.MT.displayed_rows)
|
4736
|
-
|
4737
|
-
|
4673
|
+
index = self.MT._row_index
|
4674
|
+
rns = self.RI.rns
|
4675
|
+
open_ids = self.RI.tree_open_ids
|
4676
|
+
descendants = self.RI.get_iid_descendants
|
4738
4677
|
for item in items:
|
4739
|
-
if
|
4740
|
-
|
4741
|
-
if
|
4742
|
-
for did in
|
4743
|
-
to_close.add(
|
4678
|
+
if index[rns[item]].children:
|
4679
|
+
open_ids.discard(item)
|
4680
|
+
if rns[item] in disp_set:
|
4681
|
+
for did in descendants(item, check_open=True):
|
4682
|
+
to_close.add(rns[did])
|
4744
4683
|
return to_close
|
4745
4684
|
|
4746
4685
|
def tree_close(self, *items, redraw: bool = True) -> Sheet:
|
@@ -4773,11 +4712,11 @@ class Sheet(tk.Frame):
|
|
4773
4712
|
"""
|
4774
4713
|
if not iid:
|
4775
4714
|
iid = self.RI.new_iid()
|
4776
|
-
if iid in self.RI.
|
4715
|
+
if iid in self.RI.rns:
|
4777
4716
|
raise ValueError(f"iid '{iid}' already exists.")
|
4778
4717
|
if iid == parent:
|
4779
4718
|
raise ValueError(f"iid '{iid}' cannot be equal to parent '{parent}'.")
|
4780
|
-
if parent and parent not in self.RI.
|
4719
|
+
if parent and parent not in self.RI.rns:
|
4781
4720
|
raise ValueError(f"parent '{parent}' does not exist.")
|
4782
4721
|
if text is None:
|
4783
4722
|
text = iid
|
@@ -4786,6 +4725,7 @@ class Sheet(tk.Frame):
|
|
4786
4725
|
self.insert_rows(
|
4787
4726
|
rows=[[new_node] + ([] if values is None else values)],
|
4788
4727
|
idx=datarn,
|
4728
|
+
heights=[],
|
4789
4729
|
row_index=True,
|
4790
4730
|
create_selections=create_selections,
|
4791
4731
|
fill=False,
|
@@ -4800,15 +4740,15 @@ class Sheet(tk.Frame):
|
|
4800
4740
|
def _get_id_insert_row(self, index: int, parent: str) -> int:
|
4801
4741
|
if parent:
|
4802
4742
|
if isinstance(index, int):
|
4803
|
-
index = min(index, len(self.RI.
|
4743
|
+
index = min(index, len(self.RI.iid_children(parent)))
|
4804
4744
|
datarn = (
|
4805
|
-
self.RI.
|
4745
|
+
self.RI.rns[parent]
|
4806
4746
|
+ index
|
4807
4747
|
+ 1
|
4808
4748
|
+ sum(self.RI.num_descendants(cid) for cid in islice(self.get_children(parent), index))
|
4809
4749
|
)
|
4810
4750
|
else:
|
4811
|
-
datarn = self.RI.
|
4751
|
+
datarn = self.RI.rns[parent] + self.RI.num_descendants(parent) + 1
|
4812
4752
|
else:
|
4813
4753
|
if isinstance(index, int):
|
4814
4754
|
datarn = index
|
@@ -4839,7 +4779,7 @@ class Sheet(tk.Frame):
|
|
4839
4779
|
- Values (int): row numbers
|
4840
4780
|
"""
|
4841
4781
|
to_insert = []
|
4842
|
-
if parent and parent not in self.RI.
|
4782
|
+
if parent and parent not in self.RI.rns:
|
4843
4783
|
raise ValueError(f"parent '{parent}' does not exist.")
|
4844
4784
|
datarn = self._get_id_insert_row(index=index, parent=parent)
|
4845
4785
|
rns_to_add = {}
|
@@ -4863,6 +4803,7 @@ class Sheet(tk.Frame):
|
|
4863
4803
|
self.insert_rows(
|
4864
4804
|
rows=to_insert,
|
4865
4805
|
idx=datarn,
|
4806
|
+
heights=[],
|
4866
4807
|
row_index=True,
|
4867
4808
|
create_selections=create_selections,
|
4868
4809
|
fill=False,
|
@@ -4880,6 +4821,8 @@ class Sheet(tk.Frame):
|
|
4880
4821
|
text: str | None = None,
|
4881
4822
|
values: list | None = None,
|
4882
4823
|
open_: bool | None = None,
|
4824
|
+
undo: bool = True,
|
4825
|
+
emit_event: bool = True,
|
4883
4826
|
redraw: bool = True,
|
4884
4827
|
) -> DotDict | Sheet:
|
4885
4828
|
"""
|
@@ -4887,19 +4830,17 @@ class Sheet(tk.Frame):
|
|
4887
4830
|
If no options are set then returns DotDict of options for item
|
4888
4831
|
Else returns Sheet
|
4889
4832
|
"""
|
4890
|
-
if item not in self.RI.
|
4833
|
+
if item not in self.RI.rns:
|
4891
4834
|
raise ValueError(f"Item '{item}' does not exist.")
|
4892
|
-
|
4893
|
-
|
4894
|
-
if isinstance(values, list):
|
4895
|
-
self.set_data(self.RI.tree_rns[item], data=values)
|
4835
|
+
get_only = all(param is None for param in (iid, text, values, open_))
|
4836
|
+
|
4896
4837
|
if isinstance(open_, bool):
|
4897
|
-
if self.RI.
|
4838
|
+
if self.RI.iid_children(item):
|
4898
4839
|
if open_:
|
4899
4840
|
self.RI.tree_open_ids.add(item)
|
4900
4841
|
if self.item_displayed(item):
|
4901
4842
|
self.show_rows(
|
4902
|
-
rows=map(self.RI.
|
4843
|
+
rows=map(self.RI.rns.__getitem__, self.RI.get_iid_descendants(item, check_open=True)),
|
4903
4844
|
redraw=False,
|
4904
4845
|
deselect_all=False,
|
4905
4846
|
)
|
@@ -4907,43 +4848,47 @@ class Sheet(tk.Frame):
|
|
4907
4848
|
self.RI.tree_open_ids.discard(item)
|
4908
4849
|
if self.item_displayed(item):
|
4909
4850
|
self.hide_rows(
|
4910
|
-
rows=set(
|
4911
|
-
map(self.RI.tree_rns.__getitem__, self.RI.get_iid_descendants(item, check_open=True))
|
4912
|
-
),
|
4851
|
+
rows=set(map(self.RI.rns.__getitem__, self.RI.get_iid_descendants(item, check_open=True))),
|
4913
4852
|
redraw=False,
|
4914
4853
|
deselect_all=False,
|
4915
4854
|
data_indexes=True,
|
4916
4855
|
)
|
4917
4856
|
else:
|
4918
4857
|
self.RI.tree_open_ids.discard(item)
|
4858
|
+
|
4859
|
+
event_data = None if get_only else self.MT.new_event_dict("edit_table", state=True)
|
4860
|
+
|
4861
|
+
if isinstance(text, str):
|
4862
|
+
event_data.cells.index = {self.RI.rns[item]: self.MT._row_index[self.RI.rns[item]].text}
|
4863
|
+
self.MT._row_index[self.RI.rns[item]].text = text
|
4864
|
+
|
4865
|
+
if isinstance(values, list):
|
4866
|
+
span = self.span(self.RI.rns[item], undo=False, emit_event=False)
|
4867
|
+
event_data = self.set_data(span, data=values, event_data=event_data)
|
4868
|
+
|
4919
4869
|
if isinstance(iid, str):
|
4920
|
-
if iid in self.RI.
|
4870
|
+
if iid in self.RI.rns:
|
4921
4871
|
raise ValueError(f"Cannot rename '{iid}', it already exists.")
|
4922
|
-
|
4923
|
-
|
4924
|
-
|
4925
|
-
|
4926
|
-
|
4927
|
-
|
4928
|
-
|
4929
|
-
|
4930
|
-
|
4931
|
-
|
4932
|
-
self.RI.tree_open_ids.discard(item)
|
4933
|
-
self.RI.tree_open_ids.add(iid)
|
4934
|
-
get = not (isinstance(iid, str) or isinstance(text, str) or isinstance(values, list) or isinstance(open_, bool))
|
4935
|
-
self.set_refresh_timer(redraw=not get and redraw)
|
4936
|
-
if get:
|
4872
|
+
event_data = self.RI.rename_iid(old=item, new=iid, event_data=event_data)
|
4873
|
+
|
4874
|
+
if event_data:
|
4875
|
+
if undo and self.MT.undo_enabled:
|
4876
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
4877
|
+
if emit_event:
|
4878
|
+
self.emit_event("<<SheetModified>>", event_data)
|
4879
|
+
|
4880
|
+
self.set_refresh_timer(redraw=not get_only and redraw)
|
4881
|
+
if get_only:
|
4937
4882
|
return DotDict(
|
4938
|
-
text=self.RI.
|
4939
|
-
values=self[self.RI.
|
4883
|
+
text=self.MT._row_index[self.RI.rns[item]].text,
|
4884
|
+
values=self[self.RI.rns[item]].options(ndim=1).data,
|
4940
4885
|
open_=item in self.RI.tree_open_ids,
|
4941
4886
|
)
|
4942
4887
|
return self
|
4943
4888
|
|
4944
4889
|
def itemrow(self, item: str) -> int:
|
4945
4890
|
try:
|
4946
|
-
return self.RI.
|
4891
|
+
return self.RI.rns[item]
|
4947
4892
|
except ValueError as error:
|
4948
4893
|
raise ValueError(f"item '{item}' does not exist.") from error
|
4949
4894
|
|
@@ -4957,30 +4902,29 @@ class Sheet(tk.Frame):
|
|
4957
4902
|
|
4958
4903
|
def get_children(self, item: None | str = None) -> Generator[str]:
|
4959
4904
|
if item is None:
|
4960
|
-
|
4961
|
-
yield iid
|
4962
|
-
yield from self.RI.get_iid_descendants(iid)
|
4905
|
+
yield from map(attrgetter("iid"), self.MT._row_index)
|
4963
4906
|
elif item == "":
|
4964
4907
|
yield from map(attrgetter("iid"), self.RI.gen_top_nodes())
|
4965
4908
|
else:
|
4966
|
-
yield from self.RI.
|
4909
|
+
yield from self.RI.iid_children(item)
|
4967
4910
|
|
4968
|
-
def
|
4911
|
+
def tree_traverse(self, item: None | str = None) -> Generator[str]:
|
4969
4912
|
if item is None:
|
4970
|
-
for
|
4971
|
-
|
4972
|
-
|
4973
|
-
yield from self.RI.get_iid_descendants(n.iid)
|
4913
|
+
for tiid in map(attrgetter("iid"), self.RI.gen_top_nodes()):
|
4914
|
+
yield tiid
|
4915
|
+
yield from self.RI.get_iid_descendants(tiid)
|
4974
4916
|
elif item == "":
|
4975
|
-
yield from (
|
4917
|
+
yield from map(attrgetter("iid"), self.RI.gen_top_nodes())
|
4976
4918
|
else:
|
4977
|
-
yield from self.RI.
|
4919
|
+
yield from self.RI.iid_children(item)
|
4920
|
+
|
4921
|
+
get_iids = tree_traverse
|
4978
4922
|
|
4979
4923
|
def del_items(self, *items, undo: bool = True) -> Sheet:
|
4980
4924
|
"""
|
4981
4925
|
Also deletes all descendants of items
|
4982
4926
|
"""
|
4983
|
-
rows = list(map(self.RI.
|
4927
|
+
rows = list(map(self.RI.rns.get, filter(self.exists, unpack(items))))
|
4984
4928
|
if rows:
|
4985
4929
|
self.del_rows(rows, data_indexes=True, undo=undo)
|
4986
4930
|
return self.set_refresh_timer(rows)
|
@@ -4995,7 +4939,7 @@ class Sheet(tk.Frame):
|
|
4995
4939
|
|
4996
4940
|
def top_index_row(self, index: int) -> int:
|
4997
4941
|
try:
|
4998
|
-
return next(self.RI.
|
4942
|
+
return next(self.RI.rns[n.iid] for i, n in enumerate(self.RI.gen_top_nodes()) if i == index)
|
4999
4943
|
except Exception:
|
5000
4944
|
return None
|
5001
4945
|
|
@@ -5012,9 +4956,9 @@ class Sheet(tk.Frame):
|
|
5012
4956
|
Moves item to be under parent as child at index
|
5013
4957
|
'parent' can be an empty str which will put the item at top level
|
5014
4958
|
"""
|
5015
|
-
if item not in self.RI.
|
4959
|
+
if item not in self.RI.rns:
|
5016
4960
|
raise ValueError(f"Item '{item}' does not exist.")
|
5017
|
-
if parent and parent not in self.RI.
|
4961
|
+
if parent and parent not in self.RI.rns:
|
5018
4962
|
raise ValueError(f"Parent '{parent}' does not exist.")
|
5019
4963
|
if self.RI.move_pid_causes_recursive_loop(item, parent):
|
5020
4964
|
raise ValueError(f"Item '{item}' causes recursive loop with parent '{parent}.")
|
@@ -5039,30 +4983,29 @@ class Sheet(tk.Frame):
|
|
5039
4983
|
reattach = move
|
5040
4984
|
|
5041
4985
|
def exists(self, item: str) -> bool:
|
5042
|
-
return item in self.RI.
|
4986
|
+
return item in self.RI.rns
|
5043
4987
|
|
5044
4988
|
def parent(self, item: str) -> str:
|
5045
|
-
if item not in self.RI.
|
4989
|
+
if item not in self.RI.rns:
|
5046
4990
|
raise ValueError(f"Item '{item}' does not exist.")
|
5047
|
-
return self.RI.
|
4991
|
+
return self.RI.iid_parent(item)
|
5048
4992
|
|
5049
4993
|
def index(self, item: str) -> int:
|
5050
|
-
if item not in self.RI.
|
4994
|
+
if item not in self.RI.rns:
|
5051
4995
|
raise ValueError(f"Item '{item}' does not exist.")
|
5052
|
-
elif self.RI.
|
4996
|
+
elif self.RI.iid_parent(item):
|
5053
4997
|
return self.RI.parent_node(item).children.index(item)
|
5054
4998
|
else:
|
5055
|
-
|
5056
|
-
return next(index for index, node in enumerate(self.RI.gen_top_nodes()) if node == find_node)
|
4999
|
+
return next(index for index, iid in enumerate(self.get_children("")) if iid == item)
|
5057
5000
|
|
5058
5001
|
def item_displayed(self, item: str) -> bool:
|
5059
5002
|
"""
|
5060
5003
|
Check if an item (row) is currently displayed on the sheet
|
5061
5004
|
- Does not check if the item is visible to the user
|
5062
5005
|
"""
|
5063
|
-
if item not in self.RI.
|
5006
|
+
if item not in self.RI.rns:
|
5064
5007
|
raise ValueError(f"Item '{item}' does not exist.")
|
5065
|
-
return bisect_in(self.MT.displayed_rows, self.RI.
|
5008
|
+
return bisect_in(self.MT.displayed_rows, self.RI.rns[item])
|
5066
5009
|
|
5067
5010
|
def display_item(self, item: str, redraw: bool = False) -> Sheet:
|
5068
5011
|
"""
|
@@ -5071,7 +5014,7 @@ class Sheet(tk.Frame):
|
|
5071
5014
|
- Unlike the ttk treeview 'see' function
|
5072
5015
|
this function does **NOT** scroll to the item
|
5073
5016
|
"""
|
5074
|
-
if not self.item_displayed(item) and self.RI.
|
5017
|
+
if not self.item_displayed(item) and self.RI.iid_parent(item):
|
5075
5018
|
self.show_rows(
|
5076
5019
|
rows=self._tree_open(list(self.RI.get_iid_ancestors(item))),
|
5077
5020
|
redraw=False,
|
@@ -5085,7 +5028,7 @@ class Sheet(tk.Frame):
|
|
5085
5028
|
"""
|
5086
5029
|
self.display_item(item, redraw=False)
|
5087
5030
|
self.see(
|
5088
|
-
row=bisect_left(self.MT.displayed_rows, self.RI.
|
5031
|
+
row=bisect_left(self.MT.displayed_rows, self.RI.rns[item]),
|
5089
5032
|
keep_xscroll=True,
|
5090
5033
|
redraw=False,
|
5091
5034
|
)
|
@@ -5120,8 +5063,8 @@ class Sheet(tk.Frame):
|
|
5120
5063
|
def selection_add(self, *items, run_binding: bool = True, redraw: bool = True) -> Sheet:
|
5121
5064
|
to_open = []
|
5122
5065
|
quick_displayed_check = set(self.MT.displayed_rows)
|
5123
|
-
for item in filter(self.RI.
|
5124
|
-
if self.RI.
|
5066
|
+
for item in filter(self.RI.rns.__contains__, unpack(items)):
|
5067
|
+
if self.RI.rns[item] not in quick_displayed_check and self.RI.iid_parent(item):
|
5125
5068
|
to_open.extend(list(self.RI.get_iid_ancestors(item)))
|
5126
5069
|
if to_open:
|
5127
5070
|
self.show_rows(
|
@@ -5133,9 +5076,9 @@ class Sheet(tk.Frame):
|
|
5133
5076
|
sorted(
|
5134
5077
|
bisect_left(
|
5135
5078
|
self.MT.displayed_rows,
|
5136
|
-
self.RI.
|
5079
|
+
self.RI.rns[item],
|
5137
5080
|
)
|
5138
|
-
for item in filter(self.RI.
|
5081
|
+
for item in filter(self.RI.rns.__contains__, unpack(items))
|
5139
5082
|
)
|
5140
5083
|
):
|
5141
5084
|
self.MT.create_selection_box(
|
@@ -5153,10 +5096,10 @@ class Sheet(tk.Frame):
|
|
5153
5096
|
|
5154
5097
|
def selection_remove(self, *items, redraw: bool = True) -> Sheet:
|
5155
5098
|
for item in unpack(items):
|
5156
|
-
if item not in self.RI.
|
5099
|
+
if item not in self.RI.rns:
|
5157
5100
|
continue
|
5158
5101
|
try:
|
5159
|
-
self.deselect(bisect_left(self.MT.displayed_rows, self.RI.
|
5102
|
+
self.deselect(bisect_left(self.MT.displayed_rows, self.RI.rns[item]), redraw=False)
|
5160
5103
|
except Exception:
|
5161
5104
|
continue
|
5162
5105
|
return self.set_refresh_timer(redraw)
|
@@ -5166,7 +5109,7 @@ class Sheet(tk.Frame):
|
|
5166
5109
|
add = []
|
5167
5110
|
remove = []
|
5168
5111
|
for item in unpack(items):
|
5169
|
-
if item in self.RI.
|
5112
|
+
if item in self.RI.rns:
|
5170
5113
|
if item in selected:
|
5171
5114
|
remove.append(item)
|
5172
5115
|
else:
|
@@ -5304,7 +5247,7 @@ class Sheet(tk.Frame):
|
|
5304
5247
|
|
5305
5248
|
def get_cell_data(self, r: int, c: int, get_displayed: bool = False) -> Any:
|
5306
5249
|
if get_displayed:
|
5307
|
-
return self.MT.
|
5250
|
+
return self.MT.cell_str(r, c, get_displayed=True)
|
5308
5251
|
else:
|
5309
5252
|
return self.MT.get_cell_data(r, c)
|
5310
5253
|
|
@@ -5314,7 +5257,7 @@ class Sheet(tk.Frame):
|
|
5314
5257
|
get_displayed: bool = False,
|
5315
5258
|
get_index: bool = False,
|
5316
5259
|
get_index_displayed: bool = True,
|
5317
|
-
only_columns: int |
|
5260
|
+
only_columns: int | Iterator[int] | None = None,
|
5318
5261
|
) -> list[Any]:
|
5319
5262
|
if only_columns is not None:
|
5320
5263
|
if isinstance(only_columns, int):
|
@@ -5323,15 +5266,16 @@ class Sheet(tk.Frame):
|
|
5323
5266
|
raise ValueError(tksheet_type_error("only_columns", ["int", "iterable", "None"], only_columns))
|
5324
5267
|
if r >= self.MT.total_data_rows():
|
5325
5268
|
raise IndexError(f"Row #{r} is out of range.")
|
5269
|
+
|
5326
5270
|
if r >= len(self.MT.data):
|
5327
5271
|
total_data_cols = self.MT.total_data_cols()
|
5328
5272
|
self.MT.fix_data_len(r, total_data_cols - 1)
|
5273
|
+
|
5329
5274
|
iterable = only_columns if only_columns is not None else range(len(self.MT.data[r]))
|
5330
|
-
f = partial(self.MT.
|
5331
|
-
if get_index
|
5332
|
-
|
5333
|
-
|
5334
|
-
return [f(r, c) for c in iterable]
|
5275
|
+
f = partial(self.MT.cell_str, get_displayed=True) if get_displayed else self.MT.get_cell_data
|
5276
|
+
row = [self.RI.get_cell_data(r, get_displayed=get_index_displayed)] if get_index else []
|
5277
|
+
row.extend(f(r, c) for c in iterable)
|
5278
|
+
return row
|
5335
5279
|
|
5336
5280
|
def get_column_data(
|
5337
5281
|
self,
|
@@ -5339,7 +5283,7 @@ class Sheet(tk.Frame):
|
|
5339
5283
|
get_displayed: bool = False,
|
5340
5284
|
get_header: bool = False,
|
5341
5285
|
get_header_displayed: bool = True,
|
5342
|
-
only_rows: int |
|
5286
|
+
only_rows: int | Iterator[int] | None = None,
|
5343
5287
|
) -> list[Any]:
|
5344
5288
|
if only_rows is not None:
|
5345
5289
|
if isinstance(only_rows, int):
|
@@ -5347,10 +5291,10 @@ class Sheet(tk.Frame):
|
|
5347
5291
|
elif not is_iterable(only_rows):
|
5348
5292
|
raise ValueError(tksheet_type_error("only_rows", ["int", "iterable", "None"], only_rows))
|
5349
5293
|
iterable = only_rows if only_rows is not None else range(len(self.MT.data))
|
5350
|
-
f = partial(self.MT.
|
5351
|
-
|
5352
|
-
|
5353
|
-
|
5294
|
+
f = partial(self.MT.cell_str, get_displayed=True) if get_displayed else self.MT.get_cell_data
|
5295
|
+
col = [self.CH.get_cell_data(c, get_displayed=get_header_displayed)] if get_header else []
|
5296
|
+
col.extend(f(r, c) for r in iterable)
|
5297
|
+
return col
|
5354
5298
|
|
5355
5299
|
def get_sheet_data(
|
5356
5300
|
self,
|
@@ -5359,9 +5303,9 @@ class Sheet(tk.Frame):
|
|
5359
5303
|
get_index: bool = False,
|
5360
5304
|
get_header_displayed: bool = True,
|
5361
5305
|
get_index_displayed: bool = True,
|
5362
|
-
only_rows:
|
5363
|
-
only_columns:
|
5364
|
-
) -> list[Any]:
|
5306
|
+
only_rows: Iterator[int] | int | None = None,
|
5307
|
+
only_columns: Iterator[int] | int | None = None,
|
5308
|
+
) -> list[list[Any]]:
|
5365
5309
|
if only_rows is not None:
|
5366
5310
|
if isinstance(only_rows, int):
|
5367
5311
|
only_rows = (only_rows,)
|
@@ -5372,6 +5316,7 @@ class Sheet(tk.Frame):
|
|
5372
5316
|
only_columns = (only_columns,)
|
5373
5317
|
elif not is_iterable(only_columns):
|
5374
5318
|
raise ValueError(tksheet_type_error("only_columns", ["int", "iterable", "None"], only_columns))
|
5319
|
+
|
5375
5320
|
if get_header:
|
5376
5321
|
maxlen = len(self.MT._headers) if isinstance(self.MT._headers, (list, tuple)) else 0
|
5377
5322
|
data = []
|
@@ -5380,15 +5325,19 @@ class Sheet(tk.Frame):
|
|
5380
5325
|
if len(r) > maxlen:
|
5381
5326
|
maxlen = len(r)
|
5382
5327
|
if get_index:
|
5383
|
-
|
5328
|
+
row = [self.RI.get_cell_data(rn, get_displayed=get_index_displayed)]
|
5329
|
+
row.extend(r)
|
5330
|
+
data.append(row)
|
5384
5331
|
else:
|
5385
5332
|
data.append(r)
|
5386
5333
|
iterable = only_columns if only_columns is not None else range(maxlen)
|
5387
|
-
if get_index
|
5388
|
-
|
5389
|
-
|
5390
|
-
|
5391
|
-
|
5334
|
+
header_row = [""] if get_index else []
|
5335
|
+
header_row.extend(self.CH.get_cell_data(cn, get_displayed=get_header_displayed) for cn in iterable)
|
5336
|
+
result = [header_row]
|
5337
|
+
result.extend(data)
|
5338
|
+
return result
|
5339
|
+
|
5340
|
+
else:
|
5392
5341
|
iterable = only_rows if only_rows is not None else range(len(self.MT.data))
|
5393
5342
|
return [
|
5394
5343
|
self.get_row_data(
|
@@ -5408,9 +5357,9 @@ class Sheet(tk.Frame):
|
|
5408
5357
|
get_index: bool = False,
|
5409
5358
|
get_index_displayed: bool = True,
|
5410
5359
|
get_header_displayed: bool = True,
|
5411
|
-
only_rows: int |
|
5412
|
-
only_columns: int |
|
5413
|
-
) ->
|
5360
|
+
only_rows: int | Iterator[int] | None = None,
|
5361
|
+
only_columns: int | Iterator[int] | None = None,
|
5362
|
+
) -> Generator[list[Any]]:
|
5414
5363
|
if only_rows is not None:
|
5415
5364
|
if isinstance(only_rows, int):
|
5416
5365
|
only_rows = (only_rows,)
|
@@ -5421,11 +5370,13 @@ class Sheet(tk.Frame):
|
|
5421
5370
|
only_columns = (only_columns,)
|
5422
5371
|
elif not is_iterable(only_columns):
|
5423
5372
|
raise ValueError(tksheet_type_error("only_columns", ["int", "iterable", "None"], only_columns))
|
5373
|
+
|
5424
5374
|
if get_header:
|
5425
5375
|
iterable = only_columns if only_columns is not None else range(self.MT.total_data_cols())
|
5426
|
-
|
5427
|
-
|
5428
|
-
|
5376
|
+
header_row = [""] if get_index else []
|
5377
|
+
header_row.extend(self.CH.get_cell_data(c, get_displayed=get_header_displayed) for c in iterable)
|
5378
|
+
yield header_row
|
5379
|
+
|
5429
5380
|
iterable = only_rows if only_rows is not None else range(len(self.MT.data))
|
5430
5381
|
yield from (
|
5431
5382
|
self.get_row_data(
|
@@ -5666,7 +5617,7 @@ class Sheet(tk.Frame):
|
|
5666
5617
|
|
5667
5618
|
def highlight_rows(
|
5668
5619
|
self,
|
5669
|
-
rows:
|
5620
|
+
rows: Iterator[int] | int,
|
5670
5621
|
bg: None | str = None,
|
5671
5622
|
fg: None | str = None,
|
5672
5623
|
highlight_index: bool = True,
|
@@ -5684,7 +5635,7 @@ class Sheet(tk.Frame):
|
|
5684
5635
|
|
5685
5636
|
def highlight_columns(
|
5686
5637
|
self,
|
5687
|
-
columns:
|
5638
|
+
columns: Iterator[int] | int,
|
5688
5639
|
bg: bool | None | str = False,
|
5689
5640
|
fg: bool | None | str = False,
|
5690
5641
|
highlight_header: bool = True,
|
@@ -5986,7 +5937,7 @@ class Sheet(tk.Frame):
|
|
5986
5937
|
|
5987
5938
|
def checkbox_row(
|
5988
5939
|
self,
|
5989
|
-
r:
|
5940
|
+
r: Iterator[int] | int | Literal["all"] = 0,
|
5990
5941
|
*args,
|
5991
5942
|
**kwargs,
|
5992
5943
|
) -> None:
|
@@ -6011,7 +5962,7 @@ class Sheet(tk.Frame):
|
|
6011
5962
|
|
6012
5963
|
def checkbox_column(
|
6013
5964
|
self,
|
6014
|
-
c:
|
5965
|
+
c: Iterator[int] | int | Literal["all"] = 0,
|
6015
5966
|
*args,
|
6016
5967
|
**kwargs,
|
6017
5968
|
) -> None:
|
@@ -6036,7 +5987,7 @@ class Sheet(tk.Frame):
|
|
6036
5987
|
|
6037
5988
|
def create_header_checkbox(
|
6038
5989
|
self,
|
6039
|
-
c:
|
5990
|
+
c: Iterator[int] | int | Literal["all"] = 0,
|
6040
5991
|
*args,
|
6041
5992
|
**kwargs,
|
6042
5993
|
) -> None:
|
@@ -6059,7 +6010,7 @@ class Sheet(tk.Frame):
|
|
6059
6010
|
|
6060
6011
|
def create_index_checkbox(
|
6061
6012
|
self,
|
6062
|
-
r:
|
6013
|
+
r: Iterator[int] | int | Literal["all"] = 0,
|
6063
6014
|
*args,
|
6064
6015
|
**kwargs,
|
6065
6016
|
) -> None:
|
@@ -6109,7 +6060,7 @@ class Sheet(tk.Frame):
|
|
6109
6060
|
|
6110
6061
|
def delete_row_checkbox(
|
6111
6062
|
self,
|
6112
|
-
r:
|
6063
|
+
r: Iterator[int] | int | Literal["all"] = 0,
|
6113
6064
|
) -> None:
|
6114
6065
|
if isinstance(r, str) and r.lower() == "all":
|
6115
6066
|
for r_ in self.MT.row_options:
|
@@ -6122,7 +6073,7 @@ class Sheet(tk.Frame):
|
|
6122
6073
|
|
6123
6074
|
def delete_column_checkbox(
|
6124
6075
|
self,
|
6125
|
-
c:
|
6076
|
+
c: Iterator[int] | int | Literal["all"] = 0,
|
6126
6077
|
) -> None:
|
6127
6078
|
if isinstance(c, str) and c.lower() == "all":
|
6128
6079
|
for c_ in self.MT.col_options:
|
@@ -6135,7 +6086,7 @@ class Sheet(tk.Frame):
|
|
6135
6086
|
|
6136
6087
|
def delete_header_checkbox(
|
6137
6088
|
self,
|
6138
|
-
c:
|
6089
|
+
c: Iterator[int] | int | Literal["all"] = 0,
|
6139
6090
|
) -> None:
|
6140
6091
|
if isinstance(c, str) and c.lower() == "all":
|
6141
6092
|
for c_ in self.CH.cell_options:
|
@@ -6149,7 +6100,7 @@ class Sheet(tk.Frame):
|
|
6149
6100
|
|
6150
6101
|
def delete_index_checkbox(
|
6151
6102
|
self,
|
6152
|
-
r:
|
6103
|
+
r: Iterator[int] | int | Literal["all"] = 0,
|
6153
6104
|
) -> None:
|
6154
6105
|
if isinstance(r, str) and r.lower() == "all":
|
6155
6106
|
for r_ in self.RI.cell_options:
|
@@ -6239,7 +6190,7 @@ class Sheet(tk.Frame):
|
|
6239
6190
|
|
6240
6191
|
def dropdown_row(
|
6241
6192
|
self,
|
6242
|
-
r:
|
6193
|
+
r: Iterator[int] | int | Literal["all"] = 0,
|
6243
6194
|
*args,
|
6244
6195
|
**kwargs,
|
6245
6196
|
) -> Sheet:
|
@@ -6264,7 +6215,7 @@ class Sheet(tk.Frame):
|
|
6264
6215
|
|
6265
6216
|
def dropdown_column(
|
6266
6217
|
self,
|
6267
|
-
c:
|
6218
|
+
c: Iterator[int] | int | Literal["all"] = 0,
|
6268
6219
|
*args,
|
6269
6220
|
**kwargs,
|
6270
6221
|
) -> Sheet:
|
@@ -6289,7 +6240,7 @@ class Sheet(tk.Frame):
|
|
6289
6240
|
|
6290
6241
|
def create_header_dropdown(
|
6291
6242
|
self,
|
6292
|
-
c:
|
6243
|
+
c: Iterator[int] | int | Literal["all"] = 0,
|
6293
6244
|
*args,
|
6294
6245
|
**kwargs,
|
6295
6246
|
) -> Sheet:
|
@@ -6313,7 +6264,7 @@ class Sheet(tk.Frame):
|
|
6313
6264
|
|
6314
6265
|
def create_index_dropdown(
|
6315
6266
|
self,
|
6316
|
-
r:
|
6267
|
+
r: Iterator[int] | int | Literal["all"] = 0,
|
6317
6268
|
*args,
|
6318
6269
|
**kwargs,
|
6319
6270
|
) -> Sheet:
|
@@ -6364,7 +6315,7 @@ class Sheet(tk.Frame):
|
|
6364
6315
|
|
6365
6316
|
def delete_row_dropdown(
|
6366
6317
|
self,
|
6367
|
-
r:
|
6318
|
+
r: Iterator[int] | int | Literal["all"] = "all",
|
6368
6319
|
) -> None:
|
6369
6320
|
if isinstance(r, str) and r.lower() == "all":
|
6370
6321
|
for r_ in self.MT.row_options:
|
@@ -6378,7 +6329,7 @@ class Sheet(tk.Frame):
|
|
6378
6329
|
|
6379
6330
|
def delete_column_dropdown(
|
6380
6331
|
self,
|
6381
|
-
c:
|
6332
|
+
c: Iterator[int] | int | Literal["all"] = "all",
|
6382
6333
|
) -> None:
|
6383
6334
|
if isinstance(c, str) and c.lower() == "all":
|
6384
6335
|
for c_ in self.MT.col_options:
|
@@ -6390,7 +6341,7 @@ class Sheet(tk.Frame):
|
|
6390
6341
|
for c_ in c:
|
6391
6342
|
self.del_column_options_dropdown(datacn=c_)
|
6392
6343
|
|
6393
|
-
def delete_header_dropdown(self, c:
|
6344
|
+
def delete_header_dropdown(self, c: Iterator[int] | int | Literal["all"]) -> None:
|
6394
6345
|
if isinstance(c, str) and c.lower() == "all":
|
6395
6346
|
for c_ in self.CH.cell_options:
|
6396
6347
|
if "dropdown" in self.CH.cell_options[c_]:
|
@@ -6401,7 +6352,7 @@ class Sheet(tk.Frame):
|
|
6401
6352
|
for c_ in c:
|
6402
6353
|
self.del_header_cell_options_dropdown(c_)
|
6403
6354
|
|
6404
|
-
def delete_index_dropdown(self, r:
|
6355
|
+
def delete_index_dropdown(self, r: Iterator[int] | int | Literal["all"]) -> None:
|
6405
6356
|
if isinstance(r, str) and r.lower() == "all":
|
6406
6357
|
for r_ in self.RI.cell_options:
|
6407
6358
|
if "dropdown" in self.RI.cell_options[r_]:
|
@@ -6637,7 +6588,7 @@ class Sheet(tk.Frame):
|
|
6637
6588
|
|
6638
6589
|
def format_row(
|
6639
6590
|
self,
|
6640
|
-
r:
|
6591
|
+
r: Iterator[int] | int | Literal["all"],
|
6641
6592
|
formatter_options: dict | None = None,
|
6642
6593
|
formatter_class: Any = None,
|
6643
6594
|
redraw: bool = True,
|
@@ -6669,7 +6620,7 @@ class Sheet(tk.Frame):
|
|
6669
6620
|
|
6670
6621
|
def delete_row_format(
|
6671
6622
|
self,
|
6672
|
-
r:
|
6623
|
+
r: Iterator[int] | int | Literal["all"] = "all",
|
6673
6624
|
clear_values: bool = False,
|
6674
6625
|
) -> Sheet:
|
6675
6626
|
if is_iterable(r):
|
@@ -6681,7 +6632,7 @@ class Sheet(tk.Frame):
|
|
6681
6632
|
|
6682
6633
|
def format_column(
|
6683
6634
|
self,
|
6684
|
-
c:
|
6635
|
+
c: Iterator[int] | int | Literal["all"],
|
6685
6636
|
formatter_options: dict | None = None,
|
6686
6637
|
formatter_class: Any = None,
|
6687
6638
|
redraw: bool = True,
|
@@ -6713,7 +6664,7 @@ class Sheet(tk.Frame):
|
|
6713
6664
|
|
6714
6665
|
def delete_column_format(
|
6715
6666
|
self,
|
6716
|
-
c:
|
6667
|
+
c: Iterator[int] | int | Literal["all"] = "all",
|
6717
6668
|
clear_values: bool = False,
|
6718
6669
|
) -> Sheet:
|
6719
6670
|
if is_iterable(c):
|