class ArrayRequirementEditor: def __init__(self, parent: QWidget, parent_layout: QVBoxLayout, resource_database: ResourceDatabase, requirement: Union[RequirementOr, RequirementAnd]): self._editors = [] self.resource_database = resource_database self._array_type = type(requirement) self.group_box = QGroupBox(parent) self.group_box.setStyleSheet("QGroupBox { margin-top: 2px; }") parent_layout.addWidget(self.group_box) self.item_layout = QVBoxLayout(self.group_box) self.item_layout.setContentsMargins(8, 2, 2, 6) self.item_layout.setAlignment(Qt.AlignTop) self.new_item_button = QPushButton(self.group_box) self.new_item_button.setMaximumWidth(75) self.new_item_button.setText("New Row") self.new_item_button.clicked.connect(self.new_item) for item in requirement.items: self._create_item(item) self.item_layout.addWidget(self.new_item_button) def _create_item(self, item: Requirement): def on_remove(): self._editors.remove(nested_editor) nested_editor.deleteLater() nested_editor = RequirementEditor(self.group_box, self.item_layout, self.resource_database, on_remove=on_remove) nested_editor.create_specialized_editor(item) self._editors.append(nested_editor) def new_item(self): self._create_item( _create_default_resource_requirement(self.resource_database)) self.item_layout.removeWidget(self.new_item_button) self.item_layout.addWidget(self.new_item_button) def deleteLater(self): self.group_box.deleteLater() for editor in self._editors: editor.deleteLater() self.new_item_button.deleteLater() @property def current_requirement(self) -> Union[RequirementOr, RequirementAnd]: return self._array_type( [editor.current_requirement for editor in self._editors])
class create_elem(QGroupBox): def __init__(self, name, type, data=""): QGroupBox.__init__(self) if name.find(": ") != -1: name = name.split(": ")[0] self.name, self.type = name, type self.data = data self.defaultElement = QGroupBox() mainElementLayout = QVBoxLayout() elementLayout = QHBoxLayout() if self.data == "": self.lName = QLabel(str(name)) else: self.lName = QLabel(str(name) + ": " + str(self.data)) self.lName.setMinimumSize(10, 10) duplicate = QPushButton("❐") duplicate.clicked.connect(lambda: self.duplicateElement()) edit = QPushButton("✎") edit.clicked.connect(lambda: self.editText()) remove = QPushButton("×") remove.clicked.connect(lambda: self.delElement()) elementLayout.addWidget(self.lName) elementLayout.addWidget(duplicate) elementLayout.addWidget(edit) elementLayout.addWidget(remove) elementLayout.setStretch(0, 2) mainElementLayout.addLayout(elementLayout) mainElementLayout.addSpacing(10) self.defaultElement.setLayout(mainElementLayout) self.defaultElement.setFixedHeight(80) def editText(self): if self.type == "Comment": if self.data != "": text = CommentPopup(self.data) else: text = CommentPopup() self.data = text.saveElement() if self.data == "": self.lName.setText(self.name) else: self.lName.setText(self.name + ": " + self.data) def getElem(self): return self.defaultElement def duplicateElement(self): index = widget.elems_list.index(self.defaultElement) if self.type == "Comment": widget.add_element(self.name, self.type, True, index, self.data) def delElement(self): self.defaultElement.deleteLater() widget.elems -= 1 widget.layout.removeWidget(self.defaultElement) widget.elems_list.remove(self.defaultElement) widget.update()
def _delete_alternative(self, group: QGroupBox): index = self._elements.index(group) assert index is not None del self._elements[index] group.deleteLater()