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 +1 -1
- tksheet/column_headers.py +2 -3
- tksheet/formatters.py +4 -3
- tksheet/functions.py +21 -10
- tksheet/main_table.py +125 -27
- tksheet/other_classes.py +41 -42
- tksheet/row_index.py +11 -6
- tksheet/sheet.py +293 -107
- tksheet/sheet_options.py +12 -0
- tksheet/themes.py +2 -2
- {tksheet-7.2.17.dist-info → tksheet-7.2.19.dist-info}/METADATA +1 -1
- tksheet-7.2.19.dist-info/RECORD +20 -0
- {tksheet-7.2.17.dist-info → tksheet-7.2.19.dist-info}/WHEEL +1 -1
- tksheet-7.2.17.dist-info/RECORD +0 -20
- {tksheet-7.2.17.dist-info → tksheet-7.2.19.dist-info}/LICENSE.txt +0 -0
- {tksheet-7.2.17.dist-info → tksheet-7.2.19.dist-info}/top_level.txt +0 -0
tksheet/__init__.py
CHANGED
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
|
-
|
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
|
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:
|
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:
|
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
|
-
|
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:
|
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
|
-
|
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(
|
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:
|
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
|
-
|
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
|
-
|
1518
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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 =
|
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
|
-
|
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
|
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:
|