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/main_table.py
CHANGED
@@ -5,7 +5,7 @@ import io
|
|
5
5
|
import tkinter as tk
|
6
6
|
from bisect import bisect_left, bisect_right
|
7
7
|
from collections import defaultdict, deque
|
8
|
-
from collections.abc import Callable, Generator, Hashable, Sequence
|
8
|
+
from collections.abc import Callable, Generator, Hashable, Iterator, Sequence
|
9
9
|
from functools import partial
|
10
10
|
from itertools import accumulate, chain, cycle, filterfalse, islice, repeat
|
11
11
|
from math import ceil, floor
|
@@ -103,7 +103,7 @@ from .other_classes import (
|
|
103
103
|
from .row_index import RowIndex
|
104
104
|
from .sorting import sort_selection
|
105
105
|
from .text_editor import TextEditor
|
106
|
-
from .tksheet_types import
|
106
|
+
from .tksheet_types import Binding
|
107
107
|
|
108
108
|
|
109
109
|
class MainTable(tk.Canvas):
|
@@ -1272,7 +1272,7 @@ class MainTable(tk.Canvas):
|
|
1272
1272
|
rows, index, row_heights = self.get_args_for_add_rows(
|
1273
1273
|
data_ins_row=data_ins_row,
|
1274
1274
|
displayed_ins_row=displayed_ins_row,
|
1275
|
-
|
1275
|
+
rows=added_rows,
|
1276
1276
|
total_data_cols=total_data_cols,
|
1277
1277
|
)
|
1278
1278
|
for ndr, r in zip(
|
@@ -1280,7 +1280,7 @@ class MainTable(tk.Canvas):
|
|
1280
1280
|
adjusted_new_data_numrows,
|
1281
1281
|
new_data_numrows,
|
1282
1282
|
),
|
1283
|
-
|
1283
|
+
rows,
|
1284
1284
|
):
|
1285
1285
|
for ndc, c in enumerate(
|
1286
1286
|
range(
|
@@ -1318,7 +1318,7 @@ class MainTable(tk.Canvas):
|
|
1318
1318
|
columns, headers, column_widths = self.get_args_for_add_columns(
|
1319
1319
|
data_ins_col=data_ins_col,
|
1320
1320
|
displayed_ins_col=displayed_ins_col,
|
1321
|
-
|
1321
|
+
columns=added_cols,
|
1322
1322
|
)
|
1323
1323
|
# only add the extra rows if expand_y is allowed
|
1324
1324
|
if self.PAR.ops.paste_can_expand_x and self.PAR.ops.paste_can_expand_y:
|
@@ -1336,7 +1336,7 @@ class MainTable(tk.Canvas):
|
|
1336
1336
|
adjusted_new_data_numcols,
|
1337
1337
|
new_data_numcols,
|
1338
1338
|
),
|
1339
|
-
|
1339
|
+
columns,
|
1340
1340
|
):
|
1341
1341
|
val = data[ndr][ndc]
|
1342
1342
|
datarn = self.datarn(r)
|
@@ -1799,7 +1799,7 @@ class MainTable(tk.Canvas):
|
|
1799
1799
|
self.tagged_rows = {tags: {full_new_idxs[k] for k in tagged} for tags, tagged in self.tagged_rows.items()}
|
1800
1800
|
self.row_options = {full_new_idxs[k]: v for k, v in self.row_options.items()}
|
1801
1801
|
self.RI.cell_options = {full_new_idxs[k]: v for k, v in self.RI.cell_options.items()}
|
1802
|
-
self.RI.
|
1802
|
+
self.RI.rns = {v: full_new_idxs[k] for v, k in self.RI.rns.items()}
|
1803
1803
|
self.displayed_rows = sorted(full_new_idxs[k] for k in self.displayed_rows)
|
1804
1804
|
if manage_tree and self.PAR.ops.treeview:
|
1805
1805
|
next(two_step_move)
|
@@ -2078,6 +2078,10 @@ class MainTable(tk.Canvas):
|
|
2078
2078
|
event_data = self.save_cells_using_modification(modification, event_data)
|
2079
2079
|
saved_cells = True
|
2080
2080
|
|
2081
|
+
if modification["treeview"]["renamed"]:
|
2082
|
+
for old, new in modification["treeview"]["renamed"].items():
|
2083
|
+
event_data = self.RI.rename_iid(new, old, event_data=event_data)
|
2084
|
+
|
2081
2085
|
if modification["moved"]["columns"]:
|
2082
2086
|
totalcols = max(self.equalize_data_row_lengths(), max(modification["moved"]["columns"]["data"].values()))
|
2083
2087
|
data_new_idxs, disp_new_idxs, event_data = self.move_columns_adjust_options_dict(
|
@@ -2130,11 +2134,11 @@ class MainTable(tk.Canvas):
|
|
2130
2134
|
if modification["added"]["rows"]:
|
2131
2135
|
self.deselect("all", run_binding=False, redraw=False)
|
2132
2136
|
event_data = self.delete_rows_data(
|
2133
|
-
rows=tuple(
|
2137
|
+
rows=tuple(modification["added"]["rows"]["table"]),
|
2134
2138
|
event_data=event_data,
|
2135
2139
|
)
|
2136
2140
|
event_data = self.delete_rows_displayed(
|
2137
|
-
rows=tuple(
|
2141
|
+
rows=tuple(modification["added"]["rows"]["row_heights"]),
|
2138
2142
|
event_data=event_data,
|
2139
2143
|
from_undo=True,
|
2140
2144
|
)
|
@@ -2142,11 +2146,11 @@ class MainTable(tk.Canvas):
|
|
2142
2146
|
if modification["added"]["columns"]:
|
2143
2147
|
self.deselect("all", run_binding=False, redraw=False)
|
2144
2148
|
event_data = self.delete_columns_data(
|
2145
|
-
cols=tuple(
|
2149
|
+
cols=tuple(modification["added"]["columns"]["table"]),
|
2146
2150
|
event_data=event_data,
|
2147
2151
|
)
|
2148
2152
|
event_data = self.delete_columns_displayed(
|
2149
|
-
cols=tuple(
|
2153
|
+
cols=tuple(modification["added"]["columns"]["column_widths"]),
|
2150
2154
|
event_data=event_data,
|
2151
2155
|
from_undo=True,
|
2152
2156
|
)
|
@@ -2606,8 +2610,8 @@ class MainTable(tk.Canvas):
|
|
2606
2610
|
|
2607
2611
|
def deselect_any(
|
2608
2612
|
self,
|
2609
|
-
rows:
|
2610
|
-
columns:
|
2613
|
+
rows: Iterator[int] | int | None = None,
|
2614
|
+
columns: Iterator[int] | int | None = None,
|
2611
2615
|
redraw: bool = True,
|
2612
2616
|
) -> None:
|
2613
2617
|
if not self.selected:
|
@@ -4349,7 +4353,7 @@ class MainTable(tk.Canvas):
|
|
4349
4353
|
return self.data
|
4350
4354
|
|
4351
4355
|
def get_cell_dimensions(self, datarn: int, datacn: int) -> tuple[int, int]:
|
4352
|
-
txt = self.
|
4356
|
+
txt = self.cell_str(datarn, datacn, get_displayed=True)
|
4353
4357
|
if txt:
|
4354
4358
|
self.txt_measure_canvas.itemconfig(self.txt_measure_canvas_text, text=txt, font=self.PAR.ops.table_font)
|
4355
4359
|
b = self.txt_measure_canvas.bbox(self.txt_measure_canvas_text)
|
@@ -4478,7 +4482,7 @@ class MainTable(tk.Canvas):
|
|
4478
4482
|
sum(
|
4479
4483
|
1
|
4480
4484
|
for _ in wrap_text(
|
4481
|
-
text=self.
|
4485
|
+
text=self.cell_str(datarn, datacn, get_displayed=True),
|
4482
4486
|
max_width=self.get_cell_max_width(datarn, dispcn),
|
4483
4487
|
max_lines=float("inf"),
|
4484
4488
|
char_width_fn=self.wrap_get_char_w,
|
@@ -4524,7 +4528,7 @@ class MainTable(tk.Canvas):
|
|
4524
4528
|
w = min_column_width if width is None else width
|
4525
4529
|
w = hw if (hw := self.CH.get_cell_dimensions(datacn)[0]) > w else min_column_width
|
4526
4530
|
for datarn in iterrows:
|
4527
|
-
if txt := self.
|
4531
|
+
if txt := self.cell_str(datarn, datacn, get_displayed=True):
|
4528
4532
|
qconf(qtxtm, text=txt, font=qfont)
|
4529
4533
|
b = qbbox(qtxtm)
|
4530
4534
|
tw = b[2] - b[0] + added_w_space
|
@@ -4560,7 +4564,7 @@ class MainTable(tk.Canvas):
|
|
4560
4564
|
self.recreate_all_selection_boxes()
|
4561
4565
|
return self.row_positions, self.col_positions
|
4562
4566
|
|
4563
|
-
def set_col_positions(self, itr:
|
4567
|
+
def set_col_positions(self, itr: Iterator[float]) -> None:
|
4564
4568
|
self.col_positions = list(accumulate(chain([0], itr)))
|
4565
4569
|
|
4566
4570
|
def reset_col_positions(self, ncols: int | None = None, width: int | None = None) -> None:
|
@@ -4573,7 +4577,7 @@ class MainTable(tk.Canvas):
|
|
4573
4577
|
else:
|
4574
4578
|
self.set_col_positions(itr=repeat(width, len(self.displayed_columns)))
|
4575
4579
|
|
4576
|
-
def set_row_positions(self, itr:
|
4580
|
+
def set_row_positions(self, itr: Iterator[float]) -> None:
|
4577
4581
|
self.row_positions = list(accumulate(chain([0], itr)))
|
4578
4582
|
|
4579
4583
|
def reset_row_positions(self, nrows: int | None = None, height: int | None = None) -> None:
|
@@ -4608,7 +4612,7 @@ class MainTable(tk.Canvas):
|
|
4608
4612
|
del self.row_positions[idx]
|
4609
4613
|
self.row_positions[idx:] = [e - w for e in islice(self.row_positions, idx, len(self.row_positions))]
|
4610
4614
|
|
4611
|
-
def del_col_positions(self, idxs:
|
4615
|
+
def del_col_positions(self, idxs: Iterator[int] | None = None) -> None:
|
4612
4616
|
if idxs is None:
|
4613
4617
|
del self.col_positions[-1]
|
4614
4618
|
else:
|
@@ -4616,7 +4620,7 @@ class MainTable(tk.Canvas):
|
|
4616
4620
|
idxs = set(idxs)
|
4617
4621
|
self.set_col_positions(itr=(w for i, w in enumerate(self.gen_column_widths()) if i not in idxs))
|
4618
4622
|
|
4619
|
-
def del_row_positions(self, idxs:
|
4623
|
+
def del_row_positions(self, idxs: Iterator[int] | None = None) -> None:
|
4620
4624
|
if idxs is None:
|
4621
4625
|
del self.row_positions[-1]
|
4622
4626
|
else:
|
@@ -4789,7 +4793,7 @@ class MainTable(tk.Canvas):
|
|
4789
4793
|
self.tagged_rows = {tags: {push_n(r, rows) for r in tagged} for tags, tagged in self.tagged_rows.items()}
|
4790
4794
|
self.row_options = {push_n(r, rows): v for r, v in self.row_options.items()}
|
4791
4795
|
self.RI.cell_options = {push_n(r, rows): v for r, v in self.RI.cell_options.items()}
|
4792
|
-
self.RI.
|
4796
|
+
self.RI.rns = {k: push_n(r, rows) for k, r in self.RI.rns.items()}
|
4793
4797
|
# if there are named spans where rows were added
|
4794
4798
|
# add options to gap which was created by adding rows
|
4795
4799
|
totalcols = None
|
@@ -4973,10 +4977,8 @@ class MainTable(tk.Canvas):
|
|
4973
4977
|
for r, v in self.RI.cell_options.items()
|
4974
4978
|
if r not in to_del
|
4975
4979
|
}
|
4976
|
-
self.RI.
|
4977
|
-
v: r if not (num := bisect_left(to_bis, r)) else r - num
|
4978
|
-
for v, r in self.RI.tree_rns.items()
|
4979
|
-
if r not in to_del
|
4980
|
+
self.RI.rns = {
|
4981
|
+
v: r if not (num := bisect_left(to_bis, r)) else r - num for v, r in self.RI.rns.items() if r not in to_del
|
4980
4982
|
}
|
4981
4983
|
self.del_rows_from_named_spans(
|
4982
4984
|
to_del=to_del,
|
@@ -5031,8 +5033,8 @@ class MainTable(tk.Canvas):
|
|
5031
5033
|
if not from_undo and not self.all_columns_displayed:
|
5032
5034
|
self.displayed_columns = add_to_displayed(self.displayed_columns, columns)
|
5033
5035
|
cws = self.get_column_widths()
|
5034
|
-
if column_widths and next(
|
5035
|
-
for i in
|
5036
|
+
if column_widths and next(iter(column_widths)) > len(cws):
|
5037
|
+
for i in range(len(cws), next(iter(column_widths))):
|
5036
5038
|
column_widths[i] = self.PAR.ops.default_column_width
|
5037
5039
|
if not from_undo:
|
5038
5040
|
self.set_col_positions(
|
@@ -5043,7 +5045,7 @@ class MainTable(tk.Canvas):
|
|
5043
5045
|
)
|
5044
5046
|
# rn needed for indexing but cn insert
|
5045
5047
|
maxrn = 0
|
5046
|
-
for cn, rowdict in
|
5048
|
+
for cn, rowdict in columns.items():
|
5047
5049
|
for rn, v in rowdict.items():
|
5048
5050
|
if rn < len(self.data) and cn > len(self.data[rn]):
|
5049
5051
|
self.fix_row_len(rn, cn - 1)
|
@@ -5071,12 +5073,12 @@ class MainTable(tk.Canvas):
|
|
5071
5073
|
self._headers = insert_items(self._headers, header, self.CH.fix_header)
|
5072
5074
|
if push_ops:
|
5073
5075
|
self.adjust_options_post_add_columns(
|
5074
|
-
cols=tuple(
|
5076
|
+
cols=tuple(columns),
|
5075
5077
|
create_ops=create_ops,
|
5076
5078
|
)
|
5077
5079
|
if create_selections:
|
5078
5080
|
self.deselect("all", redraw=False)
|
5079
|
-
for boxst, boxend in consecutive_ranges(tuple(
|
5081
|
+
for boxst, boxend in consecutive_ranges(tuple(column_widths)):
|
5080
5082
|
self.create_selection_box(
|
5081
5083
|
0,
|
5082
5084
|
boxst,
|
@@ -5161,23 +5163,13 @@ class MainTable(tk.Canvas):
|
|
5161
5163
|
if not from_undo and not try_binding(self.extra_begin_insert_rows_rc_func, event_data, "begin_add_rows"):
|
5162
5164
|
return
|
5163
5165
|
self.saved_row_heights = {}
|
5164
|
-
if not from_undo and not self.all_rows_displayed:
|
5166
|
+
if not from_undo and not self.all_rows_displayed and not tree:
|
5167
|
+
# we have to handle this separately for the treeview
|
5168
|
+
# based on whether the rows will be displayed
|
5165
5169
|
self.displayed_rows = add_to_displayed(self.displayed_rows, rows)
|
5166
|
-
rhs = self.get_row_heights()
|
5167
|
-
if row_heights and next(reversed(row_heights)) > len(rhs):
|
5168
|
-
default_row_height = self.get_default_row_height()
|
5169
|
-
for i in reversed(range(len(rhs), len(rhs) + next(reversed(row_heights)) - len(rhs))):
|
5170
|
-
row_heights[i] = default_row_height
|
5171
|
-
if not from_undo:
|
5172
|
-
self.set_row_positions(
|
5173
|
-
itr=insert_items(
|
5174
|
-
rhs,
|
5175
|
-
row_heights,
|
5176
|
-
)
|
5177
|
-
)
|
5178
5170
|
maxcn = 0
|
5179
5171
|
# rn needed for insert but cn indexing
|
5180
|
-
for rn, row in
|
5172
|
+
for rn, row in rows.items():
|
5181
5173
|
cn = len(row) - 1
|
5182
5174
|
if rn > len(self.data):
|
5183
5175
|
self.fix_data_len(rn - 1, cn)
|
@@ -5203,12 +5195,34 @@ class MainTable(tk.Canvas):
|
|
5203
5195
|
)
|
5204
5196
|
if push_ops:
|
5205
5197
|
self.adjust_options_post_add_rows(
|
5206
|
-
rows=tuple(
|
5198
|
+
rows=tuple(rows),
|
5207
5199
|
create_ops=create_ops,
|
5208
5200
|
)
|
5201
|
+
event_data["added"]["rows"] = {
|
5202
|
+
"table": rows,
|
5203
|
+
"index": index,
|
5204
|
+
"row_heights": row_heights,
|
5205
|
+
}
|
5206
|
+
if tree and self.PAR.ops.treeview:
|
5207
|
+
# creates + overwrites row heights based on whether rows are showing
|
5208
|
+
event_data = self.RI.tree_add_rows(event_data=event_data)
|
5209
|
+
|
5210
|
+
row_heights = event_data["added"]["rows"]["row_heights"]
|
5211
|
+
rhs = self.get_row_heights()
|
5212
|
+
if row_heights and next(iter(row_heights)) > len(rhs):
|
5213
|
+
default_row_height = self.get_default_row_height()
|
5214
|
+
for i in range(len(rhs), next(row_heights)):
|
5215
|
+
row_heights[i] = default_row_height
|
5216
|
+
if not from_undo:
|
5217
|
+
self.set_row_positions(
|
5218
|
+
itr=insert_items(
|
5219
|
+
rhs,
|
5220
|
+
row_heights,
|
5221
|
+
)
|
5222
|
+
)
|
5209
5223
|
if create_selections:
|
5210
5224
|
self.deselect("all", redraw=False)
|
5211
|
-
for boxst, boxend in consecutive_ranges(tuple(
|
5225
|
+
for boxst, boxend in consecutive_ranges(tuple(row_heights)):
|
5212
5226
|
self.create_selection_box(
|
5213
5227
|
boxst,
|
5214
5228
|
0,
|
@@ -5220,13 +5234,6 @@ class MainTable(tk.Canvas):
|
|
5220
5234
|
if mod_event_boxes:
|
5221
5235
|
event_data["selection_boxes"] = self.get_boxes()
|
5222
5236
|
event_data["selected"] = self.selected
|
5223
|
-
event_data["added"]["rows"] = {
|
5224
|
-
"table": rows,
|
5225
|
-
"index": index,
|
5226
|
-
"row_heights": row_heights,
|
5227
|
-
}
|
5228
|
-
if tree and self.PAR.ops.treeview:
|
5229
|
-
event_data = self.RI.tree_add_rows(event_data=event_data)
|
5230
5237
|
if not from_undo:
|
5231
5238
|
try_binding(self.extra_end_insert_rows_rc_func, event_data, "end_add_rows")
|
5232
5239
|
return event_data
|
@@ -5265,7 +5272,17 @@ class MainTable(tk.Canvas):
|
|
5265
5272
|
if numrows < 1:
|
5266
5273
|
return
|
5267
5274
|
event_data = self.new_event_dict("add_rows", state=True)
|
5268
|
-
|
5275
|
+
if self.PAR.ops.treeview:
|
5276
|
+
heights = []
|
5277
|
+
else:
|
5278
|
+
h = self.get_default_row_height()
|
5279
|
+
heights = repeat(h, numrows)
|
5280
|
+
rows, index, heights = self.get_args_for_add_rows(
|
5281
|
+
data_ins_row=data_ins_row,
|
5282
|
+
displayed_ins_row=displayed_ins_row,
|
5283
|
+
rows=numrows,
|
5284
|
+
heights=heights,
|
5285
|
+
)
|
5269
5286
|
event_data = self.add_rows(
|
5270
5287
|
rows=rows,
|
5271
5288
|
index=index if isinstance(self._row_index, list) and self._row_index else {},
|
@@ -5282,92 +5299,90 @@ class MainTable(tk.Canvas):
|
|
5282
5299
|
self,
|
5283
5300
|
data_ins_col: int,
|
5284
5301
|
displayed_ins_col: int,
|
5285
|
-
|
5286
|
-
columns: list[list[Any]] | None = None,
|
5302
|
+
columns: list[list[Any]] | int,
|
5287
5303
|
widths: list[int] | tuple[int] | None = None,
|
5288
5304
|
headers: bool = False,
|
5289
5305
|
) -> tuple[dict, dict, dict]:
|
5290
|
-
|
5291
|
-
|
5292
|
-
|
5293
|
-
|
5294
|
-
|
5295
|
-
|
5296
|
-
|
5306
|
+
header_dict = {}
|
5307
|
+
columns_dict = {}
|
5308
|
+
if isinstance(columns, int):
|
5309
|
+
total_data_rows = self.total_data_rows()
|
5310
|
+
rng = total_data_rows if total_data_rows else 1
|
5311
|
+
|
5312
|
+
if isinstance(self._headers, list):
|
5313
|
+
for datacn in range(data_ins_col, data_ins_col + columns):
|
5314
|
+
columns_dict[datacn] = {}
|
5315
|
+
header_dict[datacn] = self.CH.get_value_for_empty_cell(datacn, c_ops=False)
|
5316
|
+
for datarn in range(rng):
|
5317
|
+
columns_dict[datacn][datarn] = self.get_value_for_empty_cell(datarn, datacn, c_ops=False)
|
5297
5318
|
else:
|
5298
|
-
|
5299
|
-
datacn
|
5300
|
-
for
|
5301
|
-
|
5302
|
-
if columns is None:
|
5303
|
-
rowrange = len(self.data) if self.data else 1
|
5304
|
-
columns = {
|
5305
|
-
datacn: {
|
5306
|
-
datarn: self.get_value_for_empty_cell(datarn, datacn, c_ops=False) for datarn in range(rowrange)
|
5307
|
-
}
|
5308
|
-
for datacn in reversed(range(data_ins_col, data_ins_col + numcols))
|
5309
|
-
}
|
5319
|
+
for datacn in range(data_ins_col, data_ins_col + columns):
|
5320
|
+
columns_dict[datacn] = {}
|
5321
|
+
for datarn in range(rng):
|
5322
|
+
columns_dict[datacn][datarn] = self.get_value_for_empty_cell(datarn, datacn, c_ops=False)
|
5310
5323
|
else:
|
5311
|
-
|
5312
|
-
|
5313
|
-
|
5314
|
-
|
5315
|
-
|
5324
|
+
if isinstance(self._headers, list) and headers:
|
5325
|
+
for datacn, column in enumerate(columns, data_ins_col):
|
5326
|
+
if column:
|
5327
|
+
header_dict[datacn] = column[0]
|
5328
|
+
columns_dict[datacn] = dict(enumerate(islice(column, 1, None)))
|
5329
|
+
else:
|
5330
|
+
for datacn, column in enumerate(columns, data_ins_col):
|
5331
|
+
if column:
|
5332
|
+
columns_dict[datacn] = dict(enumerate(column))
|
5333
|
+
|
5334
|
+
rng = range(displayed_ins_col, displayed_ins_col + len(columns_dict))
|
5316
5335
|
if widths is None:
|
5317
|
-
|
5318
|
-
|
5319
|
-
for c in reversed(range(displayed_ins_col, displayed_ins_col + numcols))
|
5320
|
-
}
|
5336
|
+
w = self.PAR.ops.default_column_width
|
5337
|
+
widths_dict = dict(zip(rng, repeat(w)))
|
5321
5338
|
else:
|
5322
|
-
|
5323
|
-
return
|
5339
|
+
widths_dict = dict(zip(rng, widths))
|
5340
|
+
return columns_dict, header_dict, widths_dict
|
5324
5341
|
|
5325
5342
|
def get_args_for_add_rows(
|
5326
5343
|
self,
|
5327
5344
|
data_ins_row: int,
|
5328
5345
|
displayed_ins_row: int,
|
5329
|
-
|
5330
|
-
|
5331
|
-
heights: list[int] | tuple[int] | None = None,
|
5346
|
+
rows: list[list[Any]] | int,
|
5347
|
+
heights: Iterator[int] | None = None,
|
5332
5348
|
row_index: bool = False,
|
5333
5349
|
total_data_cols: int | None = None,
|
5334
5350
|
) -> tuple[dict, dict, dict]:
|
5335
|
-
|
5336
|
-
|
5337
|
-
|
5338
|
-
index_data = {
|
5339
|
-
datarn: v[0]
|
5340
|
-
for datarn, v in zip(reversed(range(data_ins_row, data_ins_row + numrows)), reversed(rows))
|
5341
|
-
}
|
5342
|
-
else:
|
5343
|
-
if self.PAR.ops.treeview:
|
5344
|
-
nodes = [self.RI.get_value_for_empty_cell(data_ins_row, r_ops=False) for _ in range(numrows)]
|
5345
|
-
index_data = dict(zip(reversed(range(data_ins_row, data_ins_row + numrows)), reversed(nodes)))
|
5346
|
-
else:
|
5347
|
-
index_data = {
|
5348
|
-
datarn: self.RI.get_value_for_empty_cell(datarn, r_ops=False)
|
5349
|
-
for datarn in reversed(range(data_ins_row, data_ins_row + numrows))
|
5350
|
-
}
|
5351
|
-
if rows is None:
|
5351
|
+
index_dict = {}
|
5352
|
+
rows_dict = {}
|
5353
|
+
if isinstance(rows, int):
|
5352
5354
|
if total_data_cols is None:
|
5353
5355
|
total_data_cols = self.total_data_cols()
|
5354
|
-
|
5355
|
-
|
5356
|
-
|
5357
|
-
|
5358
|
-
|
5356
|
+
|
5357
|
+
rng = total_data_cols if total_data_cols else 1
|
5358
|
+
if isinstance(self._row_index, list):
|
5359
|
+
tree = self.PAR.ops.treeview
|
5360
|
+
for datarn in range(data_ins_row, data_ins_row + rows):
|
5361
|
+
rows_dict[datarn] = [self.get_value_for_empty_cell(datarn, c, c_ops=False) for c in range(rng)]
|
5362
|
+
index_dict[datarn] = self.RI.get_value_for_empty_cell(data_ins_row if tree else datarn, r_ops=False)
|
5363
|
+
else:
|
5364
|
+
for datarn in range(data_ins_row, data_ins_row + rows):
|
5365
|
+
rows_dict[datarn] = [self.get_value_for_empty_cell(datarn, c, c_ops=False) for c in range(rng)]
|
5359
5366
|
else:
|
5360
|
-
|
5361
|
-
|
5362
|
-
|
5363
|
-
|
5364
|
-
|
5367
|
+
if isinstance(self._row_index, list) and row_index:
|
5368
|
+
for datarn, row in enumerate(rows, data_ins_row):
|
5369
|
+
if row:
|
5370
|
+
index_dict[datarn] = row[0]
|
5371
|
+
if len(row) > 1:
|
5372
|
+
rows_dict[datarn] = row[1:]
|
5373
|
+
else:
|
5374
|
+
rows_dict[datarn] = []
|
5375
|
+
else:
|
5376
|
+
for datarn, row in enumerate(rows, data_ins_row):
|
5377
|
+
rows_dict[datarn] = row
|
5378
|
+
|
5379
|
+
rng = range(displayed_ins_row, displayed_ins_row + len(rows_dict))
|
5365
5380
|
if heights is None:
|
5366
|
-
|
5367
|
-
|
5381
|
+
h = self.get_default_row_height()
|
5382
|
+
heights_dict = dict(zip(rng, repeat(h)))
|
5368
5383
|
else:
|
5369
|
-
|
5370
|
-
return
|
5384
|
+
heights_dict = dict(zip(rng, heights))
|
5385
|
+
return rows_dict, index_dict, heights_dict
|
5371
5386
|
|
5372
5387
|
def copy_options(self) -> dict:
|
5373
5388
|
return {
|
@@ -5404,16 +5419,16 @@ class MainTable(tk.Canvas):
|
|
5404
5419
|
event_data = self.new_event_dict("delete_columns", state=True)
|
5405
5420
|
event_data["options"] = self.copy_options()
|
5406
5421
|
event_data["named_spans"] = {k: span.pickle_self() for k, span in self.named_spans.items()}
|
5407
|
-
for datacn in
|
5422
|
+
for i, datacn in enumerate(cols):
|
5408
5423
|
for rn in range(len(self.data)):
|
5409
5424
|
if datacn not in event_data["deleted"]["columns"]:
|
5410
5425
|
event_data["deleted"]["columns"][datacn] = {}
|
5411
5426
|
try:
|
5412
|
-
event_data["deleted"]["columns"][datacn][rn] = self.data[rn].pop(datacn)
|
5427
|
+
event_data["deleted"]["columns"][datacn][rn] = self.data[rn].pop(datacn - i)
|
5413
5428
|
except Exception:
|
5414
5429
|
continue
|
5415
5430
|
try:
|
5416
|
-
event_data["deleted"]["header"][datacn] = self._headers.pop(datacn)
|
5431
|
+
event_data["deleted"]["header"][datacn] = self._headers.pop(datacn - i)
|
5417
5432
|
except Exception:
|
5418
5433
|
continue
|
5419
5434
|
cols_set = set(cols)
|
@@ -5439,7 +5454,7 @@ class MainTable(tk.Canvas):
|
|
5439
5454
|
event_data = self.new_event_dict("delete_columns", state=True)
|
5440
5455
|
self.saved_column_widths = {}
|
5441
5456
|
if cols:
|
5442
|
-
for c in
|
5457
|
+
for c in cols:
|
5443
5458
|
if len(self.col_positions) > c + 1:
|
5444
5459
|
event_data["deleted"]["column_widths"][c] = self.col_positions[c + 1] - self.col_positions[c]
|
5445
5460
|
if not from_undo:
|
@@ -5494,14 +5509,20 @@ class MainTable(tk.Canvas):
|
|
5494
5509
|
event_data = self.new_event_dict("delete_rows", state=True)
|
5495
5510
|
event_data["options"] = self.copy_options()
|
5496
5511
|
event_data["named_spans"] = {k: span.pickle_self() for k, span in self.named_spans.items()}
|
5497
|
-
|
5498
|
-
|
5499
|
-
|
5500
|
-
|
5501
|
-
except Exception:
|
5502
|
-
continue
|
5512
|
+
|
5513
|
+
for i, datarn in enumerate(rows):
|
5514
|
+
event_data["deleted"]["rows"][datarn] = self.data.pop(datarn - i)
|
5515
|
+
|
5503
5516
|
if self.PAR.ops.treeview:
|
5517
|
+
event_data["deleted"]["index"] = {datarn: self._row_index[datarn] for datarn in rows}
|
5504
5518
|
event_data = self.RI.tree_del_rows(event_data=event_data)
|
5519
|
+
|
5520
|
+
elif isinstance(self.MT._row_index, list):
|
5521
|
+
for i, datarn in enumerate(rows):
|
5522
|
+
r = datarn - i
|
5523
|
+
if len(self._row_index) > r:
|
5524
|
+
event_data["deleted"]["index"][datarn] = self._row_index.pop(r)
|
5525
|
+
|
5505
5526
|
rows_set = set(rows)
|
5506
5527
|
self.adjust_options_post_delete_rows(
|
5507
5528
|
to_del=rows_set,
|
@@ -5525,7 +5546,7 @@ class MainTable(tk.Canvas):
|
|
5525
5546
|
event_data = self.new_event_dict("delete_rows", state=True)
|
5526
5547
|
self.saved_row_heights = {}
|
5527
5548
|
if rows:
|
5528
|
-
for r in
|
5549
|
+
for r in rows:
|
5529
5550
|
if len(self.row_positions) > r + 1:
|
5530
5551
|
event_data["deleted"]["row_heights"][r] = self.row_positions[r + 1] - self.row_positions[r]
|
5531
5552
|
if not from_undo:
|
@@ -5563,7 +5584,7 @@ class MainTable(tk.Canvas):
|
|
5563
5584
|
chain(
|
5564
5585
|
data_rows,
|
5565
5586
|
(
|
5566
|
-
self.RI.
|
5587
|
+
self.RI.rns[did]
|
5567
5588
|
for r in data_rows
|
5568
5589
|
for did in self.RI.get_iid_descendants(self._row_index[r].iid)
|
5569
5590
|
),
|
@@ -5617,7 +5638,7 @@ class MainTable(tk.Canvas):
|
|
5617
5638
|
|
5618
5639
|
def display_rows(
|
5619
5640
|
self,
|
5620
|
-
rows: int |
|
5641
|
+
rows: int | Iterator[int] | None = None,
|
5621
5642
|
all_rows_displayed: bool | None = None,
|
5622
5643
|
reset_row_positions: bool = True,
|
5623
5644
|
deselect_all: bool = True,
|
@@ -5646,7 +5667,7 @@ class MainTable(tk.Canvas):
|
|
5646
5667
|
|
5647
5668
|
def display_columns(
|
5648
5669
|
self,
|
5649
|
-
columns: int |
|
5670
|
+
columns: int | Iterator[int] | None = None,
|
5650
5671
|
all_columns_displayed: bool | None = None,
|
5651
5672
|
reset_col_positions: bool = True,
|
5652
5673
|
deselect_all: bool = True,
|
@@ -6240,7 +6261,7 @@ class MainTable(tk.Canvas):
|
|
6240
6261
|
cells["dropdown"][(datarn, datacn)] = kwargs
|
6241
6262
|
elif kwargs := self.get_cell_kwargs(datarn, datacn, key="checkbox"):
|
6242
6263
|
cells["checkbox"][(datarn, datacn)] = kwargs
|
6243
|
-
cells[(datarn, datacn)] = self.
|
6264
|
+
cells[(datarn, datacn)] = self.cell_str(datarn, datacn, get_displayed=True)
|
6244
6265
|
return cells
|
6245
6266
|
|
6246
6267
|
def wrap_get_char_w(self, c: str) -> int:
|
@@ -8075,31 +8096,30 @@ class MainTable(tk.Canvas):
|
|
8075
8096
|
for datarn in range(len(self.data)):
|
8076
8097
|
self.set_cell_data(datarn, datacn, get_val(datarn, datacn), expand_sheet=False)
|
8077
8098
|
|
8078
|
-
|
8079
|
-
|
8080
|
-
|
8081
|
-
|
8082
|
-
|
8099
|
+
def cell_str(self, datarn: int, datacn: int, get_displayed: bool = False, **kwargs) -> str:
|
8100
|
+
"""
|
8101
|
+
deals with possibility of formatter class being in self.data cell
|
8102
|
+
if cell is formatted - possibly returns invalid_value kwarg if
|
8103
|
+
cell value is not in datatypes kwarg
|
8104
|
+
if get displayed is true then Nones are replaced by
|
8105
|
+
"""
|
8106
|
+
kwargs = self.get_cell_kwargs(datarn, datacn, key=None)
|
8083
8107
|
if get_displayed:
|
8084
|
-
kwargs
|
8085
|
-
|
8086
|
-
|
8087
|
-
|
8088
|
-
|
8089
|
-
kwargs = self.get_cell_kwargs(datarn, datacn, key="checkbox")
|
8090
|
-
if kwargs:
|
8091
|
-
return f"{kwargs['text']}"
|
8108
|
+
if kwargs and "dropdown" in kwargs:
|
8109
|
+
if kwargs["dropdown"]["text"] is not None:
|
8110
|
+
return f"{kwargs['dropdown']['text']}"
|
8111
|
+
elif kwargs and "checkbox" in kwargs:
|
8112
|
+
return f"{kwargs['checkbox']['text']}"
|
8092
8113
|
try:
|
8093
8114
|
value = self.data[datarn][datacn]
|
8094
8115
|
except Exception:
|
8095
8116
|
value = ""
|
8096
|
-
|
8097
|
-
|
8098
|
-
if kwargs["formatter"] is None:
|
8117
|
+
if "format" in kwargs:
|
8118
|
+
if kwargs["format"]["formatter"] is None:
|
8099
8119
|
if get_displayed:
|
8100
|
-
return data_to_str(value, **kwargs)
|
8120
|
+
return data_to_str(value, **kwargs["format"])
|
8101
8121
|
else:
|
8102
|
-
return f"{get_data_with_valid_check(value, **kwargs)}"
|
8122
|
+
return f"{get_data_with_valid_check(value, **kwargs['format'])}"
|
8103
8123
|
else:
|
8104
8124
|
if get_displayed:
|
8105
8125
|
# assumed given formatter class has __str__()
|
@@ -8114,9 +8134,15 @@ class MainTable(tk.Canvas):
|
|
8114
8134
|
self,
|
8115
8135
|
datarn: int,
|
8116
8136
|
datacn: int,
|
8137
|
+
get_displayed: bool = False,
|
8117
8138
|
none_to_empty_str: bool = False,
|
8118
8139
|
fmt_kw: dict | None = None,
|
8119
8140
|
) -> Any:
|
8141
|
+
if get_displayed:
|
8142
|
+
if fmt_kw:
|
8143
|
+
return format_data(value=self.cell_str(datarn, datacn, get_displayed=True), **fmt_kw)
|
8144
|
+
else:
|
8145
|
+
return self.cell_str(datarn, datacn, get_displayed=True)
|
8120
8146
|
try: # when successful try is more than twice as fast as len check
|
8121
8147
|
value = self.data[datarn][datacn]
|
8122
8148
|
except Exception:
|