Skip to content

Commit

Permalink
Merge pull request #136 from scipp/multi-file-widget
Browse files Browse the repository at this point in the history
Add multi-file and multi-string widgets
  • Loading branch information
nvaytet authored Nov 28, 2024
2 parents 80eea76 + 9870ce5 commit db1129a
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 25 deletions.
5 changes: 5 additions & 0 deletions src/ess/reduce/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,11 @@ class StringParameter(Parameter[str]):
pass


@dataclass
class MultiStringParameter(Parameter[tuple[str, ...]]):
"""Widget for entering multiple strings."""


@dataclass(kw_only=True)
class ParamWithBounds(Parameter[T]):
bounds: tuple[T, T]
Expand Down
46 changes: 25 additions & 21 deletions src/ess/reduce/widgets/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
BooleanParameter,
FilenameParameter,
MultiFilenameParameter,
MultiStringParameter,
ParamWithOptions,
StringParameter,
Parameter,
Expand All @@ -21,9 +22,11 @@
from ._config import default_layout, default_style

from ._binedges_widget import BinEdgesWidget
from ._filename_widget import FilenameWidget, MultiFilenameWidget
from ._linspace_widget import LinspaceWidget
from ._vector_widget import VectorWidget
from ._bounds_widget import BoundsWidget
from ._string_widget import MultiStringWidget, StringWidget
from ._switchable_widget import SwitchWidget
from ._optional_widget import OptionalWidget

Expand Down Expand Up @@ -101,42 +104,41 @@ def boolean_parameter_widget(param: BooleanParameter):

@create_parameter_widget.register(StringParameter)
def string_parameter_widget(param: StringParameter):
name = param.name
description = param.description
if param.switchable:
return widgets.Text(
description=name,
tooltip=description,
layout=default_layout,
style=default_style,
)
else:
return widgets.Text(
value=param.default,
description=name,
tooltip=description,
layout=default_layout,
style=default_style,
)
return StringWidget(
description=param.name,
value=param.default,
layout=default_layout,
style=default_style,
)


@create_parameter_widget.register(MultiStringParameter)
def multi_string_parameter_widget(param: MultiStringParameter):
return MultiStringWidget(
description=param.name,
value=param.default,
layout=default_layout,
style=default_style,
)


@create_parameter_widget.register(FilenameParameter)
def filename_parameter_widget(param: FilenameParameter):
return widgets.Text(
return FilenameWidget(
description=param.name,
value=param.default,
layout=default_layout,
style=default_style,
value=param.default,
)


@create_parameter_widget.register(MultiFilenameParameter)
def multi_filename_parameter_widget(param: MultiFilenameParameter):
return widgets.Text(
return MultiFilenameWidget(
description=param.name,
value=param.default,
layout=default_layout,
style=default_style,
value=param.default,
)


Expand Down Expand Up @@ -182,7 +184,9 @@ def vector_3d_parameter_widget(param: Vector3dParameter):
'BinEdgesWidget',
'BoundsWidget',
'EssWidget',
'FilenameWidget',
'LinspaceWidget',
'MultiFilenameWidget',
'OptionalWidget',
'SwitchWidget',
'VectorWidget',
Expand Down
10 changes: 10 additions & 0 deletions src/ess/reduce/widgets/_filename_widget.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2024 Scipp contributors (https://github.com/scipp)

from ._string_widget import MultiStringWidget, StringWidget


class FilenameWidget(StringWidget): ...


class MultiFilenameWidget(MultiStringWidget): ...
39 changes: 39 additions & 0 deletions src/ess/reduce/widgets/_string_widget.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2024 Scipp contributors (https://github.com/scipp)
from ipywidgets import HBox, Text, ValueWidget

from ._config import default_layout


class StringWidget(HBox, ValueWidget):
def __init__(self, description: str, value: str | None = None, **kwargs):
super().__init__(layout=default_layout)
self.text_widget = Text(description=description, value=value, **kwargs)
self.children = [self.text_widget]

@property
def value(self) -> str | None:
v = self.text_widget.value.strip()
if not v:
return None
return v

@value.setter
def value(self, value: str | None):
if value is None:
self.text_widget.value = ''
else:
self.text_widget.value = value


class MultiStringWidget(StringWidget):
@property
def value(self) -> tuple[str, ...]:
v = super().value
if v is None:
return ()
return tuple(s.strip() for s in v.split(','))

@value.setter
def value(self, value: tuple[str, ...]):
self.text_widget.value = ', '.join(value)
5 changes: 1 addition & 4 deletions src/ess/reduce/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,7 @@ def assign_parameter_values(pipeline: Pipeline, values: dict[Key, Any]) -> Pipel
"""Set a value for a parameter in the pipeline."""
pipeline = pipeline.copy()
for key, value in values.items():
if (
isinstance(value, tuple)
and (mapper := parameter_mappers.get(key)) is not None
):
if (mapper := parameter_mappers.get(key)) is not None:
pipeline = mapper(pipeline, value)
else:
pipeline[key] = value
Expand Down

0 comments on commit db1129a

Please sign in to comment.