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/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 AnyIter, Binding
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
- numrows=added_rows,
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
- reversed(rows),
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
- numcols=added_cols,
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
- reversed(columns),
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.tree_rns = {v: full_new_idxs[k] for v, k in self.RI.tree_rns.items()}
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(reversed(modification["added"]["rows"]["table"])),
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(reversed(modification["added"]["rows"]["row_heights"])),
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(reversed(modification["added"]["columns"]["table"])),
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(reversed(modification["added"]["columns"]["column_widths"])),
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: AnyIter[int] | int | None = None,
2610
- columns: AnyIter[int] | int | None = None,
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.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
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.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True),
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.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True):
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: AnyIter[float]) -> None:
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: AnyIter[float]) -> None:
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: AnyIter[int] | None = None) -> None:
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: AnyIter[int] | None = None) -> None:
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.tree_rns = {k: push_n(r, rows) for k, r in self.RI.tree_rns.items()}
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.tree_rns = {
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(reversed(column_widths)) > len(cws):
5035
- for i in reversed(range(len(cws), len(cws) + next(reversed(column_widths)) - len(cws))):
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 reversed(columns.items()):
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(reversed(columns)),
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(reversed(column_widths))):
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 reversed(rows.items()):
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(reversed(rows)),
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(reversed(row_heights))):
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
- rows, index, heights = self.get_args_for_add_rows(data_ins_row, displayed_ins_row, numrows)
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
- numcols: int,
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
- header_data = {}
5291
- if isinstance(self._headers, list):
5292
- if headers and columns:
5293
- header_data = {
5294
- datacn: column[0]
5295
- for datacn, column in zip(reversed(range(data_ins_col, data_ins_col + numcols)), reversed(columns))
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
- header_data = {
5299
- datacn: self.CH.get_value_for_empty_cell(datacn, c_ops=False)
5300
- for datacn in reversed(range(data_ins_col, data_ins_col + numcols))
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
- start = 1 if headers else 0
5312
- columns = {
5313
- datacn: dict(enumerate(islice(column, start, None)))
5314
- for datacn, column in zip(reversed(range(data_ins_col, data_ins_col + numcols)), reversed(columns))
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
- widths = {
5318
- c: self.PAR.ops.default_column_width
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
- widths = dict(zip(reversed(range(displayed_ins_col, displayed_ins_col + numcols)), reversed(widths)))
5323
- return columns, header_data, widths
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
- numrows: int,
5330
- rows: list[list[Any]] | None = None,
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
- index_data = {}
5336
- if isinstance(self._row_index, list):
5337
- if row_index and rows:
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
- colrange = total_data_cols if total_data_cols else 1
5355
- rows = {
5356
- datarn: [self.get_value_for_empty_cell(datarn, c, c_ops=False) for c in range(colrange)]
5357
- for datarn in reversed(range(data_ins_row, data_ins_row + numrows))
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
- start = 1 if row_index else 0
5361
- rows = {
5362
- datarn: v[start:] if start and v else v
5363
- for datarn, v in zip(reversed(range(data_ins_row, data_ins_row + numrows)), reversed(rows))
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
- default_row_height = self.get_default_row_height()
5367
- heights = {r: default_row_height for r in reversed(range(displayed_ins_row, displayed_ins_row + numrows))}
5381
+ h = self.get_default_row_height()
5382
+ heights_dict = dict(zip(rng, repeat(h)))
5368
5383
  else:
5369
- heights = dict(zip(reversed(range(displayed_ins_row, displayed_ins_row + numrows)), reversed(heights)))
5370
- return rows, index_data, heights
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 reversed(cols):
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 reversed(cols):
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
- for datarn in reversed(rows):
5498
- event_data["deleted"]["rows"][datarn] = self.data.pop(datarn)
5499
- try:
5500
- event_data["deleted"]["index"][datarn] = self._row_index.pop(datarn)
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 reversed(rows):
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.tree_rns[did]
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 | AnyIter[int] | None = None,
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 | AnyIter[int] | None = None,
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.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
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
- # deals with possibility of formatter class being in self.data cell
8079
- # if cell is formatted - possibly returns invalid_value kwarg if
8080
- # cell value is not in datatypes kwarg
8081
- # if get displayed is true then Nones are replaced by ""
8082
- def get_valid_cell_data_as_str(self, datarn: int, datacn: int, get_displayed: bool = False, **kwargs) -> str:
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 = self.get_cell_kwargs(datarn, datacn, key="dropdown")
8085
- if kwargs:
8086
- if kwargs["text"] is not None:
8087
- return f"{kwargs['text']}"
8088
- else:
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
- kwargs = self.get_cell_kwargs(datarn, datacn, key="format")
8097
- if kwargs:
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: