bootstack 0.1.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bootstack/__init__.py +249 -0
- bootstack/__main__.py +5 -0
- bootstack/api/__init__.py +127 -0
- bootstack/api/app.py +30 -0
- bootstack/api/constants.py +3 -0
- bootstack/api/data.py +23 -0
- bootstack/api/dialogs.py +44 -0
- bootstack/api/i18n.py +17 -0
- bootstack/api/localization.py +16 -0
- bootstack/api/menu.py +7 -0
- bootstack/api/style.py +23 -0
- bootstack/api/utils.py +24 -0
- bootstack/api/widgets.py +137 -0
- bootstack/assets/__init__.py +24 -0
- bootstack/assets/bootstack-transparent.png +0 -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/border.png +0 -0
- bootstack/assets/elements/button-compact.png +0 -0
- bootstack/assets/elements/button-default.png +0 -0
- bootstack/assets/elements/button-group-horizontal-after-compact.png +0 -0
- bootstack/assets/elements/button-group-horizontal-after-default.png +0 -0
- bootstack/assets/elements/button-group-horizontal-before-compact.png +0 -0
- bootstack/assets/elements/button-group-horizontal-before-default.png +0 -0
- bootstack/assets/elements/button-group-horizontal-center-compact.png +0 -0
- bootstack/assets/elements/button-group-horizontal-center-default.png +0 -0
- bootstack/assets/elements/button-group-vertical-after-compact.png +0 -0
- bootstack/assets/elements/button-group-vertical-after-default.png +0 -0
- bootstack/assets/elements/button-group-vertical-before-compact.png +0 -0
- bootstack/assets/elements/button-group-vertical-before-default.png +0 -0
- bootstack/assets/elements/button-group-vertical-center-compact.png +0 -0
- bootstack/assets/elements/button-group-vertical-center-default.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-after-compact.png +0 -0
- bootstack/assets/elements/input-after-default.png +0 -0
- bootstack/assets/elements/input-before-compact.png +0 -0
- bootstack/assets/elements/input-before-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/manifest.toml +480 -0
- bootstack/assets/elements/menu-item.png +0 -0
- bootstack/assets/elements/nav-button-compact.png +0 -0
- bootstack/assets/elements/nav-button-default.png +0 -0
- bootstack/assets/elements/nav-icon-button-compact.png +0 -0
- bootstack/assets/elements/nav-icon-button-default.png +0 -0
- bootstack/assets/elements/notebook-client-border.png +0 -0
- bootstack/assets/elements/notebook-tab-active.png +0 -0
- bootstack/assets/elements/notebook-tab-bar.png +0 -0
- bootstack/assets/elements/notebook-tab-normal.png +0 -0
- bootstack/assets/elements/notebook-tab-pill.png +0 -0
- bootstack/assets/elements/progress-bar-horizontal-striped.png +0 -0
- bootstack/assets/elements/progress-bar-solid.png +0 -0
- bootstack/assets/elements/progress-bar-thin.png +0 -0
- bootstack/assets/elements/progress-bar-vertical-striped.png +0 -0
- bootstack/assets/elements/radio-selected.png +0 -0
- bootstack/assets/elements/radio-unselected.png +0 -0
- bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- bootstack/assets/elements/scrollbar-vertical.png +0 -0
- bootstack/assets/elements/slider-handle-focus.png +0 -0
- bootstack/assets/elements/slider-handle.png +0 -0
- bootstack/assets/elements/slider-track-horizontal.png +0 -0
- bootstack/assets/elements/slider-track-vertical.png +0 -0
- bootstack/assets/elements/switch-off.png +0 -0
- bootstack/assets/elements/switch-on.png +0 -0
- bootstack/assets/elements/tabs-bar-horizontal.png +0 -0
- bootstack/assets/elements/tabs-bar-vertical.png +0 -0
- bootstack/assets/elements/tabs-pill.png +0 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +875 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +875 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +851 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +841 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +914 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +841 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +841 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/themes/__init__.py +0 -0
- bootstack/assets/themes/amber-dark.json +32 -0
- bootstack/assets/themes/amber-light.json +32 -0
- bootstack/assets/themes/aurora-dark.json +32 -0
- bootstack/assets/themes/aurora-light.json +32 -0
- bootstack/assets/themes/bootstrap-dark.json +32 -0
- bootstack/assets/themes/bootstrap-light.json +32 -0
- bootstack/assets/themes/classic-dark.json +32 -0
- bootstack/assets/themes/classic-light.json +32 -0
- bootstack/assets/themes/docs-dark.json +32 -0
- bootstack/assets/themes/docs-light.json +32 -0
- bootstack/assets/themes/forest-dark.json +32 -0
- bootstack/assets/themes/forest-light.json +32 -0
- bootstack/assets/themes/ocean-dark.json +32 -0
- bootstack/assets/themes/ocean-light.json +32 -0
- bootstack/assets/themes/rose-dark.json +32 -0
- bootstack/assets/themes/rose-light.json +32 -0
- bootstack/assets/widgets/__init__.py +0 -0
- bootstack/assets/widgets/badge-default.png +0 -0
- bootstack/assets/widgets/badge-pill.png +0 -0
- bootstack/assets/widgets/border.png +0 -0
- bootstack/assets/widgets/button-group-horizontal-after.png +0 -0
- bootstack/assets/widgets/button-group-horizontal-before.png +0 -0
- bootstack/assets/widgets/button-group-horizontal-center.png +0 -0
- bootstack/assets/widgets/button-group-vertical-after.png +0 -0
- bootstack/assets/widgets/button-group-vertical-before.png +0 -0
- bootstack/assets/widgets/button-group-vertical-center.png +0 -0
- bootstack/assets/widgets/button.png +0 -0
- bootstack/assets/widgets/checkbox-checked.png +0 -0
- bootstack/assets/widgets/checkbox-indeterminate.png +0 -0
- bootstack/assets/widgets/checkbox-unchecked.png +0 -0
- bootstack/assets/widgets/field.png +0 -0
- bootstack/assets/widgets/icon-button.png +0 -0
- bootstack/assets/widgets/input-inner.png +0 -0
- bootstack/assets/widgets/input-prefix.png +0 -0
- bootstack/assets/widgets/input-suffix.png +0 -0
- bootstack/assets/widgets/input.png +0 -0
- bootstack/assets/widgets/list-item-focus.png +0 -0
- bootstack/assets/widgets/list-item-separated.png +0 -0
- bootstack/assets/widgets/menu-item-separated.png +0 -0
- bootstack/assets/widgets/notebook-client-border.png +0 -0
- bootstack/assets/widgets/notebook-pill-active.png +0 -0
- bootstack/assets/widgets/notebook-pill-inactive.png +0 -0
- bootstack/assets/widgets/notebook-tab-active.png +0 -0
- bootstack/assets/widgets/notebook-tab-border.png +0 -0
- bootstack/assets/widgets/notebook-tab-normal.png +0 -0
- bootstack/assets/widgets/notebook-underline.png +0 -0
- bootstack/assets/widgets/progress-bar-horizontal-default.png +0 -0
- bootstack/assets/widgets/progress-bar-horizontal-striped.png +0 -0
- bootstack/assets/widgets/progress-bar-vertical-default.png +0 -0
- bootstack/assets/widgets/progress-bar-vertical-striped.png +0 -0
- bootstack/assets/widgets/progress-trough-horizontal.png +0 -0
- bootstack/assets/widgets/progress-trough-vertical.png +0 -0
- bootstack/assets/widgets/radio-selected.png +0 -0
- bootstack/assets/widgets/radio-unselected.png +0 -0
- bootstack/assets/widgets/scrollbar-horizontal-rounded.png +0 -0
- bootstack/assets/widgets/scrollbar-vertical-rounded.png +0 -0
- bootstack/assets/widgets/separator-horizontal.png +0 -0
- bootstack/assets/widgets/separator-vertical.png +0 -0
- bootstack/assets/widgets/slider-handle-focus.png +0 -0
- bootstack/assets/widgets/slider-handle.png +0 -0
- bootstack/assets/widgets/slider-track-horizontal.png +0 -0
- bootstack/assets/widgets/slider-track-vertical.png +0 -0
- bootstack/assets/widgets/switch-off.png +0 -0
- bootstack/assets/widgets/switch-on.png +0 -0
- bootstack/assets/widgets/tabs-bar-horizontal.png +0 -0
- bootstack/assets/widgets/tabs-bar-vertical.png +0 -0
- bootstack/assets/widgets/tabs-pill.png +0 -0
- bootstack/cli/__init__.py +124 -0
- bootstack/cli/__main__.py +6 -0
- bootstack/cli/add.py +439 -0
- bootstack/cli/build.py +115 -0
- bootstack/cli/config.py +287 -0
- bootstack/cli/demo.py +1267 -0
- bootstack/cli/doctor.py +195 -0
- bootstack/cli/list_cmd.py +71 -0
- bootstack/cli/promote.py +120 -0
- bootstack/cli/pyinstaller.py +246 -0
- bootstack/cli/run.py +99 -0
- bootstack/cli/start.py +105 -0
- bootstack/cli/templates/__init__.py +861 -0
- bootstack/constants.py +325 -0
- bootstack/core/__init__.py +34 -0
- bootstack/core/capabilities/__init__.py +45 -0
- bootstack/core/capabilities/after.py +103 -0
- bootstack/core/capabilities/bind.py +154 -0
- bootstack/core/capabilities/bindtags.py +112 -0
- bootstack/core/capabilities/busy.py +61 -0
- bootstack/core/capabilities/clipboard.py +88 -0
- bootstack/core/capabilities/focus.py +118 -0
- bootstack/core/capabilities/grab.py +65 -0
- bootstack/core/capabilities/grid.py +188 -0
- bootstack/core/capabilities/localization.py +231 -0
- bootstack/core/capabilities/pack.py +119 -0
- bootstack/core/capabilities/place.py +92 -0
- bootstack/core/capabilities/selection.py +136 -0
- bootstack/core/capabilities/signals.py +242 -0
- bootstack/core/capabilities/winfo.py +315 -0
- bootstack/core/colorutils.py +234 -0
- bootstack/core/exceptions.py +95 -0
- bootstack/core/images.py +283 -0
- bootstack/core/localization/README.md +90 -0
- bootstack/core/localization/__init__.py +13 -0
- bootstack/core/localization/intl_format.py +580 -0
- bootstack/core/localization/msgcat.py +425 -0
- bootstack/core/localization/specs.py +143 -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/publisher.py +147 -0
- bootstack/core/signals/README.md +112 -0
- bootstack/core/signals/__init__.py +8 -0
- bootstack/core/signals/integration.py +100 -0
- bootstack/core/signals/signal.py +317 -0
- bootstack/core/signals/types.py +4 -0
- bootstack/core/validation/__init__.py +5 -0
- bootstack/core/validation/types.py +13 -0
- bootstack/core/validation/validation_result.py +17 -0
- bootstack/core/validation/validation_rules.py +112 -0
- bootstack/core/variables.py +62 -0
- bootstack/datasource/README.md +607 -0
- bootstack/datasource/__init__.py +51 -0
- bootstack/datasource/base.py +474 -0
- bootstack/datasource/file_source.py +541 -0
- bootstack/datasource/memory_source.py +482 -0
- bootstack/datasource/sqlite_source.py +453 -0
- bootstack/datasource/types.py +259 -0
- bootstack/dialogs/__init__.py +56 -0
- bootstack/dialogs/colorchooser.py +674 -0
- bootstack/dialogs/colordropper.py +257 -0
- bootstack/dialogs/datedialog.py +404 -0
- bootstack/dialogs/dialog.py +514 -0
- bootstack/dialogs/filterdialog.py +358 -0
- bootstack/dialogs/fontdialog.py +339 -0
- bootstack/dialogs/formdialog.py +541 -0
- bootstack/dialogs/message.py +489 -0
- bootstack/dialogs/query.py +561 -0
- bootstack/py.typed +1 -0
- bootstack/runtime/__init__.py +3 -0
- bootstack/runtime/app.py +879 -0
- bootstack/runtime/base_window.py +786 -0
- bootstack/runtime/events.py +399 -0
- bootstack/runtime/menu.py +510 -0
- bootstack/runtime/shortcuts.py +423 -0
- bootstack/runtime/tk_patch.py +31 -0
- bootstack/runtime/toplevel.py +131 -0
- bootstack/runtime/utility.py +371 -0
- bootstack/runtime/visual_focus.py +228 -0
- bootstack/runtime/window_utilities.py +1043 -0
- bootstack/style/__init__.py +5498 -0
- bootstack/style/bootstyle.py +507 -0
- bootstack/style/bootstyle_builder_base.py +752 -0
- bootstack/style/bootstyle_builder_mixed.py +93 -0
- bootstack/style/bootstyle_builder_tk.py +109 -0
- bootstack/style/bootstyle_builder_ttk.py +354 -0
- bootstack/style/builders/__init__.py +51 -0
- bootstack/style/builders/badge.py +44 -0
- bootstack/style/builders/button.py +453 -0
- bootstack/style/builders/buttongroup.py +344 -0
- bootstack/style/builders/calendar.py +271 -0
- bootstack/style/builders/checkbutton.py +95 -0
- bootstack/style/builders/combobox.py +112 -0
- bootstack/style/builders/contextmenu.py +268 -0
- bootstack/style/builders/entry.py +83 -0
- bootstack/style/builders/expander.py +171 -0
- bootstack/style/builders/field.py +312 -0
- bootstack/style/builders/frame.py +27 -0
- bootstack/style/builders/label.py +28 -0
- bootstack/style/builders/labelframe.py +41 -0
- bootstack/style/builders/listview.py +267 -0
- bootstack/style/builders/menubar.py +74 -0
- bootstack/style/builders/menubutton.py +408 -0
- bootstack/style/builders/notebook.py +316 -0
- bootstack/style/builders/panedwindow.py +25 -0
- bootstack/style/builders/progressbar.py +71 -0
- bootstack/style/builders/radiobutton.py +68 -0
- bootstack/style/builders/scale.py +66 -0
- bootstack/style/builders/scrollbar.py +360 -0
- bootstack/style/builders/separator.py +45 -0
- bootstack/style/builders/sidenav.py +313 -0
- bootstack/style/builders/sizegrip.py +15 -0
- bootstack/style/builders/spinbox.py +119 -0
- bootstack/style/builders/switch.py +67 -0
- bootstack/style/builders/tabitem.py +205 -0
- bootstack/style/builders/toolbutton.py +260 -0
- bootstack/style/builders/tooltip.py +26 -0
- bootstack/style/builders/treeview.py +269 -0
- bootstack/style/builders/utils.py +404 -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/style.py +499 -0
- bootstack/style/theme_provider.py +449 -0
- bootstack/style/tk_patch.py +5 -0
- bootstack/style/token_maps.py +42 -0
- bootstack/style/types.py +32 -0
- bootstack/style/typography.py +527 -0
- bootstack/style/utility.py +696 -0
- bootstack/themes/__init__.py +12 -0
- bootstack/themes/standard.py +415 -0
- bootstack/themes/user.py +45 -0
- bootstack/widgets/__init__.py +53 -0
- bootstack/widgets/composites/__init__.py +38 -0
- bootstack/widgets/composites/accordion.py +385 -0
- bootstack/widgets/composites/appshell.py +445 -0
- bootstack/widgets/composites/buttongroup.py +391 -0
- bootstack/widgets/composites/calendar.py +914 -0
- bootstack/widgets/composites/compositeframe.py +282 -0
- bootstack/widgets/composites/contextmenu.py +1754 -0
- bootstack/widgets/composites/dateentry.py +261 -0
- bootstack/widgets/composites/dropdownbutton.py +190 -0
- bootstack/widgets/composites/expander.py +508 -0
- bootstack/widgets/composites/field.py +448 -0
- bootstack/widgets/composites/floodgauge.py +434 -0
- bootstack/widgets/composites/form.py +983 -0
- bootstack/widgets/composites/labeledscale.py +209 -0
- bootstack/widgets/composites/list/__init__.py +15 -0
- bootstack/widgets/composites/list/listitem.py +733 -0
- bootstack/widgets/composites/list/listview.py +1507 -0
- bootstack/widgets/composites/menubar.py +303 -0
- bootstack/widgets/composites/meter.py +882 -0
- bootstack/widgets/composites/numericentry.py +183 -0
- bootstack/widgets/composites/pagestack.py +330 -0
- bootstack/widgets/composites/passwordentry.py +149 -0
- bootstack/widgets/composites/pathentry.py +223 -0
- bootstack/widgets/composites/radiogroup.py +466 -0
- bootstack/widgets/composites/scrolledtext.py +388 -0
- bootstack/widgets/composites/scrolledtext.pyi +186 -0
- bootstack/widgets/composites/scrollview.py +675 -0
- bootstack/widgets/composites/selectbox.py +544 -0
- bootstack/widgets/composites/sidenav/__init__.py +24 -0
- bootstack/widgets/composites/sidenav/group.py +485 -0
- bootstack/widgets/composites/sidenav/header.py +83 -0
- bootstack/widgets/composites/sidenav/item.py +413 -0
- bootstack/widgets/composites/sidenav/separator.py +51 -0
- bootstack/widgets/composites/sidenav/view.py +919 -0
- bootstack/widgets/composites/spinnerentry.py +232 -0
- bootstack/widgets/composites/tableview/__init__.py +5 -0
- bootstack/widgets/composites/tableview/tableview.py +2254 -0
- bootstack/widgets/composites/tableview/types.py +169 -0
- bootstack/widgets/composites/tabs/__init__.py +6 -0
- bootstack/widgets/composites/tabs/tabitem.py +372 -0
- bootstack/widgets/composites/tabs/tabs.py +478 -0
- bootstack/widgets/composites/tabs/tabview.py +352 -0
- bootstack/widgets/composites/textentry.py +90 -0
- bootstack/widgets/composites/timeentry.py +189 -0
- bootstack/widgets/composites/toast.py +364 -0
- bootstack/widgets/composites/togglegroup.py +382 -0
- bootstack/widgets/composites/toolbar.py +393 -0
- bootstack/widgets/composites/tooltip.py +404 -0
- bootstack/widgets/internal/__init__.py +0 -0
- bootstack/widgets/internal/wrapper_base.py +304 -0
- bootstack/widgets/mixins/__init__.py +25 -0
- bootstack/widgets/mixins/configure_mixin.py +186 -0
- bootstack/widgets/mixins/entry_mixin.py +70 -0
- bootstack/widgets/mixins/font_mixin.py +346 -0
- bootstack/widgets/mixins/icon_mixin.py +38 -0
- bootstack/widgets/mixins/localization_mixin.py +255 -0
- bootstack/widgets/mixins/signal_mixin.py +272 -0
- bootstack/widgets/mixins/validation_mixin.py +204 -0
- bootstack/widgets/parts/__init__.py +11 -0
- bootstack/widgets/parts/numberentry_part.py +345 -0
- bootstack/widgets/parts/spinnerentry_part.py +394 -0
- bootstack/widgets/parts/textentry_part.py +344 -0
- bootstack/widgets/primitives/__init__.py +55 -0
- bootstack/widgets/primitives/badge.py +44 -0
- bootstack/widgets/primitives/button.py +89 -0
- bootstack/widgets/primitives/card.py +66 -0
- bootstack/widgets/primitives/checkbutton.py +124 -0
- bootstack/widgets/primitives/checktoggle.py +53 -0
- bootstack/widgets/primitives/combobox.py +165 -0
- bootstack/widgets/primitives/entry.py +98 -0
- bootstack/widgets/primitives/frame.py +206 -0
- bootstack/widgets/primitives/gridframe.py +479 -0
- bootstack/widgets/primitives/label.py +95 -0
- bootstack/widgets/primitives/labelframe.py +63 -0
- bootstack/widgets/primitives/menubutton.py +118 -0
- bootstack/widgets/primitives/notebook.py +551 -0
- bootstack/widgets/primitives/optionmenu.py +248 -0
- bootstack/widgets/primitives/packframe.py +228 -0
- bootstack/widgets/primitives/panedwindow.py +58 -0
- bootstack/widgets/primitives/progressbar.py +95 -0
- bootstack/widgets/primitives/radiobutton.py +115 -0
- bootstack/widgets/primitives/radiotoggle.py +50 -0
- bootstack/widgets/primitives/scale.py +85 -0
- bootstack/widgets/primitives/scrollbar.py +56 -0
- bootstack/widgets/primitives/separator.py +56 -0
- bootstack/widgets/primitives/sizegrip.py +47 -0
- bootstack/widgets/primitives/spinbox.py +91 -0
- bootstack/widgets/primitives/switch.py +41 -0
- bootstack/widgets/primitives/treeview.py +77 -0
- bootstack/widgets/types.py +20 -0
- bootstack-0.1.0a1.dist-info/METADATA +196 -0
- bootstack-0.1.0a1.dist-info/RECORD +419 -0
- bootstack-0.1.0a1.dist-info/WHEEL +5 -0
- bootstack-0.1.0a1.dist-info/entry_points.txt +2 -0
- bootstack-0.1.0a1.dist-info/licenses/LICENSE +22 -0
- bootstack-0.1.0a1.dist-info/licenses/NOTICE +10 -0
- bootstack-0.1.0a1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"""MenuBar composite widget."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import Any, Callable, Dict, Literal, Optional, Tuple, TypedDict, Union
|
|
5
|
+
|
|
6
|
+
from typing_extensions import Unpack
|
|
7
|
+
|
|
8
|
+
from bootstack.widgets.composites.contextmenu import ContextMenuItem
|
|
9
|
+
from bootstack.widgets.composites.dropdownbutton import DropdownButton
|
|
10
|
+
from bootstack.widgets.primitives.button import Button
|
|
11
|
+
from bootstack.widgets.primitives.label import Label
|
|
12
|
+
from bootstack.widgets.primitives.gridframe import GridFrame
|
|
13
|
+
from bootstack.widgets.primitives.packframe import PackFrame
|
|
14
|
+
from bootstack.widgets.types import Master
|
|
15
|
+
|
|
16
|
+
Region = Literal["before", "center", "after"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class MenuBarButtonKwargs(TypedDict, total=False):
|
|
20
|
+
"""Keyword arguments for MenuBar.add_button()."""
|
|
21
|
+
command: Optional[Callable[[], Any]]
|
|
22
|
+
image: Any
|
|
23
|
+
icon: Any
|
|
24
|
+
icon_only: bool
|
|
25
|
+
compound: str
|
|
26
|
+
padding: Any
|
|
27
|
+
width: int
|
|
28
|
+
state: str
|
|
29
|
+
accent: str
|
|
30
|
+
variant: str
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class MenuBarMenuKwargs(TypedDict, total=False):
|
|
34
|
+
"""Keyword arguments for MenuBar.add_menu()."""
|
|
35
|
+
image: Any
|
|
36
|
+
icon: Any
|
|
37
|
+
icon_only: bool
|
|
38
|
+
compound: str
|
|
39
|
+
padding: Any
|
|
40
|
+
width: int
|
|
41
|
+
state: str
|
|
42
|
+
accent: str
|
|
43
|
+
variant: str
|
|
44
|
+
popdown_options: dict[str, Any]
|
|
45
|
+
show_dropdown_button: bool
|
|
46
|
+
dropdown_button_icon: str | dict
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class MenuBar(GridFrame):
|
|
50
|
+
"""A horizontal menu bar with three regions: before (left), center, and after (right).
|
|
51
|
+
|
|
52
|
+
MenuBar provides a 5-column grid layout where the center region stays visually
|
|
53
|
+
centered. All three regions support adding buttons, labels, and menus.
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
```python
|
|
57
|
+
menubar = MenuBar(app, gap=6)
|
|
58
|
+
|
|
59
|
+
# Add menus to the left (before) region
|
|
60
|
+
menubar.add_menu("File", items=[
|
|
61
|
+
{"type": "command", "text": "Open", "command": open_file},
|
|
62
|
+
{"type": "command", "text": "Save", "command": save_file},
|
|
63
|
+
{"type": "separator"},
|
|
64
|
+
{"type": "command", "text": "Exit", "command": app.destroy},
|
|
65
|
+
])
|
|
66
|
+
|
|
67
|
+
# Add label to center region
|
|
68
|
+
menubar.add_label("My App", region="center")
|
|
69
|
+
|
|
70
|
+
# Add buttons to the right (after) region
|
|
71
|
+
menubar.add_button("Help", region="after", command=show_help)
|
|
72
|
+
menubar.add_menu("Account", region="after", items=[...])
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
master: Parent widget. If None, uses the default root window.
|
|
77
|
+
gap: Default gap between items in all region PackFrames. Defaults to 0.
|
|
78
|
+
region_gap: Override gap per region. Can be a dict with keys 'before',
|
|
79
|
+
'center', 'after', or a tuple of 3 ints (before, center, after).
|
|
80
|
+
chevron: Show dropdown chevron on menu buttons. Defaults to False.
|
|
81
|
+
popdown_options: Default popdown options for all menus.
|
|
82
|
+
**kwargs: Additional GridFrame options (accent, variant, etc.).
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
# Column indices for the 5-column layout
|
|
86
|
+
_COL_BEFORE = 0
|
|
87
|
+
_COL_SPACER_LEFT = 1
|
|
88
|
+
_COL_CENTER = 2
|
|
89
|
+
_COL_SPACER_RIGHT = 3
|
|
90
|
+
_COL_AFTER = 4
|
|
91
|
+
|
|
92
|
+
def __init__(
|
|
93
|
+
self,
|
|
94
|
+
master: Master = None,
|
|
95
|
+
*,
|
|
96
|
+
gap: int = 0,
|
|
97
|
+
region_gap: Optional[Union[Dict[str, int], Tuple[int, int, int]]] = None,
|
|
98
|
+
chevron: bool = None,
|
|
99
|
+
popdown_options: Optional[dict[str, Any]] = None,
|
|
100
|
+
**kwargs: Any,
|
|
101
|
+
) -> None:
|
|
102
|
+
# Initialize GridFrame with 5-column centered layout
|
|
103
|
+
# columns=[0, 1, 0, 1, 0] means:
|
|
104
|
+
# col 0 (before): weight=0 (shrink to content)
|
|
105
|
+
# col 1 (spacer_left): weight=1 (expand)
|
|
106
|
+
# col 2 (center): weight=0 (shrink to content)
|
|
107
|
+
# col 3 (spacer_right): weight=1 (expand)
|
|
108
|
+
# col 4 (after): weight=0 (shrink to content)
|
|
109
|
+
|
|
110
|
+
self._chevron = chevron if chevron else False
|
|
111
|
+
|
|
112
|
+
# Remove options controlled by MenuBar
|
|
113
|
+
for key in ("rows", "columns", "gap", "auto_flow", "sticky_items", "padding"):
|
|
114
|
+
kwargs.pop(key, None)
|
|
115
|
+
|
|
116
|
+
kwargs.setdefault('surface', 'chrome') # suggested 'titlebar' if used as the titlebar.
|
|
117
|
+
|
|
118
|
+
super().__init__(
|
|
119
|
+
master,
|
|
120
|
+
rows=[1],
|
|
121
|
+
columns=[0, 1, 0, 1, 0],
|
|
122
|
+
auto_flow="none",
|
|
123
|
+
sticky_items="ns",
|
|
124
|
+
padding=(4, 0),
|
|
125
|
+
**kwargs,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# Parse region gaps
|
|
129
|
+
gap_before, gap_center, gap_after = self._parse_region_gap(gap, region_gap)
|
|
130
|
+
|
|
131
|
+
# Create PackFrames directly in the grid (no intermediate cell frames needed)
|
|
132
|
+
# Column weights [0, 1, 0, 1, 0] handle spacing - cols 1 and 3 expand to center col 2
|
|
133
|
+
|
|
134
|
+
# Before: horizontal (left to right), children fill vertically
|
|
135
|
+
self._before = PackFrame(self, direction="horizontal", gap=gap_before, fill_items="y")
|
|
136
|
+
self._before.grid(row=0, column=self._COL_BEFORE, sticky="nsw")
|
|
137
|
+
|
|
138
|
+
# Center: horizontal (for centered content), children fill vertically
|
|
139
|
+
self._center = PackFrame(self, direction="horizontal", gap=gap_center, fill_items="y")
|
|
140
|
+
self._center.grid(row=0, column=self._COL_CENTER, sticky="ns")
|
|
141
|
+
|
|
142
|
+
# After: row-reverse (items align to right), children fill vertically
|
|
143
|
+
self._after = PackFrame(self, direction="row-reverse", gap=gap_after, fill_items="y")
|
|
144
|
+
self._after.grid(row=0, column=self._COL_AFTER, sticky="nse")
|
|
145
|
+
|
|
146
|
+
# Default popdown options for all menus. Offset matches the focus-ring
|
|
147
|
+
# affordance baked into the menu trigger image so popdowns align with
|
|
148
|
+
# the visible button border.
|
|
149
|
+
from bootstack.style.bootstyle_builder_base import BootstyleBuilderBase
|
|
150
|
+
self._popdown_options = {"offset": (BootstyleBuilderBase.scale_from_source(10), 0), "density": "compact"}
|
|
151
|
+
if popdown_options:
|
|
152
|
+
self._popdown_options.update(popdown_options)
|
|
153
|
+
|
|
154
|
+
@staticmethod
|
|
155
|
+
def _parse_region_gap(
|
|
156
|
+
gap: int,
|
|
157
|
+
region_gap: Optional[Union[Dict[str, int], Tuple[int, int, int]]],
|
|
158
|
+
) -> Tuple[int, int, int]:
|
|
159
|
+
"""Parse region_gap into (before, center, after) tuple."""
|
|
160
|
+
if region_gap is None:
|
|
161
|
+
return gap, gap, gap
|
|
162
|
+
|
|
163
|
+
if isinstance(region_gap, tuple) and len(region_gap) == 3:
|
|
164
|
+
return region_gap
|
|
165
|
+
|
|
166
|
+
if isinstance(region_gap, dict):
|
|
167
|
+
return (
|
|
168
|
+
region_gap.get("before", gap),
|
|
169
|
+
region_gap.get("center", gap),
|
|
170
|
+
region_gap.get("after", gap),
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
return gap, gap, gap
|
|
174
|
+
|
|
175
|
+
@property
|
|
176
|
+
def before(self) -> PackFrame:
|
|
177
|
+
"""The PackFrame used for the 'before' (left) region.
|
|
178
|
+
|
|
179
|
+
Advanced users can access this to customize layout behavior.
|
|
180
|
+
"""
|
|
181
|
+
return self._before
|
|
182
|
+
|
|
183
|
+
@property
|
|
184
|
+
def after(self) -> PackFrame:
|
|
185
|
+
"""The PackFrame used for the 'after' (right) region.
|
|
186
|
+
|
|
187
|
+
Advanced users can access this to customize layout behavior.
|
|
188
|
+
"""
|
|
189
|
+
return self._after
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def center(self) -> PackFrame:
|
|
193
|
+
"""The PackFrame used for the 'center' region."""
|
|
194
|
+
return self._center
|
|
195
|
+
|
|
196
|
+
def _get_region_frame(self, region: Region) -> PackFrame:
|
|
197
|
+
"""Get the PackFrame for the specified region."""
|
|
198
|
+
if region == "before":
|
|
199
|
+
return self._before
|
|
200
|
+
elif region == "center":
|
|
201
|
+
return self._center
|
|
202
|
+
else:
|
|
203
|
+
return self._after
|
|
204
|
+
|
|
205
|
+
def add_button(
|
|
206
|
+
self,
|
|
207
|
+
text: str,
|
|
208
|
+
*,
|
|
209
|
+
region: Region = "before",
|
|
210
|
+
**kwargs: Unpack[MenuBarButtonKwargs],
|
|
211
|
+
) -> Button:
|
|
212
|
+
"""Add a regular button to the specified region.
|
|
213
|
+
|
|
214
|
+
Args:
|
|
215
|
+
text: Label text for the button.
|
|
216
|
+
region: Which region to add to ('before', 'center', 'after').
|
|
217
|
+
Defaults to 'before'.
|
|
218
|
+
**kwargs: Additional Button options (command, icon, accent, etc.).
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
The created Button widget.
|
|
222
|
+
"""
|
|
223
|
+
frame = self._get_region_frame(region)
|
|
224
|
+
kwargs.pop("variant", None)
|
|
225
|
+
if 'icon' in kwargs and 'text':
|
|
226
|
+
kwargs['compound'] = 'left' if 'compound' not in kwargs else kwargs['compound']
|
|
227
|
+
else:
|
|
228
|
+
kwargs['compound'] = 'center'
|
|
229
|
+
button = Button(frame, text=text, variant="menubar-item", **kwargs)
|
|
230
|
+
button.pack()
|
|
231
|
+
return button
|
|
232
|
+
|
|
233
|
+
def add_label(
|
|
234
|
+
self,
|
|
235
|
+
text: str,
|
|
236
|
+
*,
|
|
237
|
+
region: Region = "before",
|
|
238
|
+
**kwargs: Any,
|
|
239
|
+
) -> Label:
|
|
240
|
+
"""Add a text label to the specified region.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
text: The text to display.
|
|
244
|
+
region: Which region to add to ('before', 'center', 'after').
|
|
245
|
+
Defaults to 'before'.
|
|
246
|
+
**kwargs: Additional Label options (accent, padding, etc.).
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
The created Label widget.
|
|
250
|
+
"""
|
|
251
|
+
frame = self._get_region_frame(region)
|
|
252
|
+
kwargs.setdefault("font", "caption")
|
|
253
|
+
label = Label(frame, text=text, **kwargs)
|
|
254
|
+
label.pack()
|
|
255
|
+
return label
|
|
256
|
+
|
|
257
|
+
def add_menu(
|
|
258
|
+
self,
|
|
259
|
+
text: str,
|
|
260
|
+
items: Optional[list[ContextMenuItem]] = None,
|
|
261
|
+
*,
|
|
262
|
+
region: Region = "before",
|
|
263
|
+
popdown_options: Optional[dict[str, Any]] = None,
|
|
264
|
+
**kwargs: Unpack[MenuBarMenuKwargs],
|
|
265
|
+
) -> DropdownButton:
|
|
266
|
+
"""Add a dropdown menu button to the specified region.
|
|
267
|
+
|
|
268
|
+
Args:
|
|
269
|
+
text: Label text for the menu button.
|
|
270
|
+
items: List of ContextMenuItem entries for the dropdown menu.
|
|
271
|
+
region: Which region to add to ('before', 'center', 'after').
|
|
272
|
+
Defaults to 'before'.
|
|
273
|
+
popdown_options: Options forwarded to ContextMenu (anchor, attach, offset).
|
|
274
|
+
**kwargs: Additional DropdownButton options (icon, accent, etc.).
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
The created DropdownButton widget.
|
|
278
|
+
"""
|
|
279
|
+
frame = self._get_region_frame(region)
|
|
280
|
+
|
|
281
|
+
# Remove options that are controlled by MenuBar
|
|
282
|
+
kwargs.pop("popdown_options", None)
|
|
283
|
+
kwargs.pop("variant", None)
|
|
284
|
+
if 'icon' in kwargs and 'text':
|
|
285
|
+
kwargs['compound'] = 'left' if 'compound' not in kwargs else kwargs['compound']
|
|
286
|
+
else:
|
|
287
|
+
kwargs['compound'] = 'center'
|
|
288
|
+
# Merge menubar defaults with per-menu options
|
|
289
|
+
merged_popdown = dict(self._popdown_options)
|
|
290
|
+
if popdown_options:
|
|
291
|
+
merged_popdown.update(popdown_options)
|
|
292
|
+
|
|
293
|
+
dropdown = DropdownButton(
|
|
294
|
+
frame,
|
|
295
|
+
text=text,
|
|
296
|
+
items=items,
|
|
297
|
+
variant="menubar-item",
|
|
298
|
+
show_dropdown_button=self._chevron,
|
|
299
|
+
popdown_options=merged_popdown,
|
|
300
|
+
**kwargs,
|
|
301
|
+
)
|
|
302
|
+
dropdown.pack()
|
|
303
|
+
return dropdown
|