tksheet 7.1.6__py3-none-any.whl → 7.1.8__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 +97 -96
- tksheet/column_headers.py +45 -24
- tksheet/functions.py +12 -9
- tksheet/main_table.py +384 -446
- tksheet/other_classes.py +2 -5
- tksheet/row_index.py +54 -26
- tksheet/sheet.py +139 -132
- tksheet/sheet_options.py +3 -1
- tksheet/vars.py +10 -0
- {tksheet-7.1.6.dist-info → tksheet-7.1.8.dist-info}/METADATA +1 -1
- tksheet-7.1.8.dist-info/RECORD +20 -0
- tksheet-7.1.6.dist-info/RECORD +0 -20
- {tksheet-7.1.6.dist-info → tksheet-7.1.8.dist-info}/LICENSE.txt +0 -0
- {tksheet-7.1.6.dist-info → tksheet-7.1.8.dist-info}/WHEEL +0 -0
- {tksheet-7.1.6.dist-info → tksheet-7.1.8.dist-info}/top_level.txt +0 -0
tksheet/sheet.py
CHANGED
@@ -8,7 +8,6 @@ from itertools import accumulate, chain, islice, product
|
|
8
8
|
from timeit import default_timer
|
9
9
|
from tkinter import ttk
|
10
10
|
from typing import Literal
|
11
|
-
from warnings import warn as WARNING
|
12
11
|
|
13
12
|
from .column_headers import ColumnHeaders
|
14
13
|
from .functions import (
|
@@ -46,8 +45,8 @@ from .other_classes import (
|
|
46
45
|
FontTuple,
|
47
46
|
GeneratedMouseEvent,
|
48
47
|
Node,
|
49
|
-
Span,
|
50
48
|
Selected,
|
49
|
+
Span,
|
51
50
|
)
|
52
51
|
from .row_index import RowIndex
|
53
52
|
from .sheet_options import (
|
@@ -171,6 +170,9 @@ class Sheet(tk.Frame):
|
|
171
170
|
display_selected_fg_over_highlights: bool = False,
|
172
171
|
show_selected_cells_border: bool = True,
|
173
172
|
treeview: bool = False,
|
173
|
+
treeview_indent: str | int = "3",
|
174
|
+
rounded_boxes: bool = True,
|
175
|
+
alternate_color: str = "",
|
174
176
|
# colors
|
175
177
|
outline_thickness: int = 0,
|
176
178
|
outline_color: str = theme_light_blue["outline_color"],
|
@@ -269,9 +271,6 @@ class Sheet(tk.Frame):
|
|
269
271
|
highlightbackground=outline_color,
|
270
272
|
highlightcolor=outline_color,
|
271
273
|
)
|
272
|
-
WARNING(
|
273
|
-
"There have been many changes from tksheet version 6.x.x to version 7.x.x. Please see the changelog for more information."
|
274
|
-
)
|
275
274
|
self.ops = new_sheet_options()
|
276
275
|
if column_width is not None:
|
277
276
|
default_column_width = column_width
|
@@ -611,7 +610,7 @@ class Sheet(tk.Frame):
|
|
611
610
|
for b, f in iterable:
|
612
611
|
b = b.lower()
|
613
612
|
|
614
|
-
if
|
613
|
+
if f is not None and b in emitted_events:
|
615
614
|
self.bind(b, f)
|
616
615
|
|
617
616
|
if b in (
|
@@ -1354,16 +1353,14 @@ class Sheet(tk.Frame):
|
|
1354
1353
|
if header:
|
1355
1354
|
if table:
|
1356
1355
|
res.extend(
|
1357
|
-
[
|
1358
|
-
|
1359
|
-
|
1360
|
-
for c in cols
|
1361
|
-
]
|
1356
|
+
[quick_hdata(c, get_displayed=hdisp)]
|
1357
|
+
+ [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows]
|
1358
|
+
for c in cols
|
1362
1359
|
)
|
1363
1360
|
else:
|
1364
|
-
res.extend([
|
1361
|
+
res.extend([quick_hdata(c, get_displayed=hdisp)] for c in cols)
|
1365
1362
|
elif table:
|
1366
|
-
res.extend([
|
1363
|
+
res.extend([quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows] for c in cols)
|
1367
1364
|
elif not span.transposed:
|
1368
1365
|
if header:
|
1369
1366
|
if header and index:
|
@@ -1376,16 +1373,14 @@ class Sheet(tk.Frame):
|
|
1376
1373
|
if index:
|
1377
1374
|
if table:
|
1378
1375
|
res.extend(
|
1379
|
-
[
|
1380
|
-
|
1381
|
-
|
1382
|
-
for r in rows
|
1383
|
-
]
|
1376
|
+
[quick_idata(r, get_displayed=idisp)]
|
1377
|
+
+ [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols]
|
1378
|
+
for r in rows
|
1384
1379
|
)
|
1385
1380
|
else:
|
1386
|
-
res.extend([
|
1381
|
+
res.extend([quick_idata(r, get_displayed=idisp)] for r in rows)
|
1387
1382
|
elif table:
|
1388
|
-
res.extend([
|
1383
|
+
res.extend([quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols] for r in rows)
|
1389
1384
|
if not span.ndim:
|
1390
1385
|
# it's a cell
|
1391
1386
|
if len(res) == 1 and len(res[0]) == 1:
|
@@ -1518,7 +1513,7 @@ class Sheet(tk.Frame):
|
|
1518
1513
|
)
|
1519
1514
|
|
1520
1515
|
@data.setter
|
1521
|
-
def data(self, value):
|
1516
|
+
def data(self, value: list[list[object]]) -> None:
|
1522
1517
|
self.data_reference(value)
|
1523
1518
|
|
1524
1519
|
def set_data(
|
@@ -2847,12 +2842,7 @@ class Sheet(tk.Frame):
|
|
2847
2842
|
self.set_refresh_timer(redraw)
|
2848
2843
|
return self
|
2849
2844
|
|
2850
|
-
|
2851
|
-
self,
|
2852
|
-
align: str = None,
|
2853
|
-
redraw: bool = True,
|
2854
|
-
) -> str | Sheet:
|
2855
|
-
return self.row_index_align(align, redraw)
|
2845
|
+
index_align = row_index_align
|
2856
2846
|
|
2857
2847
|
def align(
|
2858
2848
|
self,
|
@@ -2910,12 +2900,25 @@ class Sheet(tk.Frame):
|
|
2910
2900
|
def selected(self) -> tuple[()] | Selected:
|
2911
2901
|
return self.MT.selected
|
2912
2902
|
|
2903
|
+
@selected.setter
|
2904
|
+
def selected(self, selected: tuple[()] | Selected) -> Sheet:
|
2905
|
+
if selected:
|
2906
|
+
self.MT.set_currently_selected(
|
2907
|
+
r=selected[0],
|
2908
|
+
c=selected[1],
|
2909
|
+
item=selected[4],
|
2910
|
+
box=selected[3],
|
2911
|
+
)
|
2912
|
+
else:
|
2913
|
+
self.MT.deselect()
|
2914
|
+
return self
|
2915
|
+
|
2913
2916
|
def get_selected_rows(
|
2914
2917
|
self,
|
2915
2918
|
get_cells: bool = False,
|
2916
2919
|
get_cells_as_rows: bool = False,
|
2917
2920
|
return_tuple: bool = False,
|
2918
|
-
) -> tuple | set:
|
2921
|
+
) -> tuple[int] | tuple[tuple[int, int]] | set[int] | set[tuple[int, int]]:
|
2919
2922
|
if return_tuple:
|
2920
2923
|
return tuple(self.MT.get_selected_rows(get_cells=get_cells, get_cells_as_rows=get_cells_as_rows))
|
2921
2924
|
return self.MT.get_selected_rows(get_cells=get_cells, get_cells_as_rows=get_cells_as_rows)
|
@@ -2925,7 +2928,7 @@ class Sheet(tk.Frame):
|
|
2925
2928
|
get_cells: bool = False,
|
2926
2929
|
get_cells_as_columns: bool = False,
|
2927
2930
|
return_tuple: bool = False,
|
2928
|
-
) -> tuple | set:
|
2931
|
+
) -> tuple[int] | tuple[tuple[int, int]] | set[int] | set[tuple[int, int]]:
|
2929
2932
|
if return_tuple:
|
2930
2933
|
return tuple(self.MT.get_selected_cols(get_cells=get_cells, get_cells_as_cols=get_cells_as_columns))
|
2931
2934
|
return self.MT.get_selected_cols(get_cells=get_cells, get_cells_as_cols=get_cells_as_columns)
|
@@ -2936,7 +2939,7 @@ class Sheet(tk.Frame):
|
|
2936
2939
|
get_columns: bool = False,
|
2937
2940
|
sort_by_row: bool = False,
|
2938
2941
|
sort_by_column: bool = False,
|
2939
|
-
) -> list | set:
|
2942
|
+
) -> list[tuple[int, int]] | set[tuple[int, int]]:
|
2940
2943
|
if sort_by_row and sort_by_column:
|
2941
2944
|
sels = sorted(
|
2942
2945
|
self.MT.get_selected_cells(get_rows=get_rows, get_cols=get_columns),
|
@@ -2965,6 +2968,14 @@ class Sheet(tk.Frame):
|
|
2965
2968
|
def boxes(self) -> list[tuple[tuple[int, int, int, int], str]]:
|
2966
2969
|
return self.MT.get_all_selection_boxes_with_types()
|
2967
2970
|
|
2971
|
+
@boxes.setter
|
2972
|
+
def boxes(self, boxes: Sequence[tuple[tuple[int, int, int, int], str]]) -> Sheet:
|
2973
|
+
self.MT.deselect()
|
2974
|
+
self.MT.reselect_from_get_boxes(
|
2975
|
+
boxes={box[0] if isinstance(box[0], tuple) else tuple(box[0]): box[1] for box in boxes}
|
2976
|
+
)
|
2977
|
+
return self
|
2978
|
+
|
2968
2979
|
def cell_selected(
|
2969
2980
|
self,
|
2970
2981
|
r: int,
|
@@ -3020,7 +3031,7 @@ class Sheet(tk.Frame):
|
|
3020
3031
|
|
3021
3032
|
def select_row(self, row: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
|
3022
3033
|
self.RI.select_row(
|
3023
|
-
|
3034
|
+
row if isinstance(row, int) else int(row),
|
3024
3035
|
redraw=False,
|
3025
3036
|
run_binding_func=run_binding_func,
|
3026
3037
|
)
|
@@ -3029,7 +3040,7 @@ class Sheet(tk.Frame):
|
|
3029
3040
|
|
3030
3041
|
def select_column(self, column: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
|
3031
3042
|
self.CH.select_col(
|
3032
|
-
|
3043
|
+
column if isinstance(column, int) else int(column),
|
3033
3044
|
redraw=False,
|
3034
3045
|
run_binding_func=run_binding_func,
|
3035
3046
|
)
|
@@ -3038,8 +3049,8 @@ class Sheet(tk.Frame):
|
|
3038
3049
|
|
3039
3050
|
def select_cell(self, row: int, column: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
|
3040
3051
|
self.MT.select_cell(
|
3041
|
-
|
3042
|
-
|
3052
|
+
row if isinstance(row, int) else int(row),
|
3053
|
+
column if isinstance(column, int) else int(column),
|
3043
3054
|
redraw=False,
|
3044
3055
|
run_binding_func=run_binding_func,
|
3045
3056
|
)
|
@@ -3719,10 +3730,24 @@ class Sheet(tk.Frame):
|
|
3719
3730
|
self.MT.all_columns_displayed = a
|
3720
3731
|
return v
|
3721
3732
|
|
3733
|
+
@property
|
3734
|
+
def all_columns(self) -> bool:
|
3735
|
+
return self.MT.all_columns_displayed
|
3736
|
+
|
3737
|
+
@all_columns.setter
|
3738
|
+
def all_columns(self, a: bool) -> Sheet:
|
3739
|
+
self.MT.all_columns_displayed = a
|
3740
|
+
return self
|
3741
|
+
|
3722
3742
|
@property
|
3723
3743
|
def displayed_columns(self) -> list[int]:
|
3724
3744
|
return self.MT.displayed_columns
|
3725
3745
|
|
3746
|
+
@displayed_columns.setter
|
3747
|
+
def displayed_columns(self, columns: list[int]) -> Sheet:
|
3748
|
+
self.display_columns(columns=columns, reset_col_positions=False, redraw=True)
|
3749
|
+
return self
|
3750
|
+
|
3726
3751
|
# Hiding Rows
|
3727
3752
|
|
3728
3753
|
def displayed_row_to_data(self, r: int) -> int:
|
@@ -3795,8 +3820,6 @@ class Sheet(tk.Frame):
|
|
3795
3820
|
)
|
3796
3821
|
if deselect_all:
|
3797
3822
|
self.MT.deselect(redraw=False)
|
3798
|
-
else:
|
3799
|
-
self.MT.deselect_any(rows=rows, redraw=False)
|
3800
3823
|
self.set_refresh_timer(redraw)
|
3801
3824
|
return self
|
3802
3825
|
|
@@ -3827,10 +3850,24 @@ class Sheet(tk.Frame):
|
|
3827
3850
|
self.MT.all_rows_displayed = a
|
3828
3851
|
return v
|
3829
3852
|
|
3853
|
+
@property
|
3854
|
+
def all_rows(self) -> bool:
|
3855
|
+
return self.MT.all_rows_displayed
|
3856
|
+
|
3857
|
+
@all_rows.setter
|
3858
|
+
def all_rows(self, a: bool) -> Sheet:
|
3859
|
+
self.MT.all_rows_displayed = a
|
3860
|
+
return self
|
3861
|
+
|
3830
3862
|
@property
|
3831
3863
|
def displayed_rows(self) -> list[int]:
|
3832
3864
|
return self.MT.displayed_rows
|
3833
3865
|
|
3866
|
+
@displayed_rows.setter
|
3867
|
+
def displayed_rows(self, rows: list[int]) -> Sheet:
|
3868
|
+
self.display_rows(rows=rows, reset_row_positions=False, redraw=True)
|
3869
|
+
return self
|
3870
|
+
|
3834
3871
|
# Hiding Sheet Elements
|
3835
3872
|
|
3836
3873
|
def hide(
|
@@ -4241,9 +4278,7 @@ class Sheet(tk.Frame):
|
|
4241
4278
|
self.MT.main_table_redraw_grid_and_text(redraw_header=redraw_header, redraw_row_index=redraw_row_index)
|
4242
4279
|
return self
|
4243
4280
|
|
4244
|
-
|
4245
|
-
self.MT.main_table_redraw_grid_and_text(redraw_header=redraw_header, redraw_row_index=redraw_row_index)
|
4246
|
-
return self
|
4281
|
+
refresh = redraw
|
4247
4282
|
|
4248
4283
|
# Tags
|
4249
4284
|
|
@@ -4380,7 +4415,10 @@ class Sheet(tk.Frame):
|
|
4380
4415
|
data: list[list[object]],
|
4381
4416
|
iid_column: int,
|
4382
4417
|
parent_column: int,
|
4418
|
+
text_column: None | int = None,
|
4383
4419
|
) -> Sheet:
|
4420
|
+
if text_column is None:
|
4421
|
+
text_column = iid_column
|
4384
4422
|
tally_of_ids = defaultdict(lambda: -1)
|
4385
4423
|
ncols = max(map(len, data), default=0)
|
4386
4424
|
for rn, row in enumerate(data):
|
@@ -4399,13 +4437,13 @@ class Sheet(tk.Frame):
|
|
4399
4437
|
tally_of_ids[iid] += 1
|
4400
4438
|
row[iid_column] = new
|
4401
4439
|
if iid not in self.RI.tree:
|
4402
|
-
self.RI.tree[iid] = Node(row[
|
4440
|
+
self.RI.tree[iid] = Node(row[text_column], iid, "")
|
4403
4441
|
if iid == pid or self.RI.pid_causes_recursive_loop(iid, pid):
|
4404
4442
|
row[parent_column] = ""
|
4405
4443
|
pid = ""
|
4406
4444
|
if pid:
|
4407
4445
|
if pid not in self.RI.tree:
|
4408
|
-
self.RI.tree[pid] = Node(row[
|
4446
|
+
self.RI.tree[pid] = Node(row[text_column], pid)
|
4409
4447
|
self.RI.tree[iid].parent = self.RI.tree[pid]
|
4410
4448
|
self.RI.tree[pid].children.append(self.RI.tree[iid])
|
4411
4449
|
else:
|
@@ -4415,7 +4453,7 @@ class Sheet(tk.Frame):
|
|
4415
4453
|
if n.parent is None:
|
4416
4454
|
n.parent = ""
|
4417
4455
|
newrow = self.MT.get_empty_row_seq(len(data), ncols)
|
4418
|
-
newrow[iid_column] = n.
|
4456
|
+
newrow[iid_column] = n.iid
|
4419
4457
|
self.RI.tree_rns[n.iid] = len(data)
|
4420
4458
|
data.append(newrow)
|
4421
4459
|
self.insert_rows(
|
@@ -4449,7 +4487,7 @@ class Sheet(tk.Frame):
|
|
4449
4487
|
Accepts set[str] of iids that are open in the treeview
|
4450
4488
|
Closes everything else
|
4451
4489
|
"""
|
4452
|
-
self.RI.tree_open_ids = open_ids
|
4490
|
+
self.RI.tree_open_ids = open_ids if isinstance(open_ids, set) else set(open_ids)
|
4453
4491
|
self.hide_rows(
|
4454
4492
|
set(self.MT.displayed_rows),
|
4455
4493
|
redraw=False,
|
@@ -4558,6 +4596,7 @@ class Sheet(tk.Frame):
|
|
4558
4596
|
text: str | None = None,
|
4559
4597
|
values: list | None = None,
|
4560
4598
|
open_: bool | None = None,
|
4599
|
+
redraw: bool = True,
|
4561
4600
|
) -> DotDict | Sheet:
|
4562
4601
|
"""
|
4563
4602
|
Modify options for item
|
@@ -4600,7 +4639,7 @@ class Sheet(tk.Frame):
|
|
4600
4639
|
else:
|
4601
4640
|
self.RI.tree_open_ids.discard(item)
|
4602
4641
|
get = not (isinstance(iid, str) or isinstance(text, str) or isinstance(values, list) or isinstance(open_, bool))
|
4603
|
-
self.set_refresh_timer(redraw=not get)
|
4642
|
+
self.set_refresh_timer(redraw=not get or redraw)
|
4604
4643
|
if get:
|
4605
4644
|
return DotDict(
|
4606
4645
|
text=self.RI.tree[item].text,
|
@@ -4616,10 +4655,11 @@ class Sheet(tk.Frame):
|
|
4616
4655
|
raise ValueError(f"item '{item.lower()}' does not exist.")
|
4617
4656
|
|
4618
4657
|
def rowitem(self, row: int, data_index: bool = False) -> str | None:
|
4619
|
-
if
|
4620
|
-
|
4621
|
-
|
4622
|
-
|
4658
|
+
if isinstance(row, int):
|
4659
|
+
if not data_index:
|
4660
|
+
row = self.data_r(row)
|
4661
|
+
if len(self.MT._row_index) > row:
|
4662
|
+
return self.MT._row_index[row].iid
|
4623
4663
|
return None
|
4624
4664
|
|
4625
4665
|
def get_children(self, item: None | str = None) -> Generator[str]:
|
@@ -4660,67 +4700,23 @@ class Sheet(tk.Frame):
|
|
4660
4700
|
self.set_refresh_timer(True)
|
4661
4701
|
return self
|
4662
4702
|
|
4663
|
-
def set_children(self,
|
4703
|
+
def set_children(self, parent: str, *newchildren) -> Sheet:
|
4664
4704
|
"""
|
4665
|
-
Moves everything in '*newchildren' under '
|
4705
|
+
Moves everything in '*newchildren' under 'parent'
|
4666
4706
|
"""
|
4667
|
-
|
4668
|
-
|
4669
|
-
mapping = {}
|
4670
|
-
to_show = []
|
4671
|
-
if item:
|
4672
|
-
new_parent = self.RI.tree[item]
|
4673
|
-
if new_parent.children:
|
4674
|
-
ctr = self.RI.tree_rns[new_parent.children[-1].iid] + 1
|
4675
|
-
else:
|
4676
|
-
ctr = self.RI.tree_rns[new_parent.iid] + 1
|
4677
|
-
for cid in unpack(newchildren):
|
4678
|
-
if self.RI.pid_causes_recursive_loop(cid, item):
|
4679
|
-
raise ValueError(f"iid '{cid}' causes a recursive loop with parent '{item}'.")
|
4680
|
-
cid_node = self.RI.tree[cid]
|
4681
|
-
mapping[self.RI.tree_rns[cid]] = ctr
|
4682
|
-
if item in self.RI.tree_open_ids and self.item_displayed(item):
|
4683
|
-
to_show.append(ctr)
|
4684
|
-
ctr += 1
|
4685
|
-
for did in self.RI.get_iid_descendants(cid):
|
4686
|
-
mapping[self.RI.tree_rns[did]] = ctr
|
4687
|
-
if to_show and self.RI.ancestors_all_open(did, self.RI.tree[cid].parent):
|
4688
|
-
to_show.append(ctr)
|
4689
|
-
ctr += 1
|
4690
|
-
self.RI.remove_node_from_parents_children(cid_node)
|
4691
|
-
cid_node.parent = new_parent
|
4692
|
-
new_parent.children.append(cid_node)
|
4693
|
-
else:
|
4694
|
-
ctr = (
|
4695
|
-
len(self.MT._row_index)
|
4696
|
-
- len(newchildren)
|
4697
|
-
- sum(1 for cid in unpack(newchildren) for _ in self.RI.get_iid_descendants(cid))
|
4698
|
-
)
|
4699
|
-
for cid in unpack(newchildren):
|
4700
|
-
cid_node = self.RI.tree[cid]
|
4701
|
-
mapping[self.RI.tree_rns[cid]] = ctr
|
4702
|
-
to_show.append(ctr)
|
4703
|
-
ctr += 1
|
4704
|
-
for did in self.RI.get_iid_descendants(cid):
|
4705
|
-
mapping[self.RI.tree_rns[did]] = ctr
|
4706
|
-
if self.RI.ancestors_all_open(did, cid_node.parent):
|
4707
|
-
to_show.append(ctr)
|
4708
|
-
ctr += 1
|
4709
|
-
self.RI.remove_node_from_parents_children(cid_node)
|
4710
|
-
self.RI.tree[cid].parent = ""
|
4711
|
-
self.mapping_move_rows(
|
4712
|
-
data_new_idxs=mapping,
|
4713
|
-
data_indexes=True,
|
4714
|
-
create_selections=False,
|
4715
|
-
redraw=False,
|
4716
|
-
)
|
4717
|
-
if item and (item not in self.RI.tree_open_ids or not self.item_displayed(item)):
|
4718
|
-
self.hide_rows(set(mapping.values()), data_indexes=True)
|
4719
|
-
self.show_rows(to_show)
|
4720
|
-
self.set_refresh_timer(True)
|
4707
|
+
for iid in unpack(newchildren):
|
4708
|
+
self.move(iid, parent)
|
4721
4709
|
return self
|
4722
4710
|
|
4723
|
-
def
|
4711
|
+
def find_rn_at_top_index(self, index: int) -> int:
|
4712
|
+
wo_par = 0
|
4713
|
+
for rn, n in enumerate(self.MT._row_index):
|
4714
|
+
if not n.parent:
|
4715
|
+
if wo_par == index:
|
4716
|
+
return rn
|
4717
|
+
wo_par += 1
|
4718
|
+
|
4719
|
+
def move(self, item: str, parent: str, index: int | None = None) -> Sheet:
|
4724
4720
|
"""
|
4725
4721
|
Moves item to be under parent as child at index
|
4726
4722
|
'parent' can be empty string which will make item a top node
|
@@ -4737,35 +4733,49 @@ class Sheet(tk.Frame):
|
|
4737
4733
|
raise ValueError(f"iid '{item}' causes a recursive loop with parent '{parent}'.")
|
4738
4734
|
parent_node = self.RI.tree[parent]
|
4739
4735
|
if parent_node.children:
|
4740
|
-
if len(parent_node.children)
|
4741
|
-
index = len(parent_node.children)
|
4742
|
-
|
4736
|
+
if index is None or index >= len(parent_node.children):
|
4737
|
+
index = len(parent_node.children) - 1
|
4738
|
+
item_r = self.RI.tree_rns[item]
|
4739
|
+
new_r = self.RI.tree_rns[parent_node.children[index].iid]
|
4740
|
+
if item_node not in parent_node.children:
|
4741
|
+
new_r += 1
|
4742
|
+
new_r_desc = sum(1 for _ in self.RI.get_iid_descendants(parent_node.children[index].iid))
|
4743
|
+
item_desc = sum(1 for _ in self.RI.get_iid_descendants(item))
|
4744
|
+
if item_r < new_r:
|
4745
|
+
r_ctr = new_r + new_r_desc - item_desc
|
4746
|
+
else:
|
4747
|
+
r_ctr = new_r
|
4743
4748
|
else:
|
4744
|
-
|
4745
|
-
mapping[
|
4749
|
+
r_ctr = self.RI.tree_rns[parent_node.iid] + 1
|
4750
|
+
mapping[item_r] = r_ctr
|
4746
4751
|
if parent in self.RI.tree_open_ids and self.item_displayed(parent):
|
4747
|
-
to_show.append(
|
4748
|
-
|
4752
|
+
to_show.append(r_ctr)
|
4753
|
+
r_ctr += 1
|
4749
4754
|
for did in self.RI.get_iid_descendants(item):
|
4750
|
-
mapping[self.RI.tree_rns[did]] =
|
4755
|
+
mapping[self.RI.tree_rns[did]] = r_ctr
|
4751
4756
|
if to_show and self.RI.ancestors_all_open(did, item_node.parent):
|
4752
|
-
to_show.append(
|
4753
|
-
|
4757
|
+
to_show.append(r_ctr)
|
4758
|
+
r_ctr += 1
|
4754
4759
|
self.RI.remove_node_from_parents_children(item_node)
|
4755
4760
|
item_node.parent = parent_node
|
4756
4761
|
parent_node.children.append(item_node)
|
4757
4762
|
else:
|
4758
|
-
|
4759
|
-
|
4760
|
-
|
4761
|
-
|
4762
|
-
|
4763
|
-
|
4763
|
+
new_r = self.find_rn_at_top_index((sum(1 for _ in self.get_children("")) - 1) if index is None else index)
|
4764
|
+
item_r = self.RI.tree_rns[item]
|
4765
|
+
if item_r < new_r:
|
4766
|
+
par_desc = sum(1 for _ in self.RI.get_iid_descendants(self.rowitem(new_r, data_index=True)))
|
4767
|
+
item_desc = sum(1 for _ in self.RI.get_iid_descendants(item))
|
4768
|
+
r_ctr = new_r + par_desc - item_desc
|
4769
|
+
else:
|
4770
|
+
r_ctr = new_r
|
4771
|
+
mapping[item_r] = r_ctr
|
4772
|
+
to_show.append(r_ctr)
|
4773
|
+
r_ctr += 1
|
4764
4774
|
for did in self.RI.get_iid_descendants(item):
|
4765
|
-
mapping[self.RI.tree_rns[did]] =
|
4775
|
+
mapping[self.RI.tree_rns[did]] = r_ctr
|
4766
4776
|
if to_show and self.RI.ancestors_all_open(did, item_node.parent):
|
4767
|
-
to_show.append(
|
4768
|
-
|
4777
|
+
to_show.append(r_ctr)
|
4778
|
+
r_ctr += 1
|
4769
4779
|
self.RI.remove_node_from_parents_children(item_node)
|
4770
4780
|
self.RI.tree[item].parent = ""
|
4771
4781
|
self.mapping_move_rows(
|
@@ -4838,8 +4848,9 @@ class Sheet(tk.Frame):
|
|
4838
4848
|
]
|
4839
4849
|
|
4840
4850
|
def selection_set(self, *items) -> Sheet:
|
4841
|
-
self.
|
4842
|
-
|
4851
|
+
if any(item.lower() in self.RI.tree for item in unpack(items)):
|
4852
|
+
self.deselect()
|
4853
|
+
self.selection_add(*items)
|
4843
4854
|
return self
|
4844
4855
|
|
4845
4856
|
def selection_add(self, *items) -> Sheet:
|
@@ -4895,12 +4906,8 @@ class Sheet(tk.Frame):
|
|
4895
4906
|
if redraw and self.after_redraw_id is None:
|
4896
4907
|
self.after_redraw_id = self.after(self.after_redraw_time_ms, self.after_redraw)
|
4897
4908
|
|
4898
|
-
def after_redraw(
|
4899
|
-
self,
|
4900
|
-
redraw_header: bool = True,
|
4901
|
-
redraw_row_index: bool = True,
|
4902
|
-
) -> None:
|
4903
|
-
self.MT.main_table_redraw_grid_and_text(redraw_header=redraw_header, redraw_row_index=redraw_row_index)
|
4909
|
+
def after_redraw(self) -> None:
|
4910
|
+
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
4904
4911
|
self.after_redraw_id = None
|
4905
4912
|
|
4906
4913
|
def del_options_using_span(
|
tksheet/sheet_options.py
CHANGED
@@ -234,6 +234,8 @@ def new_sheet_options() -> DotDict:
|
|
234
234
|
"display_selected_fg_over_highlights": False,
|
235
235
|
"show_selected_cells_border": True,
|
236
236
|
"treeview": False,
|
237
|
-
"treeview_indent": "
|
237
|
+
"treeview_indent": "3",
|
238
|
+
"rounded_boxes": True,
|
239
|
+
"alternate_color": "",
|
238
240
|
}
|
239
241
|
)
|
tksheet/vars.py
CHANGED
@@ -26,6 +26,16 @@ emitted_events: set[str] = {
|
|
26
26
|
backwards_compatibility_keys: dict[str, str] = {
|
27
27
|
"font": "table_font",
|
28
28
|
}
|
29
|
+
text_editor_to_unbind: tuple[str] = (
|
30
|
+
"<Alt-Return>",
|
31
|
+
"<Alt-KP_Enter>",
|
32
|
+
"<Option-Return>",
|
33
|
+
"<Tab>",
|
34
|
+
"<Return>",
|
35
|
+
"<KP_Enter>",
|
36
|
+
"<FocusOut>",
|
37
|
+
"<Escape>",
|
38
|
+
)
|
29
39
|
scrollbar_options_keys: set[str] = {
|
30
40
|
"vertical_scroll_background",
|
31
41
|
"horizontal_scroll_background",
|
@@ -0,0 +1,20 @@
|
|
1
|
+
tksheet/__init__.py,sha256=QkLl7gG86v_1GMYTSGmOr137dpoTBZE2IpCEgCB40d8,1994
|
2
|
+
tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
|
3
|
+
tksheet/column_headers.py,sha256=u5SRsI3VAoqxpUpPQZfu2Zimmf2OmZUBD_hMJKso-pw,100204
|
4
|
+
tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
|
5
|
+
tksheet/functions.py,sha256=__21LS0cft9quuzFXcJ0BMbB0DEntvS4NQvreGk2U8Y,39709
|
6
|
+
tksheet/main_table.py,sha256=zY5RNV2AyJ3jM8JPMmYrwCXGsnefnVVlXcjaqYxdxvg,318290
|
7
|
+
tksheet/other_classes.py,sha256=P3FYUYreLhstATvHCNow8sDQoCsD_02KB6oXcca3ahE,13628
|
8
|
+
tksheet/row_index.py,sha256=wfOPHitGfipTysCMfQA-Nl4mJawmkv9gm5CAtIlKgxo,105673
|
9
|
+
tksheet/sheet.py,sha256=WvCuIszL31oJLhf0XJpvc0kHxa1yMAwEjiPrjeLkAQ8,257298
|
10
|
+
tksheet/sheet_options.py,sha256=mh0rTvWrFvIKaiv88jtMZy0TSA8zTS1GXSe88u8_rzk,11978
|
11
|
+
tksheet/text_editor.py,sha256=81_IZKrTVa2KIx2cJ4n3cFvFMAwvbHIQYgqtyat-97I,6681
|
12
|
+
tksheet/themes.py,sha256=OwUe31NRbosjw3ZoZsMyB8lNVyYin9YcKLhCturi5q8,13398
|
13
|
+
tksheet/top_left_rectangle.py,sha256=-2u9GfOvcqhkKwHEtbqdFvXCY3RbvL5k2Sh9l3r_k04,8275
|
14
|
+
tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
|
15
|
+
tksheet/vars.py,sha256=8Qxas-m5nU-yMaeAweO4Z30FM9cOQoRTiOsH4kgZp5s,2288
|
16
|
+
tksheet-7.1.8.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
|
17
|
+
tksheet-7.1.8.dist-info/METADATA,sha256=eyi1aRtOSI35o-qYZpAJSZMyYjisRqRyZk_qg1JWx74,6013
|
18
|
+
tksheet-7.1.8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
19
|
+
tksheet-7.1.8.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
|
20
|
+
tksheet-7.1.8.dist-info/RECORD,,
|
tksheet-7.1.6.dist-info/RECORD
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
tksheet/__init__.py,sha256=95JUoulFU3M59S4BSLtmbHtdYN9bUTph238FEb2u0S8,1874
|
2
|
-
tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
|
3
|
-
tksheet/column_headers.py,sha256=2Y5QcT5WmxjXudPszKHcd7hHuTNRfxoRVyKx2bsBGZI,99449
|
4
|
-
tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
|
5
|
-
tksheet/functions.py,sha256=OZdcbYcKpiU_2YhwPWASZ8QfyF3tRhGiwY80sh5Rbx4,39610
|
6
|
-
tksheet/main_table.py,sha256=ThNsmwC_e2o5nEjB53RvIMLaj3rcWEfASeMtt2TTNl4,321201
|
7
|
-
tksheet/other_classes.py,sha256=Hjr7c0kD2_880xjtGuFn9gQ-7ED5kSiNahniBeXcf84,13604
|
8
|
-
tksheet/row_index.py,sha256=TsAYN0cBchH-diKzU3fuZXlgTOmrODq8EIeT2RcTblk,104750
|
9
|
-
tksheet/sheet.py,sha256=_VotKhIMM1aAUmDNPZC4h0_q6NP-sB4nGRRIZ-iggSc,257417
|
10
|
-
tksheet/sheet_options.py,sha256=Vcy4RxTKvf2HM-Yc53ex0lpBe6ATXc_pdx4oLhfjDgU,11906
|
11
|
-
tksheet/text_editor.py,sha256=81_IZKrTVa2KIx2cJ4n3cFvFMAwvbHIQYgqtyat-97I,6681
|
12
|
-
tksheet/themes.py,sha256=OwUe31NRbosjw3ZoZsMyB8lNVyYin9YcKLhCturi5q8,13398
|
13
|
-
tksheet/top_left_rectangle.py,sha256=-2u9GfOvcqhkKwHEtbqdFvXCY3RbvL5k2Sh9l3r_k04,8275
|
14
|
-
tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
|
15
|
-
tksheet/vars.py,sha256=Iukk7-MMT9X7vv0m3nQPKzbp2Iw2Pg1wJEW7js919Mo,2092
|
16
|
-
tksheet-7.1.6.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
|
17
|
-
tksheet-7.1.6.dist-info/METADATA,sha256=2ZtrwFvnlwzpFt9hY_C_Mpf5ghtHjmRPz65pfc5N1xI,6013
|
18
|
-
tksheet-7.1.6.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
19
|
-
tksheet-7.1.6.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
|
20
|
-
tksheet-7.1.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|