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,159 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import tkinter
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from bootstack.widgets._impl.primitives.flexframe import FlexFrame
|
|
7
|
+
from bootstack.widgets._impl.primitives.gridframe import GridFrame
|
|
8
|
+
from bootstack.widgets._core.container import (
|
|
9
|
+
PublicContainer, GRID_KEYS, place_flex_child, grid_sticky,
|
|
10
|
+
_reject_legacy_child_kwargs,
|
|
11
|
+
)
|
|
12
|
+
from bootstack.widgets.types import (
|
|
13
|
+
AccentToken, Padding, LayoutKind, AutoFlow,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Card(PublicContainer):
|
|
18
|
+
"""A card-surface container that groups content with an elevated background and border.
|
|
19
|
+
|
|
20
|
+
Renders with the `card` surface token, so nested cards step up through the
|
|
21
|
+
surface hierarchy automatically (`background` → `card` → `overlay`).
|
|
22
|
+
Children are arranged by the internal layout selected with `layout`.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
layout: Internal layout manager. Defaults to `'column'`.
|
|
26
|
+
padding: Space in pixels between the card border and its content.
|
|
27
|
+
A single value applies to all sides; `(x, y)` sets the horizontal
|
|
28
|
+
and vertical amounts. Defaults to `16`.
|
|
29
|
+
gap: Space in pixels between child widgets. Defaults to `0`.
|
|
30
|
+
horizontal_items: How children sit on the horizontal axis — edge values
|
|
31
|
+
`'left'`/`'center'`/`'right'`/`'stretch'`, plus the `'space-*'` modes
|
|
32
|
+
when horizontal is the stacking axis (`'row'`). Override per child
|
|
33
|
+
with `horizontal`. Defaults to `'stretch'` in grid mode, `'center'` in a column
|
|
34
|
+
and `'left'` in a row.
|
|
35
|
+
vertical_items: How children sit on the vertical axis — edge values
|
|
36
|
+
`'top'`/`'center'`/`'bottom'`/`'stretch'`, plus the `'space-*'` modes
|
|
37
|
+
when vertical is the stacking axis (`'column'`). Override per child
|
|
38
|
+
with `vertical`. Defaults to `'stretch'` in grid mode, `'center'` in a row and `'top'` in a column.
|
|
39
|
+
grow_items: For `'column'`/`'row'` layout, when `True` every child
|
|
40
|
+
grows equally to share the stacking axis. Defaults to `False`.
|
|
41
|
+
columns: Column definitions for `'grid'` layout. An integer sets
|
|
42
|
+
the number of equal-weight columns; a list sets per-column weights
|
|
43
|
+
or sizes — integers are relative weights, `'auto'` sizes to
|
|
44
|
+
content, `'Npx'` sets a fixed pixel width (e.g.
|
|
45
|
+
`[1, 2, 'auto', '120px']`).
|
|
46
|
+
rows: Row definitions for `'grid'` layout, same format as `columns`.
|
|
47
|
+
auto_flow: Grid auto-placement direction. Defaults to `'row'`.
|
|
48
|
+
accent: Color intent token applied to the card border. When set, the
|
|
49
|
+
card interior uses a subtle tint of that accent. When omitted, the
|
|
50
|
+
card uses the next surface step with no border color.
|
|
51
|
+
parent: Override the context-stack parent widget.
|
|
52
|
+
**kwargs: Layout placement options applied by the parent container —
|
|
53
|
+
`fill`, `expand`, `anchor`, `margin`, `row`, `column`, `sticky`.
|
|
54
|
+
See :doc:`/tasks/layout`.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
*,
|
|
60
|
+
layout: LayoutKind = "column",
|
|
61
|
+
padding: Padding | None = 16,
|
|
62
|
+
gap: int = 0,
|
|
63
|
+
horizontal_items: str | None = None,
|
|
64
|
+
vertical_items: str | None = None,
|
|
65
|
+
grow_items: bool = False,
|
|
66
|
+
columns: int | list[int | str] | None = None,
|
|
67
|
+
rows: int | list[int | str] | None = None,
|
|
68
|
+
auto_flow: AutoFlow = "row",
|
|
69
|
+
accent: AccentToken | str | None = None,
|
|
70
|
+
parent: Any = None,
|
|
71
|
+
**kwargs: Any,
|
|
72
|
+
) -> None:
|
|
73
|
+
self._parent = self._resolve_parent(parent)
|
|
74
|
+
self._layout = layout
|
|
75
|
+
layout_kw = self._split_layout_kwargs(kwargs)
|
|
76
|
+
|
|
77
|
+
# One horizontal_items/vertical_items pair serves both modes; the sensible
|
|
78
|
+
# default differs — grid cells fill (stretch), stacked children sit at the
|
|
79
|
+
# leading edge (left/top).
|
|
80
|
+
if horizontal_items is None:
|
|
81
|
+
horizontal_items = (
|
|
82
|
+
"stretch" if layout == "grid"
|
|
83
|
+
else "center" if layout == "column" else "left"
|
|
84
|
+
)
|
|
85
|
+
if vertical_items is None:
|
|
86
|
+
vertical_items = (
|
|
87
|
+
"stretch" if layout == "grid"
|
|
88
|
+
else "center" if layout == "row" else "top"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
tk_master = self._parent._child_master() if self._parent else None
|
|
92
|
+
|
|
93
|
+
# Determine the surface children will sit on:
|
|
94
|
+
# - With accent: always accent[subtle], fixed — accent is the identity, not an elevation marker
|
|
95
|
+
# - Without accent: alternate between card and card_raised at each nesting level
|
|
96
|
+
_SURFACE_STEPS = {
|
|
97
|
+
"background": "card",
|
|
98
|
+
"content": "card",
|
|
99
|
+
"card": "card_raised",
|
|
100
|
+
"card_raised": "card",
|
|
101
|
+
}
|
|
102
|
+
parent_surface = getattr(tk_master, '_surface', 'background') or 'background'
|
|
103
|
+
effective_surface = f'{accent}[subtle]' if accent is not None else _SURFACE_STEPS.get(parent_surface, 'card')
|
|
104
|
+
|
|
105
|
+
if layout in ("column", "row"):
|
|
106
|
+
self._internal = FlexFrame(
|
|
107
|
+
tk_master,
|
|
108
|
+
direction="vertical" if layout == "column" else "horizontal",
|
|
109
|
+
variant="card",
|
|
110
|
+
show_border=True,
|
|
111
|
+
surface=effective_surface,
|
|
112
|
+
**({"accent": accent} if accent is not None else {}),
|
|
113
|
+
padding=padding,
|
|
114
|
+
gap=gap,
|
|
115
|
+
horizontal_items=horizontal_items,
|
|
116
|
+
vertical_items=vertical_items,
|
|
117
|
+
grow_items=grow_items,
|
|
118
|
+
)
|
|
119
|
+
elif layout == "grid":
|
|
120
|
+
self._internal = GridFrame(
|
|
121
|
+
tk_master,
|
|
122
|
+
variant="card",
|
|
123
|
+
show_border=True,
|
|
124
|
+
surface=effective_surface,
|
|
125
|
+
**({"accent": accent} if accent is not None else {}),
|
|
126
|
+
padding=padding,
|
|
127
|
+
columns=columns,
|
|
128
|
+
rows=rows,
|
|
129
|
+
gap=gap,
|
|
130
|
+
auto_flow=auto_flow,
|
|
131
|
+
)
|
|
132
|
+
else:
|
|
133
|
+
raise ValueError(
|
|
134
|
+
f"Card layout must be 'column', 'row', or 'grid', got {layout!r}"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
self._horizontal_items = horizontal_items
|
|
138
|
+
self._vertical_items = vertical_items
|
|
139
|
+
self._attach_to_parent(layout_kw)
|
|
140
|
+
|
|
141
|
+
def _child_master(self) -> tkinter.Misc:
|
|
142
|
+
return self._internal
|
|
143
|
+
|
|
144
|
+
def _default_layout_method(self) -> str:
|
|
145
|
+
return "grid" if self._layout == "grid" else "flex"
|
|
146
|
+
|
|
147
|
+
def guide_layout(self, child: Any, **layout_kw: Any) -> None:
|
|
148
|
+
if self._layout == "grid":
|
|
149
|
+
return super().guide_layout(child, **layout_kw)
|
|
150
|
+
place_flex_child(self._internal, child, layout_kw, "Card")
|
|
151
|
+
|
|
152
|
+
def _merge_layout_options(self, child: Any, layout_kw: dict) -> tuple[str, dict]:
|
|
153
|
+
# Only reached for grid layout (column/row use the flex path above).
|
|
154
|
+
_reject_legacy_child_kwargs(layout_kw, "Card")
|
|
155
|
+
options = {k: v for k, v in layout_kw.items() if k in GRID_KEYS}
|
|
156
|
+
h = layout_kw.get("horizontal") or self._horizontal_items
|
|
157
|
+
v = layout_kw.get("vertical") or self._vertical_items
|
|
158
|
+
options["sticky"] = grid_sticky(h, v)
|
|
159
|
+
return ("grid", options)
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Callable, Literal, overload, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from bootstack.events import Event, Subscription
|
|
6
|
+
from bootstack.streams import Stream
|
|
7
|
+
from bootstack.widgets._core.base import PublicWidgetBase
|
|
8
|
+
from bootstack.widgets._core.events import register_widget_events
|
|
9
|
+
from bootstack.widgets._impl.composites.carousel import Carousel as _InternalCarousel
|
|
10
|
+
from bootstack.widgets.types import AccentToken, SurfaceToken
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from bootstack.data.types import DataSourceProtocol
|
|
14
|
+
|
|
15
|
+
ImageFit = Literal["contain", "cover", "fill", "none", "scale-down"]
|
|
16
|
+
Transition = Literal["slide", "fade", "none"]
|
|
17
|
+
Indicator = Literal["dots", "count", "none"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Carousel(PublicWidgetBase):
|
|
21
|
+
"""Shows one image slide at a time, with prev/next navigation.
|
|
22
|
+
|
|
23
|
+
`Carousel` steps through a collection of image records one slide at a time —
|
|
24
|
+
the focus-on-one counterpart to :doc:`Gallery </widgets/gallery>`. It pairs
|
|
25
|
+
naturally with `Gallery.on_item_activate` to open a full-size pop-up viewer:
|
|
26
|
+
a `Carousel` over the same `items`, starting at the activated slide.
|
|
27
|
+
|
|
28
|
+
Each record names the image through `image_field` (an `Image`, a file path,
|
|
29
|
+
or a PIL image) and, optionally, a caption through `caption_field`. Navigate
|
|
30
|
+
with the on-screen chevrons, the arrow keys, the indicator dots, or the
|
|
31
|
+
`next`/`previous`/`go_to` methods.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
items: Initial list of record dicts.
|
|
35
|
+
data_source: A data source for database- or API-backed data.
|
|
36
|
+
image_field: Record key holding each slide's image. Default `'image'`.
|
|
37
|
+
caption_field: Record key for the caption overlaid on each slide.
|
|
38
|
+
Default `None` (no captions).
|
|
39
|
+
index: The slide shown first. Default `0`.
|
|
40
|
+
fit: How each image is scaled into the stage — `'contain'` (default,
|
|
41
|
+
shows the whole image), `'cover'`, `'fill'`, `'none'`, or
|
|
42
|
+
`'scale-down'`. See :doc:`Picture </widgets/picture>`.
|
|
43
|
+
transition: Animation between slides — `'slide'` (default), `'fade'`, or
|
|
44
|
+
`'none'`.
|
|
45
|
+
show_arrows: Show the overlaid prev/next chevrons. Default `True`.
|
|
46
|
+
indicator: The slide indicator — `'dots'` (default; auto-switches to a
|
|
47
|
+
counter when there are many slides), `'count'`, or `'none'`.
|
|
48
|
+
autoplay: Auto-advance through the slides. Default `False`.
|
|
49
|
+
interval: Autoplay dwell time per slide, in milliseconds. Default `4000`.
|
|
50
|
+
loop: Wrap around past the first and last slides. Default `True`.
|
|
51
|
+
corner_radius: Rounded-corner radius for the slide image, in pixels.
|
|
52
|
+
Default `0`.
|
|
53
|
+
aspect_ratio: Width-to-height ratio used to derive the carousel's minimum
|
|
54
|
+
height when it sits in a container that doesn't impose one (a scroll
|
|
55
|
+
view, an auto-fit window) — a larger ratio gives a wider, shorter
|
|
56
|
+
floor. Default `1.5`. Ignored when `height` is set. `fill`/`expand`
|
|
57
|
+
still grow the stage past this floor.
|
|
58
|
+
height: Explicit minimum height for the slide stage, in pixels. Overrides
|
|
59
|
+
`aspect_ratio`. Default `None` (derive from `aspect_ratio`).
|
|
60
|
+
accent: Color intent token to brand the active indicator dot. By default
|
|
61
|
+
the dots are neutral (white), which reads on any image; set this to
|
|
62
|
+
color the active dot.
|
|
63
|
+
surface: Background surface token shown behind a letterboxed slide.
|
|
64
|
+
parent: Override the context-stack parent.
|
|
65
|
+
**kwargs: Layout placement options applied by the parent container —
|
|
66
|
+
`fill`, `expand`, `anchor`, `margin`, `row`, `column`, `sticky`.
|
|
67
|
+
See :doc:`/tasks/layout`.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
def __init__(
|
|
71
|
+
self,
|
|
72
|
+
*,
|
|
73
|
+
items: list[dict] | None = None,
|
|
74
|
+
data_source: "DataSourceProtocol | None" = None,
|
|
75
|
+
image_field: str = "image",
|
|
76
|
+
caption_field: str | None = None,
|
|
77
|
+
index: int = 0,
|
|
78
|
+
fit: ImageFit = "contain",
|
|
79
|
+
transition: Transition = "slide",
|
|
80
|
+
show_arrows: bool = True,
|
|
81
|
+
indicator: Indicator = "dots",
|
|
82
|
+
autoplay: bool = False,
|
|
83
|
+
interval: int = 4000,
|
|
84
|
+
loop: bool = True,
|
|
85
|
+
corner_radius: int = 0,
|
|
86
|
+
aspect_ratio: float = 1.5,
|
|
87
|
+
height: int | None = None,
|
|
88
|
+
accent: AccentToken | str | None = None,
|
|
89
|
+
surface: SurfaceToken | str | None = None,
|
|
90
|
+
parent: Any = None,
|
|
91
|
+
**kwargs: Any,
|
|
92
|
+
) -> None:
|
|
93
|
+
self._parent = self._resolve_parent(parent)
|
|
94
|
+
layout_kw = self._split_layout_kwargs(kwargs)
|
|
95
|
+
tk_master = self._parent._child_master() if self._parent else None
|
|
96
|
+
|
|
97
|
+
internal_kwargs: dict[str, Any] = {
|
|
98
|
+
"image_field": image_field,
|
|
99
|
+
"caption_field": caption_field,
|
|
100
|
+
"index": index,
|
|
101
|
+
"fit": fit,
|
|
102
|
+
"transition": transition,
|
|
103
|
+
"show_arrows": show_arrows,
|
|
104
|
+
"indicator": indicator,
|
|
105
|
+
"autoplay": autoplay,
|
|
106
|
+
"interval": interval,
|
|
107
|
+
"loop": loop,
|
|
108
|
+
"corner_radius": corner_radius,
|
|
109
|
+
"aspect_ratio": aspect_ratio,
|
|
110
|
+
"height": height,
|
|
111
|
+
}
|
|
112
|
+
if items is not None:
|
|
113
|
+
internal_kwargs["items"] = items
|
|
114
|
+
if data_source is not None:
|
|
115
|
+
internal_kwargs["datasource"] = data_source
|
|
116
|
+
if accent is not None:
|
|
117
|
+
internal_kwargs["accent"] = accent
|
|
118
|
+
if surface is not None:
|
|
119
|
+
internal_kwargs["surface"] = surface
|
|
120
|
+
|
|
121
|
+
self._internal = _InternalCarousel(tk_master, **internal_kwargs)
|
|
122
|
+
self._internal.pack_propagate(False)
|
|
123
|
+
self._attach_to_parent(layout_kw)
|
|
124
|
+
|
|
125
|
+
# ----- Navigation -----
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def index(self) -> int:
|
|
129
|
+
"""The index of the currently shown slide. Assign to jump to a slide."""
|
|
130
|
+
return self._internal.index
|
|
131
|
+
|
|
132
|
+
@index.setter
|
|
133
|
+
def index(self, value: int) -> None:
|
|
134
|
+
self._internal.go_to(int(value))
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def current(self) -> dict | None:
|
|
138
|
+
"""The currently shown record — the data bag — or `None` when empty."""
|
|
139
|
+
return self._internal.current
|
|
140
|
+
|
|
141
|
+
@property
|
|
142
|
+
def count(self) -> int:
|
|
143
|
+
"""The number of slides."""
|
|
144
|
+
return self._internal.count
|
|
145
|
+
|
|
146
|
+
def next(self) -> None:
|
|
147
|
+
"""Advance to the next slide."""
|
|
148
|
+
self._internal.next()
|
|
149
|
+
|
|
150
|
+
def previous(self) -> None:
|
|
151
|
+
"""Go back to the previous slide."""
|
|
152
|
+
self._internal.previous()
|
|
153
|
+
|
|
154
|
+
def go_to(self, index: int) -> None:
|
|
155
|
+
"""Jump to the slide at `index`, animating in the right direction.
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
index: The slide index to show.
|
|
159
|
+
"""
|
|
160
|
+
self._internal.go_to(int(index))
|
|
161
|
+
|
|
162
|
+
# ----- Autoplay -----
|
|
163
|
+
|
|
164
|
+
@property
|
|
165
|
+
def is_playing(self) -> bool:
|
|
166
|
+
"""Whether autoplay is currently running."""
|
|
167
|
+
return self._internal.is_playing
|
|
168
|
+
|
|
169
|
+
def play(self) -> None:
|
|
170
|
+
"""Start auto-advancing through the slides."""
|
|
171
|
+
self._internal.play()
|
|
172
|
+
|
|
173
|
+
def pause(self) -> None:
|
|
174
|
+
"""Stop auto-advancing."""
|
|
175
|
+
self._internal.pause()
|
|
176
|
+
|
|
177
|
+
def stop(self) -> None:
|
|
178
|
+
"""Stop auto-advancing and return to the first slide."""
|
|
179
|
+
self._internal.stop()
|
|
180
|
+
|
|
181
|
+
# ----- Data -----
|
|
182
|
+
|
|
183
|
+
@property
|
|
184
|
+
def data_source(self) -> "DataSourceProtocol":
|
|
185
|
+
"""The underlying data source instance."""
|
|
186
|
+
return self._internal.get_datasource()
|
|
187
|
+
|
|
188
|
+
def reload(self) -> None:
|
|
189
|
+
"""Reload from the data source and refresh the current slide."""
|
|
190
|
+
self._internal.reload()
|
|
191
|
+
|
|
192
|
+
# ----- Events -----
|
|
193
|
+
|
|
194
|
+
@overload
|
|
195
|
+
def on_change(self) -> Stream: ...
|
|
196
|
+
@overload
|
|
197
|
+
def on_change(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
|
|
198
|
+
def on_change(
|
|
199
|
+
self, handler: Callable[[dict[str, Any]], Any] | None = None
|
|
200
|
+
) -> Stream | Subscription:
|
|
201
|
+
"""Fired when the active slide changes.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
handler: Called with the now-current record `dict` — read fields with
|
|
205
|
+
`e["field"]`. Omit to get a composable
|
|
206
|
+
:class:`~bootstack.streams.Stream`.
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
A cancellable :class:`~bootstack.events.Subscription` when a handler
|
|
210
|
+
is given, otherwise a :class:`~bootstack.streams.Stream`.
|
|
211
|
+
"""
|
|
212
|
+
return self.on("change", handler)
|
|
213
|
+
|
|
214
|
+
@overload
|
|
215
|
+
def on_item_click(self) -> Stream: ...
|
|
216
|
+
@overload
|
|
217
|
+
def on_item_click(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
|
|
218
|
+
def on_item_click(
|
|
219
|
+
self, handler: Callable[[dict[str, Any]], Any] | None = None
|
|
220
|
+
) -> Stream | Subscription:
|
|
221
|
+
"""Fired when the current slide is clicked.
|
|
222
|
+
|
|
223
|
+
The natural hook for closing a pop-up viewer or opening a detail view.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
handler: Called with the current record `dict`. Omit to get a
|
|
227
|
+
composable :class:`~bootstack.streams.Stream`.
|
|
228
|
+
|
|
229
|
+
Returns:
|
|
230
|
+
A cancellable :class:`~bootstack.events.Subscription` when a handler
|
|
231
|
+
is given, otherwise a :class:`~bootstack.streams.Stream`.
|
|
232
|
+
"""
|
|
233
|
+
return self.on("item_click", handler)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
_CAROUSEL_EVENTS: dict[str, str] = {
|
|
237
|
+
"change": "<<Change>>",
|
|
238
|
+
"item_click": "<<ItemClick>>",
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
register_widget_events(Carousel, _CAROUSEL_EVENTS)
|