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