bootstack 0.4.4__tar.gz → 0.4.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 (480) hide show
  1. {bootstack-0.4.4/src/bootstack.egg-info → bootstack-0.4.5}/PKG-INFO +1 -1
  2. {bootstack-0.4.4 → bootstack-0.4.5}/pyproject.toml +2 -2
  3. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/capture.py +1 -3
  4. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/toplevel.py +1 -2
  5. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/datedialog.py +1 -2
  6. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/dialog.py +4 -6
  7. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/query.py +2 -2
  8. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/i18n/README.md +0 -1
  9. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/i18n/msgcat.py +8 -72
  10. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/navmodel.py +0 -2
  11. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/contextmenu.py +14 -0
  12. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/selectbox.py +12 -0
  13. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/select.py +1 -2
  14. {bootstack-0.4.4 → bootstack-0.4.5/src/bootstack.egg-info}/PKG-INFO +1 -1
  15. {bootstack-0.4.4 → bootstack-0.4.5}/LICENSE +0 -0
  16. {bootstack-0.4.4 → bootstack-0.4.5}/MANIFEST.in +0 -0
  17. {bootstack-0.4.4 → bootstack-0.4.5}/NOTICE +0 -0
  18. {bootstack-0.4.4 → bootstack-0.4.5}/README.md +0 -0
  19. {bootstack-0.4.4 → bootstack-0.4.5}/setup.cfg +0 -0
  20. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/__init__.py +0 -0
  21. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/__main__.py +0 -0
  22. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/__init__.py +0 -0
  23. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/exceptions.py +0 -0
  24. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/images.py +0 -0
  25. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/localization.py +0 -0
  26. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/mixins/__init__.py +0 -0
  27. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/mixins/ttk_state.py +0 -0
  28. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/mixins/widget.py +0 -0
  29. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/paths.py +0 -0
  30. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/signal_binding.py +0 -0
  31. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_core/variables.py +0 -0
  32. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/__init__.py +0 -0
  33. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/app.py +0 -0
  34. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/base_window.py +0 -0
  35. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/events.py +0 -0
  36. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/grab.py +0 -0
  37. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/shortcuts.py +0 -0
  38. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/tk_patch.py +0 -0
  39. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/utility.py +0 -0
  40. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/visual_focus.py +0 -0
  41. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/wheel.py +0 -0
  42. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/_runtime/window_utilities.py +0 -0
  43. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/__init__.py +0 -0
  44. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/bootstack.ico +0 -0
  45. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/bootstack.png +0 -0
  46. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/__init__.py +0 -0
  47. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/badge-pill.png +0 -0
  48. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/badge-square.png +0 -0
  49. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/button-compact.png +0 -0
  50. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/button-default.png +0 -0
  51. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  52. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  53. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  54. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  55. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  56. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  57. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  58. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  59. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  60. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  61. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  62. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  63. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/card.png +0 -0
  64. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
  65. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  66. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
  67. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/field.png +0 -0
  68. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
  69. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/input-addon-default.png +0 -0
  70. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/input-compact.png +0 -0
  71. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/input-default.png +0 -0
  72. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/list-item-separated.png +0 -0
  73. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/list-item.png +0 -0
  74. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/listrow-compact.png +0 -0
  75. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/listrow-default.png +0 -0
  76. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/manifest.toml +0 -0
  77. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/menu-item.png +0 -0
  78. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/navitem-compact.png +0 -0
  79. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/navitem-default.png +0 -0
  80. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
  81. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
  82. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
  83. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
  84. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/radiobutton.png +0 -0
  85. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  86. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
  87. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/slider-handle.png +0 -0
  88. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/slider-track-h.png +0 -0
  89. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/slider-track-v.png +0 -0
  90. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/switch-off.png +0 -0
  91. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/switch-on.png +0 -0
  92. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/tab-h.png +0 -0
  93. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/elements/tab-v.png +0 -0
  94. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
  95. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/icons/glyphmap.json +0 -0
  96. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/icons/icon_metrics.json +0 -0
  97. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  98. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +0 -0
  99. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  100. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +0 -0
  101. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  102. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +0 -0
  103. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  104. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +0 -0
  105. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  106. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +0 -0
  107. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  108. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +0 -0
  109. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  110. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +0 -0
  111. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  112. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +0 -0
  113. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  114. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +0 -0
  115. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  116. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +0 -0
  117. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  118. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +0 -0
  119. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  120. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +0 -0
  121. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  122. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +0 -0
  123. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  124. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +0 -0
  125. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  126. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +0 -0
  127. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  128. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +0 -0
  129. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  130. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +0 -0
  131. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  132. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +0 -0
  133. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  134. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +0 -0
  135. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  136. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +0 -0
  137. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  138. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +0 -0
  139. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  140. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +0 -0
  141. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  142. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +0 -0
  143. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/__init__.py +0 -0
  144. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/__main__.py +0 -0
  145. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/add.py +0 -0
  146. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/appicon.py +0 -0
  147. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/build.py +0 -0
  148. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/config.py +0 -0
  149. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/demo.py +0 -0
  150. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/dev.py +0 -0
  151. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/doctor.py +0 -0
  152. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/icons.py +0 -0
  153. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/promote.py +0 -0
  154. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/pyinstaller.py +0 -0
  155. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/run.py +0 -0
  156. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/start.py +0 -0
  157. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/cli/templates/__init__.py +0 -0
  158. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/clipboard.py +0 -0
  159. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/constants.py +0 -0
  160. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/README.md +0 -0
  161. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/__init__.py +0 -0
  162. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/_observable.py +0 -0
  163. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/base.py +0 -0
  164. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/file_source.py +0 -0
  165. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/memory_source.py +0 -0
  166. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/query.py +0 -0
  167. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/readers.py +0 -0
  168. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/sqlite_source.py +0 -0
  169. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/types.py +0 -0
  170. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/data/writers.py +0 -0
  171. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dev/__init__.py +0 -0
  172. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dev/_capture.py +0 -0
  173. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dev/_env.py +0 -0
  174. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dev/_registry.py +0 -0
  175. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dev/_reloader.py +0 -0
  176. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dev/_reset.py +0 -0
  177. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dev/_watcher.py +0 -0
  178. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/__init__.py +0 -0
  179. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/__init__.py +0 -0
  180. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/colorchooser.py +0 -0
  181. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/filterdialog.py +0 -0
  182. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/fontdialog.py +0 -0
  183. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/formdialog.py +0 -0
  184. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/message.py +0 -0
  185. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/errors.py +0 -0
  186. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/events/__init__.py +0 -0
  187. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/events/_event.py +0 -0
  188. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/events/_payloads.py +0 -0
  189. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/events/_subscription.py +0 -0
  190. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/i18n/__init__.py +0 -0
  191. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/i18n/catalog.py +0 -0
  192. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/i18n/intl_format.py +0 -0
  193. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/i18n/specs.py +0 -0
  194. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/images.py +0 -0
  195. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/py.typed +0 -0
  196. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/scheduling/__init__.py +0 -0
  197. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/scheduling/_schedule.py +0 -0
  198. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/shortcuts.py +0 -0
  199. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/signals/README.md +0 -0
  200. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/signals/__init__.py +0 -0
  201. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/signals/integration.py +0 -0
  202. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/signals/signal.py +0 -0
  203. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/signals/types.py +0 -0
  204. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/store.py +0 -0
  205. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/streams/__init__.py +0 -0
  206. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/streams/_stream.py +0 -0
  207. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/__init__.py +0 -0
  208. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/__init__.py +0 -0
  209. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/badge.py +0 -0
  210. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/button.py +0 -0
  211. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/buttongroup.py +0 -0
  212. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/calendar.py +0 -0
  213. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/checkbutton.py +0 -0
  214. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/combobox.py +0 -0
  215. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/contextmenu.py +0 -0
  216. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/entry.py +0 -0
  217. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/expander.py +0 -0
  218. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/field.py +0 -0
  219. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/frame.py +0 -0
  220. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/label.py +0 -0
  221. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/labelframe.py +0 -0
  222. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/listview.py +0 -0
  223. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/menubar.py +0 -0
  224. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/menubutton.py +0 -0
  225. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/panedwindow.py +0 -0
  226. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/progressbar.py +0 -0
  227. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/radiobutton.py +0 -0
  228. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/scale.py +0 -0
  229. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/scrollbar.py +0 -0
  230. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/separator.py +0 -0
  231. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/sidenav.py +0 -0
  232. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/sizegrip.py +0 -0
  233. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/spinbox.py +0 -0
  234. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/switch.py +0 -0
  235. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/tabitem.py +0 -0
  236. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/togglegroup.py +0 -0
  237. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/toolbutton.py +0 -0
  238. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/tooltip.py +0 -0
  239. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/treeview.py +0 -0
  240. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders/utils.py +0 -0
  241. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders_tk/__init__.py +0 -0
  242. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/builders_tk/defaults.py +0 -0
  243. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/element.py +0 -0
  244. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/fonts.py +0 -0
  245. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/style.py +0 -0
  246. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/style_builder_base.py +0 -0
  247. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/style_builder_mixed.py +0 -0
  248. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/style_builder_tk.py +0 -0
  249. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/style_builder_ttk.py +0 -0
  250. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/style_resolver.py +0 -0
  251. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/theme.py +0 -0
  252. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/theme_provider.py +0 -0
  253. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/themes/__init__.py +0 -0
  254. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/tk_patch.py +0 -0
  255. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/token_maps.py +0 -0
  256. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/types.py +0 -0
  257. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/typography.py +0 -0
  258. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/style/utility.py +0 -0
  259. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/types.py +0 -0
  260. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/validation/__init__.py +0 -0
  261. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/validation/types.py +0 -0
  262. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/validation/validation_result.py +0 -0
  263. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/validation/validation_rules.py +0 -0
  264. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/__init__.py +0 -0
  265. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/__init__.py +0 -0
  266. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/app_config.py +0 -0
  267. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/base.py +0 -0
  268. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/choices.py +0 -0
  269. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/container.py +0 -0
  270. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/context.py +0 -0
  271. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/events.py +0 -0
  272. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/field_mixin.py +0 -0
  273. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
  274. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/image_binding.py +0 -0
  275. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/kwargs.py +0 -0
  276. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/options.py +0 -0
  277. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/selection_group.py +0 -0
  278. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/window_controls.py +0 -0
  279. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_core/window_menu.py +0 -0
  280. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/__init__.py +0 -0
  281. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
  282. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
  283. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
  284. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +0 -0
  285. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +0 -0
  286. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_parts/textentry_part.py +0 -0
  287. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
  288. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
  289. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
  290. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
  291. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/avatar.py +0 -0
  292. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/buttongroup.py +0 -0
  293. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/calendar.py +0 -0
  294. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/carousel.py +0 -0
  295. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/chart.py +0 -0
  296. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/compositeframe.py +0 -0
  297. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
  298. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
  299. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
  300. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/field.py +0 -0
  301. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/form.py +0 -0
  302. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/gallery.py +0 -0
  303. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
  304. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
  305. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/list/listview.py +0 -0
  306. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
  307. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/menu/model.py +0 -0
  308. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
  309. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
  310. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/meter.py +0 -0
  311. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
  312. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/pagestack.py +0 -0
  313. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/passwordentry.py +0 -0
  314. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
  315. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/picture.py +0 -0
  316. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
  317. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
  318. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
  319. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/scrollview.py +0 -0
  320. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
  321. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/content_host.py +0 -0
  322. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/layout.py +0 -0
  323. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +0 -0
  324. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/providers.py +0 -0
  325. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
  326. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/shell.py +0 -0
  327. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/workspace.py +0 -0
  328. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
  329. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
  330. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
  331. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
  332. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/slider/_shared.py +0 -0
  333. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +0 -0
  334. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/slider/slider.py +0 -0
  335. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/spinnerentry.py +0 -0
  336. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
  337. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +0 -0
  338. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
  339. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
  340. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
  341. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -0
  342. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +0 -0
  343. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
  344. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
  345. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +0 -0
  346. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/core.py +0 -0
  347. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
  348. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
  349. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
  350. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
  351. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +0 -0
  352. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
  353. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +0 -0
  354. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
  355. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/filter.py +0 -0
  356. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/redirector.py +0 -0
  357. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +0 -0
  358. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
  359. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +0 -0
  360. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +0 -0
  361. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
  362. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
  363. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/timeentry.py +0 -0
  364. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
  365. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
  366. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
  367. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/toolbar.py +0 -0
  368. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tooltip.py +0 -0
  369. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
  370. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
  371. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
  372. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
  373. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
  374. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
  375. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +0 -0
  376. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
  377. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/font_mixin.py +0 -0
  378. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +0 -0
  379. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
  380. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
  381. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +0 -0
  382. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
  383. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
  384. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
  385. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
  386. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
  387. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
  388. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
  389. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/combobox.py +0 -0
  390. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
  391. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/flexframe.py +0 -0
  392. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/frame.py +0 -0
  393. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/gridframe.py +0 -0
  394. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
  395. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
  396. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
  397. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/packframe.py +0 -0
  398. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
  399. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
  400. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
  401. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
  402. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
  403. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
  404. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
  405. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
  406. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
  407. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
  408. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/app.py +0 -0
  409. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/appshell.py +0 -0
  410. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/avatar.py +0 -0
  411. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/boolean_controls.py +0 -0
  412. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/button.py +0 -0
  413. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/buttongroup.py +0 -0
  414. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/calendar.py +0 -0
  415. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/card.py +0 -0
  416. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/carousel.py +0 -0
  417. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/chart.py +0 -0
  418. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/codeeditor.py +0 -0
  419. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/contextmenu.py +0 -0
  420. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/datatable.py +0 -0
  421. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/datefield.py +0 -0
  422. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/divider.py +0 -0
  423. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/expander.py +0 -0
  424. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/form.py +0 -0
  425. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/gallery.py +0 -0
  426. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/gauge.py +0 -0
  427. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/grid.py +0 -0
  428. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/groupbox.py +0 -0
  429. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/label.py +0 -0
  430. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/listview.py +0 -0
  431. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/menubutton.py +0 -0
  432. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/numberfield.py +0 -0
  433. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/pagestack.py +0 -0
  434. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/passwordfield.py +0 -0
  435. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/pathfield.py +0 -0
  436. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/picture.py +0 -0
  437. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/progressbar.py +0 -0
  438. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/radio_variants.py +0 -0
  439. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/radiogroup.py +0 -0
  440. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/scrollbar.py +0 -0
  441. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/scrollview.py +0 -0
  442. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/selectbutton.py +0 -0
  443. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/sidebar_toggle.py +0 -0
  444. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/sizegrip.py +0 -0
  445. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/slider.py +0 -0
  446. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/spinbox.py +0 -0
  447. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/spinnerfield.py +0 -0
  448. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/splash.py +0 -0
  449. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/splitview.py +0 -0
  450. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/stacks.py +0 -0
  451. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/statusbar.py +0 -0
  452. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/tabs.py +0 -0
  453. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/textarea.py +0 -0
  454. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/textfield.py +0 -0
  455. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/theme_toggle.py +0 -0
  456. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/timefield.py +0 -0
  457. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/toast.py +0 -0
  458. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/togglegroup.py +0 -0
  459. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/toolbar.py +0 -0
  460. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/tooltip.py +0 -0
  461. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/tree.py +0 -0
  462. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/types.py +0 -0
  463. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack/widgets/window.py +0 -0
  464. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack.egg-info/SOURCES.txt +0 -0
  465. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack.egg-info/dependency_links.txt +0 -0
  466. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack.egg-info/entry_points.txt +0 -0
  467. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack.egg-info/requires.txt +0 -0
  468. {bootstack-0.4.4 → bootstack-0.4.5}/src/bootstack.egg-info/top_level.txt +0 -0
  469. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_dialog_anchor.py +0 -0
  470. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_events_doc_coverage.py +0 -0
  471. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_hot_reload.py +0 -0
  472. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_images.py +0 -0
  473. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_images_gui.py +0 -0
  474. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_intl_format.py +0 -0
  475. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_navmodel.py +0 -0
  476. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_on_color_contrast.py +0 -0
  477. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_public_surface.py +0 -0
  478. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_store.py +0 -0
  479. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_theme_from_existing.py +0 -0
  480. {bootstack-0.4.4 → bootstack-0.4.5}/tests/test_validation_rules.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.4.4
3
+ Version: 0.4.5
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.4.4"
7
+ version = "0.4.5"
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.4.4"
117
+ current_version = "0.4.5"
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}",
@@ -223,9 +223,7 @@ def settle(tk_widget, seconds: float) -> None:
223
223
  real click re-enters the handler there — confirmed by hand, since a
224
224
  synthesized click cannot test this. Measured on Tk 8.6.17 in plain
225
225
  tkinter, so it is the toolkit rather than anything above it. X11 and Win32
226
- map the window and are expected to honor it;
227
- `development/probe_429_busy_during_settle.py` reports which a given box
228
- does.
226
+ map the window and are expected to honor it.
229
227
 
230
228
  The wait dispatches either way. A correct picture is worth more than a
231
229
  stray click: without dispatching, the capture reads pixels that are simply
@@ -262,8 +262,7 @@ class Toplevel(BaseWindow, WidgetCapabilitiesMixin, tkinter.Toplevel):
262
262
  later `destroy()` is an ordinary path, and pairing on the blocking one
263
263
  alone would leave it unfixed. Measured before choosing it: the restore
264
264
  wins its race with Tk's own grab release, so `grab_current()` reads the
265
- opener again once the dust settles
266
- (`development/probe_444_grab_restore_ordering.py`).
265
+ opener again once the dust settles.
267
266
  """
268
267
  if self._grab_restore_bound:
269
268
  return
@@ -351,8 +351,7 @@ class DateDialog:
351
351
 
352
352
  Unlike `_confirm`, this releases no grab of its own. It does not need
353
353
  to: `Dialog` destroys the toplevel, and Tk releases a grab held by a
354
- window when that window is destroyed (measured — see
355
- `development/probe_437_review2_fixes.py`). `_confirm` keeps its
354
+ window when that window is destroyed (measured). `_confirm` keeps its
356
355
  `grab_release()` because it destroys the window itself, where the call
357
356
  is at least self-documenting.
358
357
  """
@@ -211,9 +211,8 @@ def _key_was_consumed(widget: Any, keysym: str) -> bool:
211
211
 
212
212
  In both cases a DISABLED widget is the exception: its class binding runs
213
213
  but does nothing — `invoke` is a no-op on a disabled button, and
214
- `tk::TextInsert` returns early on a disabled text (both measured,
215
- `development/probe_441_key_already_handled.py`). Nothing answered the key,
216
- so the default button should still get it. Standing down there would leave
214
+ `tk::TextInsert` returns early on a disabled text (both measured). Nothing
215
+ answered the key, so the default button should still get it. Standing down there would leave
217
216
  the keyboard dead for the whole dialog.
218
217
 
219
218
  ⚠ THE KEY MATTERS, NOT ONLY THE WIDGET — which is why `keysym` is required
@@ -712,7 +711,7 @@ class Dialog:
712
711
  # button from an input field -- but only where the window system
713
712
  # reports it separately, which is NOT everywhere. Measured with a
714
713
  # real keypress, alternating against the main Enter key as a
715
- # control (`development/probe_441_kp_enter_platform.py`):
714
+ # control:
716
715
  #
717
716
  # * Windows FOLDS it into `Return` -- keysym `Return`, keycode 13,
718
717
  # char `\r`, byte-identical to the main Enter key -- so this
@@ -752,8 +751,7 @@ class Dialog:
752
751
  documented as focusing its default button (issue #439).
753
752
 
754
753
  Waiting for the widget's own `<Map>` states that precondition instead
755
- of guessing a delay. Measured on Windows
756
- (`development/probe_439_focus_timing.py`): the button is still
754
+ of guessing a delay. Measured on Windows: the button is still
757
755
  unmapped once `deiconify()` AND `update_idletasks()` have both
758
756
  returned, so neither is a usable barrier. Asking after the toplevel is
759
757
  deiconified happens to work — Tk defers a request made against a
@@ -169,8 +169,8 @@ class QueryDialog:
169
169
  # "ensure focus after dialog buttons set their own focus". Both ran
170
170
  # while the toplevel was still withdrawn, where `focus_set()` is a
171
171
  # silent no-op, so neither ever took and the entry was never actually
172
- # focused — measured in `development/probe_439_default_button_focus.py`
173
- # against pre-fix code, where focus sat on the toplevel. Handing the
172
+ # focused — measured against pre-fix code, where focus sat on the
173
+ # toplevel. Handing the
174
174
  # target to `Dialog` replaces the race with an ordering (issue #439).
175
175
  self._dialog._focus_target = getattr(entry, "entry_widget", entry)
176
176
 
@@ -52,7 +52,6 @@ Import path
52
52
  Contribution notes
53
53
  - Prefer base locales (`de`, `fr`, `nl`) unless region-specific differences are
54
54
  required (for example `pt_BR`).
55
- - Avoid embedding mnemonics `&` in messages; MessageCatalog strips them when rendering.
56
55
  - Keep message ids consistent (case and punctuation) to avoid duplicates.
57
56
 
58
57
  Minimum keys to translate for a new language (baseline UI):
@@ -21,7 +21,7 @@ Public API (unchanged signatures):
21
21
  - MessageCatalog.set_many(locale, *args) -> int
22
22
  - MessageCatalog.max(*src) -> int
23
23
  - MessageCatalog.init(root=None, locales_dir=None, domain='messages',
24
- default_locale='en', strip_ampersands=True) -> None
24
+ default_locale='en') -> None
25
25
  """
26
26
 
27
27
  from __future__ import annotations
@@ -47,7 +47,6 @@ class MessageCatalog:
47
47
  _domain: str = "messages"
48
48
  _locale: str = "en"
49
49
  _gt: gettext.NullTranslations | None = None
50
- _strip_amp: bool = True
51
50
  _emit_event: bool = True
52
51
  _event_name: str = "<<LocaleChanged>>"
53
52
 
@@ -62,7 +61,6 @@ class MessageCatalog:
62
61
  locales_dir: Union[str, Path, None] = None,
63
62
  domain: str = "messages",
64
63
  default_locale: str = "en",
65
- strip_ampersands: bool = True,
66
64
  emit_virtual_event: bool = True,
67
65
  virtual_event_name: str = "<<LocaleChanged>>",
68
66
  ) -> None:
@@ -75,7 +73,6 @@ class MessageCatalog:
75
73
  directory is auto-discovered.
76
74
  domain: Gettext domain name.
77
75
  default_locale: Locale to activate after initialization.
78
- strip_ampersands: If true, remove mnemonic `&` markers.
79
76
  emit_virtual_event: If true, generate a Tk virtual event after
80
77
  locale changes so widgets can refresh themselves.
81
78
  virtual_event_name: The virtual event name to emit when the
@@ -87,7 +84,6 @@ class MessageCatalog:
87
84
 
88
85
  MessageCatalog._domain = domain
89
86
  MessageCatalog._locales_dir = Path(locales_dir) if locales_dir else MessageCatalog._discover_locales_dir()
90
- MessageCatalog._strip_amp = strip_ampersands
91
87
  MessageCatalog._emit_event = bool(emit_virtual_event)
92
88
  MessageCatalog._event_name = str(virtual_event_name or "<<LocaleChanged>>")
93
89
  MessageCatalog._install_gettext(default_locale)
@@ -201,54 +197,6 @@ class MessageCatalog:
201
197
  parts = code.replace("-", "_").split("_")
202
198
  return parts[0].lower() if len(parts) == 1 else f"{parts[0].lower()}_{parts[1].lower()}"
203
199
 
204
- @staticmethod
205
- def __join(*args: Any) -> str:
206
- """Join format args for Tcl msgcat formatting.
207
-
208
- Args:
209
- *args: Positional values to forward to Tcl 'format'.
210
-
211
- Returns:
212
- String of brace-wrapped arguments joined by spaces.
213
- """
214
- new_args = []
215
- for arg in args:
216
- if isinstance(arg, str):
217
- stripped = str(arg).strip('"')
218
- new_args.append("{%s}" % stripped)
219
- else:
220
- new_args.append(str(arg))
221
- return " ".join(new_args)
222
-
223
- @staticmethod
224
- def _strip_ampersands(s: str) -> str:
225
- """Remove mnemonic ampersands from text.
226
-
227
- Converts single '&' markers to nothing and turns '&&' into a
228
- literal '&'. Useful for rendering toolkit-agnostic text.
229
-
230
- Args:
231
- s: Input string.
232
-
233
- Returns:
234
- Cleaned string with mnemonic indicators removed.
235
- """
236
- if not s or "&" not in s:
237
- return s
238
- out = []
239
- i = 0
240
- while i < len(s):
241
- if s[i] == "&":
242
- if i + 1 < len(s) and s[i + 1] == "&":
243
- out.append("&")
244
- i += 2
245
- else:
246
- i += 1 # skip mnemonic marker
247
- else:
248
- out.append(s[i])
249
- i += 1
250
- return "".join(out)
251
-
252
200
  # -------------- public API (unchanged signatures) ---------------------
253
201
 
254
202
  @staticmethod
@@ -279,16 +227,12 @@ class MessageCatalog:
279
227
  # work as in legacy behavior.
280
228
  cur = MessageCatalog._locale
281
229
  if fmtargs and cur in MessageCatalog._overrides and src in MessageCatalog._overrides[cur]:
282
- command = f"::msgcat::mc {{{src}}} {MessageCatalog.__join(*fmtargs)}"
283
- out = root.tk.eval(command)
284
- return MessageCatalog._strip_ampersands(out) if MessageCatalog._strip_amp else out
230
+ return str(root.tk.call('::msgcat::mc', src, *fmtargs))
285
231
 
286
232
  # 1) overrides for current locale win first
287
233
  cur = MessageCatalog._locale
288
234
  if cur in MessageCatalog._overrides and src in MessageCatalog._overrides[cur]:
289
235
  s = MessageCatalog._overrides[cur][src]
290
- if MessageCatalog._strip_amp:
291
- s = MessageCatalog._strip_ampersands(s)
292
236
  # try Python formatting if args were passed; ignore on failure
293
237
  if fmtargs:
294
238
  try:
@@ -306,8 +250,6 @@ class MessageCatalog:
306
250
  # If gettext returns src unchanged, and we have no fmtargs,
307
251
  # we'll consider falling back to msgcat for consistency.
308
252
  if s != src:
309
- if MessageCatalog._strip_amp:
310
- s = MessageCatalog._strip_ampersands(s)
311
253
  if fmtargs:
312
254
  try:
313
255
  return s % fmtargs
@@ -320,12 +262,8 @@ class MessageCatalog:
320
262
  # ignore and fall back to msgcat
321
263
  pass
322
264
 
323
- # 3) Tcl msgcat fallback (preserves your current behavior exactly)
324
- command = f"::msgcat::mc {{{src}}}"
325
- if fmtargs:
326
- command = f"{command} {MessageCatalog.__join(*fmtargs)}"
327
- out = root.tk.eval(command)
328
- return MessageCatalog._strip_ampersands(out) if MessageCatalog._strip_amp else out
265
+ # 3) Tcl msgcat fallback
266
+ return str(root.tk.call("::msgcat::mc", src, *fmtargs))
329
267
 
330
268
  @staticmethod
331
269
  def locale(new_locale: Optional[str] = None) -> str:
@@ -375,7 +313,7 @@ class MessageCatalog:
375
313
  msgs = Path(dirname).as_posix()
376
314
  from bootstack._runtime.app import get_default_root
377
315
  root = get_default_root()
378
- return int(root.tk.eval(f"::msgcat::mcload [list {msgs}]"))
316
+ return int(root.tk.call('::msgcat::mcload', msgs))
379
317
 
380
318
  @staticmethod
381
319
  def set(locale: str, src: str, translated: Optional[str] = None) -> None:
@@ -390,7 +328,7 @@ class MessageCatalog:
390
328
  MessageCatalog._overrides.setdefault(loc, {})[src] = translated or ""
391
329
  from bootstack._runtime.app import get_default_root
392
330
  root = get_default_root()
393
- root.tk.eval("::msgcat::mcset %s {%s} {%s}" % (MessageCatalog._to_msgcat_locale(locale), src, translated or ""))
331
+ root.tk.call('::msgcat::mcset', MessageCatalog._to_msgcat_locale(locale), src, translated or "")
394
332
 
395
333
  @staticmethod
396
334
  def set_many(locale: str, *args: str) -> int:
@@ -414,12 +352,10 @@ class MessageCatalog:
414
352
  # update Tcl msgcat
415
353
  from bootstack._runtime.app import get_default_root
416
354
  root = get_default_root()
417
- messages = " ".join(["{%s}" % x for x in args])
418
- out = f"::msgcat::mcmset {MessageCatalog._to_msgcat_locale(locale)} {{{messages}}}"
419
- return int(root.tk.eval(out))
355
+ return int(root.tk.call("::msgcat::mcmset", MessageCatalog._to_msgcat_locale(locale), tuple(args)))
420
356
 
421
357
  @staticmethod
422
358
  def max(*src: str) -> int:
423
359
  from bootstack._runtime.app import get_default_root
424
360
  root = get_default_root()
425
- return int(root.tk.eval(f"::msgcat::mcmax {' '.join(src)}"))
361
+ return int(root.tk.call("::msgcat::mcmax", *src))
@@ -14,8 +14,6 @@ The model encodes two design invariants:
14
14
  - The rail (workspace switcher) renders only when there is more than one
15
15
  workspace, so a single-tier app is the degenerate one-workspace case with no
16
16
  branching in the consumer.
17
-
18
- See `development/appshell-navigation-spec.md` for the full design.
19
17
  """
20
18
 
21
19
  from __future__ import annotations
@@ -210,6 +210,20 @@ class _ToplevelContextMenu(CustomConfigMixin):
210
210
  # Setup keyboard bindings
211
211
  self._setup_keyboard_bindings()
212
212
 
213
+ # hide the menu when the app loses focus
214
+ self._toplevel.bind("<FocusOut>", self._on_focus_out, add="+")
215
+
216
+ def _on_focus_out(self, _):
217
+ root = self._toplevel._root()
218
+ root.after_idle(self._hide_if_app_lost_focus)
219
+
220
+ def _hide_if_app_lost_focus(self):
221
+ try:
222
+ if self._toplevel.winfo_viewable() and self._toplevel.focus_get() is None:
223
+ self.hide()
224
+ except (TclError, KeyError): # destroyed; focus_get() raises KeyError for Tcl-created window
225
+ pass
226
+
213
227
  def _generate_key(self) -> str:
214
228
  """Generate an auto key for an item."""
215
229
  key = f"item_{self._counter}"
@@ -948,6 +948,18 @@ class SelectBox(Field):
948
948
  tab_binding = self.entry_widget.bind('<Tab>', on_tab)
949
949
  popup_state['key_bindings'].append(('<Tab>', tab_binding))
950
950
 
951
+ def _hide_if_app_lost_focus():
952
+ if popup_state['popup_closed']:
953
+ return
954
+ try:
955
+ if toplevel.winfo_viewable() and self.focus_get() is None:
956
+ close_popup()
957
+ except (TclError, KeyError): # destroyed; focus_get() raises KeyError for a Tcl-created window
958
+ pass
959
+
960
+ focusout_binding = self.entry_widget.bind('<FocusOut>', lambda e: self._root().after_idle(_hide_if_app_lost_focus), add="+")
961
+ popup_state['key_bindings'].append(('<FocusOut>', focusout_binding))
962
+
951
963
  # Setup click-outside detection
952
964
  def on_root_click(event):
953
965
  x, y = event.x_root, event.y_root
@@ -92,8 +92,7 @@ class Select(ValueSignalMixin, FieldAddonMixin, PublicWidgetBase):
92
92
  # a decoupled option list hands the rule that option's real object -- and a
93
93
  # `range` rule over numeric or date option values works. Declaring the
94
94
  # mixin's `'text'` default here would reject it at attach time and break
95
- # code that runs today; measured both ways in
96
- # `development/probe_465_select_range_kind.py`.
95
+ # code that runs today; measured both ways.
97
96
  _VALIDATION_KIND: str | None = None
98
97
 
99
98
  def __init__(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.4.4
3
+ Version: 0.4.5
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
File without changes
File without changes
File without changes
File without changes
File without changes