bootstack 0.4.3__tar.gz → 0.4.5__tar.gz
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-0.4.3/src/bootstack.egg-info → bootstack-0.4.5}/PKG-INFO +1 -1
- {bootstack-0.4.3 → bootstack-0.4.5}/pyproject.toml +2 -2
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/capture.py +1 -3
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/toplevel.py +1 -2
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/datedialog.py +1 -2
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/dialog.py +4 -6
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/query.py +2 -2
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/i18n/README.md +0 -1
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/i18n/msgcat.py +8 -72
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/navmodel.py +0 -2
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/contextmenu.py +14 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -2
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/selectbox.py +12 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/__init__.py +1 -1
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/layout.py +34 -3
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/select.py +1 -2
- {bootstack-0.4.3 → bootstack-0.4.5/src/bootstack.egg-info}/PKG-INFO +1 -1
- {bootstack-0.4.3 → bootstack-0.4.5}/LICENSE +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/MANIFEST.in +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/NOTICE +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/README.md +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/setup.cfg +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/__main__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/exceptions.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/images.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/localization.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/mixins/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/mixins/ttk_state.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/mixins/widget.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/paths.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/signal_binding.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_core/variables.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/app.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/base_window.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/events.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/grab.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/shortcuts.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/tk_patch.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/utility.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/visual_focus.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/wheel.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/_runtime/window_utilities.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/bootstack.ico +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/bootstack.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/badge-pill.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/badge-square.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/button-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/button-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/card.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/field.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/input-addon-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/input-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/input-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/list-item-separated.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/list-item.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/listrow-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/listrow-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/manifest.toml +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/menu-item.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/navitem-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/navitem-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/radiobutton.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/slider-handle.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/slider-track-h.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/slider-track-v.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/switch-off.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/switch-on.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/tab-h.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/tab-v.png +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/icons/glyphmap.json +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/icons/icon_metrics.json +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/__main__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/add.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/appicon.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/build.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/config.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/demo.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/dev.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/doctor.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/icons.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/promote.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/pyinstaller.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/run.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/start.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/cli/templates/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/clipboard.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/constants.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/README.md +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/_observable.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/base.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/file_source.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/memory_source.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/query.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/readers.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/sqlite_source.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/types.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/data/writers.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dev/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dev/_capture.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dev/_env.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dev/_registry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dev/_reloader.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dev/_reset.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dev/_watcher.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/colorchooser.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/filterdialog.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/fontdialog.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/formdialog.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/dialogs/_impl/message.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/errors.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/events/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/events/_event.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/events/_payloads.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/events/_subscription.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/i18n/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/i18n/catalog.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/i18n/intl_format.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/i18n/specs.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/images.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/py.typed +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/scheduling/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/scheduling/_schedule.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/shortcuts.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/signals/README.md +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/signals/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/signals/integration.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/signals/signal.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/signals/types.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/store.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/streams/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/streams/_stream.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/badge.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/button.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/buttongroup.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/calendar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/checkbutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/combobox.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/contextmenu.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/entry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/expander.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/field.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/frame.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/label.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/labelframe.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/listview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/menubar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/menubutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/panedwindow.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/progressbar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/radiobutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/scale.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/scrollbar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/separator.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/sidenav.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/sizegrip.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/spinbox.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/switch.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/tabitem.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/togglegroup.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/toolbutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/tooltip.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/treeview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders/utils.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders_tk/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/builders_tk/defaults.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/element.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/fonts.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/style.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/style_builder_base.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/style_builder_mixed.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/style_builder_tk.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/style_builder_ttk.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/style_resolver.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/theme.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/theme_provider.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/themes/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/tk_patch.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/token_maps.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/types.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/typography.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/style/utility.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/types.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/validation/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/validation/types.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/validation/validation_result.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/validation/validation_rules.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/app_config.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/base.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/choices.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/container.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/context.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/events.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/field_mixin.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/image_binding.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/kwargs.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/options.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/selection_group.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/window_controls.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_core/window_menu.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/_parts/textentry_part.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/avatar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/buttongroup.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/calendar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/carousel.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/chart.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/compositeframe.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/field.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/form.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/gallery.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/list/listview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/menu/model.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/meter.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/pagestack.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/passwordentry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/picture.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/scrollview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/content_host.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/providers.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/shell.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/workspace.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/slider/_shared.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/slider/slider.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/spinnerentry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/core.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/filter.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/redirector.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/timeentry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/toolbar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tooltip.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/font_mixin.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/combobox.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/flexframe.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/frame.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/gridframe.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/packframe.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/app.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/appshell.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/avatar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/boolean_controls.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/button.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/buttongroup.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/calendar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/card.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/carousel.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/chart.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/codeeditor.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/contextmenu.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/datatable.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/datefield.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/divider.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/expander.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/form.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/gallery.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/gauge.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/grid.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/groupbox.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/label.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/listview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/menubutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/numberfield.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/pagestack.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/passwordfield.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/pathfield.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/picture.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/progressbar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/radio_variants.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/radiogroup.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/scrollbar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/scrollview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/selectbutton.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/sidebar_toggle.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/sizegrip.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/slider.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/spinbox.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/spinnerfield.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/splash.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/splitview.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/stacks.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/statusbar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/tabs.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/textarea.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/textfield.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/theme_toggle.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/timefield.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/toast.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/togglegroup.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/toolbar.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/tooltip.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/tree.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/types.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/window.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack.egg-info/SOURCES.txt +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack.egg-info/dependency_links.txt +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack.egg-info/entry_points.txt +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack.egg-info/requires.txt +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack.egg-info/top_level.txt +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_dialog_anchor.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_events_doc_coverage.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_hot_reload.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_images.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_images_gui.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_intl_format.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_navmodel.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_on_color_contrast.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_public_surface.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_store.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_theme_from_existing.py +0 -0
- {bootstack-0.4.3 → bootstack-0.4.5}/tests/test_validation_rules.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bootstack
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Build desktop GUI apps in pure Python and ship them as a standalone executable — built on Tk, no Tkinter boilerplate.
|
|
5
5
|
Author-email: Israel Dryer <israel.dryer@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "bootstack"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.5"
|
|
8
8
|
description = "Build desktop GUI apps in pure Python and ship them as a standalone executable — built on Tk, no Tkinter boilerplate."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -114,7 +114,7 @@ where = ["src"]
|
|
|
114
114
|
]
|
|
115
115
|
|
|
116
116
|
[tool.bumpversion]
|
|
117
|
-
current_version = "0.4.
|
|
117
|
+
current_version = "0.4.5"
|
|
118
118
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
|
|
119
119
|
serialize = [
|
|
120
120
|
"{major}.{minor}.{patch}{pre}{pre_n}",
|
|
@@ -223,9 +223,7 @@ def settle(tk_widget, seconds: float) -> None:
|
|
|
223
223
|
real click re-enters the handler there — confirmed by hand, since a
|
|
224
224
|
synthesized click cannot test this. Measured on Tk 8.6.17 in plain
|
|
225
225
|
tkinter, so it is the toolkit rather than anything above it. X11 and Win32
|
|
226
|
-
map the window and are expected to honor it
|
|
227
|
-
`development/probe_429_busy_during_settle.py` reports which a given box
|
|
228
|
-
does.
|
|
226
|
+
map the window and are expected to honor it.
|
|
229
227
|
|
|
230
228
|
The wait dispatches either way. A correct picture is worth more than a
|
|
231
229
|
stray click: without dispatching, the capture reads pixels that are simply
|
|
@@ -262,8 +262,7 @@ class Toplevel(BaseWindow, WidgetCapabilitiesMixin, tkinter.Toplevel):
|
|
|
262
262
|
later `destroy()` is an ordinary path, and pairing on the blocking one
|
|
263
263
|
alone would leave it unfixed. Measured before choosing it: the restore
|
|
264
264
|
wins its race with Tk's own grab release, so `grab_current()` reads the
|
|
265
|
-
opener again once the dust settles
|
|
266
|
-
(`development/probe_444_grab_restore_ordering.py`).
|
|
265
|
+
opener again once the dust settles.
|
|
267
266
|
"""
|
|
268
267
|
if self._grab_restore_bound:
|
|
269
268
|
return
|
|
@@ -351,8 +351,7 @@ class DateDialog:
|
|
|
351
351
|
|
|
352
352
|
Unlike `_confirm`, this releases no grab of its own. It does not need
|
|
353
353
|
to: `Dialog` destroys the toplevel, and Tk releases a grab held by a
|
|
354
|
-
window when that window is destroyed (measured
|
|
355
|
-
`development/probe_437_review2_fixes.py`). `_confirm` keeps its
|
|
354
|
+
window when that window is destroyed (measured). `_confirm` keeps its
|
|
356
355
|
`grab_release()` because it destroys the window itself, where the call
|
|
357
356
|
is at least self-documenting.
|
|
358
357
|
"""
|
|
@@ -211,9 +211,8 @@ def _key_was_consumed(widget: Any, keysym: str) -> bool:
|
|
|
211
211
|
|
|
212
212
|
In both cases a DISABLED widget is the exception: its class binding runs
|
|
213
213
|
but does nothing — `invoke` is a no-op on a disabled button, and
|
|
214
|
-
`tk::TextInsert` returns early on a disabled text (both measured
|
|
215
|
-
|
|
216
|
-
so the default button should still get it. Standing down there would leave
|
|
214
|
+
`tk::TextInsert` returns early on a disabled text (both measured). Nothing
|
|
215
|
+
answered the key, so the default button should still get it. Standing down there would leave
|
|
217
216
|
the keyboard dead for the whole dialog.
|
|
218
217
|
|
|
219
218
|
⚠ THE KEY MATTERS, NOT ONLY THE WIDGET — which is why `keysym` is required
|
|
@@ -712,7 +711,7 @@ class Dialog:
|
|
|
712
711
|
# button from an input field -- but only where the window system
|
|
713
712
|
# reports it separately, which is NOT everywhere. Measured with a
|
|
714
713
|
# real keypress, alternating against the main Enter key as a
|
|
715
|
-
# control
|
|
714
|
+
# control:
|
|
716
715
|
#
|
|
717
716
|
# * Windows FOLDS it into `Return` -- keysym `Return`, keycode 13,
|
|
718
717
|
# char `\r`, byte-identical to the main Enter key -- so this
|
|
@@ -752,8 +751,7 @@ class Dialog:
|
|
|
752
751
|
documented as focusing its default button (issue #439).
|
|
753
752
|
|
|
754
753
|
Waiting for the widget's own `<Map>` states that precondition instead
|
|
755
|
-
of guessing a delay. Measured on Windows
|
|
756
|
-
(`development/probe_439_focus_timing.py`): the button is still
|
|
754
|
+
of guessing a delay. Measured on Windows: the button is still
|
|
757
755
|
unmapped once `deiconify()` AND `update_idletasks()` have both
|
|
758
756
|
returned, so neither is a usable barrier. Asking after the toplevel is
|
|
759
757
|
deiconified happens to work — Tk defers a request made against a
|
|
@@ -169,8 +169,8 @@ class QueryDialog:
|
|
|
169
169
|
# "ensure focus after dialog buttons set their own focus". Both ran
|
|
170
170
|
# while the toplevel was still withdrawn, where `focus_set()` is a
|
|
171
171
|
# silent no-op, so neither ever took and the entry was never actually
|
|
172
|
-
# focused — measured
|
|
173
|
-
#
|
|
172
|
+
# focused — measured against pre-fix code, where focus sat on the
|
|
173
|
+
# toplevel. Handing the
|
|
174
174
|
# target to `Dialog` replaces the race with an ordering (issue #439).
|
|
175
175
|
self._dialog._focus_target = getattr(entry, "entry_widget", entry)
|
|
176
176
|
|
|
@@ -52,7 +52,6 @@ Import path
|
|
|
52
52
|
Contribution notes
|
|
53
53
|
- Prefer base locales (`de`, `fr`, `nl`) unless region-specific differences are
|
|
54
54
|
required (for example `pt_BR`).
|
|
55
|
-
- Avoid embedding mnemonics `&` in messages; MessageCatalog strips them when rendering.
|
|
56
55
|
- Keep message ids consistent (case and punctuation) to avoid duplicates.
|
|
57
56
|
|
|
58
57
|
Minimum keys to translate for a new language (baseline UI):
|
|
@@ -21,7 +21,7 @@ Public API (unchanged signatures):
|
|
|
21
21
|
- MessageCatalog.set_many(locale, *args) -> int
|
|
22
22
|
- MessageCatalog.max(*src) -> int
|
|
23
23
|
- MessageCatalog.init(root=None, locales_dir=None, domain='messages',
|
|
24
|
-
default_locale='en'
|
|
24
|
+
default_locale='en') -> None
|
|
25
25
|
"""
|
|
26
26
|
|
|
27
27
|
from __future__ import annotations
|
|
@@ -47,7 +47,6 @@ class MessageCatalog:
|
|
|
47
47
|
_domain: str = "messages"
|
|
48
48
|
_locale: str = "en"
|
|
49
49
|
_gt: gettext.NullTranslations | None = None
|
|
50
|
-
_strip_amp: bool = True
|
|
51
50
|
_emit_event: bool = True
|
|
52
51
|
_event_name: str = "<<LocaleChanged>>"
|
|
53
52
|
|
|
@@ -62,7 +61,6 @@ class MessageCatalog:
|
|
|
62
61
|
locales_dir: Union[str, Path, None] = None,
|
|
63
62
|
domain: str = "messages",
|
|
64
63
|
default_locale: str = "en",
|
|
65
|
-
strip_ampersands: bool = True,
|
|
66
64
|
emit_virtual_event: bool = True,
|
|
67
65
|
virtual_event_name: str = "<<LocaleChanged>>",
|
|
68
66
|
) -> None:
|
|
@@ -75,7 +73,6 @@ class MessageCatalog:
|
|
|
75
73
|
directory is auto-discovered.
|
|
76
74
|
domain: Gettext domain name.
|
|
77
75
|
default_locale: Locale to activate after initialization.
|
|
78
|
-
strip_ampersands: If true, remove mnemonic `&` markers.
|
|
79
76
|
emit_virtual_event: If true, generate a Tk virtual event after
|
|
80
77
|
locale changes so widgets can refresh themselves.
|
|
81
78
|
virtual_event_name: The virtual event name to emit when the
|
|
@@ -87,7 +84,6 @@ class MessageCatalog:
|
|
|
87
84
|
|
|
88
85
|
MessageCatalog._domain = domain
|
|
89
86
|
MessageCatalog._locales_dir = Path(locales_dir) if locales_dir else MessageCatalog._discover_locales_dir()
|
|
90
|
-
MessageCatalog._strip_amp = strip_ampersands
|
|
91
87
|
MessageCatalog._emit_event = bool(emit_virtual_event)
|
|
92
88
|
MessageCatalog._event_name = str(virtual_event_name or "<<LocaleChanged>>")
|
|
93
89
|
MessageCatalog._install_gettext(default_locale)
|
|
@@ -201,54 +197,6 @@ class MessageCatalog:
|
|
|
201
197
|
parts = code.replace("-", "_").split("_")
|
|
202
198
|
return parts[0].lower() if len(parts) == 1 else f"{parts[0].lower()}_{parts[1].lower()}"
|
|
203
199
|
|
|
204
|
-
@staticmethod
|
|
205
|
-
def __join(*args: Any) -> str:
|
|
206
|
-
"""Join format args for Tcl msgcat formatting.
|
|
207
|
-
|
|
208
|
-
Args:
|
|
209
|
-
*args: Positional values to forward to Tcl 'format'.
|
|
210
|
-
|
|
211
|
-
Returns:
|
|
212
|
-
String of brace-wrapped arguments joined by spaces.
|
|
213
|
-
"""
|
|
214
|
-
new_args = []
|
|
215
|
-
for arg in args:
|
|
216
|
-
if isinstance(arg, str):
|
|
217
|
-
stripped = str(arg).strip('"')
|
|
218
|
-
new_args.append("{%s}" % stripped)
|
|
219
|
-
else:
|
|
220
|
-
new_args.append(str(arg))
|
|
221
|
-
return " ".join(new_args)
|
|
222
|
-
|
|
223
|
-
@staticmethod
|
|
224
|
-
def _strip_ampersands(s: str) -> str:
|
|
225
|
-
"""Remove mnemonic ampersands from text.
|
|
226
|
-
|
|
227
|
-
Converts single '&' markers to nothing and turns '&&' into a
|
|
228
|
-
literal '&'. Useful for rendering toolkit-agnostic text.
|
|
229
|
-
|
|
230
|
-
Args:
|
|
231
|
-
s: Input string.
|
|
232
|
-
|
|
233
|
-
Returns:
|
|
234
|
-
Cleaned string with mnemonic indicators removed.
|
|
235
|
-
"""
|
|
236
|
-
if not s or "&" not in s:
|
|
237
|
-
return s
|
|
238
|
-
out = []
|
|
239
|
-
i = 0
|
|
240
|
-
while i < len(s):
|
|
241
|
-
if s[i] == "&":
|
|
242
|
-
if i + 1 < len(s) and s[i + 1] == "&":
|
|
243
|
-
out.append("&")
|
|
244
|
-
i += 2
|
|
245
|
-
else:
|
|
246
|
-
i += 1 # skip mnemonic marker
|
|
247
|
-
else:
|
|
248
|
-
out.append(s[i])
|
|
249
|
-
i += 1
|
|
250
|
-
return "".join(out)
|
|
251
|
-
|
|
252
200
|
# -------------- public API (unchanged signatures) ---------------------
|
|
253
201
|
|
|
254
202
|
@staticmethod
|
|
@@ -279,16 +227,12 @@ class MessageCatalog:
|
|
|
279
227
|
# work as in legacy behavior.
|
|
280
228
|
cur = MessageCatalog._locale
|
|
281
229
|
if fmtargs and cur in MessageCatalog._overrides and src in MessageCatalog._overrides[cur]:
|
|
282
|
-
|
|
283
|
-
out = root.tk.eval(command)
|
|
284
|
-
return MessageCatalog._strip_ampersands(out) if MessageCatalog._strip_amp else out
|
|
230
|
+
return str(root.tk.call('::msgcat::mc', src, *fmtargs))
|
|
285
231
|
|
|
286
232
|
# 1) overrides for current locale win first
|
|
287
233
|
cur = MessageCatalog._locale
|
|
288
234
|
if cur in MessageCatalog._overrides and src in MessageCatalog._overrides[cur]:
|
|
289
235
|
s = MessageCatalog._overrides[cur][src]
|
|
290
|
-
if MessageCatalog._strip_amp:
|
|
291
|
-
s = MessageCatalog._strip_ampersands(s)
|
|
292
236
|
# try Python formatting if args were passed; ignore on failure
|
|
293
237
|
if fmtargs:
|
|
294
238
|
try:
|
|
@@ -306,8 +250,6 @@ class MessageCatalog:
|
|
|
306
250
|
# If gettext returns src unchanged, and we have no fmtargs,
|
|
307
251
|
# we'll consider falling back to msgcat for consistency.
|
|
308
252
|
if s != src:
|
|
309
|
-
if MessageCatalog._strip_amp:
|
|
310
|
-
s = MessageCatalog._strip_ampersands(s)
|
|
311
253
|
if fmtargs:
|
|
312
254
|
try:
|
|
313
255
|
return s % fmtargs
|
|
@@ -320,12 +262,8 @@ class MessageCatalog:
|
|
|
320
262
|
# ignore and fall back to msgcat
|
|
321
263
|
pass
|
|
322
264
|
|
|
323
|
-
# 3) Tcl msgcat fallback
|
|
324
|
-
|
|
325
|
-
if fmtargs:
|
|
326
|
-
command = f"{command} {MessageCatalog.__join(*fmtargs)}"
|
|
327
|
-
out = root.tk.eval(command)
|
|
328
|
-
return MessageCatalog._strip_ampersands(out) if MessageCatalog._strip_amp else out
|
|
265
|
+
# 3) Tcl msgcat fallback
|
|
266
|
+
return str(root.tk.call("::msgcat::mc", src, *fmtargs))
|
|
329
267
|
|
|
330
268
|
@staticmethod
|
|
331
269
|
def locale(new_locale: Optional[str] = None) -> str:
|
|
@@ -375,7 +313,7 @@ class MessageCatalog:
|
|
|
375
313
|
msgs = Path(dirname).as_posix()
|
|
376
314
|
from bootstack._runtime.app import get_default_root
|
|
377
315
|
root = get_default_root()
|
|
378
|
-
return int(root.tk.
|
|
316
|
+
return int(root.tk.call('::msgcat::mcload', msgs))
|
|
379
317
|
|
|
380
318
|
@staticmethod
|
|
381
319
|
def set(locale: str, src: str, translated: Optional[str] = None) -> None:
|
|
@@ -390,7 +328,7 @@ class MessageCatalog:
|
|
|
390
328
|
MessageCatalog._overrides.setdefault(loc, {})[src] = translated or ""
|
|
391
329
|
from bootstack._runtime.app import get_default_root
|
|
392
330
|
root = get_default_root()
|
|
393
|
-
root.tk.
|
|
331
|
+
root.tk.call('::msgcat::mcset', MessageCatalog._to_msgcat_locale(locale), src, translated or "")
|
|
394
332
|
|
|
395
333
|
@staticmethod
|
|
396
334
|
def set_many(locale: str, *args: str) -> int:
|
|
@@ -414,12 +352,10 @@ class MessageCatalog:
|
|
|
414
352
|
# update Tcl msgcat
|
|
415
353
|
from bootstack._runtime.app import get_default_root
|
|
416
354
|
root = get_default_root()
|
|
417
|
-
|
|
418
|
-
out = f"::msgcat::mcmset {MessageCatalog._to_msgcat_locale(locale)} {{{messages}}}"
|
|
419
|
-
return int(root.tk.eval(out))
|
|
355
|
+
return int(root.tk.call("::msgcat::mcmset", MessageCatalog._to_msgcat_locale(locale), tuple(args)))
|
|
420
356
|
|
|
421
357
|
@staticmethod
|
|
422
358
|
def max(*src: str) -> int:
|
|
423
359
|
from bootstack._runtime.app import get_default_root
|
|
424
360
|
root = get_default_root()
|
|
425
|
-
return int(root.tk.
|
|
361
|
+
return int(root.tk.call("::msgcat::mcmax", *src))
|
|
@@ -14,8 +14,6 @@ The model encodes two design invariants:
|
|
|
14
14
|
- The rail (workspace switcher) renders only when there is more than one
|
|
15
15
|
workspace, so a single-tier app is the degenerate one-workspace case with no
|
|
16
16
|
branching in the consumer.
|
|
17
|
-
|
|
18
|
-
See `development/appshell-navigation-spec.md` for the full design.
|
|
19
17
|
"""
|
|
20
18
|
|
|
21
19
|
from __future__ import annotations
|
|
@@ -210,6 +210,20 @@ class _ToplevelContextMenu(CustomConfigMixin):
|
|
|
210
210
|
# Setup keyboard bindings
|
|
211
211
|
self._setup_keyboard_bindings()
|
|
212
212
|
|
|
213
|
+
# hide the menu when the app loses focus
|
|
214
|
+
self._toplevel.bind("<FocusOut>", self._on_focus_out, add="+")
|
|
215
|
+
|
|
216
|
+
def _on_focus_out(self, _):
|
|
217
|
+
root = self._toplevel._root()
|
|
218
|
+
root.after_idle(self._hide_if_app_lost_focus)
|
|
219
|
+
|
|
220
|
+
def _hide_if_app_lost_focus(self):
|
|
221
|
+
try:
|
|
222
|
+
if self._toplevel.winfo_viewable() and self._toplevel.focus_get() is None:
|
|
223
|
+
self.hide()
|
|
224
|
+
except (TclError, KeyError): # destroyed; focus_get() raises KeyError for Tcl-created window
|
|
225
|
+
pass
|
|
226
|
+
|
|
213
227
|
def _generate_key(self) -> str:
|
|
214
228
|
"""Generate an auto key for an item."""
|
|
215
229
|
key = f"item_{self._counter}"
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
A single platform-neutral menu *model* (`MenuModel` / `MenuGroup` / `MenuItem`)
|
|
4
4
|
is the source of truth; platform renderers consume it — a themed in-window strip
|
|
5
5
|
on Windows/Linux and the native global menu bar on macOS.
|
|
6
|
-
|
|
7
|
-
See `docs/_dev/menu-redesign.md` for the design.
|
|
8
6
|
"""
|
|
9
7
|
from __future__ import annotations
|
|
10
8
|
|
|
@@ -948,6 +948,18 @@ class SelectBox(Field):
|
|
|
948
948
|
tab_binding = self.entry_widget.bind('<Tab>', on_tab)
|
|
949
949
|
popup_state['key_bindings'].append(('<Tab>', tab_binding))
|
|
950
950
|
|
|
951
|
+
def _hide_if_app_lost_focus():
|
|
952
|
+
if popup_state['popup_closed']:
|
|
953
|
+
return
|
|
954
|
+
try:
|
|
955
|
+
if toplevel.winfo_viewable() and self.focus_get() is None:
|
|
956
|
+
close_popup()
|
|
957
|
+
except (TclError, KeyError): # destroyed; focus_get() raises KeyError for a Tcl-created window
|
|
958
|
+
pass
|
|
959
|
+
|
|
960
|
+
focusout_binding = self.entry_widget.bind('<FocusOut>', lambda e: self._root().after_idle(_hide_if_app_lost_focus), add="+")
|
|
961
|
+
popup_state['key_bindings'].append(('<FocusOut>', focusout_binding))
|
|
962
|
+
|
|
951
963
|
# Setup click-outside detection
|
|
952
964
|
def on_root_click(event):
|
|
953
965
|
x, y = event.x_root, event.y_root
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/widgets/_impl/composites/shell/__init__.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Internal composites for the clean-slate application shell.
|
|
2
2
|
|
|
3
|
-
Layered
|
|
3
|
+
Layered as:
|
|
4
4
|
|
|
5
5
|
- `layout.ShellLayout` — Layer 1, the dumb region/slot band layout.
|
|
6
6
|
- `nav_panel.NavPanel` — the static single-select nav list (sidebar).
|
|
@@ -23,14 +23,14 @@ only the body row knows whether the rail/sidebar/dock exist. That invariant lets
|
|
|
23
23
|
"sidebar + chrome", "chrome only", and "sidebar only" be the same layout with
|
|
24
24
|
slots toggled rather than separate code paths.
|
|
25
25
|
|
|
26
|
-
Note: the
|
|
27
|
-
|
|
28
|
-
in `docs/_dev/appshell-navigation-spec.md`.
|
|
26
|
+
Note: the body uses fixed-width pack slots; a resizable sidebar/content sash
|
|
27
|
+
(a `PanedWindow`) is not built.
|
|
29
28
|
"""
|
|
30
29
|
|
|
31
30
|
from __future__ import annotations
|
|
32
31
|
|
|
33
32
|
import sys
|
|
33
|
+
from tkinter import TclError
|
|
34
34
|
from typing import Any
|
|
35
35
|
|
|
36
36
|
from bootstack._runtime.app import App
|
|
@@ -128,6 +128,7 @@ class ShellLayout(App):
|
|
|
128
128
|
self._show_rail = False
|
|
129
129
|
self._show_sidebar = True
|
|
130
130
|
self._show_dock = False
|
|
131
|
+
self._recolor_pending = False
|
|
131
132
|
|
|
132
133
|
self._build_regions()
|
|
133
134
|
self._relayout_window()
|
|
@@ -206,6 +207,7 @@ class ShellLayout(App):
|
|
|
206
207
|
self._status_sep.pack(side="bottom", fill="x")
|
|
207
208
|
# Body fills whatever the bands leave; packed last so it claims the middle.
|
|
208
209
|
self._body.pack(side="top", fill="both", expand=True)
|
|
210
|
+
self._recolor_show_slots()
|
|
209
211
|
|
|
210
212
|
def _relayout_body(self) -> None:
|
|
211
213
|
"""Re-pack the rail / sidebar / content / dock slots left-to-right."""
|
|
@@ -221,6 +223,35 @@ class ShellLayout(App):
|
|
|
221
223
|
self._content.pack(side="left", fill="both", expand=True)
|
|
222
224
|
if self._show_dock:
|
|
223
225
|
self._dock.pack(side="right", fill="y")
|
|
226
|
+
self._recolor_show_slots()
|
|
227
|
+
|
|
228
|
+
def _recolor_show_slots(self):
|
|
229
|
+
"""Repaint slots that just became visible after a theme change"""
|
|
230
|
+
if self._recolor_pending:
|
|
231
|
+
return
|
|
232
|
+
self._recolor_pending = True
|
|
233
|
+
|
|
234
|
+
def _recolor():
|
|
235
|
+
self._recolor_pending = False
|
|
236
|
+
from bootstack.style.style import get_style
|
|
237
|
+
style = get_style()
|
|
238
|
+
shown = [self._content]
|
|
239
|
+
if self._show_rail:
|
|
240
|
+
shown.append(self._rail)
|
|
241
|
+
if self._show_sidebar:
|
|
242
|
+
shown.append(self._sidebar)
|
|
243
|
+
if self._show_statusbar:
|
|
244
|
+
shown.append(self._statusbar)
|
|
245
|
+
for slot in shown:
|
|
246
|
+
try:
|
|
247
|
+
style.apply_theme_walk(slot, only_stale=True)
|
|
248
|
+
except TclError:
|
|
249
|
+
pass # destroyed between relayout and the idle callback
|
|
250
|
+
|
|
251
|
+
try:
|
|
252
|
+
self.after_idle(_recolor)
|
|
253
|
+
except (TclError, AttributeError):
|
|
254
|
+
pass
|
|
224
255
|
|
|
225
256
|
# ----- Region sizing -----
|
|
226
257
|
|
|
@@ -92,8 +92,7 @@ class Select(ValueSignalMixin, FieldAddonMixin, PublicWidgetBase):
|
|
|
92
92
|
# a decoupled option list hands the rule that option's real object -- and a
|
|
93
93
|
# `range` rule over numeric or date option values works. Declaring the
|
|
94
94
|
# mixin's `'text'` default here would reject it at attach time and break
|
|
95
|
-
# code that runs today; measured both ways
|
|
96
|
-
# `development/probe_465_select_range_kind.py`.
|
|
95
|
+
# code that runs today; measured both ways.
|
|
97
96
|
_VALIDATION_KIND: str | None = None
|
|
98
97
|
|
|
99
98
|
def __init__(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bootstack
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Build desktop GUI apps in pure Python and ship them as a standalone executable — built on Tk, no Tkinter boilerplate.
|
|
5
5
|
Author-email: Israel Dryer <israel.dryer@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-h-compact.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-h-default.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-v-compact.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-after-v-default.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-h-compact.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-h-default.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-v-compact.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-before-v-default.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-h-compact.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-h-default.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-v-compact.png
RENAMED
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/buttongroup-center-v-default.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bootstack-0.4.3 → bootstack-0.4.5}/src/bootstack/assets/elements/checkbox-indeterminate.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|