From f7eda5a1507cd3f3a50455e92b92de26b34ef86b Mon Sep 17 00:00:00 2001 From: dfguerrerom Date: Tue, 8 Aug 2023 12:20:16 +0200 Subject: [PATCH] feat: use cache on InputFile widget to improve loading times --- sepal_ui/sepalwidgets/inputs.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/sepal_ui/sepalwidgets/inputs.py b/sepal_ui/sepalwidgets/inputs.py index 840162ea..760c9100 100644 --- a/sepal_ui/sepalwidgets/inputs.py +++ b/sepal_ui/sepalwidgets/inputs.py @@ -183,6 +183,9 @@ class FileInput(v.Flex, SepalWidget): folder: Path = Path.home() "the current folder" + initial_folder: Path = Path.home() + "the starting point of the file input" + file: t.Unicode = t.Unicode("").tag(sync=True) "the current file" @@ -221,6 +224,7 @@ def __init__( v_model: str = "", clearable: bool = False, root: Union[str, Path] = "", + cache=False, **kwargs, ) -> None: """Custom input field to select a file in the sepal folders. @@ -235,8 +239,10 @@ def __init__( kwargs: any parameter from a v.Flex abject. If set, 'children' will be overwritten. """ self.extensions = extensions + self.initial_folder = folder self.folder = Path(folder) self.root = str(root) if isinstance(root, Path) else root + self.cache_dirs = {} self.selected_file = v.TextField( readonly=True, @@ -329,7 +335,7 @@ def reset(self, *args) -> Self: # time when multiple fileInput are reset at the same time as in the aoiView if self.v_model is not None: # move to root - self._on_file_select({"new": Path.home()}) + self._on_file_select({"new": self.initial_folder}) # remove v_model self.v_model = "" @@ -406,6 +412,10 @@ def _get_items(self) -> List[v.ListItem]: el for el in list_dir if el.is_dir() or el.suffix in self.extensions ] + if folder in self.cache_dirs: + if self.cache_dirs[folder]["files"] == list_dir: + return self.cache_dirs[folder]["items"] + folder_list = [] file_list = [] @@ -459,6 +469,10 @@ def _get_items(self) -> List[v.ListItem]: folder_list.extend(file_list) folder_list.insert(0, parent_item) + self.cache_dirs.setdefault(folder, {}) + self.cache_dirs[folder]["files"] = list_dir + self.cache_dirs[folder]["items"] = folder_list + return folder_list def _on_reload(self, *args) -> None: