class FindToolBar(QToolBar): find = QtCore.Signal(str, QWebEnginePage.FindFlags) def __init__(self): super(FindToolBar, self).__init__() self._line_edit = QLineEdit() self._line_edit.setClearButtonEnabled(True) self._line_edit.setPlaceholderText("Find...") self._line_edit.setMaximumWidth(300) self._line_edit.returnPressed.connect(self._find_next) self.addWidget(self._line_edit) self._previous_button = QToolButton() style_icons = ':/qt-project.org/styles/commonstyle/images/' self._previous_button.setIcon(QIcon(style_icons + 'up-32.png')) self._previous_button.clicked.connect(self._find_previous) self.addWidget(self._previous_button) self._next_button = QToolButton() self._next_button.setIcon(QIcon(style_icons + 'down-32.png')) self._next_button.clicked.connect(self._find_next) self.addWidget(self._next_button) self._case_sensitive_checkbox = QCheckBox('Case Sensitive') self.addWidget(self._case_sensitive_checkbox) self._hideButton = QToolButton() self._hideButton.setShortcut(QKeySequence(Qt.Key_Escape)) self._hideButton.setIcon(QIcon(style_icons + 'closedock-16.png')) self._hideButton.clicked.connect(self.hide) self.addWidget(self._hideButton) def focus_find(self): self._line_edit.setFocus() def _emit_find(self, backward): needle = self._line_edit.text().strip() if needle: flags = QWebEnginePage.FindFlags() if self._case_sensitive_checkbox.isChecked(): flags |= QWebEnginePage.FindCaseSensitively if backward: flags |= QWebEnginePage.FindBackward self.find.emit(needle, flags) def _find_next(self): self._emit_find(False) def _find_previous(self): self._emit_find(True)
def _int_field( self, min_val: int, max_val: int, placeholder: str = "", tooltip: str = "", ) -> QLineEdit: result = QLineEdit() # TODO derive the max width from the text repr of min_val, max_val. result.setMaximumWidth(self._FIELD_WIDTH) result.setAlignment(Qt.AlignRight) validator = QIntValidator(min_val, max_val) result.setValidator(validator) if placeholder: result.setPlaceholderText(placeholder) if tooltip: result.setToolTip(tooltip) return result
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)
class ItemRow: def __init__(self, parent: QWidget, parent_layout: QVBoxLayout, resource_database: ResourceDatabase, item: ResourceRequirement, rows: List["ItemRow"]): self.parent = parent self.resource_database = resource_database self._rows = rows rows.append(self) self.layout = QHBoxLayout() self.layout.setObjectName(f"Box layout for {item.resource.long_name}") parent_layout.addLayout(self.layout) self.resource_type_combo = _create_resource_type_combo( item.resource.resource_type, parent) 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 = QComboBox(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.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.remove_button = QPushButton(parent) self.remove_button.setText("X") self.remove_button.setMaximumWidth(20) self.layout.addWidget(self.resource_type_combo) self.layout.addWidget(self.resource_name_combo) self.layout.addWidget(self.negate_combo) self.layout.addWidget(self.amount_edit) self.layout.addWidget(self.remove_button) self.resource_type_combo.currentIndexChanged.connect(self._update_type) self.remove_button.clicked.connect(self._delete_row) 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() def _delete_row(self): self.resource_type_combo.deleteLater() self.resource_name_combo.deleteLater() self.negate_combo.deleteLater() self.amount_edit.deleteLater() self.remove_button.deleteLater() self.layout.deleteLater() self._rows.remove(self) @property def current_individual(self) -> ResourceRequirement: return ResourceRequirement(self.resource_name_combo.currentData(), int(self.amount_edit.text()), self.negate_combo.currentData())