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
|
"""
Define a standard horizontal and vertical Enable scrollbar component that wraps
the standard Qt one.
"""
# Major library imports
from types import ListType, TupleType
# Enthought library imports
from enthought.traits.api import Any, Bool, Float, Int, Property, Trait, \
TraitError
from enthought.enable.component import Component
def valid_range(object, name, value):
"Verify that a set of range values for a scrollbar is valid"
try:
if (type(value) in (TupleType, ListType)) and (len(value) == 4):
low, high, page_size, line_size = value
if high < low:
low, high = high, low
elif high == low:
high = low + 1.0
page_size = max(min(page_size, high - low), 0.0)
line_size = max(min(line_size, page_size), 0.0)
return (float(low), float(high), float(page_size), float(line_size))
except:
raise
raise TraitError
valid_range.info = 'a (low,high,page_size,line_size) range tuple'
def valid_scroll_position(object, name, value):
"Verify that a specified scroll bar position is valid"
try:
low, high, page_size, line_size = object.range
return max(min(float(value), high - page_size), low)
except:
raise
raise TraitError
class NativeScrollBar(Component):
"An Enable scrollbar component that wraps/embeds the native Qt scrollbar"
#------------------------------------------------------------------------
# Public Traits
#------------------------------------------------------------------------
# The current position of the scroll bar. This must be within the range
# (self.low, self.high)
scroll_position = Trait( 0.0, valid_scroll_position )
# A tuple (low, high, page_size, line_size). Can be accessed using
# convenience properties (see below).
range = Trait( ( 0.0, 100.0, 10.0, 1.0 ), valid_range )
# The orientation of the scrollbar
orientation = Trait("horizontal", "vertical")
# Is y=0 at the top or bottom?
origin = Trait('bottom', 'top')
# Determines if the scroll bar should be visible and respond to events
enabled = Bool(True)
# The scroll increment associated with a single mouse wheel increment
mouse_wheel_speed = Int(3)
# Expose scroll_position, low, high, page_size as properties
low = Property
high = Property
page_size = Property
line_size = Property
#------------------------------------------------------------------------
# Private Traits
#------------------------------------------------------------------------
_control = Any
_clean = Bool(False)
_last_widget_x = Float(0)
_last_widget_y = Float(0)
_last_widget_height = Float(0)
_list_widget_width = Float(0)
#------------------------------------------------------------------------
# Property getters and setters
#------------------------------------------------------------------------
def _get_low(self):
return self.range[0]
def _set_low(self, low):
ignore, high, page_size, line_size = self.range
self._clean = False
self.range =(low, high, page_size, line_size)
def _get_high(self):
return self.range[1]
def _set_high(self, high):
low, ignore, page_size, line_size = self.range
self._clean = False
self.range =(low, high, page_size, line_size)
def _get_page_size(self):
return self.range[2]
def _set_page_size(self, page_size):
low, high, ignore, line_size = self.range
self._clean = False
self.range =(low, high, page_size, line_size)
def _get_line_size(self):
return self.range[3]
def _set_line_size(self, line_size):
low, high, page_size, ignore = self.range
self._clean = False
self.range =(low, high, page_size, line_size)
|