bootstack 0.1.0a8__tar.gz → 0.1.0a9__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.0a8/src/bootstack.egg-info → bootstack-0.1.0a9}/PKG-INFO +1 -1
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/pyproject.toml +2 -2
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/datasource/README.md +7 -2
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/datasource/base.py +42 -6
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/datasource/memory_source.py +54 -12
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/datasource/sqlite_source.py +15 -3
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/datasource/types.py +40 -7
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/listview.py +4 -7
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/list/listitem.py +28 -46
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/list/listview.py +64 -359
- {bootstack-0.1.0a8 → bootstack-0.1.0a9/src/bootstack.egg-info}/PKG-INFO +1 -1
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/LICENSE +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/MANIFEST.in +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/NOTICE +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/README.md +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/setup.cfg +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/__main__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/app.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/constants.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/data.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/dialogs.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/i18n.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/localization.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/menu.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/style.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/utils.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/api/widgets.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/bootstack-dark.ico +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/bootstack-light.ico +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/bootstack-transparent.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/bootstack.ico +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/bootstack.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/badge-pill.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/badge-square.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/border.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-horizontal-after-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-horizontal-after-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-horizontal-before-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-horizontal-before-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-horizontal-center-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-horizontal-center-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-vertical-after-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-vertical-after-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-vertical-before-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-vertical-before-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-vertical-center-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/button-group-vertical-center-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/field.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/input-after-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/input-after-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/input-before-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/input-before-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/input-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/input-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/list-item-separated.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/list-item.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/manifest.toml +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/menu-item.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/nav-button-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/nav-button-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/nav-icon-button-compact.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/nav-icon-button-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/notebook-client-border.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/notebook-tab-active.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/notebook-tab-bar.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/notebook-tab-normal.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/notebook-tab-pill.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/progress-bar-horizontal-striped.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/progress-bar-solid.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/progress-bar-thin.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/progress-bar-vertical-striped.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/radio-selected.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/radio-unselected.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/slider-handle-focus.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/slider-handle.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/slider-track-horizontal.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/slider-track-vertical.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/switch-off.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/switch-on.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/tabs-bar-horizontal.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/tabs-bar-vertical.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/elements/tabs-pill.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/amber-dark.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/amber-light.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/aurora-dark.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/aurora-light.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/bootstrap-dark.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/bootstrap-light.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/classic-dark.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/classic-light.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/docs-dark.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/docs-light.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/forest-dark.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/forest-light.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/ocean-dark.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/ocean-light.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/rose-dark.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/themes/rose-light.json +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/badge-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/badge-pill.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/border.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/button-group-horizontal-after.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/button-group-horizontal-before.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/button-group-horizontal-center.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/button-group-vertical-after.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/button-group-vertical-before.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/button-group-vertical-center.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/button.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/checkbox-checked.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/checkbox-indeterminate.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/checkbox-unchecked.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/field.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/icon-button.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/input-inner.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/input-prefix.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/input-suffix.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/input.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/list-item-focus.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/list-item-separated.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/menu-item-separated.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/notebook-client-border.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/notebook-pill-active.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/notebook-pill-inactive.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/notebook-tab-active.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/notebook-tab-border.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/notebook-tab-normal.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/notebook-underline.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/progress-bar-horizontal-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/progress-bar-horizontal-striped.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/progress-bar-vertical-default.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/progress-bar-vertical-striped.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/progress-trough-horizontal.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/progress-trough-vertical.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/radio-selected.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/radio-unselected.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/scrollbar-horizontal-rounded.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/scrollbar-vertical-rounded.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/separator-horizontal.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/separator-vertical.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/slider-handle-focus.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/slider-handle.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/slider-track-horizontal.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/slider-track-vertical.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/switch-off.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/switch-on.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/tabs-bar-horizontal.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/tabs-bar-vertical.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/assets/widgets/tabs-pill.png +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/__main__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/add.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/build.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/config.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/demo.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/doctor.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/icons.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/list_cmd.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/promote.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/pyinstaller.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/run.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/start.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/cli/templates/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/constants.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/after.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/bind.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/bindtags.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/busy.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/clipboard.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/focus.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/grab.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/grid.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/localization.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/pack.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/place.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/selection.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/signals.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/capabilities/winfo.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/colorutils.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/exceptions.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/images.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/localization/README.md +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/localization/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/localization/intl_format.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/localization/msgcat.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/localization/specs.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/mixins/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/mixins/ttk_state.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/mixins/widget.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/publisher.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/signals/README.md +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/signals/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/signals/integration.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/signals/signal.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/signals/types.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/validation/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/validation/types.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/validation/validation_result.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/validation/validation_rules.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/core/variables.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/datasource/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/datasource/file_source.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/colorchooser.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/colordropper.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/datedialog.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/dialog.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/filterdialog.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/fontdialog.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/formdialog.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/message.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/dialogs/query.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/py.typed +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/app.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/base_window.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/events.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/menu.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/shortcuts.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/tk_patch.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/toplevel.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/utility.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/visual_focus.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/runtime/window_utilities.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/bootstyle.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/bootstyle_builder_base.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/bootstyle_builder_mixed.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/bootstyle_builder_tk.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/bootstyle_builder_ttk.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/badge.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/button.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/buttongroup.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/calendar.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/checkbutton.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/combobox.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/contextmenu.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/entry.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/expander.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/field.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/frame.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/label.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/labelframe.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/menubar.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/menubutton.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/notebook.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/panedwindow.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/progressbar.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/radiobutton.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/scale.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/scrollbar.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/separator.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/sidenav.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/sizegrip.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/spinbox.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/switch.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/tabitem.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/toolbutton.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/tooltip.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/treeview.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders/utils.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders_tk/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/builders_tk/defaults.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/element.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/style.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/theme_provider.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/tk_patch.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/token_maps.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/types.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/typography.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/style/utility.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/themes/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/themes/standard.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/themes/user.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/accordion.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/appshell.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/buttongroup.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/calendar.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/compositeframe.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/contextmenu.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/dateentry.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/dropdownbutton.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/expander.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/field.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/floodgauge.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/form.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/labeledscale.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/list/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/menubar.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/meter.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/numericentry.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/pagestack.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/passwordentry.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/pathentry.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/radiogroup.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/scrolledtext.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/scrolledtext.pyi +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/scrollview.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/selectbox.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/sidenav/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/sidenav/group.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/sidenav/header.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/sidenav/item.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/sidenav/separator.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/sidenav/view.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/spinnerentry.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/tableview/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/tableview/tableview.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/tableview/types.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/tabs/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/tabs/tabitem.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/tabs/tabs.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/tabs/tabview.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/textentry.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/timeentry.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/toast.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/togglegroup.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/toolbar.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/composites/tooltip.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/internal/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/internal/wrapper_base.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/mixins/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/mixins/configure_mixin.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/mixins/entry_mixin.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/mixins/font_mixin.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/mixins/icon_mixin.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/mixins/localization_mixin.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/mixins/signal_mixin.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/mixins/validation_mixin.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/parts/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/parts/numberentry_part.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/parts/spinnerentry_part.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/parts/textentry_part.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/__init__.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/badge.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/button.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/card.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/checkbutton.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/checktoggle.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/combobox.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/entry.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/frame.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/gridframe.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/label.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/labelframe.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/menubutton.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/notebook.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/optionmenu.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/packframe.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/panedwindow.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/progressbar.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/radiobutton.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/radiotoggle.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/scale.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/scrollbar.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/separator.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/sizegrip.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/spinbox.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/switch.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/primitives/treeview.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack/widgets/types.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack.egg-info/SOURCES.txt +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack.egg-info/dependency_links.txt +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack.egg-info/entry_points.txt +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack.egg-info/requires.txt +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/src/bootstack.egg-info/top_level.txt +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/tests/test_togglegroup.py +0 -0
- {bootstack-0.1.0a8 → bootstack-0.1.0a9}/tests/test_variables.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.0a9
|
|
4
4
|
Summary: A full UI framework for Python desktop apps built on tkinter — rich widgets, theming, and application structure out of the box.
|
|
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.1.
|
|
7
|
+
version = "0.1.0a9"
|
|
8
8
|
description = "A full UI framework for Python desktop apps built on tkinter — rich widgets, theming, and application structure out of the box."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -82,7 +82,7 @@ where = ["src"]
|
|
|
82
82
|
]
|
|
83
83
|
|
|
84
84
|
[tool.bumpversion]
|
|
85
|
-
current_version = "0.1.
|
|
85
|
+
current_version = "0.1.0a9"
|
|
86
86
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
|
|
87
87
|
serialize = [
|
|
88
88
|
"{major}.{minor}.{patch}{pre}{pre_n}",
|
|
@@ -333,13 +333,18 @@ class AuditedDataSource(BaseDataSource):
|
|
|
333
333
|
- `delete_record(record_id)` - Delete record by ID
|
|
334
334
|
|
|
335
335
|
#### Selection Management
|
|
336
|
+
- `is_selected(record_id)` - Check whether a record is selected
|
|
336
337
|
- `select_record(record_id)` - Mark record as selected
|
|
337
|
-
- `
|
|
338
|
+
- `deselect_record(record_id)` - Unmark record
|
|
338
339
|
- `select_all(current_page_only=False)` - Select all/page records
|
|
339
|
-
- `
|
|
340
|
+
- `deselect_all(current_page_only=False)` - Deselect all/page records
|
|
340
341
|
- `get_selected(page=None)` - Get selected records
|
|
341
342
|
- `selected_count()` - Count selected records
|
|
342
343
|
|
|
344
|
+
#### Lifecycle / reorder
|
|
345
|
+
- `reload()` - Re-read from source (no-op for in-memory)
|
|
346
|
+
- `move_record(record_id, target_index)` - Reorder a record
|
|
347
|
+
|
|
343
348
|
#### Export
|
|
344
349
|
- `export_to_csv(filepath, include_all=True)` - Export to CSV
|
|
345
350
|
|
|
@@ -194,6 +194,18 @@ class BaseDataSource(ABC):
|
|
|
194
194
|
...
|
|
195
195
|
|
|
196
196
|
# Selection Management
|
|
197
|
+
@abstractmethod
|
|
198
|
+
def is_selected(self, record_id: Any) -> bool:
|
|
199
|
+
"""Check whether a record is currently selected.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
record_id: Unique identifier of the record
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
True if the record is selected, False otherwise (including missing records)
|
|
206
|
+
"""
|
|
207
|
+
...
|
|
208
|
+
|
|
197
209
|
@abstractmethod
|
|
198
210
|
def select_record(self, record_id: Any) -> bool:
|
|
199
211
|
"""Mark record as selected.
|
|
@@ -207,14 +219,14 @@ class BaseDataSource(ABC):
|
|
|
207
219
|
...
|
|
208
220
|
|
|
209
221
|
@abstractmethod
|
|
210
|
-
def
|
|
222
|
+
def deselect_record(self, record_id: Any) -> bool:
|
|
211
223
|
"""Mark record as unselected.
|
|
212
224
|
|
|
213
225
|
Args:
|
|
214
226
|
record_id: Unique identifier of the record
|
|
215
227
|
|
|
216
228
|
Returns:
|
|
217
|
-
True if record was
|
|
229
|
+
True if record was deselected, False if not found
|
|
218
230
|
"""
|
|
219
231
|
...
|
|
220
232
|
|
|
@@ -231,14 +243,14 @@ class BaseDataSource(ABC):
|
|
|
231
243
|
...
|
|
232
244
|
|
|
233
245
|
@abstractmethod
|
|
234
|
-
def
|
|
235
|
-
"""
|
|
246
|
+
def deselect_all(self, current_page_only: bool = False) -> int:
|
|
247
|
+
"""Deselect all records (optionally only current page).
|
|
236
248
|
|
|
237
249
|
Args:
|
|
238
|
-
current_page_only: If True,
|
|
250
|
+
current_page_only: If True, deselect only records on current page
|
|
239
251
|
|
|
240
252
|
Returns:
|
|
241
|
-
Number of records
|
|
253
|
+
Number of records deselected
|
|
242
254
|
"""
|
|
243
255
|
...
|
|
244
256
|
|
|
@@ -288,6 +300,30 @@ class BaseDataSource(ABC):
|
|
|
288
300
|
"""
|
|
289
301
|
...
|
|
290
302
|
|
|
303
|
+
# Lifecycle / reorder — concrete defaults; subclasses may override
|
|
304
|
+
def reload(self) -> None:
|
|
305
|
+
"""Re-read data from the underlying source.
|
|
306
|
+
|
|
307
|
+
Default is a no-op suitable for in-memory implementations.
|
|
308
|
+
File- and database-backed sources should override to re-query.
|
|
309
|
+
"""
|
|
310
|
+
return None
|
|
311
|
+
|
|
312
|
+
def move_record(self, record_id: Any, target_index: int) -> bool:
|
|
313
|
+
"""Reorder a record to a new position.
|
|
314
|
+
|
|
315
|
+
Default returns False (not supported). Subclasses that maintain
|
|
316
|
+
an explicit ordering should override.
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
record_id: Unique identifier of the record to move
|
|
320
|
+
target_index: Zero-based destination index (clamped to valid range)
|
|
321
|
+
|
|
322
|
+
Returns:
|
|
323
|
+
True if the record was moved, False if not supported or not found
|
|
324
|
+
"""
|
|
325
|
+
return False
|
|
326
|
+
|
|
291
327
|
# ========== SHARED UTILITY METHODS ==========
|
|
292
328
|
|
|
293
329
|
@staticmethod
|
|
@@ -108,18 +108,29 @@ class MemoryDataSource(BaseDataSource):
|
|
|
108
108
|
r.setdefault("selected", 0)
|
|
109
109
|
|
|
110
110
|
def _ensure_id(self) -> None:
|
|
111
|
-
"""Ensure all records have unique integer IDs.
|
|
112
|
-
|
|
111
|
+
"""Ensure all records have unique integer IDs.
|
|
112
|
+
|
|
113
|
+
Records whose `id` is already an int and not a duplicate are
|
|
114
|
+
preserved as-is. Records with missing, non-integer, or duplicate
|
|
115
|
+
IDs get a freshly-allocated integer ID.
|
|
116
|
+
"""
|
|
117
|
+
used: set[int] = set()
|
|
118
|
+
needs_id: list[Dict[str, Any]] = []
|
|
113
119
|
max_id = 0
|
|
114
120
|
for r in self._data:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
121
|
+
rid = r.get("id")
|
|
122
|
+
if isinstance(rid, int) and rid not in used:
|
|
123
|
+
used.add(rid)
|
|
124
|
+
if rid > max_id:
|
|
125
|
+
max_id = rid
|
|
126
|
+
else:
|
|
127
|
+
needs_id.append(r)
|
|
128
|
+
for r in needs_id:
|
|
129
|
+
max_id += 1
|
|
130
|
+
while max_id in used:
|
|
120
131
|
max_id += 1
|
|
121
|
-
|
|
122
|
-
|
|
132
|
+
r["id"] = max_id
|
|
133
|
+
used.add(max_id)
|
|
123
134
|
self._rebuild_id_index()
|
|
124
135
|
|
|
125
136
|
@staticmethod
|
|
@@ -389,11 +400,18 @@ class MemoryDataSource(BaseDataSource):
|
|
|
389
400
|
self._rebuild_id_index()
|
|
390
401
|
return True
|
|
391
402
|
|
|
403
|
+
def is_selected(self, record_id: Any) -> bool:
|
|
404
|
+
"""Check whether a record is currently selected."""
|
|
405
|
+
idx = self._id_index.get(record_id)
|
|
406
|
+
if idx is None:
|
|
407
|
+
return False
|
|
408
|
+
return bool(self._data[idx].get("selected", 0))
|
|
409
|
+
|
|
392
410
|
def select_record(self, record_id: Any) -> bool:
|
|
393
411
|
"""Mark record as selected."""
|
|
394
412
|
return self._set_selected_flag(record_id, 1)
|
|
395
413
|
|
|
396
|
-
def
|
|
414
|
+
def deselect_record(self, record_id: Any) -> bool:
|
|
397
415
|
"""Mark record as unselected."""
|
|
398
416
|
return self._set_selected_flag(record_id, 0)
|
|
399
417
|
|
|
@@ -417,8 +435,8 @@ class MemoryDataSource(BaseDataSource):
|
|
|
417
435
|
count += 1
|
|
418
436
|
return count
|
|
419
437
|
|
|
420
|
-
def
|
|
421
|
-
"""
|
|
438
|
+
def deselect_all(self, current_page_only: bool = False) -> int:
|
|
439
|
+
"""Deselect all records (optionally only current page)."""
|
|
422
440
|
self._ensure_selected_column()
|
|
423
441
|
if current_page_only:
|
|
424
442
|
ids = [r["id"] for r in self.get_page()]
|
|
@@ -437,6 +455,30 @@ class MemoryDataSource(BaseDataSource):
|
|
|
437
455
|
count += 1
|
|
438
456
|
return count
|
|
439
457
|
|
|
458
|
+
def move_record(self, record_id: Any, target_index: int) -> bool:
|
|
459
|
+
"""Reorder a record within the in-memory list."""
|
|
460
|
+
if not self._data:
|
|
461
|
+
return False
|
|
462
|
+
|
|
463
|
+
source_index = self._id_index.get(record_id)
|
|
464
|
+
if source_index is None:
|
|
465
|
+
return False
|
|
466
|
+
|
|
467
|
+
clamped_target = max(0, min(int(target_index), len(self._data) - 1))
|
|
468
|
+
if source_index == clamped_target:
|
|
469
|
+
return False
|
|
470
|
+
|
|
471
|
+
record = self._data.pop(source_index)
|
|
472
|
+
if clamped_target > source_index:
|
|
473
|
+
clamped_target -= 1
|
|
474
|
+
self._data.insert(clamped_target, record)
|
|
475
|
+
|
|
476
|
+
start = min(source_index, clamped_target)
|
|
477
|
+
end = max(source_index, clamped_target) + 1
|
|
478
|
+
for i in range(start, end):
|
|
479
|
+
self._id_index[self._data[i]["id"]] = i
|
|
480
|
+
return True
|
|
481
|
+
|
|
440
482
|
def _set_selected_flag(self, record_id: Any, flag: int) -> bool:
|
|
441
483
|
"""Set selection flag for record by ID."""
|
|
442
484
|
self._ensure_selected_column()
|
|
@@ -330,11 +330,23 @@ class SqliteDataSource(BaseDataSource):
|
|
|
330
330
|
|
|
331
331
|
# === SELECTION ====
|
|
332
332
|
|
|
333
|
+
def is_selected(self, record_id: Any) -> bool:
|
|
334
|
+
"""Check whether a record is currently selected."""
|
|
335
|
+
if _ROW_SEL not in self._columns:
|
|
336
|
+
return False
|
|
337
|
+
row = self.conn.execute(
|
|
338
|
+
f"SELECT {_ROW_SEL} FROM {self._table} WHERE {_ROW_ID} = ?",
|
|
339
|
+
(record_id,),
|
|
340
|
+
).fetchone()
|
|
341
|
+
if row is None:
|
|
342
|
+
return False
|
|
343
|
+
return bool(row[0])
|
|
344
|
+
|
|
333
345
|
def select_record(self, record_id: Any) -> bool:
|
|
334
346
|
"""Mark record as selected."""
|
|
335
347
|
return self._set_selected_flag(record_id, 1)
|
|
336
348
|
|
|
337
|
-
def
|
|
349
|
+
def deselect_record(self, record_id: Any) -> bool:
|
|
338
350
|
"""Mark record as unselected."""
|
|
339
351
|
return self._set_selected_flag(record_id, 0)
|
|
340
352
|
|
|
@@ -355,8 +367,8 @@ class SqliteDataSource(BaseDataSource):
|
|
|
355
367
|
cur = self.conn.execute(f"UPDATE {self._table} SET {_ROW_SEL} = 1")
|
|
356
368
|
return cur.rowcount
|
|
357
369
|
|
|
358
|
-
def
|
|
359
|
-
"""
|
|
370
|
+
def deselect_all(self, current_page_only: bool = False) -> int:
|
|
371
|
+
"""Deselect all records (optionally only current page)."""
|
|
360
372
|
self._ensure_selected_column()
|
|
361
373
|
if current_page_only:
|
|
362
374
|
ids = [row[_ROW_ID] for row in self.get_page()]
|
|
@@ -7,9 +7,10 @@ The DataSourceProtocol provides a unified interface for:
|
|
|
7
7
|
- Data loading and configuration (set_data, set_filter, set_sort)
|
|
8
8
|
- Pagination (get_page, next_page, prev_page, has_next_page)
|
|
9
9
|
- CRUD operations (create, read, update, delete)
|
|
10
|
-
- Selection management (select/
|
|
10
|
+
- Selection management (is_selected, select/deselect records)
|
|
11
11
|
- Data export (CSV export)
|
|
12
12
|
- Index-based access (get_page_from_index)
|
|
13
|
+
- Lifecycle and reorder (reload, move_record)
|
|
13
14
|
|
|
14
15
|
All datasource implementations should conform to this protocol to ensure
|
|
15
16
|
compatibility with datasource-aware widgets and utilities.
|
|
@@ -172,6 +173,17 @@ class DataSourceProtocol(Protocol):
|
|
|
172
173
|
...
|
|
173
174
|
|
|
174
175
|
# ---------- selection ----------
|
|
176
|
+
def is_selected(self, record_id: Any) -> bool:
|
|
177
|
+
"""Check whether a record is currently selected.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
record_id: Unique identifier of the record
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
True if the record is selected, False otherwise (including missing records)
|
|
184
|
+
"""
|
|
185
|
+
...
|
|
186
|
+
|
|
175
187
|
def select_record(self, record_id: Any) -> bool:
|
|
176
188
|
"""Mark record as selected.
|
|
177
189
|
|
|
@@ -183,14 +195,14 @@ class DataSourceProtocol(Protocol):
|
|
|
183
195
|
"""
|
|
184
196
|
...
|
|
185
197
|
|
|
186
|
-
def
|
|
198
|
+
def deselect_record(self, record_id: Any) -> bool:
|
|
187
199
|
"""Mark record as unselected.
|
|
188
200
|
|
|
189
201
|
Args:
|
|
190
202
|
record_id: Unique identifier of the record
|
|
191
203
|
|
|
192
204
|
Returns:
|
|
193
|
-
True if record was
|
|
205
|
+
True if record was deselected, False if not found
|
|
194
206
|
"""
|
|
195
207
|
...
|
|
196
208
|
|
|
@@ -205,14 +217,14 @@ class DataSourceProtocol(Protocol):
|
|
|
205
217
|
"""
|
|
206
218
|
...
|
|
207
219
|
|
|
208
|
-
def
|
|
209
|
-
"""
|
|
220
|
+
def deselect_all(self, current_page_only: bool = False) -> int:
|
|
221
|
+
"""Deselect all records (optionally only current page).
|
|
210
222
|
|
|
211
223
|
Args:
|
|
212
|
-
current_page_only: If True,
|
|
224
|
+
current_page_only: If True, deselect only records on current page
|
|
213
225
|
|
|
214
226
|
Returns:
|
|
215
|
-
Number of records
|
|
227
|
+
Number of records deselected
|
|
216
228
|
"""
|
|
217
229
|
...
|
|
218
230
|
|
|
@@ -235,6 +247,27 @@ class DataSourceProtocol(Protocol):
|
|
|
235
247
|
"""
|
|
236
248
|
...
|
|
237
249
|
|
|
250
|
+
# ---------- lifecycle / reorder ----------
|
|
251
|
+
def reload(self) -> None:
|
|
252
|
+
"""Re-read data from the underlying source.
|
|
253
|
+
|
|
254
|
+
For in-memory implementations this is typically a no-op. For
|
|
255
|
+
file- or database-backed sources, this re-queries or re-reads.
|
|
256
|
+
"""
|
|
257
|
+
...
|
|
258
|
+
|
|
259
|
+
def move_record(self, record_id: Any, target_index: int) -> bool:
|
|
260
|
+
"""Reorder a record to a new position.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
record_id: Unique identifier of the record to move
|
|
264
|
+
target_index: Zero-based destination index (clamped to valid range)
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
True if the record was moved, False if not supported or not found
|
|
268
|
+
"""
|
|
269
|
+
...
|
|
270
|
+
|
|
238
271
|
# ---------- export ----------
|
|
239
272
|
def export_to_csv(self, filepath: str, include_all: bool = True) -> None:
|
|
240
273
|
"""Export records to CSV file.
|
|
@@ -77,8 +77,8 @@ def build_list_item_style(
|
|
|
77
77
|
active_img = recolor_element_image(image_key, active, border_normal, active)
|
|
78
78
|
selected_img = recolor_element_image(image_key, selected, border_normal, indicator)
|
|
79
79
|
|
|
80
|
-
focus_img = recolor_element_image(image_key, active, border_normal,
|
|
81
|
-
focus_pressed_img = recolor_element_image(image_key, pressed, border_normal,
|
|
80
|
+
focus_img = recolor_element_image(image_key, active, border_normal, active)
|
|
81
|
+
focus_pressed_img = recolor_element_image(image_key, pressed, border_normal, pressed)
|
|
82
82
|
|
|
83
83
|
image_state_specs = [
|
|
84
84
|
('selected', selected_img.image),
|
|
@@ -173,13 +173,12 @@ def _list_icon_size(b: BootstyleBuilderTTk, density: str) -> int:
|
|
|
173
173
|
def build_list_icon(b: BootstyleBuilderTTk, ttk_style: str, accent: str = None, **options):
|
|
174
174
|
hoverable = options.get('hoverable', True)
|
|
175
175
|
surface_token = options.get('surface', 'content')
|
|
176
|
-
select_background_token = options.get('selected_background', 'primary')
|
|
177
176
|
density = normalize_button_density(options.get('density', 'default'))
|
|
178
177
|
|
|
179
178
|
background = b.color(surface_token)
|
|
180
179
|
active = b.elevate(background, 1)
|
|
181
180
|
pressed = b.pressed(background)
|
|
182
|
-
selected = b.subtle(
|
|
181
|
+
selected = b.subtle(accent or 'primary', background)
|
|
183
182
|
on_background = b.on_color(background)
|
|
184
183
|
on_selected = b.on_color(selected)
|
|
185
184
|
on_disabled = b.disabled('text', background)
|
|
@@ -236,19 +235,17 @@ def build_list_item_label(b: BootstyleBuilderTTk, ttk_style: str, accent: str =
|
|
|
236
235
|
|
|
237
236
|
Style Options
|
|
238
237
|
* surface
|
|
239
|
-
* selected_background
|
|
240
238
|
* hoverable
|
|
241
239
|
* foreground
|
|
242
240
|
"""
|
|
243
241
|
hoverable = options.get('hoverable', True)
|
|
244
242
|
surface_token = options.get('surface', 'content')
|
|
245
|
-
select_background_token = options.get('selected_background', 'primary')
|
|
246
243
|
foreground_token = options.get('foreground', None)
|
|
247
244
|
|
|
248
245
|
background = b.color(surface_token)
|
|
249
246
|
active = b.elevate(background, 1)
|
|
250
247
|
pressed = b.pressed(background)
|
|
251
|
-
selected = b.subtle(
|
|
248
|
+
selected = b.subtle(accent or 'primary', background)
|
|
252
249
|
on_selected = b.on_color(selected)
|
|
253
250
|
on_background = b.color(foreground_token) if foreground_token else b.on_color(background)
|
|
254
251
|
|
|
@@ -48,14 +48,12 @@ class ListItem(CompositeFrame):
|
|
|
48
48
|
Args:
|
|
49
49
|
master: Parent widget.
|
|
50
50
|
**kwargs: Additional keyword arguments:
|
|
51
|
-
focus_color (str): Color for the focus indicator. Defaults to None.
|
|
52
51
|
show_separator (bool): Show separator line below the item. Defaults to False.
|
|
53
52
|
show_chevron (bool): Show chevron indicator on the right. Defaults to False.
|
|
54
53
|
focusable (bool): Whether this item can receive keyboard focus. Defaults to True.
|
|
55
54
|
hoverable (bool): Whether this item shows hover state. Defaults to False.
|
|
56
55
|
draggable (bool): Whether this item can be dragged. Defaults to False.
|
|
57
56
|
removable (bool): Whether this item can be removed. Defaults to False.
|
|
58
|
-
selected_background (str): Background color when selected. Defaults to 'primary'.
|
|
59
57
|
selection_mode (str): Selection mode ('none', 'single', 'multi'). Defaults to 'none'.
|
|
60
58
|
show_selection_controls (bool): Show checkbox/radio button. Defaults to False.
|
|
61
59
|
select_on_click (bool): Whether clicking selects the item. Defaults to True
|
|
@@ -71,14 +69,15 @@ class ListItem(CompositeFrame):
|
|
|
71
69
|
self._drag_state = None
|
|
72
70
|
|
|
73
71
|
# configuration properties
|
|
74
|
-
self._focus_color = kwargs.pop('focus_color', None)
|
|
75
72
|
self._show_separator = kwargs.pop('show_separator', False)
|
|
76
73
|
self._show_chevron = kwargs.pop('show_chevron', False)
|
|
77
74
|
self._focusable = kwargs.pop('focusable', True)
|
|
78
75
|
self._hoverable = kwargs.pop('hoverable', False)
|
|
79
76
|
self._draggable = kwargs.pop('draggable', False)
|
|
80
77
|
self._removable = kwargs.pop('removable', False)
|
|
81
|
-
|
|
78
|
+
# Capture accent (pop) so super() doesn't get it twice, and we can pass it
|
|
79
|
+
# explicitly to super() below.
|
|
80
|
+
self._accent = kwargs.pop('accent', None) or 'primary'
|
|
82
81
|
self._selection_mode = kwargs.pop('selection_mode', 'none')
|
|
83
82
|
self._show_selection_controls = kwargs.pop('show_selection_controls', False)
|
|
84
83
|
self._density = kwargs.pop('density', 'default')
|
|
@@ -102,9 +101,8 @@ class ListItem(CompositeFrame):
|
|
|
102
101
|
takefocus=self._focusable,
|
|
103
102
|
ttk_class='ListView.TFrame',
|
|
104
103
|
padding=item_padding,
|
|
104
|
+
accent=self._accent,
|
|
105
105
|
style_options=dict(
|
|
106
|
-
selected_background=self._selected_background,
|
|
107
|
-
focus_color=self._focus_color,
|
|
108
106
|
hoverable=self._hoverable,
|
|
109
107
|
density=self._density
|
|
110
108
|
)
|
|
@@ -116,9 +114,8 @@ class ListItem(CompositeFrame):
|
|
|
116
114
|
variant='list',
|
|
117
115
|
ttk_class='ListView.TFrame',
|
|
118
116
|
takefocus=False,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
density=self._density)
|
|
117
|
+
accent=self._accent,
|
|
118
|
+
style_options=dict(hoverable=self._hoverable, density=self._density)
|
|
122
119
|
)
|
|
123
120
|
self._left_frame.pack(side='left')
|
|
124
121
|
|
|
@@ -127,9 +124,8 @@ class ListItem(CompositeFrame):
|
|
|
127
124
|
variant='list',
|
|
128
125
|
ttk_class='ListView.TFrame',
|
|
129
126
|
takefocus=False,
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
density=self._density)
|
|
127
|
+
accent=self._accent,
|
|
128
|
+
style_options=dict(hoverable=self._hoverable, density=self._density)
|
|
133
129
|
)
|
|
134
130
|
self._center_frame.pack(side='left', fill='x', expand=True)
|
|
135
131
|
|
|
@@ -138,9 +134,8 @@ class ListItem(CompositeFrame):
|
|
|
138
134
|
variant='list',
|
|
139
135
|
ttk_class='ListView.TFrame',
|
|
140
136
|
takefocus=False,
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
density=self._density)
|
|
137
|
+
accent=self._accent,
|
|
138
|
+
style_options=dict(hoverable=self._hoverable, density=self._density)
|
|
144
139
|
)
|
|
145
140
|
self._right_frame.pack(side='left')
|
|
146
141
|
|
|
@@ -268,9 +263,8 @@ class ListItem(CompositeFrame):
|
|
|
268
263
|
variant='icon',
|
|
269
264
|
ttk_class='ListView.TLabel',
|
|
270
265
|
icon_only=True,
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
density=self._density),
|
|
266
|
+
accent=self._accent,
|
|
267
|
+
style_options=dict(hoverable=self._hoverable, density=self._density),
|
|
274
268
|
takefocus=False,
|
|
275
269
|
)
|
|
276
270
|
if self._show_selection_controls:
|
|
@@ -301,9 +295,8 @@ class ListItem(CompositeFrame):
|
|
|
301
295
|
ttk_class='ListView.TLabel',
|
|
302
296
|
takefocus=False,
|
|
303
297
|
icon_only=True,
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
density=self._density),
|
|
298
|
+
accent=self._accent,
|
|
299
|
+
style_options=dict(hoverable=self._hoverable, density=self._density),
|
|
307
300
|
)
|
|
308
301
|
self._icon_widget.pack(side='left', padx=5)
|
|
309
302
|
self.register_composite(self._icon_widget)
|
|
@@ -332,9 +325,8 @@ class ListItem(CompositeFrame):
|
|
|
332
325
|
variant='list',
|
|
333
326
|
ttk_class='ListView.TLabel',
|
|
334
327
|
takefocus=False,
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
density=self._density),
|
|
328
|
+
accent=self._accent,
|
|
329
|
+
style_options=dict(hoverable=self._hoverable, density=self._density),
|
|
338
330
|
)
|
|
339
331
|
self._title_widget.pack(side='top', fill='x', anchor='w', padx=(0, 3))
|
|
340
332
|
self.register_composite(self._title_widget)
|
|
@@ -363,9 +355,8 @@ class ListItem(CompositeFrame):
|
|
|
363
355
|
variant='list',
|
|
364
356
|
ttk_class='ListView.TLabel',
|
|
365
357
|
takefocus=False,
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
density=self._density),
|
|
358
|
+
accent=self._accent,
|
|
359
|
+
style_options=dict(hoverable=self._hoverable, density=self._density),
|
|
369
360
|
)
|
|
370
361
|
self._text_widget.pack(side='top', fill='x', padx=(0, 3))
|
|
371
362
|
self.register_composite(self._text_widget)
|
|
@@ -405,9 +396,8 @@ class ListItem(CompositeFrame):
|
|
|
405
396
|
variant='list',
|
|
406
397
|
ttk_class='ListView.TLabel',
|
|
407
398
|
takefocus=False,
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
density=self._density),
|
|
399
|
+
accent=self._accent,
|
|
400
|
+
style_options=dict(hoverable=self._hoverable, density=self._density),
|
|
411
401
|
)
|
|
412
402
|
self._caption_widget.pack(side='top', fill='x', padx=(0, 3))
|
|
413
403
|
self.register_composite(self._caption_widget)
|
|
@@ -432,9 +422,8 @@ class ListItem(CompositeFrame):
|
|
|
432
422
|
text=text,
|
|
433
423
|
variant='list',
|
|
434
424
|
ttk_class='ListView.TLabel',
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
density=self._density),
|
|
425
|
+
accent=self._accent,
|
|
426
|
+
style_options=dict(hoverable=self._hoverable, density=self._density),
|
|
438
427
|
)
|
|
439
428
|
self._badge_widget.pack(side='right', padx=6)
|
|
440
429
|
self.register_composite(self._badge_widget)
|
|
@@ -461,9 +450,8 @@ class ListItem(CompositeFrame):
|
|
|
461
450
|
variant='icon',
|
|
462
451
|
ttk_class='ListView.TButton',
|
|
463
452
|
takefocus=False,
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
density=self._density),
|
|
453
|
+
accent=self._accent,
|
|
454
|
+
style_options=dict(hoverable=self._hoverable, density=self._density),
|
|
467
455
|
)
|
|
468
456
|
self._chevron_widget.pack(side='right', padx=6)
|
|
469
457
|
self.register_composite(self._chevron_widget)
|
|
@@ -489,9 +477,8 @@ class ListItem(CompositeFrame):
|
|
|
489
477
|
ttk_class='ListView.TButton',
|
|
490
478
|
takefocus=False,
|
|
491
479
|
command=self.remove,
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
density=self._density),
|
|
480
|
+
accent=self._accent,
|
|
481
|
+
style_options=dict(hoverable=self._hoverable, density=self._density),
|
|
495
482
|
)
|
|
496
483
|
self._remove_widget.pack(side='right', padx=6)
|
|
497
484
|
self.register_composite(self._remove_widget)
|
|
@@ -517,9 +504,8 @@ class ListItem(CompositeFrame):
|
|
|
517
504
|
ttk_class='ListView.TButton',
|
|
518
505
|
cursor='fleur',
|
|
519
506
|
takefocus=False,
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
density=self._density),
|
|
507
|
+
accent=self._accent,
|
|
508
|
+
style_options=dict(hoverable=self._hoverable, density=self._density),
|
|
523
509
|
)
|
|
524
510
|
self._drag_widget.pack(side='right', padx=6)
|
|
525
511
|
|
|
@@ -626,10 +612,6 @@ class ListItem(CompositeFrame):
|
|
|
626
612
|
self._get_selection_icon()
|
|
627
613
|
self._update_selection(False)
|
|
628
614
|
|
|
629
|
-
@configure_delegate('selected_background')
|
|
630
|
-
def _delegate_selected_background(self, value=None):
|
|
631
|
-
self._selected_background = value
|
|
632
|
-
|
|
633
615
|
@configure_delegate('show_chevron')
|
|
634
616
|
def _delegate_show_chevron(self, value=None):
|
|
635
617
|
self._show_chevron = value
|