Unverified Commit b0918eef authored by Duggan, John's avatar Duggan, John Committed by GitHub
Browse files

Merge pull request #128 from...

Merge pull request #128 from nova-model/117-neutrondataselector---add-binding-support-for-parameters

NeutronDataSelector - add binding support for parameters
parents 945383be f16868fd
Loading
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
### nova-trame, 0.24.0

* Parameters to DataSelector and NeutronDataSelector should now support bindings (thanks to John Duggan).

### nova-trame, 0.23.1

* Added support for refreshing the file list in DataSelector and its subclasses (thanks to Yuanpeng Zhang and John Duggan).
+1 −1
Original line number Diff line number Diff line
[project]
name = "nova-trame"
version = "0.23.1"
version = "0.24.0"
description = "A Python Package for injecting curated themes and custom components into Trame applications"
authors = [
    { name = "John Duggan", email = "dugganjw@ornl.gov" },
+30 −0
Original line number Diff line number Diff line
"""Internal utilities for nova-trame."""

from typing import Any, Tuple, Union

from trame_server.core import State

from nova.mvvm._internal.utils import rgetdictvalue, rsetdictvalue


# Reads a state parameter from Trame. For internal use only, if you're using this in your application you're violating
# the MVVM framework. :)
def get_state_param(state: State, value: Union[Any, Tuple]) -> Any:
    if isinstance(value, tuple):
        return rgetdictvalue(state, value[0])

    return value


# Writes a state parameter to Trame. For internal use only, if you're using this in your application you're violating
# the MVVM framework. :)
def set_state_param(state: State, value: Union[Any, Tuple], new_value: Any = None) -> Any:
    with state:
        if isinstance(value, tuple):
            if new_value is not None:
                rsetdictvalue(state, value[0], new_value)
            elif len(value) > 1:
                rsetdictvalue(state, value[0], value[1])
            state.dirty(value[0].split(".")[0])

    return get_state_param(state, value)
+10 −10
Original line number Diff line number Diff line
@@ -12,20 +12,23 @@ class DataSelectorState(BaseModel, validate_assignment=True):
    """Selection state for identifying datafiles."""

    directory: str = Field(default="")
    subdirectory: str = Field(default="")
    extensions: List[str] = Field(default=[])
    prefix: str = Field(default="")
    subdirectory: str = Field(default="")


class DataSelectorModel:
    """Manages file system interactions for the DataSelector widget."""

    def __init__(self, state: DataSelectorState, directory: str, extensions: List[str], prefix: str) -> None:
    def __init__(self, state: DataSelectorState) -> None:
        self.state: DataSelectorState = state

        self.state.directory = directory
        self.state.extensions = extensions
        self.state.prefix = prefix
    def set_binding_parameters(self, **kwargs: Any) -> None:
        if "directory" in kwargs:
            self.state.directory = kwargs["directory"]
        if "extensions" in kwargs:
            self.state.extensions = kwargs["extensions"]
        if "subdirectory" in kwargs:
            self.state.subdirectory = kwargs["subdirectory"]

    def sort_directories(self, directories: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
        # Sort the current level of dictionaries
@@ -89,9 +92,6 @@ class DataSelectorModel:
    def get_datafiles_from_path(self, base_path: Path) -> List[str]:
        datafiles = []
        try:
            if self.state.prefix:
                datafile_path = base_path / self.state.prefix
            else:
            datafile_path = base_path / self.state.subdirectory

            for entry in os.scandir(datafile_path):
+13 −23
Original line number Diff line number Diff line
@@ -107,23 +107,21 @@ class NeutronDataSelectorState(DataSelectorState):
class NeutronDataSelectorModel(DataSelectorModel):
    """Manages file system interactions for the DataSelector widget."""

    def __init__(
        self,
        state: NeutronDataSelectorState,
        facility: str,
        instrument: str,
        extensions: List[str],
        prefix: str,
        allow_custom_directories: bool,
    ) -> None:
        super().__init__(state, "", extensions, prefix)
    def __init__(self, state: NeutronDataSelectorState) -> None:
        super().__init__(state)
        self.state: NeutronDataSelectorState = state

        self.state.facility = facility
        self.state.instrument = instrument
        self.state.extensions = extensions
        self.state.prefix = prefix
        self.state.allow_custom_directories = allow_custom_directories
    def set_binding_parameters(self, **kwargs: Any) -> None:
        super().set_binding_parameters(**kwargs)

        if "facility" in kwargs:
            self.state.facility = kwargs["facility"]
        if "instrument" in kwargs:
            self.state.instrument = kwargs["instrument"]
        if "experiment" in kwargs:
            self.state.experiment = kwargs["experiment"]
        if "allow_custom_directories" in kwargs:
            self.state.allow_custom_directories = kwargs["allow_custom_directories"]

    def get_facilities(self) -> List[str]:
        return natsorted(self.state.get_facilities())
@@ -183,11 +181,3 @@ class NeutronDataSelectorModel(DataSelectorModel):
            return []

        return self.get_datafiles_from_path(base_path)

    def set_state(self, facility: Optional[str], instrument: Optional[str], experiment: Optional[str]) -> None:
        if facility is not None:
            self.state.facility = facility
        if instrument is not None:
            self.state.instrument = instrument
        if experiment is not None:
            self.state.experiment = experiment
Loading