""" Weapon Amplifier Selector Dialog Uses /weaponamplifiers API endpoint """ 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 AmplifierSelectorDialog(QDialog): """Dialog for selecting weapon amplifiers.""" def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Select Weapon Amplifier") self.setMinimumSize(600, 500) self._selected_amplifier = None self._amplifiers_cache = [] self._setup_ui() self._load_amplifiers() 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 amplifiers...") self.search_edit.textChanged.connect(self._on_search) search_layout.addWidget(self.search_edit) layout.addLayout(search_layout) # Amplifier 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("Amplifier Info") info_layout = QFormLayout(info_group) self.info_name = QLabel("Select an amplifier") self.info_damage = QLabel("-") self.info_decay = QLabel("-") self.info_ammo = QLabel("-") self.info_efficiency = QLabel("-") self.info_cost = QLabel("-") info_layout.addRow("Name:", self.info_name) info_layout.addRow("Damage Bonus:", self.info_damage) info_layout.addRow("Decay (PEC):", self.info_decay) info_layout.addRow("Ammo Burn:", self.info_ammo) info_layout.addRow("Efficiency:", self.info_efficiency) info_layout.addRow("Cost/Shot:", 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_amplifiers(self): """Load amplifiers from API.""" try: api = get_nexus_api() self._amplifiers_cache = api.get_all_amplifiers() self._populate_list(self._amplifiers_cache) except Exception as e: QMessageBox.warning(self, "Error", f"Failed to load amplifiers: {e}") def _populate_list(self, amplifiers): """Populate the list widget.""" self.list_widget.clear() for amp in amplifiers: # Format display text decay_str = f"{amp.decay} PEC" if amp.decay else "N/A" item_text = f"{amp.name} | Decay: {decay_str}" item = QListWidgetItem(item_text) item.setData(Qt.ItemDataRole.UserRole, amp) # Tooltip with more info tooltip = f"Type: {amp.attachment_type}\nDecay: {amp.decay} PEC" if amp.damage_bonus > 0: tooltip += f"\nDamage: +{amp.damage_bonus}" if amp.efficiency_bonus > 0: tooltip += f"\nEfficiency: {amp.efficiency_bonus}%" 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._amplifiers_cache) return filtered = [amp for amp in self._amplifiers_cache if text.lower() in amp.name.lower()] self._populate_list(filtered) def _on_item_selected(self, item): """Handle item selection.""" amp = item.data(Qt.ItemDataRole.UserRole) if not amp: return # Store selection decay_pec = Decimal(str(amp.decay)) if amp.decay else Decimal("0") damage_bonus = Decimal(str(amp.damage_bonus)) if hasattr(amp, 'damage_bonus') else Decimal("0") self._selected_amplifier = { 'name': amp.name, 'api_id': amp.id, 'decay_pec': decay_pec, 'damage_bonus': damage_bonus, 'efficiency': amp.efficiency_bonus if hasattr(amp, 'efficiency_bonus') else Decimal("0"), } # Update info panel self.info_name.setText(amp.name) self.info_damage.setText(f"+{damage_bonus}") self.info_decay.setText(f"{decay_pec} PEC") # Get ammo burn from properties if available ammo_burn = "N/A" if hasattr(amp, 'ammo_burn') and amp.ammo_burn: ammo_burn = str(amp.ammo_burn) self._selected_amplifier['ammo_burn'] = amp.ammo_burn self.info_ammo.setText(ammo_burn) efficiency = f"{amp.efficiency_bonus}%" if hasattr(amp, 'efficiency_bonus') and amp.efficiency_bonus else "N/A" self.info_efficiency.setText(efficiency) # Calculate cost per shot (decay in PEC converted to PED) cost_per_shot = decay_pec / Decimal("100") self.info_cost.setText(f"{cost_per_shot:.4f} PED") self.select_btn.setEnabled(True) def get_selected_amplifier(self): """Get the selected amplifier data.""" return self._selected_amplifier