bootstack 0.1.0a1__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 (419) hide show
  1. bootstack/__init__.py +249 -0
  2. bootstack/__main__.py +5 -0
  3. bootstack/api/__init__.py +127 -0
  4. bootstack/api/app.py +30 -0
  5. bootstack/api/constants.py +3 -0
  6. bootstack/api/data.py +23 -0
  7. bootstack/api/dialogs.py +44 -0
  8. bootstack/api/i18n.py +17 -0
  9. bootstack/api/localization.py +16 -0
  10. bootstack/api/menu.py +7 -0
  11. bootstack/api/style.py +23 -0
  12. bootstack/api/utils.py +24 -0
  13. bootstack/api/widgets.py +137 -0
  14. bootstack/assets/__init__.py +24 -0
  15. bootstack/assets/bootstack-transparent.png +0 -0
  16. bootstack/assets/bootstack.ico +0 -0
  17. bootstack/assets/bootstack.png +0 -0
  18. bootstack/assets/elements/__init__.py +0 -0
  19. bootstack/assets/elements/badge-pill.png +0 -0
  20. bootstack/assets/elements/badge-square.png +0 -0
  21. bootstack/assets/elements/border.png +0 -0
  22. bootstack/assets/elements/button-compact.png +0 -0
  23. bootstack/assets/elements/button-default.png +0 -0
  24. bootstack/assets/elements/button-group-horizontal-after-compact.png +0 -0
  25. bootstack/assets/elements/button-group-horizontal-after-default.png +0 -0
  26. bootstack/assets/elements/button-group-horizontal-before-compact.png +0 -0
  27. bootstack/assets/elements/button-group-horizontal-before-default.png +0 -0
  28. bootstack/assets/elements/button-group-horizontal-center-compact.png +0 -0
  29. bootstack/assets/elements/button-group-horizontal-center-default.png +0 -0
  30. bootstack/assets/elements/button-group-vertical-after-compact.png +0 -0
  31. bootstack/assets/elements/button-group-vertical-after-default.png +0 -0
  32. bootstack/assets/elements/button-group-vertical-before-compact.png +0 -0
  33. bootstack/assets/elements/button-group-vertical-before-default.png +0 -0
  34. bootstack/assets/elements/button-group-vertical-center-compact.png +0 -0
  35. bootstack/assets/elements/button-group-vertical-center-default.png +0 -0
  36. bootstack/assets/elements/checkbox-checked.png +0 -0
  37. bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  38. bootstack/assets/elements/checkbox-unchecked.png +0 -0
  39. bootstack/assets/elements/field.png +0 -0
  40. bootstack/assets/elements/input-after-compact.png +0 -0
  41. bootstack/assets/elements/input-after-default.png +0 -0
  42. bootstack/assets/elements/input-before-compact.png +0 -0
  43. bootstack/assets/elements/input-before-default.png +0 -0
  44. bootstack/assets/elements/input-compact.png +0 -0
  45. bootstack/assets/elements/input-default.png +0 -0
  46. bootstack/assets/elements/list-item-separated.png +0 -0
  47. bootstack/assets/elements/list-item.png +0 -0
  48. bootstack/assets/elements/manifest.toml +480 -0
  49. bootstack/assets/elements/menu-item.png +0 -0
  50. bootstack/assets/elements/nav-button-compact.png +0 -0
  51. bootstack/assets/elements/nav-button-default.png +0 -0
  52. bootstack/assets/elements/nav-icon-button-compact.png +0 -0
  53. bootstack/assets/elements/nav-icon-button-default.png +0 -0
  54. bootstack/assets/elements/notebook-client-border.png +0 -0
  55. bootstack/assets/elements/notebook-tab-active.png +0 -0
  56. bootstack/assets/elements/notebook-tab-bar.png +0 -0
  57. bootstack/assets/elements/notebook-tab-normal.png +0 -0
  58. bootstack/assets/elements/notebook-tab-pill.png +0 -0
  59. bootstack/assets/elements/progress-bar-horizontal-striped.png +0 -0
  60. bootstack/assets/elements/progress-bar-solid.png +0 -0
  61. bootstack/assets/elements/progress-bar-thin.png +0 -0
  62. bootstack/assets/elements/progress-bar-vertical-striped.png +0 -0
  63. bootstack/assets/elements/radio-selected.png +0 -0
  64. bootstack/assets/elements/radio-unselected.png +0 -0
  65. bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  66. bootstack/assets/elements/scrollbar-vertical.png +0 -0
  67. bootstack/assets/elements/slider-handle-focus.png +0 -0
  68. bootstack/assets/elements/slider-handle.png +0 -0
  69. bootstack/assets/elements/slider-track-horizontal.png +0 -0
  70. bootstack/assets/elements/slider-track-vertical.png +0 -0
  71. bootstack/assets/elements/switch-off.png +0 -0
  72. bootstack/assets/elements/switch-on.png +0 -0
  73. bootstack/assets/elements/tabs-bar-horizontal.png +0 -0
  74. bootstack/assets/elements/tabs-bar-vertical.png +0 -0
  75. bootstack/assets/elements/tabs-pill.png +0 -0
  76. bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  77. bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +853 -0
  78. bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +875 -0
  79. bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  80. bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +853 -0
  81. bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  82. bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +853 -0
  83. bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  84. bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +853 -0
  85. bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  86. bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +875 -0
  87. bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  88. bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +853 -0
  89. bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  90. bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +853 -0
  91. bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  92. bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +851 -0
  93. bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  94. bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +842 -0
  95. bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  96. bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +841 -0
  97. bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  98. bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +914 -0
  99. bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  100. bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +842 -0
  101. bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  102. bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +841 -0
  103. bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  104. bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +841 -0
  105. bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  106. bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +842 -0
  107. bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  108. bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +842 -0
  109. bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  110. bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +842 -0
  111. bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  112. bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +842 -0
  113. bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  114. bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +842 -0
  115. bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  116. bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +842 -0
  117. bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  118. bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +842 -0
  119. bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  120. bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +842 -0
  121. bootstack/assets/themes/__init__.py +0 -0
  122. bootstack/assets/themes/amber-dark.json +32 -0
  123. bootstack/assets/themes/amber-light.json +32 -0
  124. bootstack/assets/themes/aurora-dark.json +32 -0
  125. bootstack/assets/themes/aurora-light.json +32 -0
  126. bootstack/assets/themes/bootstrap-dark.json +32 -0
  127. bootstack/assets/themes/bootstrap-light.json +32 -0
  128. bootstack/assets/themes/classic-dark.json +32 -0
  129. bootstack/assets/themes/classic-light.json +32 -0
  130. bootstack/assets/themes/docs-dark.json +32 -0
  131. bootstack/assets/themes/docs-light.json +32 -0
  132. bootstack/assets/themes/forest-dark.json +32 -0
  133. bootstack/assets/themes/forest-light.json +32 -0
  134. bootstack/assets/themes/ocean-dark.json +32 -0
  135. bootstack/assets/themes/ocean-light.json +32 -0
  136. bootstack/assets/themes/rose-dark.json +32 -0
  137. bootstack/assets/themes/rose-light.json +32 -0
  138. bootstack/assets/widgets/__init__.py +0 -0
  139. bootstack/assets/widgets/badge-default.png +0 -0
  140. bootstack/assets/widgets/badge-pill.png +0 -0
  141. bootstack/assets/widgets/border.png +0 -0
  142. bootstack/assets/widgets/button-group-horizontal-after.png +0 -0
  143. bootstack/assets/widgets/button-group-horizontal-before.png +0 -0
  144. bootstack/assets/widgets/button-group-horizontal-center.png +0 -0
  145. bootstack/assets/widgets/button-group-vertical-after.png +0 -0
  146. bootstack/assets/widgets/button-group-vertical-before.png +0 -0
  147. bootstack/assets/widgets/button-group-vertical-center.png +0 -0
  148. bootstack/assets/widgets/button.png +0 -0
  149. bootstack/assets/widgets/checkbox-checked.png +0 -0
  150. bootstack/assets/widgets/checkbox-indeterminate.png +0 -0
  151. bootstack/assets/widgets/checkbox-unchecked.png +0 -0
  152. bootstack/assets/widgets/field.png +0 -0
  153. bootstack/assets/widgets/icon-button.png +0 -0
  154. bootstack/assets/widgets/input-inner.png +0 -0
  155. bootstack/assets/widgets/input-prefix.png +0 -0
  156. bootstack/assets/widgets/input-suffix.png +0 -0
  157. bootstack/assets/widgets/input.png +0 -0
  158. bootstack/assets/widgets/list-item-focus.png +0 -0
  159. bootstack/assets/widgets/list-item-separated.png +0 -0
  160. bootstack/assets/widgets/menu-item-separated.png +0 -0
  161. bootstack/assets/widgets/notebook-client-border.png +0 -0
  162. bootstack/assets/widgets/notebook-pill-active.png +0 -0
  163. bootstack/assets/widgets/notebook-pill-inactive.png +0 -0
  164. bootstack/assets/widgets/notebook-tab-active.png +0 -0
  165. bootstack/assets/widgets/notebook-tab-border.png +0 -0
  166. bootstack/assets/widgets/notebook-tab-normal.png +0 -0
  167. bootstack/assets/widgets/notebook-underline.png +0 -0
  168. bootstack/assets/widgets/progress-bar-horizontal-default.png +0 -0
  169. bootstack/assets/widgets/progress-bar-horizontal-striped.png +0 -0
  170. bootstack/assets/widgets/progress-bar-vertical-default.png +0 -0
  171. bootstack/assets/widgets/progress-bar-vertical-striped.png +0 -0
  172. bootstack/assets/widgets/progress-trough-horizontal.png +0 -0
  173. bootstack/assets/widgets/progress-trough-vertical.png +0 -0
  174. bootstack/assets/widgets/radio-selected.png +0 -0
  175. bootstack/assets/widgets/radio-unselected.png +0 -0
  176. bootstack/assets/widgets/scrollbar-horizontal-rounded.png +0 -0
  177. bootstack/assets/widgets/scrollbar-vertical-rounded.png +0 -0
  178. bootstack/assets/widgets/separator-horizontal.png +0 -0
  179. bootstack/assets/widgets/separator-vertical.png +0 -0
  180. bootstack/assets/widgets/slider-handle-focus.png +0 -0
  181. bootstack/assets/widgets/slider-handle.png +0 -0
  182. bootstack/assets/widgets/slider-track-horizontal.png +0 -0
  183. bootstack/assets/widgets/slider-track-vertical.png +0 -0
  184. bootstack/assets/widgets/switch-off.png +0 -0
  185. bootstack/assets/widgets/switch-on.png +0 -0
  186. bootstack/assets/widgets/tabs-bar-horizontal.png +0 -0
  187. bootstack/assets/widgets/tabs-bar-vertical.png +0 -0
  188. bootstack/assets/widgets/tabs-pill.png +0 -0
  189. bootstack/cli/__init__.py +124 -0
  190. bootstack/cli/__main__.py +6 -0
  191. bootstack/cli/add.py +439 -0
  192. bootstack/cli/build.py +115 -0
  193. bootstack/cli/config.py +287 -0
  194. bootstack/cli/demo.py +1267 -0
  195. bootstack/cli/doctor.py +195 -0
  196. bootstack/cli/list_cmd.py +71 -0
  197. bootstack/cli/promote.py +120 -0
  198. bootstack/cli/pyinstaller.py +246 -0
  199. bootstack/cli/run.py +99 -0
  200. bootstack/cli/start.py +105 -0
  201. bootstack/cli/templates/__init__.py +861 -0
  202. bootstack/constants.py +325 -0
  203. bootstack/core/__init__.py +34 -0
  204. bootstack/core/capabilities/__init__.py +45 -0
  205. bootstack/core/capabilities/after.py +103 -0
  206. bootstack/core/capabilities/bind.py +154 -0
  207. bootstack/core/capabilities/bindtags.py +112 -0
  208. bootstack/core/capabilities/busy.py +61 -0
  209. bootstack/core/capabilities/clipboard.py +88 -0
  210. bootstack/core/capabilities/focus.py +118 -0
  211. bootstack/core/capabilities/grab.py +65 -0
  212. bootstack/core/capabilities/grid.py +188 -0
  213. bootstack/core/capabilities/localization.py +231 -0
  214. bootstack/core/capabilities/pack.py +119 -0
  215. bootstack/core/capabilities/place.py +92 -0
  216. bootstack/core/capabilities/selection.py +136 -0
  217. bootstack/core/capabilities/signals.py +242 -0
  218. bootstack/core/capabilities/winfo.py +315 -0
  219. bootstack/core/colorutils.py +234 -0
  220. bootstack/core/exceptions.py +95 -0
  221. bootstack/core/images.py +283 -0
  222. bootstack/core/localization/README.md +90 -0
  223. bootstack/core/localization/__init__.py +13 -0
  224. bootstack/core/localization/intl_format.py +580 -0
  225. bootstack/core/localization/msgcat.py +425 -0
  226. bootstack/core/localization/specs.py +143 -0
  227. bootstack/core/mixins/__init__.py +1 -0
  228. bootstack/core/mixins/ttk_state.py +35 -0
  229. bootstack/core/mixins/widget.py +132 -0
  230. bootstack/core/publisher.py +147 -0
  231. bootstack/core/signals/README.md +112 -0
  232. bootstack/core/signals/__init__.py +8 -0
  233. bootstack/core/signals/integration.py +100 -0
  234. bootstack/core/signals/signal.py +317 -0
  235. bootstack/core/signals/types.py +4 -0
  236. bootstack/core/validation/__init__.py +5 -0
  237. bootstack/core/validation/types.py +13 -0
  238. bootstack/core/validation/validation_result.py +17 -0
  239. bootstack/core/validation/validation_rules.py +112 -0
  240. bootstack/core/variables.py +62 -0
  241. bootstack/datasource/README.md +607 -0
  242. bootstack/datasource/__init__.py +51 -0
  243. bootstack/datasource/base.py +474 -0
  244. bootstack/datasource/file_source.py +541 -0
  245. bootstack/datasource/memory_source.py +482 -0
  246. bootstack/datasource/sqlite_source.py +453 -0
  247. bootstack/datasource/types.py +259 -0
  248. bootstack/dialogs/__init__.py +56 -0
  249. bootstack/dialogs/colorchooser.py +674 -0
  250. bootstack/dialogs/colordropper.py +257 -0
  251. bootstack/dialogs/datedialog.py +404 -0
  252. bootstack/dialogs/dialog.py +514 -0
  253. bootstack/dialogs/filterdialog.py +358 -0
  254. bootstack/dialogs/fontdialog.py +339 -0
  255. bootstack/dialogs/formdialog.py +541 -0
  256. bootstack/dialogs/message.py +489 -0
  257. bootstack/dialogs/query.py +561 -0
  258. bootstack/py.typed +1 -0
  259. bootstack/runtime/__init__.py +3 -0
  260. bootstack/runtime/app.py +879 -0
  261. bootstack/runtime/base_window.py +786 -0
  262. bootstack/runtime/events.py +399 -0
  263. bootstack/runtime/menu.py +510 -0
  264. bootstack/runtime/shortcuts.py +423 -0
  265. bootstack/runtime/tk_patch.py +31 -0
  266. bootstack/runtime/toplevel.py +131 -0
  267. bootstack/runtime/utility.py +371 -0
  268. bootstack/runtime/visual_focus.py +228 -0
  269. bootstack/runtime/window_utilities.py +1043 -0
  270. bootstack/style/__init__.py +5498 -0
  271. bootstack/style/bootstyle.py +507 -0
  272. bootstack/style/bootstyle_builder_base.py +752 -0
  273. bootstack/style/bootstyle_builder_mixed.py +93 -0
  274. bootstack/style/bootstyle_builder_tk.py +109 -0
  275. bootstack/style/bootstyle_builder_ttk.py +354 -0
  276. bootstack/style/builders/__init__.py +51 -0
  277. bootstack/style/builders/badge.py +44 -0
  278. bootstack/style/builders/button.py +453 -0
  279. bootstack/style/builders/buttongroup.py +344 -0
  280. bootstack/style/builders/calendar.py +271 -0
  281. bootstack/style/builders/checkbutton.py +95 -0
  282. bootstack/style/builders/combobox.py +112 -0
  283. bootstack/style/builders/contextmenu.py +268 -0
  284. bootstack/style/builders/entry.py +83 -0
  285. bootstack/style/builders/expander.py +171 -0
  286. bootstack/style/builders/field.py +312 -0
  287. bootstack/style/builders/frame.py +27 -0
  288. bootstack/style/builders/label.py +28 -0
  289. bootstack/style/builders/labelframe.py +41 -0
  290. bootstack/style/builders/listview.py +267 -0
  291. bootstack/style/builders/menubar.py +74 -0
  292. bootstack/style/builders/menubutton.py +408 -0
  293. bootstack/style/builders/notebook.py +316 -0
  294. bootstack/style/builders/panedwindow.py +25 -0
  295. bootstack/style/builders/progressbar.py +71 -0
  296. bootstack/style/builders/radiobutton.py +68 -0
  297. bootstack/style/builders/scale.py +66 -0
  298. bootstack/style/builders/scrollbar.py +360 -0
  299. bootstack/style/builders/separator.py +45 -0
  300. bootstack/style/builders/sidenav.py +313 -0
  301. bootstack/style/builders/sizegrip.py +15 -0
  302. bootstack/style/builders/spinbox.py +119 -0
  303. bootstack/style/builders/switch.py +67 -0
  304. bootstack/style/builders/tabitem.py +205 -0
  305. bootstack/style/builders/toolbutton.py +260 -0
  306. bootstack/style/builders/tooltip.py +26 -0
  307. bootstack/style/builders/treeview.py +269 -0
  308. bootstack/style/builders/utils.py +404 -0
  309. bootstack/style/builders_tk/__init__.py +16 -0
  310. bootstack/style/builders_tk/defaults.py +229 -0
  311. bootstack/style/element.py +173 -0
  312. bootstack/style/style.py +499 -0
  313. bootstack/style/theme_provider.py +449 -0
  314. bootstack/style/tk_patch.py +5 -0
  315. bootstack/style/token_maps.py +42 -0
  316. bootstack/style/types.py +32 -0
  317. bootstack/style/typography.py +527 -0
  318. bootstack/style/utility.py +696 -0
  319. bootstack/themes/__init__.py +12 -0
  320. bootstack/themes/standard.py +415 -0
  321. bootstack/themes/user.py +45 -0
  322. bootstack/widgets/__init__.py +53 -0
  323. bootstack/widgets/composites/__init__.py +38 -0
  324. bootstack/widgets/composites/accordion.py +385 -0
  325. bootstack/widgets/composites/appshell.py +445 -0
  326. bootstack/widgets/composites/buttongroup.py +391 -0
  327. bootstack/widgets/composites/calendar.py +914 -0
  328. bootstack/widgets/composites/compositeframe.py +282 -0
  329. bootstack/widgets/composites/contextmenu.py +1754 -0
  330. bootstack/widgets/composites/dateentry.py +261 -0
  331. bootstack/widgets/composites/dropdownbutton.py +190 -0
  332. bootstack/widgets/composites/expander.py +508 -0
  333. bootstack/widgets/composites/field.py +448 -0
  334. bootstack/widgets/composites/floodgauge.py +434 -0
  335. bootstack/widgets/composites/form.py +983 -0
  336. bootstack/widgets/composites/labeledscale.py +209 -0
  337. bootstack/widgets/composites/list/__init__.py +15 -0
  338. bootstack/widgets/composites/list/listitem.py +733 -0
  339. bootstack/widgets/composites/list/listview.py +1507 -0
  340. bootstack/widgets/composites/menubar.py +303 -0
  341. bootstack/widgets/composites/meter.py +882 -0
  342. bootstack/widgets/composites/numericentry.py +183 -0
  343. bootstack/widgets/composites/pagestack.py +330 -0
  344. bootstack/widgets/composites/passwordentry.py +149 -0
  345. bootstack/widgets/composites/pathentry.py +223 -0
  346. bootstack/widgets/composites/radiogroup.py +466 -0
  347. bootstack/widgets/composites/scrolledtext.py +388 -0
  348. bootstack/widgets/composites/scrolledtext.pyi +186 -0
  349. bootstack/widgets/composites/scrollview.py +675 -0
  350. bootstack/widgets/composites/selectbox.py +544 -0
  351. bootstack/widgets/composites/sidenav/__init__.py +24 -0
  352. bootstack/widgets/composites/sidenav/group.py +485 -0
  353. bootstack/widgets/composites/sidenav/header.py +83 -0
  354. bootstack/widgets/composites/sidenav/item.py +413 -0
  355. bootstack/widgets/composites/sidenav/separator.py +51 -0
  356. bootstack/widgets/composites/sidenav/view.py +919 -0
  357. bootstack/widgets/composites/spinnerentry.py +232 -0
  358. bootstack/widgets/composites/tableview/__init__.py +5 -0
  359. bootstack/widgets/composites/tableview/tableview.py +2254 -0
  360. bootstack/widgets/composites/tableview/types.py +169 -0
  361. bootstack/widgets/composites/tabs/__init__.py +6 -0
  362. bootstack/widgets/composites/tabs/tabitem.py +372 -0
  363. bootstack/widgets/composites/tabs/tabs.py +478 -0
  364. bootstack/widgets/composites/tabs/tabview.py +352 -0
  365. bootstack/widgets/composites/textentry.py +90 -0
  366. bootstack/widgets/composites/timeentry.py +189 -0
  367. bootstack/widgets/composites/toast.py +364 -0
  368. bootstack/widgets/composites/togglegroup.py +382 -0
  369. bootstack/widgets/composites/toolbar.py +393 -0
  370. bootstack/widgets/composites/tooltip.py +404 -0
  371. bootstack/widgets/internal/__init__.py +0 -0
  372. bootstack/widgets/internal/wrapper_base.py +304 -0
  373. bootstack/widgets/mixins/__init__.py +25 -0
  374. bootstack/widgets/mixins/configure_mixin.py +186 -0
  375. bootstack/widgets/mixins/entry_mixin.py +70 -0
  376. bootstack/widgets/mixins/font_mixin.py +346 -0
  377. bootstack/widgets/mixins/icon_mixin.py +38 -0
  378. bootstack/widgets/mixins/localization_mixin.py +255 -0
  379. bootstack/widgets/mixins/signal_mixin.py +272 -0
  380. bootstack/widgets/mixins/validation_mixin.py +204 -0
  381. bootstack/widgets/parts/__init__.py +11 -0
  382. bootstack/widgets/parts/numberentry_part.py +345 -0
  383. bootstack/widgets/parts/spinnerentry_part.py +394 -0
  384. bootstack/widgets/parts/textentry_part.py +344 -0
  385. bootstack/widgets/primitives/__init__.py +55 -0
  386. bootstack/widgets/primitives/badge.py +44 -0
  387. bootstack/widgets/primitives/button.py +89 -0
  388. bootstack/widgets/primitives/card.py +66 -0
  389. bootstack/widgets/primitives/checkbutton.py +124 -0
  390. bootstack/widgets/primitives/checktoggle.py +53 -0
  391. bootstack/widgets/primitives/combobox.py +165 -0
  392. bootstack/widgets/primitives/entry.py +98 -0
  393. bootstack/widgets/primitives/frame.py +206 -0
  394. bootstack/widgets/primitives/gridframe.py +479 -0
  395. bootstack/widgets/primitives/label.py +95 -0
  396. bootstack/widgets/primitives/labelframe.py +63 -0
  397. bootstack/widgets/primitives/menubutton.py +118 -0
  398. bootstack/widgets/primitives/notebook.py +551 -0
  399. bootstack/widgets/primitives/optionmenu.py +248 -0
  400. bootstack/widgets/primitives/packframe.py +228 -0
  401. bootstack/widgets/primitives/panedwindow.py +58 -0
  402. bootstack/widgets/primitives/progressbar.py +95 -0
  403. bootstack/widgets/primitives/radiobutton.py +115 -0
  404. bootstack/widgets/primitives/radiotoggle.py +50 -0
  405. bootstack/widgets/primitives/scale.py +85 -0
  406. bootstack/widgets/primitives/scrollbar.py +56 -0
  407. bootstack/widgets/primitives/separator.py +56 -0
  408. bootstack/widgets/primitives/sizegrip.py +47 -0
  409. bootstack/widgets/primitives/spinbox.py +91 -0
  410. bootstack/widgets/primitives/switch.py +41 -0
  411. bootstack/widgets/primitives/treeview.py +77 -0
  412. bootstack/widgets/types.py +20 -0
  413. bootstack-0.1.0a1.dist-info/METADATA +196 -0
  414. bootstack-0.1.0a1.dist-info/RECORD +419 -0
  415. bootstack-0.1.0a1.dist-info/WHEEL +5 -0
  416. bootstack-0.1.0a1.dist-info/entry_points.txt +2 -0
  417. bootstack-0.1.0a1.dist-info/licenses/LICENSE +22 -0
  418. bootstack-0.1.0a1.dist-info/licenses/NOTICE +10 -0
  419. bootstack-0.1.0a1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,115 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, Callable, Literal, Optional, TYPE_CHECKING, TypedDict
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.internal.wrapper_base import TTKWrapperBase
11
+ from bootstack.widgets.mixins import IconMixin, LocalizationMixin, SignalMixin, TextSignalMixin
12
+ from bootstack.widgets.mixins.configure_mixin import configure_delegate
13
+ from bootstack.widgets.types import Master
14
+
15
+ if TYPE_CHECKING:
16
+ from bootstack.core.signals import Signal
17
+
18
+
19
+ class RadioButtonKwargs(TypedDict, total=False):
20
+ # Standard ttk.Radiobutton options
21
+ text: Any
22
+ command: Optional[Callable[[], Any]]
23
+ image: Any
24
+ icon: Any
25
+ icon_only: bool
26
+ compound: Literal['text', 'image', 'top', 'bottom', 'left', 'right', 'center', 'none'] | str
27
+ variable: Any
28
+ signal: Signal[Any]
29
+ value: Any
30
+ padding: Any
31
+ anchor: str
32
+ width: int
33
+ underline: int
34
+ state: Literal['normal', 'active', 'disabled', 'readonly'] | str
35
+ takefocus: Any
36
+ style: str
37
+ class_: str
38
+ cursor: str
39
+ name: str
40
+ textvariable: Any
41
+ textsignal: Signal[str]
42
+
43
+ # bootstack-specific extensions
44
+ bootstyle: str # DEPRECATED: Use accent and variant instead
45
+ accent: str
46
+ variant: str
47
+ surface: str
48
+ style_options: dict[str, Any]
49
+ localize: bool | Literal['auto']
50
+
51
+
52
+ class RadioButton(LocalizationMixin, SignalMixin, TextSignalMixin, IconMixin, TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Radiobutton):
53
+ """bootstack wrapper for `ttk.Radiobutton` with bootstyle and icon support."""
54
+
55
+ _ttk_base = ttk.Radiobutton
56
+
57
+ def __init__(self, master: Master = None, **kwargs: Unpack[RadioButtonKwargs]) -> None:
58
+ """Create a themed bootstack Radiobutton.
59
+
60
+ Args:
61
+ master: Parent widget. If None, uses the default root window.
62
+
63
+ Other Parameters:
64
+ text (str): Text to display.
65
+ textvariable (Variable): Tk variable linked to the text.
66
+ textsignal (Signal[str]): Reactive Signal linked to the text (auto-synced with textvariable).
67
+ command (Callable): Callable invoked when the value is selected.
68
+ image (PhotoImage): Image to display.
69
+ icon (str | dict): Theme-aware icon spec handled by the style system.
70
+ icon_only (bool): Removes the additional padding added for label.
71
+ compound (str): Placement of the image relative to text.
72
+ variable (Variable): Linked Tk variable that receives the selected value.
73
+ signal (Signal): Reactive Signal that receives the selected value (auto-synced with variable).
74
+ value (Any): The value assigned to `variable` when this radio is selected.
75
+ padding (int | tuple): Extra space around the content.
76
+ anchor (str): Determines how the content is aligned in the container. Combination of 'n', 's', 'e', 'w', or 'center' (default).
77
+ width (int): Width of the control in characters.
78
+ underline (int): Index of character to underline in `text`.
79
+ state (str): Widget state.
80
+ takefocus (bool): Whether the widget participates in focus traversal.
81
+ style (str): Explicit ttk style name (overrides accent/variant).
82
+ accent (str): Accent token for styling, e.g. 'primary', 'success', 'danger'.
83
+ variant (str): Style variant, e.g. 'default'.
84
+ bootstyle (str): DEPRECATED - Use `accent` and `variant` instead.
85
+ Combined style tokens (e.g., 'primary', 'success').
86
+ surface (str): Optional surface token; otherwise inherited.
87
+ style_options (dict): Optional dict forwarded to the style builder.
88
+ localize (bool | Literal['auto']): Determines the widget's localization mode.
89
+ """
90
+ kwargs.update(style_options=self._capture_style_options(['icon_only', 'icon', '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,50 @@
1
+ from typing import Literal
2
+
3
+ from bootstack.widgets.primitives.radiobutton import RadioButton
4
+ from bootstack.widgets.types import Master
5
+
6
+
7
+ class RadioToggle(RadioButton):
8
+ """bootstack wrapper for `ttk.Radiobutton` that renders with a toggle badge style."""
9
+
10
+ def __init__(self, master: Master = None, **kwargs):
11
+ """Create a themed bootstack RadioToggle.
12
+
13
+ Args:
14
+ master: Parent widget. If None, uses the default root window.
15
+
16
+ Other Parameters:
17
+ text (str): Text to display.
18
+ textvariable (Variable): Tk variable linked to the text.
19
+ textsignal (Signal[str]): Reactive Signal linked to the text (auto-synced with textvariable).
20
+ command (Callable): Callable invoked when the value is selected.
21
+ image (PhotoImage): Image to display.
22
+ icon (str | dict): Theme-aware icon spec handled by the style system.
23
+ icon_only (bool): Removes the additional padding added for label text.
24
+ compound (str): Placement of the image relative to text.
25
+ variable (Variable): Linked Tk variable that receives the selected value.
26
+ signal (Signal): Reactive Signal that receives the selected value (auto-synced with variable).
27
+ value (Any): The value assigned to `variable` when this radio is selected.
28
+ padding (int | tuple): Extra space around the content.
29
+ anchor (str): Determines how the content is aligned in the container. Combination of 'n', 's', 'e', 'w', or 'center' (default).
30
+ density (str): The vertical and horizontal compactness of widget content, e.g. 'default', 'compact'.
31
+ width (int): Width of the control in characters.
32
+ underline (int): Index of character to underline in `text`.
33
+ state (str): Widget state ('normal', 'active', 'disabled', 'readonly').
34
+ takefocus (bool): Whether the widget participates in focus traversal.
35
+ accent (str): Accent token for styling, e.g. 'primary', 'success', 'danger'.
36
+ surface (str): Optional surface token; otherwise inherited.
37
+ style_options (dict): Optional dict forwarded to the style builder.
38
+ localize (bool | Literal['auto']): Determines the widget's localization mode.
39
+ """
40
+ self._capture_density_option(kwargs)
41
+ kwargs.setdefault('ttk_class', 'Toolbutton')
42
+ super().__init__(master, **kwargs)
43
+
44
+ @staticmethod
45
+ def _capture_density_option(kwargs: dict) -> None:
46
+ """Capture density from kwargs into style_options."""
47
+ density: Literal['default', 'compact'] | None = kwargs.pop('density', None)
48
+ if density is not None:
49
+ style_options = kwargs.setdefault('style_options', {})
50
+ style_options['density'] = density
@@ -0,0 +1,85 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, TypedDict, 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.internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets.mixins.configure_mixin import configure_delegate
11
+ from bootstack.widgets.types import Master
12
+ from ..mixins import SignalMixin
13
+
14
+ if TYPE_CHECKING:
15
+ from bootstack.core.signals import Signal
16
+
17
+
18
+ class ScaleKwargs(TypedDict, total=False):
19
+ # Standard ttk.Scale options
20
+ from_: float
21
+ to: float
22
+ value: float
23
+ variable: Any
24
+ signal: Signal[Any]
25
+ orient: Any
26
+ length: Any
27
+ command: Any
28
+ takefocus: Any
29
+ style: str
30
+ class_: str
31
+ cursor: str
32
+ name: str
33
+
34
+ # bootstack-specific extensions
35
+ bootstyle: str # DEPRECATED: Use accent and variant instead
36
+ accent: str
37
+ surface: str
38
+ style_options: dict[str, Any]
39
+
40
+
41
+ class Scale(SignalMixin, TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Scale):
42
+ """bootstack wrapper for `ttk.Scale` with bootstyle support."""
43
+
44
+ _ttk_base = ttk.Scale
45
+
46
+ def __init__(self, master: Master = None, **kwargs: Unpack[ScaleKwargs]) -> None:
47
+ """Create a themed bootstack Scale.
48
+
49
+ Args:
50
+ master: Parent widget. If None, uses the default root window.
51
+
52
+ Other Parameters:
53
+ from_ (float): Minimum value.
54
+ to (float): Maximum value.
55
+ value (float): Initial value.
56
+ variable (Variable): Tk variable linked to the value.
57
+ signal (Signal): Reactive Signal linked to the value (auto-synced with variable).
58
+ orient (str): Orientation of the scale ('horizontal' or 'vertical').
59
+ length (int): Scale length in pixels.
60
+ command (Callable): Callback on value change.
61
+ takefocus (bool): Whether the widget participates in focus traversal.
62
+ accent (str): Accent token for styling, e.g. 'primary', 'success', 'danger'.
63
+ bootstyle (str): DEPRECATED - Use `accent` instead.
64
+ surface (str): Optional surface token; otherwise inherited.
65
+ style_options (dict): Optional dict forwarded to the style builder.
66
+ """
67
+ super().__init__(master, **kwargs)
68
+
69
+ @property
70
+ def value(self) -> float:
71
+ """Get or set the scale's current 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)
84
+
85
+
@@ -0,0 +1,56 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, TypedDict
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.internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets.types import Master
11
+
12
+
13
+ class ScrollbarKwargs(TypedDict, total=False):
14
+ # Standard ttk.Scrollbar options
15
+ orient: Any
16
+ command: Any
17
+ takefocus: Any
18
+ style: str
19
+ class_: str
20
+ cursor: str
21
+ name: str
22
+
23
+ # bootstack-specific extensions
24
+ bootstyle: str # DEPRECATED: Use accent and variant instead
25
+ accent: str
26
+ variant: str
27
+ surface: str
28
+ style_options: dict[str, Any]
29
+
30
+
31
+ class Scrollbar(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Scrollbar):
32
+ """bootstack wrapper for `ttk.Scrollbar` with bootstyle support."""
33
+
34
+ _ttk_base = ttk.Scrollbar
35
+
36
+ def __init__(self, master: Master = None, **kwargs: Unpack[ScrollbarKwargs]) -> None:
37
+ """Create a themed bootstack Scrollbar.
38
+
39
+ Args:
40
+ master: Parent widget. If None, uses the default root window.
41
+
42
+ Other Parameters:
43
+ orient (str): Orientation of the scrollbar ('horizontal' or 'vertical').
44
+ command (Callable): Scroll command callback.
45
+ takefocus (bool): Whether the widget participates in focus traversal.
46
+ style (str): Explicit ttk style name (overrides accent/variant).
47
+ accent (str): Accent token for styling, e.g. 'primary', 'danger', 'success'.
48
+ variant (str): Style variant, e.g. 'default', 'round', 'square'.
49
+ bootstyle (str): DEPRECATED - Use `accent` and `variant` instead.
50
+ Combined style tokens (e.g., 'primary', 'danger-square').
51
+ surface (str): Optional surface token; otherwise inherited.
52
+ style_options (dict): Optional dict forwarded to the style builder.
53
+ """
54
+ super().__init__(master, **kwargs)
55
+
56
+
@@ -0,0 +1,56 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, TypedDict
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.internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets.types import Master
11
+
12
+
13
+ class SeparatorKwargs(TypedDict, total=False):
14
+ # Standard ttk.Separator options
15
+ orient: Any
16
+ style: str
17
+ class_: str
18
+ cursor: str
19
+ name: str
20
+
21
+ # bootstack-specific extensions
22
+ bootstyle: str # DEPRECATED: Use accent and variant instead
23
+ accent: str
24
+ surface: str
25
+ thickness: int
26
+ length: int
27
+ style_options: dict[str, Any]
28
+
29
+
30
+ class Separator(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Separator):
31
+ """bootstack wrapper for `ttk.Separator` with bootstyle support."""
32
+
33
+ _ttk_base = ttk.Separator
34
+
35
+ def __init__(self, master: Master = None, **kwargs: Unpack[SeparatorKwargs]) -> None:
36
+ """Create a themed bootstack Separator.
37
+
38
+ Args:
39
+ master: Parent widget. If None, uses the default root window.
40
+
41
+ Other Parameters:
42
+ orient (str): Orientation of the separator ('horizontal' or 'vertical').
43
+ style (str): Explicit ttk style name (overrides accent/variant).
44
+ accent (str): Accent token for styling, e.g. 'primary', 'secondary' otherwise derived from inherited surface.
45
+ bootstyle (str): DEPRECATED - Use `accent` and `variant` instead.
46
+ Combined style tokens.
47
+ surface (str): Optional surface token; otherwise inherited.
48
+ thickness (int): Thickness of the separator.
49
+ length (int): Fixed length of the separator in pixels. If None,
50
+ stretches to fill available space.
51
+ style_options (dict): Optional dict forwarded to the style builder.
52
+ """
53
+ kwargs.update(style_options=self._capture_style_options(['thickness', 'length'], kwargs))
54
+ super().__init__(master, **kwargs)
55
+
56
+
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, TypedDict
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.internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets.types import Master
11
+
12
+
13
+ class SizeGripKwargs(TypedDict, total=False):
14
+ # Standard ttk.Sizegrip options
15
+ style: str
16
+ class_: str
17
+ cursor: str
18
+ name: str
19
+
20
+ # bootstack-specific extensions
21
+ bootstyle: str # DEPRECATED: Use accent and variant instead
22
+ accent: str
23
+ surface: str
24
+ style_options: dict[str, Any]
25
+
26
+
27
+ class SizeGrip(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Sizegrip):
28
+ """bootstack wrapper for `ttk.Sizegrip` with bootstyle support."""
29
+
30
+ _ttk_base = ttk.Sizegrip
31
+
32
+ def __init__(self, master: Master = None, **kwargs: Unpack[SizeGripKwargs]) -> None:
33
+ """Create a themed bootstack Sizegrip.
34
+
35
+ Args:
36
+ master: Parent widget. If None, uses the default root window.
37
+
38
+ Other Parameters:
39
+ style (str): Explicit ttk style name (overrides accent/variant).
40
+ accent (str): Accent token for styling.
41
+ bootstyle (str): DEPRECATED - Use `accent` instead.
42
+ surface (str): Optional surface token; otherwise inherited.
43
+ style_options (dict): Optional dict forwarded to the style builder.
44
+ """
45
+ super().__init__(master, **kwargs)
46
+
47
+
@@ -0,0 +1,91 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, Literal, TypedDict, 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.internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets.types import Master
11
+ from ..mixins import TextSignalMixin, configure_delegate
12
+
13
+ if TYPE_CHECKING:
14
+ from bootstack.core.signals import Signal
15
+
16
+
17
+ class SpinboxKwargs(TypedDict, 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: Literal['normal','disabled','readonly'] | str
31
+ takefocus: Any
32
+ style: str
33
+ class_: str
34
+ cursor: str
35
+ name: str
36
+
37
+ # bootstack-specific extensions
38
+ bootstyle: str # DEPRECATED: Use accent and variant instead
39
+ accent: str
40
+ density: Literal['default', 'compact']
41
+ surface: str
42
+ style_options: dict[str, Any]
43
+
44
+
45
+ class Spinbox(TextSignalMixin, TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Spinbox):
46
+ """bootstack wrapper for `ttk.Spinbox` with bootstyle support."""
47
+
48
+ _ttk_base = ttk.Spinbox
49
+
50
+ def __init__(self, master: Master = None, **kwargs: Unpack[SpinboxKwargs]) -> None:
51
+ """Create a themed bootstack Spinbox.
52
+
53
+ Args:
54
+ master: Parent widget. If None, uses the default root window.
55
+
56
+ Other Parameters:
57
+ from_ (float): Minimum value.
58
+ to (float): Maximum value.
59
+ increment (float): Step size between values.
60
+ values (list): Sequence of values to cycle through.
61
+ wrap (bool): Whether to wrap between min/max.
62
+ command (Callable): Callback when the value changes.
63
+ textvariable (Variable): Tk variable linked to the entry text.
64
+ textsignal (Signal): Reactive Signal linked to the text (auto-synced with textvariable).
65
+ format (str): Display format string.
66
+ width (int): Widget width in characters.
67
+ state (str): Widget state.
68
+ takefocus (bool): Whether the widget participates in focus traversal.
69
+ style (str): Explicit ttk style name (overrides accent/variant).
70
+ accent (str): Accent token for styling, e.g. 'primary', 'danger', 'success'.
71
+ density (str): The vertical and horizontal compactness, e.g. 'default', 'compact'.
72
+ bootstyle (str): DEPRECATED - Use `accent` instead.
73
+ surface (str): Optional surface token; otherwise inherited.
74
+ style_options (dict): Optional dict forwarded to the style builder.
75
+ """
76
+ if kwargs.get('density') == 'compact':
77
+ kwargs['font'] = 'caption'
78
+ kwargs.update(style_options=self._capture_style_options(['density'], kwargs))
79
+ super().__init__(master, **kwargs)
80
+
81
+
82
+ @configure_delegate('density')
83
+ def _delegate_density(self, value=None):
84
+ if value is None:
85
+ return self.configure_style_options(value)
86
+ else:
87
+ if value == 'compact':
88
+ self.configure(font='caption')
89
+ else:
90
+ self.configure(font='body')
91
+ return self.configure_style_options(density=value)
@@ -0,0 +1,41 @@
1
+ from bootstack.widgets.primitives.checkbutton import CheckButton
2
+ from bootstack.widgets.types import Master
3
+
4
+
5
+ class Switch(CheckButton):
6
+ """bootstack wrapper for `ttk.Checkbutton` that renders with a Switch style"""
7
+
8
+ def __init__(self, master: Master = None, **kwargs):
9
+ """Create a themed bootstack Switch.
10
+
11
+ Args:
12
+ master: Parent widget. If None, uses the default root window.
13
+
14
+ Other Parameters:
15
+ text (str): Text to display on the toggle.
16
+ textvariable (Variable): Tk variable linked to the text.
17
+ textsignal (Signal[str]): Reactive Signal linked to the text (auto-synced with textvariable).
18
+ command (Callable): Callable invoked when the toggle changes state.
19
+ image (PhotoImage): Image to display.
20
+ icon (str | dict): Theme-aware icon spec handled by the style system.
21
+ icon_only (bool): If True, removes the additional padding reserved for text.
22
+ compound (str): Placement of the image relative to text.
23
+ variable (Variable): Linked variable controlling the on/off state.
24
+ signal (Signal): Reactive Signal controlling the on/off state (auto-synced with variable).
25
+ value (Any): Initial state for the widget's associated variable (defaults to None when unset).
26
+ onvalue (Any): Value set in `variable` when selected.
27
+ offvalue (Any): Value set in `variable` when deselected.
28
+ padding (int | tuple): Extra space around the content.
29
+ anchor (str): Determines how the content is aligned in the container. Combination of 'n', 's', 'e', 'w', or 'center' (default).
30
+ width (int): Width of the control in characters.
31
+ underline (int): Index of character to underline in `text`.
32
+ state (str): Widget state ('normal', 'active', 'disabled', 'readonly').
33
+ takefocus (bool): Whether the widget participates in focus traversal.
34
+ accent (str): Accent token for styling, e.g. 'primary', 'success', 'danger'.
35
+ surface (str): Optional surface token; otherwise inherited.
36
+ style_options (dict): Optional dict forwarded to the style builder.
37
+ localize (bool | Literal['auto']): Determines the widget's localization mode.
38
+ """
39
+ if 'bootstyle' not in kwargs:
40
+ kwargs['variant'] = 'switch'
41
+ super().__init__(master, **kwargs)
@@ -0,0 +1,77 @@
1
+ from __future__ import annotations
2
+
3
+ from tkinter import ttk
4
+ from typing import Any, Literal, TypedDict
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.internal.wrapper_base import TTKWrapperBase
10
+ from bootstack.widgets.types import Master
11
+
12
+
13
+ class TreeViewKwargs(TypedDict, 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
+ style: str
22
+ class_: str
23
+ cursor: str
24
+ name: str
25
+
26
+ # bootstack-specific extensions
27
+ surface: str
28
+ density: Literal['default', 'compact']
29
+ border_color: str
30
+ show_border: bool
31
+ select_background: str
32
+ header_background: str
33
+ style_options: dict[str, Any]
34
+
35
+
36
+ class TreeView(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Treeview):
37
+ """bootstack wrapper for `ttk.Treeview` with bootstyle support."""
38
+
39
+ _ttk_base = ttk.Treeview
40
+
41
+ def __init__(self, master: Master = None, **kwargs: Unpack[TreeViewKwargs]) -> None:
42
+ """Create a themed bootstack Treeview.
43
+
44
+ Args:
45
+ master: Parent widget. If None, uses the default root window.
46
+
47
+ Other Parameters:
48
+ columns (list): Sequence of column identifiers.
49
+ displaycolumns (list | str): Subset and order of columns to display.
50
+ show (str): Which parts to display (e.g., 'tree', 'headings').
51
+ height (int): Number of rows to display.
52
+ padding (int | tuple): Extra padding around the widget.
53
+ selectmode (str): Selection mode ('browse', 'extended', 'none').
54
+ style (str): Explicit ttk style name.
55
+ surface (str): Optional surface token; otherwise inherited.
56
+ density (str): The compactness of widget content ('default' or 'compact').
57
+ border_color (str): The color of the border around the table.
58
+ show_border (bool): Whether to show a border around the table.
59
+ open_icon (str | dict): The icon used for open state.
60
+ close_icon (str | dict): The icon used for close state.
61
+ select_background (str): A semantic color token used to set selection background color.
62
+ header_background (str): A semantic color token used to set the header background color.
63
+ style_options (dict): Optional dict forwarded to the style builder.
64
+ """
65
+ kwargs.update(style_options=self._capture_style_options([
66
+ 'density',
67
+ 'border_color',
68
+ 'show_border',
69
+ 'open_icon',
70
+ 'close_icon',
71
+ 'select_background',
72
+ 'header_background'
73
+ ],
74
+ kwargs))
75
+ super().__init__(master, **kwargs)
76
+
77
+
@@ -0,0 +1,20 @@
1
+ """Common type aliases for bootstack widgets.
2
+
3
+ This module provides centralized type definitions used across all widget modules
4
+ to ensure consistency and reduce import boilerplate.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import tkinter
10
+ from typing import Any, Callable, Optional, Union
11
+
12
+ # Master widget type - used for the `master` parameter in all widget constructors
13
+ Master = Optional[tkinter.Misc]
14
+
15
+ # Callback types
16
+ EventCallback = Callable[[tkinter.Event], None]
17
+ CommandCallback = Callable[[], Any]
18
+
19
+ # Common parameter types
20
+ WidgetKwargs = dict[str, Any]