From 878f3e3490e1d008cbe8ad4ebf5083dd03e537c3 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Sun, 12 Jun 2022 20:37:32 -0700 Subject: [PATCH 1/6] UserControl draft --- sdk/python/flet/__init__.py | 1 + sdk/python/flet/control.py | 12 ++++++++--- sdk/python/flet/page.py | 6 ++++++ sdk/python/flet/user_control.py | 37 +++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 sdk/python/flet/user_control.py diff --git a/sdk/python/flet/__init__.py b/sdk/python/flet/__init__.py index 2b6f43ac0..6a121099e 100644 --- a/sdk/python/flet/__init__.py +++ b/sdk/python/flet/__init__.py @@ -40,4 +40,5 @@ from flet.text_button import TextButton from flet.textfield import TextField from flet.theme import Theme +from flet.user_control import UserControl from flet.vertical_divider import VerticalDivider diff --git a/sdk/python/flet/control.py b/sdk/python/flet/control.py index 151c0db6b..253b08d4e 100644 --- a/sdk/python/flet/control.py +++ b/sdk/python/flet/control.py @@ -11,8 +11,10 @@ from flet.embed_json_encoder import EmbedJsonEncoder from flet.margin import Margin from flet.padding import Padding +from flet.page import Page from flet.protocol import Command from flet.ref import Ref +from flet.user_control import UserControl try: from typing import Literal @@ -179,11 +181,11 @@ def _id(self, value): # page @property - def page(self): + def page(self) -> Page: return self.__page @page.setter - def page(self, page): + def page(self, page: Page): self.__page = page # uid @@ -306,7 +308,8 @@ def build_update_commands(self, index, added_controls, commands): # unchanged control for h in previous_ints[a1:a2]: ctrl = hashes[h] - ctrl.build_update_commands(index, added_controls, commands) + if not isinstance(ctrl, UserControl): + ctrl.build_update_commands(index, added_controls, commands) n += 1 elif tag == "replace": ids = [] @@ -358,6 +361,9 @@ def _remove_control_recursively(self, index, control): self._remove_control_recursively(index, child) if control.__uid in index: + if isinstance(control, UserControl): + control.will_unmount() + del index[control.__uid] # private methods diff --git a/sdk/python/flet/page.py b/sdk/python/flet/page.py index 14bb90f78..b8a15abec 100644 --- a/sdk/python/flet/page.py +++ b/sdk/python/flet/page.py @@ -24,6 +24,7 @@ from flet.pubsub import PubSub from flet.snack_bar import SnackBar from flet.theme import Theme +from flet.user_control import UserControl try: from typing import Literal @@ -117,6 +118,11 @@ def __update(self, *controls): # add to index self._index[id] = added_controls[n] + + # call UserControl.did_mount + if isinstance(added_controls[n], UserControl): + added_controls[n].did_mount() + n += 1 def add(self, *controls): diff --git a/sdk/python/flet/user_control.py b/sdk/python/flet/user_control.py new file mode 100644 index 000000000..9056185ae --- /dev/null +++ b/sdk/python/flet/user_control.py @@ -0,0 +1,37 @@ +import logging +from typing import Union + +from flet.control import OptionalNumber +from flet.ref import Ref +from flet.stack import Stack + + +class UserControl(Stack): + # def __init__( + # self, + # ref: Ref = None, + # width: OptionalNumber = None, + # height: OptionalNumber = None, + # expand: Union[bool, int] = None, + # opacity: OptionalNumber = None, + # visible: bool = None, + # disabled: bool = None, + # data: any = None, + # ): + # Stack.__init__( + # self, + # ref=ref, + # width=width, + # height=height, + # expand=expand, + # opacity=opacity, + # visible=visible, + # disabled=disabled, + # data=data, + # ) + + def did_mount(self): + logging.debug(f"UserControl.did_mount(): {self.uid}") + + def will_unmount(self): + logging.debug(f"UserControl.will_unmount(): {self.uid}") From ce7704108f45ad7e92950eb8b149a6aeb057b421 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Mon, 13 Jun 2022 17:07:45 -0700 Subject: [PATCH 2/6] Do not reference UserControl --- sdk/python/flet/control.py | 14 ++++++-------- sdk/python/flet/page.py | 3 +-- sdk/python/flet/user_control.py | 3 +++ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sdk/python/flet/control.py b/sdk/python/flet/control.py index 253b08d4e..07ef0f5c6 100644 --- a/sdk/python/flet/control.py +++ b/sdk/python/flet/control.py @@ -11,10 +11,8 @@ from flet.embed_json_encoder import EmbedJsonEncoder from flet.margin import Margin from flet.padding import Padding -from flet.page import Page from flet.protocol import Command from flet.ref import Ref -from flet.user_control import UserControl try: from typing import Literal @@ -88,8 +86,8 @@ def __init__( if ref: ref.current = self - def _assign(self, variable): - variable = self + def _is_user_control(self): + return False def _get_children(self): return [] @@ -181,11 +179,11 @@ def _id(self, value): # page @property - def page(self) -> Page: + def page(self): return self.__page @page.setter - def page(self, page: Page): + def page(self, page): self.__page = page # uid @@ -308,7 +306,7 @@ def build_update_commands(self, index, added_controls, commands): # unchanged control for h in previous_ints[a1:a2]: ctrl = hashes[h] - if not isinstance(ctrl, UserControl): + if not ctrl._is_user_control(): ctrl.build_update_commands(index, added_controls, commands) n += 1 elif tag == "replace": @@ -361,7 +359,7 @@ def _remove_control_recursively(self, index, control): self._remove_control_recursively(index, child) if control.__uid in index: - if isinstance(control, UserControl): + if control._is_user_control(): control.will_unmount() del index[control.__uid] diff --git a/sdk/python/flet/page.py b/sdk/python/flet/page.py index b8a15abec..5e0d4bde9 100644 --- a/sdk/python/flet/page.py +++ b/sdk/python/flet/page.py @@ -24,7 +24,6 @@ from flet.pubsub import PubSub from flet.snack_bar import SnackBar from flet.theme import Theme -from flet.user_control import UserControl try: from typing import Literal @@ -120,7 +119,7 @@ def __update(self, *controls): self._index[id] = added_controls[n] # call UserControl.did_mount - if isinstance(added_controls[n], UserControl): + if added_controls[n]._is_user_control(): added_controls[n].did_mount() n += 1 diff --git a/sdk/python/flet/user_control.py b/sdk/python/flet/user_control.py index 9056185ae..b7da42a0d 100644 --- a/sdk/python/flet/user_control.py +++ b/sdk/python/flet/user_control.py @@ -30,6 +30,9 @@ class UserControl(Stack): # data=data, # ) + def _is_user_control(self): + return True + def did_mount(self): logging.debug(f"UserControl.did_mount(): {self.uid}") From 312e44ef94813bc4d0580feb2e5e9dc9d05b1d6d Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 15 Jun 2022 08:05:50 -0700 Subject: [PATCH 3/6] UserControl complete --- sdk/python/flet/control.py | 14 +++++---- sdk/python/flet/page.py | 5 ++-- sdk/python/flet/user_control.py | 52 ++++++++++++--------------------- 3 files changed, 30 insertions(+), 41 deletions(-) diff --git a/sdk/python/flet/control.py b/sdk/python/flet/control.py index 07ef0f5c6..fc5a88464 100644 --- a/sdk/python/flet/control.py +++ b/sdk/python/flet/control.py @@ -86,9 +86,15 @@ def __init__( if ref: ref.current = self - def _is_user_control(self): + def _is_isolated(self): return False + def did_mount(self): + pass + + def will_unmount(self): + pass + def _get_children(self): return [] @@ -306,7 +312,7 @@ def build_update_commands(self, index, added_controls, commands): # unchanged control for h in previous_ints[a1:a2]: ctrl = hashes[h] - if not ctrl._is_user_control(): + if not ctrl._is_isolated(): ctrl.build_update_commands(index, added_controls, commands) n += 1 elif tag == "replace": @@ -359,9 +365,7 @@ def _remove_control_recursively(self, index, control): self._remove_control_recursively(index, child) if control.__uid in index: - if control._is_user_control(): - control.will_unmount() - + control.will_unmount() del index[control.__uid] # private methods diff --git a/sdk/python/flet/page.py b/sdk/python/flet/page.py index 5e0d4bde9..cf40db31e 100644 --- a/sdk/python/flet/page.py +++ b/sdk/python/flet/page.py @@ -118,9 +118,8 @@ def __update(self, *controls): # add to index self._index[id] = added_controls[n] - # call UserControl.did_mount - if added_controls[n]._is_user_control(): - added_controls[n].did_mount() + # call Control.did_mount + added_controls[n].did_mount() n += 1 diff --git a/sdk/python/flet/user_control.py b/sdk/python/flet/user_control.py index b7da42a0d..44180fed6 100644 --- a/sdk/python/flet/user_control.py +++ b/sdk/python/flet/user_control.py @@ -1,40 +1,26 @@ -import logging -from typing import Union +from typing import List -from flet.control import OptionalNumber -from flet.ref import Ref +from flet.control import Control from flet.stack import Stack class UserControl(Stack): - # def __init__( - # self, - # ref: Ref = None, - # width: OptionalNumber = None, - # height: OptionalNumber = None, - # expand: Union[bool, int] = None, - # opacity: OptionalNumber = None, - # visible: bool = None, - # disabled: bool = None, - # data: any = None, - # ): - # Stack.__init__( - # self, - # ref=ref, - # width=width, - # height=height, - # expand=expand, - # opacity=opacity, - # visible=visible, - # disabled=disabled, - # data=data, - # ) + def __init__(self): + super().__init__() + content = self.build() + if isinstance(content, Control): + self.controls = [content] + elif isinstance(content, List) and all( + isinstance(control, Control) for control in content + ): + self.controls = content + else: + raise Exception( + f"{self.__class__.__name__}.build() method must be implemented and returning either Control or List[Control]." + ) - def _is_user_control(self): - return True - - def did_mount(self): - logging.debug(f"UserControl.did_mount(): {self.uid}") + def build(self): + pass - def will_unmount(self): - logging.debug(f"UserControl.will_unmount(): {self.uid}") + def _is_isolated(self): + return True From 707950c305f1791850dd59f8b936ef6bd774a9a3 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 15 Jun 2022 08:05:58 -0700 Subject: [PATCH 4/6] Go 1.18.3 --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 851ad3318..7afd46d1b 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -9,7 +9,7 @@ skip_commits: - "*.md" environment: - GO_VERSION: 1.18.1 + GO_VERSION: 1.18.3 GO_TAGS: --tags release python_version: 3.10 GITHUB_TOKEN: From c5bf1b58e40f77f74eeb4a0055c4cc93fcb56280 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 15 Jun 2022 08:41:36 -0700 Subject: [PATCH 5/6] An ability to choose Flutter web renderer --- client/web/index.html | 2 ++ sdk/python/flet/flet.py | 21 ++++++++++++++++++--- server/config/config.go | 5 +++++ server/server/server.go | 17 +++++++++++++---- 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/client/web/index.html b/client/web/index.html index 629f9d5a2..372794bae 100644 --- a/client/web/index.html +++ b/client/web/index.html @@ -19,6 +19,8 @@ Flet + + "), 1) + } + + c.Data(http.StatusOK, "text/html", indexData) } else { // API not found c.JSON(http.StatusNotFound, gin.H{ From 0436f8b49c969245f1e129ecf29d5d654913f711 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 15 Jun 2022 09:32:41 -0700 Subject: [PATCH 6/6] page.set_clipboard(), page.show_snack_bar() --- sdk/python/flet/clipboard.py | 3 +++ sdk/python/flet/page.py | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/sdk/python/flet/clipboard.py b/sdk/python/flet/clipboard.py index a19021763..cdd63e755 100644 --- a/sdk/python/flet/clipboard.py +++ b/sdk/python/flet/clipboard.py @@ -36,6 +36,9 @@ def __init__( def _get_control_name(self): return "clipboard" + def _is_isolated(self): + return True + # value @property def value(self): diff --git a/sdk/python/flet/page.py b/sdk/python/flet/page.py index cf40db31e..771c044a6 100644 --- a/sdk/python/flet/page.py +++ b/sdk/python/flet/page.py @@ -223,6 +223,16 @@ def _send_command(self, name: str, values: List[str]): Command(0, name, values, None, None), ) + @beartype + def set_clipboard(self, value: str): + self.__offstage.clipboard.value = value + self.__offstage.clipboard.update() + + @beartype + def show_snack_bar(self, snack_bar: SnackBar): + self.__offstage.snack_bar = snack_bar + self.__offstage.update() + # url @property def url(self): @@ -345,16 +355,6 @@ def fonts(self, value: Optional[Dict[str, str]]): self.__fonts = value self._set_attr_json("fonts", value) - # clipboard - @property - def clipboard(self): - return self.__offstage.clipboard.value - - @clipboard.setter - @beartype - def clipboard(self, value: Optional[str]): - self.__offstage.clipboard.value = value - # splash @property def splash(self):