Loading src/nova/trame/model/data_selector.py +5 −5 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ class DataSelectorState(BaseModel, validate_assignment=True): directory: str = Field(default="") extensions: List[str] = Field(default=[]) prefix: str = Field(default="") subdirectory: str = Field(default="") class DataSelectorModel: Loading @@ -22,10 +22,10 @@ class DataSelectorModel: def __init__(self, state: DataSelectorState) -> None: self.state: DataSelectorState = state def set_binding_parameters(self, directory: str, extensions: List[str], prefix: str) -> None: def set_binding_parameters(self, directory: str, extensions: List[str], subdirectory: str) -> None: self.state.directory = directory self.state.extensions = extensions self.state.prefix = prefix self.state.subdirectory = subdirectory def sort_directories(self, directories: List[Dict[str, Any]]) -> List[Dict[str, Any]]: # Sort the current level of dictionaries Loading Loading @@ -89,7 +89,7 @@ class DataSelectorModel: def get_datafiles_from_path(self, base_path: Path) -> List[str]: datafiles = [] try: datafile_path = base_path / self.state.prefix datafile_path = base_path / self.state.subdirectory for entry in os.scandir(datafile_path): if entry.is_file(): Loading @@ -110,4 +110,4 @@ class DataSelectorModel: return self.get_datafiles_from_path(base_path) def set_subdirectory(self, subdirectory_path: str) -> None: self.state.prefix = subdirectory_path self.state.subdirectory = subdirectory_path src/nova/trame/view/components/data_selector.py +37 −23 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ from asyncio import ensure_future, sleep from pathlib import Path from typing import Any, List, Tuple, Union, cast from warnings import warn from trame.app import get_server from trame.widgets import client, datagrid, html Loading Loading @@ -49,6 +50,7 @@ class DataSelector(datagrid.VGrid): directory: Union[str, Tuple], extensions: Union[List[str], Tuple, None] = None, prefix: Union[str, Tuple] = "", subdirectory: Union[str, Tuple] = "", refresh_rate: Union[int, Tuple] = 30, select_strategy: Union[str, Tuple] = "all", **kwargs: Any, Loading @@ -66,8 +68,10 @@ class DataSelector(datagrid.VGrid): extensions : Union[List[str], Tuple], optional A list of file extensions to restrict selection to. If unset, then all files will be shown. prefix : Union[str, Tuple], optional A subdirectory within the selected top-level folder to show files. If not specified, the user will be shown a folder browser and will be able to see all files in the selected top-level folder. Deprecated. Please refer to the `subdirectory` parameter. subdirectory : Union[str, Tuple], optional A subdirectory within the selected top-level folder to show files. If not specified as a string, the user will be shown a folder browser and will be able to see all files in the selected top-level folder. refresh_rate : Union[int, Tuple], optional The number of seconds between attempts to automatically refresh the file list. Set to zero to disable this feature. Defaults to 30 seconds. Loading Loading @@ -96,6 +100,16 @@ class DataSelector(datagrid.VGrid): else: self._label = None if prefix: warn( "The prefix parameter has been deprecated. Please switch to using the subdirectory parameter.", category=DeprecationWarning, stacklevel=1, ) if not subdirectory: subdirectory = prefix self._v_model = v_model if isinstance(v_model, str): self._v_model_name_in_state = v_model.split(".")[0] Loading @@ -106,8 +120,8 @@ class DataSelector(datagrid.VGrid): self._last_directory = self._directory self._extensions = extensions if extensions is not None else [] self._last_extensions = self._extensions self._prefix = prefix self._last_prefix = self._prefix self._subdirectory = subdirectory self._last_subdirectory = self._subdirectory self._refresh_rate = refresh_rate self._select_strategy = select_strategy Loading Loading @@ -146,13 +160,13 @@ class DataSelector(datagrid.VGrid): vuetify.VTooltip("Refresh Contents", activator="parent") with GridLayout(columns=2, classes="flex-1-0 h-0", valign="start"): if isinstance(self._prefix, tuple) or not self._prefix: if self._prefix: initial_prefix = str( if isinstance(self._subdirectory, tuple) or not self._subdirectory: if self._subdirectory: initial_subdirectory = str( Path(get_state_param(self.state, self._directory)) / get_state_param(self.state, self._prefix) / get_state_param(self.state, self._subdirectory) ) print(initial_prefix) print(initial_subdirectory) with html.Div(classes="d-flex flex-column h-100 overflow-hidden"): vuetify.VListSubheader("Available Directories", classes="flex-0-1 justify-center px-0") vuetify.VTreeview( Loading Loading @@ -247,7 +261,7 @@ class DataSelector(datagrid.VGrid): self._reset_rv_grid() def set_subdirectory(self, subdirectory_path: str = "") -> None: set_state_param(self.state, self._prefix, subdirectory_path) set_state_param(self.state, self._subdirectory, subdirectory_path) self._vm.set_subdirectory(subdirectory_path) def set_state(self, *args: Any, **kwargs: Any) -> None: Loading @@ -259,15 +273,15 @@ class DataSelector(datagrid.VGrid): def setup_binding_listeners(self) -> None: set_state_param(self.state, self._directory) set_state_param(self.state, self._extensions) set_state_param(self.state, self._prefix) set_state_param(self.state, self._subdirectory) self._vm.set_binding_parameters( get_state_param(self.state, self._directory), get_state_param(self.state, self._extensions), get_state_param(self.state, self._prefix), get_state_param(self.state, self._subdirectory), ) if isinstance(self._prefix, tuple): self._prefix = (self._prefix[0],) if isinstance(self._subdirectory, tuple): self._subdirectory = (self._subdirectory[0],) if isinstance(self._directory, tuple): Loading @@ -279,7 +293,7 @@ class DataSelector(datagrid.VGrid): self._vm.set_binding_parameters( get_state_param(self.state, self._directory), get_state_param(self.state, self._extensions), get_state_param(self.state, self._prefix), get_state_param(self.state, self._subdirectory), ) if isinstance(self._extensions, tuple): Loading @@ -292,20 +306,20 @@ class DataSelector(datagrid.VGrid): self._vm.set_binding_parameters( get_state_param(self.state, self._directory), get_state_param(self.state, self._extensions), get_state_param(self.state, self._prefix), get_state_param(self.state, self._subdirectory), ) if isinstance(self._prefix, tuple): if isinstance(self._subdirectory, tuple): @self.state.change(self._prefix[0].split(".")[0]) def on_prefix_change(**kwargs: Any) -> None: prefix = rgetdictvalue(kwargs, self._prefix) if prefix != self._last_prefix: self._last_prefix = prefix @self.state.change(self._subdirectory[0].split(".")[0]) def on_subdirectory_change(**kwargs: Any) -> None: subdirectory = rgetdictvalue(kwargs, self._subdirectory[0]) if subdirectory != self._last_subdirectory: self._last_subdirectory = subdirectory self._vm.set_binding_parameters( get_state_param(self.state, self._directory), get_state_param(self.state, self._extensions), get_state_param(self.state, self._prefix), get_state_param(self.state, self._subdirectory), ) async def _refresh_loop(self) -> None: Loading tests/gallery/models/data_selector.py +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ class DataSelectorBindingTest(BaseModel): directory: str = Field(default="") refresh_rate: int = Field(default=0) subdirectory: str = Field(default="") class DataSelectorState(BaseModel): Loading tests/gallery/views/app.py +1 −0 Original line number Diff line number Diff line Loading @@ -358,6 +358,7 @@ class App(ThemedApp): v_model="data_selector.selected_files", chips=True, directory=("ds_params.directory", "/"), subdirectory=("ds_params.subdirectory",), refresh_rate=("ds_params.refresh_rate", 15), ) with html.Div(classes="border-md text-left", style="height: 650px; width: 600px;"): Loading Loading
src/nova/trame/model/data_selector.py +5 −5 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ class DataSelectorState(BaseModel, validate_assignment=True): directory: str = Field(default="") extensions: List[str] = Field(default=[]) prefix: str = Field(default="") subdirectory: str = Field(default="") class DataSelectorModel: Loading @@ -22,10 +22,10 @@ class DataSelectorModel: def __init__(self, state: DataSelectorState) -> None: self.state: DataSelectorState = state def set_binding_parameters(self, directory: str, extensions: List[str], prefix: str) -> None: def set_binding_parameters(self, directory: str, extensions: List[str], subdirectory: str) -> None: self.state.directory = directory self.state.extensions = extensions self.state.prefix = prefix self.state.subdirectory = subdirectory def sort_directories(self, directories: List[Dict[str, Any]]) -> List[Dict[str, Any]]: # Sort the current level of dictionaries Loading Loading @@ -89,7 +89,7 @@ class DataSelectorModel: def get_datafiles_from_path(self, base_path: Path) -> List[str]: datafiles = [] try: datafile_path = base_path / self.state.prefix datafile_path = base_path / self.state.subdirectory for entry in os.scandir(datafile_path): if entry.is_file(): Loading @@ -110,4 +110,4 @@ class DataSelectorModel: return self.get_datafiles_from_path(base_path) def set_subdirectory(self, subdirectory_path: str) -> None: self.state.prefix = subdirectory_path self.state.subdirectory = subdirectory_path
src/nova/trame/view/components/data_selector.py +37 −23 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ from asyncio import ensure_future, sleep from pathlib import Path from typing import Any, List, Tuple, Union, cast from warnings import warn from trame.app import get_server from trame.widgets import client, datagrid, html Loading Loading @@ -49,6 +50,7 @@ class DataSelector(datagrid.VGrid): directory: Union[str, Tuple], extensions: Union[List[str], Tuple, None] = None, prefix: Union[str, Tuple] = "", subdirectory: Union[str, Tuple] = "", refresh_rate: Union[int, Tuple] = 30, select_strategy: Union[str, Tuple] = "all", **kwargs: Any, Loading @@ -66,8 +68,10 @@ class DataSelector(datagrid.VGrid): extensions : Union[List[str], Tuple], optional A list of file extensions to restrict selection to. If unset, then all files will be shown. prefix : Union[str, Tuple], optional A subdirectory within the selected top-level folder to show files. If not specified, the user will be shown a folder browser and will be able to see all files in the selected top-level folder. Deprecated. Please refer to the `subdirectory` parameter. subdirectory : Union[str, Tuple], optional A subdirectory within the selected top-level folder to show files. If not specified as a string, the user will be shown a folder browser and will be able to see all files in the selected top-level folder. refresh_rate : Union[int, Tuple], optional The number of seconds between attempts to automatically refresh the file list. Set to zero to disable this feature. Defaults to 30 seconds. Loading Loading @@ -96,6 +100,16 @@ class DataSelector(datagrid.VGrid): else: self._label = None if prefix: warn( "The prefix parameter has been deprecated. Please switch to using the subdirectory parameter.", category=DeprecationWarning, stacklevel=1, ) if not subdirectory: subdirectory = prefix self._v_model = v_model if isinstance(v_model, str): self._v_model_name_in_state = v_model.split(".")[0] Loading @@ -106,8 +120,8 @@ class DataSelector(datagrid.VGrid): self._last_directory = self._directory self._extensions = extensions if extensions is not None else [] self._last_extensions = self._extensions self._prefix = prefix self._last_prefix = self._prefix self._subdirectory = subdirectory self._last_subdirectory = self._subdirectory self._refresh_rate = refresh_rate self._select_strategy = select_strategy Loading Loading @@ -146,13 +160,13 @@ class DataSelector(datagrid.VGrid): vuetify.VTooltip("Refresh Contents", activator="parent") with GridLayout(columns=2, classes="flex-1-0 h-0", valign="start"): if isinstance(self._prefix, tuple) or not self._prefix: if self._prefix: initial_prefix = str( if isinstance(self._subdirectory, tuple) or not self._subdirectory: if self._subdirectory: initial_subdirectory = str( Path(get_state_param(self.state, self._directory)) / get_state_param(self.state, self._prefix) / get_state_param(self.state, self._subdirectory) ) print(initial_prefix) print(initial_subdirectory) with html.Div(classes="d-flex flex-column h-100 overflow-hidden"): vuetify.VListSubheader("Available Directories", classes="flex-0-1 justify-center px-0") vuetify.VTreeview( Loading Loading @@ -247,7 +261,7 @@ class DataSelector(datagrid.VGrid): self._reset_rv_grid() def set_subdirectory(self, subdirectory_path: str = "") -> None: set_state_param(self.state, self._prefix, subdirectory_path) set_state_param(self.state, self._subdirectory, subdirectory_path) self._vm.set_subdirectory(subdirectory_path) def set_state(self, *args: Any, **kwargs: Any) -> None: Loading @@ -259,15 +273,15 @@ class DataSelector(datagrid.VGrid): def setup_binding_listeners(self) -> None: set_state_param(self.state, self._directory) set_state_param(self.state, self._extensions) set_state_param(self.state, self._prefix) set_state_param(self.state, self._subdirectory) self._vm.set_binding_parameters( get_state_param(self.state, self._directory), get_state_param(self.state, self._extensions), get_state_param(self.state, self._prefix), get_state_param(self.state, self._subdirectory), ) if isinstance(self._prefix, tuple): self._prefix = (self._prefix[0],) if isinstance(self._subdirectory, tuple): self._subdirectory = (self._subdirectory[0],) if isinstance(self._directory, tuple): Loading @@ -279,7 +293,7 @@ class DataSelector(datagrid.VGrid): self._vm.set_binding_parameters( get_state_param(self.state, self._directory), get_state_param(self.state, self._extensions), get_state_param(self.state, self._prefix), get_state_param(self.state, self._subdirectory), ) if isinstance(self._extensions, tuple): Loading @@ -292,20 +306,20 @@ class DataSelector(datagrid.VGrid): self._vm.set_binding_parameters( get_state_param(self.state, self._directory), get_state_param(self.state, self._extensions), get_state_param(self.state, self._prefix), get_state_param(self.state, self._subdirectory), ) if isinstance(self._prefix, tuple): if isinstance(self._subdirectory, tuple): @self.state.change(self._prefix[0].split(".")[0]) def on_prefix_change(**kwargs: Any) -> None: prefix = rgetdictvalue(kwargs, self._prefix) if prefix != self._last_prefix: self._last_prefix = prefix @self.state.change(self._subdirectory[0].split(".")[0]) def on_subdirectory_change(**kwargs: Any) -> None: subdirectory = rgetdictvalue(kwargs, self._subdirectory[0]) if subdirectory != self._last_subdirectory: self._last_subdirectory = subdirectory self._vm.set_binding_parameters( get_state_param(self.state, self._directory), get_state_param(self.state, self._extensions), get_state_param(self.state, self._prefix), get_state_param(self.state, self._subdirectory), ) async def _refresh_loop(self) -> None: Loading
tests/gallery/models/data_selector.py +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ class DataSelectorBindingTest(BaseModel): directory: str = Field(default="") refresh_rate: int = Field(default=0) subdirectory: str = Field(default="") class DataSelectorState(BaseModel): Loading
tests/gallery/views/app.py +1 −0 Original line number Diff line number Diff line Loading @@ -358,6 +358,7 @@ class App(ThemedApp): v_model="data_selector.selected_files", chips=True, directory=("ds_params.directory", "/"), subdirectory=("ds_params.subdirectory",), refresh_rate=("ds_params.refresh_rate", 15), ) with html.Div(classes="border-md text-left", style="height: 650px; width: 600px;"): Loading