bootstack 0.1.0__py3-none-any.whl

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 (471) hide show
  1. bootstack/__init__.py +157 -0
  2. bootstack/__main__.py +5 -0
  3. bootstack/_core/__init__.py +21 -0
  4. bootstack/_core/capabilities/__init__.py +45 -0
  5. bootstack/_core/capabilities/after.py +103 -0
  6. bootstack/_core/capabilities/bind.py +192 -0
  7. bootstack/_core/capabilities/bindtags.py +112 -0
  8. bootstack/_core/capabilities/busy.py +72 -0
  9. bootstack/_core/capabilities/clipboard.py +89 -0
  10. bootstack/_core/capabilities/focus.py +118 -0
  11. bootstack/_core/capabilities/grab.py +65 -0
  12. bootstack/_core/capabilities/grid.py +211 -0
  13. bootstack/_core/capabilities/localization.py +231 -0
  14. bootstack/_core/capabilities/pack.py +140 -0
  15. bootstack/_core/capabilities/place.py +113 -0
  16. bootstack/_core/capabilities/selection.py +136 -0
  17. bootstack/_core/capabilities/signals.py +244 -0
  18. bootstack/_core/capabilities/winfo.py +315 -0
  19. bootstack/_core/colorutils.py +234 -0
  20. bootstack/_core/exceptions.py +25 -0
  21. bootstack/_core/images.py +463 -0
  22. bootstack/_core/mixins/__init__.py +1 -0
  23. bootstack/_core/mixins/ttk_state.py +35 -0
  24. bootstack/_core/mixins/widget.py +132 -0
  25. bootstack/_core/paths.py +49 -0
  26. bootstack/_core/publisher.py +149 -0
  27. bootstack/_core/variables.py +62 -0
  28. bootstack/_runtime/__init__.py +3 -0
  29. bootstack/_runtime/app.py +930 -0
  30. bootstack/_runtime/base_window.py +945 -0
  31. bootstack/_runtime/events.py +399 -0
  32. bootstack/_runtime/shortcuts.py +496 -0
  33. bootstack/_runtime/tk_patch.py +43 -0
  34. bootstack/_runtime/toplevel.py +276 -0
  35. bootstack/_runtime/utility.py +457 -0
  36. bootstack/_runtime/visual_focus.py +240 -0
  37. bootstack/_runtime/window_utilities.py +1123 -0
  38. bootstack/assets/__init__.py +21 -0
  39. bootstack/assets/bootstack.ico +0 -0
  40. bootstack/assets/bootstack.png +0 -0
  41. bootstack/assets/elements/__init__.py +0 -0
  42. bootstack/assets/elements/badge-pill.png +0 -0
  43. bootstack/assets/elements/badge-square.png +0 -0
  44. bootstack/assets/elements/button-compact.png +0 -0
  45. bootstack/assets/elements/button-default.png +0 -0
  46. bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  47. bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  48. bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  49. bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  50. bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  51. bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  52. bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  53. bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  54. bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  55. bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  56. bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  57. bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  58. bootstack/assets/elements/card.png +0 -0
  59. bootstack/assets/elements/checkbox-checked.png +0 -0
  60. bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  61. bootstack/assets/elements/checkbox-unchecked.png +0 -0
  62. bootstack/assets/elements/field.png +0 -0
  63. bootstack/assets/elements/input-addon-compact.png +0 -0
  64. bootstack/assets/elements/input-addon-default.png +0 -0
  65. bootstack/assets/elements/input-compact.png +0 -0
  66. bootstack/assets/elements/input-default.png +0 -0
  67. bootstack/assets/elements/list-item-separated.png +0 -0
  68. bootstack/assets/elements/list-item.png +0 -0
  69. bootstack/assets/elements/listrow-compact.png +0 -0
  70. bootstack/assets/elements/listrow-default.png +0 -0
  71. bootstack/assets/elements/manifest.toml +361 -0
  72. bootstack/assets/elements/menu-item.png +0 -0
  73. bootstack/assets/elements/navitem-compact.png +0 -0
  74. bootstack/assets/elements/navitem-default.png +0 -0
  75. bootstack/assets/elements/progressbar-h-compact.png +0 -0
  76. bootstack/assets/elements/progressbar-h-default.png +0 -0
  77. bootstack/assets/elements/progressbar-v-compact.png +0 -0
  78. bootstack/assets/elements/progressbar-v-default.png +0 -0
  79. bootstack/assets/elements/radiobutton.png +0 -0
  80. bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  81. bootstack/assets/elements/scrollbar-vertical.png +0 -0
  82. bootstack/assets/elements/slider-handle.png +0 -0
  83. bootstack/assets/elements/slider-track-h.png +0 -0
  84. bootstack/assets/elements/slider-track-v.png +0 -0
  85. bootstack/assets/elements/switch-off.png +0 -0
  86. bootstack/assets/elements/switch-on.png +0 -0
  87. bootstack/assets/elements/tab-h.png +0 -0
  88. bootstack/assets/elements/tab-v.png +0 -0
  89. bootstack/assets/icons/bootstrap.ttf +0 -0
  90. bootstack/assets/icons/glyphmap.json +2080 -0
  91. bootstack/assets/icons/icon_metrics.json +12470 -0
  92. bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  93. bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +856 -0
  94. bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  95. bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +878 -0
  96. bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  97. bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +856 -0
  98. bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  99. bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +856 -0
  100. bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  101. bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +856 -0
  102. bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  103. bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +878 -0
  104. bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  105. bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +856 -0
  106. bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  107. bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +856 -0
  108. bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  109. bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +854 -0
  110. bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  111. bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +845 -0
  112. bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  113. bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +844 -0
  114. bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  115. bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +917 -0
  116. bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  117. bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +845 -0
  118. bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  119. bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +844 -0
  120. bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  121. bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +844 -0
  122. bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  123. bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +845 -0
  124. bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  125. bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +845 -0
  126. bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  127. bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +845 -0
  128. bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  129. bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +845 -0
  130. bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  131. bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +845 -0
  132. bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  133. bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +845 -0
  134. bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  135. bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +845 -0
  136. bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  137. bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +845 -0
  138. bootstack/cli/__init__.py +133 -0
  139. bootstack/cli/__main__.py +6 -0
  140. bootstack/cli/add.py +395 -0
  141. bootstack/cli/appicon.py +285 -0
  142. bootstack/cli/build.py +115 -0
  143. bootstack/cli/config.py +313 -0
  144. bootstack/cli/demo.py +564 -0
  145. bootstack/cli/dev.py +153 -0
  146. bootstack/cli/doctor.py +195 -0
  147. bootstack/cli/icons.py +98 -0
  148. bootstack/cli/promote.py +120 -0
  149. bootstack/cli/pyinstaller.py +268 -0
  150. bootstack/cli/run.py +95 -0
  151. bootstack/cli/start.py +117 -0
  152. bootstack/cli/templates/__init__.py +931 -0
  153. bootstack/clipboard.py +48 -0
  154. bootstack/constants.py +318 -0
  155. bootstack/data/README.md +615 -0
  156. bootstack/data/__init__.py +78 -0
  157. bootstack/data/_observable.py +276 -0
  158. bootstack/data/base.py +780 -0
  159. bootstack/data/file_source.py +367 -0
  160. bootstack/data/memory_source.py +450 -0
  161. bootstack/data/query.py +367 -0
  162. bootstack/data/readers.py +289 -0
  163. bootstack/data/sqlite_source.py +869 -0
  164. bootstack/data/types.py +354 -0
  165. bootstack/data/writers.py +232 -0
  166. bootstack/dev/__init__.py +36 -0
  167. bootstack/dev/_capture.py +141 -0
  168. bootstack/dev/_env.py +43 -0
  169. bootstack/dev/_registry.py +140 -0
  170. bootstack/dev/_reloader.py +351 -0
  171. bootstack/dev/_reset.py +50 -0
  172. bootstack/dev/_watcher.py +91 -0
  173. bootstack/dialogs/__init__.py +948 -0
  174. bootstack/dialogs/_impl/__init__.py +47 -0
  175. bootstack/dialogs/_impl/colorchooser.py +588 -0
  176. bootstack/dialogs/_impl/datedialog.py +450 -0
  177. bootstack/dialogs/_impl/dialog.py +594 -0
  178. bootstack/dialogs/_impl/filterdialog.py +358 -0
  179. bootstack/dialogs/_impl/fontdialog.py +364 -0
  180. bootstack/dialogs/_impl/formdialog.py +564 -0
  181. bootstack/dialogs/_impl/message.py +486 -0
  182. bootstack/dialogs/_impl/query.py +570 -0
  183. bootstack/errors.py +67 -0
  184. bootstack/events/__init__.py +111 -0
  185. bootstack/events/_event.py +135 -0
  186. bootstack/events/_payloads.py +539 -0
  187. bootstack/events/_subscription.py +38 -0
  188. bootstack/i18n/README.md +77 -0
  189. bootstack/i18n/__init__.py +23 -0
  190. bootstack/i18n/catalog.py +121 -0
  191. bootstack/i18n/intl_format.py +584 -0
  192. bootstack/i18n/msgcat.py +425 -0
  193. bootstack/i18n/specs.py +156 -0
  194. bootstack/images.py +563 -0
  195. bootstack/py.typed +1 -0
  196. bootstack/scheduling/__init__.py +11 -0
  197. bootstack/scheduling/_schedule.py +218 -0
  198. bootstack/shortcuts.py +21 -0
  199. bootstack/signals/README.md +98 -0
  200. bootstack/signals/__init__.py +10 -0
  201. bootstack/signals/integration.py +100 -0
  202. bootstack/signals/signal.py +353 -0
  203. bootstack/signals/types.py +6 -0
  204. bootstack/store.py +286 -0
  205. bootstack/streams/__init__.py +12 -0
  206. bootstack/streams/_stream.py +321 -0
  207. bootstack/style/__init__.py +38 -0
  208. bootstack/style/builders/__init__.py +51 -0
  209. bootstack/style/builders/badge.py +46 -0
  210. bootstack/style/builders/button.py +339 -0
  211. bootstack/style/builders/buttongroup.py +311 -0
  212. bootstack/style/builders/calendar.py +271 -0
  213. bootstack/style/builders/checkbutton.py +110 -0
  214. bootstack/style/builders/combobox.py +113 -0
  215. bootstack/style/builders/contextmenu.py +268 -0
  216. bootstack/style/builders/entry.py +82 -0
  217. bootstack/style/builders/expander.py +148 -0
  218. bootstack/style/builders/field.py +335 -0
  219. bootstack/style/builders/frame.py +50 -0
  220. bootstack/style/builders/label.py +28 -0
  221. bootstack/style/builders/labelframe.py +34 -0
  222. bootstack/style/builders/listview.py +369 -0
  223. bootstack/style/builders/menubar.py +91 -0
  224. bootstack/style/builders/menubutton.py +359 -0
  225. bootstack/style/builders/panedwindow.py +25 -0
  226. bootstack/style/builders/progressbar.py +67 -0
  227. bootstack/style/builders/radiobutton.py +99 -0
  228. bootstack/style/builders/scale.py +64 -0
  229. bootstack/style/builders/scrollbar.py +225 -0
  230. bootstack/style/builders/separator.py +49 -0
  231. bootstack/style/builders/sidenav.py +643 -0
  232. bootstack/style/builders/sizegrip.py +15 -0
  233. bootstack/style/builders/spinbox.py +119 -0
  234. bootstack/style/builders/switch.py +70 -0
  235. bootstack/style/builders/tabitem.py +204 -0
  236. bootstack/style/builders/togglegroup.py +294 -0
  237. bootstack/style/builders/toolbutton.py +275 -0
  238. bootstack/style/builders/tooltip.py +26 -0
  239. bootstack/style/builders/treeview.py +193 -0
  240. bootstack/style/builders/utils.py +455 -0
  241. bootstack/style/builders_tk/__init__.py +16 -0
  242. bootstack/style/builders_tk/defaults.py +229 -0
  243. bootstack/style/element.py +173 -0
  244. bootstack/style/fonts.py +123 -0
  245. bootstack/style/style.py +609 -0
  246. bootstack/style/style_builder_base.py +716 -0
  247. bootstack/style/style_builder_mixed.py +93 -0
  248. bootstack/style/style_builder_tk.py +109 -0
  249. bootstack/style/style_builder_ttk.py +353 -0
  250. bootstack/style/style_resolver.py +447 -0
  251. bootstack/style/theme.py +245 -0
  252. bootstack/style/theme_provider.py +471 -0
  253. bootstack/style/themes/__init__.py +128 -0
  254. bootstack/style/tk_patch.py +5 -0
  255. bootstack/style/token_maps.py +41 -0
  256. bootstack/style/types.py +32 -0
  257. bootstack/style/typography.py +523 -0
  258. bootstack/style/utility.py +746 -0
  259. bootstack/types.py +39 -0
  260. bootstack/validation/__init__.py +6 -0
  261. bootstack/validation/types.py +15 -0
  262. bootstack/validation/validation_result.py +17 -0
  263. bootstack/validation/validation_rules.py +205 -0
  264. bootstack/widgets/__init__.py +74 -0
  265. bootstack/widgets/_core/__init__.py +31 -0
  266. bootstack/widgets/_core/app_config.py +266 -0
  267. bootstack/widgets/_core/base.py +461 -0
  268. bootstack/widgets/_core/container.py +334 -0
  269. bootstack/widgets/_core/context.py +35 -0
  270. bootstack/widgets/_core/events.py +130 -0
  271. bootstack/widgets/_core/field_mixin.py +353 -0
  272. bootstack/widgets/_core/icon_image_props.py +72 -0
  273. bootstack/widgets/_core/image_binding.py +93 -0
  274. bootstack/widgets/_core/navmodel.py +345 -0
  275. bootstack/widgets/_core/options.py +210 -0
  276. bootstack/widgets/_core/selection_group.py +130 -0
  277. bootstack/widgets/_core/window_controls.py +96 -0
  278. bootstack/widgets/_core/window_menu.py +246 -0
  279. bootstack/widgets/_impl/__init__.py +1 -0
  280. bootstack/widgets/_impl/_internal/__init__.py +0 -0
  281. bootstack/widgets/_impl/_internal/wrapper_base.py +307 -0
  282. bootstack/widgets/_impl/_parts/__init__.py +11 -0
  283. bootstack/widgets/_impl/_parts/numberentry_part.py +385 -0
  284. bootstack/widgets/_impl/_parts/spinnerentry_part.py +434 -0
  285. bootstack/widgets/_impl/_parts/textentry_part.py +406 -0
  286. bootstack/widgets/_impl/composites/__init__.py +33 -0
  287. bootstack/widgets/_impl/composites/_dateutils.py +33 -0
  288. bootstack/widgets/_impl/composites/_image_fit.py +105 -0
  289. bootstack/widgets/_impl/composites/accordion.py +381 -0
  290. bootstack/widgets/_impl/composites/avatar.py +191 -0
  291. bootstack/widgets/_impl/composites/buttongroup.py +371 -0
  292. bootstack/widgets/_impl/composites/calendar.py +972 -0
  293. bootstack/widgets/_impl/composites/carousel.py +567 -0
  294. bootstack/widgets/_impl/composites/chart.py +882 -0
  295. bootstack/widgets/_impl/composites/compositeframe.py +298 -0
  296. bootstack/widgets/_impl/composites/contextmenu.py +1951 -0
  297. bootstack/widgets/_impl/composites/dateentry.py +404 -0
  298. bootstack/widgets/_impl/composites/dropdownbutton.py +325 -0
  299. bootstack/widgets/_impl/composites/expander.py +515 -0
  300. bootstack/widgets/_impl/composites/field.py +670 -0
  301. bootstack/widgets/_impl/composites/form.py +1066 -0
  302. bootstack/widgets/_impl/composites/gallery.py +551 -0
  303. bootstack/widgets/_impl/composites/list/__init__.py +15 -0
  304. bootstack/widgets/_impl/composites/list/listitem.py +802 -0
  305. bootstack/widgets/_impl/composites/list/listview.py +1433 -0
  306. bootstack/widgets/_impl/composites/menu/__init__.py +18 -0
  307. bootstack/widgets/_impl/composites/menu/model.py +358 -0
  308. bootstack/widgets/_impl/composites/menu/render_native.py +134 -0
  309. bootstack/widgets/_impl/composites/menu/render_themed.py +134 -0
  310. bootstack/widgets/_impl/composites/meter.py +860 -0
  311. bootstack/widgets/_impl/composites/numericentry.py +201 -0
  312. bootstack/widgets/_impl/composites/pagestack.py +395 -0
  313. bootstack/widgets/_impl/composites/passwordentry.py +142 -0
  314. bootstack/widgets/_impl/composites/pathentry.py +168 -0
  315. bootstack/widgets/_impl/composites/picture.py +289 -0
  316. bootstack/widgets/_impl/composites/radiogroup.py +511 -0
  317. bootstack/widgets/_impl/composites/scrolledtext.py +375 -0
  318. bootstack/widgets/_impl/composites/scrolledtext.pyi +186 -0
  319. bootstack/widgets/_impl/composites/scrollview.py +764 -0
  320. bootstack/widgets/_impl/composites/selectbox.py +1026 -0
  321. bootstack/widgets/_impl/composites/shell/__init__.py +40 -0
  322. bootstack/widgets/_impl/composites/shell/content_host.py +52 -0
  323. bootstack/widgets/_impl/composites/shell/layout.py +335 -0
  324. bootstack/widgets/_impl/composites/shell/nav_panel.py +345 -0
  325. bootstack/widgets/_impl/composites/shell/providers.py +558 -0
  326. bootstack/widgets/_impl/composites/shell/rail.py +117 -0
  327. bootstack/widgets/_impl/composites/shell/shell.py +581 -0
  328. bootstack/widgets/_impl/composites/shell/workspace.py +273 -0
  329. bootstack/widgets/_impl/composites/sidenav/__init__.py +16 -0
  330. bootstack/widgets/_impl/composites/sidenav/header.py +81 -0
  331. bootstack/widgets/_impl/composites/sidenav/separator.py +44 -0
  332. bootstack/widgets/_impl/composites/slider/__init__.py +7 -0
  333. bootstack/widgets/_impl/composites/slider/_shared.py +195 -0
  334. bootstack/widgets/_impl/composites/slider/rangeslider.py +982 -0
  335. bootstack/widgets/_impl/composites/slider/slider.py +851 -0
  336. bootstack/widgets/_impl/composites/spinnerentry.py +185 -0
  337. bootstack/widgets/_impl/composites/tableview/__init__.py +5 -0
  338. bootstack/widgets/_impl/composites/tableview/tableview.py +3388 -0
  339. bootstack/widgets/_impl/composites/tableview/types.py +169 -0
  340. bootstack/widgets/_impl/composites/tabs/__init__.py +23 -0
  341. bootstack/widgets/_impl/composites/tabs/tabitem.py +389 -0
  342. bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
  343. bootstack/widgets/_impl/composites/tabs/tabview.py +650 -0
  344. bootstack/widgets/_impl/composites/textarea/__init__.py +26 -0
  345. bootstack/widgets/_impl/composites/textarea/change.py +46 -0
  346. bootstack/widgets/_impl/composites/textarea/codeeditor.py +526 -0
  347. bootstack/widgets/_impl/composites/textarea/core.py +495 -0
  348. bootstack/widgets/_impl/composites/textarea/decoration.py +42 -0
  349. bootstack/widgets/_impl/composites/textarea/diff.py +127 -0
  350. bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +1 -0
  351. bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +138 -0
  352. bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +158 -0
  353. bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +138 -0
  354. bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +312 -0
  355. bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +177 -0
  356. bootstack/widgets/_impl/composites/textarea/filter.py +171 -0
  357. bootstack/widgets/_impl/composites/textarea/search_overlay.py +459 -0
  358. bootstack/widgets/_impl/composites/textarea/sidebar.py +88 -0
  359. bootstack/widgets/_impl/composites/textarea/style_registry.py +178 -0
  360. bootstack/widgets/_impl/composites/textarea/textarea.py +606 -0
  361. bootstack/widgets/_impl/composites/textarea/undo.py +217 -0
  362. bootstack/widgets/_impl/composites/textentry.py +57 -0
  363. bootstack/widgets/_impl/composites/timeentry.py +176 -0
  364. bootstack/widgets/_impl/composites/toast.py +390 -0
  365. bootstack/widgets/_impl/composites/toast_stack.py +156 -0
  366. bootstack/widgets/_impl/composites/togglegroup.py +418 -0
  367. bootstack/widgets/_impl/composites/toolbar.py +608 -0
  368. bootstack/widgets/_impl/composites/tooltip.py +491 -0
  369. bootstack/widgets/_impl/composites/tree/__init__.py +7 -0
  370. bootstack/widgets/_impl/composites/tree/source_binding.py +136 -0
  371. bootstack/widgets/_impl/composites/tree/treeitem.py +393 -0
  372. bootstack/widgets/_impl/composites/tree/treenode.py +174 -0
  373. bootstack/widgets/_impl/composites/tree/treeview.py +841 -0
  374. bootstack/widgets/_impl/mixins/__init__.py +24 -0
  375. bootstack/widgets/_impl/mixins/configure_mixin.py +216 -0
  376. bootstack/widgets/_impl/mixins/entry_mixin.py +134 -0
  377. bootstack/widgets/_impl/mixins/font_mixin.py +368 -0
  378. bootstack/widgets/_impl/mixins/icon_mixin.py +61 -0
  379. bootstack/widgets/_impl/mixins/localization_mixin.py +253 -0
  380. bootstack/widgets/_impl/mixins/signal_mixin.py +268 -0
  381. bootstack/widgets/_impl/mixins/validation_mixin.py +226 -0
  382. bootstack/widgets/_impl/primitives/__init__.py +49 -0
  383. bootstack/widgets/_impl/primitives/_menubutton.py +107 -0
  384. bootstack/widgets/_impl/primitives/badge.py +45 -0
  385. bootstack/widgets/_impl/primitives/button.py +76 -0
  386. bootstack/widgets/_impl/primitives/card.py +45 -0
  387. bootstack/widgets/_impl/primitives/checkbutton.py +124 -0
  388. bootstack/widgets/_impl/primitives/checktoggle.py +62 -0
  389. bootstack/widgets/_impl/primitives/combobox.py +156 -0
  390. bootstack/widgets/_impl/primitives/entry.py +87 -0
  391. bootstack/widgets/_impl/primitives/flexframe.py +448 -0
  392. bootstack/widgets/_impl/primitives/frame.py +185 -0
  393. bootstack/widgets/_impl/primitives/gridframe.py +546 -0
  394. bootstack/widgets/_impl/primitives/label.py +84 -0
  395. bootstack/widgets/_impl/primitives/labelframe.py +54 -0
  396. bootstack/widgets/_impl/primitives/optionmenu.py +387 -0
  397. bootstack/widgets/_impl/primitives/packframe.py +227 -0
  398. bootstack/widgets/_impl/primitives/panedwindow.py +45 -0
  399. bootstack/widgets/_impl/primitives/progressbar.py +83 -0
  400. bootstack/widgets/_impl/primitives/radiobutton.py +115 -0
  401. bootstack/widgets/_impl/primitives/radiotoggle.py +54 -0
  402. bootstack/widgets/_impl/primitives/scrollbar.py +42 -0
  403. bootstack/widgets/_impl/primitives/separator.py +43 -0
  404. bootstack/widgets/_impl/primitives/sizegrip.py +33 -0
  405. bootstack/widgets/_impl/primitives/spinbox.py +95 -0
  406. bootstack/widgets/_impl/primitives/switch.py +44 -0
  407. bootstack/widgets/_impl/primitives/treeview.py +69 -0
  408. bootstack/widgets/app.py +371 -0
  409. bootstack/widgets/appshell.py +1179 -0
  410. bootstack/widgets/avatar.py +140 -0
  411. bootstack/widgets/boolean_controls.py +455 -0
  412. bootstack/widgets/button.py +224 -0
  413. bootstack/widgets/buttongroup.py +239 -0
  414. bootstack/widgets/calendar.py +195 -0
  415. bootstack/widgets/card.py +159 -0
  416. bootstack/widgets/carousel.py +241 -0
  417. bootstack/widgets/chart.py +302 -0
  418. bootstack/widgets/codeeditor.py +675 -0
  419. bootstack/widgets/contextmenu.py +371 -0
  420. bootstack/widgets/datatable.py +688 -0
  421. bootstack/widgets/datefield.py +395 -0
  422. bootstack/widgets/divider.py +60 -0
  423. bootstack/widgets/expander.py +579 -0
  424. bootstack/widgets/form.py +200 -0
  425. bootstack/widgets/gallery.py +250 -0
  426. bootstack/widgets/gauge.py +168 -0
  427. bootstack/widgets/grid.py +121 -0
  428. bootstack/widgets/groupbox.py +162 -0
  429. bootstack/widgets/label.py +229 -0
  430. bootstack/widgets/listview.py +354 -0
  431. bootstack/widgets/menubutton.py +419 -0
  432. bootstack/widgets/numberfield.py +431 -0
  433. bootstack/widgets/pagestack.py +345 -0
  434. bootstack/widgets/passwordfield.py +383 -0
  435. bootstack/widgets/pathfield.py +454 -0
  436. bootstack/widgets/picture.py +251 -0
  437. bootstack/widgets/progressbar.py +106 -0
  438. bootstack/widgets/radio_variants.py +271 -0
  439. bootstack/widgets/radiogroup.py +228 -0
  440. bootstack/widgets/scrollbar.py +64 -0
  441. bootstack/widgets/scrollview.py +186 -0
  442. bootstack/widgets/select.py +302 -0
  443. bootstack/widgets/selectbutton.py +182 -0
  444. bootstack/widgets/sidebar_toggle.py +130 -0
  445. bootstack/widgets/sizegrip.py +42 -0
  446. bootstack/widgets/slider.py +408 -0
  447. bootstack/widgets/spinbox.py +147 -0
  448. bootstack/widgets/spinnerfield.py +413 -0
  449. bootstack/widgets/splash.py +367 -0
  450. bootstack/widgets/splitview.py +482 -0
  451. bootstack/widgets/stacks.py +249 -0
  452. bootstack/widgets/statusbar.py +189 -0
  453. bootstack/widgets/tabs.py +425 -0
  454. bootstack/widgets/textarea.py +459 -0
  455. bootstack/widgets/textfield.py +410 -0
  456. bootstack/widgets/theme_toggle.py +92 -0
  457. bootstack/widgets/timefield.py +340 -0
  458. bootstack/widgets/toast.py +314 -0
  459. bootstack/widgets/togglegroup.py +231 -0
  460. bootstack/widgets/toolbar.py +347 -0
  461. bootstack/widgets/tooltip.py +94 -0
  462. bootstack/widgets/tree.py +648 -0
  463. bootstack/widgets/types.py +305 -0
  464. bootstack/widgets/window.py +307 -0
  465. bootstack-0.1.0.dist-info/METADATA +301 -0
  466. bootstack-0.1.0.dist-info/RECORD +471 -0
  467. bootstack-0.1.0.dist-info/WHEEL +5 -0
  468. bootstack-0.1.0.dist-info/entry_points.txt +2 -0
  469. bootstack-0.1.0.dist-info/licenses/LICENSE +21 -0
  470. bootstack-0.1.0.dist-info/licenses/NOTICE +10 -0
  471. bootstack-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,83 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, Literal, TYPE_CHECKING
5
+ from typing_extensions import Unpack
6
+
7
+ from bootstack._core.mixins.ttk_state import TtkStateMixin
8
+ from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
9
+ from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets._impl.mixins.configure_mixin import configure_delegate
11
+ from bootstack.widgets.types import Master, StyledKwargs, Orient
12
+ from ..mixins import SignalMixin
13
+
14
+ if TYPE_CHECKING:
15
+ from bootstack.signals import Signal
16
+
17
+
18
+ class ProgressbarKwargs(StyledKwargs, total=False):
19
+ # Standard ttk.Progressbar options
20
+ mode: Literal['determinate', 'indeterminate'] | str
21
+ orient: Orient
22
+ length: Any
23
+ maximum: float
24
+ value: float
25
+ variable: Any
26
+ signal: Signal[Any]
27
+ phase: int
28
+
29
+ # bootstack-specific extensions
30
+
31
+
32
+ class Progressbar(SignalMixin, TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Progressbar):
33
+ """bootstack wrapper for `ttk.Progressbar` with themed styling support."""
34
+
35
+ _ttk_base = ttk.Progressbar
36
+
37
+ def __init__(self, master: Master = None, **kwargs: Unpack[ProgressbarKwargs]) -> None:
38
+ """Create a themed bootstack Progressbar.
39
+
40
+ Args:
41
+ master: Parent widget. If None, uses the default root window.
42
+
43
+ Other Parameters:
44
+ mode: Progress mode ('determinate' or 'indeterminate').
45
+ orient: Orientation of the bar ('horizontal' or 'vertical').
46
+ length: Requested length of the progress bar in pixels.
47
+ maximum: Maximum value.
48
+ value: Current value.
49
+ variable: Tk variable linked to the value.
50
+ See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
51
+ signal: Reactive Signal linked to the value (auto-synced with variable).
52
+ phase: Animation phase for indeterminate mode.
53
+ style: Explicit ttk style name (overrides accent/variant).
54
+ accent: Accent token for styling, e.g. 'primary', 'success', 'danger'.
55
+ variant: Style variant, e.g. 'default', 'thin'.
56
+ surface: Optional surface token; otherwise inherited.
57
+ style_options: Optional dict forwarded to the style builder.
58
+ """
59
+ super().__init__(master, **kwargs)
60
+
61
+ def get(self) -> float:
62
+ """Return the current progress value."""
63
+ return float(ttk.Progressbar.cget(self, 'value'))
64
+
65
+ def set(self, value: float) -> None:
66
+ """Set the progress value."""
67
+ ttk.Progressbar.configure(self, value=value)
68
+
69
+ @property
70
+ def value(self) -> float:
71
+ """Get or set the progress value."""
72
+ return self.get()
73
+
74
+ @value.setter
75
+ def value(self, value: float) -> None:
76
+ self.set(value)
77
+
78
+ @configure_delegate('value')
79
+ def _delegate_value(self, value=None):
80
+ """Get or set the value via configure."""
81
+ if value is None:
82
+ return self.get()
83
+ self.set(value)
@@ -0,0 +1,115 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, Callable, Literal, TYPE_CHECKING
5
+
6
+ from typing_extensions import Unpack
7
+
8
+ from bootstack._core.mixins.ttk_state import TtkStateMixin
9
+ from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
10
+ from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
11
+ from bootstack.widgets._impl.mixins import IconMixin, LocalizationMixin, SignalMixin, TextSignalMixin
12
+ from bootstack.widgets._impl.mixins.configure_mixin import configure_delegate
13
+ from bootstack.widgets.types import Master, StyledKwargs, Anchor, CompoundMode, WidgetState
14
+
15
+ if TYPE_CHECKING:
16
+ from bootstack.signals import Signal
17
+
18
+
19
+ class RadioButtonKwargs(StyledKwargs, total=False):
20
+ # Standard ttk.Radiobutton options
21
+ text: Any
22
+ command: Callable[[], Any] | None
23
+ image: Any
24
+ icon: Any
25
+ on_icon: Any
26
+ off_icon: Any
27
+ icon_only: bool
28
+ show_indicator: bool
29
+ compound: CompoundMode
30
+ variable: Any
31
+ signal: Signal[Any]
32
+ value: Any
33
+ padding: Any
34
+ anchor: Anchor
35
+ width: int
36
+ underline: int
37
+ state: WidgetState
38
+ textvariable: Any
39
+ textsignal: Signal[str]
40
+
41
+ # bootstack-specific extensions
42
+ localize: bool | Literal['auto']
43
+
44
+
45
+ class RadioButton(LocalizationMixin, SignalMixin, TextSignalMixin, IconMixin, TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Radiobutton):
46
+ """bootstack wrapper for `ttk.Radiobutton` with themed styling and icon support."""
47
+
48
+ _ttk_base = ttk.Radiobutton
49
+
50
+ def __init__(self, master: Master = None, **kwargs: Unpack[RadioButtonKwargs]) -> None:
51
+ """Create a themed bootstack Radiobutton.
52
+
53
+ Args:
54
+ master: Parent widget. If None, uses the default root window.
55
+
56
+ Other Parameters:
57
+ text: Text to display.
58
+ textvariable: Tk variable linked to the text.
59
+ See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
60
+ textsignal: Reactive Signal linked to the text (auto-synced with textvariable).
61
+ command: Callable invoked when the value is selected.
62
+ image: Image to display.
63
+ icon: Icon shown in the label area for all states. Color shifts
64
+ from foreground (unselected) to accent (selected) automatically.
65
+ on_icon: Icon shown in the label area when the button is selected.
66
+ Shortcut for `state=[("selected", name)]` inside a full icon spec.
67
+ off_icon: Icon shown in the label area when the button is unselected.
68
+ Used as the base icon when `on_icon` is also provided.
69
+ icon_only: Removes the additional padding added for label.
70
+ show_indicator: Whether to show the standard radio indicator. Defaults
71
+ to True. Set to False to hide the indicator (e.g. for icon-only radio groups).
72
+ compound: Placement of the image relative to text.
73
+ variable: Linked Tk variable that receives the selected value.
74
+ See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
75
+ signal: Reactive Signal that receives the selected value (auto-synced with variable).
76
+ value: The value assigned to `variable` when this radio is selected.
77
+ padding: Extra space around the content.
78
+ anchor: Determines how the content is aligned in the container. Combination of 'n', 's', 'e', 'w', or 'center' (default).
79
+ width: Width of the control in characters.
80
+ underline: Index of character to underline in `text`.
81
+ state: Widget state.
82
+ takefocus: Whether the widget participates in focus traversal.
83
+ style: Explicit ttk style name (overrides accent/variant).
84
+ accent: Accent token for styling, e.g. 'primary', 'success', 'danger'.
85
+ variant: Style variant, e.g. 'default'.
86
+ surface: Optional surface token; otherwise inherited.
87
+ style_options: Optional dict forwarded to the style builder.
88
+ localize: Determines the widget's localization mode.
89
+ """
90
+ kwargs.update(style_options=self._capture_style_options(['icon_only', 'icon', 'on_icon', 'off_icon', 'show_indicator', 'anchor'], kwargs))
91
+ super().__init__(master, **kwargs)
92
+
93
+ def get(self) -> Any:
94
+ """Return the current selected value."""
95
+ return self.variable.get()
96
+
97
+ def set(self, value: Any) -> None:
98
+ """Set the selected value."""
99
+ self.variable.set(value)
100
+
101
+ @property
102
+ def value(self) -> Any:
103
+ """Get or set the radiobutton's selected value."""
104
+ return self.get()
105
+
106
+ @value.setter
107
+ def value(self, value: Any) -> None:
108
+ self.set(value)
109
+
110
+ @configure_delegate('value')
111
+ def _delegate_value(self, value=None):
112
+ """Get or set the value via configure."""
113
+ if value is None:
114
+ return self.get()
115
+ self.set(value)
@@ -0,0 +1,54 @@
1
+ from typing import Literal
2
+
3
+ from typing_extensions import Unpack
4
+
5
+ from bootstack.widgets._impl.primitives.radiobutton import RadioButton, RadioButtonKwargs
6
+ from bootstack.widgets.types import Master
7
+
8
+
9
+ class RadioToggle(RadioButton):
10
+ """bootstack wrapper for `ttk.Radiobutton` that renders with a toggle badge style."""
11
+
12
+ def __init__(self, master: Master = None, **kwargs: Unpack[RadioButtonKwargs]) -> None:
13
+ """Create a themed bootstack RadioToggle.
14
+
15
+ Args:
16
+ master: Parent widget. If None, uses the default root window.
17
+
18
+ Other Parameters:
19
+ text: Text to display.
20
+ textvariable: Tk variable linked to the text.
21
+ See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
22
+ textsignal: Reactive Signal linked to the text (auto-synced with textvariable).
23
+ command: Callable invoked when the value is selected.
24
+ image: Image to display.
25
+ icon: Theme-aware icon spec handled by the style system.
26
+ icon_only: Removes the additional padding added for label text.
27
+ compound: Placement of the image relative to text.
28
+ variable: Linked Tk variable that receives the selected value.
29
+ See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
30
+ signal: Reactive Signal that receives the selected value (auto-synced with variable).
31
+ value: The value assigned to `variable` when this radio is selected.
32
+ padding: Extra space around the content.
33
+ anchor: Determines how the content is aligned in the container. Combination of 'n', 's', 'e', 'w', or 'center' (default).
34
+ density: The vertical and horizontal compactness of widget content, e.g. 'default', 'compact'.
35
+ width: Width of the control in characters.
36
+ underline: Index of character to underline in `text`.
37
+ state: Widget state ('normal', 'active', 'disabled', 'readonly').
38
+ takefocus: Whether the widget participates in focus traversal.
39
+ accent: Accent token for styling, e.g. 'primary', 'success', 'danger'.
40
+ surface: Optional surface token; otherwise inherited.
41
+ style_options: Optional dict forwarded to the style builder.
42
+ localize: Determines the widget's localization mode.
43
+ """
44
+ self._capture_density_option(kwargs)
45
+ kwargs.setdefault('ttk_class', 'Toolbutton')
46
+ super().__init__(master, **kwargs)
47
+
48
+ @staticmethod
49
+ def _capture_density_option(kwargs: dict) -> None:
50
+ """Capture density from kwargs into style_options."""
51
+ density: Literal['default', 'compact'] | None = kwargs.pop('density', None)
52
+ if density is not None:
53
+ style_options = kwargs.setdefault('style_options', {})
54
+ style_options['density'] = density
@@ -0,0 +1,42 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any
5
+ from typing_extensions import Unpack
6
+
7
+ from bootstack._core.mixins.ttk_state import TtkStateMixin
8
+ from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
9
+ from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets.types import Master, StyledKwargs, Orient
11
+
12
+
13
+ class ScrollbarKwargs(StyledKwargs, total=False):
14
+ # Standard ttk.Scrollbar options
15
+ orient: Orient
16
+ command: Any
17
+
18
+ # bootstack-specific extensions
19
+
20
+
21
+ class Scrollbar(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Scrollbar):
22
+ """bootstack wrapper for `ttk.Scrollbar` with themed styling support."""
23
+
24
+ _ttk_base = ttk.Scrollbar
25
+
26
+ def __init__(self, master: Master = None, **kwargs: Unpack[ScrollbarKwargs]) -> None:
27
+ """Create a themed bootstack Scrollbar.
28
+
29
+ Args:
30
+ master: Parent widget. If None, uses the default root window.
31
+
32
+ Other Parameters:
33
+ orient: Orientation of the scrollbar ('horizontal' or 'vertical').
34
+ command: Scroll command callback.
35
+ takefocus: Whether the widget participates in focus traversal.
36
+ style: Explicit ttk style name (overrides accent/variant).
37
+ accent: Accent token for styling, e.g. 'primary', 'danger', 'success'.
38
+ variant: Style variant — 'default' (rounded) or 'thin' (slim square).
39
+ surface: Optional surface token; otherwise inherited.
40
+ style_options: Optional dict forwarded to the style builder.
41
+ """
42
+ super().__init__(master, **kwargs)
@@ -0,0 +1,43 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing_extensions import Unpack
5
+
6
+ from bootstack._core.mixins.ttk_state import TtkStateMixin
7
+ from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
8
+ from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
9
+ from bootstack.widgets.types import Master, StyledKwargs, Orient
10
+
11
+
12
+ class SeparatorKwargs(StyledKwargs, total=False):
13
+ # Standard ttk.Separator options
14
+ orient: Orient
15
+
16
+ # bootstack-specific extensions
17
+ thickness: int
18
+ length: int
19
+
20
+
21
+ class Separator(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Separator):
22
+ """bootstack wrapper for `ttk.Separator` with themed styling support."""
23
+
24
+ _ttk_base = ttk.Separator
25
+
26
+ def __init__(self, master: Master = None, **kwargs: Unpack[SeparatorKwargs]) -> None:
27
+ """Create a themed bootstack Separator.
28
+
29
+ Args:
30
+ master: Parent widget. If None, uses the default root window.
31
+
32
+ Other Parameters:
33
+ orient: Orientation of the separator ('horizontal' or 'vertical').
34
+ style: Explicit ttk style name (overrides accent/variant).
35
+ accent: Accent token for styling, e.g. 'primary', 'secondary'; otherwise derived from the inherited surface.
36
+ surface: Optional surface token; otherwise inherited.
37
+ thickness: Thickness of the separator.
38
+ length: Fixed length of the separator in pixels. If None,
39
+ stretches to fill available space.
40
+ style_options: Optional dict forwarded to the style builder.
41
+ """
42
+ kwargs.update(style_options=self._capture_style_options(['thickness', 'length', 'border_strength'], kwargs))
43
+ super().__init__(master, **kwargs)
@@ -0,0 +1,33 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing_extensions import Unpack
5
+
6
+ from bootstack._core.mixins.ttk_state import TtkStateMixin
7
+ from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
8
+ from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
9
+ from bootstack.widgets.types import Master, StyledKwargs
10
+
11
+
12
+ class SizeGripKwargs(StyledKwargs, total=False):
13
+ pass
14
+
15
+
16
+ class SizeGrip(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Sizegrip):
17
+ """bootstack wrapper for `ttk.Sizegrip` with themed styling support."""
18
+
19
+ _ttk_base = ttk.Sizegrip
20
+
21
+ def __init__(self, master: Master = None, **kwargs: Unpack[SizeGripKwargs]) -> None:
22
+ """Create a themed bootstack Sizegrip.
23
+
24
+ Args:
25
+ master: Parent widget. If None, uses the default root window.
26
+
27
+ Other Parameters:
28
+ style: Explicit ttk style name (overrides accent/variant).
29
+ accent: Accent token for styling.
30
+ surface: Optional surface token; otherwise inherited.
31
+ style_options: Optional dict forwarded to the style builder.
32
+ """
33
+ super().__init__(master, **kwargs)
@@ -0,0 +1,95 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, TYPE_CHECKING
5
+ from typing_extensions import Unpack
6
+
7
+ from bootstack._core.mixins.ttk_state import TtkStateMixin
8
+ from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
9
+ from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets.types import Master, StyledKwargs, WidgetState, WidgetDensity
11
+ from ..mixins import TextSignalMixin, configure_delegate
12
+
13
+ if TYPE_CHECKING:
14
+ from bootstack.signals import Signal
15
+
16
+
17
+ class SpinboxKwargs(StyledKwargs, total=False):
18
+ # Standard ttk.Spinbox options
19
+ from_: float
20
+ to: float
21
+ increment: float
22
+ values: Any
23
+ wrap: bool
24
+ command: Any
25
+ font: Any
26
+ textvariable: Any
27
+ textsignal: Signal[Any]
28
+ format: str
29
+ width: int
30
+ state: WidgetState
31
+
32
+ # bootstack-specific extensions
33
+ density: WidgetDensity
34
+
35
+
36
+ class Spinbox(TextSignalMixin, TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Spinbox):
37
+ """bootstack wrapper for `ttk.Spinbox` with themed styling support."""
38
+
39
+ _ttk_base = ttk.Spinbox
40
+
41
+ def __init__(self, master: Master = None, **kwargs: Unpack[SpinboxKwargs]) -> None:
42
+ """Create a themed bootstack Spinbox.
43
+
44
+ Args:
45
+ master: Parent widget. If None, uses the default root window.
46
+
47
+ Other Parameters:
48
+ from_: Minimum value.
49
+ to: Maximum value.
50
+ increment: Step size between values.
51
+ values: Sequence of values to cycle through.
52
+ wrap: Whether to wrap between min/max.
53
+ command: Callback when the value changes.
54
+ textvariable: Tk variable linked to the entry text.
55
+ See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
56
+ textsignal: Reactive Signal linked to the text (auto-synced with textvariable).
57
+ format: Display format string.
58
+ width: Widget width in characters.
59
+ state: Widget state.
60
+ takefocus: Whether the widget participates in focus traversal.
61
+ style: Explicit ttk style name (overrides accent/variant).
62
+ accent: Accent token for styling, e.g. 'primary', 'danger', 'success'.
63
+ density: Vertical and horizontal compactness, e.g. 'default', 'compact'.
64
+ surface: Optional surface token; otherwise inherited.
65
+ style_options: Optional dict forwarded to the style builder.
66
+ """
67
+ if kwargs.get('density') == 'compact':
68
+ kwargs['font'] = 'caption'
69
+ kwargs.update(style_options=self._capture_style_options(['density'], kwargs))
70
+ super().__init__(master, **kwargs)
71
+ # Handle mousewheel explicitly so we can return "break" and stop the
72
+ # event from leaking to parent scroll containers. Instance bindings run
73
+ # before class bindings in Tk's chain, so we must do the spin ourselves.
74
+ self.bind("<MouseWheel>", self._on_mousewheel)
75
+ self.bind("<Button-4>", self._on_mousewheel)
76
+ self.bind("<Button-5>", self._on_mousewheel)
77
+
78
+ def _on_mousewheel(self, event):
79
+ if event.delta > 0 or event.num == 4:
80
+ self.event_generate("<Up>")
81
+ else:
82
+ self.event_generate("<Down>")
83
+ return "break"
84
+
85
+
86
+ @configure_delegate('density')
87
+ def _delegate_density(self, value=None):
88
+ if value is None:
89
+ return self.configure_style_options(value)
90
+ else:
91
+ if value == 'compact':
92
+ self.configure(font='caption')
93
+ else:
94
+ self.configure(font='body')
95
+ return self.configure_style_options(density=value)
@@ -0,0 +1,44 @@
1
+ from typing_extensions import Unpack
2
+
3
+ from bootstack.widgets._impl.primitives.checkbutton import CheckButton, CheckButtonKwargs
4
+ from bootstack.widgets.types import Master
5
+
6
+
7
+ class Switch(CheckButton):
8
+ """bootstack wrapper for `ttk.Checkbutton` that renders with a Switch style"""
9
+
10
+ def __init__(self, master: Master = None, **kwargs: Unpack[CheckButtonKwargs]) -> None:
11
+ """Create a themed bootstack Switch.
12
+
13
+ Args:
14
+ master: Parent widget. If None, uses the default root window.
15
+
16
+ Other Parameters:
17
+ text: Text to display on the toggle.
18
+ textvariable: Tk variable linked to the text.
19
+ See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
20
+ textsignal: Reactive Signal linked to the text (auto-synced with textvariable).
21
+ command: Callable invoked when the toggle changes state.
22
+ image: Image to display.
23
+ icon: Theme-aware icon spec handled by the style system.
24
+ icon_only: If True, removes the additional padding reserved for text.
25
+ compound: Placement of the image relative to text.
26
+ variable: Linked variable controlling the on/off state.
27
+ See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
28
+ signal: Reactive Signal controlling the on/off state (auto-synced with variable).
29
+ value: Initial state for the widget's associated variable (defaults to None when unset).
30
+ onvalue: Value set in `variable` when selected.
31
+ offvalue: Value set in `variable` when deselected.
32
+ padding: Extra space around the content.
33
+ anchor: Determines how the content is aligned in the container. Combination of 'n', 's', 'e', 'w', or 'center' (default).
34
+ width: Width of the control in characters.
35
+ underline: Index of character to underline in `text`.
36
+ state: Widget state ('normal', 'active', 'disabled', 'readonly').
37
+ takefocus: Whether the widget participates in focus traversal.
38
+ accent: Accent token for styling, e.g. 'primary', 'success', 'danger'.
39
+ surface: Optional surface token; otherwise inherited.
40
+ style_options: Optional dict forwarded to the style builder.
41
+ localize: Determines the widget's localization mode.
42
+ """
43
+ kwargs['variant'] = 'switch'
44
+ super().__init__(master, **kwargs)
@@ -0,0 +1,69 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, Literal
5
+ from typing_extensions import Unpack
6
+
7
+ from bootstack._core.mixins.ttk_state import TtkStateMixin
8
+ from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
9
+ from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets.types import Master, StyledKwargs, WidgetDensity
11
+
12
+
13
+ class TreeViewKwargs(StyledKwargs, total=False):
14
+ # Standard ttk.Treeview options
15
+ columns: Any
16
+ displaycolumns: Any
17
+ show: Literal['tree', 'headings', '']
18
+ height: int
19
+ padding: Any
20
+ selectmode: Literal['browse','extended','none'] | str
21
+
22
+ # bootstack-specific extensions
23
+ density: WidgetDensity
24
+ border_color: str
25
+ show_border: bool
26
+ select_background: str
27
+ header_background: str
28
+
29
+
30
+ class TreeView(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Treeview):
31
+ """bootstack wrapper for `ttk.Treeview` with themed styling support."""
32
+
33
+ _ttk_base = ttk.Treeview
34
+
35
+ def __init__(self, master: Master = None, **kwargs: Unpack[TreeViewKwargs]) -> None:
36
+ """Create a themed bootstack Treeview.
37
+
38
+ Args:
39
+ master: Parent widget. If None, uses the default root window.
40
+
41
+ Other Parameters:
42
+ columns: Sequence of column identifiers.
43
+ displaycolumns: Subset and order of columns to display.
44
+ show: Which parts to display (e.g., 'tree', 'headings').
45
+ height: Number of rows to display.
46
+ padding: Extra padding around the widget.
47
+ selectmode: Selection mode ('browse', 'extended', 'none').
48
+ style: Explicit ttk style name.
49
+ surface: Optional surface token; otherwise inherited.
50
+ density: Compactness of widget content ('default' or 'compact').
51
+ border_color: Color of the border around the table.
52
+ show_border: Whether to show a border around the table.
53
+ open_icon: Icon used for the open state.
54
+ close_icon: Icon used for the close state.
55
+ select_background: Semantic color token for selection background.
56
+ header_background: Semantic color token for the header background.
57
+ style_options: Optional dict forwarded to the style builder.
58
+ """
59
+ kwargs.update(style_options=self._capture_style_options([
60
+ 'density',
61
+ 'border_color',
62
+ 'show_border',
63
+ 'open_icon',
64
+ 'close_icon',
65
+ 'select_background',
66
+ 'header_background'
67
+ ],
68
+ kwargs))
69
+ super().__init__(master, **kwargs)