bootstack 0.2.1__tar.gz → 0.2.3__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 (494) hide show
  1. bootstack-0.2.3/NOTICE +30 -0
  2. {bootstack-0.2.1/src/bootstack.egg-info → bootstack-0.2.3}/PKG-INFO +1 -1
  3. {bootstack-0.2.1 → bootstack-0.2.3}/pyproject.toml +2 -2
  4. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/base.py +3 -1
  5. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +50 -10
  6. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/filter.py +3 -1
  7. bootstack-0.2.3/src/bootstack/widgets/_impl/composites/textarea/redirector.py +138 -0
  8. {bootstack-0.2.1 → bootstack-0.2.3/src/bootstack.egg-info}/PKG-INFO +1 -1
  9. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack.egg-info/SOURCES.txt +1 -0
  10. bootstack-0.2.1/NOTICE +0 -10
  11. {bootstack-0.2.1 → bootstack-0.2.3}/LICENSE +0 -0
  12. {bootstack-0.2.1 → bootstack-0.2.3}/MANIFEST.in +0 -0
  13. {bootstack-0.2.1 → bootstack-0.2.3}/README.md +0 -0
  14. {bootstack-0.2.1 → bootstack-0.2.3}/setup.cfg +0 -0
  15. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/__init__.py +0 -0
  16. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/__main__.py +0 -0
  17. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/__init__.py +0 -0
  18. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/__init__.py +0 -0
  19. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/after.py +0 -0
  20. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/bind.py +0 -0
  21. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/bindtags.py +0 -0
  22. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/busy.py +0 -0
  23. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/clipboard.py +0 -0
  24. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/focus.py +0 -0
  25. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/grab.py +0 -0
  26. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/grid.py +0 -0
  27. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/localization.py +0 -0
  28. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/pack.py +0 -0
  29. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/place.py +0 -0
  30. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/selection.py +0 -0
  31. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/signals.py +0 -0
  32. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/capabilities/winfo.py +0 -0
  33. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/colorutils.py +0 -0
  34. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/exceptions.py +0 -0
  35. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/images.py +0 -0
  36. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/mixins/__init__.py +0 -0
  37. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/mixins/ttk_state.py +0 -0
  38. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/mixins/widget.py +0 -0
  39. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/paths.py +0 -0
  40. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/publisher.py +0 -0
  41. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_core/variables.py +0 -0
  42. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/__init__.py +0 -0
  43. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/app.py +0 -0
  44. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/base_window.py +0 -0
  45. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/events.py +0 -0
  46. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/shortcuts.py +0 -0
  47. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/tk_patch.py +0 -0
  48. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/toplevel.py +0 -0
  49. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/utility.py +0 -0
  50. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/visual_focus.py +0 -0
  51. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/wheel.py +0 -0
  52. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/_runtime/window_utilities.py +0 -0
  53. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/__init__.py +0 -0
  54. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/bootstack.ico +0 -0
  55. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/bootstack.png +0 -0
  56. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/__init__.py +0 -0
  57. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/badge-pill.png +0 -0
  58. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/badge-square.png +0 -0
  59. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/button-compact.png +0 -0
  60. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/button-default.png +0 -0
  61. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  62. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  63. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  64. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  65. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  66. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  67. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  68. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  69. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  70. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  71. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  72. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  73. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/card.png +0 -0
  74. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
  75. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  76. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
  77. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/field.png +0 -0
  78. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
  79. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/input-addon-default.png +0 -0
  80. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/input-compact.png +0 -0
  81. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/input-default.png +0 -0
  82. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/list-item-separated.png +0 -0
  83. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/list-item.png +0 -0
  84. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/listrow-compact.png +0 -0
  85. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/listrow-default.png +0 -0
  86. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/manifest.toml +0 -0
  87. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/menu-item.png +0 -0
  88. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/navitem-compact.png +0 -0
  89. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/navitem-default.png +0 -0
  90. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
  91. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
  92. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
  93. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
  94. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/radiobutton.png +0 -0
  95. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  96. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
  97. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/slider-handle.png +0 -0
  98. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/slider-track-h.png +0 -0
  99. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/slider-track-v.png +0 -0
  100. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/switch-off.png +0 -0
  101. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/switch-on.png +0 -0
  102. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/tab-h.png +0 -0
  103. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/elements/tab-v.png +0 -0
  104. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
  105. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/icons/glyphmap.json +0 -0
  106. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/icons/icon_metrics.json +0 -0
  107. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  108. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +0 -0
  109. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  110. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +0 -0
  111. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  112. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +0 -0
  113. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  114. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +0 -0
  115. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  116. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +0 -0
  117. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  118. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +0 -0
  119. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  120. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +0 -0
  121. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  122. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +0 -0
  123. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  124. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +0 -0
  125. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  126. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +0 -0
  127. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  128. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +0 -0
  129. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  130. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +0 -0
  131. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  132. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +0 -0
  133. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  134. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +0 -0
  135. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  136. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +0 -0
  137. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  138. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +0 -0
  139. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  140. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +0 -0
  141. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  142. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +0 -0
  143. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  144. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +0 -0
  145. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  146. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +0 -0
  147. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  148. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +0 -0
  149. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  150. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +0 -0
  151. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  152. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +0 -0
  153. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/__init__.py +0 -0
  154. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/__main__.py +0 -0
  155. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/add.py +0 -0
  156. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/appicon.py +0 -0
  157. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/build.py +0 -0
  158. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/config.py +0 -0
  159. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/demo.py +0 -0
  160. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/dev.py +0 -0
  161. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/doctor.py +0 -0
  162. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/icons.py +0 -0
  163. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/promote.py +0 -0
  164. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/pyinstaller.py +0 -0
  165. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/run.py +0 -0
  166. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/start.py +0 -0
  167. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/cli/templates/__init__.py +0 -0
  168. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/clipboard.py +0 -0
  169. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/constants.py +0 -0
  170. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/README.md +0 -0
  171. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/__init__.py +0 -0
  172. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/_observable.py +0 -0
  173. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/base.py +0 -0
  174. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/file_source.py +0 -0
  175. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/memory_source.py +0 -0
  176. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/query.py +0 -0
  177. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/readers.py +0 -0
  178. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/sqlite_source.py +0 -0
  179. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/types.py +0 -0
  180. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/data/writers.py +0 -0
  181. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dev/__init__.py +0 -0
  182. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dev/_capture.py +0 -0
  183. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dev/_env.py +0 -0
  184. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dev/_registry.py +0 -0
  185. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dev/_reloader.py +0 -0
  186. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dev/_reset.py +0 -0
  187. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dev/_watcher.py +0 -0
  188. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/__init__.py +0 -0
  189. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/__init__.py +0 -0
  190. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/colorchooser.py +0 -0
  191. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/datedialog.py +0 -0
  192. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/dialog.py +0 -0
  193. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/filterdialog.py +0 -0
  194. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/fontdialog.py +0 -0
  195. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/formdialog.py +0 -0
  196. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/message.py +0 -0
  197. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/query.py +0 -0
  198. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/errors.py +0 -0
  199. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/events/__init__.py +0 -0
  200. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/events/_event.py +0 -0
  201. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/events/_payloads.py +0 -0
  202. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/events/_subscription.py +0 -0
  203. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/i18n/README.md +0 -0
  204. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/i18n/__init__.py +0 -0
  205. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/i18n/catalog.py +0 -0
  206. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/i18n/intl_format.py +0 -0
  207. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/i18n/msgcat.py +0 -0
  208. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/i18n/specs.py +0 -0
  209. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/images.py +0 -0
  210. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/py.typed +0 -0
  211. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/scheduling/__init__.py +0 -0
  212. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/scheduling/_schedule.py +0 -0
  213. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/shortcuts.py +0 -0
  214. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/signals/README.md +0 -0
  215. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/signals/__init__.py +0 -0
  216. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/signals/integration.py +0 -0
  217. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/signals/signal.py +0 -0
  218. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/signals/types.py +0 -0
  219. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/store.py +0 -0
  220. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/streams/__init__.py +0 -0
  221. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/streams/_stream.py +0 -0
  222. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/__init__.py +0 -0
  223. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/__init__.py +0 -0
  224. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/badge.py +0 -0
  225. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/button.py +0 -0
  226. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/buttongroup.py +0 -0
  227. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/calendar.py +0 -0
  228. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/checkbutton.py +0 -0
  229. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/combobox.py +0 -0
  230. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/contextmenu.py +0 -0
  231. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/entry.py +0 -0
  232. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/expander.py +0 -0
  233. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/field.py +0 -0
  234. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/frame.py +0 -0
  235. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/label.py +0 -0
  236. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/labelframe.py +0 -0
  237. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/listview.py +0 -0
  238. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/menubar.py +0 -0
  239. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/menubutton.py +0 -0
  240. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/panedwindow.py +0 -0
  241. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/progressbar.py +0 -0
  242. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/radiobutton.py +0 -0
  243. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/scale.py +0 -0
  244. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/scrollbar.py +0 -0
  245. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/separator.py +0 -0
  246. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/sidenav.py +0 -0
  247. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/sizegrip.py +0 -0
  248. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/spinbox.py +0 -0
  249. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/switch.py +0 -0
  250. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/tabitem.py +0 -0
  251. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/togglegroup.py +0 -0
  252. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/toolbutton.py +0 -0
  253. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/tooltip.py +0 -0
  254. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/treeview.py +0 -0
  255. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders/utils.py +0 -0
  256. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders_tk/__init__.py +0 -0
  257. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/builders_tk/defaults.py +0 -0
  258. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/element.py +0 -0
  259. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/fonts.py +0 -0
  260. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/style.py +0 -0
  261. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/style_builder_base.py +0 -0
  262. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/style_builder_mixed.py +0 -0
  263. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/style_builder_tk.py +0 -0
  264. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/style_builder_ttk.py +0 -0
  265. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/style_resolver.py +0 -0
  266. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/theme.py +0 -0
  267. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/theme_provider.py +0 -0
  268. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/themes/__init__.py +0 -0
  269. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/tk_patch.py +0 -0
  270. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/token_maps.py +0 -0
  271. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/types.py +0 -0
  272. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/typography.py +0 -0
  273. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/style/utility.py +0 -0
  274. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/types.py +0 -0
  275. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/validation/__init__.py +0 -0
  276. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/validation/types.py +0 -0
  277. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/validation/validation_result.py +0 -0
  278. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/validation/validation_rules.py +0 -0
  279. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/__init__.py +0 -0
  280. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/__init__.py +0 -0
  281. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/app_config.py +0 -0
  282. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/choices.py +0 -0
  283. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/container.py +0 -0
  284. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/context.py +0 -0
  285. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/events.py +0 -0
  286. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/field_mixin.py +0 -0
  287. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
  288. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/image_binding.py +0 -0
  289. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/kwargs.py +0 -0
  290. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/navmodel.py +0 -0
  291. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/options.py +0 -0
  292. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/selection_group.py +0 -0
  293. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/window_controls.py +0 -0
  294. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_core/window_menu.py +0 -0
  295. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/__init__.py +0 -0
  296. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
  297. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
  298. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
  299. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +0 -0
  300. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +0 -0
  301. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_parts/textentry_part.py +0 -0
  302. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
  303. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
  304. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
  305. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
  306. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/avatar.py +0 -0
  307. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/buttongroup.py +0 -0
  308. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/calendar.py +0 -0
  309. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/carousel.py +0 -0
  310. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/chart.py +0 -0
  311. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/compositeframe.py +0 -0
  312. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/contextmenu.py +0 -0
  313. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
  314. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
  315. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
  316. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/field.py +0 -0
  317. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/form.py +0 -0
  318. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/gallery.py +0 -0
  319. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
  320. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
  321. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/list/listview.py +0 -0
  322. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
  323. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/menu/model.py +0 -0
  324. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
  325. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
  326. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/meter.py +0 -0
  327. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
  328. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/pagestack.py +0 -0
  329. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/passwordentry.py +0 -0
  330. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
  331. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/picture.py +0 -0
  332. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
  333. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
  334. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
  335. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/scrollview.py +0 -0
  336. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/selectbox.py +0 -0
  337. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
  338. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/content_host.py +0 -0
  339. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/layout.py +0 -0
  340. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +0 -0
  341. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/providers.py +0 -0
  342. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
  343. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/shell.py +0 -0
  344. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/workspace.py +0 -0
  345. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
  346. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
  347. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
  348. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
  349. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/slider/_shared.py +0 -0
  350. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +0 -0
  351. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/slider/slider.py +0 -0
  352. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/spinnerentry.py +0 -0
  353. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
  354. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
  355. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
  356. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
  357. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -0
  358. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +0 -0
  359. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
  360. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
  361. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +0 -0
  362. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/core.py +0 -0
  363. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
  364. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
  365. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
  366. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
  367. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +0 -0
  368. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
  369. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +0 -0
  370. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
  371. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +0 -0
  372. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
  373. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +0 -0
  374. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +0 -0
  375. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
  376. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
  377. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/timeentry.py +0 -0
  378. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
  379. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
  380. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
  381. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/toolbar.py +0 -0
  382. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tooltip.py +0 -0
  383. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
  384. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
  385. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
  386. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
  387. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
  388. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
  389. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +0 -0
  390. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
  391. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/font_mixin.py +0 -0
  392. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +0 -0
  393. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
  394. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
  395. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +0 -0
  396. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
  397. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
  398. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
  399. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
  400. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
  401. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
  402. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
  403. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/combobox.py +0 -0
  404. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
  405. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/flexframe.py +0 -0
  406. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/frame.py +0 -0
  407. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/gridframe.py +0 -0
  408. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
  409. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
  410. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
  411. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/packframe.py +0 -0
  412. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
  413. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
  414. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
  415. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
  416. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
  417. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
  418. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
  419. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
  420. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
  421. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
  422. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/app.py +0 -0
  423. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/appshell.py +0 -0
  424. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/avatar.py +0 -0
  425. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/boolean_controls.py +0 -0
  426. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/button.py +0 -0
  427. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/buttongroup.py +0 -0
  428. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/calendar.py +0 -0
  429. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/card.py +0 -0
  430. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/carousel.py +0 -0
  431. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/chart.py +0 -0
  432. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/codeeditor.py +0 -0
  433. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/contextmenu.py +0 -0
  434. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/datatable.py +0 -0
  435. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/datefield.py +0 -0
  436. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/divider.py +0 -0
  437. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/expander.py +0 -0
  438. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/form.py +0 -0
  439. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/gallery.py +0 -0
  440. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/gauge.py +0 -0
  441. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/grid.py +0 -0
  442. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/groupbox.py +0 -0
  443. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/label.py +0 -0
  444. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/listview.py +0 -0
  445. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/menubutton.py +0 -0
  446. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/numberfield.py +0 -0
  447. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/pagestack.py +0 -0
  448. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/passwordfield.py +0 -0
  449. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/pathfield.py +0 -0
  450. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/picture.py +0 -0
  451. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/progressbar.py +0 -0
  452. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/radio_variants.py +0 -0
  453. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/radiogroup.py +0 -0
  454. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/scrollbar.py +0 -0
  455. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/scrollview.py +0 -0
  456. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/select.py +0 -0
  457. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/selectbutton.py +0 -0
  458. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/sidebar_toggle.py +0 -0
  459. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/sizegrip.py +0 -0
  460. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/slider.py +0 -0
  461. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/spinbox.py +0 -0
  462. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/spinnerfield.py +0 -0
  463. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/splash.py +0 -0
  464. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/splitview.py +0 -0
  465. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/stacks.py +0 -0
  466. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/statusbar.py +0 -0
  467. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/tabs.py +0 -0
  468. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/textarea.py +0 -0
  469. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/textfield.py +0 -0
  470. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/theme_toggle.py +0 -0
  471. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/timefield.py +0 -0
  472. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/toast.py +0 -0
  473. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/togglegroup.py +0 -0
  474. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/toolbar.py +0 -0
  475. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/tooltip.py +0 -0
  476. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/tree.py +0 -0
  477. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/types.py +0 -0
  478. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack/widgets/window.py +0 -0
  479. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack.egg-info/dependency_links.txt +0 -0
  480. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack.egg-info/entry_points.txt +0 -0
  481. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack.egg-info/requires.txt +0 -0
  482. {bootstack-0.2.1 → bootstack-0.2.3}/src/bootstack.egg-info/top_level.txt +0 -0
  483. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_dialog_anchor.py +0 -0
  484. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_events_doc_coverage.py +0 -0
  485. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_hot_reload.py +0 -0
  486. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_images.py +0 -0
  487. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_images_gui.py +0 -0
  488. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_intl_format.py +0 -0
  489. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_navmodel.py +0 -0
  490. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_on_color_contrast.py +0 -0
  491. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_public_surface.py +0 -0
  492. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_store.py +0 -0
  493. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_theme_from_existing.py +0 -0
  494. {bootstack-0.2.1 → bootstack-0.2.3}/tests/test_validation_rules.py +0 -0
bootstack-0.2.3/NOTICE ADDED
@@ -0,0 +1,30 @@
1
+ bootstack
2
+ Copyright (c) 2021 - 2026 Israel Dryer
3
+
4
+ This project is derived from ttkbootstrap
5
+ (https://github.com/israel-dryer/ttkbootstrap),
6
+ Copyright (c) 2021 - 2026 Israel Dryer and ttkbootstrap contributors,
7
+ licensed under the MIT License.
8
+
9
+ The original ttkbootstrap license and copyright notice are preserved above
10
+ in compliance with the MIT License terms.
11
+
12
+ This project also contains code derived from IDLE, part of the CPython
13
+ standard library (https://github.com/python/cpython),
14
+ Copyright (c) 2001-2023 Python Software Foundation; All Rights Reserved,
15
+ licensed under the Python Software Foundation License Agreement, Version 2.
16
+
17
+ src/bootstack/widgets/_impl/composites/textarea/redirector.py
18
+
19
+ is a port of idlelib/redirector.py, carrying its WidgetRedirector and
20
+ OriginalCommand classes and their dispatch logic. Summary of the changes made,
21
+ as the Python Software Foundation License Agreement asks for: the
22
+ OriginalCommand interface was narrowed to three private attributes,
23
+ WidgetRedirector.__repr__ was dropped, the operation name is coerced to a
24
+ string before lookup, the widget reference is retained after close() rather
25
+ than deleted, and type hints and rewritten documentation were added.
26
+
27
+ Other modules in the same package implement designs described in IDLE — the
28
+ Delegator and Percolator chain, UndoDelegator, the editor sidebar, and
29
+ parenmatch's flash-and-restore highlighting — but share no substantial code
30
+ with it and are original implementations.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: Build desktop GUI apps in pure Python and ship them as a standalone executable — built on Tk, no Tkinter boilerplate.
5
5
  Author-email: Israel Dryer <israel.dryer@gmail.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "bootstack"
7
- version = "0.2.1"
7
+ version = "0.2.3"
8
8
  description = "Build desktop GUI apps in pure Python and ship them as a standalone executable — built on Tk, no Tkinter boilerplate."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -114,7 +114,7 @@ where = ["src"]
114
114
  ]
115
115
 
116
116
  [tool.bumpversion]
117
- current_version = "0.2.1"
117
+ current_version = "0.2.3"
118
118
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
119
119
  serialize = [
120
120
  "{major}.{minor}.{patch}{pre}{pre_n}",
@@ -282,7 +282,9 @@ class PublicWidgetBase:
282
282
  Example:
283
283
  .. code-block:: python
284
284
 
285
- widget.emit("change", data=bs.events.ChangeEvent(value=new_value))
285
+ from bootstack.events import ChangeEvent
286
+
287
+ field.emit("change", data=ChangeEvent(value=new_value))
286
288
  """
287
289
  sequence = resolve_event(self, str(event))
288
290
 
@@ -29,7 +29,7 @@ from bootstack.style.style import get_style
29
29
  from bootstack.data.sqlite_source import SqliteDataSource
30
30
  from bootstack.data.query import col, any_of, all_of
31
31
  from bootstack.widgets._impl.primitives.button import Button
32
- from bootstack._runtime.utility import bind_right_click
32
+ from bootstack._runtime.utility import bind_right_click, debug_log_exception
33
33
  from bootstack.widgets._impl.composites.contextmenu import ContextMenu
34
34
  from bootstack.widgets._impl.composites.tooltip import ToolTip
35
35
  from bootstack.widgets._impl.composites.dropdownbutton import DropdownButton
@@ -1148,8 +1148,8 @@ class TableView(Frame):
1148
1148
  self._tree.bind("<Button-1>", self._on_header_click)
1149
1149
  self._tree.bind("<<TreeviewSelect>>", self._on_selection_event)
1150
1150
  # Keep group-header chevrons in sync with their open/closed state.
1151
- self._tree.bind("<<TreeviewOpen>>", self._refresh_group_chevrons, add="+")
1152
- self._tree.bind("<<TreeviewClose>>", self._refresh_group_chevrons, add="+")
1151
+ self._tree.bind("<<TreeviewOpen>>", self._refresh_group_chevrons_deferred, add="+")
1152
+ self._tree.bind("<<TreeviewClose>>", self._refresh_group_chevrons_deferred, add="+")
1153
1153
  self._tree.bind("<ButtonRelease-1>", self._on_row_click_event)
1154
1154
  # Escape clears the selection (also reachable in single-select mode, where
1155
1155
  # clicking can't return to an empty selection). Bound on the tree widget
@@ -1158,8 +1158,10 @@ class TableView(Frame):
1158
1158
  self._tree.bind("<Escape>", lambda _e: self.deselect_all(), add="+")
1159
1159
  if self._context_menus != "none":
1160
1160
  bind_right_click(self._tree, self._on_tree_context)
1161
- if self._editing['updating']:
1162
- self._tree.bind("<Double-1>", self._on_row_double_click)
1161
+ # Bound unconditionally: `on_row_double_click` is public API and does not
1162
+ # depend on editing. The handler itself gates the built-in edit dialog on
1163
+ # `_editing['updating']`, so editing behavior is unchanged.
1164
+ self._tree.bind("<Double-1>", self._on_row_double_click)
1163
1165
  # Track resize events to rebalance grouped layouts
1164
1166
  self._tree.bind("<Configure>", self._on_tree_configure)
1165
1167
 
@@ -1690,9 +1692,12 @@ class TableView(Frame):
1690
1692
  col_idx = 0
1691
1693
  # Right-click does not alter the selection (left-click owns that); it
1692
1694
  # only records which row the menu targets and opens the menu there.
1693
- self._context_iid = iid or None
1694
- if not iid:
1695
+ # A group header is a real tree item but holds no record — it is absent
1696
+ # from `_row_map` — so it targets nothing, exactly like empty space.
1697
+ if not iid or iid not in self._row_map:
1698
+ self._context_iid = None
1695
1699
  return # empty space or a group-header row — no row menu
1700
+ self._context_iid = iid
1696
1701
  rec = self._row_map.get(iid, {})
1697
1702
  self.event_generate("<<RowRightClick>>", data=RowEvent(record=self._public_record(rec), id=self._record_id(rec)))
1698
1703
  self._row_menu_col = col_idx
@@ -1704,8 +1709,8 @@ class TableView(Frame):
1704
1709
  if region == "heading":
1705
1710
  return
1706
1711
  iid = self._tree.identify_row(event.y)
1707
- if not iid:
1708
- return
1712
+ if not iid or iid not in self._row_map:
1713
+ return # empty space or a group-header row (no record)
1709
1714
  rec = self._row_map.get(iid, {})
1710
1715
  self.event_generate("<<RowDoubleClick>>", data=RowEvent(record=self._public_record(rec), id=self._record_id(rec)))
1711
1716
  if self._editing['updating']:
@@ -2343,6 +2348,19 @@ class TableView(Frame):
2343
2348
  except Exception:
2344
2349
  pass
2345
2350
 
2351
+ def _refresh_group_chevrons_deferred(self, _event=None) -> None:
2352
+ """Refresh chevrons once Tk has applied the item's new open state.
2353
+
2354
+ The toolkit reports an expand *before* it records it, so reading the
2355
+ state inside the notification paints the previous chevron. Deferring to
2356
+ the next idle point reads the settled state. Scheduled on the root so
2357
+ the pending callback outlives any widget being torn down.
2358
+ """
2359
+ try:
2360
+ self._root().after_idle(self._refresh_group_chevrons)
2361
+ except Exception:
2362
+ pass
2363
+
2346
2364
  def _refresh_group_chevrons(self, _event=None) -> None:
2347
2365
  """Sync every group header's chevron to its current open/closed state."""
2348
2366
  if not self._group_by_key:
@@ -2845,6 +2863,23 @@ class TableView(Frame):
2845
2863
  """
2846
2864
  return self._selection_markers_active()
2847
2865
 
2866
+ def _take_click_focus(self, iid) -> None:
2867
+ """Give the body keyboard focus, and point it at the clicked row.
2868
+
2869
+ Both branches that call this answer the click themselves and stop it,
2870
+ which also stops the built-in handling that would otherwise have done
2871
+ this. Without it a click leaves the keyboard aimed somewhere else, so
2872
+ the row the user just clicked is not the row the arrow keys move from.
2873
+ """
2874
+ try:
2875
+ self._tree.focus_set()
2876
+ if iid:
2877
+ self._tree.focus(iid)
2878
+ except Exception:
2879
+ # Silence here would restore the very bug this method exists to
2880
+ # fix, with nothing to show for it on any channel.
2881
+ debug_log_exception("could not move keyboard focus to the clicked row")
2882
+
2848
2883
  def _on_header_click(self, event):
2849
2884
  """Handle left-click: header sorting, or toggle-select with checkboxes."""
2850
2885
  # A left-click on the tree dismisses an open context menu. Do it
@@ -2873,20 +2908,25 @@ class TableView(Frame):
2873
2908
  # fall through to normal selection below.
2874
2909
  iid = self._tree.identify_row(event.y)
2875
2910
  if iid and self._tree.get_children(iid):
2911
+ self._take_click_focus(iid)
2876
2912
  self._toggle_group_open(iid)
2877
2913
  return "break"
2878
2914
 
2879
2915
  # Body click with checkboxes showing: treat the list like a checklist —
2880
2916
  # a plain click toggles the row in/out of the selection (no modifier),
2881
2917
  # and "break" suppresses ttk's default replace-the-selection behavior.
2918
+ # Only a click that lands on a row earns that "break" — a click on a
2919
+ # column separator reports no row, and stopping it there would kill the
2920
+ # drag that resizes the column.
2882
2921
  if self._toggle_select_active():
2883
2922
  iid = self._tree.identify_row(event.y)
2884
2923
  if iid:
2924
+ self._take_click_focus(iid)
2885
2925
  if iid in self._tree.selection():
2886
2926
  self._tree.selection_remove(iid)
2887
2927
  else:
2888
2928
  self._tree.selection_add(iid)
2889
- return "break"
2929
+ return "break"
2890
2930
  return None
2891
2931
 
2892
2932
  def _filter_header_column(self) -> None:
@@ -12,7 +12,9 @@ which are clean Python callables, not raw Tcl strings.
12
12
  from __future__ import annotations
13
13
 
14
14
  import tkinter as tk
15
- from idlelib.redirector import WidgetRedirector
15
+ from bootstack.widgets._impl.composites.textarea.redirector import (
16
+ WidgetRedirector,
17
+ )
16
18
  from typing import TYPE_CHECKING
17
19
 
18
20
  if TYPE_CHECKING:
@@ -0,0 +1,138 @@
1
+ """Tk command interception for the edit filter chain.
2
+
3
+ Port of IDLE's `idlelib/redirector.py`. The rest of this package already ports
4
+ that design rather than importing it — `filter.py` adapts Delegator and
5
+ Percolator, `undo.py` adapts UndoDelegator, `sidebar.py` and
6
+ `extensions/line_numbers.py` port the sidebar — and this was the one piece left
7
+ as a live import. `idlelib` is standard library, but not every Python build
8
+ ships it, so that import made the whole framework unimportable on those builds
9
+ rather than degrading the code editor.
10
+
11
+ A Tk widget is backed by a Tcl command named after the widget's path, and every
12
+ operation on the widget goes through it — including the ones Tk's own key
13
+ bindings perform, which never reach Python at all. Renaming that command and
14
+ putting a dispatcher in its place is what lets the filter chain see an insert
15
+ that came from a keystroke, which is the whole reason this exists.
16
+ """
17
+ from __future__ import annotations
18
+
19
+ import tkinter as tk
20
+ from typing import Any, Callable
21
+
22
+
23
+ class WidgetRedirector:
24
+ """Intercepts operations on a Tk widget, including the toolkit's own.
25
+
26
+ Renames the widget's Tcl command out of the way and installs a dispatcher
27
+ under the original name. Registered operations are routed to a Python
28
+ callable; everything else passes straight through to the renamed command.
29
+
30
+ Only one redirector can exist for a given widget — the rename fails once
31
+ the name it renames to is taken.
32
+
33
+ Args:
34
+ widget: The widget whose operations are to be intercepted.
35
+ """
36
+
37
+ def __init__(self, widget: tk.Misc) -> None:
38
+ self._operations: dict[str, Callable[..., Any]] = {}
39
+ self.widget = widget
40
+ self.tk = widget.tk
41
+ path = widget._w
42
+ self.orig = path + "_orig"
43
+ self.tk.call("rename", path, self.orig)
44
+ self.tk.createcommand(path, self.dispatch)
45
+
46
+ def register(
47
+ self, operation: str, function: Callable[..., Any]
48
+ ) -> OriginalCommand:
49
+ """Route `operation` to `function`, returning a way to call the original.
50
+
51
+ The function is also set on the widget, so a call written in Python —
52
+ `text.insert(...)` — is intercepted the same way a keystroke is.
53
+ Registering a second function for the same operation replaces the first
54
+ in both places.
55
+
56
+ Args:
57
+ operation: Name of the widget operation, such as `insert`.
58
+ function: What to call in its place. It receives the operation's
59
+ arguments, and is handed the returned callable to pass the call
60
+ on with.
61
+ """
62
+ self._operations[operation] = function
63
+ setattr(self.widget, operation, function)
64
+ return OriginalCommand(self, operation)
65
+
66
+ def unregister(self, operation: str) -> Callable[..., Any] | None:
67
+ """Stop routing `operation`, returning whatever was handling it.
68
+
69
+ Returns None if the operation was not registered. Dropping the widget
70
+ attribute that `register` set unmasks the widget's own method again.
71
+
72
+ Args:
73
+ operation: Name of the widget operation to stop intercepting.
74
+ """
75
+ function = self._operations.pop(operation, None)
76
+ if function is None:
77
+ return None
78
+ try:
79
+ delattr(self.widget, operation)
80
+ except AttributeError:
81
+ pass
82
+ return function
83
+
84
+ def dispatch(self, operation, *args):
85
+ """Handle one call to the widget, invoked from Tcl.
86
+
87
+ A registered operation goes to its function and does not continue on to
88
+ the widget — the function decides whether to pass the call along, using
89
+ the callable it was given at registration. Everything else goes
90
+ straight through.
91
+
92
+ Args:
93
+ operation: The operation being performed. Tcl may hand this over as
94
+ its own object type rather than a string.
95
+ args: The operation's arguments, exactly as Tcl passed them.
96
+ """
97
+ operation = str(operation)
98
+ function = self._operations.get(operation)
99
+ try:
100
+ if function is not None:
101
+ return function(*args)
102
+ return self.tk.call((self.orig, operation) + args)
103
+ except tk.TclError:
104
+ # What the toolkit itself does with a failed widget command. The
105
+ # caller here is Tcl, which has nowhere useful to put an exception.
106
+ return ""
107
+
108
+ def close(self) -> None:
109
+ """Undo the interception and restore the widget's own Tcl command."""
110
+ for operation in list(self._operations):
111
+ self.unregister(operation)
112
+ path = self.widget._w
113
+ self.tk.deletecommand(path)
114
+ self.tk.call("rename", self.orig, path)
115
+
116
+
117
+ class OriginalCommand:
118
+ """The widget operation a redirector displaced, as a plain callable.
119
+
120
+ Returned by `WidgetRedirector.register` so a registered function can pass
121
+ the call on to the widget after inspecting or changing it. Calling this
122
+ reaches the widget directly and does not re-enter the chain.
123
+
124
+ Args:
125
+ redirector: The redirector that displaced the operation.
126
+ operation: Name of the displaced operation.
127
+ """
128
+
129
+ def __init__(self, redirector: WidgetRedirector, operation: str) -> None:
130
+ self._operation = operation
131
+ self._call = redirector.tk.call
132
+ self._target = (redirector.orig, operation)
133
+
134
+ def __call__(self, *args):
135
+ return self._call(self._target + args)
136
+
137
+ def __repr__(self) -> str:
138
+ return f"OriginalCommand({self._operation!r})"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: Build desktop GUI apps in pure Python and ship them as a standalone executable — built on Tk, no Tkinter boilerplate.
5
5
  Author-email: Israel Dryer <israel.dryer@gmail.com>
6
6
  License-Expression: MIT
@@ -426,6 +426,7 @@ src/bootstack/widgets/_impl/composites/textarea/core.py
426
426
  src/bootstack/widgets/_impl/composites/textarea/decoration.py
427
427
  src/bootstack/widgets/_impl/composites/textarea/diff.py
428
428
  src/bootstack/widgets/_impl/composites/textarea/filter.py
429
+ src/bootstack/widgets/_impl/composites/textarea/redirector.py
429
430
  src/bootstack/widgets/_impl/composites/textarea/search_overlay.py
430
431
  src/bootstack/widgets/_impl/composites/textarea/sidebar.py
431
432
  src/bootstack/widgets/_impl/composites/textarea/style_registry.py
bootstack-0.2.1/NOTICE DELETED
@@ -1,10 +0,0 @@
1
- bootstack
2
- Copyright (c) 2021 - 2026 Israel Dryer
3
-
4
- This project is derived from ttkbootstrap
5
- (https://github.com/israel-dryer/ttkbootstrap),
6
- Copyright (c) 2021 - 2026 Israel Dryer and ttkbootstrap contributors,
7
- licensed under the MIT License.
8
-
9
- The original ttkbootstrap license and copyright notice are preserved above
10
- in compliance with the MIT License terms.
File without changes
File without changes
File without changes
File without changes