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,276 @@
|
|
|
1
|
+
"""Themed top-level window for secondary application windows."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import tkinter
|
|
5
|
+
import warnings
|
|
6
|
+
from typing import Any, Callable, Literal, Optional, Tuple
|
|
7
|
+
|
|
8
|
+
from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
|
|
9
|
+
from bootstack._runtime.base_window import BaseWindow
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Toplevel(BaseWindow, WidgetCapabilitiesMixin, tkinter.Toplevel):
|
|
13
|
+
"""A themed top-level window.
|
|
14
|
+
|
|
15
|
+
This class wraps `tkinter.Toplevel` and adds bootstack window conveniences
|
|
16
|
+
(title/geometry helpers, centering, alpha/topmost/toolwindow helpers, etc.).
|
|
17
|
+
|
|
18
|
+
The standard widget API (events, scheduling, clipboard, geometry managers,
|
|
19
|
+
winfo, etc.) is available through inheritance and is documented under
|
|
20
|
+
bootstack capabilities.
|
|
21
|
+
|
|
22
|
+
For additional information on the underlying Tk/Tkinter behavior, see:
|
|
23
|
+
- Tcl/Tk `toplevel` command documentation
|
|
24
|
+
- Python `tkinter.Toplevel` documentation
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
>>> win = Toplevel(title="My Toplevel")
|
|
28
|
+
>>> win.mainloop()
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
title: str = "bootstack",
|
|
34
|
+
icon: tkinter.PhotoImage | str | None = None,
|
|
35
|
+
size: Optional[Tuple[int, int]] = None,
|
|
36
|
+
position: Optional[Tuple[int, int]] = None,
|
|
37
|
+
minsize: Optional[Tuple[int, int]] = None,
|
|
38
|
+
maxsize: Optional[Tuple[int, int]] = None,
|
|
39
|
+
resizable: Optional[Tuple[bool, bool]] = None,
|
|
40
|
+
transient: Optional[tkinter.Misc] = None,
|
|
41
|
+
overrideredirect: bool = False,
|
|
42
|
+
windowtype: Optional[str] = None,
|
|
43
|
+
topmost: bool = False,
|
|
44
|
+
toolwindow: bool = False,
|
|
45
|
+
alpha: float = 1.0,
|
|
46
|
+
window_style: Optional[str] = None,
|
|
47
|
+
modal: Literal[False, True, "window", "app"] = False,
|
|
48
|
+
center_on_parent: bool = False,
|
|
49
|
+
center_on_screen: bool = False,
|
|
50
|
+
on_close: Optional[Callable[[], bool | None]] = None,
|
|
51
|
+
**kwargs: Any,
|
|
52
|
+
) -> None:
|
|
53
|
+
"""Initialize a top-level window.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
title: The title that appears on the window titlebar.
|
|
57
|
+
icon: A PhotoImage used for the titlebar icon. If None, the default bootstack icon is used.
|
|
58
|
+
size: Window size as (width, height). Applied via `geometry`.
|
|
59
|
+
position: Window position as (x, y). Applied via `geometry`. Overrides `center_on_*`.
|
|
60
|
+
minsize: Minimum permissible window size as (width, height).
|
|
61
|
+
maxsize: Maximum permissible window size as (width, height).
|
|
62
|
+
resizable: Whether the user may resize the window as (x, y).
|
|
63
|
+
transient: Mark this window as transient for the given master.
|
|
64
|
+
overrideredirect: If True, instruct the window manager to ignore this window.
|
|
65
|
+
windowtype: Request a native window type, resolved per platform from a
|
|
66
|
+
single switch. Values: `'splash'`, `'tooltip'`, `'dock'`, `'utility'`.
|
|
67
|
+
On X11 it sets `-type`; on macOS it maps to a `MacWindowStyle`; on
|
|
68
|
+
Windows the chromeless types (`'splash'`/`'tooltip'`/`'dock'`) resolve
|
|
69
|
+
to override-redirect (borderless, no taskbar button) and `'utility'`
|
|
70
|
+
resolves to a tool window. The caller does not also need to pass
|
|
71
|
+
`overrideredirect=True` to get a chromeless window on Windows.
|
|
72
|
+
topmost: If True, keep this window above others (`-topmost`).
|
|
73
|
+
toolwindow: On Windows, request a toolwindow style (`-toolwindow`).
|
|
74
|
+
alpha: On Windows, the window alpha transparency (0.0–1.0) via `-alpha`.
|
|
75
|
+
window_style: Windows-only pywinstyles effect. Options include
|
|
76
|
+
'mica', 'acrylic', 'aero', 'transparent', 'win7', etc.
|
|
77
|
+
Defaults to 'mica'. Set to None to disable.
|
|
78
|
+
modal: Modality level. `False` (default) — non-modal. `True` or
|
|
79
|
+
`"window"` — window-level modal: grabs input from parent only.
|
|
80
|
+
`"app"` — app-level modal: grabs input from all windows.
|
|
81
|
+
When modal is truthy and `transient` is not set, a transient
|
|
82
|
+
parent is inferred from `master` or the current app.
|
|
83
|
+
center_on_parent: If True, center this window over its transient
|
|
84
|
+
parent (or master). Ignored when `position` is given. Falls
|
|
85
|
+
back to `center_on_screen` behavior when no parent is found.
|
|
86
|
+
Mutually exclusive with `center_on_screen`.
|
|
87
|
+
center_on_screen: If True, center this window on the screen.
|
|
88
|
+
Ignored when `position` or `center_on_parent` is given.
|
|
89
|
+
on_close: Callback invoked when the user clicks the close button.
|
|
90
|
+
Return `False` to veto the close; return `None` or `True`
|
|
91
|
+
to allow it. Equivalent to calling `add_close_handler(fn)`
|
|
92
|
+
after construction.
|
|
93
|
+
**kwargs: Other keyword arguments passed to `tkinter.Toplevel`.
|
|
94
|
+
"""
|
|
95
|
+
# Extract iconify kwarg if present
|
|
96
|
+
iconify = kwargs.pop("iconify", None)
|
|
97
|
+
|
|
98
|
+
# Initialize Toplevel
|
|
99
|
+
tkinter.Toplevel.__init__(self, **kwargs)
|
|
100
|
+
|
|
101
|
+
# Setup window system info
|
|
102
|
+
self.winsys: str = self.tk.call("tk", "windowingsystem")
|
|
103
|
+
|
|
104
|
+
# result storage for block_until_closed() pattern
|
|
105
|
+
self._result: Any = None
|
|
106
|
+
|
|
107
|
+
# modal level — stored for use in show()
|
|
108
|
+
self._modal = modal
|
|
109
|
+
|
|
110
|
+
# Apply Aqua MacWindowStyle BEFORE any setup that might pump the
|
|
111
|
+
# event loop (icons, geometry, update_idletasks). Tk's docs require
|
|
112
|
+
# the style to be set on a freshly-created, never-mapped window;
|
|
113
|
+
# after the first event-loop trip the call silently has no effect
|
|
114
|
+
# and the window keeps its default chrome. We withdraw immediately
|
|
115
|
+
# so the window is unmapped, set the style, then continue.
|
|
116
|
+
self.withdraw()
|
|
117
|
+
if windowtype is not None and self.winsys == "aqua":
|
|
118
|
+
aqua_style = {
|
|
119
|
+
"tooltip": ("help", "none"),
|
|
120
|
+
"splash": ("plain", "none"),
|
|
121
|
+
"utility": ("utility", "none"),
|
|
122
|
+
"dock": ("plain", "none"),
|
|
123
|
+
}.get(windowtype)
|
|
124
|
+
if aqua_style is not None:
|
|
125
|
+
try:
|
|
126
|
+
self.tk.call(
|
|
127
|
+
"::tk::unsupported::MacWindowStyle", "style",
|
|
128
|
+
self, aqua_style[0], aqua_style[1],
|
|
129
|
+
)
|
|
130
|
+
except tkinter.TclError:
|
|
131
|
+
pass
|
|
132
|
+
|
|
133
|
+
# Windows has no native window-type attribute, so translate windowtype
|
|
134
|
+
# to the matching primitive: the chromeless types resolve to
|
|
135
|
+
# override-redirect (borderless + no taskbar/Alt-Tab button), and
|
|
136
|
+
# 'utility' resolves to a tool window (minimal chrome). One switch then
|
|
137
|
+
# yields the right native window on all three platforms. (On Aqua the
|
|
138
|
+
# overrideredirect call is a no-op — MacWindowStyle handled it above.)
|
|
139
|
+
_effective_overrideredirect = overrideredirect
|
|
140
|
+
_effective_toolwindow = toolwindow
|
|
141
|
+
if windowtype is not None and self.winsys == "win32":
|
|
142
|
+
if windowtype in ("splash", "tooltip", "dock"):
|
|
143
|
+
_effective_overrideredirect = True
|
|
144
|
+
elif windowtype == "utility":
|
|
145
|
+
_effective_toolwindow = True
|
|
146
|
+
|
|
147
|
+
# Setup icon (use default bootstack icon if no icon provided)
|
|
148
|
+
self._setup_icon(icon, default_icon_enabled=True)
|
|
149
|
+
|
|
150
|
+
# Resolve the centering parent. When center_on_parent=True we need a
|
|
151
|
+
# parent widget; prefer the explicit transient, then self.master.
|
|
152
|
+
_center_parent: Optional[tkinter.Misc] = None
|
|
153
|
+
_effective_center_screen = center_on_screen
|
|
154
|
+
if center_on_parent and position is None:
|
|
155
|
+
_center_parent = transient or (self.master if isinstance(self.master, tkinter.Misc) else None)
|
|
156
|
+
if _center_parent is None:
|
|
157
|
+
warnings.warn(
|
|
158
|
+
"Toplevel center_on_parent=True but no parent window detected; "
|
|
159
|
+
"centering on screen instead.",
|
|
160
|
+
stacklevel=2,
|
|
161
|
+
)
|
|
162
|
+
_effective_center_screen = True
|
|
163
|
+
|
|
164
|
+
# Auto-promote transient when modal is truthy and no transient given
|
|
165
|
+
_resolved_transient = transient
|
|
166
|
+
if modal and transient is None:
|
|
167
|
+
parent = self.master if isinstance(self.master, tkinter.Misc) else None
|
|
168
|
+
if parent is None:
|
|
169
|
+
try:
|
|
170
|
+
from bootstack._runtime.app import get_current_app
|
|
171
|
+
parent = get_current_app()
|
|
172
|
+
except RuntimeError:
|
|
173
|
+
pass
|
|
174
|
+
if parent is not None:
|
|
175
|
+
_resolved_transient = parent
|
|
176
|
+
else:
|
|
177
|
+
warnings.warn(
|
|
178
|
+
"Toplevel modal=True but no parent window could be inferred. "
|
|
179
|
+
"Modality may not work correctly.",
|
|
180
|
+
stacklevel=2,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
# Setup window using BaseWindow
|
|
184
|
+
self._setup_window(
|
|
185
|
+
title=title,
|
|
186
|
+
size=size,
|
|
187
|
+
position=position,
|
|
188
|
+
minsize=minsize,
|
|
189
|
+
maxsize=maxsize,
|
|
190
|
+
resizable=resizable,
|
|
191
|
+
transient=_resolved_transient,
|
|
192
|
+
overrideredirect=_effective_overrideredirect,
|
|
193
|
+
alpha=alpha,
|
|
194
|
+
window_style=window_style,
|
|
195
|
+
center_on_parent=_center_parent,
|
|
196
|
+
center_on_screen=_effective_center_screen if _center_parent is None else False,
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# Handle iconify
|
|
200
|
+
if iconify:
|
|
201
|
+
self.iconify()
|
|
202
|
+
|
|
203
|
+
# X11 -type attribute. The Aqua case was handled before
|
|
204
|
+
# _setup_window above (style must be set pre-map).
|
|
205
|
+
if windowtype is not None and self.winsys == "x11":
|
|
206
|
+
self.attributes("-type", windowtype)
|
|
207
|
+
|
|
208
|
+
if topmost:
|
|
209
|
+
self.attributes("-topmost", 1)
|
|
210
|
+
|
|
211
|
+
if _effective_toolwindow and self.winsys == "win32":
|
|
212
|
+
self.attributes("-toolwindow", 1)
|
|
213
|
+
|
|
214
|
+
# Register on_close handler
|
|
215
|
+
if on_close is not None:
|
|
216
|
+
self.add_close_handler(on_close)
|
|
217
|
+
|
|
218
|
+
# -------------------------------------------------------------------------
|
|
219
|
+
# show() override — applies grab when modal
|
|
220
|
+
# -------------------------------------------------------------------------
|
|
221
|
+
|
|
222
|
+
def show(self) -> None:
|
|
223
|
+
"""Show the window and apply modal grab if configured."""
|
|
224
|
+
super().show()
|
|
225
|
+
if self._modal:
|
|
226
|
+
try:
|
|
227
|
+
if self._modal == "app":
|
|
228
|
+
self.grab_set_global()
|
|
229
|
+
else:
|
|
230
|
+
self.grab_set()
|
|
231
|
+
self.focus_set()
|
|
232
|
+
except tkinter.TclError:
|
|
233
|
+
pass
|
|
234
|
+
|
|
235
|
+
# -------------------------------------------------------------------------
|
|
236
|
+
# result property + block_until_closed()
|
|
237
|
+
# -------------------------------------------------------------------------
|
|
238
|
+
|
|
239
|
+
@property
|
|
240
|
+
def result(self) -> Any:
|
|
241
|
+
"""Value set by the window's content before it closes.
|
|
242
|
+
|
|
243
|
+
Defaults to `None`. Set this attribute before calling
|
|
244
|
+
`destroy()` to return a value from `block_until_closed()`.
|
|
245
|
+
|
|
246
|
+
See [block_until_closed()][bootstack.Toplevel.block_until_closed].
|
|
247
|
+
"""
|
|
248
|
+
return self._result
|
|
249
|
+
|
|
250
|
+
@result.setter
|
|
251
|
+
def result(self, value: Any) -> None:
|
|
252
|
+
self._result = value
|
|
253
|
+
|
|
254
|
+
def block_until_closed(self) -> Any:
|
|
255
|
+
"""Show this window and block until it is destroyed.
|
|
256
|
+
|
|
257
|
+
Calls `show()` to make the window visible, then enters a nested
|
|
258
|
+
event loop via `wait_window()` that blocks until the window is
|
|
259
|
+
destroyed. Returns `self.result`.
|
|
260
|
+
|
|
261
|
+
Set `self.result` (or `self.result = value`) before calling
|
|
262
|
+
`destroy()` to pass a return value back to the caller.
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
The value of `self.result` at the time the window was destroyed.
|
|
266
|
+
|
|
267
|
+
Note:
|
|
268
|
+
Do not call this from within an existing `block_until_closed()`
|
|
269
|
+
chain unless you understand the implications of nested event loops.
|
|
270
|
+
"""
|
|
271
|
+
self.show()
|
|
272
|
+
try:
|
|
273
|
+
self.wait_window(self)
|
|
274
|
+
except tkinter.TclError:
|
|
275
|
+
pass
|
|
276
|
+
return self._result
|