167 lines
5.9 KiB
Python
167 lines
5.9 KiB
Python
"""
|
|
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
|