Source code for spinningdiskanalyzer.frontend.pages.disk

from .disk_ui import Ui_page
from .page    import Page
from .        import page
from ..       import tasks
from ...      import parameters

from PySide6.QtWidgets import QWidget

from pathlib import Path


[docs] class Disk(page.ConfirmClose, page.NavRedoNext, Page): """Outlines the disk boundary.""" def __init__(self, parent: QWidget = None): # Load user interface design created in Qt Designer. super().__init__(parent) self.ui = Ui_page() self.ui.setupUi(self) # Make sure hiding buttons does not change layout. for button in (self.ui.redo, self.ui.next): size_policy = button.sizePolicy() size_policy.setRetainSizeWhenHidden(True) button.setSizePolicy(size_policy) # Connect signals to slots. self.ui.back.clicked.connect(self.go_back.emit) self.ui.redo.clicked.connect(self.on_redo) self.ui.next.clicked.connect(self.go_next.emit) self.ui.r.valueChanged.connect(self.navigation_update) self.ui.x.valueChanged.connect(self.navigation_update) self.ui.y.valueChanged.connect(self.navigation_update) # Initialize instance attributes. self.task = None
[docs] def parameters_load(self): """Loads parameter values from disk.""" folder = Path(self.parent().select.ui.folder_display.text()) parameters.init(folder/'analysis') section = self.ui.title.text().lower().replace(' ', '_') self.ui.r.setValue(parameters.get(section, 'r')) self.ui.x.setValue(parameters.get(section, 'x')) self.ui.y.setValue(parameters.get(section, 'y'))
[docs] def parameters_save(self): """Saves parameter values to disk.""" if self.parameters_different(): section = self.ui.title.text().lower().replace(' ', '_') parameters.set(section, 'r', self.ui.r.value()) parameters.set(section, 'x', self.ui.x.value()) parameters.set(section, 'y', self.ui.y.value()) parameters.save()
[docs] def parameters_different(self): """Returns if parameter values are different in UI than on disk.""" section = self.ui.title.text().lower().replace(' ', '_') old = ( parameters.get(section, 'r'), parameters.get(section, 'x'), parameters.get(section, 'y'), ) now = ( self.ui.r.value(), self.ui.x.value(), self.ui.y.value(), ) return (now != old)
[docs] def on_enter(self): """Called when entering the page.""" self.mark_busy() self.parameters_load() self.outline_disk()
[docs] def on_redo(self): """Called when the user pressed the redo button.""" self.mark_busy() self.status('Invalidating previous results…') self.parent().invalidate(self) self.outline_disk()
[docs] def outline_disk(self): """Triggers outlining the disk boundary.""" self.task = tasks.OutlineDisk() self.task.status_update.connect(self.status_update) self.task.status_clear.connect(self.status_clear) self.task.finished.connect(self.tile_image) folder = Path(self.parent().select.ui.folder_display.text()) x = self.ui.x.value() y = self.ui.y.value() r = self.ui.r.value() source = folder/'analysis'/'foreground.tif' target = folder/'analysis'/'disk.tif' self.task.start(source, target, x, y, r)
[docs] def tile_image(self): """Triggers tiling of the display image.""" self.task = tasks.TileImage() self.task.finished.connect(self.tasks_done) self.task.status_update.connect(self.status_update) self.task.status_clear.connect(self.status_clear) folder = Path(self.parent().select.ui.folder_display.text()) source = folder/'analysis'/'disk.tif' target = folder/'tiles'/'disk.dzi' self.task.start(source, target)
[docs] def tasks_done(self): """Finishes up when all background tasks are done.""" self.task = None folder = Path(self.parent().select.ui.folder_display.text()) tiled = folder/'tiles'/'disk.dzi' self.ui.viewer.load(tiled) self.parameters_save() self.mark_ready()
[docs] def invalidate(self): """Invalidates results from this analysis step.""" self.ui.viewer.load(None) self.flush() folder = Path(self.parent().select.ui.folder_display.text()) tasks.delete( ( folder/'analysis'/'disk.tif', folder/'tiles'/'disk.dzi', folder/'tiles'/'disk_files', ) )