def _create_resource_type_combo( current_resource_type: ResourceType, parent: QWidget, resource_database: ResourceDatabase) -> QComboBox: """ :param current_resource_type: :param parent: :return: """ resource_type_combo = ScrollProtectedComboBox(parent) for resource_type in iterate_enum(ResourceType): try: count_elements = len(resource_database.get_by_type(resource_type)) except ValueError: count_elements = 0 if count_elements == 0: continue resource_type_combo.addItem(resource_type.name, resource_type) if resource_type is current_resource_type: resource_type_combo.setCurrentIndex(resource_type_combo.count() - 1) return resource_type_combo
def _create_customizable_default_items(self, item_database: ItemDatabase): self._default_items = {} for category, possibilities in item_database.default_items.items(): parent, layout, _ = self._boxes_for_category[category.name] label = QtWidgets.QLabel(parent) label.setText(f"Default {category.long_name}") layout.addWidget(label, 0, 0) combo = ScrollProtectedComboBox(parent) for item in possibilities: combo.addItem(item.name, item) combo.currentIndexChanged.connect(partial(self._on_default_item_updated, category, combo)) layout.addWidget(combo, 0, 1) if len(possibilities) <= 1: label.hide() combo.hide() self._default_items[category] = combo
def _create_resource_name_combo( resource_database: ResourceDatabase, resource_type: ResourceType, current_resource: Optional[ResourceInfo], parent: QWidget, ) -> QComboBox: """ :param resource_database: :param current_resource: :param parent: :return: """ resource_name_combo = ScrollProtectedComboBox(parent) for resource in sorted(resource_database.get_by_type(resource_type), key=lambda x: x.long_name): resource_name_combo.addItem(resource.long_name, resource) if resource is current_resource: resource_name_combo.setCurrentIndex(resource_name_combo.count() - 1) return resource_name_combo
def __init__(self, parent: QtWidgets.QWidget, game: GameDescription): super().__init__(parent) set_default_window_icon(self) self.setWindowTitle("Layers") self.root_widget = QtWidgets.QScrollArea() self.root_layout = QtWidgets.QVBoxLayout(self.root_widget) self.root_widget.setWidgetResizable(True) self.setWidget(self.root_widget) self.contents_widget = QtWidgets.QWidget() self.contents_layout = QtWidgets.QVBoxLayout(self.contents_widget) self.root_widget.setWidget(self.contents_widget) self.title_label = QtWidgets.QLabel(self.contents_widget) self.title_label.setText("Select visible layers") self.contents_layout.addWidget(self.title_label) self.layer_checks = [] for layer in game.layers: self.layer_checks.append( layer_check := QtWidgets.QCheckBox(self.contents_widget)) layer_check.setText(layer) layer_check.setChecked(True) signal_handling.on_checked(layer_check, lambda it: self._notify_change()) self.contents_layout.addWidget(layer_check) self.add_layer_button = QtWidgets.QPushButton(self.contents_widget) self.add_layer_button.setText("Add new layer") self.add_layer_button.setEnabled(False) self.add_layer_button.setToolTip("Not implemented") self.contents_layout.addWidget(self.add_layer_button) self.tricks_box = QtWidgets.QGroupBox(self.contents_widget) self.tricks_box.setTitle("Simplify connections with:") self.contents_layout.addWidget(self.tricks_box) self.tricks_layout = QtWidgets.QVBoxLayout(self.tricks_box) self.tricks = {} for trick in sorted(game.resource_database.trick, key=lambda it: it.long_name): trick_layout = QtWidgets.QHBoxLayout() self.tricks_layout.addLayout(trick_layout) trick_check = QtWidgets.QCheckBox(self.tricks_box) trick_check.setText(trick.long_name) trick_layout.addWidget(trick_check) trick_combo = ScrollProtectedComboBox(self.tricks_box) trick_layout.addWidget(trick_combo) for trick_level in enum_lib.iterate_enum(LayoutTrickLevel): trick_combo.addItem(trick_level.long_name, userData=trick_level.as_number) signal_handling.on_combo(trick_combo, lambda it: self._notify_change()) trick_combo.setEnabled(False) signal_handling.on_checked(trick_check, trick_combo.setEnabled) signal_handling.on_checked(trick_check, lambda it: self._notify_change()) self.tricks[(trick, trick_check)] = trick_combo self.load_preset_button = QtWidgets.QPushButton(self.contents_widget) self.load_preset_button.setText("Configure with preset") self.load_preset_button.clicked.connect(self._on_load_preset_slot) self.contents_layout.addWidget(self.load_preset_button) self.vertical_spacer = QtWidgets.QSpacerItem( 20, 30, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.contents_layout.addItem(self.vertical_spacer)
class ResourceRequirementEditor: def __init__( self, parent: QWidget, layout: QHBoxLayout, resource_database: ResourceDatabase, item: ResourceRequirement, ): self.parent = parent self.layout = layout self.resource_database = resource_database self.resource_type_combo = _create_resource_type_combo( item.resource.resource_type, parent, resource_database) self.resource_type_combo.setMinimumWidth(75) self.resource_type_combo.setMaximumWidth(75) self.resource_name_combo = _create_resource_name_combo( self.resource_database, item.resource.resource_type, item.resource, self.parent) self.negate_combo = ScrollProtectedComboBox(parent) self.negate_combo.addItem("≥", False) self.negate_combo.addItem("<", True) self.negate_combo.setCurrentIndex(int(item.negate)) self.negate_combo.setMinimumWidth(40) self.negate_combo.setMaximumWidth(40) self.negate_check = QtWidgets.QCheckBox(parent) self.negate_check.setChecked(item.negate) self.amount_edit = QLineEdit(parent) self.amount_edit.setValidator(QIntValidator(1, 10000)) self.amount_edit.setText(str(item.amount)) self.amount_edit.setMinimumWidth(45) self.amount_edit.setMaximumWidth(45) self.amount_combo = ScrollProtectedComboBox(parent) for trick_level in iterate_enum(LayoutTrickLevel): self.amount_combo.addItem(trick_level.long_name, userData=trick_level.as_number) self.amount_combo.setCurrentIndex( self.amount_combo.findData(item.amount)) for widget in self._all_widgets: self.layout.addWidget(widget) self.resource_type_combo.currentIndexChanged.connect(self._update_type) self._update_visible_elements_by_type() @property def resource_type(self) -> ResourceType: return self.resource_type_combo.currentData() def _update_visible_elements_by_type(self): resource_type = self.resource_type if resource_type == ResourceType.DAMAGE: self.negate_combo.setCurrentIndex(0) self.negate_check.setText("Before" if resource_type == ResourceType.EVENT else "Not") self.negate_check.setVisible( resource_type in {ResourceType.EVENT, ResourceType.VERSION, ResourceType.MISC}) self.negate_combo.setVisible( resource_type in {ResourceType.ITEM, ResourceType.DAMAGE}) self.negate_combo.setEnabled(resource_type == ResourceType.ITEM) self.amount_edit.setVisible( resource_type in {ResourceType.ITEM, ResourceType.DAMAGE}) self.amount_combo.setVisible(resource_type == ResourceType.TRICK) def _update_type(self): old_combo = self.resource_name_combo self.resource_name_combo = _create_resource_name_combo( self.resource_database, self.resource_type_combo.currentData(), None, self.parent) self.layout.replaceWidget(old_combo, self.resource_name_combo) old_combo.deleteLater() self._update_visible_elements_by_type() def deleteLater(self): for widget in self._all_widgets: widget.deleteLater() @property def _all_widgets(self) -> typing.Iterable[QWidget]: yield self.resource_type_combo yield self.negate_check yield self.resource_name_combo yield self.negate_combo yield self.amount_edit yield self.amount_combo @property def current_requirement(self) -> ResourceRequirement: resource_type = self.resource_type # Quantity if resource_type == ResourceType.TRICK: quantity: int = self.amount_combo.currentData() elif resource_type == ResourceType.EVENT: quantity = 1 else: quantity = int(self.amount_edit.text()) # Negate flag if resource_type == ResourceType.ITEM: negate: bool = self.negate_combo.currentData() elif resource_type == ResourceType.EVENT: negate = self.negate_check.isChecked() else: negate = False return ResourceRequirement(self.resource_name_combo.currentData(), quantity, negate)