from .threshold_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 Threshold(page.ConfirmClose, page.NavRedoNext, Page):
"""Performs the local thresholding."""
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.method.currentIndexChanged.connect(self.navigation_update)
self.ui.radius.valueChanged.connect(self.navigation_update)
self.ui.contrast.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.method.setCurrentText(parameters.get(section, 'method'))
self.ui.radius.setValue(parameters.get(section, 'radius'))
self.ui.contrast.setValue(parameters.get(section, 'contrast'))
[docs]
def parameters_save(self):
"""Saves parameter values to disk."""
if self.parameters_different():
section = self.ui.title.text().lower().replace(' ', '_')
parameters.set(section, 'method', self.ui.method.currentText())
parameters.set(section, 'radius', self.ui.radius.value())
parameters.set(section, 'contrast', self.ui.contrast.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, 'method'),
parameters.get(section, 'radius'),
parameters.get(section, 'contrast'),
)
now = (
self.ui.method.currentText(),
self.ui.radius.value(),
self.ui.contrast.value(),
)
return (now != old)
[docs]
def on_enter(self):
"""Called when entering the page."""
self.mark_busy()
self.parameters_load()
self.perform_thresholding()
[docs]
def on_redo(self):
"""Called when the re-do button is clicked."""
self.mark_busy()
self.status('Invalidating previous results…')
self.parent().invalidate(self)
self.perform_thresholding()
[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'/'thresholded.tif'
target = folder/'tiles'/'thresholded.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'/'thresholded.dzi'
self.ui.viewer.load(tiled)
self.status_clear.emit()
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'/'thresholded.tif',
folder/'tiles'/'thresholded.dzi',
folder/'tiles'/'thresholded_files',
) )