Skip to content

Commit 5088eea

Browse files
ndonkoHenriFeodorFitsner
authored andcommitted
feat: expose events (on_double_tap, on_pan_start) in WindowDragArea (#5043)
* improve events typing in gesture_detector.py * window.start_dragging * delete window_drag_area.dart * rework WindowDragArea inheriting from GestureDetector * export more utils
1 parent c0a0705 commit 5088eea

File tree

5 files changed

+93
-123
lines changed

5 files changed

+93
-123
lines changed

packages/flet/lib/src/controls/window_drag_area.dart_

Lines changed: 0 additions & 74 deletions
This file was deleted.

packages/flet/lib/src/utils/desktop.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,12 @@ Future windowToFront() async {
235235
}
236236
}
237237

238+
Future windowStartDragging() async {
239+
if (isDesktopPlatform()) {
240+
await windowManager.startDragging();
241+
}
242+
}
243+
238244
Future blurWindow() async {
239245
if (isDesktopPlatform() &&
240246
(defaultTargetPlatform == TargetPlatform.windows ||

sdk/python/packages/flet-cli/src/flet_cli/commands/build.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,10 @@
1010
from typing import Optional, cast
1111

1212
import flet.version
13-
import flet_cli.utils.processes as processes
1413
import yaml
1514
from flet.utils import cleanup_path, copy_tree, is_windows, slugify
1615
from flet.utils.platform_utils import get_bool_env_var
1716
from flet.version import update_version
18-
from flet_cli.commands.base import BaseCommand
19-
from flet_cli.utils.hash_stamp import HashStamp
20-
from flet_cli.utils.merge import merge_dict
21-
from flet_cli.utils.project_dependencies import (
22-
get_poetry_dependencies,
23-
get_project_dependencies,
24-
)
25-
from flet_cli.utils.pyproject_toml import load_pyproject_toml
2617
from packaging import version
2718
from packaging.requirements import Requirement
2819
from rich.console import Console, Group
@@ -33,6 +24,16 @@
3324
from rich.table import Column, Table
3425
from rich.theme import Theme
3526

27+
import flet_cli.utils.processes as processes
28+
from flet_cli.commands.base import BaseCommand
29+
from flet_cli.utils.hash_stamp import HashStamp
30+
from flet_cli.utils.merge import merge_dict
31+
from flet_cli.utils.project_dependencies import (
32+
get_poetry_dependencies,
33+
get_project_dependencies,
34+
)
35+
from flet_cli.utils.pyproject_toml import load_pyproject_toml
36+
3637
PYODIDE_ROOT_URL = "https://cdn.jsdelivr.net/pyodide/v0.27.2/full"
3738
DEFAULT_TEMPLATE_URL = "gh:flet-dev/flet-build-template"
3839

@@ -75,7 +76,6 @@ def __init__(self, parser: argparse.ArgumentParser) -> None:
7576
self.python_module_name = None
7677
self.get_pyproject = None
7778
self.python_app_path = None
78-
self.no_rich_output = None
7979
self.emojis = {}
8080
self.dart_exe = None
8181
self.verbose = False
@@ -1145,7 +1145,9 @@ def setup_template_data(self):
11451145
"target_arch": (
11461146
target_arch
11471147
if isinstance(target_arch, list)
1148-
else [target_arch] if isinstance(target_arch, str) else []
1148+
else [target_arch]
1149+
if isinstance(target_arch, str)
1150+
else []
11491151
),
11501152
"info_plist": info_plist,
11511153
"macos_entitlements": macos_entitlements,

sdk/python/packages/flet/src/flet/core/gesture_detector.py

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -94,37 +94,39 @@ def __init__(
9494
exclude_from_semantics: Optional[bool] = None,
9595
trackpad_scroll_causes_scale: Optional[bool] = None,
9696
allowed_devices: Optional[Set[PointerDeviceType]] = None,
97-
on_tap=None,
98-
on_tap_down=None,
99-
on_tap_up=None,
100-
on_multi_tap=None,
101-
multi_tap_touches=None,
102-
on_multi_long_press=None,
103-
on_secondary_tap=None,
104-
on_secondary_tap_down=None,
105-
on_secondary_tap_up=None,
106-
on_long_press_start=None,
107-
on_long_press_end=None,
108-
on_secondary_long_press_start=None,
109-
on_secondary_long_press_end=None,
110-
on_double_tap=None,
111-
on_double_tap_down=None,
112-
on_horizontal_drag_start=None,
113-
on_horizontal_drag_update=None,
114-
on_horizontal_drag_end=None,
115-
on_vertical_drag_start=None,
116-
on_vertical_drag_update=None,
117-
on_vertical_drag_end=None,
118-
on_pan_start=None,
119-
on_pan_update=None,
120-
on_pan_end=None,
121-
on_scale_start=None,
122-
on_scale_update=None,
123-
on_scale_end=None,
124-
on_hover=None,
125-
on_enter=None,
126-
on_exit=None,
127-
on_scroll=None,
97+
on_tap: OptionalEventCallable["TapEvent"] = None,
98+
on_tap_down: OptionalEventCallable["TapEvent"] = None,
99+
on_tap_up: OptionalEventCallable["TapEvent"] = None,
100+
on_multi_tap: OptionalEventCallable["TapEvent"] = None,
101+
multi_tap_touches: Optional[int] = None,
102+
on_multi_long_press: OptionalEventCallable["LongPressEndEvent"] = None,
103+
on_secondary_tap: OptionalEventCallable["TapEvent"] = None,
104+
on_secondary_tap_down: OptionalEventCallable["TapEvent"] = None,
105+
on_secondary_tap_up: OptionalEventCallable["TapEvent"] = None,
106+
on_long_press_start: OptionalEventCallable["LongPressEndEvent"] = None,
107+
on_long_press_end: OptionalEventCallable["LongPressEndEvent"] = None,
108+
on_secondary_long_press_start: OptionalEventCallable[
109+
"LongPressEndEvent"
110+
] = None,
111+
on_secondary_long_press_end: OptionalEventCallable["LongPressEndEvent"] = None,
112+
on_double_tap: OptionalEventCallable["TapEvent"] = None,
113+
on_double_tap_down: OptionalEventCallable["TapEvent"] = None,
114+
on_horizontal_drag_start: OptionalEventCallable["DragStartEvent"] = None,
115+
on_horizontal_drag_update: OptionalEventCallable["DragUpdateEvent"] = None,
116+
on_horizontal_drag_end: OptionalEventCallable["DragEndEvent"] = None,
117+
on_vertical_drag_start: OptionalEventCallable["DragStartEvent"] = None,
118+
on_vertical_drag_update: OptionalEventCallable["DragUpdateEvent"] = None,
119+
on_vertical_drag_end: OptionalEventCallable["DragEndEvent"] = None,
120+
on_pan_start: OptionalEventCallable["DragStartEvent"] = None,
121+
on_pan_update: OptionalEventCallable["DragUpdateEvent"] = None,
122+
on_pan_end: OptionalEventCallable["DragEndEvent"] = None,
123+
on_scale_start: OptionalEventCallable["ScaleStartEvent"] = None,
124+
on_scale_update: OptionalEventCallable["ScaleUpdateEvent"] = None,
125+
on_scale_end: OptionalEventCallable["ScaleEndEvent"] = None,
126+
on_hover: OptionalEventCallable["HoverEvent"] = None,
127+
on_enter: OptionalEventCallable["HoverEvent"] = None,
128+
on_exit: OptionalEventCallable["HoverEvent"] = None,
129+
on_scroll: OptionalEventCallable["ScrollEvent"] = None,
128130
#
129131
# ConstrainedControl
130132
#
@@ -344,6 +346,7 @@ def _get_control_name(self):
344346
return "gesturedetector"
345347

346348
def before_update(self):
349+
super().before_update()
347350
self._set_attr_json("allowedDevices", self.__allowed_devices)
348351

349352
def _get_children(self):

sdk/python/packages/flet/src/flet/core/window_drag_area.py

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
from flet.core.constrained_control import ConstrainedControl
2-
from flet.core.control import Control, control
1+
from typing import Any
32

4-
__all__ = ["WindowDragArea"]
3+
from flet.core.control import Control
4+
from flet.core.gesture_detector import DragStartEvent, GestureDetector, TapEvent
5+
from flet.core.types import OptionalEventCallable
56

67

7-
@control("WindowDragArea")
8-
class WindowDragArea(ConstrainedControl):
8+
class WindowDragArea(GestureDetector):
99
"""
1010
A control for drag to move, maximize and restore application window.
1111
@@ -36,9 +36,42 @@ def main(page: ft.Page):
3636
Online docs: https://flet.dev/docs/controls/windowdragarea
3737
"""
3838

39-
content: Control
40-
maximizable: bool = True
39+
def __init__(
40+
self,
41+
content: Control,
42+
maximizable: bool = True,
43+
on_double_tap: OptionalEventCallable["TapEvent"] = None,
44+
on_pan_start: OptionalEventCallable["DragStartEvent"] = None,
45+
**kwargs: Any,
46+
):
47+
GestureDetector.__init__(
48+
self,
49+
content=content,
50+
on_double_tap=self.handle_double_tap,
51+
on_pan_start=self.handle_pan_start,
52+
**kwargs,
53+
)
54+
55+
self.maximizable = maximizable
56+
self.on_double_tap = on_double_tap
57+
self.on_pan_start = on_pan_start
4158

4259
def before_update(self):
4360
super().before_update()
4461
assert self.content.visible, "content must be visible"
62+
63+
def handle_double_tap(self, e: TapEvent):
64+
if self.maximizable and self.page.window.maximizable:
65+
if not self.page.window.maximized:
66+
self.page.window.maximized = True
67+
else:
68+
self.page.window.maximized = False
69+
self.page.update()
70+
71+
if self.on_double_tap is not None and self.page.window.maximized:
72+
self.on_double_tap(e)
73+
74+
def handle_pan_start(self, e: DragStartEvent):
75+
self.page.window.start_dragging()
76+
if self.on_pan_start is not None:
77+
self.on_pan_start(e)

0 commit comments

Comments
 (0)