Allow data filter entries to be updated after they are created

This commit is contained in:
Luke Campagnola 2018-05-04 14:17:14 -07:00
parent 3ffd7dbb97
commit 9460b746fa

View File

@ -6,6 +6,7 @@ from .. import functions as fn
__all__ = ['DataFilterWidget'] __all__ = ['DataFilterWidget']
class DataFilterWidget(ptree.ParameterTree): class DataFilterWidget(ptree.ParameterTree):
""" """
This class allows the user to filter multi-column data sets by specifying This class allows the user to filter multi-column data sets by specifying
@ -81,6 +82,12 @@ class DataFilterParameter(ptree.types.GroupParameter):
names = self.fieldNames() names = self.fieldNames()
self.setAddList(names) self.setAddList(names)
# update any existing filters
for ch in self.children():
name = ch.fieldName
if name in fields:
ch.updateFilter(fields[name])
def filterData(self, data): def filterData(self, data):
if len(data) == 0: if len(data) == 0:
return data return data
@ -135,24 +142,16 @@ class RangeFilterItem(ptree.types.SimpleParameter):
def describe(self): def describe(self):
return "%s < %s < %s" % (fn.siFormat(self['Min'], suffix=self.units), self.fieldName, fn.siFormat(self['Max'], suffix=self.units)) return "%s < %s < %s" % (fn.siFormat(self['Min'], suffix=self.units), self.fieldName, fn.siFormat(self['Max'], suffix=self.units))
def updateFilter(self, opts):
pass
class EnumFilterItem(ptree.types.SimpleParameter): class EnumFilterItem(ptree.types.SimpleParameter):
def __init__(self, name, opts): def __init__(self, name, opts):
self.fieldName = name self.fieldName = name
vals = opts.get('values', [])
childs = []
if isinstance(vals, list):
vals = OrderedDict([(v,str(v)) for v in vals])
for val,vname in vals.items():
ch = ptree.Parameter.create(name=vname, type='bool', value=True)
ch.maskValue = val
childs.append(ch)
ch = ptree.Parameter.create(name='(other)', type='bool', value=True)
ch.maskValue = '__other__'
childs.append(ch)
ptree.types.SimpleParameter.__init__(self, ptree.types.SimpleParameter.__init__(self,
name=name, autoIncrementName=True, type='bool', value=True, removable=True, renamable=True, name=name, autoIncrementName=True, type='bool', value=True, removable=True, renamable=True)
children=childs) self.setEnumVals(opts)
def generateMask(self, data, startMask): def generateMask(self, data, startMask):
vals = data[self.fieldName][startMask] vals = data[self.fieldName][startMask]
@ -173,3 +172,23 @@ class EnumFilterItem(ptree.types.SimpleParameter):
def describe(self): def describe(self):
vals = [ch.name() for ch in self if ch.value() is True] vals = [ch.name() for ch in self if ch.value() is True]
return "%s: %s" % (self.fieldName, ', '.join(vals)) return "%s: %s" % (self.fieldName, ', '.join(vals))
def updateFilter(self, opts):
self.setEnumVals(opts)
def setEnumVals(self, opts):
vals = opts.get('values', [])
prevState = {}
for ch in self.children():
prevState[ch.name()] = ch.value()
self.removeChild(ch)
if isinstance(vals, list):
vals = OrderedDict([(v,str(v)) for v in vals])
for val,vname in vals.items():
ch = ptree.Parameter.create(name=vname, type='bool', value=prevState.get(vname, True))
ch.maskValue = val
self.addChild(ch)
ch = ptree.Parameter.create(name='(other)', type='bool', value=prevState.get('(other)', True))
ch.maskValue = '__other__'
self.addChild(ch)