tksheet 7.1.24__tar.gz → 7.2.1__tar.gz
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-7.1.24/tksheet.egg-info → tksheet-7.2.1}/PKG-INFO +1 -1
- {tksheet-7.1.24 → tksheet-7.2.1}/pyproject.toml +1 -1
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/__init__.py +1 -1
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/column_headers.py +31 -16
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/main_table.py +40 -16
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/row_index.py +29 -16
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/sheet.py +70 -21
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/text_editor.py +1 -1
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/themes.py +5 -5
- {tksheet-7.1.24 → tksheet-7.2.1/tksheet.egg-info}/PKG-INFO +1 -1
- {tksheet-7.1.24 → tksheet-7.2.1}/LICENSE.txt +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/README.md +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/setup.cfg +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/colors.py +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/formatters.py +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/functions.py +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/other_classes.py +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/sheet_options.py +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/top_left_rectangle.py +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/types.py +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/vars.py +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet.egg-info/SOURCES.txt +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet.egg-info/dependency_links.txt +0 -0
- {tksheet-7.1.24 → tksheet-7.2.1}/tksheet.egg-info/top_level.txt +0 -0
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|
6
6
|
name = "tksheet"
|
7
7
|
description = "Tkinter table / sheet widget"
|
8
8
|
readme = "README.md"
|
9
|
-
version = "7.1
|
9
|
+
version = "7.2.1"
|
10
10
|
authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
|
11
11
|
requires-python = ">=3.8"
|
12
12
|
license = {file = "LICENSE.txt"}
|
@@ -771,11 +771,9 @@ class ColumnHeaders(tk.Canvas):
|
|
771
771
|
return False
|
772
772
|
|
773
773
|
def b1_release(self, event: object) -> None:
|
774
|
-
if self.being_drawn_item is not None:
|
775
|
-
to_sel = self.MT.coords_and_type(self.being_drawn_item)
|
774
|
+
if self.being_drawn_item is not None and (to_sel := self.MT.coords_and_type(self.being_drawn_item)):
|
776
775
|
r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
|
777
776
|
self.MT.hide_selection_box(self.being_drawn_item)
|
778
|
-
self.being_drawn_item = None
|
779
777
|
self.MT.set_currently_selected(
|
780
778
|
r_to_sel,
|
781
779
|
c_to_sel,
|
@@ -784,6 +782,8 @@ class ColumnHeaders(tk.Canvas):
|
|
784
782
|
sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
|
785
783
|
try_binding(self.drag_selection_binding_func, sel_event)
|
786
784
|
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
785
|
+
else:
|
786
|
+
self.being_drawn_item = None
|
787
787
|
self.MT.bind("<MouseWheel>", self.MT.mousewheel)
|
788
788
|
if self.width_resizing_enabled and self.rsz_w is not None and self.currently_resizing_width:
|
789
789
|
self.currently_resizing_width = False
|
@@ -903,12 +903,13 @@ class ColumnHeaders(tk.Canvas):
|
|
903
903
|
|
904
904
|
def toggle_select_col(
|
905
905
|
self,
|
906
|
-
column,
|
907
|
-
add_selection=True,
|
908
|
-
redraw=True,
|
909
|
-
run_binding_func=True,
|
910
|
-
set_as_current=True,
|
911
|
-
|
906
|
+
column: int,
|
907
|
+
add_selection: bool = True,
|
908
|
+
redraw: bool = True,
|
909
|
+
run_binding_func: bool = True,
|
910
|
+
set_as_current: bool = True,
|
911
|
+
ext: bool = False,
|
912
|
+
) -> int:
|
912
913
|
if add_selection:
|
913
914
|
if self.MT.col_selected(column):
|
914
915
|
fill_iid = self.MT.deselect(c=column, redraw=redraw)
|
@@ -918,26 +919,40 @@ class ColumnHeaders(tk.Canvas):
|
|
918
919
|
redraw=redraw,
|
919
920
|
run_binding_func=run_binding_func,
|
920
921
|
set_as_current=set_as_current,
|
922
|
+
ext=ext,
|
921
923
|
)
|
922
924
|
else:
|
923
925
|
if self.MT.col_selected(column):
|
924
926
|
fill_iid = self.MT.deselect(c=column, redraw=redraw)
|
925
927
|
else:
|
926
|
-
fill_iid = self.select_col(column, redraw=redraw)
|
928
|
+
fill_iid = self.select_col(column, redraw=redraw, ext=ext)
|
927
929
|
return fill_iid
|
928
930
|
|
929
|
-
def select_col(
|
931
|
+
def select_col(
|
932
|
+
self,
|
933
|
+
c: int,
|
934
|
+
redraw: bool = False,
|
935
|
+
run_binding_func: bool = True,
|
936
|
+
ext: bool = False,
|
937
|
+
) -> int:
|
930
938
|
self.MT.deselect("all", redraw=False)
|
931
|
-
fill_iid = self.MT.create_selection_box(0, c, len(self.MT.row_positions) - 1, c + 1, "columns")
|
939
|
+
fill_iid = self.MT.create_selection_box(0, c, len(self.MT.row_positions) - 1, c + 1, "columns", ext=ext)
|
932
940
|
if redraw:
|
933
941
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
934
942
|
if run_binding_func:
|
935
943
|
self.MT.run_selection_binding("columns")
|
936
944
|
return fill_iid
|
937
945
|
|
938
|
-
def add_selection(
|
946
|
+
def add_selection(
|
947
|
+
self,
|
948
|
+
c: int,
|
949
|
+
redraw: bool = False,
|
950
|
+
run_binding_func: bool = True,
|
951
|
+
set_as_current: bool = True,
|
952
|
+
ext: bool = False,
|
953
|
+
) -> int:
|
939
954
|
box = (0, c, len(self.MT.row_positions) - 1, c + 1, "columns")
|
940
|
-
fill_iid = self.MT.create_selection_box(*box, set_current=set_as_current)
|
955
|
+
fill_iid = self.MT.create_selection_box(*box, set_current=set_as_current, ext=ext)
|
941
956
|
if redraw:
|
942
957
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
943
958
|
if run_binding_func:
|
@@ -1607,11 +1622,11 @@ class ColumnHeaders(tk.Canvas):
|
|
1607
1622
|
|
1608
1623
|
def get_redraw_selections(self, startc: int, endc: int) -> dict[str, set[int]]:
|
1609
1624
|
d = defaultdict(set)
|
1610
|
-
for item, box in self.MT.get_selection_items(
|
1625
|
+
for item, box in self.MT.get_selection_items():
|
1611
1626
|
r1, c1, r2, c2 = box.coords
|
1612
1627
|
for c in range(startc, endc):
|
1613
1628
|
if c1 <= c and c2 > c:
|
1614
|
-
d[box.type_].add(c)
|
1629
|
+
d[box.type_ if box.type_ != "rows" else "cells"].add(c)
|
1615
1630
|
return d
|
1616
1631
|
|
1617
1632
|
def open_cell(self, event: object = None, ignore_existing_editor=False):
|
@@ -1851,9 +1851,10 @@ class MainTable(tk.Canvas):
|
|
1851
1851
|
c: int,
|
1852
1852
|
redraw: bool = False,
|
1853
1853
|
run_binding_func: bool = True,
|
1854
|
+
ext: bool = False,
|
1854
1855
|
) -> int:
|
1855
1856
|
self.deselect("all", redraw=False)
|
1856
|
-
fill_iid = self.create_selection_box(r, c, r + 1, c + 1, state="hidden")
|
1857
|
+
fill_iid = self.create_selection_box(r, c, r + 1, c + 1, state="hidden", ext=ext)
|
1857
1858
|
if redraw:
|
1858
1859
|
self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
1859
1860
|
if run_binding_func:
|
@@ -1867,8 +1868,9 @@ class MainTable(tk.Canvas):
|
|
1867
1868
|
redraw: bool = False,
|
1868
1869
|
run_binding_func: bool = True,
|
1869
1870
|
set_as_current: bool = False,
|
1871
|
+
ext: bool = False,
|
1870
1872
|
) -> int:
|
1871
|
-
fill_iid = self.create_selection_box(r, c, r + 1, c + 1, state="hidden", set_current=set_as_current)
|
1873
|
+
fill_iid = self.create_selection_box(r, c, r + 1, c + 1, state="hidden", set_current=set_as_current, ext=ext)
|
1872
1874
|
if redraw:
|
1873
1875
|
self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
1874
1876
|
if run_binding_func:
|
@@ -1883,6 +1885,7 @@ class MainTable(tk.Canvas):
|
|
1883
1885
|
redraw: bool = True,
|
1884
1886
|
run_binding_func: bool = True,
|
1885
1887
|
set_as_current: bool = True,
|
1888
|
+
ext: bool = False,
|
1886
1889
|
) -> int | None:
|
1887
1890
|
if add_selection:
|
1888
1891
|
if self.cell_selected(row, column, inc_rows=True, inc_cols=True):
|
@@ -1894,12 +1897,13 @@ class MainTable(tk.Canvas):
|
|
1894
1897
|
redraw=redraw,
|
1895
1898
|
run_binding_func=run_binding_func,
|
1896
1899
|
set_as_current=set_as_current,
|
1900
|
+
ext=ext,
|
1897
1901
|
)
|
1898
1902
|
else:
|
1899
1903
|
if self.cell_selected(row, column, inc_rows=True, inc_cols=True):
|
1900
1904
|
fill_iid = self.deselect(r=row, c=column, redraw=redraw)
|
1901
1905
|
else:
|
1902
|
-
fill_iid = self.select_cell(row, column, redraw=redraw)
|
1906
|
+
fill_iid = self.select_cell(row, column, redraw=redraw, ext=ext)
|
1903
1907
|
return fill_iid
|
1904
1908
|
|
1905
1909
|
def get_select_event(self, being_drawn_item: None | int = None) -> EventDataDict:
|
@@ -3079,11 +3083,9 @@ class MainTable(tk.Canvas):
|
|
3079
3083
|
self.b1_motion(event)
|
3080
3084
|
|
3081
3085
|
def b1_release(self, event=None):
|
3082
|
-
if self.being_drawn_item is not None:
|
3083
|
-
to_sel = self.coords_and_type(self.being_drawn_item)
|
3086
|
+
if self.being_drawn_item is not None and (to_sel := self.coords_and_type(self.being_drawn_item)):
|
3084
3087
|
r_to_sel, c_to_sel = self.selected.row, self.selected.column
|
3085
3088
|
self.hide_selection_box(self.being_drawn_item)
|
3086
|
-
self.being_drawn_item = None
|
3087
3089
|
self.set_currently_selected(
|
3088
3090
|
r_to_sel,
|
3089
3091
|
c_to_sel,
|
@@ -3101,6 +3103,8 @@ class MainTable(tk.Canvas):
|
|
3101
3103
|
if self.drag_selection_binding_func:
|
3102
3104
|
self.drag_selection_binding_func(sel_event)
|
3103
3105
|
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
3106
|
+
else:
|
3107
|
+
self.being_drawn_item = None
|
3104
3108
|
if self.RI.width_resizing_enabled and self.RI.rsz_w is not None and self.RI.currently_resizing_width:
|
3105
3109
|
self.delete_resize_lines()
|
3106
3110
|
self.RI.delete_resize_lines()
|
@@ -3466,7 +3470,7 @@ class MainTable(tk.Canvas):
|
|
3466
3470
|
def get_lines_cell_height(self, n, font=None):
|
3467
3471
|
return (
|
3468
3472
|
self.get_txt_h(
|
3469
|
-
txt="\n".join("|" for
|
3473
|
+
txt="\n".join("|" for _ in range(n)) if n > 1 else "|",
|
3470
3474
|
font=self.PAR.ops.table_font if font is None else font,
|
3471
3475
|
)
|
3472
3476
|
+ 5
|
@@ -3484,12 +3488,20 @@ class MainTable(tk.Canvas):
|
|
3484
3488
|
|
3485
3489
|
def get_default_row_height(self) -> int:
|
3486
3490
|
if isinstance(self.PAR.ops.default_row_height, str):
|
3487
|
-
|
3491
|
+
if int(self.PAR.ops.default_row_height) == 1:
|
3492
|
+
return self.min_row_height
|
3493
|
+
else:
|
3494
|
+
return self.min_row_height + self.get_lines_cell_height(int(self.PAR.ops.default_row_height) - 1)
|
3488
3495
|
return self.PAR.ops.default_row_height
|
3489
3496
|
|
3490
3497
|
def get_default_header_height(self) -> int:
|
3491
3498
|
if isinstance(self.PAR.ops.default_header_height, str):
|
3492
|
-
|
3499
|
+
if int(self.PAR.ops.default_header_height) == 1:
|
3500
|
+
return self.min_header_height
|
3501
|
+
else:
|
3502
|
+
return self.min_header_height + self.get_lines_cell_height(
|
3503
|
+
int(self.PAR.ops.default_header_height) - 1, font=self.PAR.ops.header_font
|
3504
|
+
)
|
3493
3505
|
return self.PAR.ops.default_header_height
|
3494
3506
|
|
3495
3507
|
def set_table_font(self, newfont: tuple | None = None, reset_row_positions: bool = False) -> tuple[str, int, str]:
|
@@ -3519,8 +3531,8 @@ class MainTable(tk.Canvas):
|
|
3519
3531
|
self.table_first_ln_ins = self.table_half_txt_height + 2
|
3520
3532
|
else:
|
3521
3533
|
self.table_first_ln_ins = self.table_half_txt_height + 3
|
3534
|
+
self.min_row_height = int(self.table_first_ln_ins * 2.22)
|
3522
3535
|
self.table_xtra_lines_increment = int(self.table_txt_height)
|
3523
|
-
self.min_row_height = self.table_txt_height + 5
|
3524
3536
|
if self.min_row_height < 12:
|
3525
3537
|
self.min_row_height = 12
|
3526
3538
|
self.set_min_column_width()
|
@@ -3548,7 +3560,7 @@ class MainTable(tk.Canvas):
|
|
3548
3560
|
else:
|
3549
3561
|
self.header_first_ln_ins = self.header_half_txt_height + 3
|
3550
3562
|
self.header_xtra_lines_increment = self.header_txt_height
|
3551
|
-
self.min_header_height = self.
|
3563
|
+
self.min_header_height = int(self.header_first_ln_ins * 2.22)
|
3552
3564
|
if (
|
3553
3565
|
isinstance(self.PAR.ops.default_header_height, int)
|
3554
3566
|
and self.PAR.ops.default_header_height < self.min_header_height
|
@@ -5381,6 +5393,10 @@ class MainTable(tk.Canvas):
|
|
5381
5393
|
if resized_cols or resized_rows or changed_w:
|
5382
5394
|
self.recreate_all_selection_boxes()
|
5383
5395
|
if changed_w:
|
5396
|
+
self.update_idletasks()
|
5397
|
+
self.RI.update_idletasks()
|
5398
|
+
self.CH.update_idletasks()
|
5399
|
+
self.TL.update_idletasks()
|
5384
5400
|
return False
|
5385
5401
|
self.hidd_text.update(self.disp_text)
|
5386
5402
|
self.disp_text = {}
|
@@ -5923,7 +5939,7 @@ class MainTable(tk.Canvas):
|
|
5923
5939
|
self.hidd_boxes.add(item)
|
5924
5940
|
self.itemconfig(item, state="hidden")
|
5925
5941
|
|
5926
|
-
def hide_selection_box(self, item: int | None
|
5942
|
+
def hide_selection_box(self, item: int | None) -> bool:
|
5927
5943
|
if item is None or item is True:
|
5928
5944
|
return
|
5929
5945
|
box = self.selection_boxes.pop(item)
|
@@ -5934,6 +5950,12 @@ class MainTable(tk.Canvas):
|
|
5934
5950
|
if self.selected.fill_iid == item:
|
5935
5951
|
self.hide_selected()
|
5936
5952
|
self.set_current_to_last()
|
5953
|
+
if item == self.being_drawn_item:
|
5954
|
+
self.being_drawn_item = None
|
5955
|
+
elif item == self.RI.being_drawn_item:
|
5956
|
+
self.RI.being_drawn_item = None
|
5957
|
+
elif item == self.CH.being_drawn_item:
|
5958
|
+
self.CH.being_drawn_item = None
|
5937
5959
|
return True
|
5938
5960
|
|
5939
5961
|
def hide_selected(self) -> None:
|
@@ -5951,6 +5973,7 @@ class MainTable(tk.Canvas):
|
|
5951
5973
|
state: str = "normal",
|
5952
5974
|
set_current: bool | tuple[int, int] = True,
|
5953
5975
|
run_binding: bool = False,
|
5976
|
+
ext: bool = False,
|
5954
5977
|
) -> int:
|
5955
5978
|
if self.col_positions == [0]:
|
5956
5979
|
c1 = 0
|
@@ -6005,7 +6028,8 @@ class MainTable(tk.Canvas):
|
|
6005
6028
|
)
|
6006
6029
|
bd_iid = None
|
6007
6030
|
if self.PAR.ops.show_selected_cells_border and (
|
6008
|
-
|
6031
|
+
ext
|
6032
|
+
or (self.being_drawn_item is None and self.RI.being_drawn_item is None and self.CH.being_drawn_item is None)
|
6009
6033
|
or self.selection_boxes
|
6010
6034
|
):
|
6011
6035
|
bd_iid = self.display_box(
|
@@ -6996,9 +7020,9 @@ class MainTable(tk.Canvas):
|
|
6996
7020
|
return self.mouseclick_outside_editor_or_dropdown()
|
6997
7021
|
|
6998
7022
|
def hide_dropdown_editor_all_canvases(self):
|
6999
|
-
self.hide_text_editor_and_dropdown()
|
7000
|
-
self.RI.hide_text_editor_and_dropdown()
|
7001
|
-
self.CH.hide_text_editor_and_dropdown()
|
7023
|
+
self.hide_text_editor_and_dropdown(redraw=False)
|
7024
|
+
self.RI.hide_text_editor_and_dropdown(redraw=False)
|
7025
|
+
self.CH.hide_text_editor_and_dropdown(redraw=False)
|
7002
7026
|
|
7003
7027
|
def hide_dropdown_window(self) -> None:
|
7004
7028
|
if self.dropdown.open:
|
@@ -772,11 +772,9 @@ class RowIndex(tk.Canvas):
|
|
772
772
|
return False
|
773
773
|
|
774
774
|
def b1_release(self, event: object) -> None:
|
775
|
-
if self.being_drawn_item is not None:
|
776
|
-
to_sel = self.MT.coords_and_type(self.being_drawn_item)
|
775
|
+
if self.being_drawn_item is not None and (to_sel := self.MT.coords_and_type(self.being_drawn_item)):
|
777
776
|
r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
|
778
777
|
self.MT.hide_selection_box(self.being_drawn_item)
|
779
|
-
self.being_drawn_item = None
|
780
778
|
self.MT.set_currently_selected(
|
781
779
|
r_to_sel,
|
782
780
|
c_to_sel,
|
@@ -785,6 +783,8 @@ class RowIndex(tk.Canvas):
|
|
785
783
|
sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
|
786
784
|
try_binding(self.drag_selection_binding_func, sel_event)
|
787
785
|
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
786
|
+
else:
|
787
|
+
self.being_drawn_item = None
|
788
788
|
self.MT.bind("<MouseWheel>", self.MT.mousewheel)
|
789
789
|
if self.height_resizing_enabled and self.rsz_h is not None and self.currently_resizing_height:
|
790
790
|
self.currently_resizing_height = False
|
@@ -921,6 +921,7 @@ class RowIndex(tk.Canvas):
|
|
921
921
|
redraw: bool = True,
|
922
922
|
run_binding_func: bool = True,
|
923
923
|
set_as_current: bool = True,
|
924
|
+
ext: bool = False,
|
924
925
|
) -> int | None:
|
925
926
|
if add_selection:
|
926
927
|
if self.MT.row_selected(row):
|
@@ -931,18 +932,25 @@ class RowIndex(tk.Canvas):
|
|
931
932
|
redraw=redraw,
|
932
933
|
run_binding_func=run_binding_func,
|
933
934
|
set_as_current=set_as_current,
|
935
|
+
ext=ext,
|
934
936
|
)
|
935
937
|
else:
|
936
938
|
if self.MT.row_selected(row):
|
937
939
|
fill_iid = self.MT.deselect(r=row, redraw=redraw)
|
938
940
|
else:
|
939
|
-
fill_iid = self.select_row(row, redraw=redraw)
|
941
|
+
fill_iid = self.select_row(row, redraw=redraw, ext=ext)
|
940
942
|
return fill_iid
|
941
943
|
|
942
|
-
def select_row(
|
944
|
+
def select_row(
|
945
|
+
self,
|
946
|
+
r: int,
|
947
|
+
redraw: bool = False,
|
948
|
+
run_binding_func: bool = True,
|
949
|
+
ext: bool = False,
|
950
|
+
) -> int:
|
943
951
|
self.MT.deselect("all", redraw=False)
|
944
952
|
box = (r, 0, r + 1, len(self.MT.col_positions) - 1, "rows")
|
945
|
-
fill_iid = self.MT.create_selection_box(*box)
|
953
|
+
fill_iid = self.MT.create_selection_box(*box, ext=ext)
|
946
954
|
if redraw:
|
947
955
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
948
956
|
if run_binding_func:
|
@@ -955,9 +963,10 @@ class RowIndex(tk.Canvas):
|
|
955
963
|
redraw: bool = False,
|
956
964
|
run_binding_func: bool = True,
|
957
965
|
set_as_current: bool = True,
|
966
|
+
ext: bool = False,
|
958
967
|
) -> int:
|
959
968
|
box = (r, 0, r + 1, len(self.MT.col_positions) - 1, "rows")
|
960
|
-
fill_iid = self.MT.create_selection_box(*box, set_current=set_as_current)
|
969
|
+
fill_iid = self.MT.create_selection_box(*box, set_current=set_as_current, ext=ext)
|
961
970
|
if redraw:
|
962
971
|
self.MT.main_table_redraw_grid_and_text(redraw_header=False, redraw_row_index=True)
|
963
972
|
if run_binding_func:
|
@@ -1030,7 +1039,7 @@ class RowIndex(tk.Canvas):
|
|
1030
1039
|
align = self.align
|
1031
1040
|
if align == "w":
|
1032
1041
|
w += self.MT.index_txt_height
|
1033
|
-
w += self.get_treeview_indent(self.MT._row_index[datarn].iid) +
|
1042
|
+
w += self.get_treeview_indent(self.MT._row_index[datarn].iid) + 5
|
1034
1043
|
return w, h
|
1035
1044
|
|
1036
1045
|
def set_row_height(
|
@@ -1310,7 +1319,8 @@ class RowIndex(tk.Canvas):
|
|
1310
1319
|
mod = (self.MT.index_txt_height - 1) if self.MT.index_txt_height % 2 else self.MT.index_txt_height
|
1311
1320
|
half_mod = mod / 2
|
1312
1321
|
qtr_mod = mod / 4
|
1313
|
-
|
1322
|
+
small_mod = int(half_mod / 4) - 1
|
1323
|
+
mid_y = int(self.MT.min_row_height / 2)
|
1314
1324
|
# up arrow
|
1315
1325
|
if open_:
|
1316
1326
|
points = (
|
@@ -1325,11 +1335,11 @@ class RowIndex(tk.Canvas):
|
|
1325
1335
|
else:
|
1326
1336
|
points = (
|
1327
1337
|
x1 + half_mod + indent,
|
1328
|
-
y1 + mid_y - half_mod +
|
1329
|
-
x1 + mod + indent -
|
1338
|
+
y1 + mid_y - half_mod + small_mod,
|
1339
|
+
x1 + mod + indent - small_mod,
|
1330
1340
|
y1 + mid_y,
|
1331
1341
|
x1 + half_mod + indent,
|
1332
|
-
y1 + mid_y + half_mod -
|
1342
|
+
y1 + mid_y + half_mod - small_mod,
|
1333
1343
|
)
|
1334
1344
|
if self.hidd_tree_arrow:
|
1335
1345
|
t, sh = self.hidd_tree_arrow.popitem()
|
@@ -1340,10 +1350,13 @@ class RowIndex(tk.Canvas):
|
|
1340
1350
|
self.itemconfig(t, fill=fill, tag=tag, state="normal")
|
1341
1351
|
self.lift(t)
|
1342
1352
|
else:
|
1343
|
-
t = self.
|
1353
|
+
t = self.create_line(
|
1344
1354
|
points,
|
1345
1355
|
fill=fill,
|
1346
1356
|
tag=tag,
|
1357
|
+
width=2,
|
1358
|
+
capstyle=tk.ROUND,
|
1359
|
+
joinstyle=tk.BEVEL,
|
1347
1360
|
)
|
1348
1361
|
self.disp_tree_arrow[t] = True
|
1349
1362
|
|
@@ -1633,7 +1646,7 @@ class RowIndex(tk.Canvas):
|
|
1633
1646
|
if align == "w":
|
1634
1647
|
draw_x += self.MT.index_txt_height + 1
|
1635
1648
|
indent = self.get_treeview_indent(iid)
|
1636
|
-
draw_x += indent +
|
1649
|
+
draw_x += indent + 5
|
1637
1650
|
if self.tree[iid].children:
|
1638
1651
|
self.redraw_tree_arrow(
|
1639
1652
|
0,
|
@@ -1738,11 +1751,11 @@ class RowIndex(tk.Canvas):
|
|
1738
1751
|
|
1739
1752
|
def get_redraw_selections(self, startr: int, endr: int) -> dict[str, set[int]]:
|
1740
1753
|
d = defaultdict(set)
|
1741
|
-
for item, box in self.MT.get_selection_items(
|
1754
|
+
for item, box in self.MT.get_selection_items():
|
1742
1755
|
r1, c1, r2, c2 = box.coords
|
1743
1756
|
for r in range(startr, endr):
|
1744
1757
|
if r1 <= r and r2 > r:
|
1745
|
-
d[box.type_].add(r)
|
1758
|
+
d[box.type_ if box.type_ != "columns" else "cells"].add(r)
|
1746
1759
|
return d
|
1747
1760
|
|
1748
1761
|
def open_cell(self, event: object = None, ignore_existing_editor=False):
|
@@ -1464,6 +1464,8 @@ class Sheet(tk.Frame):
|
|
1464
1464
|
undo_stack: bool = True,
|
1465
1465
|
selections: bool = True,
|
1466
1466
|
sheet_options: bool = False,
|
1467
|
+
displayed_rows: bool = True,
|
1468
|
+
displayed_columns: bool = True,
|
1467
1469
|
tree: bool = True,
|
1468
1470
|
redraw: bool = True,
|
1469
1471
|
) -> Sheet:
|
@@ -1476,6 +1478,12 @@ class Sheet(tk.Frame):
|
|
1476
1478
|
if index:
|
1477
1479
|
self.RI.hide_text_editor_and_dropdown(redraw=False)
|
1478
1480
|
self.MT._row_index = []
|
1481
|
+
if displayed_columns:
|
1482
|
+
self.MT.displayed_columns = []
|
1483
|
+
self.MT.all_columns_displayed = True
|
1484
|
+
if displayed_rows:
|
1485
|
+
self.MT.displayed_rows = []
|
1486
|
+
self.MT.all_rows_displayed = True
|
1479
1487
|
if row_heights:
|
1480
1488
|
self.MT.saved_row_heights = {}
|
1481
1489
|
self.MT.set_row_positions([])
|
@@ -3129,6 +3137,7 @@ class Sheet(tk.Frame):
|
|
3129
3137
|
row if isinstance(row, int) else int(row),
|
3130
3138
|
redraw=False,
|
3131
3139
|
run_binding_func=run_binding_func,
|
3140
|
+
ext=True,
|
3132
3141
|
)
|
3133
3142
|
return self.set_refresh_timer(redraw)
|
3134
3143
|
|
@@ -3137,6 +3146,7 @@ class Sheet(tk.Frame):
|
|
3137
3146
|
column if isinstance(column, int) else int(column),
|
3138
3147
|
redraw=False,
|
3139
3148
|
run_binding_func=run_binding_func,
|
3149
|
+
ext=True,
|
3140
3150
|
)
|
3141
3151
|
return self.set_refresh_timer(redraw)
|
3142
3152
|
|
@@ -3146,6 +3156,7 @@ class Sheet(tk.Frame):
|
|
3146
3156
|
column if isinstance(column, int) else int(column),
|
3147
3157
|
redraw=False,
|
3148
3158
|
run_binding_func=run_binding_func,
|
3159
|
+
ext=True,
|
3149
3160
|
)
|
3150
3161
|
return self.set_refresh_timer(redraw)
|
3151
3162
|
|
@@ -3167,6 +3178,7 @@ class Sheet(tk.Frame):
|
|
3167
3178
|
redraw=False,
|
3168
3179
|
run_binding_func=run_binding_func,
|
3169
3180
|
set_as_current=set_as_current,
|
3181
|
+
ext=True,
|
3170
3182
|
)
|
3171
3183
|
return self.set_refresh_timer(redraw)
|
3172
3184
|
|
@@ -3182,6 +3194,7 @@ class Sheet(tk.Frame):
|
|
3182
3194
|
redraw=False,
|
3183
3195
|
run_binding_func=run_binding_func,
|
3184
3196
|
set_as_current=set_as_current,
|
3197
|
+
ext=True,
|
3185
3198
|
)
|
3186
3199
|
return self.set_refresh_timer(redraw)
|
3187
3200
|
|
@@ -3197,6 +3210,7 @@ class Sheet(tk.Frame):
|
|
3197
3210
|
redraw=False,
|
3198
3211
|
run_binding_func=run_binding_func,
|
3199
3212
|
set_as_current=set_as_current,
|
3213
|
+
ext=True,
|
3200
3214
|
)
|
3201
3215
|
return self.set_refresh_timer(redraw)
|
3202
3216
|
|
@@ -3216,6 +3230,7 @@ class Sheet(tk.Frame):
|
|
3216
3230
|
redraw=False,
|
3217
3231
|
run_binding_func=run_binding_func,
|
3218
3232
|
set_as_current=set_as_current,
|
3233
|
+
ext=True,
|
3219
3234
|
)
|
3220
3235
|
return self.set_refresh_timer(redraw)
|
3221
3236
|
|
@@ -3233,6 +3248,7 @@ class Sheet(tk.Frame):
|
|
3233
3248
|
redraw=False,
|
3234
3249
|
run_binding_func=run_binding_func,
|
3235
3250
|
set_as_current=set_as_current,
|
3251
|
+
ext=True,
|
3236
3252
|
)
|
3237
3253
|
return self.set_refresh_timer(redraw)
|
3238
3254
|
|
@@ -3250,6 +3266,7 @@ class Sheet(tk.Frame):
|
|
3250
3266
|
redraw=False,
|
3251
3267
|
run_binding_func=run_binding_func,
|
3252
3268
|
set_as_current=set_as_current,
|
3269
|
+
ext=True,
|
3253
3270
|
)
|
3254
3271
|
return self.set_refresh_timer(redraw)
|
3255
3272
|
|
@@ -3261,7 +3278,14 @@ class Sheet(tk.Frame):
|
|
3261
3278
|
c2: int,
|
3262
3279
|
type_: Literal["cells", "rows", "columns", "cols"] = "cells",
|
3263
3280
|
) -> int:
|
3264
|
-
return self.MT.create_selection_box(
|
3281
|
+
return self.MT.create_selection_box(
|
3282
|
+
r1=r1,
|
3283
|
+
c1=c1,
|
3284
|
+
r2=r2,
|
3285
|
+
c2=c2,
|
3286
|
+
type_="columns" if type_ == "cols" else type_,
|
3287
|
+
ext=True,
|
3288
|
+
)
|
3265
3289
|
|
3266
3290
|
def recreate_all_selection_boxes(self) -> Sheet:
|
3267
3291
|
self.MT.recreate_all_selection_boxes()
|
@@ -3584,6 +3608,20 @@ class Sheet(tk.Frame):
|
|
3584
3608
|
z < self.MT.min_column_width or not isinstance(z, int) or isinstance(z, bool) for z in column_widths
|
3585
3609
|
)
|
3586
3610
|
|
3611
|
+
def valid_row_height(self, height: int) -> int:
|
3612
|
+
if height < self.MT.min_row_height:
|
3613
|
+
return self.MT.min_row_height
|
3614
|
+
elif height > self.MT.max_row_height:
|
3615
|
+
return self.MT.max_row_height
|
3616
|
+
return height
|
3617
|
+
|
3618
|
+
def valid_column_width(self, width: int) -> int:
|
3619
|
+
if width < self.MT.min_column_width:
|
3620
|
+
return self.MT.min_column_width
|
3621
|
+
elif width > self.MT.max_column_width:
|
3622
|
+
return self.MT.max_column_width
|
3623
|
+
return width
|
3624
|
+
|
3587
3625
|
# Identifying Bound Event Mouse Position
|
3588
3626
|
|
3589
3627
|
def identify_region(self, event: object) -> Literal["table", "index", "header", "top left"]:
|
@@ -4512,6 +4550,7 @@ class Sheet(tk.Frame):
|
|
4512
4550
|
safety: bool = True,
|
4513
4551
|
ncols: int | None = None,
|
4514
4552
|
) -> Sheet:
|
4553
|
+
self.reset(cell_options=False, column_widths=False, header=False, redraw=False)
|
4515
4554
|
if text_column is None:
|
4516
4555
|
text_column = iid_column
|
4517
4556
|
tally_of_ids = defaultdict(lambda: -1)
|
@@ -4564,6 +4603,8 @@ class Sheet(tk.Frame):
|
|
4564
4603
|
fill=False,
|
4565
4604
|
push_ops=push_ops,
|
4566
4605
|
)
|
4606
|
+
self.MT.all_rows_displayed = False
|
4607
|
+
self.MT.displayed_rows = list(range(len(self.MT._row_index)))
|
4567
4608
|
self.RI.tree_rns = {n.iid: i for i, n in enumerate(self.MT._row_index)}
|
4568
4609
|
if open_ids:
|
4569
4610
|
self.tree_set_open(open_ids=open_ids)
|
@@ -4614,10 +4655,17 @@ class Sheet(tk.Frame):
|
|
4614
4655
|
Only meant for internal use
|
4615
4656
|
"""
|
4616
4657
|
to_open = []
|
4658
|
+
disp_set = set(self.MT.displayed_rows)
|
4659
|
+
quick_rns = self.RI.tree_rns
|
4660
|
+
quick_open_ids = self.RI.tree_open_ids
|
4617
4661
|
for item in filter(items.__contains__, self.get_children()):
|
4618
4662
|
if self.RI.tree[item].children:
|
4619
|
-
|
4620
|
-
|
4663
|
+
quick_open_ids.add(item)
|
4664
|
+
if quick_rns[item] in disp_set:
|
4665
|
+
to_disp = [quick_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True)]
|
4666
|
+
for i in to_disp:
|
4667
|
+
disp_set.add(i)
|
4668
|
+
to_open.extend(to_disp)
|
4621
4669
|
return to_open
|
4622
4670
|
|
4623
4671
|
def tree_open(self, *items, redraw: bool = True) -> Sheet:
|
@@ -4627,36 +4675,37 @@ class Sheet(tk.Frame):
|
|
4627
4675
|
if items := set(unpack(items)):
|
4628
4676
|
to_open = self._tree_open(items)
|
4629
4677
|
else:
|
4630
|
-
to_open =
|
4631
|
-
for item in self.get_children():
|
4632
|
-
if self.RI.tree[item].children:
|
4633
|
-
self.RI.tree_open_ids.add(item)
|
4634
|
-
to_open.extend(self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True))
|
4678
|
+
to_open = self._tree_open(set(self.get_children()))
|
4635
4679
|
return self.show_rows(
|
4636
4680
|
rows=to_open,
|
4637
4681
|
redraw=redraw,
|
4638
4682
|
deselect_all=False,
|
4639
4683
|
)
|
4640
4684
|
|
4685
|
+
def _tree_close(self, items: Iterator[str]) -> list[int]:
|
4686
|
+
"""
|
4687
|
+
Only meant for internal use
|
4688
|
+
"""
|
4689
|
+
to_close = set()
|
4690
|
+
disp_set = set(self.MT.displayed_rows)
|
4691
|
+
quick_rns = self.RI.tree_rns
|
4692
|
+
quick_open_ids = self.RI.tree_open_ids
|
4693
|
+
for item in items:
|
4694
|
+
if self.RI.tree[item].children:
|
4695
|
+
quick_open_ids.discard(item)
|
4696
|
+
if quick_rns[item] in disp_set:
|
4697
|
+
for did in self.RI.get_iid_descendants(item, check_open=True):
|
4698
|
+
to_close.add(quick_rns[did])
|
4699
|
+
return to_close
|
4700
|
+
|
4641
4701
|
def tree_close(self, *items, redraw: bool = True) -> Sheet:
|
4642
4702
|
"""
|
4643
4703
|
If used without args all items are closed
|
4644
4704
|
"""
|
4645
|
-
to_close = set()
|
4646
4705
|
if items:
|
4647
|
-
|
4648
|
-
if self.RI.tree[item].children:
|
4649
|
-
self.RI.tree_open_ids.discard(item)
|
4650
|
-
if self.RI.tree_rns[item] in self.MT.displayed_rows:
|
4651
|
-
for did in self.RI.get_iid_descendants(item, check_open=True):
|
4652
|
-
to_close.add(self.RI.tree_rns[did])
|
4706
|
+
to_close = self._tree_close(unpack(items))
|
4653
4707
|
else:
|
4654
|
-
|
4655
|
-
if self.RI.tree[item].children:
|
4656
|
-
self.RI.tree_open_ids.discard(item)
|
4657
|
-
if self.RI.tree_rns[item] in self.MT.displayed_rows:
|
4658
|
-
for did in self.RI.get_iid_descendants(item, check_open=True):
|
4659
|
-
to_close.add(self.RI.tree_rns[did])
|
4708
|
+
to_close = self._tree_close(self.get_children())
|
4660
4709
|
return self.hide_rows(
|
4661
4710
|
rows=to_close,
|
4662
4711
|
redraw=redraw,
|
@@ -46,8 +46,8 @@ theme_light_blue: dict[str, str] = DotDict({
|
|
46
46
|
"table_selected_columns_border_fg": "#0B57D0",
|
47
47
|
"table_selected_columns_bg": "#E6EFFD",
|
48
48
|
"table_selected_columns_fg": "black",
|
49
|
-
"tree_arrow_fg": "
|
50
|
-
"selected_cells_tree_arrow_fg": "
|
49
|
+
"tree_arrow_fg": "black",
|
50
|
+
"selected_cells_tree_arrow_fg": "black",
|
51
51
|
"selected_rows_tree_arrow_fg": "#FFFFFF",
|
52
52
|
"vertical_scroll_background": "#FFFFFF",
|
53
53
|
"horizontal_scroll_background": "#FFFFFF",
|
@@ -121,7 +121,7 @@ theme_light_green: dict[str, str] = DotDict({
|
|
121
121
|
"table_selected_columns_border_fg": "#107C41",
|
122
122
|
"table_selected_columns_bg": "#E3E3E3",
|
123
123
|
"table_selected_columns_fg": "black",
|
124
|
-
"tree_arrow_fg": "
|
124
|
+
"tree_arrow_fg": "black",
|
125
125
|
"selected_cells_tree_arrow_fg": "#107C41",
|
126
126
|
"selected_rows_tree_arrow_fg": "#FFFFFF",
|
127
127
|
"vertical_scroll_background": "#FFFFFF",
|
@@ -272,8 +272,8 @@ theme_black: dict[str, str] = DotDict({
|
|
272
272
|
"table_selected_columns_bg": "#404040",
|
273
273
|
"table_selected_columns_fg": "#F7F7F7",
|
274
274
|
"tree_arrow_fg": "#8C8C8C",
|
275
|
-
"selected_cells_tree_arrow_fg": "#
|
276
|
-
"selected_rows_tree_arrow_fg": "#
|
275
|
+
"selected_cells_tree_arrow_fg": "#FBB86C",
|
276
|
+
"selected_rows_tree_arrow_fg": "#000000",
|
277
277
|
"vertical_scroll_background": "#3b3a39",
|
278
278
|
"horizontal_scroll_background": "#3b3a39",
|
279
279
|
"vertical_scroll_troughcolor": "#000000",
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|