from PyQt6.QtWidgets import QFrame, QLabel from PyQt6.QtCore import Qt class DragDropFrame(QFrame): def __init__(self, parent=None): super().__init__(parent) self.parent_window = parent self.setAcceptDrops(True) self.is_dragging = False self.drag_indicator = self.getDragIndicator() self.drag_text = self.getDragText() def dragEnterEvent(self, event): if event.mimeData().hasUrls(): self.is_dragging = True self.drag_text.hide() self.drag_indicator.show() event.acceptProposedAction() else: event.ignore() def dragLeaveEvent(self, event): self.is_dragging = False self.drag_indicator.hide() self.drag_text.show() super().dragLeaveEvent(event) def dropEvent(self, event): self.is_dragging = False self.drag_indicator.hide() self.drag_text.show() urls = event.mimeData().urls() if urls and self.parent_window: file_path = urls[0].toLocalFile() self.parent_window.set_dicom_from_files(file_path) def getDragIndicator(self) -> QLabel: drag_indicator = QLabel(self) drag_indicator.setText("+") drag_indicator.setObjectName("drag_indicator") drag_indicator.setAlignment(Qt.AlignmentFlag.AlignCenter) drag_indicator.show() return drag_indicator def getDragText(self) -> QLabel: drag_text = QLabel(self) drag_text.setObjectName("drag_area") drag_text.setAlignment(Qt.AlignmentFlag.AlignCenter) drag_text.show() return drag_text def setDragText(self, text: str): self.drag_text.setText(text) def resizeEvent(self, event): super().resizeEvent(event) # Ensure components fill the entire frame self.drag_indicator.resize(self.size()) self.drag_text.resize(self.size())