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,393 @@
|
|
|
1
|
+
"""Toolbar widget with customizable content and optional window controls."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from tkinter import Widget
|
|
6
|
+
from typing import Any, Callable, Literal
|
|
7
|
+
|
|
8
|
+
from typing_extensions import TypedDict, Unpack
|
|
9
|
+
|
|
10
|
+
from bootstack.widgets.primitives.frame import Frame
|
|
11
|
+
from bootstack.widgets.primitives.button import Button
|
|
12
|
+
from bootstack.widgets.primitives.label import Label
|
|
13
|
+
from bootstack.widgets.primitives.separator import Separator
|
|
14
|
+
from bootstack.widgets.mixins import configure_delegate
|
|
15
|
+
from bootstack.widgets.types import Master
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ToolbarKwargs(TypedDict, total=False):
|
|
19
|
+
show_window_controls: bool
|
|
20
|
+
draggable: bool
|
|
21
|
+
button_variant: str
|
|
22
|
+
density: Literal['default', 'compact']
|
|
23
|
+
padding: Any
|
|
24
|
+
# Frame options
|
|
25
|
+
width: int
|
|
26
|
+
height: int
|
|
27
|
+
surface: str
|
|
28
|
+
show_border: bool
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Toolbar(Frame):
|
|
32
|
+
"""A horizontal toolbar with customizable content and optional window controls.
|
|
33
|
+
|
|
34
|
+
Toolbar provides a container for icon buttons, labels, and other widgets
|
|
35
|
+
arranged horizontally. It optionally supports window control buttons
|
|
36
|
+
(minimize, maximize, close) and window dragging for custom titlebars.
|
|
37
|
+
|
|
38
|
+
Items are added from left to right. Use `add_spacer()` to push
|
|
39
|
+
subsequent items to the right side.
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
```python
|
|
43
|
+
# Basic toolbar with buttons
|
|
44
|
+
toolbar = Toolbar(root)
|
|
45
|
+
toolbar.add_button(icon='list', command=toggle_menu)
|
|
46
|
+
toolbar.add_separator()
|
|
47
|
+
toolbar.add_label(text='My App')
|
|
48
|
+
toolbar.add_spacer()
|
|
49
|
+
toolbar.add_button(icon='gear', command=settings)
|
|
50
|
+
|
|
51
|
+
# Custom titlebar with window controls
|
|
52
|
+
toolbar = Toolbar(
|
|
53
|
+
root,
|
|
54
|
+
show_window_controls=True,
|
|
55
|
+
draggable=True,
|
|
56
|
+
)
|
|
57
|
+
toolbar.add_label(text='My App', font='heading-md')
|
|
58
|
+
```
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
def __init__(
|
|
62
|
+
self,
|
|
63
|
+
master: Master = None,
|
|
64
|
+
show_window_controls: bool = False,
|
|
65
|
+
draggable: bool = False,
|
|
66
|
+
button_variant: str = 'ghost',
|
|
67
|
+
density: Literal['default', 'compact'] = 'default',
|
|
68
|
+
padding: int | tuple = None,
|
|
69
|
+
**kwargs: Unpack[ToolbarKwargs]
|
|
70
|
+
):
|
|
71
|
+
"""Initialize a Toolbar.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
master (Master | None): Parent widget.
|
|
75
|
+
show_window_controls (bool): Show minimize/maximize/close buttons.
|
|
76
|
+
Default False.
|
|
77
|
+
draggable (bool): Enable window dragging by clicking and dragging
|
|
78
|
+
the toolbar. Default False.
|
|
79
|
+
button_variant (str): Default variant for toolbar buttons.
|
|
80
|
+
Default 'ghost'.
|
|
81
|
+
density (str): Button density for toolbar items. 'compact' for
|
|
82
|
+
smaller buttons, 'default' for standard size. Default 'default'.
|
|
83
|
+
padding (int | tuple): Toolbar padding. If None, uses density-based
|
|
84
|
+
default ((3, 1) for compact, 3 for default).
|
|
85
|
+
**kwargs: Additional arguments passed to Frame.
|
|
86
|
+
"""
|
|
87
|
+
if padding is None:
|
|
88
|
+
padding = (3, 1) if density == 'compact' else 3
|
|
89
|
+
super().__init__(master, padding=padding, **kwargs)
|
|
90
|
+
|
|
91
|
+
self._show_window_controls = show_window_controls
|
|
92
|
+
self._draggable = draggable or show_window_controls # Auto-enable drag with window controls
|
|
93
|
+
self._button_variant = button_variant
|
|
94
|
+
self._density = density
|
|
95
|
+
|
|
96
|
+
# Content container (left side)
|
|
97
|
+
self._content_frame = Frame(self)
|
|
98
|
+
self._content_frame.pack(side='left', fill='both', expand=True)
|
|
99
|
+
|
|
100
|
+
# Window controls container (right side)
|
|
101
|
+
self._controls_frame: Frame | None = None
|
|
102
|
+
if show_window_controls:
|
|
103
|
+
self._build_window_controls()
|
|
104
|
+
|
|
105
|
+
# Drag state
|
|
106
|
+
self._drag_start_x = 0
|
|
107
|
+
self._drag_start_y = 0
|
|
108
|
+
|
|
109
|
+
if self._draggable:
|
|
110
|
+
self._setup_drag()
|
|
111
|
+
|
|
112
|
+
def _build_window_controls(self):
|
|
113
|
+
"""Build window control buttons (minimize, maximize, close)."""
|
|
114
|
+
self._controls_frame = Frame(self)
|
|
115
|
+
self._controls_frame.pack(side='right', fill='y')
|
|
116
|
+
|
|
117
|
+
# Minimize button
|
|
118
|
+
self._minimize_btn = Button(
|
|
119
|
+
self._controls_frame,
|
|
120
|
+
icon='dash-lg',
|
|
121
|
+
icon_only=True,
|
|
122
|
+
variant='ghost',
|
|
123
|
+
density='compact',
|
|
124
|
+
surface=self._surface,
|
|
125
|
+
command=self._on_minimize,
|
|
126
|
+
)
|
|
127
|
+
self._minimize_btn.pack(side='left', padx=2)
|
|
128
|
+
|
|
129
|
+
# Maximize/Restore button
|
|
130
|
+
self._maximize_btn = Button(
|
|
131
|
+
self._controls_frame,
|
|
132
|
+
icon='app',
|
|
133
|
+
icon_only=True,
|
|
134
|
+
variant='ghost',
|
|
135
|
+
density='compact',
|
|
136
|
+
surface=self._surface,
|
|
137
|
+
command=self._on_maximize,
|
|
138
|
+
)
|
|
139
|
+
self._maximize_btn.pack(side='left', padx=2)
|
|
140
|
+
|
|
141
|
+
# Close button
|
|
142
|
+
self._close_btn = Button(
|
|
143
|
+
self._controls_frame,
|
|
144
|
+
icon='x-lg',
|
|
145
|
+
icon_only=True,
|
|
146
|
+
variant='ghost',
|
|
147
|
+
density='compact',
|
|
148
|
+
surface=self._surface,
|
|
149
|
+
command=self._on_close,
|
|
150
|
+
)
|
|
151
|
+
self._close_btn.pack(side='left', padx=2)
|
|
152
|
+
|
|
153
|
+
def _on_minimize(self):
|
|
154
|
+
"""Handle minimize button click."""
|
|
155
|
+
window = self.winfo_toplevel()
|
|
156
|
+
window.iconify()
|
|
157
|
+
|
|
158
|
+
def _on_maximize(self):
|
|
159
|
+
"""Handle maximize/restore button click."""
|
|
160
|
+
window = self.winfo_toplevel()
|
|
161
|
+
# Check current state and toggle
|
|
162
|
+
if window.state() == 'zoomed':
|
|
163
|
+
window.state('normal')
|
|
164
|
+
self._maximize_btn.configure(icon='app')
|
|
165
|
+
else:
|
|
166
|
+
window.state('zoomed')
|
|
167
|
+
self._maximize_btn.configure(icon='copy')
|
|
168
|
+
|
|
169
|
+
def _on_close(self):
|
|
170
|
+
"""Handle close button click."""
|
|
171
|
+
window = self.winfo_toplevel()
|
|
172
|
+
window.destroy()
|
|
173
|
+
|
|
174
|
+
def _setup_drag(self):
|
|
175
|
+
"""Set up window dragging bindings."""
|
|
176
|
+
self.bind('<Button-1>', self._on_drag_start, add='+')
|
|
177
|
+
self.bind('<B1-Motion>', self._on_drag_motion, add='+')
|
|
178
|
+
self._content_frame.bind('<Button-1>', self._on_drag_start, add='+')
|
|
179
|
+
self._content_frame.bind('<B1-Motion>', self._on_drag_motion, add='+')
|
|
180
|
+
|
|
181
|
+
def _on_drag_start(self, event):
|
|
182
|
+
"""Record drag start position."""
|
|
183
|
+
self._drag_start_x = event.x_root
|
|
184
|
+
self._drag_start_y = event.y_root
|
|
185
|
+
|
|
186
|
+
def _on_drag_motion(self, event):
|
|
187
|
+
"""Handle drag motion to move window."""
|
|
188
|
+
window = self.winfo_toplevel()
|
|
189
|
+
|
|
190
|
+
# Calculate delta
|
|
191
|
+
dx = event.x_root - self._drag_start_x
|
|
192
|
+
dy = event.y_root - self._drag_start_y
|
|
193
|
+
|
|
194
|
+
# Get current position
|
|
195
|
+
x = window.winfo_x() + dx
|
|
196
|
+
y = window.winfo_y() + dy
|
|
197
|
+
|
|
198
|
+
# Move window
|
|
199
|
+
window.geometry(f'+{x}+{y}')
|
|
200
|
+
|
|
201
|
+
# Update drag start for next motion
|
|
202
|
+
self._drag_start_x = event.x_root
|
|
203
|
+
self._drag_start_y = event.y_root
|
|
204
|
+
|
|
205
|
+
# --- Public API: Adding Items ---
|
|
206
|
+
|
|
207
|
+
def add_button(
|
|
208
|
+
self,
|
|
209
|
+
icon: str | dict = None,
|
|
210
|
+
text: str = None,
|
|
211
|
+
command: Callable = None,
|
|
212
|
+
accent: str = None,
|
|
213
|
+
variant: str = None,
|
|
214
|
+
**kwargs
|
|
215
|
+
) -> Button:
|
|
216
|
+
"""Add a button to the toolbar.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
icon (str | dict | None): Icon name or configuration.
|
|
220
|
+
text (str | None): Button text. If None and icon provided,
|
|
221
|
+
creates icon-only button.
|
|
222
|
+
command (Callable | None): Button click callback.
|
|
223
|
+
accent (str | None): Button accent token.
|
|
224
|
+
variant (str | None): Button variant. Uses toolbar default if None.
|
|
225
|
+
**kwargs: Additional arguments passed to Button.
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
Button: The created button.
|
|
229
|
+
"""
|
|
230
|
+
btn = Button(
|
|
231
|
+
self._content_frame,
|
|
232
|
+
icon=icon,
|
|
233
|
+
text=text,
|
|
234
|
+
icon_only=(icon is not None and text is None),
|
|
235
|
+
command=command,
|
|
236
|
+
accent=accent,
|
|
237
|
+
variant=variant or self._button_variant,
|
|
238
|
+
density=kwargs.pop('density', self._density),
|
|
239
|
+
surface=kwargs.pop('surface', self._surface),
|
|
240
|
+
**kwargs
|
|
241
|
+
)
|
|
242
|
+
btn.pack(side='left')
|
|
243
|
+
return btn
|
|
244
|
+
|
|
245
|
+
def add_label(
|
|
246
|
+
self,
|
|
247
|
+
text: str = '',
|
|
248
|
+
icon: str | dict = None,
|
|
249
|
+
font: str = None,
|
|
250
|
+
**kwargs
|
|
251
|
+
) -> Label:
|
|
252
|
+
"""Add a label to the toolbar.
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
text (str): Label text.
|
|
256
|
+
icon (str | dict | None): Optional icon.
|
|
257
|
+
font (str | None): Font specification.
|
|
258
|
+
**kwargs: Additional arguments passed to Label.
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
Label: The created label.
|
|
262
|
+
"""
|
|
263
|
+
lbl = Label(
|
|
264
|
+
self._content_frame,
|
|
265
|
+
text=text,
|
|
266
|
+
icon=icon,
|
|
267
|
+
font=font,
|
|
268
|
+
surface=kwargs.pop('surface', self._surface),
|
|
269
|
+
**kwargs
|
|
270
|
+
)
|
|
271
|
+
lbl.pack(side='left', padx=4)
|
|
272
|
+
|
|
273
|
+
# Make label draggable too if toolbar is draggable
|
|
274
|
+
if self._draggable:
|
|
275
|
+
lbl.bind('<Button-1>', self._on_drag_start, add='+')
|
|
276
|
+
lbl.bind('<B1-Motion>', self._on_drag_motion, add='+')
|
|
277
|
+
|
|
278
|
+
return lbl
|
|
279
|
+
|
|
280
|
+
def add_separator(self, length: int = 16, **kwargs) -> Separator:
|
|
281
|
+
"""Add a vertical separator to the toolbar.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
length (int | None): Fixed length in pixels. If None, stretches
|
|
285
|
+
to fill the toolbar height.
|
|
286
|
+
**kwargs: Additional arguments passed to Separator.
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
Separator: The created separator.
|
|
290
|
+
"""
|
|
291
|
+
sep = Separator(
|
|
292
|
+
self._content_frame,
|
|
293
|
+
orient='vertical',
|
|
294
|
+
length=length,
|
|
295
|
+
**kwargs
|
|
296
|
+
)
|
|
297
|
+
# Only fill='y' if no fixed length specified
|
|
298
|
+
if length:
|
|
299
|
+
sep.pack(side='left', padx=4)
|
|
300
|
+
else:
|
|
301
|
+
sep.pack(side='left', fill='y', padx=4)
|
|
302
|
+
return sep
|
|
303
|
+
|
|
304
|
+
def add_spacer(self) -> Frame:
|
|
305
|
+
"""Add a flexible spacer that pushes subsequent items to the right.
|
|
306
|
+
|
|
307
|
+
Returns:
|
|
308
|
+
Frame: The spacer frame.
|
|
309
|
+
"""
|
|
310
|
+
spacer = Frame(self._content_frame)
|
|
311
|
+
spacer.pack(side='left', fill='both', expand=True)
|
|
312
|
+
|
|
313
|
+
# Make spacer draggable too
|
|
314
|
+
if self._draggable:
|
|
315
|
+
spacer.bind('<Button-1>', self._on_drag_start, add='+')
|
|
316
|
+
spacer.bind('<B1-Motion>', self._on_drag_motion, add='+')
|
|
317
|
+
|
|
318
|
+
return spacer
|
|
319
|
+
|
|
320
|
+
def add_widget(self, widget: Widget, **pack_kwargs) -> Widget:
|
|
321
|
+
"""Add a custom widget to the toolbar.
|
|
322
|
+
|
|
323
|
+
The widget must already be created with the toolbar's content frame
|
|
324
|
+
as its parent. Use `toolbar.content` to get the parent frame.
|
|
325
|
+
|
|
326
|
+
Args:
|
|
327
|
+
widget (Widget): The widget to add.
|
|
328
|
+
**pack_kwargs: Arguments passed to pack(). Defaults to side='left'.
|
|
329
|
+
|
|
330
|
+
Returns:
|
|
331
|
+
Widget: The added widget.
|
|
332
|
+
"""
|
|
333
|
+
pack_kwargs.setdefault('side', 'left')
|
|
334
|
+
pack_kwargs.setdefault('padx', 2)
|
|
335
|
+
widget.pack(**pack_kwargs)
|
|
336
|
+
return widget
|
|
337
|
+
|
|
338
|
+
# --- Properties ---
|
|
339
|
+
|
|
340
|
+
@property
|
|
341
|
+
def content(self) -> Frame:
|
|
342
|
+
"""Get the content frame for adding custom widgets."""
|
|
343
|
+
return self._content_frame
|
|
344
|
+
|
|
345
|
+
@property
|
|
346
|
+
def show_window_controls(self) -> bool:
|
|
347
|
+
"""Check if window controls are shown."""
|
|
348
|
+
return self._show_window_controls
|
|
349
|
+
|
|
350
|
+
@property
|
|
351
|
+
def draggable(self) -> bool:
|
|
352
|
+
"""Check if toolbar is draggable."""
|
|
353
|
+
return self._draggable
|
|
354
|
+
|
|
355
|
+
@property
|
|
356
|
+
def density(self) -> str:
|
|
357
|
+
"""Get the toolbar's button density."""
|
|
358
|
+
return self._density
|
|
359
|
+
|
|
360
|
+
# --- Window Control Access ---
|
|
361
|
+
|
|
362
|
+
@property
|
|
363
|
+
def minimize_button(self) -> Button | None:
|
|
364
|
+
"""Get the minimize button (if window controls are shown)."""
|
|
365
|
+
return getattr(self, '_minimize_btn', None)
|
|
366
|
+
|
|
367
|
+
@property
|
|
368
|
+
def maximize_button(self) -> Button | None:
|
|
369
|
+
"""Get the maximize button (if window controls are shown)."""
|
|
370
|
+
return getattr(self, '_maximize_btn', None)
|
|
371
|
+
|
|
372
|
+
@property
|
|
373
|
+
def close_button(self) -> Button | None:
|
|
374
|
+
"""Get the close button (if window controls are shown)."""
|
|
375
|
+
return getattr(self, '_close_btn', None)
|
|
376
|
+
|
|
377
|
+
# --- Configuration Delegates ---
|
|
378
|
+
|
|
379
|
+
@configure_delegate('density')
|
|
380
|
+
def _delegate_density(self, value: str = None):
|
|
381
|
+
"""Configure the toolbar's default button density."""
|
|
382
|
+
if value is None:
|
|
383
|
+
return self._density
|
|
384
|
+
self._density = value
|
|
385
|
+
return None
|
|
386
|
+
|
|
387
|
+
@configure_delegate('button_variant')
|
|
388
|
+
def _delegate_button_variant(self, value: str = None):
|
|
389
|
+
"""Configure the toolbar's default button variant."""
|
|
390
|
+
if value is None:
|
|
391
|
+
return self._button_variant
|
|
392
|
+
self._button_variant = value
|
|
393
|
+
return None
|