1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#------------------------------------------------------------------------------
# Copyright (c) 2013-2025, Nucleic Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file LICENSE, distributed with this software.
#------------------------------------------------------------------------------
from atom.api import Int, Bool, Range, Str, Typed, ForwardTyped, set_default
from enaml.core.declarative import d_, observe
from .control import Control, ProxyControl
class ProxySpinBox(ProxyControl):
""" The abstract definition of a proxy SpinBox object.
"""
#: A reference to the SpinBox declaration.
declaration = ForwardTyped(lambda: SpinBox)
def set_minimum(self, minimum):
raise NotImplementedError
def set_maximum(self, maximum):
raise NotImplementedError
def set_value(self, value):
raise NotImplementedError
def set_prefix(self, prefix):
raise NotImplementedError
def set_suffix(self, suffix):
raise NotImplementedError
def set_special_value_text(self, text):
raise NotImplementedError
def set_single_step(self, step):
raise NotImplementedError
def set_read_only(self, read_only):
raise NotImplementedError
def set_wrapping(self, wrapping):
raise NotImplementedError
class SpinBox(Control):
""" A spin box widget which manipulates integer values.
"""
#: The minimum value for the spin box. Defaults to 0.
minimum = d_(Int(0))
#: The maximum value for the spin box. Defaults to 100.
maximum = d_(Int(100))
#: The position value of the spin box. The value will be clipped to
#: always fall between the minimum and maximum.
value = d_(Int(0))
#: An optional prefix to include in the displayed text.
prefix = d_(Str())
#: An optional suffix to include in the displayed text.
suffix = d_(Str())
#: Optional text to display when the spin box is at its minimum.
#: This allows the developer to indicate to the user a special
#: significance to the minimum value e.g. "Auto"
special_value_text = d_(Str())
#: The step size for the spin box. Defaults to 1.
single_step = d_(Range(low=1))
#: Whether or not the spin box is read-only. If True, the user
#: will not be able to edit the values in the spin box, but they
#: will still be able to copy the text to the clipboard.
read_only = d_(Bool(False))
#: Whether or not the spin box will wrap around at its extremes.
#: Defaults to False.
wrapping = d_(Bool(False))
#: A spin box expands freely in width by default.
hug_width = set_default('ignore')
#: A reference to the ProxySpinBox object.
proxy = Typed(ProxySpinBox)
#--------------------------------------------------------------------------
# Observers
#--------------------------------------------------------------------------
@observe('minimum', 'maximum', 'value', 'prefix', 'suffix',
'special_value_text', 'single_step', 'read_only', 'wrapping')
def _update_proxy(self, change):
""" An observer which sends state change to the proxy.
"""
# The superclass handler implementation is sufficient.
super(SpinBox, self)._update_proxy(change)
#--------------------------------------------------------------------------
# PostSetAttr Handlers
#--------------------------------------------------------------------------
def _post_setattr_minimum(self, old, new):
""" Post setattr the minimum value for the spin box.
If the new minimum is greater than the current value or maximum,
those values are adjusted up.
"""
if new > self.maximum:
self.maximum = new
if new > self.value:
self.value = new
def _post_setattr_maximum(self, old, new):
""" Post setattr the maximum value for the spin box.
If the new maximum is less than the current value or the minimum,
those values are adjusted down.
"""
if new < self.minimum:
self.minimum = new
if new < self.value:
self.value = new
#--------------------------------------------------------------------------
# Post Validation Handlers
#--------------------------------------------------------------------------
def _post_validate_value(self, old, new):
""" Post validate the value for the spin box.
The value is clipped to minimum and maximum bounds.
"""
return max(self.minimum, min(new, self.maximum))
|