A table parameter tree item
Subclass of WidgetParameterItem, used to edit a numpy record array
This commit is contained in:
parent
88c55c9f98
commit
12361a9a1b
131
pyqtgraph/parametertree/TableParameter.py
Normal file
131
pyqtgraph/parametertree/TableParameter.py
Normal file
@ -0,0 +1,131 @@
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
|
||||
import pyqtgraph.parametertree.parameterTypes as pTypes
|
||||
from pyqtgraph.parametertree import Parameter, ParameterTree, ParameterItem, registerParameterType
|
||||
|
||||
import re, sys, os
|
||||
import numpy
|
||||
|
||||
#==================================================================================================
|
||||
class TableParameterItem(pTypes.WidgetParameterItem):
|
||||
"""
|
||||
A table widget used to edit a numpy record array.
|
||||
|
||||
================= ==================================================================
|
||||
**Arguments:**
|
||||
value (numpy RecArray) initial value of the recArray. It must be provided
|
||||
to define the size and structure of the table.
|
||||
others any other arguments are passed to *Parameter*
|
||||
================= ==================================================================
|
||||
"""
|
||||
def __init__(self, param, depth):
|
||||
pTypes.WidgetParameterItem.__init__(self, param, depth)
|
||||
self.hideWidget = False
|
||||
|
||||
def makeWidget(self):
|
||||
opts = self.param.opts
|
||||
value = opts.get("value", None)
|
||||
if value is None:
|
||||
raise Exception("Initial value must be provided for TableParameterItem")
|
||||
|
||||
self.dtype = value.dtype
|
||||
nr = value.size
|
||||
nc = len(self.dtype.names)
|
||||
w = QtGui.QTableWidget(nr, nc)
|
||||
#w = pg.TableWidget(nr, nc)
|
||||
|
||||
hheader = QtGui.QHeaderView(QtCore.Qt.Orientation.Horizontal)
|
||||
hheader.setResizeMode(QtGui.QHeaderView.ResizeToContents)
|
||||
w.setHorizontalHeader(hheader)
|
||||
w.setHorizontalHeaderLabels(value.dtype.names)
|
||||
|
||||
w.sigChanged = w.cellChanged
|
||||
w.value = self.value
|
||||
w.setValue = self.setValue
|
||||
|
||||
self.widget = w
|
||||
return w
|
||||
|
||||
def value(self):
|
||||
w = self.widget
|
||||
|
||||
nr = w.rowCount()
|
||||
arr = numpy.zeros((nr,), dtype=self.dtype)
|
||||
|
||||
try:
|
||||
for ir in xrange(nr):
|
||||
for ic, n in enumerate(self.dtype.names):
|
||||
arr[n][ir] = w.item(ir, ic).text()
|
||||
except:
|
||||
arr = self.param.opts.get("value")
|
||||
|
||||
return arr
|
||||
|
||||
def setValue(self, arr):
|
||||
nr = arr.size
|
||||
w = self.widget
|
||||
|
||||
for ir in xrange(nr):
|
||||
for ic, n in enumerate(self.dtype.names):
|
||||
item = QtGui.QTableWidgetItem(str(arr[n][ir]))
|
||||
w.setItem(ir, ic, item)
|
||||
|
||||
def valueChanged(self, param, val, force=False):
|
||||
## called when the parameter's value has changed
|
||||
ParameterItem.valueChanged(self, param, val)
|
||||
self.widget.sigChanged.disconnect(self.widgetValueChanged)
|
||||
try:
|
||||
if force or numpy.any(val != self.widget.value()):
|
||||
self.widget.setValue(val)
|
||||
self.updateDisplayLabel(val) ## always make sure label is updated, even if values match!
|
||||
finally:
|
||||
self.widget.sigChanged.connect(self.widgetValueChanged)
|
||||
self.updateDefaultBtn()
|
||||
|
||||
#==================================================================================================
|
||||
class TableParameter(Parameter):
|
||||
itemClass = TableParameterItem
|
||||
|
||||
def __init__(self, **opts):
|
||||
Parameter.__init__(self, **opts)
|
||||
|
||||
def setValue(self, value, blockSignal=None):
|
||||
"""
|
||||
Set the value of this Parameter; return the actual value that was set.
|
||||
(this may be different from the value that was requested)
|
||||
"""
|
||||
try:
|
||||
if blockSignal is not None:
|
||||
self.sigValueChanged.disconnect(blockSignal)
|
||||
if numpy.all(self.opts['value'] == value):
|
||||
return value
|
||||
self.opts['value'] = value
|
||||
self.sigValueChanged.emit(self, value)
|
||||
finally:
|
||||
if blockSignal is not None:
|
||||
self.sigValueChanged.connect(blockSignal)
|
||||
|
||||
return value
|
||||
|
||||
def valueIsDefault(self):
|
||||
"""Returns True if this parameter's value is equal to the default value."""
|
||||
return numpy.all(self.value() == self.defaultValue())
|
||||
|
||||
registerParameterType('table', TableParameter, override=True)
|
||||
|
||||
# #==================================================================================================
|
||||
# # Replace original getValues of class Parameter. this new function returns more
|
||||
# # concise tree of values
|
||||
# from pyqtgraph.pgcollections import OrderedDict
|
||||
# def getValues(self):
|
||||
# """Return a tree of all values that are children of this parameter"""
|
||||
# vals = OrderedDict()
|
||||
# for ch in self:
|
||||
# if ch.type() == "group":
|
||||
# vals[ch.name()] = ch.getValues()
|
||||
# else:
|
||||
# vals[ch.name()] = ch.value()
|
||||
# return vals
|
||||
#
|
||||
# Parameter.getValues = getValues
|
Loading…
Reference in New Issue
Block a user