bootstack 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bootstack/__init__.py +157 -0
- bootstack/__main__.py +5 -0
- bootstack/_core/__init__.py +21 -0
- bootstack/_core/capabilities/__init__.py +45 -0
- bootstack/_core/capabilities/after.py +103 -0
- bootstack/_core/capabilities/bind.py +192 -0
- bootstack/_core/capabilities/bindtags.py +112 -0
- bootstack/_core/capabilities/busy.py +72 -0
- bootstack/_core/capabilities/clipboard.py +89 -0
- bootstack/_core/capabilities/focus.py +118 -0
- bootstack/_core/capabilities/grab.py +65 -0
- bootstack/_core/capabilities/grid.py +211 -0
- bootstack/_core/capabilities/localization.py +231 -0
- bootstack/_core/capabilities/pack.py +140 -0
- bootstack/_core/capabilities/place.py +113 -0
- bootstack/_core/capabilities/selection.py +136 -0
- bootstack/_core/capabilities/signals.py +244 -0
- bootstack/_core/capabilities/winfo.py +315 -0
- bootstack/_core/colorutils.py +234 -0
- bootstack/_core/exceptions.py +25 -0
- bootstack/_core/images.py +463 -0
- bootstack/_core/mixins/__init__.py +1 -0
- bootstack/_core/mixins/ttk_state.py +35 -0
- bootstack/_core/mixins/widget.py +132 -0
- bootstack/_core/paths.py +49 -0
- bootstack/_core/publisher.py +149 -0
- bootstack/_core/variables.py +62 -0
- bootstack/_runtime/__init__.py +3 -0
- bootstack/_runtime/app.py +930 -0
- bootstack/_runtime/base_window.py +945 -0
- bootstack/_runtime/events.py +399 -0
- bootstack/_runtime/shortcuts.py +496 -0
- bootstack/_runtime/tk_patch.py +43 -0
- bootstack/_runtime/toplevel.py +276 -0
- bootstack/_runtime/utility.py +457 -0
- bootstack/_runtime/visual_focus.py +240 -0
- bootstack/_runtime/window_utilities.py +1123 -0
- bootstack/assets/__init__.py +21 -0
- bootstack/assets/bootstack.ico +0 -0
- bootstack/assets/bootstack.png +0 -0
- bootstack/assets/elements/__init__.py +0 -0
- bootstack/assets/elements/badge-pill.png +0 -0
- bootstack/assets/elements/badge-square.png +0 -0
- bootstack/assets/elements/button-compact.png +0 -0
- bootstack/assets/elements/button-default.png +0 -0
- bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
- bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
- bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
- bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
- bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
- bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
- bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
- bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
- bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
- bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
- bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
- bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
- bootstack/assets/elements/card.png +0 -0
- bootstack/assets/elements/checkbox-checked.png +0 -0
- bootstack/assets/elements/checkbox-indeterminate.png +0 -0
- bootstack/assets/elements/checkbox-unchecked.png +0 -0
- bootstack/assets/elements/field.png +0 -0
- bootstack/assets/elements/input-addon-compact.png +0 -0
- bootstack/assets/elements/input-addon-default.png +0 -0
- bootstack/assets/elements/input-compact.png +0 -0
- bootstack/assets/elements/input-default.png +0 -0
- bootstack/assets/elements/list-item-separated.png +0 -0
- bootstack/assets/elements/list-item.png +0 -0
- bootstack/assets/elements/listrow-compact.png +0 -0
- bootstack/assets/elements/listrow-default.png +0 -0
- bootstack/assets/elements/manifest.toml +361 -0
- bootstack/assets/elements/menu-item.png +0 -0
- bootstack/assets/elements/navitem-compact.png +0 -0
- bootstack/assets/elements/navitem-default.png +0 -0
- bootstack/assets/elements/progressbar-h-compact.png +0 -0
- bootstack/assets/elements/progressbar-h-default.png +0 -0
- bootstack/assets/elements/progressbar-v-compact.png +0 -0
- bootstack/assets/elements/progressbar-v-default.png +0 -0
- bootstack/assets/elements/radiobutton.png +0 -0
- bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- bootstack/assets/elements/scrollbar-vertical.png +0 -0
- bootstack/assets/elements/slider-handle.png +0 -0
- bootstack/assets/elements/slider-track-h.png +0 -0
- bootstack/assets/elements/slider-track-v.png +0 -0
- bootstack/assets/elements/switch-off.png +0 -0
- bootstack/assets/elements/switch-on.png +0 -0
- bootstack/assets/elements/tab-h.png +0 -0
- bootstack/assets/elements/tab-v.png +0 -0
- bootstack/assets/icons/bootstrap.ttf +0 -0
- bootstack/assets/icons/glyphmap.json +2080 -0
- bootstack/assets/icons/icon_metrics.json +12470 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +878 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +878 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +854 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +844 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +917 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +844 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +844 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +845 -0
- bootstack/cli/__init__.py +133 -0
- bootstack/cli/__main__.py +6 -0
- bootstack/cli/add.py +395 -0
- bootstack/cli/appicon.py +285 -0
- bootstack/cli/build.py +115 -0
- bootstack/cli/config.py +313 -0
- bootstack/cli/demo.py +564 -0
- bootstack/cli/dev.py +153 -0
- bootstack/cli/doctor.py +195 -0
- bootstack/cli/icons.py +98 -0
- bootstack/cli/promote.py +120 -0
- bootstack/cli/pyinstaller.py +268 -0
- bootstack/cli/run.py +95 -0
- bootstack/cli/start.py +117 -0
- bootstack/cli/templates/__init__.py +931 -0
- bootstack/clipboard.py +48 -0
- bootstack/constants.py +318 -0
- bootstack/data/README.md +615 -0
- bootstack/data/__init__.py +78 -0
- bootstack/data/_observable.py +276 -0
- bootstack/data/base.py +780 -0
- bootstack/data/file_source.py +367 -0
- bootstack/data/memory_source.py +450 -0
- bootstack/data/query.py +367 -0
- bootstack/data/readers.py +289 -0
- bootstack/data/sqlite_source.py +869 -0
- bootstack/data/types.py +354 -0
- bootstack/data/writers.py +232 -0
- bootstack/dev/__init__.py +36 -0
- bootstack/dev/_capture.py +141 -0
- bootstack/dev/_env.py +43 -0
- bootstack/dev/_registry.py +140 -0
- bootstack/dev/_reloader.py +351 -0
- bootstack/dev/_reset.py +50 -0
- bootstack/dev/_watcher.py +91 -0
- bootstack/dialogs/__init__.py +948 -0
- bootstack/dialogs/_impl/__init__.py +47 -0
- bootstack/dialogs/_impl/colorchooser.py +588 -0
- bootstack/dialogs/_impl/datedialog.py +450 -0
- bootstack/dialogs/_impl/dialog.py +594 -0
- bootstack/dialogs/_impl/filterdialog.py +358 -0
- bootstack/dialogs/_impl/fontdialog.py +364 -0
- bootstack/dialogs/_impl/formdialog.py +564 -0
- bootstack/dialogs/_impl/message.py +486 -0
- bootstack/dialogs/_impl/query.py +570 -0
- bootstack/errors.py +67 -0
- bootstack/events/__init__.py +111 -0
- bootstack/events/_event.py +135 -0
- bootstack/events/_payloads.py +539 -0
- bootstack/events/_subscription.py +38 -0
- bootstack/i18n/README.md +77 -0
- bootstack/i18n/__init__.py +23 -0
- bootstack/i18n/catalog.py +121 -0
- bootstack/i18n/intl_format.py +584 -0
- bootstack/i18n/msgcat.py +425 -0
- bootstack/i18n/specs.py +156 -0
- bootstack/images.py +563 -0
- bootstack/py.typed +1 -0
- bootstack/scheduling/__init__.py +11 -0
- bootstack/scheduling/_schedule.py +218 -0
- bootstack/shortcuts.py +21 -0
- bootstack/signals/README.md +98 -0
- bootstack/signals/__init__.py +10 -0
- bootstack/signals/integration.py +100 -0
- bootstack/signals/signal.py +353 -0
- bootstack/signals/types.py +6 -0
- bootstack/store.py +286 -0
- bootstack/streams/__init__.py +12 -0
- bootstack/streams/_stream.py +321 -0
- bootstack/style/__init__.py +38 -0
- bootstack/style/builders/__init__.py +51 -0
- bootstack/style/builders/badge.py +46 -0
- bootstack/style/builders/button.py +339 -0
- bootstack/style/builders/buttongroup.py +311 -0
- bootstack/style/builders/calendar.py +271 -0
- bootstack/style/builders/checkbutton.py +110 -0
- bootstack/style/builders/combobox.py +113 -0
- bootstack/style/builders/contextmenu.py +268 -0
- bootstack/style/builders/entry.py +82 -0
- bootstack/style/builders/expander.py +148 -0
- bootstack/style/builders/field.py +335 -0
- bootstack/style/builders/frame.py +50 -0
- bootstack/style/builders/label.py +28 -0
- bootstack/style/builders/labelframe.py +34 -0
- bootstack/style/builders/listview.py +369 -0
- bootstack/style/builders/menubar.py +91 -0
- bootstack/style/builders/menubutton.py +359 -0
- bootstack/style/builders/panedwindow.py +25 -0
- bootstack/style/builders/progressbar.py +67 -0
- bootstack/style/builders/radiobutton.py +99 -0
- bootstack/style/builders/scale.py +64 -0
- bootstack/style/builders/scrollbar.py +225 -0
- bootstack/style/builders/separator.py +49 -0
- bootstack/style/builders/sidenav.py +643 -0
- bootstack/style/builders/sizegrip.py +15 -0
- bootstack/style/builders/spinbox.py +119 -0
- bootstack/style/builders/switch.py +70 -0
- bootstack/style/builders/tabitem.py +204 -0
- bootstack/style/builders/togglegroup.py +294 -0
- bootstack/style/builders/toolbutton.py +275 -0
- bootstack/style/builders/tooltip.py +26 -0
- bootstack/style/builders/treeview.py +193 -0
- bootstack/style/builders/utils.py +455 -0
- bootstack/style/builders_tk/__init__.py +16 -0
- bootstack/style/builders_tk/defaults.py +229 -0
- bootstack/style/element.py +173 -0
- bootstack/style/fonts.py +123 -0
- bootstack/style/style.py +609 -0
- bootstack/style/style_builder_base.py +716 -0
- bootstack/style/style_builder_mixed.py +93 -0
- bootstack/style/style_builder_tk.py +109 -0
- bootstack/style/style_builder_ttk.py +353 -0
- bootstack/style/style_resolver.py +447 -0
- bootstack/style/theme.py +245 -0
- bootstack/style/theme_provider.py +471 -0
- bootstack/style/themes/__init__.py +128 -0
- bootstack/style/tk_patch.py +5 -0
- bootstack/style/token_maps.py +41 -0
- bootstack/style/types.py +32 -0
- bootstack/style/typography.py +523 -0
- bootstack/style/utility.py +746 -0
- bootstack/types.py +39 -0
- bootstack/validation/__init__.py +6 -0
- bootstack/validation/types.py +15 -0
- bootstack/validation/validation_result.py +17 -0
- bootstack/validation/validation_rules.py +205 -0
- bootstack/widgets/__init__.py +74 -0
- bootstack/widgets/_core/__init__.py +31 -0
- bootstack/widgets/_core/app_config.py +266 -0
- bootstack/widgets/_core/base.py +461 -0
- bootstack/widgets/_core/container.py +334 -0
- bootstack/widgets/_core/context.py +35 -0
- bootstack/widgets/_core/events.py +130 -0
- bootstack/widgets/_core/field_mixin.py +353 -0
- bootstack/widgets/_core/icon_image_props.py +72 -0
- bootstack/widgets/_core/image_binding.py +93 -0
- bootstack/widgets/_core/navmodel.py +345 -0
- bootstack/widgets/_core/options.py +210 -0
- bootstack/widgets/_core/selection_group.py +130 -0
- bootstack/widgets/_core/window_controls.py +96 -0
- bootstack/widgets/_core/window_menu.py +246 -0
- bootstack/widgets/_impl/__init__.py +1 -0
- bootstack/widgets/_impl/_internal/__init__.py +0 -0
- bootstack/widgets/_impl/_internal/wrapper_base.py +307 -0
- bootstack/widgets/_impl/_parts/__init__.py +11 -0
- bootstack/widgets/_impl/_parts/numberentry_part.py +385 -0
- bootstack/widgets/_impl/_parts/spinnerentry_part.py +434 -0
- bootstack/widgets/_impl/_parts/textentry_part.py +406 -0
- bootstack/widgets/_impl/composites/__init__.py +33 -0
- bootstack/widgets/_impl/composites/_dateutils.py +33 -0
- bootstack/widgets/_impl/composites/_image_fit.py +105 -0
- bootstack/widgets/_impl/composites/accordion.py +381 -0
- bootstack/widgets/_impl/composites/avatar.py +191 -0
- bootstack/widgets/_impl/composites/buttongroup.py +371 -0
- bootstack/widgets/_impl/composites/calendar.py +972 -0
- bootstack/widgets/_impl/composites/carousel.py +567 -0
- bootstack/widgets/_impl/composites/chart.py +882 -0
- bootstack/widgets/_impl/composites/compositeframe.py +298 -0
- bootstack/widgets/_impl/composites/contextmenu.py +1951 -0
- bootstack/widgets/_impl/composites/dateentry.py +404 -0
- bootstack/widgets/_impl/composites/dropdownbutton.py +325 -0
- bootstack/widgets/_impl/composites/expander.py +515 -0
- bootstack/widgets/_impl/composites/field.py +670 -0
- bootstack/widgets/_impl/composites/form.py +1066 -0
- bootstack/widgets/_impl/composites/gallery.py +551 -0
- bootstack/widgets/_impl/composites/list/__init__.py +15 -0
- bootstack/widgets/_impl/composites/list/listitem.py +802 -0
- bootstack/widgets/_impl/composites/list/listview.py +1433 -0
- bootstack/widgets/_impl/composites/menu/__init__.py +18 -0
- bootstack/widgets/_impl/composites/menu/model.py +358 -0
- bootstack/widgets/_impl/composites/menu/render_native.py +134 -0
- bootstack/widgets/_impl/composites/menu/render_themed.py +134 -0
- bootstack/widgets/_impl/composites/meter.py +860 -0
- bootstack/widgets/_impl/composites/numericentry.py +201 -0
- bootstack/widgets/_impl/composites/pagestack.py +395 -0
- bootstack/widgets/_impl/composites/passwordentry.py +142 -0
- bootstack/widgets/_impl/composites/pathentry.py +168 -0
- bootstack/widgets/_impl/composites/picture.py +289 -0
- bootstack/widgets/_impl/composites/radiogroup.py +511 -0
- bootstack/widgets/_impl/composites/scrolledtext.py +375 -0
- bootstack/widgets/_impl/composites/scrolledtext.pyi +186 -0
- bootstack/widgets/_impl/composites/scrollview.py +764 -0
- bootstack/widgets/_impl/composites/selectbox.py +1026 -0
- bootstack/widgets/_impl/composites/shell/__init__.py +40 -0
- bootstack/widgets/_impl/composites/shell/content_host.py +52 -0
- bootstack/widgets/_impl/composites/shell/layout.py +335 -0
- bootstack/widgets/_impl/composites/shell/nav_panel.py +345 -0
- bootstack/widgets/_impl/composites/shell/providers.py +558 -0
- bootstack/widgets/_impl/composites/shell/rail.py +117 -0
- bootstack/widgets/_impl/composites/shell/shell.py +581 -0
- bootstack/widgets/_impl/composites/shell/workspace.py +273 -0
- bootstack/widgets/_impl/composites/sidenav/__init__.py +16 -0
- bootstack/widgets/_impl/composites/sidenav/header.py +81 -0
- bootstack/widgets/_impl/composites/sidenav/separator.py +44 -0
- bootstack/widgets/_impl/composites/slider/__init__.py +7 -0
- bootstack/widgets/_impl/composites/slider/_shared.py +195 -0
- bootstack/widgets/_impl/composites/slider/rangeslider.py +982 -0
- bootstack/widgets/_impl/composites/slider/slider.py +851 -0
- bootstack/widgets/_impl/composites/spinnerentry.py +185 -0
- bootstack/widgets/_impl/composites/tableview/__init__.py +5 -0
- bootstack/widgets/_impl/composites/tableview/tableview.py +3388 -0
- bootstack/widgets/_impl/composites/tableview/types.py +169 -0
- bootstack/widgets/_impl/composites/tabs/__init__.py +23 -0
- bootstack/widgets/_impl/composites/tabs/tabitem.py +389 -0
- bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
- bootstack/widgets/_impl/composites/tabs/tabview.py +650 -0
- bootstack/widgets/_impl/composites/textarea/__init__.py +26 -0
- bootstack/widgets/_impl/composites/textarea/change.py +46 -0
- bootstack/widgets/_impl/composites/textarea/codeeditor.py +526 -0
- bootstack/widgets/_impl/composites/textarea/core.py +495 -0
- bootstack/widgets/_impl/composites/textarea/decoration.py +42 -0
- bootstack/widgets/_impl/composites/textarea/diff.py +127 -0
- bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +1 -0
- bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +138 -0
- bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +158 -0
- bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +138 -0
- bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +312 -0
- bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +177 -0
- bootstack/widgets/_impl/composites/textarea/filter.py +171 -0
- bootstack/widgets/_impl/composites/textarea/search_overlay.py +459 -0
- bootstack/widgets/_impl/composites/textarea/sidebar.py +88 -0
- bootstack/widgets/_impl/composites/textarea/style_registry.py +178 -0
- bootstack/widgets/_impl/composites/textarea/textarea.py +606 -0
- bootstack/widgets/_impl/composites/textarea/undo.py +217 -0
- bootstack/widgets/_impl/composites/textentry.py +57 -0
- bootstack/widgets/_impl/composites/timeentry.py +176 -0
- bootstack/widgets/_impl/composites/toast.py +390 -0
- bootstack/widgets/_impl/composites/toast_stack.py +156 -0
- bootstack/widgets/_impl/composites/togglegroup.py +418 -0
- bootstack/widgets/_impl/composites/toolbar.py +608 -0
- bootstack/widgets/_impl/composites/tooltip.py +491 -0
- bootstack/widgets/_impl/composites/tree/__init__.py +7 -0
- bootstack/widgets/_impl/composites/tree/source_binding.py +136 -0
- bootstack/widgets/_impl/composites/tree/treeitem.py +393 -0
- bootstack/widgets/_impl/composites/tree/treenode.py +174 -0
- bootstack/widgets/_impl/composites/tree/treeview.py +841 -0
- bootstack/widgets/_impl/mixins/__init__.py +24 -0
- bootstack/widgets/_impl/mixins/configure_mixin.py +216 -0
- bootstack/widgets/_impl/mixins/entry_mixin.py +134 -0
- bootstack/widgets/_impl/mixins/font_mixin.py +368 -0
- bootstack/widgets/_impl/mixins/icon_mixin.py +61 -0
- bootstack/widgets/_impl/mixins/localization_mixin.py +253 -0
- bootstack/widgets/_impl/mixins/signal_mixin.py +268 -0
- bootstack/widgets/_impl/mixins/validation_mixin.py +226 -0
- bootstack/widgets/_impl/primitives/__init__.py +49 -0
- bootstack/widgets/_impl/primitives/_menubutton.py +107 -0
- bootstack/widgets/_impl/primitives/badge.py +45 -0
- bootstack/widgets/_impl/primitives/button.py +76 -0
- bootstack/widgets/_impl/primitives/card.py +45 -0
- bootstack/widgets/_impl/primitives/checkbutton.py +124 -0
- bootstack/widgets/_impl/primitives/checktoggle.py +62 -0
- bootstack/widgets/_impl/primitives/combobox.py +156 -0
- bootstack/widgets/_impl/primitives/entry.py +87 -0
- bootstack/widgets/_impl/primitives/flexframe.py +448 -0
- bootstack/widgets/_impl/primitives/frame.py +185 -0
- bootstack/widgets/_impl/primitives/gridframe.py +546 -0
- bootstack/widgets/_impl/primitives/label.py +84 -0
- bootstack/widgets/_impl/primitives/labelframe.py +54 -0
- bootstack/widgets/_impl/primitives/optionmenu.py +387 -0
- bootstack/widgets/_impl/primitives/packframe.py +227 -0
- bootstack/widgets/_impl/primitives/panedwindow.py +45 -0
- bootstack/widgets/_impl/primitives/progressbar.py +83 -0
- bootstack/widgets/_impl/primitives/radiobutton.py +115 -0
- bootstack/widgets/_impl/primitives/radiotoggle.py +54 -0
- bootstack/widgets/_impl/primitives/scrollbar.py +42 -0
- bootstack/widgets/_impl/primitives/separator.py +43 -0
- bootstack/widgets/_impl/primitives/sizegrip.py +33 -0
- bootstack/widgets/_impl/primitives/spinbox.py +95 -0
- bootstack/widgets/_impl/primitives/switch.py +44 -0
- bootstack/widgets/_impl/primitives/treeview.py +69 -0
- bootstack/widgets/app.py +371 -0
- bootstack/widgets/appshell.py +1179 -0
- bootstack/widgets/avatar.py +140 -0
- bootstack/widgets/boolean_controls.py +455 -0
- bootstack/widgets/button.py +224 -0
- bootstack/widgets/buttongroup.py +239 -0
- bootstack/widgets/calendar.py +195 -0
- bootstack/widgets/card.py +159 -0
- bootstack/widgets/carousel.py +241 -0
- bootstack/widgets/chart.py +302 -0
- bootstack/widgets/codeeditor.py +675 -0
- bootstack/widgets/contextmenu.py +371 -0
- bootstack/widgets/datatable.py +688 -0
- bootstack/widgets/datefield.py +395 -0
- bootstack/widgets/divider.py +60 -0
- bootstack/widgets/expander.py +579 -0
- bootstack/widgets/form.py +200 -0
- bootstack/widgets/gallery.py +250 -0
- bootstack/widgets/gauge.py +168 -0
- bootstack/widgets/grid.py +121 -0
- bootstack/widgets/groupbox.py +162 -0
- bootstack/widgets/label.py +229 -0
- bootstack/widgets/listview.py +354 -0
- bootstack/widgets/menubutton.py +419 -0
- bootstack/widgets/numberfield.py +431 -0
- bootstack/widgets/pagestack.py +345 -0
- bootstack/widgets/passwordfield.py +383 -0
- bootstack/widgets/pathfield.py +454 -0
- bootstack/widgets/picture.py +251 -0
- bootstack/widgets/progressbar.py +106 -0
- bootstack/widgets/radio_variants.py +271 -0
- bootstack/widgets/radiogroup.py +228 -0
- bootstack/widgets/scrollbar.py +64 -0
- bootstack/widgets/scrollview.py +186 -0
- bootstack/widgets/select.py +302 -0
- bootstack/widgets/selectbutton.py +182 -0
- bootstack/widgets/sidebar_toggle.py +130 -0
- bootstack/widgets/sizegrip.py +42 -0
- bootstack/widgets/slider.py +408 -0
- bootstack/widgets/spinbox.py +147 -0
- bootstack/widgets/spinnerfield.py +413 -0
- bootstack/widgets/splash.py +367 -0
- bootstack/widgets/splitview.py +482 -0
- bootstack/widgets/stacks.py +249 -0
- bootstack/widgets/statusbar.py +189 -0
- bootstack/widgets/tabs.py +425 -0
- bootstack/widgets/textarea.py +459 -0
- bootstack/widgets/textfield.py +410 -0
- bootstack/widgets/theme_toggle.py +92 -0
- bootstack/widgets/timefield.py +340 -0
- bootstack/widgets/toast.py +314 -0
- bootstack/widgets/togglegroup.py +231 -0
- bootstack/widgets/toolbar.py +347 -0
- bootstack/widgets/tooltip.py +94 -0
- bootstack/widgets/tree.py +648 -0
- bootstack/widgets/types.py +305 -0
- bootstack/widgets/window.py +307 -0
- bootstack-0.1.0.dist-info/METADATA +301 -0
- bootstack-0.1.0.dist-info/RECORD +471 -0
- bootstack-0.1.0.dist-info/WHEEL +5 -0
- bootstack-0.1.0.dist-info/entry_points.txt +2 -0
- bootstack-0.1.0.dist-info/licenses/LICENSE +21 -0
- bootstack-0.1.0.dist-info/licenses/NOTICE +10 -0
- bootstack-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Callable, TYPE_CHECKING, overload
|
|
4
|
+
|
|
5
|
+
from bootstack.widgets._impl.composites.list.listview import ListView as _InternalListView
|
|
6
|
+
from bootstack.widgets._core.base import PublicWidgetBase
|
|
7
|
+
from bootstack.widgets._core.events import register_widget_events
|
|
8
|
+
from bootstack.events import Subscription
|
|
9
|
+
from bootstack.streams import Stream
|
|
10
|
+
from bootstack.widgets.types import AccentToken, Event, WidgetDensity, SelectionMode, ScrollbarVariant
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from bootstack.data.types import DataSourceProtocol
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ListView(PublicWidgetBase):
|
|
17
|
+
"""A virtual-scrolling list for efficiently displaying large datasets.
|
|
18
|
+
|
|
19
|
+
Renders only visible rows, making it suitable for thousands of records.
|
|
20
|
+
Populate via `items=` (a plain list of dicts) or `data_source=` (a data
|
|
21
|
+
source for database-backed or API-backed data).
|
|
22
|
+
|
|
23
|
+
Each record dict should have an `'id'` key; one is auto-generated if absent.
|
|
24
|
+
Displayed fields are `'title'`, `'text'`, `'icon'`, and `'badge'`. Other
|
|
25
|
+
keys are stored and returned by `selection` and events but are not
|
|
26
|
+
rendered.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
items: Initial list of record dicts.
|
|
30
|
+
data_source: A data source for database-backed or API-backed data. Any
|
|
31
|
+
object implementing the data-source protocol is accepted.
|
|
32
|
+
selection_mode: Item selection behavior — `'single'` allows one item at
|
|
33
|
+
a time, `'multi'` allows several. Default `'none'` (no selection).
|
|
34
|
+
show_selection_controls: If `True`, show checkboxes (multi) or radio
|
|
35
|
+
buttons (single) alongside each item.
|
|
36
|
+
select_on_click: Whether clicking an item selects it. Defaults to `True`
|
|
37
|
+
when `selection_mode` is not `'none'`. Set `False` to decouple a
|
|
38
|
+
click (e.g. activate or open) from selection.
|
|
39
|
+
show_chevron: If `True`, show a right-pointing chevron on each item.
|
|
40
|
+
allow_remove: If `True`, show a remove button on each item.
|
|
41
|
+
allow_reorder: If `True`, show a drag handle and allow reordering by
|
|
42
|
+
dragging.
|
|
43
|
+
striped: If `True`, alternate the row background color.
|
|
44
|
+
show_separators: If `True` (default), draw a separator line between
|
|
45
|
+
items.
|
|
46
|
+
show_scrollbar: If `True` (default), show the vertical scrollbar.
|
|
47
|
+
Mousewheel scrolling works regardless.
|
|
48
|
+
scrollbar_variant: Scrollbar style — `'thin'` (default) for a slim bar
|
|
49
|
+
suited to lists, or `'default'` for the standard rounded bar.
|
|
50
|
+
height: Fixed height in pixels. When set, the list maintains this
|
|
51
|
+
height regardless of its children, making it self-contained for
|
|
52
|
+
scrolling without requiring the parent layout to provide a
|
|
53
|
+
vertical constraint. The widget can still grow beyond this height
|
|
54
|
+
if placed with `expand=True` in a constrained parent.
|
|
55
|
+
density: Row height. Default `'default'`.
|
|
56
|
+
accent: Color intent token for the selection highlight and drag
|
|
57
|
+
indicator. Defaults to the theme's default color.
|
|
58
|
+
parent: Override the context-stack parent.
|
|
59
|
+
**kwargs: Layout placement options applied by the parent container —
|
|
60
|
+
`fill`, `expand`, `anchor`, `margin`, `row`, `column`, `sticky`.
|
|
61
|
+
See :doc:`/tasks/layout`.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def __init__(
|
|
65
|
+
self,
|
|
66
|
+
*,
|
|
67
|
+
items: list[dict] | None = None,
|
|
68
|
+
data_source: DataSourceProtocol | None = None,
|
|
69
|
+
selection_mode: SelectionMode = "none",
|
|
70
|
+
show_selection_controls: bool = False,
|
|
71
|
+
select_on_click: bool | None = None,
|
|
72
|
+
show_chevron: bool = False,
|
|
73
|
+
allow_remove: bool = False,
|
|
74
|
+
allow_reorder: bool = False,
|
|
75
|
+
striped: bool = False,
|
|
76
|
+
show_separators: bool = True,
|
|
77
|
+
show_scrollbar: bool = True,
|
|
78
|
+
scrollbar_variant: ScrollbarVariant = "thin",
|
|
79
|
+
height: int | None = None,
|
|
80
|
+
density: WidgetDensity = "default",
|
|
81
|
+
accent: AccentToken | str | None = None,
|
|
82
|
+
accent_selection: bool = False,
|
|
83
|
+
parent: Any = None,
|
|
84
|
+
**kwargs: Any,
|
|
85
|
+
) -> None:
|
|
86
|
+
self._parent = self._resolve_parent(parent)
|
|
87
|
+
self._selection_mode = selection_mode
|
|
88
|
+
layout_kw = self._split_layout_kwargs(kwargs)
|
|
89
|
+
tk_master = self._parent._child_master() if self._parent else None
|
|
90
|
+
|
|
91
|
+
internal_kwargs: dict[str, Any] = {
|
|
92
|
+
"selection_mode": selection_mode,
|
|
93
|
+
"show_selection_controls": show_selection_controls,
|
|
94
|
+
"show_chevron": show_chevron,
|
|
95
|
+
"enable_removing": allow_remove,
|
|
96
|
+
"enable_dragging": allow_reorder,
|
|
97
|
+
"striped": striped,
|
|
98
|
+
"show_separator": show_separators,
|
|
99
|
+
"scrollbar_visibility": "always" if show_scrollbar else "never",
|
|
100
|
+
"scrollbar_variant": scrollbar_variant,
|
|
101
|
+
"density": density,
|
|
102
|
+
"accent_selection": accent_selection,
|
|
103
|
+
}
|
|
104
|
+
if items is not None:
|
|
105
|
+
internal_kwargs["items"] = items
|
|
106
|
+
if data_source is not None:
|
|
107
|
+
internal_kwargs["datasource"] = data_source
|
|
108
|
+
if select_on_click is not None:
|
|
109
|
+
internal_kwargs["select_on_click"] = select_on_click
|
|
110
|
+
if accent is not None:
|
|
111
|
+
internal_kwargs["accent"] = accent
|
|
112
|
+
|
|
113
|
+
if height is not None and "horizontal" not in layout_kw:
|
|
114
|
+
layout_kw["horizontal"] = "stretch"
|
|
115
|
+
|
|
116
|
+
self._internal = _InternalListView(tk_master, **internal_kwargs)
|
|
117
|
+
# Prevent the row pool from feeding back into the layout: without this,
|
|
118
|
+
# adding rows causes the ListView to grow, which gives the Grid more
|
|
119
|
+
# space, which causes more rows to be added — an infinite resize loop.
|
|
120
|
+
self._internal.pack_propagate(False)
|
|
121
|
+
self._attach_to_parent(layout_kw)
|
|
122
|
+
|
|
123
|
+
if height is not None:
|
|
124
|
+
self._internal.configure(height=height)
|
|
125
|
+
|
|
126
|
+
# ----- Data -----
|
|
127
|
+
|
|
128
|
+
def insert_item(self, data: dict) -> None:
|
|
129
|
+
"""Insert a new record into the list.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
data: Record dict. An `'id'` is auto-generated if absent.
|
|
133
|
+
"""
|
|
134
|
+
self._internal.insert_item(data)
|
|
135
|
+
|
|
136
|
+
def update_item(self, record_id: Any, data: dict) -> None:
|
|
137
|
+
"""Update an existing record.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
record_id: ID of the record to update.
|
|
141
|
+
data: Fields to merge into the existing record.
|
|
142
|
+
"""
|
|
143
|
+
self._internal.update_item(record_id, data)
|
|
144
|
+
|
|
145
|
+
def delete_item(self, record_id: Any) -> None:
|
|
146
|
+
"""Delete a record by ID.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
record_id: ID of the record to delete.
|
|
150
|
+
"""
|
|
151
|
+
self._internal.delete_item(record_id)
|
|
152
|
+
|
|
153
|
+
def reload(self) -> None:
|
|
154
|
+
"""Reload data from the datasource and refresh the display."""
|
|
155
|
+
self._internal.reload()
|
|
156
|
+
|
|
157
|
+
# ----- Selection -----
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def selection(self) -> dict | list[dict] | None:
|
|
161
|
+
"""The selected record(s) — the data bag.
|
|
162
|
+
|
|
163
|
+
In `'single'` mode, the selected record `dict` (or `None` when nothing
|
|
164
|
+
is selected). In `'multi'` mode, a `list` of record dicts (empty when
|
|
165
|
+
nothing is selected). Each record carries its non-displayed fields too,
|
|
166
|
+
indexed by key like any record. Read-only.
|
|
167
|
+
"""
|
|
168
|
+
rows = self._internal.get_selected()
|
|
169
|
+
if self._selection_mode == "multi":
|
|
170
|
+
return rows
|
|
171
|
+
return rows[0] if rows else None
|
|
172
|
+
|
|
173
|
+
def select_items(self, record_ids: list) -> None:
|
|
174
|
+
"""Select items by record `id`.
|
|
175
|
+
|
|
176
|
+
In `'single'` mode this replaces the current selection; in `'multi'`
|
|
177
|
+
mode the items are added to it.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
record_ids: Record ids of the items to select.
|
|
181
|
+
"""
|
|
182
|
+
self._internal.select_items(record_ids)
|
|
183
|
+
|
|
184
|
+
def select_all(self) -> None:
|
|
185
|
+
"""Select all items. Only effective when `selection_mode='multi'`."""
|
|
186
|
+
self._internal.select_all()
|
|
187
|
+
|
|
188
|
+
def deselect_items(self, record_ids: list) -> None:
|
|
189
|
+
"""Remove the given items from the selection by record `id`.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
record_ids: Record ids to deselect.
|
|
193
|
+
"""
|
|
194
|
+
self._internal.deselect_items(record_ids)
|
|
195
|
+
|
|
196
|
+
def clear_selection(self) -> None:
|
|
197
|
+
"""Deselect all items."""
|
|
198
|
+
self._internal.clear_selection()
|
|
199
|
+
|
|
200
|
+
# ----- Scrolling -----
|
|
201
|
+
|
|
202
|
+
def scroll_to_top(self) -> None:
|
|
203
|
+
"""Scroll to the first item."""
|
|
204
|
+
self._internal.scroll_to_top()
|
|
205
|
+
|
|
206
|
+
def scroll_to_bottom(self) -> None:
|
|
207
|
+
"""Scroll to the last item."""
|
|
208
|
+
self._internal.scroll_to_bottom()
|
|
209
|
+
|
|
210
|
+
# ----- Events -----
|
|
211
|
+
|
|
212
|
+
@overload
|
|
213
|
+
def on_item_click(self) -> Stream: ...
|
|
214
|
+
@overload
|
|
215
|
+
def on_item_click(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
|
|
216
|
+
def on_item_click(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
|
|
217
|
+
"""Fired when an item is clicked.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
handler: Called with the record `dict` — read fields with
|
|
221
|
+
`e["field"]`. Omit to get a composable
|
|
222
|
+
:class:`~bootstack.streams.Stream` instead.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
A cancellable :class:`~bootstack.events.Subscription` when a handler
|
|
226
|
+
is given, otherwise a :class:`~bootstack.streams.Stream`.
|
|
227
|
+
"""
|
|
228
|
+
return self.on("item_click", handler)
|
|
229
|
+
|
|
230
|
+
@overload
|
|
231
|
+
def on_select(self) -> Stream: ...
|
|
232
|
+
@overload
|
|
233
|
+
def on_select(self, handler: Callable[[Event], Any]) -> Subscription: ...
|
|
234
|
+
def on_select(self, handler: Callable[[Event], Any] | None = None) -> Stream | Subscription:
|
|
235
|
+
"""Fired when the selection changes.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
handler: Called with the curated
|
|
239
|
+
:class:`~bootstack.events.Event`; read `selection` to get
|
|
240
|
+
the current selection. Omit to get a composable
|
|
241
|
+
:class:`~bootstack.streams.Stream` instead.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
A cancellable :class:`~bootstack.events.Subscription` when a handler
|
|
245
|
+
is given, otherwise a :class:`~bootstack.streams.Stream`.
|
|
246
|
+
"""
|
|
247
|
+
return self.on("select", handler)
|
|
248
|
+
|
|
249
|
+
@overload
|
|
250
|
+
def on_item_delete(self) -> Stream: ...
|
|
251
|
+
@overload
|
|
252
|
+
def on_item_delete(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
|
|
253
|
+
def on_item_delete(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
|
|
254
|
+
"""Fired after an item is removed.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
handler: Called with the deleted record `dict`. Omit to get a
|
|
258
|
+
composable :class:`~bootstack.streams.Stream` instead.
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
A cancellable :class:`~bootstack.events.Subscription` when a handler
|
|
262
|
+
is given, otherwise a :class:`~bootstack.streams.Stream`.
|
|
263
|
+
"""
|
|
264
|
+
return self.on("item_delete", handler)
|
|
265
|
+
|
|
266
|
+
@overload
|
|
267
|
+
def on_item_insert(self) -> Stream: ...
|
|
268
|
+
@overload
|
|
269
|
+
def on_item_insert(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
|
|
270
|
+
def on_item_insert(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
|
|
271
|
+
"""Fired after an item is inserted.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
handler: Called with the new record `dict`. Omit to get a
|
|
275
|
+
composable :class:`~bootstack.streams.Stream` instead.
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
A cancellable :class:`~bootstack.events.Subscription` when a handler
|
|
279
|
+
is given, otherwise a :class:`~bootstack.streams.Stream`.
|
|
280
|
+
"""
|
|
281
|
+
return self.on("item_insert", handler)
|
|
282
|
+
|
|
283
|
+
@overload
|
|
284
|
+
def on_item_update(self) -> Stream: ...
|
|
285
|
+
@overload
|
|
286
|
+
def on_item_update(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
|
|
287
|
+
def on_item_update(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
|
|
288
|
+
"""Fired after an item is updated.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
handler: Called with the updated record `dict`. Omit to get a
|
|
292
|
+
composable :class:`~bootstack.streams.Stream` instead.
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
A cancellable :class:`~bootstack.events.Subscription` when a handler
|
|
296
|
+
is given, otherwise a :class:`~bootstack.streams.Stream`.
|
|
297
|
+
"""
|
|
298
|
+
return self.on("item_update", handler)
|
|
299
|
+
|
|
300
|
+
@overload
|
|
301
|
+
def on_item_drag_start(self) -> Stream: ...
|
|
302
|
+
@overload
|
|
303
|
+
def on_item_drag_start(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
|
|
304
|
+
def on_item_drag_start(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
|
|
305
|
+
"""Fired when a drag begins.
|
|
306
|
+
|
|
307
|
+
Args:
|
|
308
|
+
handler: Called with the record `dict`, including `source_index`.
|
|
309
|
+
Omit to get a composable :class:`~bootstack.streams.Stream`
|
|
310
|
+
instead.
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
A cancellable :class:`~bootstack.events.Subscription` when a handler
|
|
314
|
+
is given, otherwise a :class:`~bootstack.streams.Stream`.
|
|
315
|
+
"""
|
|
316
|
+
return self.on("item_drag_start", handler)
|
|
317
|
+
|
|
318
|
+
@overload
|
|
319
|
+
def on_item_drag_end(self) -> Stream: ...
|
|
320
|
+
@overload
|
|
321
|
+
def on_item_drag_end(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
|
|
322
|
+
def on_item_drag_end(self, handler: Callable[[dict[str, Any]], Any] | None = None) -> Stream | Subscription:
|
|
323
|
+
"""Fired when a drag ends.
|
|
324
|
+
|
|
325
|
+
Args:
|
|
326
|
+
handler: Called with the record `dict`, including `source_index`
|
|
327
|
+
and `target_index`. Omit to get a composable
|
|
328
|
+
:class:`~bootstack.streams.Stream` instead.
|
|
329
|
+
|
|
330
|
+
Returns:
|
|
331
|
+
A cancellable :class:`~bootstack.events.Subscription` when a handler
|
|
332
|
+
is given, otherwise a :class:`~bootstack.streams.Stream`.
|
|
333
|
+
"""
|
|
334
|
+
return self.on("item_drag_end", handler)
|
|
335
|
+
|
|
336
|
+
# ----- Properties -----
|
|
337
|
+
|
|
338
|
+
@property
|
|
339
|
+
def data_source(self) -> DataSourceProtocol:
|
|
340
|
+
"""The underlying data source instance."""
|
|
341
|
+
return self._internal.get_datasource()
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
_LISTVIEW_EVENTS: dict[str, str] = {
|
|
345
|
+
"item_click": "<<ItemClick>>",
|
|
346
|
+
"select": "<<SelectionChange>>",
|
|
347
|
+
"item_delete": "<<ItemDelete>>",
|
|
348
|
+
"item_insert": "<<ItemInsert>>",
|
|
349
|
+
"item_update": "<<ItemUpdate>>",
|
|
350
|
+
"item_drag_start": "<<ItemDragStart>>",
|
|
351
|
+
"item_drag_end": "<<ItemDragEnd>>",
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
register_widget_events(ListView, _LISTVIEW_EVENTS)
|