+ """.format(
+ inputs="".join(self.render_input(input, data, errors) for input in self.optional_inputs)
+ )
+
+ def render_inputs(self, data, errors):
+ return (
+ super().render_inputs(data, errors)
+ + self.render_optional_select()
+ + self.render_optional_inputs(data, errors)
+ )
+
+ def render(self, data, errors):
+ indexed_inputs = {input.id: input for input in self.inputs}
+ visible_keys = set(self.mandatory + [k for k in self.optional if k in data])
+ optional_keys = set(k for k in self.optional if k not in data)
+ self.inputs = [input for k, input in indexed_inputs.items() if k in visible_keys]
+ for input in self.inputs:
+ if self._is_optional(input):
+ input.setRemovable()
+ self.optional_inputs = [input for k, input in indexed_inputs.items() if k in optional_keys]
+ for input in self.optional_inputs:
+ input.setRemovable()
+ input.setDisabled()
+ return super().render(data, errors)
+
+ def parse(self, data):
+ data, errors = super().parse(data)
+ # filter out errors for optional fields
+ errors = [e for e in errors if e.getKey() not in self.optional or e.getKey() in data]
+ # remove optional keys if they have been removed from the form by setting them to None
+ for k in self.optional:
+ if k not in data:
+ data[k] = None
+ return data, errors
diff --git a/owrx/source/__init__.py b/owrx/source/__init__.py
index e5801be..7f5e0a4 100644
--- a/owrx/source/__init__.py
+++ b/owrx/source/__init__.py
@@ -16,7 +16,7 @@ from owrx.form.input import Input, TextInput, NumberInput, CheckboxInput, ModesI
from owrx.form.input.converter import OptionalConverter
from owrx.form.input.device import GainInput, SchedulerInput, WaterfallLevelsInput
from owrx.form.input.validator import RequiredValidator
-from owrx.controllers.settings import Section
+from owrx.form.section import OptionalSection
from owrx.feature import FeatureDetector
from typing import List
from enum import Enum
@@ -447,90 +447,6 @@ class SdrDeviceDescriptionMissing(Exception):
pass
-class OptionalSection(Section):
- def __init__(self, title, inputs: List[Input], mandatory, optional):
- super().__init__(title, *inputs)
- self.mandatory = mandatory
- self.optional = optional
- self.optional_inputs = []
-
- def classes(self):
- classes = super().classes()
- classes.append("optional-section")
- return classes
-
- def _is_optional(self, input):
- return input.id in self.optional
-
- def render_optional_select(self):
- return """
-
-
- """.format(
- inputs="".join(self.render_input(input, data, errors) for input in self.optional_inputs)
- )
-
- def render_inputs(self, data, errors):
- return (
- super().render_inputs(data, errors)
- + self.render_optional_select()
- + self.render_optional_inputs(data, errors)
- )
-
- def render(self, data, errors):
- indexed_inputs = {input.id: input for input in self.inputs}
- visible_keys = set(self.mandatory + [k for k in self.optional if k in data])
- optional_keys = set(k for k in self.optional if k not in data)
- self.inputs = [input for k, input in indexed_inputs.items() if k in visible_keys]
- for input in self.inputs:
- if self._is_optional(input):
- input.setRemovable()
- self.optional_inputs = [input for k, input in indexed_inputs.items() if k in optional_keys]
- for input in self.optional_inputs:
- input.setRemovable()
- input.setDisabled()
- return super().render(data, errors)
-
- def parse(self, data):
- data, errors = super().parse(data)
- # filter out errors for optional fields
- errors = [e for e in errors if e.getKey() not in self.optional or e.getKey() in data]
- # remove optional keys if they have been removed from the form by setting them to None
- for k in self.optional:
- if k not in data:
- data[k] = None
- return data, errors
-
-
class SdrDeviceDescription(object):
@staticmethod
def getByType(sdr_type: str) -> "SdrDeviceDescription":