Source code for pdsspect.set_wavelength
from qtpy import QtWidgets
import numpy as np
[docs]class SetWavelengthModel(object):
"""Model for :class:`SetWavelengthWidget`
Parameters
----------
image_set : :class:`~.pdsspect_image_set.PDSSpectImageSet`
pdsspect model
Attributes
----------
image_set : :class:`~.pdsspect_image_set.PDSSpectImageSet`
pdsspect model
"""
def __init__(self, image_set):
self._views = []
self.image_set = image_set
self._current_image_index = int(image_set.current_image_index)
def register(self, view):
if view not in self._views:
self._views.append(view)
def unregister(self, view):
if view in self._views:
self._views.remove(view)
@property
def accepted_units(self):
""":obj:`list` : List of accepted units: ``nm``, ``um``, and ``AA``"""
return self.image_set.accepted_units
@property
def current_image_index(self):
""":obj:`int` : Index of current image in menu"""
return self._current_image_index
@current_image_index.setter
def current_image_index(self, index):
self._current_image_index = index
self.display_current_wavelength()
@property
def current_image(self):
""":class:`~.pdsspect_image_set.ImageStamp` : Current image in menu"""
return self.image_set.images[self.current_image_index]
@property
def unit(self):
""":obj:`str` : :attr:`image_set` unit
Setting the :attr`unit` will set the :attr:`image_set` unit
"""
return self.image_set.unit
@unit.setter
def unit(self, new_unit):
try:
self.image_set.unit = new_unit
except ValueError:
pass
finally:
self.display_current_wavelength()
@property
def unit_index(self):
""":obj:`int` Index of :attr`unit` in :attr:`accepted_units`"""
return self.accepted_units.index(self.unit)
[docs] def display_current_wavelength(self):
"""Display current wavelength in registered views"""
for view in self._views:
view.display_current_wavelength()
[docs]class SetWavelengthController(object):
"""Controller for :class:`SetWavelengthWidget`
Parameters
----------
model : :class:`SetWavelengthModel`
Model for :class:`SetWavelengthWidget`
view : :class:`SetWavelengthWidget`
The view to control
Attributes
----------
model : :class:`SetWavelengthModel`
Model for :class:`SetWavelengthWidget`
view : :class:`SetWavelengthWidget`
The view to control
"""
def __init__(self, model, view):
self.model = model
self.view = view
[docs] def set_current_image_index(self, index):
"""Set the model's :attr:`SetWavelengthModel.current_image_index`
Parameters
----------
index : :obj:`int`
Index to change :attr:`SetWavelengthModel.current_image_index` to
"""
self.model.current_image_index = index
[docs] def change_unit(self, index):
"""Set the model's :attr:`SetWavelengthModel.unit`
Parameters
----------
index : :obj:`int`
Index of :attr:`SetWavelengthModel.accepted_units` to change the
:attr:`SetWavelengthModel.unit` to
"""
self.model.unit = self.model.accepted_units[index]
[docs] def set_image_wavelength(self, wavelength):
"""Set the model's :attr:`SetWavelengthModel.current_image` wavelength
Parameters
----------
wavelength : :obj:`float`
The model's :attr:`SetWavelengthModel.current_image` new wavelength
"""
self.model.current_image.wavelength = wavelength
self.model.display_current_wavelength()
for view in self.model.image_set._views:
view.set_roi_data()
[docs]class SetWavelengthWidget(QtWidgets.QMainWindow):
"""Widget to set images wavelength
Using a :class:`QtWidgets.QMainWindow <PySide.QtGui.QMainWindow>` for the
status bar at the bottom.
Parameters
----------
model : :class:`SetWavelengthModel`
Model for :class:`SetWavelengthWidget`
Attributes
----------
model : :class:`SetWavelengthModel`
Model for :class:`SetWavelengthWidget`
controller : :class:`SetWavelengthController`
The widgets controller
image_menu : :class:`QtWidgets.QComboBox <PySide.QtGui.QComboBox>`
Menu to choose the image to set the wavelength
wavelength_text : :class:`QtWidgets.QLineEdit <PySide.QtGui.QLineEdit>`
Text box to enter and display wavelength
units_menu : :class:`QtWidgets.QComboBox <PySide.QtGui.QComboBox>`
Menu to choose unit of wavelength
main_layout : :class:`QtWidgets.QHBoxLayout <PySide.QtGui.QHBoxLayout>`
Main layout of widget
"""
def __init__(self, model):
super(SetWavelengthWidget, self).__init__()
self.model = model
self._central_widget = QtWidgets.QWidget()
model.register(self)
self.controller = SetWavelengthController(model, self)
self.image_menu = QtWidgets.QComboBox()
for image in self.model.image_set.images:
self.image_menu.addItem(image.image_name)
self.image_menu.setCurrentIndex(self.model.current_image_index)
self.image_menu.currentIndexChanged.connect(self.select_image)
self.wavelength_text = QtWidgets.QLineEdit()
self.wavelength_text.returnPressed.connect(self.set_wavelength)
self.units_menu = QtWidgets.QComboBox()
for unit in self.model.accepted_units:
self.units_menu.addItem(unit)
self.units_menu.setCurrentIndex(self.model.unit_index)
self.units_menu.currentIndexChanged.connect(self.change_unit)
self.main_layout = QtWidgets.QHBoxLayout()
self.main_layout.addWidget(self.image_menu)
self.main_layout.addWidget(self.wavelength_text)
self.main_layout.addWidget(self.units_menu)
self._central_widget.setLayout(self.main_layout)
self.setCentralWidget(self._central_widget)
self.setWindowTitle('Set Wavelengths')
self.statusBar()
self.display_current_wavelength()
[docs] def select_image(self, index):
"""Select current image
Parameters
----------
index : :obj:`int`
Index to change :attr:`SetWavelengthModel.current_image_index` to
"""
self.controller.set_current_image_index(index)
[docs] def display_current_wavelength(self):
"""Display the :attr:`SetWavelengthModel.current_image` wavelength in
:attr:`wavelength_text`
"""
wavelength = self.model.current_image.wavelength
if np.isnan(wavelength):
self.wavelength_text.setText('')
else:
self.wavelength_text.setText(str(wavelength))
[docs] def set_wavelength(self):
"""Set the :attr:`SetWavelengthModel.current_image` wavelength to value
in :attr:`wavelength_text`
"""
try:
wavelength = self.wavelength_text.text()
if wavelength == '':
wavelength = float('nan')
else:
wavelength = float(wavelength)
self.controller.set_image_wavelength(wavelength)
self.show_status_bar_wavelength_set()
except ValueError:
self.display_current_wavelength()
[docs] def change_unit(self, index):
"""Change :attr:`SetWavelengthModel.unit` to unit in :attr:`units_menu`
Parameters
----------
index : :obj:`int`
Index of :attr:`SetWavelengthModel.accepted_units` to change the
:attr:`SetWavelengthModel.unit` to
"""
self.controller.change_unit(index)
self.show_status_bar_wavelength_set()
[docs] def show_status_bar_wavelength_set(self):
"""Alert user wavelength is set"""
self.statusBar().showMessage('Wavelength Set', 1000)