from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QListWidget, QHBoxLayout, QPushButton, QLineEdit, QListWidgetItem from PyQt5.QtCore import Qt from dusk.entity import Entity from dusk.defs import CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_DEPTH class EntityPanel(QWidget): def __init__(self, parent): super().__init__(parent) self.parent = parent layout = QVBoxLayout(self) self.setLayout(layout) # Top panel placeholder topWidget = QLabel("Entity Editor (top)") layout.addWidget(topWidget) # Name input nameLayout = QHBoxLayout() nameLabel = QLabel("Name:") self.nameInput = QLineEdit() nameLayout.addWidget(nameLabel) nameLayout.addWidget(self.nameInput) layout.addLayout(nameLayout) # Entity list and buttons self.entityList = QListWidget() self.entityList.addItems([]) layout.addWidget(self.entityList, stretch=1) btnLayout = QHBoxLayout() self.btnAdd = QPushButton("Add") self.btnRemove = QPushButton("Remove") btnLayout.addWidget(self.btnAdd) btnLayout.addWidget(self.btnRemove) layout.addLayout(btnLayout) # Events self.btnAdd.clicked.connect(self.onAddEntity) self.btnRemove.clicked.connect(self.onRemoveEntity) self.parent.map.onEntityData.sub(self.onEntityData) self.parent.map.onPositionChange.sub(self.onPositionChange) self.entityList.itemClicked.connect(self.onEntityClicked) self.entityList.itemDoubleClicked.connect(self.onEntityDoubleClicked) # Call once to populate self.onEntityData() self.onEntityUnselect() def onEntityUnselect(self): self.nameInput.setText("") self.entityList.setCurrentItem(None) def onEntitySelect(self, entity): self.nameInput.setText(entity.name) self.entityList.setCurrentItem(entity.item) def onEntityDoubleClicked(self, item): entity = item.data(Qt.UserRole) chunk = entity.chunk worldX = chunk.x + entity.localX worldY = chunk.y + entity.localY worldZ = chunk.z + entity.localZ self.parent.map.moveTo(worldX, worldY, worldZ) def onEntityClicked(self, item): pass def onAddEntity(self): chunk = self.parent.map.getChunkAtWorldPos(*self.parent.map.position) if chunk is None: return ent = chunk.addEntity( self.parent.map.position[0] - chunk.x, self.parent.map.position[1] - chunk.y, self.parent.map.position[2] - chunk.z ) def onRemoveEntity(self): pass def onEntityData(self): self.onEntityUnselect() self.entityList.clear() for chunk in self.parent.map.chunks.values(): for id, entity in chunk.entities.items(): item = QListWidgetItem(entity.name) item.setData(Qt.UserRole, entity) # Store the entity object entity.item = item self.entityList.addItem(item) # Select if there is something at current position self.onPositionChange(self.parent.map.position) def onPositionChange(self, position): self.onEntityUnselect() # Get Entity at.. chunk = self.parent.map.getChunkAtWorldPos(*position) if chunk is None: return localX = position[0] - chunk.x localY = position[1] - chunk.y localZ = position[2] - chunk.z for ent in chunk.entities.values(): if ent.localX != localX or ent.localY != localY or ent.localZ != localZ: continue self.onEntitySelect(ent) self.entityList.setCurrentItem(ent.item) break