feat(ui): add separate Left/Right ring slots in loadout manager

- Split accessories section into Left Ring and Right Ring selectors
- Added Clothing and Pet buttons
- Updated AccessoriesSelectorDialog to accept slot_filter parameter
- Filter rings by Left Finger/Right Finger slot when selecting
- Store current_left_ring and current_right_ring in loadout
- Display ring effects (multi-effect support) in the UI

Ring effects like 'Decreased Critical Damage Taken 4%, Increased
Dodge Chance 4%' are now properly displayed.
This commit is contained in:
LemonNexus 2026-02-09 14:46:35 +00:00
parent 1db965f92a
commit 2183b79ce8
2 changed files with 416 additions and 340 deletions

View File

@ -43,7 +43,7 @@ class AccessoriesSelectorDialog(QDialog):
clothing_selected = pyqtSignal(NexusClothing) clothing_selected = pyqtSignal(NexusClothing)
pet_selected = pyqtSignal(NexusPet) pet_selected = pyqtSignal(NexusPet)
def __init__(self, parent=None, initial_tab: str = "rings"): def __init__(self, parent=None, initial_tab: str = "rings", slot_filter: str = None):
super().__init__(parent) super().__init__(parent)
self.setWindowTitle("Select Accessories - Entropia Nexus") self.setWindowTitle("Select Accessories - Entropia Nexus")
self.setMinimumSize(900, 600) self.setMinimumSize(900, 600)
@ -56,6 +56,8 @@ class AccessoriesSelectorDialog(QDialog):
self.selected_clothing: Optional[NexusClothing] = None self.selected_clothing: Optional[NexusClothing] = None
self.selected_pet: Optional[NexusPet] = None self.selected_pet: Optional[NexusPet] = None
self.slot_filter = slot_filter # "Left Finger" or "Right Finger" or None
self._setup_ui() self._setup_ui()
# Set initial tab # Set initial tab
@ -302,7 +304,12 @@ class AccessoriesSelectorDialog(QDialog):
tree.addTopLevelItem(item) tree.addTopLevelItem(item)
return return
for ring in self.all_rings: # Filter rings by slot if specified
rings_to_show = self.all_rings
if self.slot_filter:
rings_to_show = [r for r in rings_to_show if r.slot == self.slot_filter]
for ring in rings_to_show:
item = QTreeWidgetItem() item = QTreeWidgetItem()
item.setText(0, ring.name) item.setText(0, ring.name)
# Format effects as string # Format effects as string

View File

@ -986,6 +986,8 @@ class LoadoutManagerDialog(QDialog):
self.current_weapon: Optional[WeaponStats] = None self.current_weapon: Optional[WeaponStats] = None
self.current_armor_set: Optional[ArmorSet] = None self.current_armor_set: Optional[ArmorSet] = None
self.equipped_armor: Optional[EquippedArmor] = None self.equipped_armor: Optional[EquippedArmor] = None
self.current_left_ring: Optional[NexusRing] = None
self.current_right_ring: Optional[NexusRing] = None
# Armor slot widgets # Armor slot widgets
self.slot_widgets: Dict[ArmorSlot, ArmorSlotWidget] = {} self.slot_widgets: Dict[ArmorSlot, ArmorSlotWidget] = {}
@ -1369,19 +1371,53 @@ class LoadoutManagerDialog(QDialog):
heal_layout.addRow("Heal amount:", self.heal_amount_edit) heal_layout.addRow("Heal amount:", self.heal_amount_edit)
right_layout.addWidget(self.heal_group) right_layout.addWidget(self.heal_group)
# Accessories section (NEW) # Accessories section (Rings, Clothing, Pets)
self.accessories_group = DarkGroupBox("💍 Accessories (Rings, Clothing, Pets)") self.accessories_group = DarkGroupBox("💍 Accessories")
accessories_layout = QVBoxLayout(self.accessories_group) accessories_layout = QVBoxLayout(self.accessories_group)
self.select_accessories_btn = QPushButton("🔍 Search Accessories from Nexus") # Rings - Left and Right
self.select_accessories_btn.setObjectName("selectButton") rings_layout = QHBoxLayout()
self.select_accessories_btn.clicked.connect(self._on_select_accessories)
accessories_layout.addWidget(self.select_accessories_btn)
# Display selected accessories left_ring_layout = QVBoxLayout()
self.accessories_summary = QLabel("No accessories selected") left_ring_layout.addWidget(QLabel("Left Ring:"))
self.accessories_summary.setStyleSheet("color: #888888; padding: 5px;") self.left_ring_label = QLabel("None")
accessories_layout.addWidget(self.accessories_summary) self.left_ring_label.setStyleSheet("color: #888888;")
left_ring_layout.addWidget(self.left_ring_label)
self.select_left_ring_btn = QPushButton("🔍 Select")
self.select_left_ring_btn.setObjectName("selectButton")
self.select_left_ring_btn.clicked.connect(self._on_select_left_ring)
left_ring_layout.addWidget(self.select_left_ring_btn)
rings_layout.addLayout(left_ring_layout)
right_ring_layout = QVBoxLayout()
right_ring_layout.addWidget(QLabel("Right Ring:"))
self.right_ring_label = QLabel("None")
self.right_ring_label.setStyleSheet("color: #888888;")
right_ring_layout.addWidget(self.right_ring_label)
self.select_right_ring_btn = QPushButton("🔍 Select")
self.select_right_ring_btn.setObjectName("selectButton")
self.select_right_ring_btn.clicked.connect(self._on_select_right_ring)
right_ring_layout.addWidget(self.select_right_ring_btn)
rings_layout.addLayout(right_ring_layout)
accessories_layout.addLayout(rings_layout)
# Clothing and Pets
other_accessories_layout = QHBoxLayout()
self.select_clothing_btn = QPushButton("👕 Clothing")
self.select_clothing_btn.setObjectName("selectButton")
self.select_clothing_btn.clicked.connect(self._on_select_clothing)
other_accessories_layout.addWidget(self.select_clothing_btn)
self.select_pet_btn = QPushButton("🐾 Pet")
self.select_pet_btn.setObjectName("selectButton")
self.select_pet_btn.clicked.connect(self._on_select_pet)
other_accessories_layout.addWidget(self.select_pet_btn)
accessories_layout.addLayout(other_accessories_layout)
right_layout.addWidget(self.accessories_group)
right_layout.addWidget(self.accessories_group) right_layout.addWidget(self.accessories_group)
@ -1609,25 +1645,58 @@ class LoadoutManagerDialog(QDialog):
f"Break Chance: {enhancer.break_chance * 100:.1f}%" f"Break Chance: {enhancer.break_chance * 100:.1f}%"
) )
def _on_select_accessories(self): def _on_select_left_ring(self):
"""Open accessories selector dialog (rings, clothing, pets).""" """Open ring selector for left finger."""
from ui.accessories_selector import AccessoriesSelectorDialog from ui.accessories_selector import AccessoriesSelectorDialog
dialog = AccessoriesSelectorDialog(self) dialog = AccessoriesSelectorDialog(self, slot_filter="Left Finger")
dialog.ring_selected.connect(self._on_ring_selected) dialog.ring_selected.connect(self._on_left_ring_selected)
dialog.exec()
def _on_select_right_ring(self):
"""Open ring selector for right finger."""
from ui.accessories_selector import AccessoriesSelectorDialog
dialog = AccessoriesSelectorDialog(self, slot_filter="Right Finger")
dialog.ring_selected.connect(self._on_right_ring_selected)
dialog.exec()
def _on_left_ring_selected(self, ring: NexusRing):
"""Handle left ring selection."""
self.current_left_ring = ring
effects_str = ", ".join([f"{k}: {v}" for k, v in ring.effects.items()]) if ring.effects else "No effects"
self.left_ring_label.setText(f"{ring.name}\n{effects_str}")
self.left_ring_label.setStyleSheet("color: #4caf50;")
def _on_right_ring_selected(self, ring: NexusRing):
"""Handle right ring selection."""
self.current_right_ring = ring
effects_str = ", ".join([f"{k}: {v}" for k, v in ring.effects.items()]) if ring.effects else "No effects"
self.right_ring_label.setText(f"{ring.name}\n{effects_str}")
self.right_ring_label.setStyleSheet("color: #4caf50;")
def _on_select_clothing(self):
"""Open clothing selector."""
from ui.accessories_selector import AccessoriesSelectorDialog
dialog = AccessoriesSelectorDialog(self, initial_tab="clothing")
dialog.clothing_selected.connect(self._on_clothing_selected) dialog.clothing_selected.connect(self._on_clothing_selected)
dialog.exec()
def _on_select_pet(self):
"""Open pet selector."""
from ui.accessories_selector import AccessoriesSelectorDialog
dialog = AccessoriesSelectorDialog(self, initial_tab="pets")
dialog.pet_selected.connect(self._on_pet_selected) dialog.pet_selected.connect(self._on_pet_selected)
dialog.exec() dialog.exec()
def _on_select_accessories(self):
"""Open accessories selector dialog (rings, clothing, pets) - legacy."""
self._on_select_left_ring()
def _on_ring_selected(self, ring: NexusRing): def _on_ring_selected(self, ring: NexusRing):
"""Handle ring selection.""" """Handle ring selection - legacy, routes to appropriate slot."""
effects_str = ", ".join([f"{k}: {v}" for k, v in ring.effects.items()]) if ring.effects else "No effects" if ring.slot == "Left Finger":
QMessageBox.information( self._on_left_ring_selected(ring)
self, else:
"Ring Selected", self._on_right_ring_selected(ring)
f"Selected: {ring.name}\n"
f"Effects: {effects_str}\n"
f"Slot: {ring.slot}"
)
def _on_clothing_selected(self, clothing: NexusClothing): def _on_clothing_selected(self, clothing: NexusClothing):
"""Handle clothing selection.""" """Handle clothing selection."""