HoDA_Radio/app/ui/widgets/subfolder_widget.py
2025-09-26 17:51:43 +02:00

107 lines
3.4 KiB
Python

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)