8d3e6cbd22
* Allows values to be numpy arrays * Bugfix: Slider now works when limits didn't change during `optsChanged` * Improved testing + layout of param tree example * Also fix numpy-like values in list `setValue` * use proper hex formatting for value * Fix code warnings * Avoids use of configfile in parametertree * Avoid shadowing variable names * Add explanatory comment to `makeAllParamTypes` * Allow string options to be 'unset' in file, etc. parameters example * Bugfix: unintunitive option unsetting for file window title * don't use lambda in signal connect * Remove unused import
94 lines
3.2 KiB
Python
94 lines
3.2 KiB
Python
from pyqtgraph.parametertree import Parameter
|
|
from pyqtgraph.parametertree.Parameter import PARAM_TYPES
|
|
from pyqtgraph.parametertree.parameterTypes import GroupParameter
|
|
from ._paramtreecfg import cfg
|
|
|
|
_encounteredTypes = {'group'}
|
|
|
|
def makeChild(chType, cfgDict):
|
|
_encounteredTypes.add(chType)
|
|
param = Parameter.create(name='widget', type=chType)
|
|
param.setDefault(param.value())
|
|
|
|
def setOpt(_param, _val):
|
|
# Treat blank strings as "None" to allow 'unsetting' that option
|
|
if isinstance(_val, str) and _val == '':
|
|
_val = None
|
|
param.setOpts(**{_param.name(): _val})
|
|
|
|
optsChildren = []
|
|
metaChildren = []
|
|
for optName, optVals in cfgDict.items():
|
|
child = Parameter.create(name=optName, **optVals)
|
|
if ' ' in optName:
|
|
metaChildren.append(child)
|
|
else:
|
|
optsChildren.append(child)
|
|
child.sigValueChanged.connect(setOpt)
|
|
# Poplate initial options
|
|
for p in optsChildren:
|
|
setOpt(p, p.value())
|
|
|
|
grp = Parameter.create(name=f'Sample {chType.title()}', type='group', children=metaChildren + [param] + optsChildren)
|
|
grp.setOpts(expanded=False)
|
|
return grp
|
|
|
|
def makeMetaChild(name, cfgDict):
|
|
children = []
|
|
for chName, chOpts in cfgDict.items():
|
|
if not isinstance(chOpts, dict):
|
|
ch = Parameter.create(name=chName, type=chName, value=chOpts)
|
|
else:
|
|
ch = Parameter.create(name=chName, **chOpts)
|
|
_encounteredTypes.add(ch.type())
|
|
children.append(ch)
|
|
param = Parameter.create(name=name, type='group', children=children)
|
|
param.setOpts(expanded=False)
|
|
return param
|
|
|
|
def makeAllParamTypes():
|
|
children = []
|
|
for name, paramCfg in cfg.items():
|
|
if ' ' in name:
|
|
children.append(makeMetaChild(name, paramCfg))
|
|
else:
|
|
children.append(makeChild(name, paramCfg))
|
|
|
|
params = Parameter.create(name='Example Parameters', type='group', children=children)
|
|
|
|
# Slider needs minor tweak
|
|
sliderGrp = params.child('Sample Slider')
|
|
slider = sliderGrp.child('widget')
|
|
slider.setOpts(limits=[0, 100])
|
|
|
|
# Also minor tweak to meta opts
|
|
def setOpt(_param, _val):
|
|
infoChild.setOpts(**{_param.name(): _val})
|
|
meta = params.child('Applies to All Types')
|
|
infoChild = meta.child('Extra Information')
|
|
for child in meta.children()[1:]:
|
|
child.sigValueChanged.connect(setOpt)
|
|
|
|
def onChange(_param, _val):
|
|
if _val == 'Use span':
|
|
span = slider.opts.pop('span', None)
|
|
slider.setOpts(span=span)
|
|
else:
|
|
limits = slider.opts.pop('limits', None)
|
|
slider.setOpts(limits=limits)
|
|
sliderGrp.child('How to Set').sigValueChanged.connect(onChange)
|
|
|
|
def activate(action):
|
|
for ch in params:
|
|
if isinstance(ch, GroupParameter):
|
|
ch.setOpts(expanded=action.name() == 'Expand All')
|
|
|
|
for name in 'Collapse', 'Expand':
|
|
btn = Parameter.create(name=f'{name} All', type='action')
|
|
btn.sigActivated.connect(activate)
|
|
params.insertChild(0, btn)
|
|
missing = set(PARAM_TYPES).difference(_encounteredTypes)
|
|
if missing:
|
|
raise RuntimeError(f'{missing} parameters are not represented')
|
|
return params
|