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,393 @@
1
+ """Toolbar widget with customizable content and optional window controls."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from tkinter import Widget
6
+ from typing import Any, Callable, Literal
7
+
8
+ from typing_extensions import TypedDict, Unpack
9
+
10
+ from bootstack.widgets.primitives.frame import Frame
11
+ from bootstack.widgets.primitives.button import Button
12
+ from bootstack.widgets.primitives.label import Label
13
+ from bootstack.widgets.primitives.separator import Separator
14
+ from bootstack.widgets.mixins import configure_delegate
15
+ from bootstack.widgets.types import Master
16
+
17
+
18
+ class ToolbarKwargs(TypedDict, total=False):
19
+ show_window_controls: bool
20
+ draggable: bool
21
+ button_variant: str
22
+ density: Literal['default', 'compact']
23
+ padding: Any
24
+ # Frame options
25
+ width: int
26
+ height: int
27
+ surface: str
28
+ show_border: bool
29
+
30
+
31
+ class Toolbar(Frame):
32
+ """A horizontal toolbar with customizable content and optional window controls.
33
+
34
+ Toolbar provides a container for icon buttons, labels, and other widgets
35
+ arranged horizontally. It optionally supports window control buttons
36
+ (minimize, maximize, close) and window dragging for custom titlebars.
37
+
38
+ Items are added from left to right. Use `add_spacer()` to push
39
+ subsequent items to the right side.
40
+
41
+ Example:
42
+ ```python
43
+ # Basic toolbar with buttons
44
+ toolbar = Toolbar(root)
45
+ toolbar.add_button(icon='list', command=toggle_menu)
46
+ toolbar.add_separator()
47
+ toolbar.add_label(text='My App')
48
+ toolbar.add_spacer()
49
+ toolbar.add_button(icon='gear', command=settings)
50
+
51
+ # Custom titlebar with window controls
52
+ toolbar = Toolbar(
53
+ root,
54
+ show_window_controls=True,
55
+ draggable=True,
56
+ )
57
+ toolbar.add_label(text='My App', font='heading-md')
58
+ ```
59
+ """
60
+
61
+ def __init__(
62
+ self,
63
+ master: Master = None,
64
+ show_window_controls: bool = False,
65
+ draggable: bool = False,
66
+ button_variant: str = 'ghost',
67
+ density: Literal['default', 'compact'] = 'default',
68
+ padding: int | tuple = None,
69
+ **kwargs: Unpack[ToolbarKwargs]
70
+ ):
71
+ """Initialize a Toolbar.
72
+
73
+ Args:
74
+ master (Master | None): Parent widget.
75
+ show_window_controls (bool): Show minimize/maximize/close buttons.
76
+ Default False.
77
+ draggable (bool): Enable window dragging by clicking and dragging
78
+ the toolbar. Default False.
79
+ button_variant (str): Default variant for toolbar buttons.
80
+ Default 'ghost'.
81
+ density (str): Button density for toolbar items. 'compact' for
82
+ smaller buttons, 'default' for standard size. Default 'default'.
83
+ padding (int | tuple): Toolbar padding. If None, uses density-based
84
+ default ((3, 1) for compact, 3 for default).
85
+ **kwargs: Additional arguments passed to Frame.
86
+ """
87
+ if padding is None:
88
+ padding = (3, 1) if density == 'compact' else 3
89
+ super().__init__(master, padding=padding, **kwargs)
90
+
91
+ self._show_window_controls = show_window_controls
92
+ self._draggable = draggable or show_window_controls # Auto-enable drag with window controls
93
+ self._button_variant = button_variant
94
+ self._density = density
95
+
96
+ # Content container (left side)
97
+ self._content_frame = Frame(self)
98
+ self._content_frame.pack(side='left', fill='both', expand=True)
99
+
100
+ # Window controls container (right side)
101
+ self._controls_frame: Frame | None = None
102
+ if show_window_controls:
103
+ self._build_window_controls()
104
+
105
+ # Drag state
106
+ self._drag_start_x = 0
107
+ self._drag_start_y = 0
108
+
109
+ if self._draggable:
110
+ self._setup_drag()
111
+
112
+ def _build_window_controls(self):
113
+ """Build window control buttons (minimize, maximize, close)."""
114
+ self._controls_frame = Frame(self)
115
+ self._controls_frame.pack(side='right', fill='y')
116
+
117
+ # Minimize button
118
+ self._minimize_btn = Button(
119
+ self._controls_frame,
120
+ icon='dash-lg',
121
+ icon_only=True,
122
+ variant='ghost',
123
+ density='compact',
124
+ surface=self._surface,
125
+ command=self._on_minimize,
126
+ )
127
+ self._minimize_btn.pack(side='left', padx=2)
128
+
129
+ # Maximize/Restore button
130
+ self._maximize_btn = Button(
131
+ self._controls_frame,
132
+ icon='app',
133
+ icon_only=True,
134
+ variant='ghost',
135
+ density='compact',
136
+ surface=self._surface,
137
+ command=self._on_maximize,
138
+ )
139
+ self._maximize_btn.pack(side='left', padx=2)
140
+
141
+ # Close button
142
+ self._close_btn = Button(
143
+ self._controls_frame,
144
+ icon='x-lg',
145
+ icon_only=True,
146
+ variant='ghost',
147
+ density='compact',
148
+ surface=self._surface,
149
+ command=self._on_close,
150
+ )
151
+ self._close_btn.pack(side='left', padx=2)
152
+
153
+ def _on_minimize(self):
154
+ """Handle minimize button click."""
155
+ window = self.winfo_toplevel()
156
+ window.iconify()
157
+
158
+ def _on_maximize(self):
159
+ """Handle maximize/restore button click."""
160
+ window = self.winfo_toplevel()
161
+ # Check current state and toggle
162
+ if window.state() == 'zoomed':
163
+ window.state('normal')
164
+ self._maximize_btn.configure(icon='app')
165
+ else:
166
+ window.state('zoomed')
167
+ self._maximize_btn.configure(icon='copy')
168
+
169
+ def _on_close(self):
170
+ """Handle close button click."""
171
+ window = self.winfo_toplevel()
172
+ window.destroy()
173
+
174
+ def _setup_drag(self):
175
+ """Set up window dragging bindings."""
176
+ self.bind('<Button-1>', self._on_drag_start, add='+')
177
+ self.bind('<B1-Motion>', self._on_drag_motion, add='+')
178
+ self._content_frame.bind('<Button-1>', self._on_drag_start, add='+')
179
+ self._content_frame.bind('<B1-Motion>', self._on_drag_motion, add='+')
180
+
181
+ def _on_drag_start(self, event):
182
+ """Record drag start position."""
183
+ self._drag_start_x = event.x_root
184
+ self._drag_start_y = event.y_root
185
+
186
+ def _on_drag_motion(self, event):
187
+ """Handle drag motion to move window."""
188
+ window = self.winfo_toplevel()
189
+
190
+ # Calculate delta
191
+ dx = event.x_root - self._drag_start_x
192
+ dy = event.y_root - self._drag_start_y
193
+
194
+ # Get current position
195
+ x = window.winfo_x() + dx
196
+ y = window.winfo_y() + dy
197
+
198
+ # Move window
199
+ window.geometry(f'+{x}+{y}')
200
+
201
+ # Update drag start for next motion
202
+ self._drag_start_x = event.x_root
203
+ self._drag_start_y = event.y_root
204
+
205
+ # --- Public API: Adding Items ---
206
+
207
+ def add_button(
208
+ self,
209
+ icon: str | dict = None,
210
+ text: str = None,
211
+ command: Callable = None,
212
+ accent: str = None,
213
+ variant: str = None,
214
+ **kwargs
215
+ ) -> Button:
216
+ """Add a button to the toolbar.
217
+
218
+ Args:
219
+ icon (str | dict | None): Icon name or configuration.
220
+ text (str | None): Button text. If None and icon provided,
221
+ creates icon-only button.
222
+ command (Callable | None): Button click callback.
223
+ accent (str | None): Button accent token.
224
+ variant (str | None): Button variant. Uses toolbar default if None.
225
+ **kwargs: Additional arguments passed to Button.
226
+
227
+ Returns:
228
+ Button: The created button.
229
+ """
230
+ btn = Button(
231
+ self._content_frame,
232
+ icon=icon,
233
+ text=text,
234
+ icon_only=(icon is not None and text is None),
235
+ command=command,
236
+ accent=accent,
237
+ variant=variant or self._button_variant,
238
+ density=kwargs.pop('density', self._density),
239
+ surface=kwargs.pop('surface', self._surface),
240
+ **kwargs
241
+ )
242
+ btn.pack(side='left')
243
+ return btn
244
+
245
+ def add_label(
246
+ self,
247
+ text: str = '',
248
+ icon: str | dict = None,
249
+ font: str = None,
250
+ **kwargs
251
+ ) -> Label:
252
+ """Add a label to the toolbar.
253
+
254
+ Args:
255
+ text (str): Label text.
256
+ icon (str | dict | None): Optional icon.
257
+ font (str | None): Font specification.
258
+ **kwargs: Additional arguments passed to Label.
259
+
260
+ Returns:
261
+ Label: The created label.
262
+ """
263
+ lbl = Label(
264
+ self._content_frame,
265
+ text=text,
266
+ icon=icon,
267
+ font=font,
268
+ surface=kwargs.pop('surface', self._surface),
269
+ **kwargs
270
+ )
271
+ lbl.pack(side='left', padx=4)
272
+
273
+ # Make label draggable too if toolbar is draggable
274
+ if self._draggable:
275
+ lbl.bind('<Button-1>', self._on_drag_start, add='+')
276
+ lbl.bind('<B1-Motion>', self._on_drag_motion, add='+')
277
+
278
+ return lbl
279
+
280
+ def add_separator(self, length: int = 16, **kwargs) -> Separator:
281
+ """Add a vertical separator to the toolbar.
282
+
283
+ Args:
284
+ length (int | None): Fixed length in pixels. If None, stretches
285
+ to fill the toolbar height.
286
+ **kwargs: Additional arguments passed to Separator.
287
+
288
+ Returns:
289
+ Separator: The created separator.
290
+ """
291
+ sep = Separator(
292
+ self._content_frame,
293
+ orient='vertical',
294
+ length=length,
295
+ **kwargs
296
+ )
297
+ # Only fill='y' if no fixed length specified
298
+ if length:
299
+ sep.pack(side='left', padx=4)
300
+ else:
301
+ sep.pack(side='left', fill='y', padx=4)
302
+ return sep
303
+
304
+ def add_spacer(self) -> Frame:
305
+ """Add a flexible spacer that pushes subsequent items to the right.
306
+
307
+ Returns:
308
+ Frame: The spacer frame.
309
+ """
310
+ spacer = Frame(self._content_frame)
311
+ spacer.pack(side='left', fill='both', expand=True)
312
+
313
+ # Make spacer draggable too
314
+ if self._draggable:
315
+ spacer.bind('<Button-1>', self._on_drag_start, add='+')
316
+ spacer.bind('<B1-Motion>', self._on_drag_motion, add='+')
317
+
318
+ return spacer
319
+
320
+ def add_widget(self, widget: Widget, **pack_kwargs) -> Widget:
321
+ """Add a custom widget to the toolbar.
322
+
323
+ The widget must already be created with the toolbar's content frame
324
+ as its parent. Use `toolbar.content` to get the parent frame.
325
+
326
+ Args:
327
+ widget (Widget): The widget to add.
328
+ **pack_kwargs: Arguments passed to pack(). Defaults to side='left'.
329
+
330
+ Returns:
331
+ Widget: The added widget.
332
+ """
333
+ pack_kwargs.setdefault('side', 'left')
334
+ pack_kwargs.setdefault('padx', 2)
335
+ widget.pack(**pack_kwargs)
336
+ return widget
337
+
338
+ # --- Properties ---
339
+
340
+ @property
341
+ def content(self) -> Frame:
342
+ """Get the content frame for adding custom widgets."""
343
+ return self._content_frame
344
+
345
+ @property
346
+ def show_window_controls(self) -> bool:
347
+ """Check if window controls are shown."""
348
+ return self._show_window_controls
349
+
350
+ @property
351
+ def draggable(self) -> bool:
352
+ """Check if toolbar is draggable."""
353
+ return self._draggable
354
+
355
+ @property
356
+ def density(self) -> str:
357
+ """Get the toolbar's button density."""
358
+ return self._density
359
+
360
+ # --- Window Control Access ---
361
+
362
+ @property
363
+ def minimize_button(self) -> Button | None:
364
+ """Get the minimize button (if window controls are shown)."""
365
+ return getattr(self, '_minimize_btn', None)
366
+
367
+ @property
368
+ def maximize_button(self) -> Button | None:
369
+ """Get the maximize button (if window controls are shown)."""
370
+ return getattr(self, '_maximize_btn', None)
371
+
372
+ @property
373
+ def close_button(self) -> Button | None:
374
+ """Get the close button (if window controls are shown)."""
375
+ return getattr(self, '_close_btn', None)
376
+
377
+ # --- Configuration Delegates ---
378
+
379
+ @configure_delegate('density')
380
+ def _delegate_density(self, value: str = None):
381
+ """Configure the toolbar's default button density."""
382
+ if value is None:
383
+ return self._density
384
+ self._density = value
385
+ return None
386
+
387
+ @configure_delegate('button_variant')
388
+ def _delegate_button_variant(self, value: str = None):
389
+ """Configure the toolbar's default button variant."""
390
+ if value is None:
391
+ return self._button_variant
392
+ self._button_variant = value
393
+ return None