tksheet 7.1.4__tar.gz → 7.1.5__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.
Files changed (24) hide show
  1. {tksheet-7.1.4/tksheet.egg-info → tksheet-7.1.5}/PKG-INFO +1 -1
  2. {tksheet-7.1.4 → tksheet-7.1.5}/pyproject.toml +1 -1
  3. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/__init__.py +1 -1
  4. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/column_headers.py +66 -54
  5. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/functions.py +16 -0
  6. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/main_table.py +134 -116
  7. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/row_index.py +64 -60
  8. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/sheet.py +81 -73
  9. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/text_editor.py +8 -6
  10. {tksheet-7.1.4 → tksheet-7.1.5/tksheet.egg-info}/PKG-INFO +1 -1
  11. {tksheet-7.1.4 → tksheet-7.1.5}/LICENSE.txt +0 -0
  12. {tksheet-7.1.4 → tksheet-7.1.5}/README.md +0 -0
  13. {tksheet-7.1.4 → tksheet-7.1.5}/setup.cfg +0 -0
  14. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/colors.py +0 -0
  15. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/formatters.py +0 -0
  16. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/other_classes.py +0 -0
  17. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/sheet_options.py +0 -0
  18. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/themes.py +0 -0
  19. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/top_left_rectangle.py +0 -0
  20. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/types.py +0 -0
  21. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet/vars.py +0 -0
  22. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet.egg-info/SOURCES.txt +0 -0
  23. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet.egg-info/dependency_links.txt +0 -0
  24. {tksheet-7.1.4 → tksheet-7.1.5}/tksheet.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.1.4
3
+ Version: 7.1.5
4
4
  Summary: Tkinter table / sheet widget
5
5
  Author-email: ragardner <github@ragardner.simplelogin.com>
6
6
  License: Copyright (c) 2019 ragardner and open source contributors
@@ -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.4"
9
+ version = "7.1.5"
10
10
  authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
11
11
  requires-python = ">=3.8"
12
12
  license = {file = "LICENSE.txt"}
@@ -4,7 +4,7 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.1.4"
7
+ __version__ = "7.1.5"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
@@ -272,7 +272,9 @@ class ColumnHeaders(tk.Canvas):
272
272
  if self.MT.selected and self.MT.selected.type_ == "columns":
273
273
  r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
274
274
  self.MT.deselect("all", redraw=False)
275
- self.being_drawn_item = self.MT.create_selection_box(*self.get_shift_select_box(c, c_to_sel), "columns")
275
+ self.being_drawn_item = self.MT.create_selection_box(
276
+ *self.get_shift_select_box(c, c_to_sel), "columns"
277
+ )
276
278
  self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
277
279
  else:
278
280
  self.being_drawn_item = self.select_col(c, run_binding_func=False)
@@ -854,8 +856,16 @@ class ColumnHeaders(tk.Canvas):
854
856
  ):
855
857
  datacn = c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
856
858
  canvasx = self.canvasx(event.x)
857
- if self.event_over_dropdown(c, datacn, event, canvasx) or self.event_over_checkbox(
858
- c, datacn, event, canvasx
859
+ if self.event_over_dropdown(
860
+ c,
861
+ datacn,
862
+ event,
863
+ canvasx,
864
+ ) or self.event_over_checkbox(
865
+ c,
866
+ datacn,
867
+ event,
868
+ canvasx,
859
869
  ):
860
870
  self.open_cell(event)
861
871
  else:
@@ -970,15 +980,15 @@ class ColumnHeaders(tk.Canvas):
970
980
  qconf = self.MT.txt_measure_canvas.itemconfig
971
981
  qbbox = self.MT.txt_measure_canvas.bbox
972
982
  qtxtm = self.MT.txt_measure_canvas_text
983
+ qfont = self.PAR.ops.header_font
973
984
  new_height = self.MT.min_header_height
974
985
  default_header_height = self.MT.get_default_header_height()
975
986
  self.fix_header()
976
987
  if text is not None:
977
988
  if text:
978
- qconf(qtxtm, text=text)
989
+ qconf(qtxtm, text=text, font=qfont)
979
990
  b = qbbox(qtxtm)
980
- h = b[3] - b[1] + 5
981
- if h > new_height:
991
+ if (h := b[3] - b[1] + 5) > new_height:
982
992
  new_height = h
983
993
  else:
984
994
  if self.MT.all_columns_displayed:
@@ -1002,7 +1012,7 @@ class ColumnHeaders(tk.Canvas):
1002
1012
  for datacn in iterable:
1003
1013
  txt = self.MT.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
1004
1014
  if txt:
1005
- qconf(qtxtm, text=txt)
1015
+ qconf(qtxtm, text=txt, font=qfont)
1006
1016
  b = qbbox(qtxtm)
1007
1017
  h = b[3] - b[1] + 5
1008
1018
  else:
@@ -1014,7 +1024,7 @@ class ColumnHeaders(tk.Canvas):
1014
1024
  if h > new_height:
1015
1025
  new_height = h
1016
1026
  space_bot = self.MT.get_space_bot(0)
1017
- if new_height > space_bot:
1027
+ if new_height > space_bot and space_bot > self.MT.min_header_height:
1018
1028
  new_height = space_bot
1019
1029
  if not only_increase or (only_increase and new_height > self.current_height):
1020
1030
  self.set_height(new_height, set_TL=True)
@@ -1684,12 +1694,12 @@ class ColumnHeaders(tk.Canvas):
1684
1694
  }
1685
1695
  ),
1686
1696
  "sheet_ops": self.PAR.ops,
1687
- "border_color": self.PAR.ops.table_selected_cells_border_fg,
1697
+ "border_color": self.PAR.ops.header_selected_columns_bg,
1688
1698
  "text": text,
1689
1699
  "state": state,
1690
1700
  "width": w,
1691
1701
  "height": h,
1692
- "show_border": self.PAR.ops.show_selected_cells_border,
1702
+ "show_border": True,
1693
1703
  "bg": bg,
1694
1704
  "fg": fg,
1695
1705
  "align": self.get_cell_align(c),
@@ -1735,31 +1745,34 @@ class ColumnHeaders(tk.Canvas):
1735
1745
 
1736
1746
  # displayed indexes
1737
1747
  def text_editor_newline_binding(self, r=0, c=0, event: object = None, check_lines=True):
1738
- if self.height_resizing_enabled:
1739
- curr_height = self.text_editor.window.winfo_height()
1740
- if (
1741
- not check_lines
1742
- or self.MT.get_lines_cell_height(
1743
- self.text_editor.window.get_num_lines() + 1,
1744
- font=self.PAR.ops.header_font,
1745
- )
1746
- > curr_height
1747
- ):
1748
- new_height = curr_height + self.MT.header_xtra_lines_increment
1749
- space_bot = self.MT.get_space_bot(0)
1750
- if new_height > space_bot:
1751
- new_height = space_bot
1752
- if new_height != curr_height:
1753
- self.text_editor.window.config(height=new_height)
1754
- self.set_height(new_height, set_TL=True)
1755
- if self.dropdown.open and self.dropdown.get_coords() == c:
1756
- win_h, anchor = self.get_dropdown_height_anchor(c, new_height)
1757
- self.coords(
1758
- self.dropdown.canvas_id,
1759
- self.MT.col_positions[c],
1760
- new_height - 1,
1761
- )
1762
- self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1748
+ if not self.height_resizing_enabled:
1749
+ return
1750
+ curr_height = self.text_editor.window.winfo_height()
1751
+ if curr_height < self.MT.min_header_height:
1752
+ return
1753
+ if (
1754
+ not check_lines
1755
+ or self.MT.get_lines_cell_height(
1756
+ self.text_editor.window.get_num_lines() + 1,
1757
+ font=self.PAR.ops.header_font,
1758
+ )
1759
+ > curr_height
1760
+ ):
1761
+ new_height = curr_height + self.MT.header_xtra_lines_increment
1762
+ space_bot = self.MT.get_space_bot(0)
1763
+ if new_height > space_bot:
1764
+ new_height = space_bot
1765
+ if new_height != curr_height:
1766
+ self.text_editor.window.config(height=new_height)
1767
+ self.set_height(new_height, set_TL=True)
1768
+ if self.dropdown.open and self.dropdown.get_coords() == c:
1769
+ win_h, anchor = self.get_dropdown_height_anchor(c, new_height)
1770
+ self.coords(
1771
+ self.dropdown.canvas_id,
1772
+ self.MT.col_positions[c],
1773
+ new_height - 1,
1774
+ )
1775
+ self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1763
1776
 
1764
1777
  def refresh_open_window_positions(self):
1765
1778
  if self.text_editor.open:
@@ -1897,33 +1910,32 @@ class ColumnHeaders(tk.Canvas):
1897
1910
  if not self.open_text_editor(event=event, c=c, dropdown=True):
1898
1911
  return
1899
1912
  win_h, anchor = self.get_dropdown_height_anchor(c)
1913
+ win_w = self.MT.col_positions[c + 1] - self.MT.col_positions[c] + 1
1900
1914
  ypos = self.current_height - 1
1901
- if self.dropdown.window is not None:
1902
- self.dropdown.window.search_function = kwargs["search_function"]
1903
- self.dropdown.window.c = c
1904
- self.dropdown.window.row = -1
1905
- self.dropdown.window.set_options()
1906
- self.dropdown.window.values(kwargs["values"])
1907
- if not self.dropdown.open:
1908
- self.itemconfig(self.dropdown.canvas_id, state="normal")
1915
+ reset_kwargs = {
1916
+ "r": 0,
1917
+ "c": c,
1918
+ "width": win_w,
1919
+ "height": win_h,
1920
+ "font": self.PAR.ops.header_font,
1921
+ "ops": self.PAR.ops,
1922
+ "outline_color": self.PAR.ops.popup_menu_fg,
1923
+ "align": self.get_cell_align(c),
1924
+ "values": kwargs["values"],
1925
+ }
1926
+ if self.dropdown.window:
1927
+ self.dropdown.window.reset(**reset_kwargs)
1928
+ self.itemconfig(self.dropdown.canvas_id, state="normal")
1909
1929
  self.coords(self.dropdown.canvas_id, self.MT.col_positions[c], ypos)
1910
1930
  else:
1911
1931
  self.dropdown.window = self.PAR.dropdown_class(
1912
- self.MT.winfo_toplevel(),
1913
- 0,
1914
- c,
1915
- width=self.MT.col_positions[c + 1] - self.MT.col_positions[c] + 1,
1916
- height=win_h,
1917
- font=self.PAR.ops.header_font,
1918
- ops=self.PAR.ops,
1919
- outline_color=self.PAR.ops.popup_menu_fg,
1920
- values=kwargs["values"],
1932
+ self.winfo_toplevel(),
1933
+ **reset_kwargs,
1934
+ single_index="c",
1921
1935
  close_dropdown_window=self.close_dropdown_window,
1922
1936
  search_function=kwargs["search_function"],
1923
1937
  arrowkey_RIGHT=self.MT.arrowkey_RIGHT,
1924
1938
  arrowkey_LEFT=self.MT.arrowkey_LEFT,
1925
- align="w",
1926
- single_index="c",
1927
1939
  )
1928
1940
  self.dropdown.canvas_id = self.create_window(
1929
1941
  (self.MT.col_positions[c], ypos),
@@ -1146,6 +1146,22 @@ def set_readonly(
1146
1146
  return options
1147
1147
 
1148
1148
 
1149
+ def convert_align(align: str | None) -> str | None:
1150
+ if isinstance(align, str):
1151
+ a = align.lower()
1152
+ if a == "global":
1153
+ return None
1154
+ elif a in ("c", "center", "centre"):
1155
+ return "center"
1156
+ elif a in ("w", "west", "left"):
1157
+ return "w"
1158
+ elif a in ("e", "east", "right"):
1159
+ return "e"
1160
+ elif align is None:
1161
+ return None
1162
+ raise ValueError("Align must be one of the following values: c, center, w, west, left, e, east, right")
1163
+
1164
+
1149
1165
  def set_align(
1150
1166
  options: dict,
1151
1167
  key: int | tuple[int, int],