""" Mindforce Implant/Chip Selector Dialog Uses /medicalchips API endpoint for healing chips """ from PyQt6.QtWidgets import ( QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QListWidget, QListWidgetItem, QLineEdit, QGroupBox, QFormLayout, QMessageBox ) from PyQt6.QtCore import Qt from decimal import Decimal from core.nexus_full_api import get_nexus_api class MindforceSelectorDialog(QDialog): """Dialog for selecting mindforce implants (healing chips).""" def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Select Mindforce Healing Chip") self.setMinimumSize(600, 500) self._selected_chip = None self._chips_cache = [] self._setup_ui() self._load_chips() def _setup_ui(self): layout = QVBoxLayout(self) # Search bar search_layout = QHBoxLayout() search_layout.addWidget(QLabel("Search:")) self.search_edit = QLineEdit() self.search_edit.setPlaceholderText("Type to search chips...") self.search_edit.textChanged.connect(self._on_search) search_layout.addWidget(self.search_edit) layout.addLayout(search_layout) # Chip list self.list_widget = QListWidget() self.list_widget.itemClicked.connect(self._on_item_selected) self.list_widget.itemDoubleClicked.connect(self.accept) layout.addWidget(self.list_widget) # Info panel info_group = QGroupBox("Chip Info") info_layout = QFormLayout(info_group) self.info_name = QLabel("Select a chip") self.info_heal = QLabel("-") self.info_decay = QLabel("-") self.info_uses = QLabel("-") self.info_mindforce_level = QLabel("-") self.info_cost = QLabel("-") info_layout.addRow("Name:", self.info_name) info_layout.addRow("Heal Amount:", self.info_heal) info_layout.addRow("Decay (PEC):", self.info_decay) info_layout.addRow("Uses/Min:", self.info_uses) info_layout.addRow("Mindforce Level:", self.info_mindforce_level) info_layout.addRow("Cost/Heal:", self.info_cost) layout.addWidget(info_group) # Buttons button_layout = QHBoxLayout() button_layout.addStretch() self.select_btn = QPushButton("Select") self.select_btn.clicked.connect(self.accept) self.select_btn.setEnabled(False) button_layout.addWidget(self.select_btn) cancel_btn = QPushButton("Cancel") cancel_btn.clicked.connect(self.reject) button_layout.addWidget(cancel_btn) layout.addLayout(button_layout) def _load_chips(self): """Load healing chips from API.""" try: api = get_nexus_api() # Medical chips are healing-focused mindforce implants self._chips_cache = api.get_all_healing_chips() self._populate_list(self._chips_cache) except Exception as e: QMessageBox.warning(self, "Error", f"Failed to load chips: {e}") def _populate_list(self, chips): """Populate the list widget.""" self.list_widget.clear() for chip in chips: # Get heal amount (average of min/max) heal_amount = getattr(chip, 'heal_amount', Decimal("0")) decay = getattr(chip, 'decay', Decimal("0")) item_text = f"{chip.name} | Heal: {heal_amount}" if decay > 0: item_text += f" | Decay: {decay} PEC" item = QListWidgetItem(item_text) item.setData(Qt.ItemDataRole.UserRole, chip) # Tooltip tooltip = f"Name: {chip.name}" if hasattr(chip, 'heal_amount'): tooltip += f"\nHeal: {chip.heal_amount} HP" if decay > 0: tooltip += f"\nDecay: {decay} PEC" if hasattr(chip, 'uses_per_minute') and chip.uses_per_minute: tooltip += f"\nUses/Min: {chip.uses_per_minute}" item.setToolTip(tooltip) self.list_widget.addItem(item) def _on_search(self, text): """Filter list based on search text.""" if not text: self._populate_list(self._chips_cache) return filtered = [chip for chip in self._chips_cache if text.lower() in chip.name.lower()] self._populate_list(filtered) def _on_item_selected(self, item): """Handle item selection.""" chip = item.data(Qt.ItemDataRole.UserRole) if not chip: return # Extract chip data heal_amount = getattr(chip, 'heal_amount', Decimal("0")) decay = Decimal(str(getattr(chip, 'decay', 0))) uses_per_min = getattr(chip, 'uses_per_minute', None) self._selected_chip = { 'name': chip.name, 'api_id': chip.id, 'decay_pec': decay, 'heal_amount': heal_amount, 'uses_per_minute': uses_per_min, } # Update info panel self.info_name.setText(chip.name) self.info_heal.setText(f"{heal_amount} HP") self.info_decay.setText(f"{decay} PEC") self.info_uses.setText(str(uses_per_min) if uses_per_min else "N/A") # Mindforce level if available mindforce_level = "N/A" if hasattr(chip, 'profession_level') and chip.profession_level: mindforce_level = str(chip.profession_level) self.info_mindforce_level.setText(mindforce_level) # Calculate cost per heal cost_per_heal = decay / Decimal("100") self.info_cost.setText(f"{cost_per_heal:.4f} PED") self.select_btn.setEnabled(True) def get_selected_chip(self): """Get the selected chip data.""" return self._selected_chip