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,83 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from tkinter import ttk
|
|
4
|
+
from typing import Any, Literal, TYPE_CHECKING
|
|
5
|
+
from typing_extensions import Unpack
|
|
6
|
+
|
|
7
|
+
from bootstack._core.mixins.ttk_state import TtkStateMixin
|
|
8
|
+
from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
|
|
9
|
+
from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
|
|
10
|
+
from bootstack.widgets._impl.mixins.configure_mixin import configure_delegate
|
|
11
|
+
from bootstack.widgets.types import Master, StyledKwargs, Orient
|
|
12
|
+
from ..mixins import SignalMixin
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from bootstack.signals import Signal
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ProgressbarKwargs(StyledKwargs, total=False):
|
|
19
|
+
# Standard ttk.Progressbar options
|
|
20
|
+
mode: Literal['determinate', 'indeterminate'] | str
|
|
21
|
+
orient: Orient
|
|
22
|
+
length: Any
|
|
23
|
+
maximum: float
|
|
24
|
+
value: float
|
|
25
|
+
variable: Any
|
|
26
|
+
signal: Signal[Any]
|
|
27
|
+
phase: int
|
|
28
|
+
|
|
29
|
+
# bootstack-specific extensions
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Progressbar(SignalMixin, TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Progressbar):
|
|
33
|
+
"""bootstack wrapper for `ttk.Progressbar` with themed styling support."""
|
|
34
|
+
|
|
35
|
+
_ttk_base = ttk.Progressbar
|
|
36
|
+
|
|
37
|
+
def __init__(self, master: Master = None, **kwargs: Unpack[ProgressbarKwargs]) -> None:
|
|
38
|
+
"""Create a themed bootstack Progressbar.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
master: Parent widget. If None, uses the default root window.
|
|
42
|
+
|
|
43
|
+
Other Parameters:
|
|
44
|
+
mode: Progress mode ('determinate' or 'indeterminate').
|
|
45
|
+
orient: Orientation of the bar ('horizontal' or 'vertical').
|
|
46
|
+
length: Requested length of the progress bar in pixels.
|
|
47
|
+
maximum: Maximum value.
|
|
48
|
+
value: Current value.
|
|
49
|
+
variable: Tk variable linked to the value.
|
|
50
|
+
See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
|
|
51
|
+
signal: Reactive Signal linked to the value (auto-synced with variable).
|
|
52
|
+
phase: Animation phase for indeterminate mode.
|
|
53
|
+
style: Explicit ttk style name (overrides accent/variant).
|
|
54
|
+
accent: Accent token for styling, e.g. 'primary', 'success', 'danger'.
|
|
55
|
+
variant: Style variant, e.g. 'default', 'thin'.
|
|
56
|
+
surface: Optional surface token; otherwise inherited.
|
|
57
|
+
style_options: Optional dict forwarded to the style builder.
|
|
58
|
+
"""
|
|
59
|
+
super().__init__(master, **kwargs)
|
|
60
|
+
|
|
61
|
+
def get(self) -> float:
|
|
62
|
+
"""Return the current progress value."""
|
|
63
|
+
return float(ttk.Progressbar.cget(self, 'value'))
|
|
64
|
+
|
|
65
|
+
def set(self, value: float) -> None:
|
|
66
|
+
"""Set the progress value."""
|
|
67
|
+
ttk.Progressbar.configure(self, value=value)
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def value(self) -> float:
|
|
71
|
+
"""Get or set the progress value."""
|
|
72
|
+
return self.get()
|
|
73
|
+
|
|
74
|
+
@value.setter
|
|
75
|
+
def value(self, value: float) -> None:
|
|
76
|
+
self.set(value)
|
|
77
|
+
|
|
78
|
+
@configure_delegate('value')
|
|
79
|
+
def _delegate_value(self, value=None):
|
|
80
|
+
"""Get or set the value via configure."""
|
|
81
|
+
if value is None:
|
|
82
|
+
return self.get()
|
|
83
|
+
self.set(value)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from tkinter import ttk
|
|
4
|
+
from typing import Any, Callable, Literal, TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from typing_extensions import Unpack
|
|
7
|
+
|
|
8
|
+
from bootstack._core.mixins.ttk_state import TtkStateMixin
|
|
9
|
+
from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
|
|
10
|
+
from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
|
|
11
|
+
from bootstack.widgets._impl.mixins import IconMixin, LocalizationMixin, SignalMixin, TextSignalMixin
|
|
12
|
+
from bootstack.widgets._impl.mixins.configure_mixin import configure_delegate
|
|
13
|
+
from bootstack.widgets.types import Master, StyledKwargs, Anchor, CompoundMode, WidgetState
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from bootstack.signals import Signal
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RadioButtonKwargs(StyledKwargs, total=False):
|
|
20
|
+
# Standard ttk.Radiobutton options
|
|
21
|
+
text: Any
|
|
22
|
+
command: Callable[[], Any] | None
|
|
23
|
+
image: Any
|
|
24
|
+
icon: Any
|
|
25
|
+
on_icon: Any
|
|
26
|
+
off_icon: Any
|
|
27
|
+
icon_only: bool
|
|
28
|
+
show_indicator: bool
|
|
29
|
+
compound: CompoundMode
|
|
30
|
+
variable: Any
|
|
31
|
+
signal: Signal[Any]
|
|
32
|
+
value: Any
|
|
33
|
+
padding: Any
|
|
34
|
+
anchor: Anchor
|
|
35
|
+
width: int
|
|
36
|
+
underline: int
|
|
37
|
+
state: WidgetState
|
|
38
|
+
textvariable: Any
|
|
39
|
+
textsignal: Signal[str]
|
|
40
|
+
|
|
41
|
+
# bootstack-specific extensions
|
|
42
|
+
localize: bool | Literal['auto']
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class RadioButton(LocalizationMixin, SignalMixin, TextSignalMixin, IconMixin, TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Radiobutton):
|
|
46
|
+
"""bootstack wrapper for `ttk.Radiobutton` with themed styling and icon support."""
|
|
47
|
+
|
|
48
|
+
_ttk_base = ttk.Radiobutton
|
|
49
|
+
|
|
50
|
+
def __init__(self, master: Master = None, **kwargs: Unpack[RadioButtonKwargs]) -> None:
|
|
51
|
+
"""Create a themed bootstack Radiobutton.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
master: Parent widget. If None, uses the default root window.
|
|
55
|
+
|
|
56
|
+
Other Parameters:
|
|
57
|
+
text: Text to display.
|
|
58
|
+
textvariable: Tk variable linked to the text.
|
|
59
|
+
See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
|
|
60
|
+
textsignal: Reactive Signal linked to the text (auto-synced with textvariable).
|
|
61
|
+
command: Callable invoked when the value is selected.
|
|
62
|
+
image: Image to display.
|
|
63
|
+
icon: Icon shown in the label area for all states. Color shifts
|
|
64
|
+
from foreground (unselected) to accent (selected) automatically.
|
|
65
|
+
on_icon: Icon shown in the label area when the button is selected.
|
|
66
|
+
Shortcut for `state=[("selected", name)]` inside a full icon spec.
|
|
67
|
+
off_icon: Icon shown in the label area when the button is unselected.
|
|
68
|
+
Used as the base icon when `on_icon` is also provided.
|
|
69
|
+
icon_only: Removes the additional padding added for label.
|
|
70
|
+
show_indicator: Whether to show the standard radio indicator. Defaults
|
|
71
|
+
to True. Set to False to hide the indicator (e.g. for icon-only radio groups).
|
|
72
|
+
compound: Placement of the image relative to text.
|
|
73
|
+
variable: Linked Tk variable that receives the selected value.
|
|
74
|
+
See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
|
|
75
|
+
signal: Reactive Signal that receives the selected value (auto-synced with variable).
|
|
76
|
+
value: The value assigned to `variable` when this radio is selected.
|
|
77
|
+
padding: Extra space around the content.
|
|
78
|
+
anchor: Determines how the content is aligned in the container. Combination of 'n', 's', 'e', 'w', or 'center' (default).
|
|
79
|
+
width: Width of the control in characters.
|
|
80
|
+
underline: Index of character to underline in `text`.
|
|
81
|
+
state: Widget state.
|
|
82
|
+
takefocus: Whether the widget participates in focus traversal.
|
|
83
|
+
style: Explicit ttk style name (overrides accent/variant).
|
|
84
|
+
accent: Accent token for styling, e.g. 'primary', 'success', 'danger'.
|
|
85
|
+
variant: Style variant, e.g. 'default'.
|
|
86
|
+
surface: Optional surface token; otherwise inherited.
|
|
87
|
+
style_options: Optional dict forwarded to the style builder.
|
|
88
|
+
localize: Determines the widget's localization mode.
|
|
89
|
+
"""
|
|
90
|
+
kwargs.update(style_options=self._capture_style_options(['icon_only', 'icon', 'on_icon', 'off_icon', 'show_indicator', 'anchor'], kwargs))
|
|
91
|
+
super().__init__(master, **kwargs)
|
|
92
|
+
|
|
93
|
+
def get(self) -> Any:
|
|
94
|
+
"""Return the current selected value."""
|
|
95
|
+
return self.variable.get()
|
|
96
|
+
|
|
97
|
+
def set(self, value: Any) -> None:
|
|
98
|
+
"""Set the selected value."""
|
|
99
|
+
self.variable.set(value)
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def value(self) -> Any:
|
|
103
|
+
"""Get or set the radiobutton's selected value."""
|
|
104
|
+
return self.get()
|
|
105
|
+
|
|
106
|
+
@value.setter
|
|
107
|
+
def value(self, value: Any) -> None:
|
|
108
|
+
self.set(value)
|
|
109
|
+
|
|
110
|
+
@configure_delegate('value')
|
|
111
|
+
def _delegate_value(self, value=None):
|
|
112
|
+
"""Get or set the value via configure."""
|
|
113
|
+
if value is None:
|
|
114
|
+
return self.get()
|
|
115
|
+
self.set(value)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from typing import Literal
|
|
2
|
+
|
|
3
|
+
from typing_extensions import Unpack
|
|
4
|
+
|
|
5
|
+
from bootstack.widgets._impl.primitives.radiobutton import RadioButton, RadioButtonKwargs
|
|
6
|
+
from bootstack.widgets.types import Master
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class RadioToggle(RadioButton):
|
|
10
|
+
"""bootstack wrapper for `ttk.Radiobutton` that renders with a toggle badge style."""
|
|
11
|
+
|
|
12
|
+
def __init__(self, master: Master = None, **kwargs: Unpack[RadioButtonKwargs]) -> None:
|
|
13
|
+
"""Create a themed bootstack RadioToggle.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
master: Parent widget. If None, uses the default root window.
|
|
17
|
+
|
|
18
|
+
Other Parameters:
|
|
19
|
+
text: Text to display.
|
|
20
|
+
textvariable: Tk variable linked to the text.
|
|
21
|
+
See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
|
|
22
|
+
textsignal: Reactive Signal linked to the text (auto-synced with textvariable).
|
|
23
|
+
command: Callable invoked when the value is selected.
|
|
24
|
+
image: Image to display.
|
|
25
|
+
icon: Theme-aware icon spec handled by the style system.
|
|
26
|
+
icon_only: Removes the additional padding added for label text.
|
|
27
|
+
compound: Placement of the image relative to text.
|
|
28
|
+
variable: Linked Tk variable that receives the selected value.
|
|
29
|
+
See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
|
|
30
|
+
signal: Reactive Signal that receives the selected value (auto-synced with variable).
|
|
31
|
+
value: The value assigned to `variable` when this radio is selected.
|
|
32
|
+
padding: Extra space around the content.
|
|
33
|
+
anchor: Determines how the content is aligned in the container. Combination of 'n', 's', 'e', 'w', or 'center' (default).
|
|
34
|
+
density: The vertical and horizontal compactness of widget content, e.g. 'default', 'compact'.
|
|
35
|
+
width: Width of the control in characters.
|
|
36
|
+
underline: Index of character to underline in `text`.
|
|
37
|
+
state: Widget state ('normal', 'active', 'disabled', 'readonly').
|
|
38
|
+
takefocus: Whether the widget participates in focus traversal.
|
|
39
|
+
accent: Accent token for styling, e.g. 'primary', 'success', 'danger'.
|
|
40
|
+
surface: Optional surface token; otherwise inherited.
|
|
41
|
+
style_options: Optional dict forwarded to the style builder.
|
|
42
|
+
localize: Determines the widget's localization mode.
|
|
43
|
+
"""
|
|
44
|
+
self._capture_density_option(kwargs)
|
|
45
|
+
kwargs.setdefault('ttk_class', 'Toolbutton')
|
|
46
|
+
super().__init__(master, **kwargs)
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def _capture_density_option(kwargs: dict) -> None:
|
|
50
|
+
"""Capture density from kwargs into style_options."""
|
|
51
|
+
density: Literal['default', 'compact'] | None = kwargs.pop('density', None)
|
|
52
|
+
if density is not None:
|
|
53
|
+
style_options = kwargs.setdefault('style_options', {})
|
|
54
|
+
style_options['density'] = density
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from tkinter import ttk
|
|
4
|
+
from typing import Any
|
|
5
|
+
from typing_extensions import Unpack
|
|
6
|
+
|
|
7
|
+
from bootstack._core.mixins.ttk_state import TtkStateMixin
|
|
8
|
+
from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
|
|
9
|
+
from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
|
|
10
|
+
from bootstack.widgets.types import Master, StyledKwargs, Orient
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ScrollbarKwargs(StyledKwargs, total=False):
|
|
14
|
+
# Standard ttk.Scrollbar options
|
|
15
|
+
orient: Orient
|
|
16
|
+
command: Any
|
|
17
|
+
|
|
18
|
+
# bootstack-specific extensions
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Scrollbar(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Scrollbar):
|
|
22
|
+
"""bootstack wrapper for `ttk.Scrollbar` with themed styling support."""
|
|
23
|
+
|
|
24
|
+
_ttk_base = ttk.Scrollbar
|
|
25
|
+
|
|
26
|
+
def __init__(self, master: Master = None, **kwargs: Unpack[ScrollbarKwargs]) -> None:
|
|
27
|
+
"""Create a themed bootstack Scrollbar.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
master: Parent widget. If None, uses the default root window.
|
|
31
|
+
|
|
32
|
+
Other Parameters:
|
|
33
|
+
orient: Orientation of the scrollbar ('horizontal' or 'vertical').
|
|
34
|
+
command: Scroll command callback.
|
|
35
|
+
takefocus: Whether the widget participates in focus traversal.
|
|
36
|
+
style: Explicit ttk style name (overrides accent/variant).
|
|
37
|
+
accent: Accent token for styling, e.g. 'primary', 'danger', 'success'.
|
|
38
|
+
variant: Style variant — 'default' (rounded) or 'thin' (slim square).
|
|
39
|
+
surface: Optional surface token; otherwise inherited.
|
|
40
|
+
style_options: Optional dict forwarded to the style builder.
|
|
41
|
+
"""
|
|
42
|
+
super().__init__(master, **kwargs)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from tkinter import ttk
|
|
4
|
+
from typing_extensions import Unpack
|
|
5
|
+
|
|
6
|
+
from bootstack._core.mixins.ttk_state import TtkStateMixin
|
|
7
|
+
from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
|
|
8
|
+
from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
|
|
9
|
+
from bootstack.widgets.types import Master, StyledKwargs, Orient
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SeparatorKwargs(StyledKwargs, total=False):
|
|
13
|
+
# Standard ttk.Separator options
|
|
14
|
+
orient: Orient
|
|
15
|
+
|
|
16
|
+
# bootstack-specific extensions
|
|
17
|
+
thickness: int
|
|
18
|
+
length: int
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Separator(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Separator):
|
|
22
|
+
"""bootstack wrapper for `ttk.Separator` with themed styling support."""
|
|
23
|
+
|
|
24
|
+
_ttk_base = ttk.Separator
|
|
25
|
+
|
|
26
|
+
def __init__(self, master: Master = None, **kwargs: Unpack[SeparatorKwargs]) -> None:
|
|
27
|
+
"""Create a themed bootstack Separator.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
master: Parent widget. If None, uses the default root window.
|
|
31
|
+
|
|
32
|
+
Other Parameters:
|
|
33
|
+
orient: Orientation of the separator ('horizontal' or 'vertical').
|
|
34
|
+
style: Explicit ttk style name (overrides accent/variant).
|
|
35
|
+
accent: Accent token for styling, e.g. 'primary', 'secondary'; otherwise derived from the inherited surface.
|
|
36
|
+
surface: Optional surface token; otherwise inherited.
|
|
37
|
+
thickness: Thickness of the separator.
|
|
38
|
+
length: Fixed length of the separator in pixels. If None,
|
|
39
|
+
stretches to fill available space.
|
|
40
|
+
style_options: Optional dict forwarded to the style builder.
|
|
41
|
+
"""
|
|
42
|
+
kwargs.update(style_options=self._capture_style_options(['thickness', 'length', 'border_strength'], kwargs))
|
|
43
|
+
super().__init__(master, **kwargs)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from tkinter import ttk
|
|
4
|
+
from typing_extensions import Unpack
|
|
5
|
+
|
|
6
|
+
from bootstack._core.mixins.ttk_state import TtkStateMixin
|
|
7
|
+
from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
|
|
8
|
+
from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
|
|
9
|
+
from bootstack.widgets.types import Master, StyledKwargs
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SizeGripKwargs(StyledKwargs, total=False):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SizeGrip(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Sizegrip):
|
|
17
|
+
"""bootstack wrapper for `ttk.Sizegrip` with themed styling support."""
|
|
18
|
+
|
|
19
|
+
_ttk_base = ttk.Sizegrip
|
|
20
|
+
|
|
21
|
+
def __init__(self, master: Master = None, **kwargs: Unpack[SizeGripKwargs]) -> None:
|
|
22
|
+
"""Create a themed bootstack Sizegrip.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
master: Parent widget. If None, uses the default root window.
|
|
26
|
+
|
|
27
|
+
Other Parameters:
|
|
28
|
+
style: Explicit ttk style name (overrides accent/variant).
|
|
29
|
+
accent: Accent token for styling.
|
|
30
|
+
surface: Optional surface token; otherwise inherited.
|
|
31
|
+
style_options: Optional dict forwarded to the style builder.
|
|
32
|
+
"""
|
|
33
|
+
super().__init__(master, **kwargs)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from tkinter import ttk
|
|
4
|
+
from typing import Any, TYPE_CHECKING
|
|
5
|
+
from typing_extensions import Unpack
|
|
6
|
+
|
|
7
|
+
from bootstack._core.mixins.ttk_state import TtkStateMixin
|
|
8
|
+
from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
|
|
9
|
+
from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
|
|
10
|
+
from bootstack.widgets.types import Master, StyledKwargs, WidgetState, WidgetDensity
|
|
11
|
+
from ..mixins import TextSignalMixin, configure_delegate
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from bootstack.signals import Signal
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SpinboxKwargs(StyledKwargs, total=False):
|
|
18
|
+
# Standard ttk.Spinbox options
|
|
19
|
+
from_: float
|
|
20
|
+
to: float
|
|
21
|
+
increment: float
|
|
22
|
+
values: Any
|
|
23
|
+
wrap: bool
|
|
24
|
+
command: Any
|
|
25
|
+
font: Any
|
|
26
|
+
textvariable: Any
|
|
27
|
+
textsignal: Signal[Any]
|
|
28
|
+
format: str
|
|
29
|
+
width: int
|
|
30
|
+
state: WidgetState
|
|
31
|
+
|
|
32
|
+
# bootstack-specific extensions
|
|
33
|
+
density: WidgetDensity
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class Spinbox(TextSignalMixin, TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Spinbox):
|
|
37
|
+
"""bootstack wrapper for `ttk.Spinbox` with themed styling support."""
|
|
38
|
+
|
|
39
|
+
_ttk_base = ttk.Spinbox
|
|
40
|
+
|
|
41
|
+
def __init__(self, master: Master = None, **kwargs: Unpack[SpinboxKwargs]) -> None:
|
|
42
|
+
"""Create a themed bootstack Spinbox.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
master: Parent widget. If None, uses the default root window.
|
|
46
|
+
|
|
47
|
+
Other Parameters:
|
|
48
|
+
from_: Minimum value.
|
|
49
|
+
to: Maximum value.
|
|
50
|
+
increment: Step size between values.
|
|
51
|
+
values: Sequence of values to cycle through.
|
|
52
|
+
wrap: Whether to wrap between min/max.
|
|
53
|
+
command: Callback when the value changes.
|
|
54
|
+
textvariable: Tk variable linked to the entry text.
|
|
55
|
+
See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
|
|
56
|
+
textsignal: Reactive Signal linked to the text (auto-synced with textvariable).
|
|
57
|
+
format: Display format string.
|
|
58
|
+
width: Widget width in characters.
|
|
59
|
+
state: Widget state.
|
|
60
|
+
takefocus: Whether the widget participates in focus traversal.
|
|
61
|
+
style: Explicit ttk style name (overrides accent/variant).
|
|
62
|
+
accent: Accent token for styling, e.g. 'primary', 'danger', 'success'.
|
|
63
|
+
density: Vertical and horizontal compactness, e.g. 'default', 'compact'.
|
|
64
|
+
surface: Optional surface token; otherwise inherited.
|
|
65
|
+
style_options: Optional dict forwarded to the style builder.
|
|
66
|
+
"""
|
|
67
|
+
if kwargs.get('density') == 'compact':
|
|
68
|
+
kwargs['font'] = 'caption'
|
|
69
|
+
kwargs.update(style_options=self._capture_style_options(['density'], kwargs))
|
|
70
|
+
super().__init__(master, **kwargs)
|
|
71
|
+
# Handle mousewheel explicitly so we can return "break" and stop the
|
|
72
|
+
# event from leaking to parent scroll containers. Instance bindings run
|
|
73
|
+
# before class bindings in Tk's chain, so we must do the spin ourselves.
|
|
74
|
+
self.bind("<MouseWheel>", self._on_mousewheel)
|
|
75
|
+
self.bind("<Button-4>", self._on_mousewheel)
|
|
76
|
+
self.bind("<Button-5>", self._on_mousewheel)
|
|
77
|
+
|
|
78
|
+
def _on_mousewheel(self, event):
|
|
79
|
+
if event.delta > 0 or event.num == 4:
|
|
80
|
+
self.event_generate("<Up>")
|
|
81
|
+
else:
|
|
82
|
+
self.event_generate("<Down>")
|
|
83
|
+
return "break"
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@configure_delegate('density')
|
|
87
|
+
def _delegate_density(self, value=None):
|
|
88
|
+
if value is None:
|
|
89
|
+
return self.configure_style_options(value)
|
|
90
|
+
else:
|
|
91
|
+
if value == 'compact':
|
|
92
|
+
self.configure(font='caption')
|
|
93
|
+
else:
|
|
94
|
+
self.configure(font='body')
|
|
95
|
+
return self.configure_style_options(density=value)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from typing_extensions import Unpack
|
|
2
|
+
|
|
3
|
+
from bootstack.widgets._impl.primitives.checkbutton import CheckButton, CheckButtonKwargs
|
|
4
|
+
from bootstack.widgets.types import Master
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Switch(CheckButton):
|
|
8
|
+
"""bootstack wrapper for `ttk.Checkbutton` that renders with a Switch style"""
|
|
9
|
+
|
|
10
|
+
def __init__(self, master: Master = None, **kwargs: Unpack[CheckButtonKwargs]) -> None:
|
|
11
|
+
"""Create a themed bootstack Switch.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
master: Parent widget. If None, uses the default root window.
|
|
15
|
+
|
|
16
|
+
Other Parameters:
|
|
17
|
+
text: Text to display on the toggle.
|
|
18
|
+
textvariable: Tk variable linked to the text.
|
|
19
|
+
See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
|
|
20
|
+
textsignal: Reactive Signal linked to the text (auto-synced with textvariable).
|
|
21
|
+
command: Callable invoked when the toggle changes state.
|
|
22
|
+
image: Image to display.
|
|
23
|
+
icon: Theme-aware icon spec handled by the style system.
|
|
24
|
+
icon_only: If True, removes the additional padding reserved for text.
|
|
25
|
+
compound: Placement of the image relative to text.
|
|
26
|
+
variable: Linked variable controlling the on/off state.
|
|
27
|
+
See [tkinter Variables](https://docs.python.org/3/library/tkinter.html#tkinter-variables).
|
|
28
|
+
signal: Reactive Signal controlling the on/off state (auto-synced with variable).
|
|
29
|
+
value: Initial state for the widget's associated variable (defaults to None when unset).
|
|
30
|
+
onvalue: Value set in `variable` when selected.
|
|
31
|
+
offvalue: Value set in `variable` when deselected.
|
|
32
|
+
padding: Extra space around the content.
|
|
33
|
+
anchor: Determines how the content is aligned in the container. Combination of 'n', 's', 'e', 'w', or 'center' (default).
|
|
34
|
+
width: Width of the control in characters.
|
|
35
|
+
underline: Index of character to underline in `text`.
|
|
36
|
+
state: Widget state ('normal', 'active', 'disabled', 'readonly').
|
|
37
|
+
takefocus: Whether the widget participates in focus traversal.
|
|
38
|
+
accent: Accent token for styling, e.g. 'primary', 'success', 'danger'.
|
|
39
|
+
surface: Optional surface token; otherwise inherited.
|
|
40
|
+
style_options: Optional dict forwarded to the style builder.
|
|
41
|
+
localize: Determines the widget's localization mode.
|
|
42
|
+
"""
|
|
43
|
+
kwargs['variant'] = 'switch'
|
|
44
|
+
super().__init__(master, **kwargs)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from tkinter import ttk
|
|
4
|
+
from typing import Any, Literal
|
|
5
|
+
from typing_extensions import Unpack
|
|
6
|
+
|
|
7
|
+
from bootstack._core.mixins.ttk_state import TtkStateMixin
|
|
8
|
+
from bootstack._core.mixins.widget import WidgetCapabilitiesMixin
|
|
9
|
+
from bootstack.widgets._impl._internal.wrapper_base import TTKWrapperBase
|
|
10
|
+
from bootstack.widgets.types import Master, StyledKwargs, WidgetDensity
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TreeViewKwargs(StyledKwargs, total=False):
|
|
14
|
+
# Standard ttk.Treeview options
|
|
15
|
+
columns: Any
|
|
16
|
+
displaycolumns: Any
|
|
17
|
+
show: Literal['tree', 'headings', '']
|
|
18
|
+
height: int
|
|
19
|
+
padding: Any
|
|
20
|
+
selectmode: Literal['browse','extended','none'] | str
|
|
21
|
+
|
|
22
|
+
# bootstack-specific extensions
|
|
23
|
+
density: WidgetDensity
|
|
24
|
+
border_color: str
|
|
25
|
+
show_border: bool
|
|
26
|
+
select_background: str
|
|
27
|
+
header_background: str
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class TreeView(TTKWrapperBase, WidgetCapabilitiesMixin, TtkStateMixin, ttk.Treeview):
|
|
31
|
+
"""bootstack wrapper for `ttk.Treeview` with themed styling support."""
|
|
32
|
+
|
|
33
|
+
_ttk_base = ttk.Treeview
|
|
34
|
+
|
|
35
|
+
def __init__(self, master: Master = None, **kwargs: Unpack[TreeViewKwargs]) -> None:
|
|
36
|
+
"""Create a themed bootstack Treeview.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
master: Parent widget. If None, uses the default root window.
|
|
40
|
+
|
|
41
|
+
Other Parameters:
|
|
42
|
+
columns: Sequence of column identifiers.
|
|
43
|
+
displaycolumns: Subset and order of columns to display.
|
|
44
|
+
show: Which parts to display (e.g., 'tree', 'headings').
|
|
45
|
+
height: Number of rows to display.
|
|
46
|
+
padding: Extra padding around the widget.
|
|
47
|
+
selectmode: Selection mode ('browse', 'extended', 'none').
|
|
48
|
+
style: Explicit ttk style name.
|
|
49
|
+
surface: Optional surface token; otherwise inherited.
|
|
50
|
+
density: Compactness of widget content ('default' or 'compact').
|
|
51
|
+
border_color: Color of the border around the table.
|
|
52
|
+
show_border: Whether to show a border around the table.
|
|
53
|
+
open_icon: Icon used for the open state.
|
|
54
|
+
close_icon: Icon used for the close state.
|
|
55
|
+
select_background: Semantic color token for selection background.
|
|
56
|
+
header_background: Semantic color token for the header background.
|
|
57
|
+
style_options: Optional dict forwarded to the style builder.
|
|
58
|
+
"""
|
|
59
|
+
kwargs.update(style_options=self._capture_style_options([
|
|
60
|
+
'density',
|
|
61
|
+
'border_color',
|
|
62
|
+
'show_border',
|
|
63
|
+
'open_icon',
|
|
64
|
+
'close_icon',
|
|
65
|
+
'select_background',
|
|
66
|
+
'header_background'
|
|
67
|
+
],
|
|
68
|
+
kwargs))
|
|
69
|
+
super().__init__(master, **kwargs)
|