Welcome, guest | Sign In | My Account | Store | Cart

Small changes to the Label classes in pyglet and in cocos2d, so the label (in cocos2d or pyglet) accepts pyglet's attributed text as well as plain text, and changing style of part of the document is also possible after it is created.

Python, 82 lines
 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
class PygletRichLabel(pyglet.text.DocumentLabel):
    '''Rich text label.
    '''
    def __init__(self, text='', 
                 font_name=None, font_size=None, bold=False, italic=False,
                 color=None,
                 x=0, y=0, width=None, height=None, 
                 anchor_x='left', anchor_y='baseline',
                 halign='left',
                 multiline=False, dpi=None, batch=None, group=None):
        '''Create a rich text label.

        :Parameters:
            `text` : str
                Pyglet attributed (rich) text to display.
            `font_name` : str or list
                Font family name(s).  If more than one name is given, the
                first matching name is used.
            `font_size` : float
                Font size, in points.
            `bold` : bool
                Bold font style.
            `italic` : bool
                Italic font style.
            `color` : (int, int, int, int) or None
                Font colour, as RGBA components in range [0, 255].
                None to use font colors defined by text attributes.
            `x` : int
                X coordinate of the label.
            `y` : int
                Y coordinate of the label.
            `width` : int
                Width of the label in pixels, or None
            `height` : int
                Height of the label in pixels, or None
            `anchor_x` : str
                Anchor point of the X coordinate: one of ``"left"``,
                ``"center"`` or ``"right"``.
            `anchor_y` : str
                Anchor point of the Y coordinate: one of ``"bottom"``,
                ``"baseline"``, ``"center"`` or ``"top"``.
            `halign` : str
                Horizontal alignment of text on a line, only applies if
                a width is supplied. One of ``"left"``, ``"center"``
                or ``"right"``.
            `multiline` : bool
                If True, the label will be word-wrapped and accept newline
                characters.  You must also set the width of the label.
            `dpi` : float
                Resolution of the fonts in this layout.  Defaults to 96.
            `batch` : `Batch`
                Optional graphics batch to add the label to.
            `group` : `Group`
                Optional graphics group to use.

        '''

        text = '{color (255, 255, 255, 255)}' + text
        document = pyglet.text.decode_attributed(text)
        super(PygletRichLabel, self).__init__(document, x, y, width, height, 
                                    anchor_x, anchor_y,
                                    multiline, dpi, batch, group)
        style = dict(halign=halign)

        if font_name:
            style['font_name'] = font_name
        if font_size:
            style['font_size'] = font_size
        if bold:
            style['bold'] = bold
        if italic:
            style['italic'] = italic
        if color:
            style['color'] = color
             
        self.document.set_style(0, len(self.document.text), style)

class RichLabel(cocos.text.TextElement):
    '''CocosNode RichLabel element. It is a wrapper of a custom Pyglet Rich Label 
    using rich text attributes with the benefits of being of a CocosNode
    '''
    klass = PygletRichLabel

These are some very small modifications of 2 classes: pyglet.text.Label class (becomes PygletRichLabel) and cocos.text.Label (becomes RichLabel). For both classes you can pass the same arguments as their cocos or pyglet equivalent, except the text argument accepts not only plain text, but also attributed text (see pyglet's programming guide at www.pyglet.org for how to use attributed text). Now, if an argument like color or italic is passed to the RichLabel constructor (not through the text), it will overide attributes passed with the attributed text, and applies to the entire document. Now if you create a label using RichLabel, then setting style to part of the document works as expected; ex: using element.document.set_style(start, end, dict(color = (0, 0, 0, 255))). The same with plain pyglet.text.Label (or cocos2d equivalent) will set the style on the entire document, not just on the part you want.

For using this with pyglet you just need the first class. For using this with cocos2d you need both.

Of course you can also use the existing pyglet's or cocos2d's HTMLLabel to do this kind of stuff, but for those that dont want to mess with HTML or prefer using pyglet's attributed text documents, this could be helpful.

Credits of course go to pyglet (www.pyglet.org) and to cocos2d (www.cocos2d.org), this is just a tiny hack based on their existing classes. To the developers of cocos2d and pyglet, please feel free to add this like this or modified into the current frameworks.

Created by Thomas Woelz on Tue, 29 Jul 2008 (MIT)
Python recipes (4591)
Thomas Woelz's recipes (1)

Required Modules

  • (none specified)

Other Information and Tasks