from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QScrollArea, QFrame, QHBoxLayout, QLabel) from PyQt6.QtCore import pyqtSignal, Qt class SelectableWidgetItem(QFrame): clicked = pyqtSignal(object) def __init__(self, dicom=None, parent=None): super().__init__(parent) self.selected = False self.dicom = dicom self.setup_ui(dicom.get_name(), dicom.get_icon()) def setup_ui(self, label_text, icon=None): self.setFrameStyle(QFrame.Shape.Box) self.setLineWidth(1) layout = QHBoxLayout(self) if icon: try: icon_label = QLabel() icon_label.setPixmap(icon.pixmap(32, 32)) layout.addWidget(icon_label) except Exception: # Skip icon if there's an error pass if label_text: label = QLabel(label_text) layout.addWidget(label) def mousePressEvent(self, event): if event.button() == Qt.MouseButton.LeftButton: self.clicked.emit(self) super().mousePressEvent(event) def set_selected(self, selected): self.selected = selected class SubfolderWidget(QWidget): widgetSelected = pyqtSignal(object) def __init__(self, parent=None, dicoms=None): super().__init__(parent) self.parent = parent self.widget_items = [] self.selected_item = None self.setup_ui() if dicoms: self.create_and_add_widgets(dicoms) def setup_ui(self): layout = QVBoxLayout(self) self.scroll_area = QScrollArea() self.scroll_area.setWidgetResizable(True) self.content_widget = QWidget() self.content_layout = QVBoxLayout(self.content_widget) self.content_layout.setAlignment(Qt.AlignmentFlag.AlignTop) self.scroll_area.setWidget(self.content_widget) layout.addWidget(self.scroll_area) def add_widget(self, dicom): """Add a widget to the list""" item = SelectableWidgetItem(dicom, self) item.clicked.connect(self.on_item_selected) self.widget_items.append(item) self.content_layout.addWidget(item) def on_item_selected(self, item): """Handle item selection""" if self.selected_item: self.selected_item.set_selected(False) self.selected_item = None self.selected_item = item item.set_selected(True) self.widgetSelected.emit(item.dicom) def get_selected_widget(self): """Get the currently selected widget""" if self.selected_item: return self.selected_item elif self.widget_items: self.selected_item = self.widget_items[0] return self.selected_item return None def clear_widgets(self): """Remove all widgets from the list""" for item in self.widget_items: self.content_layout.removeWidget(item) item.deleteLater() self.widget_items.clear() self.selected_item = None def create_and_add_widgets(self, dicoms): for dicom in dicoms: widget = SelectableWidgetItem(dicom, self) widget.clicked.connect(self.on_item_selected) self.widget_items.append(widget) self.content_layout.addWidget(widget)