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,354 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Callable, TYPE_CHECKING, overload
4
+
5
+ from bootstack.widgets._impl.composites.list.listview import ListView as _InternalListView
6
+ from bootstack.widgets._core.base import PublicWidgetBase
7
+ from bootstack.widgets._core.events import register_widget_events
8
+ from bootstack.events import Subscription
9
+ from bootstack.streams import Stream
10
+ from bootstack.widgets.types import AccentToken, Event, WidgetDensity, SelectionMode, ScrollbarVariant
11
+
12
+ if TYPE_CHECKING:
13
+ from bootstack.data.types import DataSourceProtocol
14
+
15
+
16
+ class ListView(PublicWidgetBase):
17
+ """A virtual-scrolling list for efficiently displaying large datasets.
18
+
19
+ Renders only visible rows, making it suitable for thousands of records.
20
+ Populate via `items=` (a plain list of dicts) or `data_source=` (a data
21
+ source for database-backed or API-backed data).
22
+
23
+ Each record dict should have an `'id'` key; one is auto-generated if absent.
24
+ Displayed fields are `'title'`, `'text'`, `'icon'`, and `'badge'`. Other
25
+ keys are stored and returned by `selection` and events but are not
26
+ rendered.
27
+
28
+ Args:
29
+ items: Initial list of record dicts.
30
+ data_source: A data source for database-backed or API-backed data. Any
31
+ object implementing the data-source protocol is accepted.
32
+ selection_mode: Item selection behavior — `'single'` allows one item at
33
+ a time, `'multi'` allows several. Default `'none'` (no selection).
34
+ show_selection_controls: If `True`, show checkboxes (multi) or radio
35
+ buttons (single) alongside each item.
36
+ select_on_click: Whether clicking an item selects it. Defaults to `True`
37
+ when `selection_mode` is not `'none'`. Set `False` to decouple a
38
+ click (e.g. activate or open) from selection.
39
+ show_chevron: If `True`, show a right-pointing chevron on each item.
40
+ allow_remove: If `True`, show a remove button on each item.
41
+ allow_reorder: If `True`, show a drag handle and allow reordering by
42
+ dragging.
43
+ striped: If `True`, alternate the row background color.
44
+ show_separators: If `True` (default), draw a separator line between
45
+ items.
46
+ show_scrollbar: If `True` (default), show the vertical scrollbar.
47
+ Mousewheel scrolling works regardless.
48
+ scrollbar_variant: Scrollbar style — `'thin'` (default) for a slim bar
49
+ suited to lists, or `'default'` for the standard rounded bar.
50
+ height: Fixed height in pixels. When set, the list maintains this
51
+ height regardless of its children, making it self-contained for
52
+ scrolling without requiring the parent layout to provide a
53
+ vertical constraint. The widget can still grow beyond this height
54
+ if placed with `expand=True` in a constrained parent.
55
+ density: Row height. Default `'default'`.
56
+ accent: Color intent token for the selection highlight and drag
57
+ indicator. Defaults to the theme's default color.
58
+ parent: Override the context-stack parent.
59
+ **kwargs: Layout placement options applied by the parent container —
60
+ `fill`, `expand`, `anchor`, `margin`, `row`, `column`, `sticky`.
61
+ See :doc:`/tasks/layout`.
62
+ """
63
+
64
+ def __init__(
65
+ self,
66
+ *,
67
+ items: list[dict] | None = None,
68
+ data_source: DataSourceProtocol | None = None,
69
+ selection_mode: SelectionMode = "none",
70
+ show_selection_controls: bool = False,
71
+ select_on_click: bool | None = None,
72
+ show_chevron: bool = False,
73
+ allow_remove: bool = False,
74
+ allow_reorder: bool = False,
75
+ striped: bool = False,
76
+ show_separators: bool = True,
77
+ show_scrollbar: bool = True,
78
+ scrollbar_variant: ScrollbarVariant = "thin",
79
+ height: int | None = None,
80
+ density: WidgetDensity = "default",
81
+ accent: AccentToken | str | None = None,
82
+ accent_selection: bool = False,
83
+ parent: Any = None,
84
+ **kwargs: Any,
85
+ ) -> None:
86
+ self._parent = self._resolve_parent(parent)
87
+ self._selection_mode = selection_mode
88
+ layout_kw = self._split_layout_kwargs(kwargs)
89
+ tk_master = self._parent._child_master() if self._parent else None
90
+
91
+ internal_kwargs: dict[str, Any] = {
92
+ "selection_mode": selection_mode,
93
+ "show_selection_controls": show_selection_controls,
94
+ "show_chevron": show_chevron,
95
+ "enable_removing": allow_remove,
96
+ "enable_dragging": allow_reorder,
97
+ "striped": striped,
98
+ "show_separator": show_separators,
99
+ "scrollbar_visibility": "always" if show_scrollbar else "never",
100
+ "scrollbar_variant": scrollbar_variant,
101
+ "density": density,
102
+ "accent_selection": accent_selection,
103
+ }
104
+ if items is not None:
105
+ internal_kwargs["items"] = items
106
+ if data_source is not None:
107
+ internal_kwargs["datasource"] = data_source
108
+ if select_on_click is not None:
109
+ internal_kwargs["select_on_click"] = select_on_click
110
+ if accent is not None:
111
+ internal_kwargs["accent"] = accent
112
+
113
+ if height is not None and "horizontal" not in layout_kw:
114
+ layout_kw["horizontal"] = "stretch"
115
+
116
+ self._internal = _InternalListView(tk_master, **internal_kwargs)
117
+ # Prevent the row pool from feeding back into the layout: without this,
118
+ # adding rows causes the ListView to grow, which gives the Grid more
119
+ # space, which causes more rows to be added — an infinite resize loop.
120
+ self._internal.pack_propagate(False)
121
+ self._attach_to_parent(layout_kw)
122
+
123
+ if height is not None:
124
+ self._internal.configure(height=height)
125
+
126
+ # ----- Data -----
127
+
128
+ def insert_item(self, data: dict) -> None:
129
+ """Insert a new record into the list.
130
+
131
+ Args:
132
+ data: Record dict. An `'id'` is auto-generated if absent.
133
+ """
134
+ self._internal.insert_item(data)
135
+
136
+ def update_item(self, record_id: Any, data: dict) -> None:
137
+ """Update an existing record.
138
+
139
+ Args:
140
+ record_id: ID of the record to update.
141
+ data: Fields to merge into the existing record.
142
+ """
143
+ self._internal.update_item(record_id, data)
144
+
145
+ def delete_item(self, record_id: Any) -> None:
146
+ """Delete a record by ID.
147
+
148
+ Args:
149
+ record_id: ID of the record to delete.
150
+ """
151
+ self._internal.delete_item(record_id)
152
+
153
+ def reload(self) -> None:
154
+ """Reload data from the datasource and refresh the display."""
155
+ self._internal.reload()
156
+
157
+ # ----- Selection -----
158
+
159
+ @property
160
+ def selection(self) -> dict | list[dict] | None:
161
+ """The selected record(s) — the data bag.
162
+
163
+ In `'single'` mode, the selected record `dict` (or `None` when nothing
164
+ is selected). In `'multi'` mode, a `list` of record dicts (empty when
165
+ nothing is selected). Each record carries its non-displayed fields too,
166
+ indexed by key like any record. Read-only.
167
+ """
168
+ rows = self._internal.get_selected()
169
+ if self._selection_mode == "multi":
170
+ return rows
171
+ return rows[0] if rows else None
172
+
173
+ def select_items(self, record_ids: list) -> None:
174
+ """Select items by record `id`.
175
+
176
+ In `'single'` mode this replaces the current selection; in `'multi'`
177
+ mode the items are added to it.
178
+
179
+ Args:
180
+ record_ids: Record ids of the items to select.
181
+ """
182
+ self._internal.select_items(record_ids)
183
+
184
+ def select_all(self) -> None:
185
+ """Select all items. Only effective when `selection_mode='multi'`."""
186
+ self._internal.select_all()
187
+
188
+ def deselect_items(self, record_ids: list) -> None:
189
+ """Remove the given items from the selection by record `id`.
190
+
191
+ Args:
192
+ record_ids: Record ids to deselect.
193
+ """
194
+ self._internal.deselect_items(record_ids)
195
+
196
+ def clear_selection(self) -> None:
197
+ """Deselect all items."""
198
+ self._internal.clear_selection()
199
+
200
+ # ----- Scrolling -----
201
+
202
+ def scroll_to_top(self) -> None:
203
+ """Scroll to the first item."""
204
+ self._internal.scroll_to_top()
205
+
206
+ def scroll_to_bottom(self) -> None:
207
+ """Scroll to the last item."""
208
+ self._internal.scroll_to_bottom()
209
+
210
+ # ----- Events -----
211
+
212
+ @overload
213
+ def on_item_click(self) -> Stream: ...
214
+ @overload
215
+ def on_item_click(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
216
+ def on_item_click(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
217
+ """Fired when an item is clicked.
218
+
219
+ Args:
220
+ handler: Called with the record `dict` — read fields with
221
+ `e["field"]`. Omit to get a composable
222
+ :class:`~bootstack.streams.Stream` instead.
223
+
224
+ Returns:
225
+ A cancellable :class:`~bootstack.events.Subscription` when a handler
226
+ is given, otherwise a :class:`~bootstack.streams.Stream`.
227
+ """
228
+ return self.on("item_click", handler)
229
+
230
+ @overload
231
+ def on_select(self) -> Stream: ...
232
+ @overload
233
+ def on_select(self, handler: Callable[[Event], Any]) -> Subscription: ...
234
+ def on_select(self, handler: Callable[[Event], Any] | None = None) -> Stream | Subscription:
235
+ """Fired when the selection changes.
236
+
237
+ Args:
238
+ handler: Called with the curated
239
+ :class:`~bootstack.events.Event`; read `selection` to get
240
+ the current selection. Omit to get a composable
241
+ :class:`~bootstack.streams.Stream` instead.
242
+
243
+ Returns:
244
+ A cancellable :class:`~bootstack.events.Subscription` when a handler
245
+ is given, otherwise a :class:`~bootstack.streams.Stream`.
246
+ """
247
+ return self.on("select", handler)
248
+
249
+ @overload
250
+ def on_item_delete(self) -> Stream: ...
251
+ @overload
252
+ def on_item_delete(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
253
+ def on_item_delete(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
254
+ """Fired after an item is removed.
255
+
256
+ Args:
257
+ handler: Called with the deleted record `dict`. Omit to get a
258
+ composable :class:`~bootstack.streams.Stream` instead.
259
+
260
+ Returns:
261
+ A cancellable :class:`~bootstack.events.Subscription` when a handler
262
+ is given, otherwise a :class:`~bootstack.streams.Stream`.
263
+ """
264
+ return self.on("item_delete", handler)
265
+
266
+ @overload
267
+ def on_item_insert(self) -> Stream: ...
268
+ @overload
269
+ def on_item_insert(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
270
+ def on_item_insert(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
271
+ """Fired after an item is inserted.
272
+
273
+ Args:
274
+ handler: Called with the new record `dict`. Omit to get a
275
+ composable :class:`~bootstack.streams.Stream` instead.
276
+
277
+ Returns:
278
+ A cancellable :class:`~bootstack.events.Subscription` when a handler
279
+ is given, otherwise a :class:`~bootstack.streams.Stream`.
280
+ """
281
+ return self.on("item_insert", handler)
282
+
283
+ @overload
284
+ def on_item_update(self) -> Stream: ...
285
+ @overload
286
+ def on_item_update(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
287
+ def on_item_update(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
288
+ """Fired after an item is updated.
289
+
290
+ Args:
291
+ handler: Called with the updated record `dict`. Omit to get a
292
+ composable :class:`~bootstack.streams.Stream` instead.
293
+
294
+ Returns:
295
+ A cancellable :class:`~bootstack.events.Subscription` when a handler
296
+ is given, otherwise a :class:`~bootstack.streams.Stream`.
297
+ """
298
+ return self.on("item_update", handler)
299
+
300
+ @overload
301
+ def on_item_drag_start(self) -> Stream: ...
302
+ @overload
303
+ def on_item_drag_start(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
304
+ def on_item_drag_start(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
305
+ """Fired when a drag begins.
306
+
307
+ Args:
308
+ handler: Called with the record `dict`, including `source_index`.
309
+ Omit to get a composable :class:`~bootstack.streams.Stream`
310
+ instead.
311
+
312
+ Returns:
313
+ A cancellable :class:`~bootstack.events.Subscription` when a handler
314
+ is given, otherwise a :class:`~bootstack.streams.Stream`.
315
+ """
316
+ return self.on("item_drag_start", handler)
317
+
318
+ @overload
319
+ def on_item_drag_end(self) -> Stream: ...
320
+ @overload
321
+ def on_item_drag_end(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
322
+ def on_item_drag_end(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
323
+ """Fired when a drag ends.
324
+
325
+ Args:
326
+ handler: Called with the record `dict`, including `source_index`
327
+ and `target_index`. Omit to get a composable
328
+ :class:`~bootstack.streams.Stream` instead.
329
+
330
+ Returns:
331
+ A cancellable :class:`~bootstack.events.Subscription` when a handler
332
+ is given, otherwise a :class:`~bootstack.streams.Stream`.
333
+ """
334
+ return self.on("item_drag_end", handler)
335
+
336
+ # ----- Properties -----
337
+
338
+ @property
339
+ def data_source(self) -> DataSourceProtocol:
340
+ """The underlying data source instance."""
341
+ return self._internal.get_datasource()
342
+
343
+
344
+ _LISTVIEW_EVENTS: dict[str, str] = {
345
+ "item_click": "<<ItemClick>>",
346
+ "select": "<<SelectionChange>>",
347
+ "item_delete": "<<ItemDelete>>",
348
+ "item_insert": "<<ItemInsert>>",
349
+ "item_update": "<<ItemUpdate>>",
350
+ "item_drag_start": "<<ItemDragStart>>",
351
+ "item_drag_end": "<<ItemDragEnd>>",
352
+ }
353
+
354
+ register_widget_events(ListView, _LISTVIEW_EVENTS)