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.
- bootstack/__init__.py +157 -0
- bootstack/__main__.py +5 -0
- bootstack/_core/__init__.py +21 -0
- bootstack/_core/capabilities/__init__.py +45 -0
- bootstack/_core/capabilities/after.py +103 -0
- bootstack/_core/capabilities/bind.py +192 -0
- bootstack/_core/capabilities/bindtags.py +112 -0
- bootstack/_core/capabilities/busy.py +72 -0
- bootstack/_core/capabilities/clipboard.py +89 -0
- bootstack/_core/capabilities/focus.py +118 -0
- bootstack/_core/capabilities/grab.py +65 -0
- bootstack/_core/capabilities/grid.py +211 -0
- bootstack/_core/capabilities/localization.py +231 -0
- bootstack/_core/capabilities/pack.py +140 -0
- bootstack/_core/capabilities/place.py +113 -0
- bootstack/_core/capabilities/selection.py +136 -0
- bootstack/_core/capabilities/signals.py +244 -0
- bootstack/_core/capabilities/winfo.py +315 -0
- bootstack/_core/colorutils.py +234 -0
- bootstack/_core/exceptions.py +25 -0
- bootstack/_core/images.py +463 -0
- bootstack/_core/mixins/__init__.py +1 -0
- bootstack/_core/mixins/ttk_state.py +35 -0
- bootstack/_core/mixins/widget.py +132 -0
- bootstack/_core/paths.py +49 -0
- bootstack/_core/publisher.py +149 -0
- bootstack/_core/variables.py +62 -0
- bootstack/_runtime/__init__.py +3 -0
- bootstack/_runtime/app.py +930 -0
- bootstack/_runtime/base_window.py +945 -0
- bootstack/_runtime/events.py +399 -0
- bootstack/_runtime/shortcuts.py +496 -0
- bootstack/_runtime/tk_patch.py +43 -0
- bootstack/_runtime/toplevel.py +276 -0
- bootstack/_runtime/utility.py +457 -0
- bootstack/_runtime/visual_focus.py +240 -0
- bootstack/_runtime/window_utilities.py +1123 -0
- bootstack/assets/__init__.py +21 -0
- bootstack/assets/bootstack.ico +0 -0
- bootstack/assets/bootstack.png +0 -0
- bootstack/assets/elements/__init__.py +0 -0
- bootstack/assets/elements/badge-pill.png +0 -0
- bootstack/assets/elements/badge-square.png +0 -0
- bootstack/assets/elements/button-compact.png +0 -0
- bootstack/assets/elements/button-default.png +0 -0
- bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
- bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
- bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
- bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
- bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
- bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
- bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
- bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
- bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
- bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
- bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
- bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
- bootstack/assets/elements/card.png +0 -0
- bootstack/assets/elements/checkbox-checked.png +0 -0
- bootstack/assets/elements/checkbox-indeterminate.png +0 -0
- bootstack/assets/elements/checkbox-unchecked.png +0 -0
- bootstack/assets/elements/field.png +0 -0
- bootstack/assets/elements/input-addon-compact.png +0 -0
- bootstack/assets/elements/input-addon-default.png +0 -0
- bootstack/assets/elements/input-compact.png +0 -0
- bootstack/assets/elements/input-default.png +0 -0
- bootstack/assets/elements/list-item-separated.png +0 -0
- bootstack/assets/elements/list-item.png +0 -0
- bootstack/assets/elements/listrow-compact.png +0 -0
- bootstack/assets/elements/listrow-default.png +0 -0
- bootstack/assets/elements/manifest.toml +361 -0
- bootstack/assets/elements/menu-item.png +0 -0
- bootstack/assets/elements/navitem-compact.png +0 -0
- bootstack/assets/elements/navitem-default.png +0 -0
- bootstack/assets/elements/progressbar-h-compact.png +0 -0
- bootstack/assets/elements/progressbar-h-default.png +0 -0
- bootstack/assets/elements/progressbar-v-compact.png +0 -0
- bootstack/assets/elements/progressbar-v-default.png +0 -0
- bootstack/assets/elements/radiobutton.png +0 -0
- bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- bootstack/assets/elements/scrollbar-vertical.png +0 -0
- bootstack/assets/elements/slider-handle.png +0 -0
- bootstack/assets/elements/slider-track-h.png +0 -0
- bootstack/assets/elements/slider-track-v.png +0 -0
- bootstack/assets/elements/switch-off.png +0 -0
- bootstack/assets/elements/switch-on.png +0 -0
- bootstack/assets/elements/tab-h.png +0 -0
- bootstack/assets/elements/tab-v.png +0 -0
- bootstack/assets/icons/bootstrap.ttf +0 -0
- bootstack/assets/icons/glyphmap.json +2080 -0
- bootstack/assets/icons/icon_metrics.json +12470 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +878 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +878 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +854 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +844 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +917 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +844 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +844 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +845 -0
- bootstack/cli/__init__.py +133 -0
- bootstack/cli/__main__.py +6 -0
- bootstack/cli/add.py +395 -0
- bootstack/cli/appicon.py +285 -0
- bootstack/cli/build.py +115 -0
- bootstack/cli/config.py +313 -0
- bootstack/cli/demo.py +564 -0
- bootstack/cli/dev.py +153 -0
- bootstack/cli/doctor.py +195 -0
- bootstack/cli/icons.py +98 -0
- bootstack/cli/promote.py +120 -0
- bootstack/cli/pyinstaller.py +268 -0
- bootstack/cli/run.py +95 -0
- bootstack/cli/start.py +117 -0
- bootstack/cli/templates/__init__.py +931 -0
- bootstack/clipboard.py +48 -0
- bootstack/constants.py +318 -0
- bootstack/data/README.md +615 -0
- bootstack/data/__init__.py +78 -0
- bootstack/data/_observable.py +276 -0
- bootstack/data/base.py +780 -0
- bootstack/data/file_source.py +367 -0
- bootstack/data/memory_source.py +450 -0
- bootstack/data/query.py +367 -0
- bootstack/data/readers.py +289 -0
- bootstack/data/sqlite_source.py +869 -0
- bootstack/data/types.py +354 -0
- bootstack/data/writers.py +232 -0
- bootstack/dev/__init__.py +36 -0
- bootstack/dev/_capture.py +141 -0
- bootstack/dev/_env.py +43 -0
- bootstack/dev/_registry.py +140 -0
- bootstack/dev/_reloader.py +351 -0
- bootstack/dev/_reset.py +50 -0
- bootstack/dev/_watcher.py +91 -0
- bootstack/dialogs/__init__.py +948 -0
- bootstack/dialogs/_impl/__init__.py +47 -0
- bootstack/dialogs/_impl/colorchooser.py +588 -0
- bootstack/dialogs/_impl/datedialog.py +450 -0
- bootstack/dialogs/_impl/dialog.py +594 -0
- bootstack/dialogs/_impl/filterdialog.py +358 -0
- bootstack/dialogs/_impl/fontdialog.py +364 -0
- bootstack/dialogs/_impl/formdialog.py +564 -0
- bootstack/dialogs/_impl/message.py +486 -0
- bootstack/dialogs/_impl/query.py +570 -0
- bootstack/errors.py +67 -0
- bootstack/events/__init__.py +111 -0
- bootstack/events/_event.py +135 -0
- bootstack/events/_payloads.py +539 -0
- bootstack/events/_subscription.py +38 -0
- bootstack/i18n/README.md +77 -0
- bootstack/i18n/__init__.py +23 -0
- bootstack/i18n/catalog.py +121 -0
- bootstack/i18n/intl_format.py +584 -0
- bootstack/i18n/msgcat.py +425 -0
- bootstack/i18n/specs.py +156 -0
- bootstack/images.py +563 -0
- bootstack/py.typed +1 -0
- bootstack/scheduling/__init__.py +11 -0
- bootstack/scheduling/_schedule.py +218 -0
- bootstack/shortcuts.py +21 -0
- bootstack/signals/README.md +98 -0
- bootstack/signals/__init__.py +10 -0
- bootstack/signals/integration.py +100 -0
- bootstack/signals/signal.py +353 -0
- bootstack/signals/types.py +6 -0
- bootstack/store.py +286 -0
- bootstack/streams/__init__.py +12 -0
- bootstack/streams/_stream.py +321 -0
- bootstack/style/__init__.py +38 -0
- bootstack/style/builders/__init__.py +51 -0
- bootstack/style/builders/badge.py +46 -0
- bootstack/style/builders/button.py +339 -0
- bootstack/style/builders/buttongroup.py +311 -0
- bootstack/style/builders/calendar.py +271 -0
- bootstack/style/builders/checkbutton.py +110 -0
- bootstack/style/builders/combobox.py +113 -0
- bootstack/style/builders/contextmenu.py +268 -0
- bootstack/style/builders/entry.py +82 -0
- bootstack/style/builders/expander.py +148 -0
- bootstack/style/builders/field.py +335 -0
- bootstack/style/builders/frame.py +50 -0
- bootstack/style/builders/label.py +28 -0
- bootstack/style/builders/labelframe.py +34 -0
- bootstack/style/builders/listview.py +369 -0
- bootstack/style/builders/menubar.py +91 -0
- bootstack/style/builders/menubutton.py +359 -0
- bootstack/style/builders/panedwindow.py +25 -0
- bootstack/style/builders/progressbar.py +67 -0
- bootstack/style/builders/radiobutton.py +99 -0
- bootstack/style/builders/scale.py +64 -0
- bootstack/style/builders/scrollbar.py +225 -0
- bootstack/style/builders/separator.py +49 -0
- bootstack/style/builders/sidenav.py +643 -0
- bootstack/style/builders/sizegrip.py +15 -0
- bootstack/style/builders/spinbox.py +119 -0
- bootstack/style/builders/switch.py +70 -0
- bootstack/style/builders/tabitem.py +204 -0
- bootstack/style/builders/togglegroup.py +294 -0
- bootstack/style/builders/toolbutton.py +275 -0
- bootstack/style/builders/tooltip.py +26 -0
- bootstack/style/builders/treeview.py +193 -0
- bootstack/style/builders/utils.py +455 -0
- bootstack/style/builders_tk/__init__.py +16 -0
- bootstack/style/builders_tk/defaults.py +229 -0
- bootstack/style/element.py +173 -0
- bootstack/style/fonts.py +123 -0
- bootstack/style/style.py +609 -0
- bootstack/style/style_builder_base.py +716 -0
- bootstack/style/style_builder_mixed.py +93 -0
- bootstack/style/style_builder_tk.py +109 -0
- bootstack/style/style_builder_ttk.py +353 -0
- bootstack/style/style_resolver.py +447 -0
- bootstack/style/theme.py +245 -0
- bootstack/style/theme_provider.py +471 -0
- bootstack/style/themes/__init__.py +128 -0
- bootstack/style/tk_patch.py +5 -0
- bootstack/style/token_maps.py +41 -0
- bootstack/style/types.py +32 -0
- bootstack/style/typography.py +523 -0
- bootstack/style/utility.py +746 -0
- bootstack/types.py +39 -0
- bootstack/validation/__init__.py +6 -0
- bootstack/validation/types.py +15 -0
- bootstack/validation/validation_result.py +17 -0
- bootstack/validation/validation_rules.py +205 -0
- bootstack/widgets/__init__.py +74 -0
- bootstack/widgets/_core/__init__.py +31 -0
- bootstack/widgets/_core/app_config.py +266 -0
- bootstack/widgets/_core/base.py +461 -0
- bootstack/widgets/_core/container.py +334 -0
- bootstack/widgets/_core/context.py +35 -0
- bootstack/widgets/_core/events.py +130 -0
- bootstack/widgets/_core/field_mixin.py +353 -0
- bootstack/widgets/_core/icon_image_props.py +72 -0
- bootstack/widgets/_core/image_binding.py +93 -0
- bootstack/widgets/_core/navmodel.py +345 -0
- bootstack/widgets/_core/options.py +210 -0
- bootstack/widgets/_core/selection_group.py +130 -0
- bootstack/widgets/_core/window_controls.py +96 -0
- bootstack/widgets/_core/window_menu.py +246 -0
- bootstack/widgets/_impl/__init__.py +1 -0
- bootstack/widgets/_impl/_internal/__init__.py +0 -0
- bootstack/widgets/_impl/_internal/wrapper_base.py +307 -0
- bootstack/widgets/_impl/_parts/__init__.py +11 -0
- bootstack/widgets/_impl/_parts/numberentry_part.py +385 -0
- bootstack/widgets/_impl/_parts/spinnerentry_part.py +434 -0
- bootstack/widgets/_impl/_parts/textentry_part.py +406 -0
- bootstack/widgets/_impl/composites/__init__.py +33 -0
- bootstack/widgets/_impl/composites/_dateutils.py +33 -0
- bootstack/widgets/_impl/composites/_image_fit.py +105 -0
- bootstack/widgets/_impl/composites/accordion.py +381 -0
- bootstack/widgets/_impl/composites/avatar.py +191 -0
- bootstack/widgets/_impl/composites/buttongroup.py +371 -0
- bootstack/widgets/_impl/composites/calendar.py +972 -0
- bootstack/widgets/_impl/composites/carousel.py +567 -0
- bootstack/widgets/_impl/composites/chart.py +882 -0
- bootstack/widgets/_impl/composites/compositeframe.py +298 -0
- bootstack/widgets/_impl/composites/contextmenu.py +1951 -0
- bootstack/widgets/_impl/composites/dateentry.py +404 -0
- bootstack/widgets/_impl/composites/dropdownbutton.py +325 -0
- bootstack/widgets/_impl/composites/expander.py +515 -0
- bootstack/widgets/_impl/composites/field.py +670 -0
- bootstack/widgets/_impl/composites/form.py +1066 -0
- bootstack/widgets/_impl/composites/gallery.py +551 -0
- bootstack/widgets/_impl/composites/list/__init__.py +15 -0
- bootstack/widgets/_impl/composites/list/listitem.py +802 -0
- bootstack/widgets/_impl/composites/list/listview.py +1433 -0
- bootstack/widgets/_impl/composites/menu/__init__.py +18 -0
- bootstack/widgets/_impl/composites/menu/model.py +358 -0
- bootstack/widgets/_impl/composites/menu/render_native.py +134 -0
- bootstack/widgets/_impl/composites/menu/render_themed.py +134 -0
- bootstack/widgets/_impl/composites/meter.py +860 -0
- bootstack/widgets/_impl/composites/numericentry.py +201 -0
- bootstack/widgets/_impl/composites/pagestack.py +395 -0
- bootstack/widgets/_impl/composites/passwordentry.py +142 -0
- bootstack/widgets/_impl/composites/pathentry.py +168 -0
- bootstack/widgets/_impl/composites/picture.py +289 -0
- bootstack/widgets/_impl/composites/radiogroup.py +511 -0
- bootstack/widgets/_impl/composites/scrolledtext.py +375 -0
- bootstack/widgets/_impl/composites/scrolledtext.pyi +186 -0
- bootstack/widgets/_impl/composites/scrollview.py +764 -0
- bootstack/widgets/_impl/composites/selectbox.py +1026 -0
- bootstack/widgets/_impl/composites/shell/__init__.py +40 -0
- bootstack/widgets/_impl/composites/shell/content_host.py +52 -0
- bootstack/widgets/_impl/composites/shell/layout.py +335 -0
- bootstack/widgets/_impl/composites/shell/nav_panel.py +345 -0
- bootstack/widgets/_impl/composites/shell/providers.py +558 -0
- bootstack/widgets/_impl/composites/shell/rail.py +117 -0
- bootstack/widgets/_impl/composites/shell/shell.py +581 -0
- bootstack/widgets/_impl/composites/shell/workspace.py +273 -0
- bootstack/widgets/_impl/composites/sidenav/__init__.py +16 -0
- bootstack/widgets/_impl/composites/sidenav/header.py +81 -0
- bootstack/widgets/_impl/composites/sidenav/separator.py +44 -0
- bootstack/widgets/_impl/composites/slider/__init__.py +7 -0
- bootstack/widgets/_impl/composites/slider/_shared.py +195 -0
- bootstack/widgets/_impl/composites/slider/rangeslider.py +982 -0
- bootstack/widgets/_impl/composites/slider/slider.py +851 -0
- bootstack/widgets/_impl/composites/spinnerentry.py +185 -0
- bootstack/widgets/_impl/composites/tableview/__init__.py +5 -0
- bootstack/widgets/_impl/composites/tableview/tableview.py +3388 -0
- bootstack/widgets/_impl/composites/tableview/types.py +169 -0
- bootstack/widgets/_impl/composites/tabs/__init__.py +23 -0
- bootstack/widgets/_impl/composites/tabs/tabitem.py +389 -0
- bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
- bootstack/widgets/_impl/composites/tabs/tabview.py +650 -0
- bootstack/widgets/_impl/composites/textarea/__init__.py +26 -0
- bootstack/widgets/_impl/composites/textarea/change.py +46 -0
- bootstack/widgets/_impl/composites/textarea/codeeditor.py +526 -0
- bootstack/widgets/_impl/composites/textarea/core.py +495 -0
- bootstack/widgets/_impl/composites/textarea/decoration.py +42 -0
- bootstack/widgets/_impl/composites/textarea/diff.py +127 -0
- bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +1 -0
- bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +138 -0
- bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +158 -0
- bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +138 -0
- bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +312 -0
- bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +177 -0
- bootstack/widgets/_impl/composites/textarea/filter.py +171 -0
- bootstack/widgets/_impl/composites/textarea/search_overlay.py +459 -0
- bootstack/widgets/_impl/composites/textarea/sidebar.py +88 -0
- bootstack/widgets/_impl/composites/textarea/style_registry.py +178 -0
- bootstack/widgets/_impl/composites/textarea/textarea.py +606 -0
- bootstack/widgets/_impl/composites/textarea/undo.py +217 -0
- bootstack/widgets/_impl/composites/textentry.py +57 -0
- bootstack/widgets/_impl/composites/timeentry.py +176 -0
- bootstack/widgets/_impl/composites/toast.py +390 -0
- bootstack/widgets/_impl/composites/toast_stack.py +156 -0
- bootstack/widgets/_impl/composites/togglegroup.py +418 -0
- bootstack/widgets/_impl/composites/toolbar.py +608 -0
- bootstack/widgets/_impl/composites/tooltip.py +491 -0
- bootstack/widgets/_impl/composites/tree/__init__.py +7 -0
- bootstack/widgets/_impl/composites/tree/source_binding.py +136 -0
- bootstack/widgets/_impl/composites/tree/treeitem.py +393 -0
- bootstack/widgets/_impl/composites/tree/treenode.py +174 -0
- bootstack/widgets/_impl/composites/tree/treeview.py +841 -0
- bootstack/widgets/_impl/mixins/__init__.py +24 -0
- bootstack/widgets/_impl/mixins/configure_mixin.py +216 -0
- bootstack/widgets/_impl/mixins/entry_mixin.py +134 -0
- bootstack/widgets/_impl/mixins/font_mixin.py +368 -0
- bootstack/widgets/_impl/mixins/icon_mixin.py +61 -0
- bootstack/widgets/_impl/mixins/localization_mixin.py +253 -0
- bootstack/widgets/_impl/mixins/signal_mixin.py +268 -0
- bootstack/widgets/_impl/mixins/validation_mixin.py +226 -0
- bootstack/widgets/_impl/primitives/__init__.py +49 -0
- bootstack/widgets/_impl/primitives/_menubutton.py +107 -0
- bootstack/widgets/_impl/primitives/badge.py +45 -0
- bootstack/widgets/_impl/primitives/button.py +76 -0
- bootstack/widgets/_impl/primitives/card.py +45 -0
- bootstack/widgets/_impl/primitives/checkbutton.py +124 -0
- bootstack/widgets/_impl/primitives/checktoggle.py +62 -0
- bootstack/widgets/_impl/primitives/combobox.py +156 -0
- bootstack/widgets/_impl/primitives/entry.py +87 -0
- bootstack/widgets/_impl/primitives/flexframe.py +448 -0
- bootstack/widgets/_impl/primitives/frame.py +185 -0
- bootstack/widgets/_impl/primitives/gridframe.py +546 -0
- bootstack/widgets/_impl/primitives/label.py +84 -0
- bootstack/widgets/_impl/primitives/labelframe.py +54 -0
- bootstack/widgets/_impl/primitives/optionmenu.py +387 -0
- bootstack/widgets/_impl/primitives/packframe.py +227 -0
- bootstack/widgets/_impl/primitives/panedwindow.py +45 -0
- bootstack/widgets/_impl/primitives/progressbar.py +83 -0
- bootstack/widgets/_impl/primitives/radiobutton.py +115 -0
- bootstack/widgets/_impl/primitives/radiotoggle.py +54 -0
- bootstack/widgets/_impl/primitives/scrollbar.py +42 -0
- bootstack/widgets/_impl/primitives/separator.py +43 -0
- bootstack/widgets/_impl/primitives/sizegrip.py +33 -0
- bootstack/widgets/_impl/primitives/spinbox.py +95 -0
- bootstack/widgets/_impl/primitives/switch.py +44 -0
- bootstack/widgets/_impl/primitives/treeview.py +69 -0
- bootstack/widgets/app.py +371 -0
- bootstack/widgets/appshell.py +1179 -0
- bootstack/widgets/avatar.py +140 -0
- bootstack/widgets/boolean_controls.py +455 -0
- bootstack/widgets/button.py +224 -0
- bootstack/widgets/buttongroup.py +239 -0
- bootstack/widgets/calendar.py +195 -0
- bootstack/widgets/card.py +159 -0
- bootstack/widgets/carousel.py +241 -0
- bootstack/widgets/chart.py +302 -0
- bootstack/widgets/codeeditor.py +675 -0
- bootstack/widgets/contextmenu.py +371 -0
- bootstack/widgets/datatable.py +688 -0
- bootstack/widgets/datefield.py +395 -0
- bootstack/widgets/divider.py +60 -0
- bootstack/widgets/expander.py +579 -0
- bootstack/widgets/form.py +200 -0
- bootstack/widgets/gallery.py +250 -0
- bootstack/widgets/gauge.py +168 -0
- bootstack/widgets/grid.py +121 -0
- bootstack/widgets/groupbox.py +162 -0
- bootstack/widgets/label.py +229 -0
- bootstack/widgets/listview.py +354 -0
- bootstack/widgets/menubutton.py +419 -0
- bootstack/widgets/numberfield.py +431 -0
- bootstack/widgets/pagestack.py +345 -0
- bootstack/widgets/passwordfield.py +383 -0
- bootstack/widgets/pathfield.py +454 -0
- bootstack/widgets/picture.py +251 -0
- bootstack/widgets/progressbar.py +106 -0
- bootstack/widgets/radio_variants.py +271 -0
- bootstack/widgets/radiogroup.py +228 -0
- bootstack/widgets/scrollbar.py +64 -0
- bootstack/widgets/scrollview.py +186 -0
- bootstack/widgets/select.py +302 -0
- bootstack/widgets/selectbutton.py +182 -0
- bootstack/widgets/sidebar_toggle.py +130 -0
- bootstack/widgets/sizegrip.py +42 -0
- bootstack/widgets/slider.py +408 -0
- bootstack/widgets/spinbox.py +147 -0
- bootstack/widgets/spinnerfield.py +413 -0
- bootstack/widgets/splash.py +367 -0
- bootstack/widgets/splitview.py +482 -0
- bootstack/widgets/stacks.py +249 -0
- bootstack/widgets/statusbar.py +189 -0
- bootstack/widgets/tabs.py +425 -0
- bootstack/widgets/textarea.py +459 -0
- bootstack/widgets/textfield.py +410 -0
- bootstack/widgets/theme_toggle.py +92 -0
- bootstack/widgets/timefield.py +340 -0
- bootstack/widgets/toast.py +314 -0
- bootstack/widgets/togglegroup.py +231 -0
- bootstack/widgets/toolbar.py +347 -0
- bootstack/widgets/tooltip.py +94 -0
- bootstack/widgets/tree.py +648 -0
- bootstack/widgets/types.py +305 -0
- bootstack/widgets/window.py +307 -0
- bootstack-0.1.0.dist-info/METADATA +301 -0
- bootstack-0.1.0.dist-info/RECORD +471 -0
- bootstack-0.1.0.dist-info/WHEEL +5 -0
- bootstack-0.1.0.dist-info/entry_points.txt +2 -0
- bootstack-0.1.0.dist-info/licenses/LICENSE +21 -0
- bootstack-0.1.0.dist-info/licenses/NOTICE +10 -0
- bootstack-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import tkinter
|
|
4
|
+
from typing import overload, Any, Callable
|
|
5
|
+
|
|
6
|
+
from bootstack.widgets._impl.composites.pagestack import PageStack as _InternalPageStack
|
|
7
|
+
from bootstack.widgets._impl.primitives.flexframe import FlexFrame
|
|
8
|
+
from bootstack.widgets._impl.primitives.gridframe import GridFrame
|
|
9
|
+
from bootstack.widgets._core.base import PublicWidgetBase
|
|
10
|
+
from bootstack.widgets._core.container import (
|
|
11
|
+
GRID_KEYS, grid_sticky, place_flex_child, _reject_legacy_child_kwargs,
|
|
12
|
+
_expand_margin,
|
|
13
|
+
)
|
|
14
|
+
from bootstack.widgets._core.context import push_container, pop_container
|
|
15
|
+
from bootstack.widgets._core.events import register_widget_events
|
|
16
|
+
from bootstack.events import PageChangeEvent, Subscription
|
|
17
|
+
from bootstack.streams import Stream
|
|
18
|
+
from bootstack._core import NavigationError
|
|
19
|
+
from bootstack.widgets.types import (
|
|
20
|
+
Event, Padding, LayoutKind, AutoFlow,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
_PAGESTACK_EVENTS: dict[str, str] = {
|
|
24
|
+
"page_change": "<<PageChange>>",
|
|
25
|
+
"page_mount": "<<PageMount>>",
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class StackPage:
|
|
30
|
+
"""A handle for one page — both a layout context and a navigation target.
|
|
31
|
+
|
|
32
|
+
Returned by `PageStack.add()` and by `PageStack.item()` / `items()`. Use it
|
|
33
|
+
as a `with` block to place child widgets, and read `key` or call `navigate()`
|
|
34
|
+
to show the page afterward.
|
|
35
|
+
|
|
36
|
+
As a context manager it accepts the same layout kwargs as the standalone
|
|
37
|
+
layout containers — `layout=`, `gap=`, `horizontal_items=`, `vertical_items=`,
|
|
38
|
+
`grow_items=`, `columns=`, `rows=`, `auto_flow=`.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
page_widget: tkinter.Widget,
|
|
44
|
+
*,
|
|
45
|
+
key: str,
|
|
46
|
+
owner: "PageStack",
|
|
47
|
+
layout: LayoutKind = "column",
|
|
48
|
+
padding: Padding | None = None,
|
|
49
|
+
gap: int = 0,
|
|
50
|
+
horizontal_items: str | None = None,
|
|
51
|
+
vertical_items: str | None = None,
|
|
52
|
+
grow_items: bool = False,
|
|
53
|
+
columns: int | list[int | str] | None = None,
|
|
54
|
+
rows: int | list[int | str] | None = None,
|
|
55
|
+
auto_flow: AutoFlow = "row",
|
|
56
|
+
) -> None:
|
|
57
|
+
self._page = page_widget
|
|
58
|
+
self._key = key
|
|
59
|
+
self._owner = owner
|
|
60
|
+
self._layout = layout
|
|
61
|
+
|
|
62
|
+
if horizontal_items is None:
|
|
63
|
+
horizontal_items = (
|
|
64
|
+
"stretch" if layout == "grid"
|
|
65
|
+
else "center" if layout == "column" else "left"
|
|
66
|
+
)
|
|
67
|
+
if vertical_items is None:
|
|
68
|
+
vertical_items = (
|
|
69
|
+
"stretch" if layout == "grid"
|
|
70
|
+
else "center" if layout == "row" else "top"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if layout in ("column", "row"):
|
|
74
|
+
self._layout_frame = FlexFrame(
|
|
75
|
+
page_widget,
|
|
76
|
+
direction="vertical" if layout == "column" else "horizontal",
|
|
77
|
+
padding=padding,
|
|
78
|
+
gap=gap,
|
|
79
|
+
horizontal_items=horizontal_items,
|
|
80
|
+
vertical_items=vertical_items,
|
|
81
|
+
grow_items=grow_items,
|
|
82
|
+
)
|
|
83
|
+
elif layout == "grid":
|
|
84
|
+
self._layout_frame = GridFrame(
|
|
85
|
+
page_widget,
|
|
86
|
+
columns=columns,
|
|
87
|
+
rows=rows,
|
|
88
|
+
padding=padding,
|
|
89
|
+
gap=gap,
|
|
90
|
+
auto_flow=auto_flow,
|
|
91
|
+
)
|
|
92
|
+
else:
|
|
93
|
+
raise ValueError(
|
|
94
|
+
f"StackPage layout must be 'column', 'row', or 'grid', got {layout!r}"
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
self._horizontal_items = horizontal_items
|
|
98
|
+
self._vertical_items = vertical_items
|
|
99
|
+
self._layout_frame.pack(fill="both", expand=True)
|
|
100
|
+
|
|
101
|
+
def _child_master(self) -> tkinter.Widget:
|
|
102
|
+
return self._layout_frame
|
|
103
|
+
|
|
104
|
+
def guide_layout(self, child: PublicWidgetBase, **layout_kw: Any) -> None:
|
|
105
|
+
if self._layout == "grid":
|
|
106
|
+
_reject_legacy_child_kwargs(layout_kw, "StackPage")
|
|
107
|
+
_expand_margin(layout_kw)
|
|
108
|
+
options = {k: v for k, v in layout_kw.items() if k in GRID_KEYS}
|
|
109
|
+
h = layout_kw.get("horizontal") or self._horizontal_items
|
|
110
|
+
v = layout_kw.get("vertical") or self._vertical_items
|
|
111
|
+
options["sticky"] = grid_sticky(h, v)
|
|
112
|
+
child._internal.grid(in_=self._child_master(), **options)
|
|
113
|
+
return
|
|
114
|
+
place_flex_child(self._layout_frame, child, layout_kw, "StackPage")
|
|
115
|
+
|
|
116
|
+
# ----- Page identity and navigation -----
|
|
117
|
+
|
|
118
|
+
@property
|
|
119
|
+
def key(self) -> str:
|
|
120
|
+
"""The page's unique key, used with `PageStack.item()` / `navigate()`."""
|
|
121
|
+
return self._key
|
|
122
|
+
|
|
123
|
+
def navigate(self, data: dict | None = None) -> None:
|
|
124
|
+
"""Navigate to this page.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
data: Optional data dict passed to the page's mount event.
|
|
128
|
+
"""
|
|
129
|
+
self._owner.navigate(self._key, data=data)
|
|
130
|
+
|
|
131
|
+
def __enter__(self) -> "StackPage":
|
|
132
|
+
push_container(self)
|
|
133
|
+
return self
|
|
134
|
+
|
|
135
|
+
def __exit__(self, exc_type, exc, tb) -> None:
|
|
136
|
+
pop_container(self)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class PageStack(PublicWidgetBase):
|
|
140
|
+
"""A browser-style navigation container showing one page at a time.
|
|
141
|
+
|
|
142
|
+
Add pages with `.add()` and place children inside each page using the
|
|
143
|
+
returned context manager. Navigate between pages with `navigate()`,
|
|
144
|
+
`back()`, and `forward()`.
|
|
145
|
+
|
|
146
|
+
Usage::
|
|
147
|
+
|
|
148
|
+
ps = bs.PageStack(fill="both", expand=True)
|
|
149
|
+
with ps.add("home"):
|
|
150
|
+
bs.Label("Home page")
|
|
151
|
+
with ps.add("settings"):
|
|
152
|
+
bs.Label("Settings page")
|
|
153
|
+
ps.navigate("home")
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
padding: Space around the page area.
|
|
157
|
+
width: Requested width in pixels.
|
|
158
|
+
height: Requested height in pixels.
|
|
159
|
+
parent: Override the context-stack parent.
|
|
160
|
+
**kwargs: Layout placement options applied by the parent container —
|
|
161
|
+
`fill`, `expand`, `anchor`, `margin`, `row`, `column`, `sticky`.
|
|
162
|
+
See :doc:`/tasks/layout`.
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
def __init__(
|
|
166
|
+
self,
|
|
167
|
+
*,
|
|
168
|
+
padding: Padding | None = None,
|
|
169
|
+
width: int | None = None,
|
|
170
|
+
height: int | None = None,
|
|
171
|
+
parent: Any = None,
|
|
172
|
+
**kwargs: Any,
|
|
173
|
+
) -> None:
|
|
174
|
+
self._parent = self._resolve_parent(parent)
|
|
175
|
+
layout_kw = self._split_layout_kwargs(kwargs)
|
|
176
|
+
|
|
177
|
+
ps_kwargs: dict[str, Any] = {}
|
|
178
|
+
if padding is not None:
|
|
179
|
+
ps_kwargs["padding"] = padding
|
|
180
|
+
if width is not None:
|
|
181
|
+
ps_kwargs["width"] = width
|
|
182
|
+
if height is not None:
|
|
183
|
+
ps_kwargs["height"] = height
|
|
184
|
+
|
|
185
|
+
self._pages: dict[str, StackPage] = {}
|
|
186
|
+
tk_master = self._parent._child_master() if self._parent else None
|
|
187
|
+
self._internal = _InternalPageStack(tk_master, **ps_kwargs)
|
|
188
|
+
self._attach_to_parent(layout_kw)
|
|
189
|
+
|
|
190
|
+
# ----- Page management -----
|
|
191
|
+
|
|
192
|
+
def add(
|
|
193
|
+
self,
|
|
194
|
+
key: str,
|
|
195
|
+
*,
|
|
196
|
+
layout: LayoutKind = "column",
|
|
197
|
+
padding: Padding | None = None,
|
|
198
|
+
gap: int = 0,
|
|
199
|
+
horizontal_items: str | None = None,
|
|
200
|
+
vertical_items: str | None = None,
|
|
201
|
+
grow_items: bool = False,
|
|
202
|
+
columns: int | list[int | str] | None = None,
|
|
203
|
+
rows: int | list[int | str] | None = None,
|
|
204
|
+
auto_flow: AutoFlow = "row",
|
|
205
|
+
) -> StackPage:
|
|
206
|
+
"""Add a page and return a handle for placing its children and navigating to it.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
key: Unique identifier for this page.
|
|
210
|
+
layout: Internal layout. Defaults to `'column'`.
|
|
211
|
+
padding: Space inside the page frame. Defaults to `None`.
|
|
212
|
+
gap: Space between children in pixels. Defaults to `0`.
|
|
213
|
+
horizontal_items: How children sit on the horizontal axis — edge
|
|
214
|
+
values `'left'`/`'center'`/`'right'`/`'stretch'`, plus `'space-*'`
|
|
215
|
+
when horizontal is the stacking axis. Defaults to `'stretch'` in grid mode,
|
|
216
|
+
`'center'` in a column and `'left'` in a row.
|
|
217
|
+
vertical_items: How children sit on the vertical axis — edge values
|
|
218
|
+
`'top'`/`'center'`/`'bottom'`/`'stretch'`, plus `'space-*'` when
|
|
219
|
+
vertical is the stacking axis. Defaults to `'stretch'` in grid mode,
|
|
220
|
+
`'center'` in a row and `'top'` in a column.
|
|
221
|
+
grow_items: For `'column'`/`'row'`, when `True` every child grows
|
|
222
|
+
equally to share the main axis. Defaults to `False`.
|
|
223
|
+
columns: Column definitions for `'grid'` layout. An integer sets
|
|
224
|
+
the number of equal-weight columns; a list sets per-column
|
|
225
|
+
weights or sizes (e.g. `[1, 2, 'auto', '120px']`).
|
|
226
|
+
rows: Row definitions for `'grid'` layout, same format as `columns`.
|
|
227
|
+
auto_flow: Grid auto-flow direction. Defaults to `'row'`.
|
|
228
|
+
|
|
229
|
+
Returns:
|
|
230
|
+
`StackPage` — use as a context manager to place children, and as a
|
|
231
|
+
handle to `navigate()` to the page.
|
|
232
|
+
"""
|
|
233
|
+
page_widget = self._internal.add(key)
|
|
234
|
+
page = StackPage(
|
|
235
|
+
page_widget,
|
|
236
|
+
key=key, owner=self,
|
|
237
|
+
layout=layout, padding=padding, gap=gap,
|
|
238
|
+
horizontal_items=horizontal_items, vertical_items=vertical_items,
|
|
239
|
+
grow_items=grow_items,
|
|
240
|
+
columns=columns, rows=rows, auto_flow=auto_flow,
|
|
241
|
+
)
|
|
242
|
+
self._pages[key] = page
|
|
243
|
+
return page
|
|
244
|
+
|
|
245
|
+
def remove(self, key: str) -> None:
|
|
246
|
+
"""Remove a page and destroy its widget.
|
|
247
|
+
|
|
248
|
+
Raises:
|
|
249
|
+
NavigationError: If no page with the given key exists.
|
|
250
|
+
"""
|
|
251
|
+
self._internal.remove(key)
|
|
252
|
+
self._pages.pop(key, None)
|
|
253
|
+
|
|
254
|
+
# ----- Navigation -----
|
|
255
|
+
|
|
256
|
+
def navigate(self, key: str, data: dict | None = None) -> None:
|
|
257
|
+
"""Navigate to the page identified by `key`.
|
|
258
|
+
|
|
259
|
+
Args:
|
|
260
|
+
key: Page identifier to navigate to.
|
|
261
|
+
data: Optional data dict passed to the page's mount event.
|
|
262
|
+
|
|
263
|
+
Raises:
|
|
264
|
+
NavigationError: If no page with the given key exists.
|
|
265
|
+
"""
|
|
266
|
+
self._internal.navigate(key, data=data)
|
|
267
|
+
|
|
268
|
+
def back(self) -> None:
|
|
269
|
+
"""Navigate to the previous page in history."""
|
|
270
|
+
self._internal.back()
|
|
271
|
+
|
|
272
|
+
def forward(self) -> None:
|
|
273
|
+
"""Navigate to the next page in history."""
|
|
274
|
+
self._internal.forward()
|
|
275
|
+
|
|
276
|
+
# ----- Properties / introspection -----
|
|
277
|
+
|
|
278
|
+
@property
|
|
279
|
+
def can_back(self) -> bool:
|
|
280
|
+
"""True if backward navigation is possible."""
|
|
281
|
+
return self._internal.can_back()
|
|
282
|
+
|
|
283
|
+
@property
|
|
284
|
+
def can_forward(self) -> bool:
|
|
285
|
+
"""True if forward navigation is possible."""
|
|
286
|
+
return self._internal.can_forward()
|
|
287
|
+
|
|
288
|
+
@property
|
|
289
|
+
def current(self) -> str | None:
|
|
290
|
+
"""Key of the currently displayed page, or `None`."""
|
|
291
|
+
result = self._internal.current()
|
|
292
|
+
return result[0] if result else None
|
|
293
|
+
|
|
294
|
+
def page_keys(self) -> tuple[str, ...]:
|
|
295
|
+
"""All registered page keys in insertion order."""
|
|
296
|
+
return self._internal.keys()
|
|
297
|
+
|
|
298
|
+
def item(self, key: str) -> StackPage:
|
|
299
|
+
"""Return the page handle for `key`.
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
key: Page key assigned in `add()`.
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
The `StackPage` for that key — read its `key` or `navigate()` to it.
|
|
306
|
+
|
|
307
|
+
Raises:
|
|
308
|
+
NavigationError: If no page with the given key exists.
|
|
309
|
+
"""
|
|
310
|
+
if key not in self._pages:
|
|
311
|
+
raise NavigationError(f"No page with key '{key}'")
|
|
312
|
+
return self._pages[key]
|
|
313
|
+
|
|
314
|
+
def items(self) -> tuple[StackPage, ...]:
|
|
315
|
+
"""Return all page handles in insertion order."""
|
|
316
|
+
return tuple(self._pages[k] for k in self._internal.keys())
|
|
317
|
+
|
|
318
|
+
# ----- Event shorthands -----
|
|
319
|
+
|
|
320
|
+
@overload
|
|
321
|
+
def on_page_change(self) -> Stream: ...
|
|
322
|
+
@overload
|
|
323
|
+
def on_page_change(self, handler: Callable[[PageChangeEvent], Any]) -> Subscription: ...
|
|
324
|
+
def on_page_change(self, handler: Callable[[PageChangeEvent], Any] | None = None) -> Stream | Subscription:
|
|
325
|
+
"""Register a callback fired after every navigation.
|
|
326
|
+
|
|
327
|
+
Returns:
|
|
328
|
+
`Subscription` (with handler) or `Stream` (without handler).
|
|
329
|
+
"""
|
|
330
|
+
return self.on("page_change", handler)
|
|
331
|
+
|
|
332
|
+
@overload
|
|
333
|
+
def on_page_mount(self) -> Stream: ...
|
|
334
|
+
@overload
|
|
335
|
+
def on_page_mount(self, handler: Callable[[PageChangeEvent], Any]) -> Subscription: ...
|
|
336
|
+
def on_page_mount(self, handler: Callable[[PageChangeEvent], Any] | None = None) -> Stream | Subscription:
|
|
337
|
+
"""Register a callback fired when a page is mounted.
|
|
338
|
+
|
|
339
|
+
Returns:
|
|
340
|
+
`Subscription` (with handler) or `Stream` (without handler).
|
|
341
|
+
"""
|
|
342
|
+
return self.on("page_mount", handler)
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
register_widget_events(PageStack, _PAGESTACK_EVENTS)
|