generated from LouisMazin/PythonApplicationTemplate
107 lines
3.4 KiB
Python
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) |