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 on_enter(self): """Called when entering the page.""" self.ui.next.setVisible(False)
[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)