Source code for spinningdiskanalyzer.frontend.pages.select
from .select_ui import Ui_page
from .page import Page
from ...imaging import sort_into_grid
from ... import parameters
from PySide6.QtWidgets import QFileDialog
from PySide6.QtWidgets import QMessageBox
from PySide6.QtCore import Qt
from pathlib import Path
[docs]
class Select(Page):
"""The first page of the wizard to select the image folder."""
def __init__(self, parent=None):
# Load user interface design created in Qt Designer.
super().__init__(parent)
self.ui = Ui_page()
self.ui.setupUi(self)
self.setFocusPolicy(Qt.ClickFocus)
self.ui.next.setVisible(False)
# Make sure hiding buttons does not change layout.
button = self.ui.next
size_policy = button.sizePolicy()
size_policy.setRetainSizeWhenHidden(True)
button.setSizePolicy(size_policy)
# Connect signals to slots.
self.ui.folder_select.clicked.connect(self.select_folder)
self.ui.folder_display.editingFinished.connect(self.folder_edited)
self.ui.next.clicked.connect(self.go_next.emit)
# Accept items via drag and drop.
self.setAcceptDrops(True)
[docs]
def dragEnterEvent(self, event):
"""Called when an item is dragged over the widget."""
if event.mimeData().hasUrls():
urls = event.mimeData().urls()
if len(urls) == 1:
event.accept()
[docs]
def dropEvent(self, event):
"""Called when the dragged item is dropped onto the widget."""
event.setDropAction(Qt.CopyAction)
event.accept()
item = Path(str(event.mimeData().urls()[0].toLocalFile()))
if item.is_file():
folder = item.parent
if self.validate_folder(folder, silent=True):
self.accept_folder(folder)
return
if not item.is_dir():
return
folder = item
if self.validate_folder(folder, silent=True):
self.accept_folder(folder)
return
if folder.name in ('analysis', 'tiles'):
if self.validate_folder(folder.parent, silent=False):
self.accept_folder(folder.parent)
return
self.validate_folder(folder)
[docs]
def select_folder(self):
"""Called when the select-folder button was pressed."""
folder = Path(self.ui.folder_display.text())
if not folder:
folder = Path('.')
folder = folder.resolve()
dialog = QFileDialog(self, directory=str(folder))
dialog.setFileMode(QFileDialog.Directory)
dialog.setOption(QFileDialog.ShowDirsOnly)
if not dialog.exec():
return
folder = Path(dialog.selectedFiles()[0])
if not self.validate_folder(folder):
return
self.accept_folder(folder)
[docs]
def folder_edited(self):
"""Called when the folder path was edited manually."""
self.ui.next.setVisible(False)
folder = Path(self.ui.folder_display.text())
if not self.validate_folder(folder):
return
self.accept_folder(folder)
[docs]
def validate_folder(self, folder: Path, silent=False):
"""Checks if the folder contains input images as expected."""
try:
sort_into_grid(folder, suffix='.png')
except Exception as error:
if not silent:
QMessageBox.critical(self, 'Invalid input folder', str(error))
return False
return True
[docs]
def accept_folder(self, folder: Path):
"""Updates the user interface after the folder was deemed valid."""
if folder != Path(self.ui.folder_display.text()):
self.ui.folder_display.blockSignals(True)
self.ui.folder_display.setText(str(folder))
self.setFocus()
self.ui.folder_display.blockSignals(False)
analysis = folder/'analysis'
analysis.mkdir(exist_ok=True)
parameters.init(analysis)
self.ui.next.setVisible(True)