Source code for editor.ui.groups_panel

from PyQt6.QtWidgets import QDockWidget, QWidget, QVBoxLayout, QListWidget, QPushButton, QHBoxLayout, QInputDialog, QMessageBox, QLabel, QLineEdit
from PyQt6.QtCore import Qt
from core.ecs import Entity

[docs] class GroupsDock(QDockWidget): def __init__(self, main_window): super().__init__("Groups", main_window) self.main_window = main_window self.setAllowedAreas(Qt.DockWidgetArea.LeftDockWidgetArea | Qt.DockWidgetArea.RightDockWidgetArea) container = QWidget() layout = QVBoxLayout(container) # Filter self.filter_edit = QLineEdit() self.filter_edit.setPlaceholderText("Filter groups...") self.filter_edit.textChanged.connect(self.refresh_list) layout.addWidget(self.filter_edit) # List self.groups_list = QListWidget() self.groups_list.itemClicked.connect(self.on_group_selected) layout.addWidget(self.groups_list) # Buttons btn_layout = QHBoxLayout() add_btn = QPushButton("Create Group") add_btn.clicked.connect(self.create_group) del_btn = QPushButton("Delete Group") del_btn.clicked.connect(self.delete_group) refresh_btn = QPushButton("Refresh") refresh_btn.clicked.connect(self.refresh_list) btn_layout.addWidget(add_btn) btn_layout.addWidget(del_btn) btn_layout.addWidget(refresh_btn) layout.addLayout(btn_layout) self.setWidget(container)
[docs] def refresh_list(self): self.groups_list.clear() if not self.main_window.scene: return world = self.main_window.scene.world filter_text = self.filter_edit.text().lower() # Get all unique groups from world registry all_groups = sorted(list(world.groups.keys())) for group in all_groups: if filter_text and filter_text not in group.lower(): continue count = len(world.groups[group]) self.groups_list.addItem(f"{group} ({count})")
[docs] def create_group(self): if not self.main_window.scene: return name, ok = QInputDialog.getText(self, "Create Group", "Group Name:") if ok and name: world = self.main_window.scene.world if name in world.groups: QMessageBox.warning(self, "Error", "Group already exists") return # Create empty group entry world.groups[name] = set() self.refresh_list()
[docs] def delete_group(self): if not self.main_window.scene: return items = self.groups_list.selectedItems() if not items: return # Parse name from "Name (Count)" text = items[0].text() name = text.rpartition(" (")[0] if QMessageBox.question(self, "Confirm", f"Delete group '{name}'? Entities will be removed from this group.") == QMessageBox.StandardButton.Yes: world = self.main_window.scene.world # Remove group from all entities if name in world.groups: entities = list(world.groups[name]) for entity in entities: entity.remove_group(name) # Ensure it's gone from registry if name in world.groups: del world.groups[name] self.refresh_list()
[docs] def on_group_selected(self, item): # Maybe select all entities in this group? # Or just show info pass