-
-
Notifications
You must be signed in to change notification settings - Fork 256
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
#320 added support for dynamic "default" option, depending on other p…
…arameters
- Loading branch information
Showing
9 changed files
with
337 additions
and
149 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
import re | ||
|
||
from model.model_helper import is_empty, fill_parameter_values | ||
from react.properties import ObservableList, ObservableDict, Property | ||
|
||
|
||
class TemplateProperty: | ||
def __init__(self, template_config, parameters: ObservableList, values: ObservableDict, empty=None) -> None: | ||
self._value_property = Property(None) | ||
self._template_config = template_config | ||
self._values = values | ||
self._empty = empty | ||
self._parameters = parameters | ||
|
||
pattern = re.compile('\${([^}]+)\}') | ||
|
||
search_start = 0 | ||
script_template = '' | ||
required_parameters = set() | ||
|
||
templates = template_config if isinstance(template_config, list) else [template_config] | ||
|
||
for template in templates: | ||
if template: | ||
while search_start < len(template): | ||
match = pattern.search(template, search_start) | ||
if not match: | ||
script_template += template[search_start:] | ||
break | ||
param_start = match.start() | ||
if param_start > search_start: | ||
script_template += template[search_start:param_start] | ||
|
||
param_name = match.group(1) | ||
required_parameters.add(param_name) | ||
|
||
search_start = match.end() + 1 | ||
|
||
self.required_parameters = tuple(required_parameters) | ||
|
||
self._reload() | ||
|
||
if self.required_parameters: | ||
values.subscribe(self._value_changed) | ||
parameters.subscribe(self) | ||
|
||
def _value_changed(self, parameter, old, new): | ||
if parameter in self.required_parameters: | ||
self._reload() | ||
|
||
def on_add(self, parameter, index): | ||
if parameter.name in self.required_parameters: | ||
self._reload() | ||
|
||
def on_remove(self, parameter): | ||
if parameter.name in self.required_parameters: | ||
self._reload() | ||
|
||
def _reload(self): | ||
values_filled = True | ||
for param_name in self.required_parameters: | ||
value = self._values.get(param_name) | ||
if is_empty(value): | ||
values_filled = False | ||
break | ||
|
||
if self._template_config is None: | ||
self.value = None | ||
elif values_filled: | ||
if isinstance(self._template_config, list): | ||
values = [] | ||
for single_template in self._template_config: | ||
values.append(fill_parameter_values(self._parameters, single_template, self._values)) | ||
self.value = values | ||
else: | ||
self.value = fill_parameter_values(self._parameters, self._template_config, self._values) | ||
else: | ||
self.value = self._empty | ||
|
||
self._value_property.set(self.value) | ||
|
||
def subscribe(self, observer): | ||
self._value_property.subscribe(observer) | ||
|
||
def unsubscribe(self, observer): | ||
self._value_property.unsubscribe(observer) | ||
|
||
def get(self): | ||
return self._value_property.get() |
Oops, something went wrong.