Source code for pydm.widgets.waveformtable
from qtpy.QtWidgets import QTableWidget, QTableWidgetItem, QApplication
from qtpy.QtGui import QCursor
from qtpy.QtCore import Slot, Property, Qt, QEvent
import numpy as np
from .base import PyDMWritableWidget
[docs]class PyDMWaveformTable(QTableWidget, PyDMWritableWidget):
"""
A QTableWidget with support for Channels and more from PyDM.
Values of the array are displayed in the selected number of columns.
The number of rows is determined by the size of the waveform.
It is possible to define the labels of each row and column.
Parameters
----------
parent : QWidget
The parent widget for the Label
init_channel : str, optional
The channel to be used by the widget.
"""
def __init__(self, parent=None, init_channel=None):
QTableWidget.__init__(self, parent)
PyDMWritableWidget.__init__(self, init_channel=init_channel)
self._columnHeaders = ["Value"]
self._rowHeaders = []
self._itemsFlags = Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled
self.waveform = None
self._valueBeingSet = False
self.setColumnCount(1)
self.cellChanged.connect(self.send_waveform)
[docs] def value_changed(self, new_waveform):
"""
Callback invoked when the Channel value is changed.
Parameters
----------
new_waveform : np.ndarray
The new waveform value from the channel.
"""
PyDMWritableWidget.value_changed(self, new_waveform)
self._valueBeingSet = True
self.waveform = new_waveform
col_count = self.columnCount()
len_wave = len(new_waveform)
row_count = len_wave // col_count + (1 if len_wave % col_count else 0)
self.setRowCount(row_count)
for ind, element in enumerate(new_waveform):
i, j = ind // col_count, ind % col_count
value_cell = QTableWidgetItem(str(element))
value_cell.setFlags(self._itemsFlags)
self.setItem(i, j, value_cell)
self.setVerticalHeaderLabels(self._rowHeaders)
self.setHorizontalHeaderLabels(self._columnHeaders)
self._valueBeingSet = False
[docs] @Slot(int, int)
def send_waveform(self, row, column):
"""Update Channel value when cell value is changed.
Parameters
----------
row : int
Row of the changed cell.
column : int
Column of the changed cell.
"""
if self._valueBeingSet:
return
item = self.item(row, column)
if item and self.subtype:
new_val = self.subtype(item.text())
ind = row * self.columnCount() + column
self.waveform[ind] = new_val
self.send_value_signal[np.ndarray].emit(self.waveform)
[docs] def check_enable_state(self):
"""
For PyDMWaveformTable, we want to make the individual cells
editable when we have write access.
"""
PyDMWritableWidget.check_enable_state(self)
self.setEnabled(True)
if self._write_access and self._connected:
self._itemsFlags = Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled
elif self._connected:
self._itemsFlags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
else:
self._itemsFlags = Qt.ItemIsSelectable
for col in range(0, self.columnCount()):
for row in range(0, self.rowCount()):
item = self.item(row, col)
if item is not None:
item.setFlags(self._itemsFlags)
[docs] def eventFilter(self, obj, event):
status = self._connected
if event.type() == QEvent.Leave:
QApplication.setOverrideCursor(QCursor(Qt.ArrowCursor))
elif event.type() == QEvent.Enter and not status:
QApplication.setOverrideCursor(QCursor(Qt.ForbiddenCursor))
return False
@Property("QStringList")
def columnHeaderLabels(self):
"""
Return the list of labels for the columns of the Table.
Returns
-------
list of strings
"""
return self._columnHeaders
@columnHeaderLabels.setter
def columnHeaderLabels(self, new_labels):
"""
Set the list of labels for the columns of the Table.
If new_labels is empty the column numbers will be used.
Parameters
----------
new_labels : list of strings
"""
if new_labels:
new_labels += (self.columnCount() - len(new_labels)) * [""]
self._columnHeaders = new_labels
self.setHorizontalHeaderLabels(self._columnHeaders)
@Property("QStringList")
def rowHeaderLabels(self):
"""
Return the list of labels for the rows of the Table.
Returns
-------
list of strings
"""
return self._rowHeaders
@rowHeaderLabels.setter
def rowHeaderLabels(self, new_labels):
"""
Set the list of labels for the rows of the Table.
If new_labels is empty the row numbers will be used.
Parameters
----------
new_labels : list of strings
"""
if new_labels:
new_labels += (self.rowCount() - len(new_labels)) * [""]
self._rowHeaders = new_labels
self.setVerticalHeaderLabels(self._rowHeaders)