bootstack 0.1.0a14__tar.gz → 0.1.0a16__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.1.0a14/src/bootstack.egg-info → bootstack-0.1.0a16}/PKG-INFO +3 -3
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/README.md +2 -2
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/pyproject.toml +2 -2
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/__init__.py +2 -1
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/app.py +13 -1
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/toplevel.py +23 -3
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/utility.py +21 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/events/__init__.py +11 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/events/_payloads.py +50 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/images.py +3 -2
- bootstack-0.1.0a16/src/bootstack/signals/README.md +98 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/signals/signal.py +110 -102
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/menubutton.py +3 -1
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/utils.py +12 -3
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/scrollview.py +30 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +110 -58
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +145 -2
- bootstack-0.1.0a16/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +177 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +11 -2
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/toolbar.py +17 -14
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tooltip.py +15 -1
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/button.py +10 -1
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/codeeditor.py +163 -21
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/datatable.py +14 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/menubutton.py +23 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/scrollview.py +52 -2
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/spinnerfield.py +1 -1
- bootstack-0.1.0a16/src/bootstack/widgets/splash.py +367 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/splitview.py +61 -3
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/textarea.py +20 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/timefield.py +2 -2
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/toolbar.py +41 -18
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/tooltip.py +12 -2
- {bootstack-0.1.0a14 → bootstack-0.1.0a16/src/bootstack.egg-info}/PKG-INFO +3 -3
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack.egg-info/SOURCES.txt +2 -0
- bootstack-0.1.0a16/tests/test_events_doc_coverage.py +32 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/tests/test_images.py +27 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/tests/test_public_surface.py +1 -1
- bootstack-0.1.0a14/src/bootstack/signals/README.md +0 -112
- bootstack-0.1.0a14/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -87
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/LICENSE +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/MANIFEST.in +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/NOTICE +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/setup.cfg +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/__main__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/after.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/bind.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/bindtags.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/busy.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/clipboard.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/focus.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/grab.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/grid.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/localization.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/pack.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/place.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/selection.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/signals.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/capabilities/winfo.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/colorutils.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/exceptions.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/images.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/mixins/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/mixins/ttk_state.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/mixins/widget.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/paths.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/publisher.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_core/variables.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/base_window.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/events.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/shortcuts.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/tk_patch.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/visual_focus.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/_runtime/window_utilities.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/bootstack.ico +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/bootstack.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/badge-pill.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/badge-square.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/button-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/button-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/card.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/field.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/input-addon-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/input-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/input-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/list-item-separated.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/list-item.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/listrow-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/listrow-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/manifest.toml +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/menu-item.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/navitem-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/navitem-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/radiobutton.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/slider-handle.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/slider-track-h.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/slider-track-v.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/switch-off.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/switch-on.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/tab-h.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/elements/tab-v.png +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/icons/glyphmap.json +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/icons/icon_metrics.json +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/__main__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/add.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/appicon.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/build.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/config.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/demo.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/doctor.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/icons.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/promote.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/pyinstaller.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/run.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/start.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/cli/templates/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/clipboard.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/constants.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/README.md +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/_observable.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/base.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/file_source.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/memory_source.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/query.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/readers.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/sqlite_source.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/types.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/data/writers.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/_impl/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/_impl/colorchooser.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/_impl/datedialog.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/_impl/dialog.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/_impl/filterdialog.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/_impl/fontdialog.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/_impl/formdialog.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/_impl/message.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/dialogs/_impl/query.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/errors.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/events/_event.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/events/_subscription.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/i18n/README.md +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/i18n/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/i18n/catalog.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/i18n/intl_format.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/i18n/msgcat.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/i18n/specs.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/py.typed +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/scheduling/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/scheduling/_schedule.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/shortcuts.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/signals/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/signals/integration.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/signals/types.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/store.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/streams/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/streams/_stream.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/badge.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/button.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/buttongroup.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/calendar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/checkbutton.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/combobox.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/contextmenu.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/entry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/expander.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/field.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/frame.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/label.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/labelframe.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/listview.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/menubar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/panedwindow.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/progressbar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/radiobutton.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/scale.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/scrollbar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/separator.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/sidenav.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/sizegrip.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/spinbox.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/switch.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/tabitem.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/togglegroup.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/toolbutton.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/tooltip.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders/treeview.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders_tk/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/builders_tk/defaults.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/element.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/fonts.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/style.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/style_builder_base.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/style_builder_mixed.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/style_builder_tk.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/style_builder_ttk.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/style_resolver.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/theme.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/theme_provider.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/themes/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/tk_patch.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/token_maps.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/types.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/typography.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/style/utility.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/types.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/validation/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/validation/types.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/validation/validation_result.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/validation/validation_rules.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/app_config.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/base.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/container.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/context.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/events.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/field_mixin.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/image_binding.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/navmodel.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/options.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/selection_group.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/window_controls.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_core/window_menu.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/_parts/textentry_part.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/avatar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/buttongroup.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/calendar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/carousel.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/chart.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/compositeframe.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/contextmenu.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/field.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/form.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/gallery.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/list/listview.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/menu/model.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/meter.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/pagestack.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/passwordentry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/picture.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/selectbox.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/shell/content_host.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/shell/layout.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/shell/providers.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/shell/shell.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/shell/workspace.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/slider/_shared.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/slider/slider.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/spinnerentry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/core.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/filter.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/timeentry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/mixins/font_mixin.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/combobox.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/flexframe.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/frame.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/gridframe.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/packframe.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/app.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/appshell.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/avatar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/boolean_controls.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/buttongroup.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/calendar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/card.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/carousel.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/chart.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/contextmenu.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/datefield.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/divider.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/expander.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/form.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/gallery.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/gauge.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/grid.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/groupbox.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/label.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/listview.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/numberfield.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/pagestack.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/passwordfield.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/pathfield.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/picture.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/progressbar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/radio_variants.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/radiogroup.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/scrollbar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/select.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/selectbutton.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/sidebar_toggle.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/sizegrip.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/slider.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/spinbox.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/stacks.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/statusbar.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/tabs.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/textfield.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/theme_toggle.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/toast.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/togglegroup.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/tree.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/types.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack/widgets/window.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack.egg-info/dependency_links.txt +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack.egg-info/entry_points.txt +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack.egg-info/requires.txt +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/src/bootstack.egg-info/top_level.txt +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/tests/test_images_gui.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/tests/test_intl_format.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/tests/test_navmodel.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/tests/test_store.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/tests/test_theme_from_existing.py +0 -0
- {bootstack-0.1.0a14 → bootstack-0.1.0a16}/tests/test_validation_rules.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bootstack
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a16
|
|
4
4
|
Summary: From idea to a shipped desktop app, fast — a declarative, reactive, batteries-included Python UI framework with 60+ widgets, semantic theming, and built-in packaging.
|
|
5
5
|
Author-email: Israel Dryer <israel.dryer@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -223,7 +223,7 @@ app.run()
|
|
|
223
223
|
|
|
224
224
|
## Features
|
|
225
225
|
|
|
226
|
-
- **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, undecorated windows with custom chrome
|
|
226
|
+
- **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, `Splash` for a startup intro screen, undecorated windows with custom chrome
|
|
227
227
|
- **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
|
|
228
228
|
- **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
|
|
229
229
|
- **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
|
|
@@ -248,7 +248,7 @@ app.run()
|
|
|
248
248
|
| **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
|
|
249
249
|
| **Media** | Avatar, Picture, Gallery, Carousel |
|
|
250
250
|
| **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
|
|
251
|
-
| **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
|
|
251
|
+
| **Navigation** | AppShell, Workbench, Window, Splash, StatusBar, Tabs, PageStack |
|
|
252
252
|
| **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
|
|
253
253
|
| **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
|
|
254
254
|
| **Forms** | Form, with field-level validation |
|
|
@@ -173,7 +173,7 @@ app.run()
|
|
|
173
173
|
|
|
174
174
|
## Features
|
|
175
175
|
|
|
176
|
-
- **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, undecorated windows with custom chrome
|
|
176
|
+
- **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, `Splash` for a startup intro screen, undecorated windows with custom chrome
|
|
177
177
|
- **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
|
|
178
178
|
- **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
|
|
179
179
|
- **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
|
|
@@ -198,7 +198,7 @@ app.run()
|
|
|
198
198
|
| **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
|
|
199
199
|
| **Media** | Avatar, Picture, Gallery, Carousel |
|
|
200
200
|
| **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
|
|
201
|
-
| **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
|
|
201
|
+
| **Navigation** | AppShell, Workbench, Window, Splash, StatusBar, Tabs, PageStack |
|
|
202
202
|
| **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
|
|
203
203
|
| **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
|
|
204
204
|
| **Forms** | Form, with field-level validation |
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "bootstack"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.0a16"
|
|
8
8
|
description = "From idea to a shipped desktop app, fast — a declarative, reactive, batteries-included Python UI framework with 60+ widgets, semantic theming, and built-in packaging."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -109,7 +109,7 @@ where = ["src"]
|
|
|
109
109
|
]
|
|
110
110
|
|
|
111
111
|
[tool.bumpversion]
|
|
112
|
-
current_version = "0.1.
|
|
112
|
+
current_version = "0.1.0a16"
|
|
113
113
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
|
|
114
114
|
serialize = [
|
|
115
115
|
"{major}.{minor}.{patch}{pre}{pre_n}",
|
|
@@ -60,6 +60,7 @@ from bootstack.dialogs import (
|
|
|
60
60
|
from bootstack.widgets.app import App
|
|
61
61
|
from bootstack.widgets.appshell import AppShell, Workbench
|
|
62
62
|
from bootstack.widgets.window import Window
|
|
63
|
+
from bootstack.widgets.splash import Splash
|
|
63
64
|
|
|
64
65
|
# ── Public widget layer ───────────────────────────────────────────────────────
|
|
65
66
|
from bootstack.widgets.stacks import Row, Column, Spacer
|
|
@@ -130,7 +131,7 @@ __all__ = [
|
|
|
130
131
|
"ask_date_range", "ask_item", "ask_color", "ask_font", "ask_filter",
|
|
131
132
|
"ask_save_file", "ask_open_file", "ask_open_files", "ask_directory",
|
|
132
133
|
# Application & windows
|
|
133
|
-
"App", "AppShell", "Workbench", "Window",
|
|
134
|
+
"App", "AppShell", "Workbench", "Window", "Splash",
|
|
134
135
|
# Layout
|
|
135
136
|
"Row", "Column", "Spacer", "Grid", "Card", "GroupBox", "Divider", "ScrollView",
|
|
136
137
|
"SplitView", "SplitPane", "Accordion", "AccordionSection",
|
|
@@ -630,6 +630,10 @@ class App(BaseWindow, WidgetCapabilitiesMixin, tkinter.Tk):
|
|
|
630
630
|
if self._on_close_kwarg is not None:
|
|
631
631
|
self.add_close_handler(self._on_close_kwarg)
|
|
632
632
|
|
|
633
|
+
# A registered intro splash (bs.Splash), or None. Set by the splash on
|
|
634
|
+
# construction; read at reveal time to defer the app's own appearance.
|
|
635
|
+
self._splash: Any = None
|
|
636
|
+
|
|
633
637
|
def mainloop(self, n=0) -> None:
|
|
634
638
|
"""Start the application event loop
|
|
635
639
|
|
|
@@ -639,7 +643,13 @@ class App(BaseWindow, WidgetCapabilitiesMixin, tkinter.Tk):
|
|
|
639
643
|
"""
|
|
640
644
|
if self._center_on_screen:
|
|
641
645
|
self.place_window_center()
|
|
642
|
-
self
|
|
646
|
+
splash = getattr(self, "_splash", None)
|
|
647
|
+
if splash is not None and splash.is_showing:
|
|
648
|
+
# An intro splash is up — defer the app's reveal until it dismisses,
|
|
649
|
+
# then reveal via this callback (see Splash._notify_app_ready).
|
|
650
|
+
splash._notify_app_ready(self.show)
|
|
651
|
+
else:
|
|
652
|
+
self.show()
|
|
643
653
|
super().mainloop(n=n)
|
|
644
654
|
|
|
645
655
|
def _do_close(self) -> None:
|
|
@@ -694,10 +704,12 @@ class App(BaseWindow, WidgetCapabilitiesMixin, tkinter.Tk):
|
|
|
694
704
|
from bootstack.style.typography import Typography
|
|
695
705
|
from bootstack._core.images import _ImageService
|
|
696
706
|
from bootstack._runtime.visual_focus import reset_visual_focus_root
|
|
707
|
+
from bootstack.signals.signal import reset_realized_signals
|
|
697
708
|
reset_style()
|
|
698
709
|
Typography.reset()
|
|
699
710
|
_ImageService.clear_cache()
|
|
700
711
|
reset_visual_focus_root()
|
|
712
|
+
reset_realized_signals()
|
|
701
713
|
gc.collect()
|
|
702
714
|
except Exception:
|
|
703
715
|
pass
|
|
@@ -62,7 +62,13 @@ class Toplevel(BaseWindow, WidgetCapabilitiesMixin, tkinter.Toplevel):
|
|
|
62
62
|
resizable: Whether the user may resize the window as (x, y).
|
|
63
63
|
transient: Mark this window as transient for the given master.
|
|
64
64
|
overrideredirect: If True, instruct the window manager to ignore this window.
|
|
65
|
-
windowtype:
|
|
65
|
+
windowtype: Request a native window type, resolved per platform from a
|
|
66
|
+
single switch. Values: `'splash'`, `'tooltip'`, `'dock'`, `'utility'`.
|
|
67
|
+
On X11 it sets `-type`; on macOS it maps to a `MacWindowStyle`; on
|
|
68
|
+
Windows the chromeless types (`'splash'`/`'tooltip'`/`'dock'`) resolve
|
|
69
|
+
to override-redirect (borderless, no taskbar button) and `'utility'`
|
|
70
|
+
resolves to a tool window. The caller does not also need to pass
|
|
71
|
+
`overrideredirect=True` to get a chromeless window on Windows.
|
|
66
72
|
topmost: If True, keep this window above others (`-topmost`).
|
|
67
73
|
toolwindow: On Windows, request a toolwindow style (`-toolwindow`).
|
|
68
74
|
alpha: On Windows, the window alpha transparency (0.0–1.0) via `-alpha`.
|
|
@@ -124,6 +130,20 @@ class Toplevel(BaseWindow, WidgetCapabilitiesMixin, tkinter.Toplevel):
|
|
|
124
130
|
except tkinter.TclError:
|
|
125
131
|
pass
|
|
126
132
|
|
|
133
|
+
# Windows has no native window-type attribute, so translate windowtype
|
|
134
|
+
# to the matching primitive: the chromeless types resolve to
|
|
135
|
+
# override-redirect (borderless + no taskbar/Alt-Tab button), and
|
|
136
|
+
# 'utility' resolves to a tool window (minimal chrome). One switch then
|
|
137
|
+
# yields the right native window on all three platforms. (On Aqua the
|
|
138
|
+
# overrideredirect call is a no-op — MacWindowStyle handled it above.)
|
|
139
|
+
_effective_overrideredirect = overrideredirect
|
|
140
|
+
_effective_toolwindow = toolwindow
|
|
141
|
+
if windowtype is not None and self.winsys == "win32":
|
|
142
|
+
if windowtype in ("splash", "tooltip", "dock"):
|
|
143
|
+
_effective_overrideredirect = True
|
|
144
|
+
elif windowtype == "utility":
|
|
145
|
+
_effective_toolwindow = True
|
|
146
|
+
|
|
127
147
|
# Setup icon (use default bootstack icon if no icon provided)
|
|
128
148
|
self._setup_icon(icon, default_icon_enabled=True)
|
|
129
149
|
|
|
@@ -169,7 +189,7 @@ class Toplevel(BaseWindow, WidgetCapabilitiesMixin, tkinter.Toplevel):
|
|
|
169
189
|
maxsize=maxsize,
|
|
170
190
|
resizable=resizable,
|
|
171
191
|
transient=_resolved_transient,
|
|
172
|
-
overrideredirect=
|
|
192
|
+
overrideredirect=_effective_overrideredirect,
|
|
173
193
|
alpha=alpha,
|
|
174
194
|
window_style=window_style,
|
|
175
195
|
center_on_parent=_center_parent,
|
|
@@ -188,7 +208,7 @@ class Toplevel(BaseWindow, WidgetCapabilitiesMixin, tkinter.Toplevel):
|
|
|
188
208
|
if topmost:
|
|
189
209
|
self.attributes("-topmost", 1)
|
|
190
210
|
|
|
191
|
-
if
|
|
211
|
+
if _effective_toolwindow and self.winsys == "win32":
|
|
192
212
|
self.attributes("-toolwindow", 1)
|
|
193
213
|
|
|
194
214
|
# Register on_close handler
|
|
@@ -247,6 +247,27 @@ def scale_padding_floor(base: int) -> int:
|
|
|
247
247
|
return max(base, round(base * _ScalingState.get_ui_scale()))
|
|
248
248
|
|
|
249
249
|
|
|
250
|
+
def scale_icon_size(base: int) -> int:
|
|
251
|
+
"""Scale a logical icon size to physical pixels for the current DPI.
|
|
252
|
+
|
|
253
|
+
Icons are authored at logical (96-DPI) sizes. On a higher-DPI display the
|
|
254
|
+
surrounding fonts and layout scale up via Tk scaling, so an icon rendered at
|
|
255
|
+
its literal logical size lands too small for its container and gets resampled
|
|
256
|
+
by the display, reading as soft (#267). Rendering at the physical size makes
|
|
257
|
+
the glyph land 1:1 in the scaled layout, so it stays crisp.
|
|
258
|
+
|
|
259
|
+
Floors at `base` (mirrors `scale_padding_floor`) so an uninitialized scale
|
|
260
|
+
state or a sub-baseline display never renders an icon smaller than requested.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
base: The logical icon size in pixels at standard (96-DPI) scaling.
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
The DPI-scaled size, at least `base`.
|
|
267
|
+
"""
|
|
268
|
+
return max(base, round(base * _ScalingState.get_ui_scale()))
|
|
269
|
+
|
|
270
|
+
|
|
250
271
|
def scale_size(widget=None, size=None):
|
|
251
272
|
"""Scale the size based on the scaling factor of tkinter.
|
|
252
273
|
This is used most frequently to adjust the assets for
|
|
@@ -32,9 +32,13 @@ from bootstack.events._payloads import (
|
|
|
32
32
|
RangeSliderEvent,
|
|
33
33
|
RowEvent,
|
|
34
34
|
RowsEvent,
|
|
35
|
+
SashMoveEvent,
|
|
36
|
+
ScrollEvent,
|
|
35
37
|
SelectionEvent,
|
|
36
38
|
SliderCommitEvent,
|
|
37
39
|
SliderEvent,
|
|
40
|
+
SplashDismissEvent,
|
|
41
|
+
SplashDismissReason,
|
|
38
42
|
TabActivateEvent,
|
|
39
43
|
TabChangeEvent,
|
|
40
44
|
TabCloseEvent,
|
|
@@ -97,4 +101,11 @@ __all__ = [
|
|
|
97
101
|
# Payloads — data source
|
|
98
102
|
"DataChangeEvent",
|
|
99
103
|
"ChangeKind",
|
|
104
|
+
# Payloads — split view
|
|
105
|
+
"SashMoveEvent",
|
|
106
|
+
# Payloads — scroll view
|
|
107
|
+
"ScrollEvent",
|
|
108
|
+
# Payloads — splash
|
|
109
|
+
"SplashDismissEvent",
|
|
110
|
+
"SplashDismissReason",
|
|
100
111
|
]
|
|
@@ -487,3 +487,53 @@ class DataChangeEvent:
|
|
|
487
487
|
record: Mapping[str, Any] | None = None
|
|
488
488
|
"""The affected record (or the applied updates) where cheaply available on
|
|
489
489
|
`insert`/`update`; `None` otherwise."""
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
# ---------------------------------------------------------------------------
|
|
493
|
+
# SplitView
|
|
494
|
+
# ---------------------------------------------------------------------------
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
@dataclass(frozen=True, slots=True)
|
|
498
|
+
class SashMoveEvent:
|
|
499
|
+
"""Fires when a `SplitView` sash is released after being dragged."""
|
|
500
|
+
|
|
501
|
+
index: int = 0
|
|
502
|
+
"""Zero-based index of the sash that moved."""
|
|
503
|
+
|
|
504
|
+
position: int = 0
|
|
505
|
+
"""New pixel position of the sash in pixels from the leading edge."""
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
# ---------------------------------------------------------------------------
|
|
509
|
+
# ScrollView
|
|
510
|
+
# ---------------------------------------------------------------------------
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
@dataclass(frozen=True, slots=True)
|
|
514
|
+
class ScrollEvent:
|
|
515
|
+
"""Fires when a `ScrollView`'s viewport position changes."""
|
|
516
|
+
|
|
517
|
+
y: float = 0.0
|
|
518
|
+
"""Vertical scroll position — 0.0 (top) to 1.0 (bottom)."""
|
|
519
|
+
|
|
520
|
+
x: float = 0.0
|
|
521
|
+
"""Horizontal scroll position — 0.0 (left) to 1.0 (right)."""
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
# ---------------------------------------------------------------------------
|
|
525
|
+
# Splash
|
|
526
|
+
# ---------------------------------------------------------------------------
|
|
527
|
+
|
|
528
|
+
SplashDismissReason = Literal["ready", "timer", "manual", "skip"]
|
|
529
|
+
"""Why a splash screen dismissed — `'ready'` (the app finished building),
|
|
530
|
+
`'timer'` (its timed duration elapsed), `'manual'` (an explicit `dismiss()`),
|
|
531
|
+
or `'skip'` (the user clicked or pressed Escape)."""
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
@dataclass(frozen=True, slots=True)
|
|
535
|
+
class SplashDismissEvent:
|
|
536
|
+
"""Fires when a splash screen begins dismissing."""
|
|
537
|
+
|
|
538
|
+
reason: SplashDismissReason = "ready"
|
|
539
|
+
"""Why the splash dismissed."""
|
|
@@ -37,6 +37,7 @@ from pathlib import Path
|
|
|
37
37
|
from typing import TYPE_CHECKING
|
|
38
38
|
|
|
39
39
|
from bootstack._core.images import _ImageService
|
|
40
|
+
from bootstack._runtime.utility import scale_icon_size
|
|
40
41
|
|
|
41
42
|
if TYPE_CHECKING:
|
|
42
43
|
from PIL.Image import Image as _PILImage
|
|
@@ -248,7 +249,7 @@ class Image:
|
|
|
248
249
|
# every scroll doesn't re-render the glyph each time; dropped by
|
|
249
250
|
# _invalidate() on a theme change so token colors re-render.
|
|
250
251
|
if self._icon_pil is None:
|
|
251
|
-
size = self._icon.size
|
|
252
|
+
size = scale_icon_size(self._icon.size)
|
|
252
253
|
size = size if size % 2 == 0 else size + 1
|
|
253
254
|
self._icon_pil = _ImageService._render_icon(
|
|
254
255
|
self._icon.name, size, self._resolve_icon_color()
|
|
@@ -285,7 +286,7 @@ class Image:
|
|
|
285
286
|
return self._photo
|
|
286
287
|
if self._icon is not None:
|
|
287
288
|
color = self._resolve_icon_color()
|
|
288
|
-
photo = _ImageService.get_icon(self._icon.name, self._icon.size, color)
|
|
289
|
+
photo = _ImageService.get_icon(self._icon.name, scale_icon_size(self._icon.size), color)
|
|
289
290
|
elif self._path is not None:
|
|
290
291
|
photo = _ImageService.open(self._path)
|
|
291
292
|
elif self._data is not None:
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
Signals for bootstack
|
|
2
|
+
=====================
|
|
3
|
+
|
|
4
|
+
Lightweight reactive state. A ``Signal[T]`` holds a value, notifies subscribers
|
|
5
|
+
when it changes, and can be bound two-way to widgets. It is backed by a Tk
|
|
6
|
+
variable, but that variable is created lazily, so the Tk surface never leaks
|
|
7
|
+
into the public API.
|
|
8
|
+
|
|
9
|
+
> The user-facing guide is ``docs/reference/signals.rst`` (teaching) and the
|
|
10
|
+
> API Reference page for ``bootstack.signals`` (lookup). This README covers the
|
|
11
|
+
> package internals; keep it in sync with ``signal.py``.
|
|
12
|
+
|
|
13
|
+
Architecture
|
|
14
|
+
- ``Signal[T]`` (public): the reactive cell — ``signal()`` to read, ``set()`` to
|
|
15
|
+
write, ``subscribe()`` to observe, ``map()`` to derive.
|
|
16
|
+
- Lazy Tk-var realization: ``Signal(...)`` creates **no** Tk variable at
|
|
17
|
+
construction, so a signal can be created at module level (before any ``App``).
|
|
18
|
+
The backing variable is realized on first bind/escape-hatch access against the
|
|
19
|
+
running interpreter, and re-realized cleanly across ``App`` lifecycles.
|
|
20
|
+
- Object mode: values that are not Tk-native (anything other than
|
|
21
|
+
``bool``/``int``/``float``/``str``/``set`` — e.g. a ``date`` or a dataclass)
|
|
22
|
+
are held as the authoritative Python object; the Tk variable is used only as a
|
|
23
|
+
change-notification bus. Native values are stored in the Tk variable directly.
|
|
24
|
+
- ``_SignalTrace`` (internal): manages the Tcl variable trace
|
|
25
|
+
(``trace_add``/``trace_remove``).
|
|
26
|
+
|
|
27
|
+
Key behaviors
|
|
28
|
+
- Read / write: ``signal()`` returns the current value; ``signal.set(v)`` updates
|
|
29
|
+
it. A ``set()`` to an equal value is a no-op (no notification).
|
|
30
|
+
- Subscriptions: ``subscribe(callback, *, immediate=False)`` returns a
|
|
31
|
+
``streams.Handle``; call ``handle.cancel()`` to unsubscribe. ``immediate=True``
|
|
32
|
+
fires the callback once with the current value at subscribe time.
|
|
33
|
+
- Derived signals: ``map(transform)`` returns a new signal that follows this one.
|
|
34
|
+
A weak reference keeps the parent from holding the derived signal alive.
|
|
35
|
+
- Robustness: the last value is cached and returned even if the backing variable
|
|
36
|
+
has been dropped (e.g. between ``App`` lifecycles).
|
|
37
|
+
- Escape hatch: ``Signal.from_variable(tk_var)`` wraps an existing Tk variable,
|
|
38
|
+
and ``signal.var`` exposes the backing variable. These are the only Tk-aware
|
|
39
|
+
paths; everything else stays Tk-free.
|
|
40
|
+
|
|
41
|
+
Usage
|
|
42
|
+
1) Quick start (works at module level — no ``App`` required)
|
|
43
|
+
```python
|
|
44
|
+
from bootstack.signals import Signal
|
|
45
|
+
|
|
46
|
+
count = Signal(0)
|
|
47
|
+
print(count()) # -> 0
|
|
48
|
+
count.set(1)
|
|
49
|
+
print(count()) # -> 1
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
2) Two-way binding to a widget
|
|
53
|
+
```python
|
|
54
|
+
import bootstack as bs
|
|
55
|
+
|
|
56
|
+
with bs.App() as app:
|
|
57
|
+
name = bs.Signal("")
|
|
58
|
+
bs.TextField(textsignal=name) # edits flow into the signal
|
|
59
|
+
bs.Label(textsignal=name.map(lambda v: f"Hello, {v}!")) # derived display
|
|
60
|
+
app.run()
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
3) Subscribing and unsubscribing
|
|
64
|
+
```python
|
|
65
|
+
import bootstack as bs
|
|
66
|
+
|
|
67
|
+
with bs.App() as app:
|
|
68
|
+
flag = bs.Signal(False)
|
|
69
|
+
|
|
70
|
+
def on_flag(value):
|
|
71
|
+
print("flag:", value)
|
|
72
|
+
|
|
73
|
+
handle = flag.subscribe(on_flag, immediate=True) # prints: flag: False
|
|
74
|
+
flag.set(True) # prints: flag: True
|
|
75
|
+
handle.cancel() # stop observing
|
|
76
|
+
app.run()
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
4) Typed (object-mode) values
|
|
80
|
+
```python
|
|
81
|
+
from datetime import date
|
|
82
|
+
import bootstack as bs
|
|
83
|
+
|
|
84
|
+
with bs.App():
|
|
85
|
+
due = bs.Signal(date.today())
|
|
86
|
+
bs.DateField(signal=due) # binds the typed value
|
|
87
|
+
print(type(due())) # -> <class 'datetime.date'> (not str)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Import path
|
|
91
|
+
- ``import bootstack as bs; bs.Signal``
|
|
92
|
+
- ``from bootstack.signals import Signal``
|
|
93
|
+
|
|
94
|
+
Notes
|
|
95
|
+
- The UI toolkit is not thread-safe. Marshal cross-thread updates onto the UI
|
|
96
|
+
via the framework's scheduling, not by touching the signal from a worker
|
|
97
|
+
thread.
|
|
98
|
+
- Keep subscriber callbacks fast; offload long-running work.
|