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.
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.