flet 1.0.4__tar.gz → 1.1.0.dev1__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-1.0.4 → flet-1.1.0.dev1}/PKG-INFO +9 -9
- {flet-1.0.4 → flet-1.1.0.dev1}/pyproject.toml +10 -9
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/__init__.py +27 -1
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/app.py +27 -10
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/flet_app.py +113 -2
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/interactive_viewer.py +118 -4
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/semantics.py +12 -2
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/window.py +7 -2
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/events.py +36 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/layout_control.py +29 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/list_tile.py +8 -1
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/navigation_rail.py +7 -1
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/popup_menu_button.py +10 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/switch.py +9 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/object_patch.py +18 -2
- flet-1.1.0.dev1/src/flet/controls/package_info.py +117 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/page.py +96 -8
- flet-1.1.0.dev1/src/flet/controls/query_string.py +102 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/semantics_service.py +2 -1
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/template_route.py +8 -3
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/theme.py +230 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/types.py +18 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/messaging/connection.py +10 -4
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/messaging/flet_socket_server.py +9 -2
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/messaging/pyodide_connection.py +9 -2
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/messaging/session.py +34 -14
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/pytest_plugin.py +22 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/testing/flet_test_app.py +155 -35
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/version.py +2 -2
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet.egg-info/PKG-INFO +9 -9
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet.egg-info/SOURCES.txt +9 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet.egg-info/requires.txt +8 -8
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_assets_dir_resolution.py +31 -0
- flet-1.1.0.dev1/tests/test_component_moved_subtree.py +151 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_events.py +49 -1
- flet-1.1.0.dev1/tests/test_flet_app.py +115 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_icons.py +32 -0
- flet-1.1.0.dev1/tests/test_input_decoration_theme.py +90 -0
- flet-1.1.0.dev1/tests/test_layout_constraints.py +175 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_object_diff_in_place.py +2 -0
- flet-1.1.0.dev1/tests/test_package_info.py +110 -0
- flet-1.1.0.dev1/tests/test_pytest_plugin.py +47 -0
- flet-1.1.0.dev1/tests/test_query_string.py +115 -0
- flet-1.1.0.dev1/tests/test_template_route.py +35 -0
- flet-1.0.4/src/flet/controls/query_string.py +0 -126
- {flet-1.0.4 → flet-1.1.0.dev1}/README.md +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/setup.cfg +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/authorization.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/authorization_service.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/group.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/oauth_provider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/oauth_token.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/providers/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/providers/github_oauth_provider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/providers/google_oauth_provider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/auth/user.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/canvas/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/cli.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/component.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/component_decorator.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/component_owned.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/hooks/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/hooks/hook.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/hooks/use_callback.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/hooks/use_context.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/hooks/use_dialog.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/hooks/use_effect.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/hooks/use_memo.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/hooks/use_ref.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/hooks/use_state.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/memo.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/observable.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/public_utils.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/router.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/components/utils.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/action_control.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/adaptive_control.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/alignment.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/animation.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/base_control.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/base_page.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/blur.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/border.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/border_radius.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/box.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/buttons.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/client_action.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/colors.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/context.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/control.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/control_event.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/control_state.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/animated_switcher.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/autofill_group.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/arc.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/canvas.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/circle.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/color.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/fill.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/image.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/line.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/oval.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/path.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/points.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/rect.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/shadow.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/shape.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/canvas/text.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/column.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/dismissible.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/drag_target.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/draggable.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/gesture_detector.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/grid_view.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/hero.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/icon.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/image.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/keyboard_listener.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/list_view.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/markdown.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/merge_semantics.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/page_view.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/pagelet.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/placeholder.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/raw_image.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/responsive_row.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/rotated_box.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/row.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/safe_area.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/screenshot.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/shader_mask.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/shimmer.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/stack.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/text.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/text_span.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/transparent_pointer.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/view.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/core/window_drag_area.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/device_info.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/dialog_control.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/duration.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/embed_json_encoder.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/exceptions.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/geometry.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/gradients.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/icon_data.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/id_counter.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/keys.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/margin.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/alert_dialog.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/app_bar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/auto_complete.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/badge.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/banner.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/bottom_app_bar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/bottom_sheet.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/card.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/checkbox.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/chip.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/circle_avatar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/container.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/context_menu.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/datatable.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/date_picker.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/date_range_picker.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/divider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/dropdown.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/dropdownm2.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/expansion_panel.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/expansion_tile.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/filled_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/filled_tonal_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/floating_action_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/form_field_control.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/icon_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/icons.json +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/icons.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/icons.pyi +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/menu_bar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/menu_item_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/navigation_bar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/navigation_drawer.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/outlined_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/progress_bar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/progress_ring.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/radio.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/radio_group.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/range_slider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/reorderable_list_view.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/search_bar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/segmented_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/selection_area.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/slider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/snack_bar.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/submenu_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/tabs.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/text_button.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/textfield.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/time_picker.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/tooltip.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/material/vertical_divider.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/multi_view.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/padding.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/painting.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/ref.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/scrollable_control.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/accelerometer.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/barometer.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/battery.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/browser_context_menu.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/clipboard.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/connectivity.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/file_picker.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/gyroscope.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/haptic_feedback.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/magnetometer.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/screen_brightness.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/sensor_error_event.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/service.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/shake_detector.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/share.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/shared_preferences.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/storage_paths.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/url_launcher.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/user_accelerometer.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/services/wakelock.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/text_style.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/transform.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/controls/value_types.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/data_channel.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/fastapi/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/messaging/flet_dart_bridge_server.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/messaging/protocol.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/messaging/session_store.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/pubsub/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/pubsub/pubsub_client.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/pubsub/pubsub_hub.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/py.typed +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/security/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/testing/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/testing/finder.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/testing/remote_tester.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/testing/tester.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/__init__.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/browser.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/classproperty.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/deprecated.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/deprecated_enum.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/environment.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/files.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/from_dict.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/griffe_deprecations.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/hashing.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/json_utils.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/locks.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/network.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/object_model.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/once.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/pip.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/platform_utils.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/slugify.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/strings.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/typing_utils.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/validation.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet/utils/vector.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet.egg-info/dependency_links.txt +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet.egg-info/entry_points.txt +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/src/flet.egg-info/top_level.txt +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_app_logging.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_auth_lazy_imports.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_base_control.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_client_actions.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_colors.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_component_diff.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_component_effects.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_component_owned_identity.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_component_renderer.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_context_auto_update.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_dataclasses.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_datetime.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_deprecated.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_environment.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_files.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_flet_app_wait_idle.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_from_dict.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_generator_handler_yield.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_griffe_deprecations.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_object_diff_frozen.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_object_diff_memory_churn.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_object_diff_performance.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_observable.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_patch_dataclass.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_raw_image_pixels.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_router_modal.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_router_pop.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_router_recursive.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_semantics.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_service_registration.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_session_disconnect_buffering.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_skip_double_update.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_textfield_paste_files.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_use_dialog.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_validation.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_validation_benchmark.py +0 -0
- {flet-1.0.4 → flet-1.1.0.dev1}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flet
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.1.0.dev1
|
|
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==1.0.
|
|
13
|
-
Requires-Dist: flet-web==1.0.
|
|
12
|
+
Requires-Dist: flet-cli==1.1.0.dev1; extra == "cli"
|
|
13
|
+
Requires-Dist: flet-web==1.1.0.dev1; extra == "web"
|
|
14
14
|
Requires-Dist: oauthlib>=3.2.2; platform_system != "Emscripten"
|
|
15
15
|
Requires-Dist: httpx>=0.28.1; platform_system != "Emscripten"
|
|
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==1.0.
|
|
21
|
-
Requires-Dist: flet-web==1.0.
|
|
22
|
-
Requires-Dist: flet-desktop==1.0.
|
|
20
|
+
Requires-Dist: flet-cli==1.1.0.dev1; extra == "all"
|
|
21
|
+
Requires-Dist: flet-web==1.1.0.dev1; extra == "all"
|
|
22
|
+
Requires-Dist: flet-desktop==1.1.0.dev1; extra == "all"
|
|
23
23
|
Provides-Extra: cli
|
|
24
|
-
Requires-Dist: flet-cli==1.0.
|
|
24
|
+
Requires-Dist: flet-cli==1.1.0.dev1; extra == "cli"
|
|
25
25
|
Provides-Extra: desktop
|
|
26
|
-
Requires-Dist: flet-desktop==1.0.
|
|
26
|
+
Requires-Dist: flet-desktop==1.1.0.dev1; extra == "desktop"
|
|
27
27
|
Provides-Extra: web
|
|
28
|
-
Requires-Dist: flet-web==1.0.
|
|
28
|
+
Requires-Dist: flet-web==1.1.0.dev1; extra == "web"
|
|
29
29
|
Provides-Extra: test
|
|
30
30
|
Requires-Dist: pytest>=7.2.0; extra == "test"
|
|
31
31
|
Requires-Dist: pytest-asyncio>=1.1.0; extra == "test"
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "flet"
|
|
3
|
-
version = "1.0.
|
|
3
|
+
version = "1.1.0.dev1"
|
|
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==1.0.
|
|
11
|
-
"flet-web==1.0.
|
|
10
|
+
"flet-cli==1.1.0.dev1; extra == 'cli'",
|
|
11
|
+
"flet-web==1.1.0.dev1; extra == 'web'",
|
|
12
12
|
"oauthlib >=3.2.2; platform_system != 'Emscripten'",
|
|
13
13
|
"httpx >=0.28.1; platform_system != 'Emscripten'",
|
|
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==1.0.
|
|
27
|
-
"flet-web==1.0.
|
|
28
|
-
"flet-desktop==1.0.
|
|
26
|
+
"flet-cli==1.1.0.dev1",
|
|
27
|
+
"flet-web==1.1.0.dev1",
|
|
28
|
+
"flet-desktop==1.1.0.dev1",
|
|
29
29
|
]
|
|
30
|
-
cli = ["flet-cli==1.0.
|
|
30
|
+
cli = ["flet-cli==1.1.0.dev1"]
|
|
31
31
|
desktop = [
|
|
32
|
-
"flet-desktop==1.0.
|
|
32
|
+
"flet-desktop==1.1.0.dev1",
|
|
33
33
|
]
|
|
34
|
-
web = ["flet-web==1.0.
|
|
34
|
+
web = ["flet-web==1.1.0.dev1"]
|
|
35
35
|
# Dependencies needed to run integration tests written with `flet.testing`
|
|
36
36
|
# (the `flet test` command / the pytest plugin). Pillow/numpy/scikit-image
|
|
37
37
|
# back screenshot and GIF comparison.
|
|
@@ -67,6 +67,7 @@ extensions = [
|
|
|
67
67
|
"flet-permission-handler",
|
|
68
68
|
"flet-rive",
|
|
69
69
|
"flet-secure-storage",
|
|
70
|
+
"flet-shadcn-ui",
|
|
70
71
|
"flet-spinkit",
|
|
71
72
|
"flet-video",
|
|
72
73
|
"flet-webview",
|
|
@@ -158,13 +158,17 @@ if TYPE_CHECKING:
|
|
|
158
158
|
from flet.controls.core.flet_app import (
|
|
159
159
|
FletApp,
|
|
160
160
|
FletAppOutputEvent,
|
|
161
|
+
FletAppWindowEvent,
|
|
161
162
|
)
|
|
162
163
|
from flet.controls.core.gesture_detector import GestureDetector
|
|
163
164
|
from flet.controls.core.grid_view import GridView
|
|
164
165
|
from flet.controls.core.hero import Hero
|
|
165
166
|
from flet.controls.core.icon import Icon
|
|
166
167
|
from flet.controls.core.image import Image
|
|
167
|
-
from flet.controls.core.interactive_viewer import
|
|
168
|
+
from flet.controls.core.interactive_viewer import (
|
|
169
|
+
InteractiveViewer,
|
|
170
|
+
InteractiveViewerTransform,
|
|
171
|
+
)
|
|
168
172
|
from flet.controls.core.keyboard_listener import (
|
|
169
173
|
KeyboardListener,
|
|
170
174
|
KeyDownEvent,
|
|
@@ -295,6 +299,7 @@ if TYPE_CHECKING:
|
|
|
295
299
|
DragUpdateEvent,
|
|
296
300
|
ForcePressEvent,
|
|
297
301
|
HoverEvent,
|
|
302
|
+
InteractiveViewerTransformEvent,
|
|
298
303
|
LongPressDownEvent,
|
|
299
304
|
LongPressEndEvent,
|
|
300
305
|
LongPressMoveUpdateEvent,
|
|
@@ -513,6 +518,7 @@ if TYPE_CHECKING:
|
|
|
513
518
|
)
|
|
514
519
|
from flet.controls.material.vertical_divider import VerticalDivider
|
|
515
520
|
from flet.controls.multi_view import MultiView
|
|
521
|
+
from flet.controls.package_info import PackageInfo
|
|
516
522
|
from flet.controls.padding import (
|
|
517
523
|
Padding,
|
|
518
524
|
PaddingValue,
|
|
@@ -650,6 +656,7 @@ if TYPE_CHECKING:
|
|
|
650
656
|
FloatingActionButtonTheme,
|
|
651
657
|
IconButtonTheme,
|
|
652
658
|
IconTheme,
|
|
659
|
+
InputDecorationTheme,
|
|
653
660
|
ListTileTheme,
|
|
654
661
|
NavigationBarTheme,
|
|
655
662
|
NavigationDrawerTheme,
|
|
@@ -670,8 +677,10 @@ if TYPE_CHECKING:
|
|
|
670
677
|
SystemOverlayStyle,
|
|
671
678
|
TabBarTheme,
|
|
672
679
|
TextButtonTheme,
|
|
680
|
+
TextFieldTheme,
|
|
673
681
|
TextTheme,
|
|
674
682
|
Theme,
|
|
683
|
+
ThemeSurfaces,
|
|
675
684
|
TimePickerTheme,
|
|
676
685
|
TooltipTheme,
|
|
677
686
|
)
|
|
@@ -705,6 +714,7 @@ if TYPE_CHECKING:
|
|
|
705
714
|
Locale,
|
|
706
715
|
LocaleConfiguration,
|
|
707
716
|
MainAxisAlignment,
|
|
717
|
+
MaterialTapTargetSize,
|
|
708
718
|
MouseCursor,
|
|
709
719
|
NotchShape,
|
|
710
720
|
Number,
|
|
@@ -936,6 +946,7 @@ __all__ = [
|
|
|
936
946
|
"FilterQuality",
|
|
937
947
|
"FletApp",
|
|
938
948
|
"FletAppOutputEvent",
|
|
949
|
+
"FletAppWindowEvent",
|
|
939
950
|
"FletException",
|
|
940
951
|
"FletPageDisconnectedException",
|
|
941
952
|
"FletUnimplementedPlatformException",
|
|
@@ -967,8 +978,11 @@ __all__ = [
|
|
|
967
978
|
"Image",
|
|
968
979
|
"ImageRepeat",
|
|
969
980
|
"InputBorder",
|
|
981
|
+
"InputDecorationTheme",
|
|
970
982
|
"InputFilter",
|
|
971
983
|
"InteractiveViewer",
|
|
984
|
+
"InteractiveViewerTransform",
|
|
985
|
+
"InteractiveViewerTransformEvent",
|
|
972
986
|
"IosDeviceInfo",
|
|
973
987
|
"IosUtsname",
|
|
974
988
|
"Key",
|
|
@@ -1010,6 +1024,7 @@ __all__ = [
|
|
|
1010
1024
|
"MarkdownCustomCodeTheme",
|
|
1011
1025
|
"MarkdownExtensionSet",
|
|
1012
1026
|
"MarkdownStyleSheet",
|
|
1027
|
+
"MaterialTapTargetSize",
|
|
1013
1028
|
"Matrix4",
|
|
1014
1029
|
"MenuBar",
|
|
1015
1030
|
"MenuItemButton",
|
|
@@ -1048,6 +1063,7 @@ __all__ = [
|
|
|
1048
1063
|
"OutlinedButtonTheme",
|
|
1049
1064
|
"OutlinedIconButton",
|
|
1050
1065
|
"OverlayVisibilityMode",
|
|
1066
|
+
"PackageInfo",
|
|
1051
1067
|
"Padding",
|
|
1052
1068
|
"PaddingValue",
|
|
1053
1069
|
"Page",
|
|
@@ -1188,6 +1204,7 @@ __all__ = [
|
|
|
1188
1204
|
"TextDecorationStyle",
|
|
1189
1205
|
"TextField",
|
|
1190
1206
|
"TextFieldPasteFilesEvent",
|
|
1207
|
+
"TextFieldTheme",
|
|
1191
1208
|
"TextOnlyInputFilter",
|
|
1192
1209
|
"TextOverflow",
|
|
1193
1210
|
"TextSelection",
|
|
@@ -1199,6 +1216,7 @@ __all__ = [
|
|
|
1199
1216
|
"TextThemeStyle",
|
|
1200
1217
|
"Theme",
|
|
1201
1218
|
"ThemeMode",
|
|
1219
|
+
"ThemeSurfaces",
|
|
1202
1220
|
"TileAffinity",
|
|
1203
1221
|
"TimePicker",
|
|
1204
1222
|
"TimePickerEntryMode",
|
|
@@ -1454,6 +1472,8 @@ _LAZY = {
|
|
|
1454
1472
|
"DropdownM2": "flet.controls.material.dropdownm2",
|
|
1455
1473
|
"DropdownOption": "flet.controls.material.dropdown",
|
|
1456
1474
|
"DropdownTheme": "flet.controls.theme",
|
|
1475
|
+
"InputDecorationTheme": "flet.controls.theme",
|
|
1476
|
+
"TextFieldTheme": "flet.controls.theme",
|
|
1457
1477
|
"Duration": "flet.controls.duration",
|
|
1458
1478
|
"DurationValue": "flet.controls.duration",
|
|
1459
1479
|
"Event": "flet.controls.control_event",
|
|
@@ -1478,6 +1498,7 @@ _LAZY = {
|
|
|
1478
1498
|
"FilterQuality": "flet.controls.box",
|
|
1479
1499
|
"FletApp": "flet.controls.core.flet_app",
|
|
1480
1500
|
"FletAppOutputEvent": "flet.controls.core.flet_app",
|
|
1501
|
+
"FletAppWindowEvent": "flet.controls.core.flet_app",
|
|
1481
1502
|
"FletException": "flet.controls.exceptions",
|
|
1482
1503
|
"FletPageDisconnectedException": "flet.controls.exceptions",
|
|
1483
1504
|
"FletUnimplementedPlatformException": "flet.controls.exceptions",
|
|
@@ -1511,6 +1532,8 @@ _LAZY = {
|
|
|
1511
1532
|
"InputBorder": "flet.controls.material.form_field_control",
|
|
1512
1533
|
"InputFilter": "flet.controls.material.textfield",
|
|
1513
1534
|
"InteractiveViewer": "flet.controls.core.interactive_viewer",
|
|
1535
|
+
"InteractiveViewerTransform": "flet.controls.core.interactive_viewer",
|
|
1536
|
+
"InteractiveViewerTransformEvent": "flet.controls.events",
|
|
1514
1537
|
"IosDeviceInfo": "flet.controls.device_info",
|
|
1515
1538
|
"IosUtsname": "flet.controls.device_info",
|
|
1516
1539
|
"Key": "flet.controls.keys",
|
|
@@ -1590,6 +1613,7 @@ _LAZY = {
|
|
|
1590
1613
|
"OutlinedButtonTheme": "flet.controls.theme",
|
|
1591
1614
|
"OutlinedIconButton": "flet.controls.material.icon_button",
|
|
1592
1615
|
"OverlayVisibilityMode": "flet.controls.cupertino.cupertino_textfield",
|
|
1616
|
+
"PackageInfo": "flet.controls.package_info",
|
|
1593
1617
|
"Padding": "flet.controls.padding",
|
|
1594
1618
|
"PaddingValue": "flet.controls.padding",
|
|
1595
1619
|
"Page": "flet.controls.page",
|
|
@@ -1741,6 +1765,7 @@ _LAZY = {
|
|
|
1741
1765
|
"TextThemeStyle": "flet.controls.text_style",
|
|
1742
1766
|
"Theme": "flet.controls.theme",
|
|
1743
1767
|
"ThemeMode": "flet.controls.types",
|
|
1768
|
+
"ThemeSurfaces": "flet.controls.theme",
|
|
1744
1769
|
"TileAffinity": "flet.controls.material.expansion_tile",
|
|
1745
1770
|
"TimePicker": "flet.controls.material.time_picker",
|
|
1746
1771
|
"TimePickerEntryMode": "flet.controls.material.time_picker",
|
|
@@ -1768,6 +1793,7 @@ _LAZY = {
|
|
|
1768
1793
|
"ViewPopEvent": "flet.controls.page",
|
|
1769
1794
|
"ViewsPopUntilEvent": "flet.controls.page",
|
|
1770
1795
|
"VisualDensity": "flet.controls.types",
|
|
1796
|
+
"MaterialTapTargetSize": "flet.controls.types",
|
|
1771
1797
|
"Wakelock": "flet.controls.services.wakelock",
|
|
1772
1798
|
"WebBrowserName": "flet.controls.device_info",
|
|
1773
1799
|
"WebDeviceInfo": "flet.controls.device_info",
|
|
@@ -30,10 +30,21 @@ from flet.utils.pip import (
|
|
|
30
30
|
|
|
31
31
|
logger = logging.getLogger("flet")
|
|
32
32
|
|
|
33
|
-
#: Conventional assets directory name, used as the default for `assets_dir`.
|
|
34
|
-
#: A missing directory of this name is unremarkable; any other value was
|
|
35
|
-
#: chosen deliberately, so a missing one is reported.
|
|
36
33
|
DEFAULT_ASSETS_DIR = "assets"
|
|
34
|
+
"""Conventional assets directory name, used as the default for `assets_dir`.
|
|
35
|
+
|
|
36
|
+
A missing directory of this name is unremarkable; any other value was chosen
|
|
37
|
+
deliberately, so a missing one is reported.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
DISPLAY_ASSETS_DIR_SUFFIX = "_ASSETS_DIR"
|
|
41
|
+
"""Suffix of the line on which an app started by `flet run` reports its assets dir.
|
|
42
|
+
|
|
43
|
+
Appended to `FLET_DISPLAY_URL_PREFIX`, it starts the line the app prints just
|
|
44
|
+
before its page URL line, with its resolved assets directory (empty when it has
|
|
45
|
+
none). `flet run` opens the desktop client with that directory, so the app's own
|
|
46
|
+
`assets_dir` reaches it.
|
|
47
|
+
"""
|
|
37
48
|
|
|
38
49
|
AppCallable = Callable[[Page], Union[Any, Awaitable[Any]]]
|
|
39
50
|
"""Type alias for Flet app lifecycle callbacks.
|
|
@@ -222,11 +233,15 @@ async def run_async(
|
|
|
222
233
|
"""
|
|
223
234
|
Handle app-start notification by logging/printing URL and optional browser open.
|
|
224
235
|
|
|
236
|
+
When started by `flet run`, the resolved assets directory is printed on
|
|
237
|
+
its own line first, so `flet run` can open the desktop client with it.
|
|
238
|
+
|
|
225
239
|
Args:
|
|
226
240
|
page_url: Resolved URL of the running app.
|
|
227
241
|
"""
|
|
228
242
|
|
|
229
243
|
if url_prefix is not None:
|
|
244
|
+
print(f"{url_prefix}{DISPLAY_ASSETS_DIR_SUFFIX}", assets_dir or "")
|
|
230
245
|
parts = [url_prefix, page_url]
|
|
231
246
|
if view is not None:
|
|
232
247
|
parts.append(view.value)
|
|
@@ -688,9 +703,10 @@ def __get_assets_dir_path(assets_dir: Optional[str], relative_to_cwd=False):
|
|
|
688
703
|
such a directory, so a missing one is unremarkable; any other value was
|
|
689
704
|
chosen deliberately, so a missing one is a mistake worth a warning.
|
|
690
705
|
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
706
|
+
`FLET_ASSETS_DIR` takes precedence and is never dropped: it is always set
|
|
707
|
+
on purpose, so a bad value there is left for downstream to report. When it
|
|
708
|
+
is set, `assets_dir` is not checked, so nothing is logged about a
|
|
709
|
+
directory that isn't used.
|
|
694
710
|
|
|
695
711
|
Args:
|
|
696
712
|
assets_dir: Input assets directory path.
|
|
@@ -702,6 +718,11 @@ def __get_assets_dir_path(assets_dir: Optional[str], relative_to_cwd=False):
|
|
|
702
718
|
exist.
|
|
703
719
|
"""
|
|
704
720
|
|
|
721
|
+
env_assets_dir = os.getenv("FLET_ASSETS_DIR")
|
|
722
|
+
if env_assets_dir:
|
|
723
|
+
logger.info("Assets path configured: %s (FLET_ASSETS_DIR)", env_assets_dir)
|
|
724
|
+
return env_assets_dir
|
|
725
|
+
|
|
705
726
|
if assets_dir:
|
|
706
727
|
requested = assets_dir
|
|
707
728
|
if not Path(assets_dir).is_absolute():
|
|
@@ -724,10 +745,6 @@ def __get_assets_dir_path(assets_dir: Optional[str], relative_to_cwd=False):
|
|
|
724
745
|
else:
|
|
725
746
|
logger.warning("assets_dir does not exist: %s", assets_dir)
|
|
726
747
|
assets_dir = None
|
|
727
|
-
|
|
728
|
-
env_assets_dir = os.getenv("FLET_ASSETS_DIR")
|
|
729
|
-
if env_assets_dir:
|
|
730
|
-
assets_dir = env_assets_dir
|
|
731
748
|
return assets_dir
|
|
732
749
|
|
|
733
750
|
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
2
|
from typing import Any, Optional
|
|
3
3
|
|
|
4
4
|
from flet.controls.base_control import control
|
|
5
5
|
from flet.controls.control_event import ControlEventHandler, Event, EventHandler
|
|
6
6
|
from flet.controls.layout_control import LayoutControl
|
|
7
|
+
from flet.controls.padding import PaddingValue
|
|
8
|
+
from flet.controls.types import Brightness
|
|
7
9
|
|
|
8
|
-
__all__ = ["FletApp", "FletAppOutputEvent"]
|
|
10
|
+
__all__ = ["FletApp", "FletAppOutputEvent", "FletAppWindowEvent"]
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
@dataclass
|
|
@@ -21,6 +23,21 @@ class FletAppOutputEvent(Event["FletApp"]):
|
|
|
21
23
|
"""True for stderr writes; False for stdout."""
|
|
22
24
|
|
|
23
25
|
|
|
26
|
+
@dataclass
|
|
27
|
+
class FletAppWindowEvent(Event["FletApp"]):
|
|
28
|
+
"""The embedded app asked its window to do something."""
|
|
29
|
+
|
|
30
|
+
action: str
|
|
31
|
+
"""Either a `Window` method name (`close`, `maximize`, `minimize`,
|
|
32
|
+
`center`, `destroy`, ...) or `"set"` when the app wrote window properties
|
|
33
|
+
directly."""
|
|
34
|
+
|
|
35
|
+
# Not `data`: that name is already the base Event's payload, and shadowing
|
|
36
|
+
# it with a default reorders the base's own non-default fields.
|
|
37
|
+
args: dict[str, Any] = field(default_factory=dict, metadata={"data_field": "data"})
|
|
38
|
+
"""Method arguments, or the properties written when `action` is `"set"`."""
|
|
39
|
+
|
|
40
|
+
|
|
24
41
|
@control("FletApp")
|
|
25
42
|
class FletApp(LayoutControl):
|
|
26
43
|
"""
|
|
@@ -37,6 +54,75 @@ class FletApp(LayoutControl):
|
|
|
37
54
|
Optional dictionary of arguments to pass to the Flet app.
|
|
38
55
|
"""
|
|
39
56
|
|
|
57
|
+
route: Optional[str] = None
|
|
58
|
+
"""
|
|
59
|
+
The embedded app's current route.
|
|
60
|
+
|
|
61
|
+
Two-way: setting it navigates the embedded app, and when the embedded app
|
|
62
|
+
navigates itself this property is updated to match and
|
|
63
|
+
[`on_route_change`][(c).] fires. Leave it `None` to let the embedded app
|
|
64
|
+
own its own routing.
|
|
65
|
+
|
|
66
|
+
Note:
|
|
67
|
+
The embedded app routes locally - it never touches the browser address
|
|
68
|
+
bar or the platform's deep links, both of which belong to the host app.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
title: Optional[str] = None
|
|
72
|
+
"""
|
|
73
|
+
The embedded app's `page.title`.
|
|
74
|
+
|
|
75
|
+
Written by the client whenever the embedded app sets its title, together
|
|
76
|
+
with [`on_title_change`][(c).]. A guest's title belongs to whatever window
|
|
77
|
+
its host draws around it - it does not touch the real OS window, because
|
|
78
|
+
the window service is suppressed for embedded apps.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
window_state: Optional[dict[str, Any]] = None
|
|
82
|
+
"""
|
|
83
|
+
The simulated window the embedded app should believe it lives in.
|
|
84
|
+
|
|
85
|
+
Keys are [`Window`][flet.Window] property names - `width`, `height`,
|
|
86
|
+
`top`, `left`, `maximized`, `minimized`, `full_screen`, `focused`. What
|
|
87
|
+
you set here is what the embedded app reads back from `page.window`, and
|
|
88
|
+
changing it raises the matching `page.window.on_event` inside the app
|
|
89
|
+
(`resize`, `maximize`, `focus`, ...) exactly as a real window would.
|
|
90
|
+
|
|
91
|
+
An embedded app never drives the real OS window, so without this its
|
|
92
|
+
`page.window` is inert.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
media_padding: Optional[PaddingValue] = None
|
|
96
|
+
"""
|
|
97
|
+
Overrides the safe-area insets the embedded app sees.
|
|
98
|
+
|
|
99
|
+
The embedded app normally inherits the host window's `MediaQuery`, so on a
|
|
100
|
+
desktop window its insets are zero regardless of what the app is being
|
|
101
|
+
previewed as. Setting this makes the embedded app lay out as though it had
|
|
102
|
+
those insets: `page.media.padding` reports them, and
|
|
103
|
+
[`SafeArea`][flet.SafeArea] avoids them.
|
|
104
|
+
|
|
105
|
+
Intended for previewing a phone layout inside a desktop window - a device
|
|
106
|
+
frame in a designer, say - where the chrome drawn around the app is not
|
|
107
|
+
something the platform knows about.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
platform_brightness: Optional[Brightness] = None
|
|
111
|
+
"""
|
|
112
|
+
Overrides the system light/dark appearance the embedded app sees.
|
|
113
|
+
|
|
114
|
+
By default the embedded app follows the host's platform brightness. Set
|
|
115
|
+
this to preview it as though its device were in light or dark mode: an app
|
|
116
|
+
whose [`theme_mode`][flet.Page.theme_mode] is `SYSTEM` switches to its dark
|
|
117
|
+
or light theme, [`page.platform_brightness`][flet.Page.platform_brightness]
|
|
118
|
+
reports the value, and
|
|
119
|
+
[`on_platform_brightness_change`][flet.Page.on_platform_brightness_change]
|
|
120
|
+
fires when it changes. An app that forces `LIGHT` or `DARK` keeps it, as
|
|
121
|
+
on a real device.
|
|
122
|
+
|
|
123
|
+
`None` follows the host.
|
|
124
|
+
"""
|
|
125
|
+
|
|
40
126
|
assets_dir: Optional[str] = None
|
|
41
127
|
"""
|
|
42
128
|
Base location for assets referenced by the embedded app. On web this
|
|
@@ -89,6 +175,31 @@ class FletApp(LayoutControl):
|
|
|
89
175
|
Called when a connection or any unhandled error occurs.
|
|
90
176
|
"""
|
|
91
177
|
|
|
178
|
+
on_title_change: Optional[ControlEventHandler["FletApp"]] = None
|
|
179
|
+
"""
|
|
180
|
+
Called when the embedded app sets `page.title`. The event `data` is the new
|
|
181
|
+
title, which is also written back to [`title`][(c).].
|
|
182
|
+
"""
|
|
183
|
+
|
|
184
|
+
on_window_event: Optional[EventHandler[FletAppWindowEvent]] = None
|
|
185
|
+
"""
|
|
186
|
+
Called when the embedded app asks its window to do something - a method
|
|
187
|
+
call like `page.window.close()`, or a property write like
|
|
188
|
+
`page.window.maximized = True`.
|
|
189
|
+
|
|
190
|
+
A request, not a command: nothing happens unless the host acts on it, which
|
|
191
|
+
is how a host that does not simulate, say, minimizing simply ignores it.
|
|
192
|
+
"""
|
|
193
|
+
|
|
194
|
+
on_route_change: Optional[ControlEventHandler["FletApp"]] = None
|
|
195
|
+
"""
|
|
196
|
+
Called when the embedded app navigates itself. The event `data` is the new
|
|
197
|
+
route, which is also written back to [`route`][(c).].
|
|
198
|
+
|
|
199
|
+
Does not fire for navigation the host itself caused by setting
|
|
200
|
+
[`route`][(c).].
|
|
201
|
+
"""
|
|
202
|
+
|
|
92
203
|
on_connect: Optional[ControlEventHandler["FletApp"]] = None
|
|
93
204
|
"""
|
|
94
205
|
Fires when the client allocates an in-process `dart_bridge` channel for this
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from dataclasses import field
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
2
|
from typing import Annotated, Optional
|
|
3
3
|
|
|
4
4
|
from flet.controls.alignment import Alignment
|
|
@@ -7,6 +7,7 @@ from flet.controls.control import Control
|
|
|
7
7
|
from flet.controls.control_event import EventHandler
|
|
8
8
|
from flet.controls.duration import DurationValue
|
|
9
9
|
from flet.controls.events import (
|
|
10
|
+
InteractiveViewerTransformEvent,
|
|
10
11
|
ScaleEndEvent,
|
|
11
12
|
ScaleStartEvent,
|
|
12
13
|
ScaleUpdateEvent,
|
|
@@ -16,7 +17,67 @@ from flet.controls.margin import Margin, MarginValue
|
|
|
16
17
|
from flet.controls.types import ClipBehavior, Number
|
|
17
18
|
from flet.utils.validation import V
|
|
18
19
|
|
|
19
|
-
__all__ = ["InteractiveViewer"]
|
|
20
|
+
__all__ = ["InteractiveViewer", "InteractiveViewerTransform"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass(kw_only=True)
|
|
24
|
+
class InteractiveViewerTransform:
|
|
25
|
+
"""
|
|
26
|
+
Effective transform currently applied to an :class:`InteractiveViewer`.
|
|
27
|
+
|
|
28
|
+
``scale`` is Flutter's ``Matrix4.getMaxScaleOnAxis()`` after min/max scale
|
|
29
|
+
and boundary clamping. ``1.0`` is the identity transform of the laid-out
|
|
30
|
+
content, not a ratio against the content's original pixel size.
|
|
31
|
+
|
|
32
|
+
``matrix`` is the 16 column-major entries of that matrix, in the same
|
|
33
|
+
order as Flutter's ``Matrix4.storage``. The translation component is also
|
|
34
|
+
available as :attr:`translation_x`, :attr:`translation_y` and
|
|
35
|
+
:attr:`translation_z` (storage indexes 12, 13 and 14).
|
|
36
|
+
|
|
37
|
+
This does not by itself give a physical length. That also depends on the
|
|
38
|
+
laid-out size of the content and on a separate mapping from that content
|
|
39
|
+
to the real world. If either changes, the same transform describes a
|
|
40
|
+
different physical size.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
scale: float
|
|
44
|
+
"""
|
|
45
|
+
Maximum scale factor along the matrix axes. ``1.0`` is identity.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
translation_x: float
|
|
49
|
+
"""
|
|
50
|
+
Horizontal translation, in logical pixels.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
translation_y: float
|
|
54
|
+
"""
|
|
55
|
+
Vertical translation, in logical pixels.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
translation_z: float
|
|
59
|
+
"""
|
|
60
|
+
Z translation stored on the matrix.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
matrix: list[float]
|
|
64
|
+
"""
|
|
65
|
+
Column-major 4x4 matrix. Length is 16.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
@classmethod
|
|
69
|
+
def from_message(cls, message: dict) -> "InteractiveViewerTransform":
|
|
70
|
+
"""
|
|
71
|
+
Build a transform from the map returned by the Dart viewer.
|
|
72
|
+
"""
|
|
73
|
+
matrix = message["m"]
|
|
74
|
+
return cls(
|
|
75
|
+
scale=float(message["s"]),
|
|
76
|
+
translation_x=float(message["tx"]),
|
|
77
|
+
translation_y=float(message["ty"]),
|
|
78
|
+
translation_z=float(message["tz"]),
|
|
79
|
+
matrix=[float(item) for item in matrix],
|
|
80
|
+
)
|
|
20
81
|
|
|
21
82
|
|
|
22
83
|
@control("InteractiveViewer")
|
|
@@ -167,8 +228,10 @@ class InteractiveViewer(LayoutControl):
|
|
|
167
228
|
|
|
168
229
|
interaction_update_interval: int = 200
|
|
169
230
|
"""
|
|
170
|
-
The interval
|
|
171
|
-
|
|
231
|
+
The minimum interval in milliseconds between intermediate
|
|
232
|
+
:attr:`on_interaction_update` and :attr:`on_transform_changed` events.
|
|
233
|
+
For :attr:`on_transform_changed`, the final effective transform
|
|
234
|
+
is also delivered after changes stop.
|
|
172
235
|
"""
|
|
173
236
|
|
|
174
237
|
on_interaction_start: Optional[
|
|
@@ -192,6 +255,27 @@ class InteractiveViewer(LayoutControl):
|
|
|
192
255
|
Called when the user ends a pan or scale gesture.
|
|
193
256
|
"""
|
|
194
257
|
|
|
258
|
+
on_transform_changed: Optional[
|
|
259
|
+
EventHandler[InteractiveViewerTransformEvent["InteractiveViewer"]]
|
|
260
|
+
] = None
|
|
261
|
+
"""
|
|
262
|
+
Called when the effective transform changes.
|
|
263
|
+
|
|
264
|
+
Fires for pinch and pan gestures, pointer-wheel or trackpad zoom, and for
|
|
265
|
+
:meth:`zoom`, :meth:`pan`, :meth:`reset` and :meth:`restore_state`.
|
|
266
|
+
:meth:`save_state` only stores a snapshot, so it does not fire this event.
|
|
267
|
+
Intermediate updates are limited to :attr:`interaction_update_interval`
|
|
268
|
+
milliseconds. When changes stop, including the end of a wheel burst, an
|
|
269
|
+
inertial pan, :meth:`zoom` and an animated :meth:`reset`, one further
|
|
270
|
+
event is delivered if needed. That event matches :meth:`get_transform`.
|
|
271
|
+
|
|
272
|
+
``on_interaction_update`` reports the gesture's relative scale, not this
|
|
273
|
+
absolute transform. Neither event is a physical length: the content's
|
|
274
|
+
laid-out size and any mapping from that content to the real world are
|
|
275
|
+
separate. If those change, this transform alone does not keep a
|
|
276
|
+
real-world measurement correct.
|
|
277
|
+
"""
|
|
278
|
+
|
|
195
279
|
async def reset(self, animation_duration: Optional[DurationValue] = None):
|
|
196
280
|
"""
|
|
197
281
|
Resets the current transform matrix to identity.
|
|
@@ -258,3 +342,33 @@ class InteractiveViewer(LayoutControl):
|
|
|
258
342
|
and defaults to `0`.
|
|
259
343
|
"""
|
|
260
344
|
await self._invoke_method("pan", arguments={"dx": dx, "dy": dy, "dz": dz})
|
|
345
|
+
|
|
346
|
+
async def get_scale(self) -> float:
|
|
347
|
+
"""
|
|
348
|
+
Return the effective scale currently applied to :attr:`content`.
|
|
349
|
+
|
|
350
|
+
Returns:
|
|
351
|
+
``1.0`` for identity, after min/max scale and boundary clamping.
|
|
352
|
+
This is the scale of the laid-out content, not a ratio against
|
|
353
|
+
the content's original pixel size, and not a physical length.
|
|
354
|
+
|
|
355
|
+
Raises:
|
|
356
|
+
RuntimeError: If this control is not on a page.
|
|
357
|
+
"""
|
|
358
|
+
return float(await self._invoke_method("get_scale"))
|
|
359
|
+
|
|
360
|
+
async def get_transform(self) -> InteractiveViewerTransform:
|
|
361
|
+
"""
|
|
362
|
+
Return the effective transform currently applied to :attr:`content`.
|
|
363
|
+
|
|
364
|
+
Returns:
|
|
365
|
+
Scale, translation and the column-major 4x4 matrix, after
|
|
366
|
+
clamping. A physical length also needs the content's laid-out
|
|
367
|
+
size and a mapping from that content to the real world.
|
|
368
|
+
|
|
369
|
+
Raises:
|
|
370
|
+
RuntimeError: If this control is not on a page.
|
|
371
|
+
"""
|
|
372
|
+
return InteractiveViewerTransform.from_message(
|
|
373
|
+
await self._invoke_method("get_transform")
|
|
374
|
+
)
|
|
@@ -160,7 +160,12 @@ class Semantics(Control):
|
|
|
160
160
|
|
|
161
161
|
heading_level: Optional[int] = None
|
|
162
162
|
"""
|
|
163
|
-
The heading level in the
|
|
163
|
+
The heading level in the document structure.
|
|
164
|
+
|
|
165
|
+
A level of `1` usually marks the main heading of a page, `2` its first
|
|
166
|
+
subsection, and so on. Screen readers use it to navigate between sections: on
|
|
167
|
+
web it sets the `aria-level` attribute, and on iOS and Android 9 (API 28) or
|
|
168
|
+
later any level marks the node as a heading for VoiceOver and TalkBack.
|
|
164
169
|
"""
|
|
165
170
|
|
|
166
171
|
exclude_semantics: bool = False
|
|
@@ -208,7 +213,12 @@ class Semantics(Control):
|
|
|
208
213
|
|
|
209
214
|
header: Optional[bool] = None
|
|
210
215
|
"""
|
|
211
|
-
Whether this subtree represents a header
|
|
216
|
+
Whether this subtree represents a header, such as a page title or an app bar
|
|
217
|
+
title.
|
|
218
|
+
|
|
219
|
+
Note:
|
|
220
|
+
VoiceOver on iOS announces a node as a heading only when
|
|
221
|
+
:attr:`heading_level` is set.
|
|
212
222
|
"""
|
|
213
223
|
|
|
214
224
|
image: Optional[bool] = None
|
|
@@ -263,8 +263,13 @@ class Window(BaseControl):
|
|
|
263
263
|
|
|
264
264
|
skip_task_bar: bool = False
|
|
265
265
|
"""
|
|
266
|
-
Whether the app window should be hidden from the
|
|
267
|
-
macOS).
|
|
266
|
+
Whether the app window should be hidden from the
|
|
267
|
+
Task Bar (on Windows) or Dock (on macOS).
|
|
268
|
+
|
|
269
|
+
Note:
|
|
270
|
+
On Windows 11, the window is also hidden from the Alt+Tab switcher, so a
|
|
271
|
+
window that is minimized while hidden can only be restored by the app itself.
|
|
272
|
+
Keep a way to bring it back, such as a tray icon.
|
|
268
273
|
"""
|
|
269
274
|
|
|
270
275
|
title_bar_hidden: bool = False
|