from . layer_base import LayerBase
from .. widgets import TrippleToggleEye, ToggleEye, FractionSelectionBar
from .. pixel_path import *
from . layer_controller import *
import pyqtgraph as pg
import os
from pyqtgraph.Qt import QtCore, QtGui
import numpy
###############################################################################
from builtins import range
#from past.utils import old_div
import warnings
from PyQt5.QtCore import pyqtSignal, Qt, QEvent, QRect, QSize, QTimer, QPoint, QItemSelectionModel
from PyQt5.QtGui import QPainter, QFontMetrics, QFont, QPalette, QMouseEvent, QPixmap
from PyQt5.QtWidgets import QStyledItemDelegate, QWidget, QListView, QStyle, \
QLabel, QGridLayout, QSpinBox, QApplication
[docs]class MultiChannelImageLayer(LayerBase):
def __init__(self, name, data=None, autoLevels=True, levels=None, autoHistogramRange=False, cmap=None):
super().__init__(name=name)
self.current_channel = 0
self.as_rgb = False
self.m_data = data
self.m_autoLevels = autoLevels
self.m_levels = levels
self.m_autoHistogramRange = autoHistogramRange
self.m_image_item = pg.ImageItem()
if self.m_data is not None:
self.m_image_item.setImage(self.m_data[...,self.current_channel], autoLevels=self.m_autoLevels,
levels=self.m_levels)
self.m_ctrl_widget = MultiChannelImageLayer.CtrlWidget(name=self.name)
self.viewer = None
self.cmap = cmap
if self.cmap is not None:
self.m_ctrl_widget.gradientWidget.loadPreset(self.cmap)
# setup ctrl widget
w = self.m_ctrl_widget
if self.m_data is not None:
w.channelSelector.setRange(0, self.m_data.shape[2]-1)
w.toggleEye.setActive(True)
def toogleEyeChanged(state):
if self.viewer.m_exlusive_layer is not None:
self.viewer.m_exlusive_layer.setVisible(True)
self.viewer.m_exlusive_layer = None
if state == 2:
self.viewer.showAndHideOthers(self.name)
else:
self.setVisible(bool(state))
w.toggleEye.stateChanged.connect(toogleEyeChanged)
def channelChanged(channel):
if not self.as_rgb:
self.current_channel = channel
if self.m_data is not None:
self.m_image_item.setImage(self.m_data[...,self.current_channel], autoLevels=self.m_autoLevels,
levels=self.m_levels, autoHistogramRange=self.m_autoHistogramRange)
w.channelSelector.valueChanged.connect(channelChanged)
def asRgbChanged(as_rgb):
self.as_rgb = bool(as_rgb)
self.m_ctrl_widget.channelSelector.setEnabled(not self.as_rgb)
self.m_ctrl_widget.gradientWidget.setEnabled(not self.as_rgb)
if self.as_rgb:
self.m_image_item.setLookupTable(None)
self.m_image_item.setImage(self.m_data, autoLevels=self.m_autoLevels,
levels=self.m_levels, autoHistogramRange=self.m_autoHistogramRange)
else:
lut = w.gradientWidget.getLookupTable(512)
self.m_image_item.setLookupTable(lut)
self.m_image_item.setImage(self.m_data[...,self.current_channel], autoLevels=self.m_autoLevels,
levels=self.m_levels, autoHistogramRange=self.m_autoHistogramRange)
w.asRgb.stateChanged.connect(asRgbChanged)
w.bar.fractionChanged.connect(self.setOpacity)
def update():
lut = w.gradientWidget.getLookupTable(512)
self.m_image_item.setLookupTable(lut)
w.gradientWidget.sigGradientChanged.connect(update)
w.layer = self
[docs] def get_image_item(self):
return self.m_image_item
[docs] def setOpacity(self, opacity):
self.m_ctrl_widget.setFraction(opacity)
self.m_image_item.setOpacity(opacity)
[docs] def setVisible(self, visible):
self.m_ctrl_widget.toggleEye.setState(visible)
self.m_image_item.setVisible(visible)
[docs] def setZValue(self, z):
self.m_image_item.setZValue(z)
[docs] def updateData(self, image):
self.m_data = image
self.m_ctrl_widget.channelSelector.setRange(0, self.m_data.shape[2]-1)
self.m_image_item.updateImage(image[...,self.current_channel])
[docs] def setData(self, image):
self.m_data = image
if image is None:
self.m_image_item.clear()
# self.m_image_item.setImage(None, autoLevels=self.m_autoLevels,
# levels=self.m_levels, autoHistogramRange=self.m_autoHistogramRange)
else:
self.m_ctrl_widget.channelSelector.setRange(0, self.m_data.shape[2]-1)
if self.as_rgb:
self.m_image_item.setImage(image, autoLevels=self.m_autoLevels,
levels=self.m_levels, autoHistogramRange=self.m_autoHistogramRange)
else:
self.m_image_item.setImage(image[...,self.current_channel], autoLevels=self.m_autoLevels,
levels=self.m_levels, autoHistogramRange=self.m_autoHistogramRange)