flet 0.84.0.dev0__tar.gz → 0.85.0.dev0__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.
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/PKG-INFO +9 -9
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/pyproject.toml +9 -9
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/__init__.py +2 -0
- flet-0.85.0.dev0/src/flet/components/hooks/use_dialog.py +71 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/base_page.py +51 -23
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/context.py +6 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/navigation_rail.py +29 -3
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/version.py +1 -1
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/PKG-INFO +9 -9
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/SOURCES.txt +2 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/requires.txt +8 -8
- flet-0.85.0.dev0/tests/test_use_dialog.py +166 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/README.md +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/setup.cfg +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/app.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/authorization.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/authorization_service.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/group.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/oauth_provider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/oauth_token.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/github_oauth_provider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/google_oauth_provider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/user.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/canvas/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/cli.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/component.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/component_decorator.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/component_owned.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/hook.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_callback.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_context.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_effect.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_memo.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_ref.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_state.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/memo.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/observable.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/public_utils.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/utils.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/adaptive_control.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/alignment.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/animation.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/base_control.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/blur.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/border.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/border_radius.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/box.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/buttons.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/colors.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/control.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/control_event.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/control_state.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/animated_switcher.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/autofill_group.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/arc.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/canvas.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/circle.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/color.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/fill.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/image.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/line.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/oval.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/path.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/points.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/rect.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/shadow.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/shape.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/text.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/column.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/dismissible.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/drag_target.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/draggable.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/flet_app.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/gesture_detector.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/grid_view.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/hero.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/icon.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/image.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/interactive_viewer.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/keyboard_listener.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/list_view.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/markdown.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/merge_semantics.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/page_view.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/pagelet.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/placeholder.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/responsive_row.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/rotated_box.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/row.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/safe_area.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/screenshot.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/semantics.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/shader_mask.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/shimmer.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/stack.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/text.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/text_span.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/transparent_pointer.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/view.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/window.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/window_drag_area.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/device_info.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/dialog_control.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/duration.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/embed_json_encoder.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/events.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/exceptions.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/geometry.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/gradients.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/icon_data.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/id_counter.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/keys.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/layout_control.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/margin.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/alert_dialog.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/app_bar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/auto_complete.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/badge.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/banner.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/bottom_app_bar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/bottom_sheet.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/card.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/checkbox.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/chip.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/circle_avatar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/container.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/context_menu.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/datatable.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/date_picker.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/date_range_picker.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/divider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/dropdown.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/dropdownm2.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/elevated_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/expansion_panel.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/expansion_tile.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/filled_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/filled_tonal_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/floating_action_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/form_field_control.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/icon_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/icons.json +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/icons.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/icons.pyi +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/list_tile.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/menu_bar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/menu_item_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/navigation_bar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/navigation_drawer.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/outlined_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/popup_menu_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/progress_bar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/progress_ring.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/radio.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/radio_group.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/range_slider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/reorderable_list_view.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/search_bar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/segmented_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/selection_area.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/slider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/snack_bar.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/submenu_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/switch.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/tabs.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/text_button.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/textfield.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/time_picker.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/tooltip.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/vertical_divider.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/multi_view.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/object_patch.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/padding.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/page.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/painting.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/query_string.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/ref.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/scrollable_control.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/accelerometer.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/barometer.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/battery.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/browser_context_menu.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/clipboard.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/connectivity.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/file_picker.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/gyroscope.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/haptic_feedback.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/magnetometer.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/screen_brightness.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/semantics_service.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/sensor_error_event.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/service.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/shake_detector.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/share.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/shared_preferences.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/storage_paths.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/url_launcher.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/user_accelerometer.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/wakelock.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/template_route.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/text_style.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/theme.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/transform.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/types.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/value_types.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/fastapi/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/connection.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/flet_socket_server.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/protocol.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/pyodide_connection.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/session.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/session_store.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/pubsub/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/pubsub/pubsub_client.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/pubsub/pubsub_hub.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/py.typed +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/security/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/testing/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/testing/finder.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/testing/flet_test_app.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/testing/tester.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/__init__.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/browser.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/classproperty.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/deprecated.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/deprecated_enum.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/files.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/from_dict.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/griffe_deprecations.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/hashing.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/json_utils.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/locks.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/network.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/object_model.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/once.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/pip.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/platform_utils.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/slugify.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/strings.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/typing_utils.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/validation.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/vector.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/dependency_links.txt +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/entry_points.txt +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/top_level.txt +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_auth_lazy_imports.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_base_control.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_colors.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_component_effects.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_component_renderer.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_dataclasses.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_datetime.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_deprecated.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_events.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_from_dict.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_griffe_deprecations.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_icons.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_object_diff_frozen.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_object_diff_in_place.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_object_diff_memory_churn.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_object_diff_performance.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_observable.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_patch_dataclass.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_session_disconnect_buffering.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_skip_double_update.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_validation.py +0 -0
- {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_validation_benchmark.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flet
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.85.0.dev0
|
|
4
4
|
Summary: Flet for Python - easily build interactive multi-platform apps in Python
|
|
5
5
|
Author-email: "Appveyor Systems Inc." <hello@flet.dev>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -9,23 +9,23 @@ Project-URL: Repository, https://github.com/flet-dev/flet
|
|
|
9
9
|
Project-URL: Documentation, https://flet.dev/docs/
|
|
10
10
|
Requires-Python: >=3.10
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
|
-
Requires-Dist: flet-cli==0.
|
|
13
|
-
Requires-Dist: flet-web==0.
|
|
12
|
+
Requires-Dist: flet-cli==0.85.0.dev0; extra == "cli"
|
|
13
|
+
Requires-Dist: flet-web==0.85.0.dev0; extra == "web"
|
|
14
14
|
Requires-Dist: oauthlib>=3.2.2; platform_system != "Pyodide"
|
|
15
15
|
Requires-Dist: httpx>=0.28.1; platform_system != "Pyodide"
|
|
16
16
|
Requires-Dist: repath>=0.9.0
|
|
17
17
|
Requires-Dist: msgpack>=1.1.0
|
|
18
18
|
Requires-Dist: typing-extensions; python_version < "3.11"
|
|
19
19
|
Provides-Extra: all
|
|
20
|
-
Requires-Dist: flet-cli==0.
|
|
21
|
-
Requires-Dist: flet-web==0.
|
|
22
|
-
Requires-Dist: flet-desktop==0.
|
|
20
|
+
Requires-Dist: flet-cli==0.85.0.dev0; extra == "all"
|
|
21
|
+
Requires-Dist: flet-web==0.85.0.dev0; extra == "all"
|
|
22
|
+
Requires-Dist: flet-desktop==0.85.0.dev0; extra == "all"
|
|
23
23
|
Provides-Extra: cli
|
|
24
|
-
Requires-Dist: flet-cli==0.
|
|
24
|
+
Requires-Dist: flet-cli==0.85.0.dev0; extra == "cli"
|
|
25
25
|
Provides-Extra: desktop
|
|
26
|
-
Requires-Dist: flet-desktop==0.
|
|
26
|
+
Requires-Dist: flet-desktop==0.85.0.dev0; extra == "desktop"
|
|
27
27
|
Provides-Extra: web
|
|
28
|
-
Requires-Dist: flet-web==0.
|
|
28
|
+
Requires-Dist: flet-web==0.85.0.dev0; extra == "web"
|
|
29
29
|
|
|
30
30
|
<p align="center">
|
|
31
31
|
<a href="https://flet.dev"><img src="https://raw.githubusercontent.com/flet-dev/flet/refs/heads/main/media/logo/flet-logo.svg" height="150" alt="Flet logo"></a>
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "flet"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.85.0.dev0"
|
|
4
4
|
description = "Flet for Python - easily build interactive multi-platform apps in Python"
|
|
5
5
|
authors = [{name = "Appveyor Systems Inc.", email = "hello@flet.dev"}]
|
|
6
6
|
license = "Apache-2.0"
|
|
7
7
|
readme = "README.md"
|
|
8
8
|
requires-python = ">=3.10"
|
|
9
9
|
dependencies = [
|
|
10
|
-
"flet-cli==0.
|
|
11
|
-
"flet-web==0.
|
|
10
|
+
"flet-cli==0.85.0.dev0; extra == 'cli'",
|
|
11
|
+
"flet-web==0.85.0.dev0; extra == 'web'",
|
|
12
12
|
"oauthlib >=3.2.2; platform_system != 'Pyodide'",
|
|
13
13
|
"httpx >=0.28.1; platform_system != 'Pyodide'",
|
|
14
14
|
"repath >=0.9.0",
|
|
@@ -23,15 +23,15 @@ Documentation = "https://flet.dev/docs/"
|
|
|
23
23
|
|
|
24
24
|
[project.optional-dependencies]
|
|
25
25
|
all = [
|
|
26
|
-
"flet-cli==0.
|
|
27
|
-
"flet-web==0.
|
|
28
|
-
"flet-desktop==0.
|
|
26
|
+
"flet-cli==0.85.0.dev0",
|
|
27
|
+
"flet-web==0.85.0.dev0",
|
|
28
|
+
"flet-desktop==0.85.0.dev0",
|
|
29
29
|
]
|
|
30
|
-
cli = ["flet-cli==0.
|
|
30
|
+
cli = ["flet-cli==0.85.0.dev0"]
|
|
31
31
|
desktop = [
|
|
32
|
-
"flet-desktop==0.
|
|
32
|
+
"flet-desktop==0.85.0.dev0",
|
|
33
33
|
]
|
|
34
|
-
web = ["flet-web==0.
|
|
34
|
+
web = ["flet-web==0.85.0.dev0"]
|
|
35
35
|
|
|
36
36
|
[project.scripts]
|
|
37
37
|
flet = "flet.cli:main"
|
|
@@ -5,6 +5,7 @@ from flet.components.component import Component
|
|
|
5
5
|
from flet.components.component_decorator import component
|
|
6
6
|
from flet.components.hooks.use_callback import use_callback
|
|
7
7
|
from flet.components.hooks.use_context import create_context, use_context
|
|
8
|
+
from flet.components.hooks.use_dialog import use_dialog
|
|
8
9
|
from flet.components.hooks.use_effect import (
|
|
9
10
|
on_mounted,
|
|
10
11
|
on_unmounted,
|
|
@@ -1111,6 +1112,7 @@ __all__ = [
|
|
|
1111
1112
|
"unwrap_component",
|
|
1112
1113
|
"use_callback",
|
|
1113
1114
|
"use_context",
|
|
1115
|
+
"use_dialog",
|
|
1114
1116
|
"use_effect",
|
|
1115
1117
|
"use_memo",
|
|
1116
1118
|
"use_ref",
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from flet.components.hooks.use_effect import use_effect
|
|
4
|
+
from flet.components.hooks.use_ref import use_ref
|
|
5
|
+
from flet.controls.context import context
|
|
6
|
+
from flet.controls.dialog_control import DialogControl
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def use_dialog(dialog: DialogControl | None = None):
|
|
10
|
+
"""
|
|
11
|
+
Portal a :class:`~flet.DialogControl` to the page's dialog overlay.
|
|
12
|
+
|
|
13
|
+
Call this hook inside a :func:`~flet.component` function on every render.
|
|
14
|
+
Pass a :class:`~flet.DialogControl` instance to show the dialog,
|
|
15
|
+
or `None` to hide/remove it. The dialog content is updated
|
|
16
|
+
reactively on each re-render.
|
|
17
|
+
|
|
18
|
+
The hook automatically sets `open=True` on the dialog when it is
|
|
19
|
+
added to the overlay and removes it when `None` is passed or the
|
|
20
|
+
component unmounts.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
dialog: A :class:`~flet.DialogControl` to display, or `None`
|
|
24
|
+
to hide it.
|
|
25
|
+
"""
|
|
26
|
+
ref = use_ref(None)
|
|
27
|
+
page = context.page
|
|
28
|
+
|
|
29
|
+
prev = ref.current
|
|
30
|
+
|
|
31
|
+
if prev is not None and prev not in page._dialogs.controls:
|
|
32
|
+
ref.current = None
|
|
33
|
+
prev = None
|
|
34
|
+
|
|
35
|
+
if dialog is not None:
|
|
36
|
+
dialog.open = True
|
|
37
|
+
page._prepare_dialog(dialog)
|
|
38
|
+
if prev is not None and prev in page._dialogs.controls:
|
|
39
|
+
# Frozen diff: compares prev and dialog field-by-field,
|
|
40
|
+
# sends only actual deltas, and transfers _i via _migrate_state
|
|
41
|
+
# so Flutter preserves widget identity (e.g. TextField cursor).
|
|
42
|
+
page.session.patch_control(control=dialog, prev_control=prev, frozen=True)
|
|
43
|
+
# Strip _frozen set by _dataclass_added during frozen diff
|
|
44
|
+
# so we can later set open=False for dismissal.
|
|
45
|
+
if hasattr(dialog, "_frozen"):
|
|
46
|
+
del dialog._frozen
|
|
47
|
+
idx = page._dialogs.controls.index(prev)
|
|
48
|
+
page._dialogs.controls[idx] = dialog
|
|
49
|
+
ref.current = dialog
|
|
50
|
+
else:
|
|
51
|
+
page._dialogs.controls.append(dialog)
|
|
52
|
+
ref.current = dialog
|
|
53
|
+
page.session.schedule_update(page._dialogs)
|
|
54
|
+
elif prev is not None and prev.open:
|
|
55
|
+
# Dismiss: patch open=False so Flutter pops the dialog route.
|
|
56
|
+
# Keep prev in _dialogs.controls and ref.current so the dialog
|
|
57
|
+
# stays alive in session.__index (WeakValueDictionary) — Flutter
|
|
58
|
+
# needs the control present to dispatch the dismiss event. The
|
|
59
|
+
# wrapped dismiss handler removes it after Flutter signals close.
|
|
60
|
+
prev.open = False
|
|
61
|
+
page.session.patch_control(prev)
|
|
62
|
+
|
|
63
|
+
def _cleanup():
|
|
64
|
+
d = ref.current
|
|
65
|
+
if d is not None:
|
|
66
|
+
ref.current = None
|
|
67
|
+
if d.open:
|
|
68
|
+
d.open = False
|
|
69
|
+
page.session.patch_control(d)
|
|
70
|
+
|
|
71
|
+
use_effect(lambda: None, dependencies=[], cleanup=_cleanup)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
import weakref
|
|
2
3
|
from dataclasses import dataclass, field
|
|
3
4
|
from typing import (
|
|
4
5
|
TYPE_CHECKING,
|
|
@@ -44,6 +45,9 @@ from flet.controls.types import (
|
|
|
44
45
|
|
|
45
46
|
logger = logging.getLogger("flet")
|
|
46
47
|
|
|
48
|
+
_MANAGED_DIALOG_DISMISS_ORIGINAL = "_managed_dialog_dismiss_original"
|
|
49
|
+
_MANAGED_DIALOG_DISMISS_WRAPPER = "_managed_dialog_dismiss_wrapper"
|
|
50
|
+
|
|
47
51
|
if TYPE_CHECKING:
|
|
48
52
|
from flet.controls.theme import Theme
|
|
49
53
|
|
|
@@ -390,30 +394,8 @@ class BasePage(AdaptiveControl):
|
|
|
390
394
|
if dialog in self._dialogs.controls:
|
|
391
395
|
raise RuntimeError("Dialog is already opened")
|
|
392
396
|
|
|
393
|
-
original_on_dismiss = dialog.on_dismiss
|
|
394
|
-
|
|
395
|
-
async def wrapped_on_dismiss(*args):
|
|
396
|
-
"""
|
|
397
|
-
Remove dialog from stack and forward dismiss event to original handler.
|
|
398
|
-
|
|
399
|
-
Args:
|
|
400
|
-
*args: Dismiss event arguments passed by the framework.
|
|
401
|
-
"""
|
|
402
|
-
|
|
403
|
-
if dialog in self._dialogs.controls:
|
|
404
|
-
self._dialogs.controls.remove(dialog)
|
|
405
|
-
self._dialogs.update()
|
|
406
|
-
dialog.on_dismiss = original_on_dismiss
|
|
407
|
-
e = args[0]
|
|
408
|
-
if (
|
|
409
|
-
original_on_dismiss and (e.data is None or e.data) # e.data == True for
|
|
410
|
-
# TimePicker and DatePicker if they were dismissed without
|
|
411
|
-
# changing the value
|
|
412
|
-
):
|
|
413
|
-
await dialog._trigger_event("dismiss", e)
|
|
414
|
-
|
|
415
397
|
dialog.open = True
|
|
416
|
-
dialog
|
|
398
|
+
self._prepare_dialog(dialog)
|
|
417
399
|
|
|
418
400
|
self._dialogs.controls.append(dialog)
|
|
419
401
|
self._dialogs.update()
|
|
@@ -438,6 +420,52 @@ class BasePage(AdaptiveControl):
|
|
|
438
420
|
dialog.update()
|
|
439
421
|
return dialog
|
|
440
422
|
|
|
423
|
+
def _prepare_dialog(self, dialog: DialogControl) -> None:
|
|
424
|
+
self._set_dialog_parent(dialog)
|
|
425
|
+
self._wrap_dialog_on_dismiss(dialog)
|
|
426
|
+
|
|
427
|
+
def _set_dialog_parent(self, dialog: DialogControl) -> None:
|
|
428
|
+
dialog._parent = weakref.ref(self._dialogs)
|
|
429
|
+
|
|
430
|
+
def _get_original_dialog_on_dismiss(self, dialog: DialogControl):
|
|
431
|
+
wrapper = getattr(dialog, _MANAGED_DIALOG_DISMISS_WRAPPER, None)
|
|
432
|
+
if wrapper is not None and dialog.on_dismiss is wrapper:
|
|
433
|
+
return getattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL, None)
|
|
434
|
+
return dialog.on_dismiss
|
|
435
|
+
|
|
436
|
+
def _wrap_dialog_on_dismiss(self, dialog: DialogControl) -> None:
|
|
437
|
+
original_on_dismiss = self._get_original_dialog_on_dismiss(dialog)
|
|
438
|
+
|
|
439
|
+
async def wrapped_on_dismiss(*args):
|
|
440
|
+
# Keep the dialog mounted until Flutter reports dismiss. Removing it
|
|
441
|
+
# earlier can drop the post-animation dismiss callback entirely.
|
|
442
|
+
self._restore_dialog_on_dismiss(dialog)
|
|
443
|
+
self._remove_dialog(dialog)
|
|
444
|
+
e = args[0]
|
|
445
|
+
if (
|
|
446
|
+
original_on_dismiss and (e.data is None or e.data)
|
|
447
|
+
# e.data == True for TimePicker and DatePicker if they were
|
|
448
|
+
# dismissed without changing the value
|
|
449
|
+
):
|
|
450
|
+
await dialog._trigger_event("dismiss", e)
|
|
451
|
+
|
|
452
|
+
setattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL, original_on_dismiss)
|
|
453
|
+
setattr(dialog, _MANAGED_DIALOG_DISMISS_WRAPPER, wrapped_on_dismiss)
|
|
454
|
+
dialog.on_dismiss = wrapped_on_dismiss
|
|
455
|
+
|
|
456
|
+
def _restore_dialog_on_dismiss(self, dialog: DialogControl) -> None:
|
|
457
|
+
original_on_dismiss = getattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL, None)
|
|
458
|
+
if hasattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL):
|
|
459
|
+
delattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL)
|
|
460
|
+
if hasattr(dialog, _MANAGED_DIALOG_DISMISS_WRAPPER):
|
|
461
|
+
delattr(dialog, _MANAGED_DIALOG_DISMISS_WRAPPER)
|
|
462
|
+
dialog.on_dismiss = original_on_dismiss
|
|
463
|
+
|
|
464
|
+
def _remove_dialog(self, dialog: DialogControl) -> None:
|
|
465
|
+
if dialog in self._dialogs.controls:
|
|
466
|
+
self._dialogs.controls.remove(dialog)
|
|
467
|
+
self._dialogs.update()
|
|
468
|
+
|
|
441
469
|
async def show_drawer(self):
|
|
442
470
|
"""
|
|
443
471
|
Show the drawer.
|
|
@@ -101,6 +101,12 @@ class Context:
|
|
|
101
101
|
"""
|
|
102
102
|
self.__components_mode = True
|
|
103
103
|
|
|
104
|
+
def disable_components_mode(self):
|
|
105
|
+
"""
|
|
106
|
+
Disables components mode in the current context.
|
|
107
|
+
"""
|
|
108
|
+
self.__components_mode = False
|
|
109
|
+
|
|
104
110
|
def is_components_mode(self) -> bool:
|
|
105
111
|
"""
|
|
106
112
|
Returns whether the current context is in components mode.
|
|
@@ -56,13 +56,13 @@ class NavigationRailDestination(Control):
|
|
|
56
56
|
Represents a destination in a `NavigationRail`.
|
|
57
57
|
"""
|
|
58
58
|
|
|
59
|
-
icon:
|
|
59
|
+
icon: IconDataOrControl
|
|
60
60
|
"""
|
|
61
61
|
The [name of the icon](https://flet.dev/docs/types/icons) or `Control` of the \
|
|
62
62
|
destination.
|
|
63
63
|
|
|
64
|
-
If
|
|
65
|
-
not selected.
|
|
64
|
+
If :attr:`selected_icon` is provided, this will only be displayed when the
|
|
65
|
+
destination is not selected.
|
|
66
66
|
|
|
67
67
|
To make the NavigationRail more accessible, consider choosing an icon with a stroked
|
|
68
68
|
and filled version, such as `Icons.CLOUD` and `Icons.CLOUD_QUEUE`. The icon
|
|
@@ -105,6 +105,7 @@ class NavigationRail(LayoutControl):
|
|
|
105
105
|
A material widget that is meant to be displayed at the left or right of an app to \
|
|
106
106
|
navigate between a small number of views, typically between three and five.
|
|
107
107
|
|
|
108
|
+
Example:
|
|
108
109
|
```python
|
|
109
110
|
ft.NavigationRail(
|
|
110
111
|
selected_index=0,
|
|
@@ -208,6 +209,31 @@ class NavigationRail(LayoutControl):
|
|
|
208
209
|
rendered when `extended=True`.
|
|
209
210
|
"""
|
|
210
211
|
|
|
212
|
+
pin_leading_to_top: bool = True
|
|
213
|
+
"""
|
|
214
|
+
Whether to pin the :attr:`leading` control to the top of the rail.
|
|
215
|
+
|
|
216
|
+
If `False`, the leading control becomes part of the main group together with the
|
|
217
|
+
destinations and participates in scrolling/alignment.
|
|
218
|
+
"""
|
|
219
|
+
|
|
220
|
+
pin_trailing_to_bottom: bool = False
|
|
221
|
+
"""
|
|
222
|
+
Whether to pin the :attr:`trailing` control to the bottom of the rail.
|
|
223
|
+
|
|
224
|
+
If `False`, the trailing control becomes part of the main group together with the
|
|
225
|
+
destinations and participates in scrolling/alignment.
|
|
226
|
+
"""
|
|
227
|
+
|
|
228
|
+
scrollable: bool = False
|
|
229
|
+
"""
|
|
230
|
+
Whether the main group of :attr:`destinations` should become scrollable when \
|
|
231
|
+
vertical space is insufficient.
|
|
232
|
+
|
|
233
|
+
When :attr:`pin_leading_to_top` or :attr:`pin_trailing_to_bottom` are
|
|
234
|
+
`False`, the respective controls also become part of the scrollable group.
|
|
235
|
+
"""
|
|
236
|
+
|
|
211
237
|
min_width: Annotated[
|
|
212
238
|
Optional[Number],
|
|
213
239
|
V.ge(0),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flet
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.85.0.dev0
|
|
4
4
|
Summary: Flet for Python - easily build interactive multi-platform apps in Python
|
|
5
5
|
Author-email: "Appveyor Systems Inc." <hello@flet.dev>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -9,23 +9,23 @@ Project-URL: Repository, https://github.com/flet-dev/flet
|
|
|
9
9
|
Project-URL: Documentation, https://flet.dev/docs/
|
|
10
10
|
Requires-Python: >=3.10
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
|
-
Requires-Dist: flet-cli==0.
|
|
13
|
-
Requires-Dist: flet-web==0.
|
|
12
|
+
Requires-Dist: flet-cli==0.85.0.dev0; extra == "cli"
|
|
13
|
+
Requires-Dist: flet-web==0.85.0.dev0; extra == "web"
|
|
14
14
|
Requires-Dist: oauthlib>=3.2.2; platform_system != "Pyodide"
|
|
15
15
|
Requires-Dist: httpx>=0.28.1; platform_system != "Pyodide"
|
|
16
16
|
Requires-Dist: repath>=0.9.0
|
|
17
17
|
Requires-Dist: msgpack>=1.1.0
|
|
18
18
|
Requires-Dist: typing-extensions; python_version < "3.11"
|
|
19
19
|
Provides-Extra: all
|
|
20
|
-
Requires-Dist: flet-cli==0.
|
|
21
|
-
Requires-Dist: flet-web==0.
|
|
22
|
-
Requires-Dist: flet-desktop==0.
|
|
20
|
+
Requires-Dist: flet-cli==0.85.0.dev0; extra == "all"
|
|
21
|
+
Requires-Dist: flet-web==0.85.0.dev0; extra == "all"
|
|
22
|
+
Requires-Dist: flet-desktop==0.85.0.dev0; extra == "all"
|
|
23
23
|
Provides-Extra: cli
|
|
24
|
-
Requires-Dist: flet-cli==0.
|
|
24
|
+
Requires-Dist: flet-cli==0.85.0.dev0; extra == "cli"
|
|
25
25
|
Provides-Extra: desktop
|
|
26
|
-
Requires-Dist: flet-desktop==0.
|
|
26
|
+
Requires-Dist: flet-desktop==0.85.0.dev0; extra == "desktop"
|
|
27
27
|
Provides-Extra: web
|
|
28
|
-
Requires-Dist: flet-web==0.
|
|
28
|
+
Requires-Dist: flet-web==0.85.0.dev0; extra == "web"
|
|
29
29
|
|
|
30
30
|
<p align="center">
|
|
31
31
|
<a href="https://flet.dev"><img src="https://raw.githubusercontent.com/flet-dev/flet/refs/heads/main/media/logo/flet-logo.svg" height="150" alt="Flet logo"></a>
|
|
@@ -36,6 +36,7 @@ src/flet/components/hooks/__init__.py
|
|
|
36
36
|
src/flet/components/hooks/hook.py
|
|
37
37
|
src/flet/components/hooks/use_callback.py
|
|
38
38
|
src/flet/components/hooks/use_context.py
|
|
39
|
+
src/flet/components/hooks/use_dialog.py
|
|
39
40
|
src/flet/components/hooks/use_effect.py
|
|
40
41
|
src/flet/components/hooks/use_memo.py
|
|
41
42
|
src/flet/components/hooks/use_ref.py
|
|
@@ -301,5 +302,6 @@ tests/test_observable.py
|
|
|
301
302
|
tests/test_patch_dataclass.py
|
|
302
303
|
tests/test_session_disconnect_buffering.py
|
|
303
304
|
tests/test_skip_double_update.py
|
|
305
|
+
tests/test_use_dialog.py
|
|
304
306
|
tests/test_validation.py
|
|
305
307
|
tests/test_validation_benchmark.py
|
|
@@ -2,10 +2,10 @@ repath>=0.9.0
|
|
|
2
2
|
msgpack>=1.1.0
|
|
3
3
|
|
|
4
4
|
[:extra == "cli"]
|
|
5
|
-
flet-cli==0.
|
|
5
|
+
flet-cli==0.85.0.dev0
|
|
6
6
|
|
|
7
7
|
[:extra == "web"]
|
|
8
|
-
flet-web==0.
|
|
8
|
+
flet-web==0.85.0.dev0
|
|
9
9
|
|
|
10
10
|
[:platform_system != "Pyodide"]
|
|
11
11
|
oauthlib>=3.2.2
|
|
@@ -15,15 +15,15 @@ httpx>=0.28.1
|
|
|
15
15
|
typing-extensions
|
|
16
16
|
|
|
17
17
|
[all]
|
|
18
|
-
flet-cli==0.
|
|
19
|
-
flet-web==0.
|
|
20
|
-
flet-desktop==0.
|
|
18
|
+
flet-cli==0.85.0.dev0
|
|
19
|
+
flet-web==0.85.0.dev0
|
|
20
|
+
flet-desktop==0.85.0.dev0
|
|
21
21
|
|
|
22
22
|
[cli]
|
|
23
|
-
flet-cli==0.
|
|
23
|
+
flet-cli==0.85.0.dev0
|
|
24
24
|
|
|
25
25
|
[desktop]
|
|
26
|
-
flet-desktop==0.
|
|
26
|
+
flet-desktop==0.85.0.dev0
|
|
27
27
|
|
|
28
28
|
[web]
|
|
29
|
-
flet-web==0.
|
|
29
|
+
flet-web==0.85.0.dev0
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import weakref
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
import flet as ft
|
|
6
|
+
from flet.components.component import Component, Renderer
|
|
7
|
+
from flet.controls.base_control import BaseControl
|
|
8
|
+
from flet.controls.context import _context_page
|
|
9
|
+
from flet.controls.control_event import ControlEvent
|
|
10
|
+
from flet.messaging.protocol import configure_encode_object_for_msgpack
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class FakeSession:
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.patch_calls: list[tuple[object, dict]] = []
|
|
16
|
+
self.scheduled_updates: list[object] = []
|
|
17
|
+
self.index: dict[int, object] = {}
|
|
18
|
+
|
|
19
|
+
def patch_control(self, control, **kwargs):
|
|
20
|
+
self.patch_calls.append((control, kwargs))
|
|
21
|
+
control_id = getattr(control, "_i", None)
|
|
22
|
+
if control_id is not None:
|
|
23
|
+
self.index[control_id] = control
|
|
24
|
+
|
|
25
|
+
def schedule_update(self, control):
|
|
26
|
+
self.scheduled_updates.append(control)
|
|
27
|
+
|
|
28
|
+
def schedule_effect(self, hook, is_cleanup):
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
async def after_event(self, control):
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def render_component(component: Component, page: ft.Page) -> None:
|
|
36
|
+
component._state.hook_cursor = 0
|
|
37
|
+
token = _context_page.set(page)
|
|
38
|
+
try:
|
|
39
|
+
renderer = Renderer(component)
|
|
40
|
+
with renderer.with_context(), renderer._Frame(renderer, component):
|
|
41
|
+
component.fn(*component.args, **component.kwargs)
|
|
42
|
+
finally:
|
|
43
|
+
_context_page.reset(token)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def create_page() -> tuple[ft.Page, FakeSession]:
|
|
47
|
+
session = FakeSession()
|
|
48
|
+
page = ft.Page(sess=session)
|
|
49
|
+
page._dialogs._parent = weakref.ref(page)
|
|
50
|
+
return page, session
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@pytest.mark.asyncio
|
|
54
|
+
async def test_use_dialog_waits_for_dismiss_before_removing_dialog():
|
|
55
|
+
page, session = create_page()
|
|
56
|
+
show = True
|
|
57
|
+
dismiss_calls: list[str] = []
|
|
58
|
+
|
|
59
|
+
def body():
|
|
60
|
+
ft.use_dialog(
|
|
61
|
+
ft.AlertDialog(
|
|
62
|
+
title=ft.Text("Hello"),
|
|
63
|
+
on_dismiss=lambda e: dismiss_calls.append(e.name),
|
|
64
|
+
)
|
|
65
|
+
if show
|
|
66
|
+
else None
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
component = Component(fn=body, args=(), kwargs={})
|
|
70
|
+
|
|
71
|
+
render_component(component, page)
|
|
72
|
+
|
|
73
|
+
assert session.scheduled_updates == [page._dialogs]
|
|
74
|
+
assert len(page._dialogs.controls) == 1
|
|
75
|
+
|
|
76
|
+
dialog = page._dialogs.controls[0]
|
|
77
|
+
session.patch_calls.clear()
|
|
78
|
+
session.scheduled_updates.clear()
|
|
79
|
+
|
|
80
|
+
show = False
|
|
81
|
+
render_component(component, page)
|
|
82
|
+
|
|
83
|
+
assert page._dialogs.controls == [dialog]
|
|
84
|
+
assert dialog.open is False
|
|
85
|
+
assert session.patch_calls == [(dialog, {})]
|
|
86
|
+
assert session.scheduled_updates == []
|
|
87
|
+
|
|
88
|
+
await dialog.on_dismiss(ControlEvent(control=dialog, name="dismiss", data=None))
|
|
89
|
+
|
|
90
|
+
assert page._dialogs.controls == []
|
|
91
|
+
assert dismiss_calls == ["dismiss"]
|
|
92
|
+
assert session.patch_calls[-1] == (page._dialogs, {})
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@pytest.mark.asyncio
|
|
96
|
+
async def test_use_dialog_unmount_keeps_dialog_until_dismiss_event():
|
|
97
|
+
page, session = create_page()
|
|
98
|
+
dismiss_calls: list[str] = []
|
|
99
|
+
|
|
100
|
+
def body():
|
|
101
|
+
ft.use_dialog(
|
|
102
|
+
ft.AlertDialog(
|
|
103
|
+
title=ft.Text("Hello"),
|
|
104
|
+
on_dismiss=lambda e: dismiss_calls.append(e.name),
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
component = Component(fn=body, args=(), kwargs={})
|
|
109
|
+
render_component(component, page)
|
|
110
|
+
|
|
111
|
+
dialog = page._dialogs.controls[0]
|
|
112
|
+
session.patch_calls.clear()
|
|
113
|
+
session.scheduled_updates.clear()
|
|
114
|
+
component._schedule_effect = lambda hook, is_cleanup=False: (
|
|
115
|
+
hook.cleanup() if is_cleanup and hook.cleanup else None
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
component.will_unmount()
|
|
119
|
+
|
|
120
|
+
assert page._dialogs.controls == [dialog]
|
|
121
|
+
assert dialog.open is False
|
|
122
|
+
assert session.patch_calls == [(dialog, {})]
|
|
123
|
+
assert session.scheduled_updates == []
|
|
124
|
+
|
|
125
|
+
await dialog.on_dismiss(ControlEvent(control=dialog, name="dismiss", data=None))
|
|
126
|
+
|
|
127
|
+
assert page._dialogs.controls == []
|
|
128
|
+
assert dismiss_calls == ["dismiss"]
|
|
129
|
+
assert session.patch_calls[-1] == (page._dialogs, {})
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@pytest.mark.asyncio
|
|
133
|
+
async def test_show_dialog_still_removes_dialog_on_dismiss():
|
|
134
|
+
page, session = create_page()
|
|
135
|
+
dismiss_calls: list[str] = []
|
|
136
|
+
dialog = ft.AlertDialog(
|
|
137
|
+
title=ft.Text("Hello"),
|
|
138
|
+
on_dismiss=lambda e: dismiss_calls.append(e.name),
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
page.show_dialog(dialog)
|
|
142
|
+
|
|
143
|
+
assert page._dialogs.controls == [dialog]
|
|
144
|
+
assert dialog.open is True
|
|
145
|
+
assert session.patch_calls == [(page._dialogs, {})]
|
|
146
|
+
|
|
147
|
+
await dialog.on_dismiss(ControlEvent(control=dialog, name="dismiss", data=None))
|
|
148
|
+
|
|
149
|
+
assert page._dialogs.controls == []
|
|
150
|
+
assert dismiss_calls == ["dismiss"]
|
|
151
|
+
assert session.patch_calls[-1] == (page._dialogs, {})
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def test_prepare_dialog_does_not_store_callbacks_in_serialized_fields():
|
|
155
|
+
page, _ = create_page()
|
|
156
|
+
dialog = ft.AlertDialog(
|
|
157
|
+
title=ft.Text("Hello"),
|
|
158
|
+
on_dismiss=lambda e: None,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
page._prepare_dialog(dialog)
|
|
162
|
+
|
|
163
|
+
encoded = configure_encode_object_for_msgpack(BaseControl)(dialog)
|
|
164
|
+
|
|
165
|
+
assert encoded["on_dismiss"] is True
|
|
166
|
+
assert "_internals" not in encoded
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|