Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pynxc/waxy/styles.py~
blob: ed39f7754ba73fa6ee0f3808cc1a79bafde89163 (plain)
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