tksheet 7.2.17__py3-none-any.whl → 7.2.19__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 CHANGED
@@ -4,7 +4,7 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.2.17"
7
+ __version__ = "7.2.19"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
tksheet/column_headers.py CHANGED
@@ -290,8 +290,7 @@ class ColumnHeaders(tk.Canvas):
290
290
 
291
291
  def shift_b1_press(self, event: object) -> None:
292
292
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
293
- x = event.x
294
- c = self.MT.identify_col(x=x)
293
+ c = self.MT.identify_col(x=event.x)
295
294
  if (self.drag_and_drop_enabled or self.col_selection_enabled) and self.rsz_h is None and self.rsz_w is None:
296
295
  if c < len(self.MT.col_positions) - 1:
297
296
  c_selected = self.MT.col_selected(c)
@@ -316,7 +315,7 @@ class ColumnHeaders(tk.Canvas):
316
315
  )
317
316
 
318
317
  def get_shift_select_box(self, c: int, min_c: int) -> tuple[int, int, int, int, str]:
319
- if c > min_c:
318
+ if c >= min_c:
320
319
  return 0, min_c, len(self.MT.row_positions) - 1, c + 1
321
320
  elif c < min_c:
322
321
  return 0, c, len(self.MT.row_positions) - 1, min_c + 1
tksheet/formatters.py CHANGED
@@ -66,7 +66,7 @@ def to_str(o: object, **kwargs: dict) -> str:
66
66
  return f"{o}"
67
67
 
68
68
 
69
- def float_to_str(v: int | float, **kwargs: dict) -> str:
69
+ def float_to_str(v: object, **kwargs: dict) -> str:
70
70
  if isinstance(v, float):
71
71
  if v.is_integer():
72
72
  return f"{int(v)}"
@@ -77,7 +77,7 @@ def float_to_str(v: int | float, **kwargs: dict) -> str:
77
77
  return f"{v}"
78
78
 
79
79
 
80
- def percentage_to_str(v: int | float, **kwargs: dict) -> str:
80
+ def percentage_to_str(v: object, **kwargs: dict) -> str:
81
81
  if isinstance(v, (int, float)):
82
82
  x = v * 100
83
83
  if isinstance(x, float):
@@ -87,7 +87,8 @@ def percentage_to_str(v: int | float, **kwargs: dict) -> str:
87
87
  if kwargs["decimals"]:
88
88
  return f"{round(x, kwargs['decimals'])}%"
89
89
  return f"{int(round(x, kwargs['decimals']))}%"
90
- return f"{x}%"
90
+ return f"{x}%"
91
+ return f"{v}%"
91
92
 
92
93
 
93
94
  def bool_to_str(v: object, **kwargs: dict) -> str:
tksheet/functions.py CHANGED
@@ -18,6 +18,7 @@ from collections.abc import (
18
18
  )
19
19
  from functools import partial
20
20
  from itertools import islice, repeat
21
+ from typing import Literal
21
22
 
22
23
  from .formatters import (
23
24
  to_bool,
@@ -324,16 +325,11 @@ def force_bool(o: object) -> bool:
324
325
  return False
325
326
 
326
327
 
327
- def str_to_coords(s: str) -> None | tuple[int]:
328
- s = s.split(":")
329
-
330
-
331
328
  def alpha2idx(a: str) -> int | None:
332
329
  try:
333
- a = a.upper()
334
330
  n = 0
335
331
  orda = ord("A")
336
- for c in a:
332
+ for c in a.upper():
337
333
  n = n * 26 + ord(c) - orda + 1
338
334
  return n - 1
339
335
  except Exception:
@@ -363,12 +359,15 @@ def idx_param_to_int(idx: str | int | None) -> int | None:
363
359
  return alpha2idx(idx)
364
360
 
365
361
 
366
- def get_n2a(n: int = 0, _type: str = "numbers") -> str:
362
+ def get_n2a(n: int = 0, _type: Literal["letters", "numbers", "both"] | None = "numbers") -> str:
367
363
  if _type == "letters":
368
364
  return num2alpha(n)
369
365
  elif _type == "numbers":
370
366
  return f"{n + 1}"
371
- return f"{num2alpha(n)} {n + 1}"
367
+ elif _type == "both":
368
+ return f"{num2alpha(n)} {n + 1}"
369
+ elif _type is None:
370
+ return ""
372
371
 
373
372
 
374
373
  def get_index_of_gap_in_sorted_integer_seq_forward(
@@ -514,6 +513,14 @@ def index_exists(seq: Sequence[object], index: int) -> bool:
514
513
  return False
515
514
 
516
515
 
516
+ def add_to_displayed(displayed: list[int], to_add: Iterator[int]) -> list[int]:
517
+ # assumes to_add is sorted in reverse
518
+ for i in reversed(to_add):
519
+ ins = bisect_left(displayed, i)
520
+ displayed[ins:] = [i] + [e + 1 for e in islice(displayed, ins, None)]
521
+ return displayed
522
+
523
+
517
524
  def move_elements_by_mapping(
518
525
  seq: list[object],
519
526
  new_idxs: dict[int, int],
@@ -581,7 +588,11 @@ def get_new_indexes(
581
588
  return new_idxs
582
589
 
583
590
 
584
- def insert_items(seq: list | tuple, to_insert: dict, seq_len_func: Callable | None = None) -> list:
591
+ def insert_items(
592
+ seq: list[object] | tuple[object],
593
+ to_insert: dict[int, object],
594
+ seq_len_func: Callable | None = None,
595
+ ) -> list:
585
596
  # inserts many items into a list using a dict of reverse sorted order of
586
597
  # {index: value, index: value, ...}
587
598
  res = []
@@ -1411,7 +1422,7 @@ def mod_event_val(
1411
1422
 
1412
1423
 
1413
1424
  def pop_positions(
1414
- itr: Iterator[int],
1425
+ itr: Callable,
1415
1426
  to_pop: dict[int, int], # displayed index: data index
1416
1427
  save_to: dict[int, int],
1417
1428
  ) -> Iterator[int]:
tksheet/main_table.py CHANGED
@@ -49,7 +49,9 @@ from .formatters import (
49
49
  try_to_bool,
50
50
  )
51
51
  from .functions import (
52
+ add_to_displayed,
52
53
  b_index,
54
+ cell_right_within_box,
53
55
  consecutive_ranges,
54
56
  decompress_load,
55
57
  diff_gen,
@@ -73,7 +75,6 @@ from .functions import (
73
75
  new_tk_event,
74
76
  pickle_obj,
75
77
  pickled_event_dict,
76
- cell_right_within_box,
77
78
  rounded_box_coords,
78
79
  span_idxs_post_move,
79
80
  try_binding,
@@ -125,6 +126,7 @@ class MainTable(tk.Canvas):
125
126
  self.PAR_height = 0
126
127
  self.scrollregion = tuple()
127
128
  self.current_cursor = ""
129
+ self.ctrl_b1_pressed = False
128
130
  self.b1_pressed_loc = None
129
131
  self.closed_dropdown = None
130
132
  self.centre_alignment_text_mod_indexes = (slice(1, None), slice(None, -1))
@@ -715,7 +717,7 @@ class MainTable(tk.Canvas):
715
717
  selected_c, selected_r = len(self.col_positions) - 1, 0
716
718
  elif len(self.row_positions) > 1 and len(self.col_positions) > 1:
717
719
  selected_c, selected_r = 0, len(self.row_positions) - 1
718
- curr_coords = (selected_r, selected_c)
720
+ curr_coords = (selected_r, selected_c)
719
721
  try:
720
722
  data = get_data_from_clipboard(
721
723
  widget=self,
@@ -1514,8 +1516,12 @@ class MainTable(tk.Canvas):
1514
1516
  self.purge_redo_stack()
1515
1517
 
1516
1518
  def edit_cells_using_modification(self, modification: dict, event_data: dict) -> EventDataDict:
1517
- for datarn, v in modification["cells"]["index"].items():
1518
- self._row_index[datarn] = v
1519
+ if self.PAR.ops.treeview:
1520
+ for datarn, v in modification["cells"]["index"].items():
1521
+ self._row_index[datarn].text = v
1522
+ else:
1523
+ for datarn, v in modification["cells"]["index"].items():
1524
+ self._row_index[datarn] = v
1519
1525
  for datacn, v in modification["cells"]["header"].items():
1520
1526
  self._headers[datacn] = v
1521
1527
  for (datarn, datacn), v in modification["cells"]["table"].items():
@@ -2311,6 +2317,102 @@ class MainTable(tk.Canvas):
2311
2317
  check_cell_visibility=False,
2312
2318
  )
2313
2319
 
2320
+ def shift_arrowkey_select_box(
2321
+ self,
2322
+ r1: int,
2323
+ c1: int,
2324
+ r2: int,
2325
+ c2: int,
2326
+ current_r: int,
2327
+ current_c: int,
2328
+ see_r: int,
2329
+ see_c: int,
2330
+ keep_xscroll: bool = False,
2331
+ keep_yscroll: bool = False,
2332
+ ) -> None:
2333
+ box_to_hide = self.selected.fill_iid
2334
+ self.set_currently_selected(
2335
+ current_r,
2336
+ current_c,
2337
+ self.create_selection_box(
2338
+ r1,
2339
+ c1,
2340
+ r2,
2341
+ c2,
2342
+ self.selected.type_,
2343
+ set_current=False,
2344
+ run_binding=True,
2345
+ ),
2346
+ run_binding=False,
2347
+ )
2348
+ self.hide_selection_box(box_to_hide)
2349
+ self.see(see_r, see_c, keep_xscroll=keep_xscroll, keep_yscroll=keep_yscroll, redraw=False)
2350
+ self.refresh()
2351
+
2352
+ def shift_arrowkey_UP(self, event: object = None) -> None:
2353
+ if not self.selected:
2354
+ return
2355
+ r1, c1, r2, c2 = self.selected.box
2356
+ current_r, current_c = self.selected.row, self.selected.column
2357
+ if not r1 and self.selected.row == r2 - 1:
2358
+ return
2359
+ if (r2 - r1 != 1 and self.selected.row != r1 and self.selected.row != r2 - 1) or (
2360
+ r2 - r1 != 1 and self.selected.row == r1
2361
+ ):
2362
+ r2 -= 1
2363
+ see_r = r2 - 1
2364
+ else:
2365
+ r1 -= 1
2366
+ see_r = r1
2367
+ self.shift_arrowkey_select_box(r1, c1, r2, c2, current_r, current_c, see_r, c1, keep_xscroll=True)
2368
+
2369
+ def shift_arrowkey_DOWN(self, event: object = None) -> None:
2370
+ if not self.selected:
2371
+ return
2372
+ r1, c1, r2, c2 = self.selected.box
2373
+ current_r, current_c = self.selected.row, self.selected.column
2374
+ if r2 == len(self.row_positions) - 1 and self.selected.row == r1:
2375
+ return
2376
+ if r2 - r1 == 1 or self.selected.row == r1:
2377
+ r2 += 1
2378
+ see_r = r2 - 1
2379
+ else:
2380
+ r1 += 1
2381
+ see_r = r1
2382
+ self.shift_arrowkey_select_box(r1, c1, r2, c2, current_r, current_c, see_r, c1, keep_xscroll=True)
2383
+
2384
+ def shift_arrowkey_LEFT(self, event: object = None) -> None:
2385
+ if not self.selected:
2386
+ return
2387
+ r1, c1, r2, c2 = self.selected.box
2388
+ current_r, current_c = self.selected.row, self.selected.column
2389
+ if not c1 and self.selected.column == c2 - 1:
2390
+ return
2391
+ if (c2 - c1 != 1 and self.selected.column != c1 and self.selected.column != c2 - 1) or (
2392
+ c2 - c1 != 1 and self.selected.column == c1
2393
+ ):
2394
+ c2 -= 1
2395
+ see_c = c2 - 1
2396
+ else:
2397
+ c1 -= 1
2398
+ see_c = c1
2399
+ self.shift_arrowkey_select_box(r1, c1, r2, c2, current_r, current_c, r1, see_c, keep_yscroll=True)
2400
+
2401
+ def shift_arrowkey_RIGHT(self, event: object = None) -> None:
2402
+ if not self.selected:
2403
+ return
2404
+ r1, c1, r2, c2 = self.selected.box
2405
+ current_r, current_c = self.selected.row, self.selected.column
2406
+ if c2 == len(self.col_positions) - 1 and self.selected.column == c1:
2407
+ return
2408
+ if c2 - c1 == 1 or self.selected.column == c1:
2409
+ c2 += 1
2410
+ see_c = c2 - 1
2411
+ else:
2412
+ c1 += 1
2413
+ see_c = c1
2414
+ self.shift_arrowkey_select_box(r1, c1, r2, c2, current_r, current_c, r1, see_c, keep_yscroll=True)
2415
+
2314
2416
  def menu_add_command(self, menu: tk.Menu, **kwargs) -> None:
2315
2417
  if "label" not in kwargs:
2316
2418
  return
@@ -2613,15 +2715,19 @@ class MainTable(tk.Canvas):
2613
2715
  if binding in ("all", "arrowkeys", "up"):
2614
2716
  self.up_enabled = True
2615
2717
  self._tksheet_bind("up_bindings", self.arrowkey_UP)
2718
+ self._tksheet_bind("shift_up_bindings", self.shift_arrowkey_UP)
2616
2719
  if binding in ("all", "arrowkeys", "right"):
2617
2720
  self.right_enabled = True
2618
2721
  self._tksheet_bind("right_bindings", self.arrowkey_RIGHT)
2722
+ self._tksheet_bind("shift_right_bindings", self.shift_arrowkey_RIGHT)
2619
2723
  if binding in ("all", "arrowkeys", "down"):
2620
2724
  self.down_enabled = True
2621
2725
  self._tksheet_bind("down_bindings", self.arrowkey_DOWN)
2726
+ self._tksheet_bind("shift_down_bindings", self.shift_arrowkey_DOWN)
2622
2727
  if binding in ("all", "arrowkeys", "left"):
2623
2728
  self.left_enabled = True
2624
2729
  self._tksheet_bind("left_bindings", self.arrowkey_LEFT)
2730
+ self._tksheet_bind("shift_left_bindings", self.shift_arrowkey_LEFT)
2625
2731
  if binding in ("all", "arrowkeys", "prior"):
2626
2732
  self.prior_enabled = True
2627
2733
  self._tksheet_bind("prior_bindings", self.page_UP)
@@ -2881,6 +2987,7 @@ class MainTable(tk.Canvas):
2881
2987
  def ctrl_b1_press(self, event=None):
2882
2988
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
2883
2989
  self.focus_set()
2990
+ self.ctrl_b1_pressed = True
2884
2991
  if self.ctrl_select_enabled and self.not_currently_resizing():
2885
2992
  self.b1_pressed_loc = None
2886
2993
  rowsel = int(self.identify_row(y=event.y))
@@ -2899,6 +3006,7 @@ class MainTable(tk.Canvas):
2899
3006
  def ctrl_shift_b1_press(self, event=None):
2900
3007
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
2901
3008
  self.focus_set()
3009
+ self.ctrl_b1_pressed = True
2902
3010
  if self.ctrl_select_enabled and self.drag_selection_enabled and self.not_currently_resizing():
2903
3011
  self.b1_pressed_loc = None
2904
3012
  rowsel = int(self.identify_row(y=event.y))
@@ -3129,6 +3237,7 @@ class MainTable(tk.Canvas):
3129
3237
  self.open_cell(event)
3130
3238
  else:
3131
3239
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
3240
+ self.ctrl_b1_pressed = False
3132
3241
  self.b1_pressed_loc = None
3133
3242
  self.closed_dropdown = None
3134
3243
  try_binding(self.extra_b1_release_func, event)
@@ -4317,16 +4426,7 @@ class MainTable(tk.Canvas):
4317
4426
  if isinstance(displayed_columns, list):
4318
4427
  self.displayed_columns = displayed_columns
4319
4428
  elif not self.all_columns_displayed:
4320
- # push displayed indexes by one for every inserted column
4321
- self.displayed_columns.sort()
4322
- # highest index is first in columns
4323
- up_to = len(self.displayed_columns)
4324
- for cn in columns:
4325
- self.displayed_columns.insert((last_ins := bisect_left(self.displayed_columns, cn)), cn)
4326
- self.displayed_columns[last_ins + 1 : up_to] = [
4327
- i + 1 for i in islice(self.displayed_columns, last_ins + 1, up_to)
4328
- ]
4329
- up_to = last_ins
4429
+ self.displayed_columns = add_to_displayed(self.displayed_columns, columns)
4330
4430
  cws = self.get_column_widths()
4331
4431
  if column_widths and next(reversed(column_widths)) > len(cws):
4332
4432
  for i in reversed(range(len(cws), len(cws) + next(reversed(column_widths)) - len(cws))):
@@ -4417,7 +4517,7 @@ class MainTable(tk.Canvas):
4417
4517
  else:
4418
4518
  numcols = 1
4419
4519
  displayed_ins_col = len(self.col_positions) - 1
4420
- data_ins_col = int(displayed_ins_col)
4520
+ data_ins_col = self.total_data_cols()
4421
4521
  if (
4422
4522
  isinstance(self.PAR.ops.paste_insert_column_limit, int)
4423
4523
  and self.PAR.ops.paste_insert_column_limit < displayed_ins_col + numcols
@@ -4462,16 +4562,7 @@ class MainTable(tk.Canvas):
4462
4562
  if isinstance(displayed_rows, list):
4463
4563
  self.displayed_rows = displayed_rows
4464
4564
  elif not self.all_rows_displayed:
4465
- # push displayed indexes by one for every inserted row
4466
- self.displayed_rows.sort()
4467
- # highest index is first in rows
4468
- up_to = len(self.displayed_rows)
4469
- for rn in rows:
4470
- self.displayed_rows.insert((last_ins := bisect_left(self.displayed_rows, rn)), rn)
4471
- self.displayed_rows[last_ins + 1 : up_to] = [
4472
- i + 1 for i in islice(self.displayed_rows, last_ins + 1, up_to)
4473
- ]
4474
- up_to = last_ins
4565
+ self.displayed_rows = add_to_displayed(self.displayed_rows, rows)
4475
4566
  rhs = self.get_row_heights()
4476
4567
  if row_heights and next(reversed(row_heights)) > len(rhs):
4477
4568
  default_row_height = self.get_default_row_height()
@@ -4561,7 +4652,7 @@ class MainTable(tk.Canvas):
4561
4652
  else:
4562
4653
  numrows = 1
4563
4654
  displayed_ins_row = len(self.row_positions) - 1
4564
- data_ins_row = int(displayed_ins_row)
4655
+ data_ins_row = self.total_data_rows()
4565
4656
  if (
4566
4657
  isinstance(self.PAR.ops.paste_insert_row_limit, int)
4567
4658
  and self.PAR.ops.paste_insert_row_limit < displayed_ins_row + numrows
@@ -5847,6 +5938,7 @@ class MainTable(tk.Canvas):
5847
5938
  c: int | None = None,
5848
5939
  item: int | None = None,
5849
5940
  box: tuple[int, int, int, int] | None = None,
5941
+ run_binding: bool = True,
5850
5942
  ) -> None:
5851
5943
  if isinstance(item, int) and item in self.selection_boxes:
5852
5944
  selection_box = self.selection_boxes[item]
@@ -5862,6 +5954,8 @@ class MainTable(tk.Canvas):
5862
5954
  selection_box.type_,
5863
5955
  selection_box.fill_iid,
5864
5956
  )
5957
+ if run_binding:
5958
+ self.run_selection_binding(selection_box.type_)
5865
5959
  return
5866
5960
  # currently selected is pointed at any selection box with "box" coordinates
5867
5961
  if isinstance(box, tuple):
@@ -5878,6 +5972,8 @@ class MainTable(tk.Canvas):
5878
5972
  selection_box.type_,
5879
5973
  selection_box.fill_iid,
5880
5974
  )
5975
+ if run_binding:
5976
+ self.run_selection_binding(selection_box.type_)
5881
5977
  return
5882
5978
  # currently selected is just pointed at a coordinate
5883
5979
  # find the top most box there, requires r and c
@@ -5891,6 +5987,8 @@ class MainTable(tk.Canvas):
5891
5987
  selection_box.type_,
5892
5988
  selection_box.fill_iid,
5893
5989
  )
5990
+ if run_binding:
5991
+ self.run_selection_binding(selection_box.type_)
5894
5992
  return
5895
5993
  # wasn't provided an item and couldn't find a box at coords so select cell
5896
5994
  if r < len(self.row_positions) - 1 and c < len(self.col_positions) - 1:
@@ -6100,8 +6198,8 @@ class MainTable(tk.Canvas):
6100
6198
  bd_iid = None
6101
6199
  if self.PAR.ops.show_selected_cells_border and (
6102
6200
  ext
6201
+ or self.ctrl_b1_pressed
6103
6202
  or (self.being_drawn_item is None and self.RI.being_drawn_item is None and self.CH.being_drawn_item is None)
6104
- or self.selection_boxes
6105
6203
  ):
6106
6204
  bd_iid = self.display_box(
6107
6205
  x1,
tksheet/other_classes.py CHANGED
@@ -6,7 +6,6 @@ from collections.abc import Callable, Generator, Hashable, Iterator
6
6
  from functools import partial
7
7
  from typing import Literal
8
8
 
9
-
10
9
  pickle_obj = partial(pickle.dumps, protocol=pickle.HIGHEST_PROTOCOL)
11
10
 
12
11
  FontTuple = namedtuple("FontTuple", "family size style")
@@ -39,6 +38,47 @@ TextCfg = namedtuple("TextCfg", "txt tf font align")
39
38
  DraggedRowColumn = namedtuple("DraggedRowColumn", "dragged to_move")
40
39
 
41
40
 
41
+ class SelectionBox:
42
+ __slots__ = ("fill_iid", "bd_iid", "index", "header", "coords", "type_")
43
+
44
+ def __init__(
45
+ self,
46
+ fill_iid: int | None = None,
47
+ bd_iid: int | None = None,
48
+ index: int | None = None,
49
+ header: int | None = None,
50
+ coords: tuple[int, int, int, int] = None,
51
+ type_: Literal["cells", "rows", "columns"] = "cells",
52
+ ) -> None:
53
+ self.fill_iid = fill_iid
54
+ self.bd_iid = bd_iid
55
+ self.index = index
56
+ self.header = header
57
+ self.coords = coords
58
+ self.type_ = type_
59
+
60
+
61
+ Selected = namedtuple(
62
+ "Selected",
63
+ (
64
+ "row",
65
+ "column",
66
+ "type_",
67
+ "box",
68
+ "iid",
69
+ "fill_iid",
70
+ ),
71
+ defaults=(
72
+ None,
73
+ None,
74
+ None,
75
+ None,
76
+ None,
77
+ None,
78
+ ),
79
+ )
80
+
81
+
42
82
  def num2alpha(n: int) -> str | None:
43
83
  try:
44
84
  s = ""
@@ -469,47 +509,6 @@ class TextEditorStorage:
469
509
  return self.window.c
470
510
 
471
511
 
472
- class SelectionBox:
473
- __slots__ = ("fill_iid", "bd_iid", "index", "header", "coords", "type_")
474
-
475
- def __init__(
476
- self,
477
- fill_iid: int | None = None,
478
- bd_iid: int | None = None,
479
- index: int | None = None,
480
- header: int | None = None,
481
- coords: tuple[int, int, int, int] = None,
482
- type_: Literal["cells", "rows", "columns"] = "cells",
483
- ) -> None:
484
- self.fill_iid = fill_iid
485
- self.bd_iid = bd_iid
486
- self.index = index
487
- self.header = header
488
- self.coords = coords
489
- self.type_ = type_
490
-
491
-
492
- Selected = namedtuple(
493
- "Selected",
494
- (
495
- "row",
496
- "column",
497
- "type_",
498
- "box",
499
- "iid",
500
- "fill_iid",
501
- ),
502
- defaults=(
503
- None,
504
- None,
505
- None,
506
- None,
507
- None,
508
- None,
509
- ),
510
- )
511
-
512
-
513
512
  class ProgressBar:
514
513
  __slots__ = ("bg", "fg", "name", "percent", "del_when_done")
515
514
 
tksheet/row_index.py CHANGED
@@ -276,8 +276,7 @@ class RowIndex(tk.Canvas):
276
276
 
277
277
  def shift_b1_press(self, event: object) -> None:
278
278
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
279
- y = event.y
280
- r = self.MT.identify_row(y=y)
279
+ r = self.MT.identify_row(y=event.y)
281
280
  if (self.drag_and_drop_enabled or self.row_selection_enabled) and self.rsz_h is None and self.rsz_w is None:
282
281
  if r < len(self.MT.row_positions) - 1:
283
282
  r_selected = self.MT.row_selected(r)
@@ -302,7 +301,7 @@ class RowIndex(tk.Canvas):
302
301
  )
303
302
 
304
303
  def get_shift_select_box(self, r: int, min_r: int) -> tuple[int, int, int, int, str]:
305
- if r > min_r:
304
+ if r >= min_r:
306
305
  return min_r, 0, r + 1, len(self.MT.col_positions) - 1
307
306
  elif r < min_r:
308
307
  return r, 0, min_r + 1, len(self.MT.col_positions) - 1
@@ -1206,6 +1205,8 @@ class RowIndex(tk.Canvas):
1206
1205
  new_w = self.MT.get_txt_w(f"{end_row}") + 20
1207
1206
  elif self.PAR.ops.default_row_index == "both":
1208
1207
  new_w = self.MT.get_txt_w(f"{end_row + 1} {num2alpha(end_row)}") + 20
1208
+ elif self.PAR.ops.default_row_index is None:
1209
+ new_w = 20
1209
1210
  elif self.PAR.ops.auto_resize_row_index is True:
1210
1211
  new_w = self.get_index_text_width(only_rows=only_rows)
1211
1212
  else:
@@ -1380,7 +1381,7 @@ class RowIndex(tk.Canvas):
1380
1381
  # x1 + 5 + indent + small_mod + small_mod,
1381
1382
  # y1 + mid_y + small_mod + small_mod,
1382
1383
  # )
1383
-
1384
+
1384
1385
  # POINTS FOR A LINE THAT STOPS AT ROW LINE
1385
1386
  # points = (
1386
1387
  # # the upper point
@@ -1390,7 +1391,7 @@ class RowIndex(tk.Canvas):
1390
1391
  # x1 + 5 + indent + small_mod + small_mod,
1391
1392
  # y2 - mid_y + small_mod + small_mod,
1392
1393
  # )
1393
-
1394
+
1394
1395
  # POINTS FOR A HORIZONTAL LINE
1395
1396
  points = (
1396
1397
  # the left point
@@ -1400,7 +1401,7 @@ class RowIndex(tk.Canvas):
1400
1401
  x1 + 5 + indent + small_mod + small_mod + small_mod + small_mod,
1401
1402
  y1 + mid_y,
1402
1403
  )
1403
-
1404
+
1404
1405
  if self.hidd_tree_arrow:
1405
1406
  t, sh = self.hidd_tree_arrow.popitem()
1406
1407
  self.coords(t, points)
@@ -2362,6 +2363,8 @@ class RowIndex(tk.Canvas):
2362
2363
  self.fix_index(datarn)
2363
2364
  if self.get_cell_kwargs(datarn, key="checkbox"):
2364
2365
  self.MT._row_index[datarn] = try_to_bool(value)
2366
+ elif self.PAR.ops.treeview:
2367
+ self.MT._row_index[datarn].text = value
2365
2368
  else:
2366
2369
  self.MT._row_index[datarn] = value
2367
2370
 
@@ -2402,6 +2405,8 @@ class RowIndex(tk.Canvas):
2402
2405
  or (self.MT._row_index[datarn] is None and none_to_empty_str)
2403
2406
  ):
2404
2407
  return ""
2408
+ if self.PAR.ops.treeview:
2409
+ return self.MT._row_index[datarn].text
2405
2410
  return self.MT._row_index[datarn]
2406
2411
 
2407
2412
  def get_valid_cell_data_as_str(self, datarn: int, fix: bool = True) -> str: