tksheet 7.4.24__tar.gz → 7.5.0__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 (27) hide show
  1. tksheet-7.5.0/LICENSE.txt +41 -0
  2. {tksheet-7.4.24/tksheet.egg-info → tksheet-7.5.0}/PKG-INFO +23 -1
  3. {tksheet-7.4.24 → tksheet-7.5.0}/pyproject.toml +1 -1
  4. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/__init__.py +13 -1
  5. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/column_headers.py +5 -0
  6. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/constants.py +180 -0
  7. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/find_window.py +25 -2
  8. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/functions.py +9 -1
  9. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/main_table.py +256 -96
  10. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/row_index.py +5 -0
  11. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/sheet.py +15 -9
  12. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/sheet_options.py +123 -20
  13. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/text_editor.py +26 -2
  14. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/themes.py +4 -4
  15. {tksheet-7.4.24 → tksheet-7.5.0/tksheet.egg-info}/PKG-INFO +23 -1
  16. tksheet-7.4.24/LICENSE.txt +0 -19
  17. {tksheet-7.4.24 → tksheet-7.5.0}/README.md +0 -0
  18. {tksheet-7.4.24 → tksheet-7.5.0}/setup.cfg +0 -0
  19. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/colors.py +0 -0
  20. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/formatters.py +0 -0
  21. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/other_classes.py +0 -0
  22. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/sorting.py +0 -0
  23. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/tksheet_types.py +0 -0
  24. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet/top_left_rectangle.py +0 -0
  25. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet.egg-info/SOURCES.txt +0 -0
  26. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet.egg-info/dependency_links.txt +0 -0
  27. {tksheet-7.4.24 → tksheet-7.5.0}/tksheet.egg-info/top_level.txt +0 -0
@@ -0,0 +1,41 @@
1
+ Copyright (c) 2019 ragardner and open source contributors
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
20
+
21
+ ---
22
+
23
+ ### Third-Party Assets: Icons from Lucide Icons
24
+
25
+ Icons used in tksheet are sourced from Lucide Icons (https://lucide.dev) and are licensed under the ISC License. This license applies only to the icon assets and not to the rest of the tksheet software, which remains under the MIT License above.
26
+
27
+ ISC License
28
+
29
+ Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
30
+
31
+ Permission to use, copy, modify, and/or distribute this software for any
32
+ purpose with or without fee is hereby granted, provided that the above
33
+ copyright notice and this permission notice appear in all copies.
34
+
35
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
36
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
37
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
38
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
39
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
40
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
41
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tksheet
3
- Version: 7.4.24
3
+ Version: 7.5.0
4
4
  Summary: Tkinter table / sheet and treeview widget
5
5
  Author-email: ragardner <github@ragardner.simplelogin.com>
6
6
  License: Copyright (c) 2019 ragardner and open source contributors
@@ -23,6 +23,28 @@ License: Copyright (c) 2019 ragardner and open source contributors
23
23
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
24
  SOFTWARE.
25
25
 
26
+ ---
27
+
28
+ ### Third-Party Assets: Icons from Lucide Icons
29
+
30
+ Icons used in tksheet are sourced from Lucide Icons (https://lucide.dev) and are licensed under the ISC License. This license applies only to the icon assets and not to the rest of the tksheet software, which remains under the MIT License above.
31
+
32
+ ISC License
33
+
34
+ Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
35
+
36
+ Permission to use, copy, modify, and/or distribute this software for any
37
+ purpose with or without fee is hereby granted, provided that the above
38
+ copyright notice and this permission notice appear in all copies.
39
+
40
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
41
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
42
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
43
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
44
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
45
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
46
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
47
+
26
48
  Project-URL: Homepage, https://github.com/ragardner/tksheet
27
49
  Project-URL: Documentation, https://github.com/ragardner/tksheet/wiki/Version-7
28
50
  Project-URL: Changelog, https://github.com/ragardner/tksheet/blob/master/docs/CHANGELOG.md
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
  name = "tksheet"
7
7
  description = "Tkinter table / sheet and treeview widget"
8
8
  readme = "README.md"
9
- version = "7.4.24"
9
+ version = "7.5.0"
10
10
  authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
11
11
  requires-python = ">=3.8"
12
12
  license = {file = "LICENSE.txt"}
@@ -4,13 +4,25 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.4.24"
7
+ __version__ = "7.5.0"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
11
11
  )
12
12
  from .column_headers import ColumnHeaders
13
13
  from .constants import (
14
+ ICON_ADD,
15
+ ICON_CLEAR,
16
+ ICON_COPY,
17
+ ICON_CUT,
18
+ ICON_DEL,
19
+ ICON_EDIT,
20
+ ICON_PASTE,
21
+ ICON_REDO,
22
+ ICON_SELECT_ALL,
23
+ ICON_SORT_ASC,
24
+ ICON_SORT_DESC,
25
+ ICON_UNDO,
14
26
  USER_OS,
15
27
  ctrl_key,
16
28
  emitted_events,
@@ -164,6 +164,9 @@ class ColumnHeaders(tk.Canvas):
164
164
  self.current_height = new_height
165
165
  return expanded
166
166
 
167
+ def is_readonly(self, datacn: int) -> bool:
168
+ return datacn in self.cell_options and "readonly" in self.cell_options[datacn]
169
+
167
170
  def rc(self, event: Any) -> None:
168
171
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
169
172
  self.focus_set()
@@ -189,6 +192,8 @@ class ColumnHeaders(tk.Canvas):
189
192
  try_binding(self.extra_rc_func, event)
190
193
  if popup_menu is not None:
191
194
  self.popup_menu_loc = c
195
+ self.MT.popup_menu_disable_edit_if_readonly(popup_menu)
196
+ self.MT.popup_menu_disable_undo_redo(popup_menu)
192
197
  popup_menu.tk_popup(event.x_root, event.y_root)
193
198
 
194
199
  def ctrl_b1_press(self, event: Any) -> None:
@@ -345,3 +345,183 @@ for o, b in BINDING_TO_ATTR.values():
345
345
  SELECT_BINDINGS.append((o, b))
346
346
  visited.add((o, b))
347
347
  visited = set()
348
+
349
+ ICON_CUT = (
350
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAxxJREFUSEuFVstq"""
351
+ """20AUPVcqBLLqoiZxVvK2u1JKoFCIocs0/5BlIP6AkWyJOI30AQ5k6X5Dkl1psiwhP6FV3JKuA1lYt7nz"""
352
+ """sEaW3Qps7NHoPs4594yIADDal163XwRe+Vs/aQOsjkOgdTfqtOtKaBbV2rUoTvbZu+Oi+IAKIwD79vFr"""
353
+ """BHyaqvj+35WuT7boQIJThTvTNFcEAQaBRirA7ihW9x4idURbXFYUUQhMZU8Wq76BXaLYDsZfi0sAX5h5"""
354
+ """+uf37EiW32x3Lwh0COAqTdTBIqqPx0s5WV5ErxhTrrAHwrcsUYeOVz9BJdU+/nrYnEzOn4WDwfFgo9Pd"""
355
+ """eSKARkMVCtfLpevKmafEtMeMMh2q3lJ+88j4LK8A4sfZw+bk3CYYDDY62ztP0muaqLApOEJW5FHIGpY9"""
356
+ """AsrRUPWs3OpmXbbxmQ/Rw5Hg19nufgfw6eXzI03izwZT04YJTjo4gDJLVM/Iuk246cAo6M5oiqUbWRaS"""
357
+ """5ZrNA3w8UaqUP4J5CJ6CSQdPk7jnR27MUJ2UMC7yJZnyDUBvCegKvvMQfUngYDHBVW+h8zUDu+q+I5+z"""
358
+ """PI/Cim7BiEBcgqiEVguXWRL3ajk2FNCY8P+MpOBdRGGFW4AjzYJWS9yrLaRZY0NFNV5+nppMjbmWoqcW"""
359
+ """Dcu6q2lOBopmbOHLrbME94bIqMUmHStVtg1xqRu/g7YX8Q2IXoPxHnaI6snPxVXKeYD+iYrLlfqUHS7B"""
360
+ """OPe9CJVeZwQgqZdmaaJ2XKM+ZKIkk0SVzhBdEc673CRfAtTwos7Wzk8Q3rW8yPEixGt1eUlWIG4TFMaL"""
361
+ """tFVMnmXRedFqq2iqS8NF6J/EcemmXWLUdu28SJvd5FkgOrZepM1Oe5Hg1fQCI2G+BShycGnyLU4LFTW9"""
362
+ """aHYkGzpb3QsiOiTgajRUB2JkjerssaqtQ88JIoCtdej6fZLFJsh6kSXZHjgIsJsqdW8ecWe1L0frrBUy"""
363
+ """2ZMmSs4Q00NLpnOMQLxvT7RrBDh1wRf8rTumW1PrTrQ1JtVAu/X24C+0brr6m28VvrO2sF6QVr/C+K8t"""
364
+ """vvbr34S/2B2/MddUJi4AAAAASUVORK5CYII="""
365
+ )
366
+
367
+
368
+ ICON_EDIT = (
369
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAn5JREFUSEuFVu1h"""
370
+ """qzAMPJEMQjYhk7x2DEIDoR9hDPomSTd5HiRYr5INCHBa/yK29XGnkxyCLALA+jWtzVbcSFxNO4ie5L75"""
371
+ """XEWxJ2nPeqN9e79k2a5hhgPha8jQtmXpJHNSO2v8Y6YWLKHprvmO0YO5CCeyJElyw4Dnti6/DIJo/Iib"""
372
+ """yCWB1UXTdfme0TOjAODuGY5imt39E2VZI0jqU6l7CZIe8yEnddfFzIPzuioPoxMJvPP4N+6HABtaEpzF"""
373
+ """i0oL0MOrc1luyPjYlicnP5q3a7HL6CYw65eSQg02UQhKxapAmp1yHjKPAXKA3T2jIzGgwRkFD75t6upi"""
374
+ """AliytsSNzkmMGa5+KQ9C1d7jBnAuhQXBiXP6RnWOtG0DxKwtgpkWVYs6F9haj6uiugHIo4pcXZ1iTYSJ"""
375
+ """5JqJm2gRzokXxkLumrbgfO6nHxutkezAPZiiWk6HUaaS/6oPJmTrkiYxKL9zE01SHLEF5xTURFaqUSBT"""
376
+ """3yTcr2E3VXmwSgvnEVks+Jz1soc2jRaaiHtiKjg2kTVR57EPVC2x4JYWG2zRaHPmXND3PAlSmyH/hizF"""
377
+ """9WLYvV67W+CUXVOdIi3BbOHc0mJn1GZyIk5THbkfFx1Sq9mSVMsKmUW5RjHV4PWjkwGVDx7H9hzG7Dg1"""
378
+ """7Xiwgy2R8ObxsQFUKHVVTnuhD+bZI84fjUE7k22vqLPX9+4JxD1An3VVPmsg6YN5asY+2EpwMShtPcZv"""
379
+ """MWmluIzCe9/K71iLMSmnffD4iVBabNZK7vgEaIBO1KPStG+/Y+//NufqspHfhqflxoIiDSAUZfwHTLk4"""
380
+ """9Xv6HB+QxGs0xUvHsWjGlzoth1//zjwys538H8mvnjDSt4tXAAAAAElFTkSuQmCC"""
381
+ )
382
+
383
+
384
+ ICON_SORT_DESC = (
385
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAf5JREFUSEuNVW12"""
386
+ """gjAQnMWDVG+CJ+nzGJEWEIsco97EHoWDKGmzhLD5svL8ISG7szszmxCSD4GgodMfE6sEiN3yjdYXm5QX"""
387
+ """fAC5RyZakXwAWYEHwMF2bzqpV9vzLl2hBi6ouhmG7UbjGxrbR4F9p9S40JWuVXZv6xeFuqrNpyU5aZQ2"""
388
+ """6Xi3IK71iMYnFEm+ROUlrxsE4t94J+xPRzXyekKnSHmvA1E5JpQgmERbG7T8Hw1dJ2VB4NNiMaWMrhau"""
389
+ """qOuHGzRM5WNdqV3XD8zQo8BuM+E2A+qxqY67mbq84Embns59S0XxbpKb4K6/cJ66UsTUTWjs+yF2mk+Q"""
390
+ """b33xTSIvHRiAV/wum/J7exUgIvm1aReD5rd57getNVB/zB10F6ORLue0wmLsNGu3JQXhp67Ufj4RhO3k"""
391
+ """MRBSZDViHbxntbI7jQi4flbqwKll5zKQAWwHuemNPJkYhmwHIUVebKjieoRFfogBbHBOg9n/QoOId1nK"""
392
+ """okE0OEAIEGsQCAtc64V3cTtkXOQPWkStXUjr5ysmhshPI0XOAaQHMLis/LHWxrp8o537ixkDPip4Dobh"""
393
+ """himYAyLrd9mSPKVI2lScr38o7fmrLah4qz+OBzNabde3tCka3rXS73hPONS5OHFN5ipKkJW/a5x1XFRu"""
394
+ """7z85AlSpwUJRwqZPBUwMWno/8Au5DCkvTFG1swAAAABJRU5ErkJggg=="""
395
+ )
396
+
397
+
398
+ ICON_SORT_ASC = (
399
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAhZJREFUSEuVVu11"""
400
+ """wjAMPAGDhE3KKIyRBBIaXuIxYBPYpCwCbmU7sfyV98qfFlv2Sbo7GcLyIQA6/GaWwnUT4Jb8DoGg3Wm5"""
401
+ """yesxQPk+f3cmRgLLO1MAv7tkmj8sA8P/ZeECwAW53WGaHrzSNfWB/w5KPfDBl0yeCM9zWx+Wzrqzpl2i"""
402
+ """Uy5T2UfgOirNjHRtTRx7uY4X2lBvg+2HgPv5VB8FddmOZ2olXMdpAUi6FpQhhJBwE5Ac4vgKGjLqKhGb"""
403
+ """TW/W4z8Ahkk9oCUHGqap3EfiBOg58xXKtyCGYVTGFGscREfvneEj7F9BRYAB0EB3ci0qaTVjxpiibBeH"""
404
+ """cQoq8B7PObnkiZkDqV+XqVeRrWDmwGybvkveHR9ev46PFZIlB3zuexgvtN30Zf8GFrif2/rovOJh5cDK"""
405
+ """+6CsVakcKWvj0rm/kq/YyQEHCeGxcubJyup1AHb2EN7A8btpXpLkXqlqq3HjVLqmORTHdYZLK1MysjRG"""
406
+ """AvB6b/Rh96Efzvq9wd5c/sEXSN/7tjmm1STDJHgzzJd+UtX2AwapQHgBqCy4fkKTAe7aep9MMz/4Yo9Z"""
407
+ """KiQ5vZosCHRlZ6vVJIFe51O9j6dmxmOJyAIAvrLjSjSDuAqCzOVzuGYu/3ymo+IvZyZ1p3HTGhW3JX6h"""
408
+ """bGUhWCLTuXXJ4UySPqa0WZ7Zi4pCM2RUUe6I/DESRa2MipSt9Zcrsuty/BfWPCAzd/TdsgAAAABJRU5E"""
409
+ """rkJggg=="""
410
+ )
411
+
412
+
413
+ ICON_PASTE = (
414
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAlFJREFUSEt9Ve2h"""
415
+ """oyAQnI2NmE5MJe9SBppINKeWkXeVJJ08CjnlDgRcRPWXIDjsfCyE8BAAvQzX83ufkx18IYGWoXtj3+Vz"""
416
+ """KLITXgTkEbQZkAaB1N8J1+YuPhYn/rc9r5lyDwcgEDSafnhD6yJaltao6kqcN0oPmAHZQDye3YNOpy8A"""
417
+ """ud8kK0Fb5LXdwKfV/xqauiq/OdVRBc+u/6U1XqEuR0VdlaYkQMdCPLtBb1B3nUFmzmKAvn9rjWKccDG8"""
418
+ """tpYiFHvl2/kTPrUQFzkMeTbhB4CSlTh74Aig7Xo7X1fCil8bkTPIAxA1WpHLj6Gl/T0Y5e3+zQo4wOGp"""
419
+ """dz623WAqyBeAlT28aL4CTzmnf8OJAc7Q1AhhxI6MExYkALGBV0afP1qdoDESXZtSKGMEY/GgAT/RAlBS"""
420
+ """SAlXywVnnpp3MiOokXAxIFGVfOBtFyg6rGDeKfshzzTeLjdqPOHSCqH8IZiLAFuBBuqbqyARM86BH8mh"""
421
+ """z7OJjKVzECyI12IGcCv3Kghc+0zYAB76TNU3cV71ImABKMkKxQ7czC1EHv7WN0Giz70Sl1nw8BDWQeNi"""
422
+ """+uAsfWZpjrLv80zTywVyI8luLbcpP+mSg7il27SbFqH1izQVGkg6K7sP9imKpY3jMNvUtvSI9w0XxRRx"""
423
+ """6pJMMPv69p7cCazY8C8ucsL1NmcBajHFKsncpiyV17oS396+CUVJAAF3vb71NDXyXj02u2ly4dhVzvR7"""
424
+ """3l/NJwD8dO7SKED4Wu6ADYAEzE4oPU5/ZH17cHqP87juu6vGlxgh0Qn4B4YcZzGhG9dFAAAAAElFTkSu"""
425
+ """QmCC"""
426
+ )
427
+
428
+
429
+ ICON_CLEAR = (
430
+ """iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAktJREFUOE9tVOuB"""
431
+ """o0AI/tAU4lZyppLVQoTMWEhMJclVkhTiLifDjFEv/vGBMN8DIOwuAqAANvf8SKRQC9lVwuWVsMYstF4i"""
432
+ """0tSnuk0Zln1I3L6XEDNP2zOoBGKMHYDrLpjwHqs6QlLnAuD1q3q7iFwskBESYgyW+yDFzf4q7JzigVNW"""
433
+ """JR/1B4qWmb/s3c5CQkd6haIvFD5IlX5PRRI8LzeOsVNNzFJuQjhmukroeTBNLFFTTnpS3YFcnSFFDKtU"""
434
+ """PUsuGOPYEfSqQC/Mk9MlCA/Ngv61pW/GhRBexe1dwYJwNYTIKS+MRLg51fVTQRPz0Ls04Q6gmef5bAcZ"""
435
+ """vfA20xGa3mELO5/CIk1VVR1RJYCaNo2CWkAfwnI2/Qx5HGOHnYZkGo6dQl1Y0zC7akXrquoqIsm0HyJy"""
436
+ """Nk0/U5Yp2WY6EOGqapSHae0SjxnNNnf/JMy996aJoAj/IcwuK3AlQj8kl/2KY7xbjxHw+FX9S0SyaDgx"""
437
+ """c9LUOyR0SlhbLiEcQ/SPoJ6HYbJvMqQxfFqxQfgsAzdVXZum3z8/83nR/eXsQpowAvqBjXIR1sZO0S/u"""
438
+ """Tpqbdj90x8WxsuhIsbbcG6HPcZ6UbXLWP30yZz32YQf0XBCKSHuq6zs2Gu7Q5WVwnHH7x3rY9If18OCG"""
439
+ """IrVHXT8XNx8E3MqkrCsi2V6s2syNn/oNovZnnr9CDNbsPreXEC4VVeLtul0CuVD6syxSz1kRrzsgb5uy"""
440
+ """pX3cTq0XfRfyzLIE8+LIYRu3feydenjau7ovU4xJO6m0ZDr0H9VKXi8tUg0XAAAAAElFTkSuQmCC"""
441
+ )
442
+
443
+ ICON_DEL = (
444
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAilJREFUSEuVVu1Z"""
445
+ """8zAMPLXvIGWTMAl0DBOaNoUmYxQmCZvgQWj9YllO5NgpkB/Fjz901p10hjB+BIKDmybSEQHLi4Be5rH8"""
446
+ """+D8KIi4UYk+n0mhZAJkQRAVAOLy8Hlar1QOADW/z6RD/yFgOZ/MOnL+D/R60TW3eQkp+1n8EHF+7R4DO"""
447
+ """IWiBJ5nPqChTumUQHerYdQM5qr4uuG8b86EZiZfw4Lek2Pf9Zn11nwDZ5tnc8f544HjqWd/m2Xitw/eD"""
448
+ """sCX6fRx/bFcb5kFRJABqIamoJTAlpt8/XjQH6JiAJIO/plECmCgSAJ2BF//UD37PF7Btn4z1mMy1w5kp"""
449
+ """fTL3mqpfUiRNxwBBfAfYywocjIM7VN/l/NbUZjsHYOCEIk5NZzARvu+7zb8rDS70hiWCdSG4bWpzN6+G"""
450
+ """MQ4XS9IHqfq6vz3I+oIBJA0owbNS1hpINS5UUVoyI+fOVVJ4TFdrgia6nstVVFA/ZjAFD7QINNOVgoQT"""
451
+ """KdWzPtANMlrIqR9EUOY8dCsGwG0IZHejDtFydD/NNNDqxwzalxMboA4kIHu50O0q0lbBB7RVlI1spHxS"""
452
+ """ahqVKdLcZQC/9M/JlYMj5H2QelH58jPjmW9i25+ZXaxlbwki5ujl8dHg1+YHs2MLOfbVes398hEshBK7"""
453
+ """fiTgvPgmZyktvXS8cXpw4sWkMioQHiSTJYmXn1LAuuv1/bCrD4VHP/2v4uZbk+le2K3kkpumApZKcDml"""
454
+ """5ZX/A1xULlr4HbYAAAAASUVORK5CYII="""
455
+ )
456
+
457
+
458
+ ICON_ADD = (
459
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAYZJREFUSEuVVdt1"""
460
+ """wjAMldNBWKUdhTEC1IVAyBpsQjdLjx+JJesqTvPB4ThGV/ch4RwRzfGDdjz5Ir/PC4A64Qg+qka8JSuo"""
461
+ """5jh+fqkB/kcpN6cqr027Uk/27GiWqgFgiwEnmwC4SBYDRzSM0ztc9af+SwtWKchIrdJisPw6ADym2Is/"""
462
+ """96Z3RZvUefsiM3YYn/En/tIHBfUD0rUjReVXw7iHgTRce2A1FiXKDLJE2K46LMYUxBRVpgQG4eg7AoCZ"""
463
+ """UGFZPNhIDtdaAshqPNa1FYLD8JzeNM+fjrCP8XIwWLiXDxz9hghvAtzu49V13Q9gW45iPY6Sv8/08pfT"""
464
+ """kU8W68PWdHljS2RtDEfGJNcWpgLrHPBBU9MpU5MY7DZZxlTsHLZyhAe4gWTxElMuUVkV+Y5Up7Sfm2YM"""
465
+ """gCxgDvAuwg2FiiJsrclsmmxsATjL6PB2f1xd93Hw5/4I1zU3hUlXb9hNwNZKr7esngO1ci28Rj4RAzy9"""
466
+ """Mi0Yrt6g5e+WDRroSLHhYPsY/AFsVMwga5Ld0wAAAABJRU5ErkJggg=="""
467
+ )
468
+
469
+
470
+ ICON_COPY = (
471
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAjdJREFUSEuFVuuZ"""
472
+ """qjAQPYOFXLcTrGTXMiIIImLK0FuJdrI2smRvJgEmJLn6w4+Qx8x5zATC/CMQDAwB/m+ZEk9ymp8Tq+R7"""
473
+ """mgZdP5yoKD4BbOc9drddsA7gxq9/s11TqXsyE35J4ADdRX+BcEtnJKMYu2Wd9T4ZxB/G+Z2v+gGD8mfE"""
474
+ """rmvU838UTdm2+rrdjPQNg1dTq480CpuODTBoprKp1ExIwOPMdYiRaaXiT1OrvdRSKpMNkOGdM3onbLDX"""
475
+ """a2DJDRB4jVaneae9cU7oTEvRRRuQQVMdVp4Buv5yomLzCYOtXcO2SrhLxAzc5SjiAB6B4ODM7jK3hHOW"""
476
+ """80KTwSbB6w32Ta3uIkCMwLnLlD8j7bqjeq6ZSdVkq/V2M+Lb1klTqY+pDiKKWJucu96U8+LKA7kAiYMW"""
477
+ """+3pkkX3SRrb7+kEby5zVNNZA8BBok+8H0YysK4EgoYFEFhEeQlpGhPNwnQvXIdD6gRElAftjre5Tq3CZ"""
478
+ """JOwr+szUfbkTeywpDb4A3HxxPZuD2qW1yfEeouEABmhq5TRw1jIliGxBWXtxb5kKsK0O5DLNNZBQhkjk"""
479
+ """qcGsz0hRlPfOFITQD1fvIo9gmQqTjLus7EX5UJGLHPK4T04IIoq8o6SwkiSmiDXwdRAwKBzS+YsIcH3F"""
480
+ """uit96JJc2+tyU+ABgjNLrr97kfkqTdeYvD7nBsdE+DP5KnUBMnQG7hpRzh8AuXbt3r/MOP5tj9VpvvQn"""
481
+ """98lqZLmjwPLTRk7Lygvx/gLRN1wxA1X+ogAAAABJRU5ErkJggg=="""
482
+ )
483
+
484
+
485
+ ICON_SELECT_ALL = (
486
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAiZJREFUSEuNVe11"""
487
+ """gzAMPJlBmm4Ck6QZwyF8tsAYTSdJNmkG6cONhQk2tkn4kUeELEun04lgPQRA8Y8xGgNBGZP56Dna/nZE"""
488
+ """QLsGnlgg7/bH2eULYUlodUH92dVCiD0It+ooM11I2w8XKKQgXMujzHSghm0qBdG1zGWmy2O/ETsQmjKX"""
489
+ """Z05dWRe0Xf8B0PeUkjqX+fGg35rPriYhKgDnMpe+7SQPOhD7kagMJge+5H7+AZHOgBTSvxFZU8hrGLoY"""
490
+ """mlO61TDskhG/AG7lSb47FZhM3+YsYxeEu7DgruMIId4Krkzb5zr4z8yWV/pu+9ukmGCZiEggO6NNRgWY"""
491
+ """6J0NBHN6oGPMrFgq83ntzMrq4rbvLzpzzTi3yV3PIBW5JC7tKVwBHwLar4Hvn+LAQHQP2bRMR7fJmxMb"""
492
+ """xmMdx++BHdR7txsYgC7CjbhYxJVhdSbGonnQNHad3RyDb4Am3BtPBJfKdJNNL1lCFhbNTT5JWkvq84Yv"""
493
+ """BbXdwCNQOk1mzfmqSSSmyc+nI9aNtSI4cr0J+StTZQ/PDKPHxBg1vcOB0bZNnlxrPdfY8QTGIdoEj8li"""
494
+ """x1mzSFEKgLU8hogtZMtunQKV7ZAmibrwIvKlYvgAMC0cs730q7vRjplmVDPw9kqJcC1MoIff/TuBDsVJ"""
495
+ """nhe5vstrNfS7ZCS9GvdQuPFeYAlhdr220YTYq3H8qYq8nokblWtH063hWsMyD51td/iwSZoYUV6WEOAf"""
496
+ """jjY7LKuzEksAAAAASUVORK5CYII="""
497
+ )
498
+
499
+
500
+ ICON_UNDO = (
501
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAjpJREFUSEuNVv19"""
502
+ """wiAQPdBB4iZmk3YMYg0h/jRjtJ1EN5E92kB7BMIRiJp/QHLc53svMsCHAYB1u8KevvQ2ryz+Gi7zU3a1"""
503
+ """Fj1NKFqlXpIAz6vxBZLsrNszYGDTJjyuYLrQDkO1sfCJgdtG1MvOvNK8vEX+FjrfAnyCgT0AfLUH8V4c"""
504
+ """1pMozFfohhxsZcgcnTPQ7UHsXplryYZUMLmfnVuXedn5q73BpGkF1DkD0EefObWhQHiOuhDA13a6DFfr"""
505
+ """MkdSML/4Pa1/OtL+6DZyUL0QOlBpmcR8NQZIvU2YwqcQbDLVxpjv7njo0jngTcJe1yID13/UVNiiXw61"""
506
+ """Eo2OCIhNQVu8yn/NG+Nc4htjjJKLIBnRaBDMbORQu/IfDFYOl2pj2B0s6NHad3VsbgGSSQVhmPLiK7FQ"""
507
+ """Ya8xiGqEplBeQrI7nTvOuAQON9mIemppaNH8wyLrXUdiJbYCYLr9ELtZCzLAM3BVjHDHhORB7Kh2pqpF"""
508
+ """Lvsg0kmFYzLlctozb3tPubOoIGr2EgtOzxK2zxah4tOw3zC4zi0K9msyW1bWXIpDYHU6d4imqFt+Bhk4"""
509
+ """6AGV4uw8Srfsh/2WA5IURgt1fxS3dAYFR2uBacU4WP5j3tjGZQ52NEq2H138NiQzSD8mcQqTy/4yXMHa"""
510
+ """vWO1I3TKajuTLG/jDI1sHsRW9ecOM3VH0be2xnybLf9SQgRtmjgWupIp5Rpo15hcmBn9BzHJdYE4DyGb"""
511
+ """QSzlh5tBDtO1GdDoBZgutXmR7R8TrUAvyr2/1AAAAABJRU5ErkJggg=="""
512
+ )
513
+
514
+
515
+ ICON_REDO = (
516
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAkJJREFUSEuVVe2B"""
517
+ """oyAQncErRCu5tZJNykAjijlDGclVEjuJhZywgqggmN3zT3QY5uPNmxeE/YMAoKzRvpuft3YEBOX7OCHW"""
518
+ """1yOnrYajjG5BbiUA+iv6RAqG2X1pL3ItcjwnCKIdeDqx25t46qsjwplTOgRdxiAKwD8aEAK03e0JCj8A"""
519
+ """YBgJ5FuSH0J0BN1ir4VIEwm6i3SfZA/If0Br2WKzBEkQcl4UgyGLB9Hb2blBw9HXN5EmKt7JMt4oGro6"""
520
+ """8k+eMCG/QYHG2jJoIZ6ucXs3ZRiTGlhZZDNxEDBYosmHX7sGCam9zDae8Z8DOQkcT4SeFTRfLM4ezFA0"""
521
+ """JjjW+ktKySWQvq1o7y23g5SZg1J3wygFA7sUmWGjs5NreiZE+kvCSzuMEnPOaG/aXGXAH9YcHO4aQpzo"""
522
+ """WpU0iynPart24q4UnJSSvK7KJlzA7Xotbmmi0AQHUENdFpmnVzEWtZ14aV6PBLKW0uFQFMyiiacd/sBK"""
523
+ """msVmGbCo7YQhMLtQT6NiusSvfxokyacOvqpNTHG3zAjtTa8/fIxS5W1V9EvLbnXxSl2V9afgVdp24j6t"""
524
+ """/WmC6cFKel64HChoEO+7BPbcsGKEl16WaUV4VdKH334oZLHBbgqtGbh7eNs1mJglG9Qo/0okPa9o7/L6"""
525
+ """MKjDHF+LbErNd70LWiIIIfUhiwj0jNI8LmG+IAYdLA3ZpasBITV09KXnwS707EOxKehbiL77H9jOY+Sd"""
526
+ """T/esW+8EFIwYXK0Pki0K6khLCFEAbBzpn3b6BQruMyxajTd+AAAAAElFTkSuQmCC"""
527
+ )
@@ -59,33 +59,51 @@ class FindWindowTkText(tk.Text):
59
59
  self.rc_popup_menu.add_command(
60
60
  label=sheet_ops.select_all_label,
61
61
  accelerator=sheet_ops.select_all_accelerator,
62
+ image=sheet_ops.select_all_image,
63
+ compound=sheet_ops.select_all_compound,
62
64
  command=self.select_all,
63
65
  **menu_kwargs,
64
66
  )
65
67
  self.rc_popup_menu.add_command(
66
68
  label=sheet_ops.cut_label,
67
69
  accelerator=sheet_ops.cut_accelerator,
70
+ image=sheet_ops.cut_image,
71
+ compound=sheet_ops.cut_compound,
68
72
  command=self.cut,
69
73
  **menu_kwargs,
70
74
  )
71
75
  self.rc_popup_menu.add_command(
72
76
  label=sheet_ops.copy_label,
73
77
  accelerator=sheet_ops.copy_accelerator,
78
+ image=sheet_ops.copy_image,
79
+ compound=sheet_ops.copy_compound,
74
80
  command=self.copy,
75
81
  **menu_kwargs,
76
82
  )
77
83
  self.rc_popup_menu.add_command(
78
84
  label=sheet_ops.paste_label,
79
85
  accelerator=sheet_ops.paste_accelerator,
86
+ image=sheet_ops.paste_image,
87
+ compound=sheet_ops.paste_compound,
80
88
  command=self.paste,
81
89
  **menu_kwargs,
82
90
  )
83
91
  self.rc_popup_menu.add_command(
84
92
  label=sheet_ops.undo_label,
85
93
  accelerator=sheet_ops.undo_accelerator,
94
+ image=sheet_ops.undo_image,
95
+ compound=sheet_ops.undo_compound,
86
96
  command=self.undo,
87
97
  **menu_kwargs,
88
98
  )
99
+ self.rc_popup_menu.add_command(
100
+ label=sheet_ops.redo_label,
101
+ accelerator=sheet_ops.redo_accelerator,
102
+ image=sheet_ops.redo_image,
103
+ compound=sheet_ops.redo_compound,
104
+ command=self.redo,
105
+ **menu_kwargs,
106
+ )
89
107
 
90
108
  def rc(self, event: Any) -> None:
91
109
  """Show the right-click popup menu."""
@@ -108,8 +126,8 @@ class FindWindowTkText(tk.Text):
108
126
 
109
127
  def select_all(self, event: Any = None) -> Literal["break"]:
110
128
  """Select all text in the widget."""
111
- self.tag_add(tk.SEL, "1.0", tk.END)
112
- self.mark_set(tk.INSERT, tk.END)
129
+ self.tag_add(tk.SEL, "1.0", "end-1c")
130
+ self.mark_set(tk.INSERT, "end-1c")
113
131
  return "break"
114
132
 
115
133
  def cut(self, event: Any = None) -> Literal["break"]:
@@ -135,6 +153,11 @@ class FindWindowTkText(tk.Text):
135
153
  self.event_generate("<KeyRelease>")
136
154
  return "break"
137
155
 
156
+ def redo(self, event: Any = None) -> Literal["break"]:
157
+ self.event_generate(f"<{ctrl_key}-Shift-z>")
158
+ self.event_generate("<KeyRelease>")
159
+ return "break"
160
+
138
161
 
139
162
  class Tooltip(tk.Toplevel):
140
163
  def __init__(self, parent: tk.Misc, text: str, bg: str, fg: str) -> None:
@@ -433,7 +433,7 @@ def push_n(num: int, sorted_seq: Sequence[int]) -> int:
433
433
  def get_menu_kwargs(ops: DotDict[str, Any]) -> DotDict[str, Any]:
434
434
  return DotDict(
435
435
  {
436
- "font": ops.table_font,
436
+ "font": ops.popup_menu_font,
437
437
  "foreground": ops.popup_menu_fg,
438
438
  "background": ops.popup_menu_bg,
439
439
  "activebackground": ops.popup_menu_highlight_bg,
@@ -1109,6 +1109,14 @@ def try_binding(
1109
1109
  return True
1110
1110
 
1111
1111
 
1112
+ def menu_item_exists(menu: tk.Menu, label: str) -> bool:
1113
+ try:
1114
+ menu.index(label)
1115
+ return True
1116
+ except Exception:
1117
+ return False
1118
+
1119
+
1112
1120
  def span_dict(
1113
1121
  from_r: int | None = None,
1114
1122
  from_c: int | None = None,