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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
# styles.py
import wx
NORMAL = 0
EXCLUDE = 1
DICT = 2
DICTSTART = 3
REVERSE = 32
def styledict(name, dict, kwargs, default=0):
flags = 0
if kwargs.has_key(name):
value = kwargs[name]
try:
value = value.lower()
except AttributeError:
pass
flags |= dict.get(value, default)
del kwargs[name]
return flags
def styledictstart(name, dict, kwargs, default=0):
""" Like styledict, but matches the first letter(s) rather than the
complete value. For example, if "lower" is the only key in the dict
starting with "l", then by passing the value "l" we match "lower".
Used e.g. in _button_align.
"""
flags = 0
if kwargs.has_key(name):
value = kwargs[name].lower()
# note that we traverse the dict pair by pair, so ambiguous matches
# *are* possible
for key, flag in dict.items():
if key.startswith(value):
flags |= flag
break
else:
flags |= default
del kwargs[name]
return flags
def stylebool(name, flag, kwargs, reverse=0):
""" If <name> is in kwargs and is true, then return <flag>.
If <reverse> is set, then the condition needs to be false in order
for the flag to be returned.
(E.g. stylebool('lines', wx.BLAH_NOLINES, kwargs, reverse=1)
will return wx.BLAH_NOLINES if lines==0, not if lines==1.)
"""
flags = 0
if kwargs.has_key(name):
value = kwargs[name]
if reverse:
value = not value
if value:
flags |= flag
del kwargs[name]
return flags
def styleboolexclude(name, flag, kwargs, reverse=0):
flags = 0
if kwargs.has_key(name):
value = kwargs[name]
if reverse:
value = not value
if value:
flags |= flag
del kwargs[name]
return flags
def stylebooleither(name, flagtrue, flagfalse, kwargs):
flags = 0
if kwargs.has_key(name):
value = kwargs[name]
if value:
flags |= flagtrue
else:
flags |= flagfalse
del kwargs[name]
return flags
# not sure if this can be used...
def stylefunc(name, func, kwargs):
if kwargs.has_key(name):
value = kwargs[name]
func(value)
del kwargs[value]
return 0
#
#
#
def dostyle(styledict, kwargs):
""" Set styles for a given control, using a "style dict". Return the
eventual flag value. Mostly for internal use. """
flags = 0
for k, (style, type) in styledict.items():
#style, type = styledict[k]
# First check for reversing
reverse = 0
if (type & REVERSE) == REVERSE:
reverse = 1
# Get everything but the `reverse` bits
type = type & (reverse - 1)
# Now see what we're dealing with
if type == NORMAL:
flags |= stylebool(k, style, kwargs, reverse=reverse)
elif type == DICT:
flags |= styledict(k, style, kwargs)
elif type == DICTSTART:
flags |= styledictstart(k, style, kwargs)
elif type == EXCLUDE:
flags &= ~styleboolexclude(k, style, kwargs, reverse=reverse)
return flags
#
# the following functions do not handle flags
def properties(obj, kwargs):
""" Called by constructors to set properties from a dict. Must be called
*after* the parent's constructor (unlike most of the other styles
functions). """
if kwargs.has_key('properties'):
d = kwargs['properties']
for key, value in d.items():
setattr(obj, key, value) # attempt to set property
del kwargs['properties']
# attempt to set the remaining attributes as properties (this will raise
# an error if an invalid property name is specified).
obj.SetProperties(**kwargs)
# XXX could be a method in WaxObject... if it doesn't already exist?
#
# window styles
_window_border = {
"simple": wx.SIMPLE_BORDER,
"double": wx.DOUBLE_BORDER,
"sunken": wx.SUNKEN_BORDER,
"raised": wx.RAISED_BORDER,
"static": wx.STATIC_BORDER,
"no": wx.NO_BORDER,
"none": wx.NO_BORDER,
}
def window(kwargs):
""" Styles applicable to any wx.Window descendant. """
flags = 0
flags |= styledict('border', _window_border, kwargs)
flags |= stylebool('transparent', wx.TRANSPARENT_WINDOW, kwargs)
flags |= stylebool('tab_traversal', wx.TAB_TRAVERSAL, kwargs)
flags |= stylebool('wants_chars', wx.WANTS_CHARS, kwargs)
return flags
|