From 37302d6a5a6154e53deae801bab6e904a13d5e87 Mon Sep 17 00:00:00 2001 From: LemonNexus Date: Mon, 9 Feb 2026 10:42:32 +0000 Subject: [PATCH] fix(ui): add missing ArmorSelectorDialog class - Implemented ArmorSelectorDialog for selecting armors from API - Search functionality by name - Displays protection stats (Impact, Cut, Stab, etc.) - Fixes ImportError in ui/__init__.py --- ui/loadout_manager.py | 109 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/ui/loadout_manager.py b/ui/loadout_manager.py index 14ae3b3..30473b9 100644 --- a/ui/loadout_manager.py +++ b/ui/loadout_manager.py @@ -733,6 +733,115 @@ class WeaponSelectorDialog(QDialog): self.accept() +# ============================================================================ +# Armor Selector Dialog +# ============================================================================ + +class ArmorSelectorDialog(QDialog): + """Dialog for selecting armors from Entropia Nexus API.""" + + armor_selected = pyqtSignal(object) + + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("Select Armor - Entropia Nexus") + self.setMinimumSize(900, 600) + self.armors = [] + self.selected_armor = None + self.api = EntropiaNexusAPI() + + self._setup_ui() + self._load_data() + + def _setup_ui(self): + layout = QVBoxLayout(self) + layout.setSpacing(10) + + self.status_label = QLabel("Loading armors from Entropia Nexus...") + layout.addWidget(self.status_label) + + search_layout = QHBoxLayout() + search_layout.addWidget(QLabel("Search:")) + self.search_input = QLineEdit() + self.search_input.setPlaceholderText("Search armors by name...") + self.search_input.returnPressed.connect(self._on_search) + search_layout.addWidget(self.search_input) + self.search_btn = QPushButton("Search") + self.search_btn.clicked.connect(self._on_search) + search_layout.addWidget(self.search_btn) + layout.addLayout(search_layout) + + self.results_tree = QTreeWidget() + self.results_tree.setHeaderLabels([ + "Name", "Type", "Durability", "Impact", "Cut", "Stab", "Burn", "Cold" + ]) + header = self.results_tree.header() + header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) + header.setStretchLastSection(False) + self.results_tree.itemSelectionChanged.connect(self._on_selection_changed) + self.results_tree.itemDoubleClicked.connect(self._on_double_click) + layout.addWidget(self.results_tree) + + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel + ) + buttons.accepted.connect(self._on_accept) + buttons.rejected.connect(self.reject) + layout.addWidget(buttons) + + def _load_data(self): + """Load armors from API.""" + try: + self.armors = self.api.get_all_armors() + self._populate_results(self.armors) + self.status_label.setText(f"Loaded {len(self.armors)} armors from Entropia Nexus") + except Exception as e: + self.status_label.setText(f"Error loading armors: {e}") + + def _populate_results(self, armors): + """Populate results tree.""" + self.results_tree.clear() + for armor in armors: + item = QTreeWidgetItem() + item.setText(0, armor.name) + item.setText(1, armor.type or "Unknown") + item.setText(2, str(armor.durability)) + item.setText(3, str(armor.protection_impact)) + item.setText(4, str(armor.protection_cut)) + item.setText(5, str(armor.protection_stab)) + item.setText(6, str(armor.protection_burn)) + item.setText(7, str(armor.protection_cold)) + item.setData(0, Qt.ItemDataRole.UserRole, armor) + self.results_tree.addTopLevelItem(item) + + def _on_search(self): + """Handle search.""" + query = self.search_input.text().lower() + if not query: + self._populate_results(self.armors) + return + + filtered = [a for a in self.armors if query in a.name.lower()] + self._populate_results(filtered) + self.status_label.setText(f"Found {len(filtered)} armors matching '{query}'") + + def _on_selection_changed(self): + """Handle selection change.""" + items = self.results_tree.selectedItems() + if items: + self.selected_armor = items[0].data(0, Qt.ItemDataRole.UserRole) + + def _on_double_click(self, item, column): + """Handle double click.""" + self._on_accept() + + def _on_accept(self): + """Handle OK button.""" + if self.selected_armor: + self.armor_selected.emit(self.selected_armor) + self.accept() + + # ============================================================================ # Main Loadout Manager Dialog # ============================================================================