def _initUI(self):
        # Widgets
        self._lbl_left = QLabel('Left substrate')
        self._lbl_left.setStyleSheet('color: blue')
        self._lst_left = MaterialListWidget(_VerticalLeftSubstrateBody.material)

        self._lbl_layer = QLabel('Layer')
        self._lbl_layer.setStyleSheet('color: blue')
        self._lst_layer = LayerListWidget(VerticalLayers.layers)
        self._lst_layer.setRequired(False)

        self._lbl_right = QLabel('Right substrate')
        self._lbl_right.setStyleSheet('color: blue')
        self._lst_right = MaterialListWidget(_VerticalRightSubstrateBody.material)

        self._lbl_depth = QLabel('Depth')
        self._lbl_depth.setStyleSheet('color: blue')
        self._txt_depth = UnitParameterWidget(VerticalLayers.depth_m)
        self._txt_depth.setValues(['inf'])

        # Layouts
        layout = _GeometryWidget._initUI(self)

        sublayout = QHBoxLayout()

        subsublayout = QVBoxLayout()
        subsublayout.addWidget(self._lbl_left)
        subsublayout.addWidget(self._lst_left)
        sublayout.addLayout(subsublayout)

        subsublayout = QVBoxLayout()
        subsublayout.addWidget(self._lbl_layer)
        subsublayout.addWidget(self._lst_layer)
        sublayout.addLayout(subsublayout)

        subsublayout = QVBoxLayout()
        subsublayout.addWidget(self._lbl_right)
        subsublayout.addWidget(self._lst_right)
        sublayout.addLayout(subsublayout)

        layout.insertRow(0, sublayout)
        layout.insertRow(1, self._lbl_depth, self._txt_depth)

        return layout
class VerticalLayersWidget(_GeometryWidget):

    def __init__(self, parent=None):
        _GeometryWidget.__init__(self, parent=parent)
        self.setAccessibleName("Vertical layers")

    def _initUI(self):
        # Widgets
        self._lbl_left = QLabel('Left substrate')
        self._lbl_left.setStyleSheet('color: blue')
        self._lst_left = MaterialListWidget(_VerticalLeftSubstrateBody.material)

        self._lbl_layer = QLabel('Layer')
        self._lbl_layer.setStyleSheet('color: blue')
        self._lst_layer = LayerListWidget(VerticalLayers.layers)
        self._lst_layer.setRequired(False)

        self._lbl_right = QLabel('Right substrate')
        self._lbl_right.setStyleSheet('color: blue')
        self._lst_right = MaterialListWidget(_VerticalRightSubstrateBody.material)

        self._lbl_depth = QLabel('Depth')
        self._lbl_depth.setStyleSheet('color: blue')
        self._txt_depth = UnitParameterWidget(VerticalLayers.depth_m)
        self._txt_depth.setValues(['inf'])

        # Layouts
        layout = _GeometryWidget._initUI(self)

        sublayout = QHBoxLayout()

        subsublayout = QVBoxLayout()
        subsublayout.addWidget(self._lbl_left)
        subsublayout.addWidget(self._lst_left)
        sublayout.addLayout(subsublayout)

        subsublayout = QVBoxLayout()
        subsublayout.addWidget(self._lbl_layer)
        subsublayout.addWidget(self._lst_layer)
        sublayout.addLayout(subsublayout)

        subsublayout = QVBoxLayout()
        subsublayout.addWidget(self._lbl_right)
        subsublayout.addWidget(self._lst_right)
        sublayout.addLayout(subsublayout)

        layout.insertRow(0, sublayout)
        layout.insertRow(1, self._lbl_depth, self._txt_depth)

        return layout

    def value(self):
        geometry = VerticalLayers(left_material=self._lst_left.values(),
                                  right_material=self._lst_right.values(),
                                  depth_m=self._txt_depth.values(),
                                  tilt_rad=self._txt_tilt.values(),
                                  rotation_rad=self._txt_rotation.values())

        for layer in self._lst_layer.values():
            geometry.add_layer(layer.material, layer.thickness_m)

        return geometry

    def setValue(self, geometry):
        _GeometryWidget.setValue(self, geometry)
        if hasattr(geometry, 'left_substrate') and \
                hasattr(geometry.left_substrate, 'material'):
            self._lst_left.setValues(geometry.left_substrate.material)
        if hasattr(geometry, 'layers'):
            self._lst_layer.setValues(geometry.layers)
        if hasattr(geometry, 'right_substrate') and \
                hasattr(geometry.right_substrate, 'material'):
            self._lst_right.setValues(geometry.right_substrate.material)
        if hasattr(geometry, 'depth_m'):
            self._txt_depth.setValues(geometry.depth_m)

    def setReadOnly(self, state):
        _GeometryWidget.setReadOnly(self, state)
        style = 'color: none' if state else 'color: blue'
        self._lbl_left.setStyleSheet(style)
        self._lbl_layer.setStyleSheet(style)
        self._lbl_right.setStyleSheet(style)
        self._lbl_depth.setStyleSheet(style)

    def setMaterialClass(self, clasz):
        self._lst_left.setMaterialClass(clasz)
        self._lst_layer.setMaterialClass(clasz)
        self._lst_right.setMaterialClass(clasz)