From b41c4a71e54006e51808bc9fdba8ccf342526955 Mon Sep 17 00:00:00 2001 From: Kenneth Lyons Date: Wed, 24 Jun 2020 21:35:05 -0700 Subject: [PATCH] Fix Parameter.hasDefault (#1275) When a default value is not set, hasDefault returns False. If default=None is passed, hasDefault still returns False. --- pyqtgraph/parametertree/Parameter.py | 5 ++- .../parametertree/tests/test_Parameter.py | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 pyqtgraph/parametertree/tests/test_Parameter.py diff --git a/pyqtgraph/parametertree/Parameter.py b/pyqtgraph/parametertree/Parameter.py index 9ef30477..766bd6ea 100644 --- a/pyqtgraph/parametertree/Parameter.py +++ b/pyqtgraph/parametertree/Parameter.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from ..Qt import QtGui, QtCore import os, weakref, re from ..pgcollections import OrderedDict @@ -188,13 +189,11 @@ class Parameter(QtCore.QObject): self.addChildren(self.opts.pop('children', [])) - self.opts['value'] = None if value is not None: self.setValue(value) if 'default' not in self.opts: self.opts['default'] = None - self.setDefault(self.opts['value']) ## Connect all state changed signals to the general sigStateChanged self.sigValueChanged.connect(lambda param, data: self.emitStateChanged('value', data)) @@ -420,7 +419,7 @@ class Parameter(QtCore.QObject): def hasDefault(self): """Returns True if this parameter has a default value.""" - return 'default' in self.opts + return self.opts['default'] is not None def valueIsDefault(self): """Returns True if this parameter's value is equal to the default value.""" diff --git a/pyqtgraph/parametertree/tests/test_Parameter.py b/pyqtgraph/parametertree/tests/test_Parameter.py new file mode 100644 index 00000000..a3de5493 --- /dev/null +++ b/pyqtgraph/parametertree/tests/test_Parameter.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +import pytest +from pyqtgraph.parametertree import Parameter + + +def test_parameter_hasdefault(): + opts = {'name': 'param', 'type': int, 'value': 1} + + # default unspecified + p = Parameter(**opts) + assert not p.hasDefault() + + p.setDefault(1) + assert p.hasDefault() + assert p.defaultValue() == 1 + + # default specified + p = Parameter(default=0, **opts) + assert p.hasDefault() + assert p.defaultValue() == 0 + + +@pytest.mark.parametrize('passdefault', [True, False]) +def test_parameter_hasdefault_none(passdefault): + # test that Parameter essentially ignores defualt=None, same as not passing + # a default at all + opts = {'name': 'param', 'type': int, 'value': 0} + if passdefault: + opts['default'] = None + + p = Parameter(**opts) + assert not p.hasDefault() + assert p.defaultValue() is None + + p.setDefault(None) + assert not p.hasDefault()