Lemontropia-Suite/ui/mindforce_selector.py

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