>
> So, the solution can be:
> Do a TextWidget.draw function that knows how to render TextWidgets
> (most likely just self.layout.draw() or something like that)
> Do a textInputLayer.draw function that does self.batch.draw.
>
> Hope this helps.
>
> Lucio.
Turns out Lucio was absolutely correct.
Below is the code that implements the entire text entry demo from
pyglet in Cocos, except for the resize functionality of the original
demo. It didn't interest me at all. Just in case anyone is interested;
I hate it when I find a thread that is a problem I have and the final
solution never appears so I thought I should post it.
Don't claim it is the best way it could be done but it does work.
Thanks
----------------------------- code below here
import pyglet
import cocos
from cocos.director import *
from cocos.text import Label
from cocos.cocosnode import CocosNode
class Rectangle(CocosNode):
'''Draws a rectangle into a batch.'''
def __init__(self, x1, y1, x2, y2, batch):
self.vertex_list = batch.add(4, pyglet.gl.GL_QUADS, None,
('v2i', [x1, y1, x2, y1, x2, y2, x1, y2]),
('c4B', [200, 200, 220, 255] * 4)
)
class TextWidget(CocosNode):
def __init__(self, text, x, y, width, batch):
super(TextWidget, self).__init__()
self.document = pyglet.text.document.UnformattedDocument(text)
self.document.set_style(0, len(self.document.text),
dict(color=(0, 0, 255, 255))
)
font = self.document.get_font()
height = font.ascent - font.descent
self.layout = pyglet.text.layout.IncrementalTextLayout(
self.document, width, height, multiline=False,
batch=batch)
self.caret = pyglet.text.caret.Caret(self.layout)
self.layout.x = x
self.layout.y = y
# Rectangular outline
pad = 2
self.rectangle = Rectangle(x - pad, y - pad,
x + width + pad, y + height + pad,
batch)
def hit_test(self, x, y):
return (0 < x - self.layout.x < self.layout.width and
0 < y - self.layout.y < self.layout.height)
def draw(self):
self.layout.draw()
class textInputLayer(cocos.layer.Layer):
# For the layer to receive events this variable must be set to
'True'
is_event_handler = True
def __init__(self, *args, **kwargs):
super(textInputLayer, self).__init__()
self.batch = pyglet.graphics.Batch()
self.labels = [
Label('Name', x=10, y=100, anchor_y='bottom', color=(0, 0,
0, 255)),
Label('Species', x=10, y=60, anchor_y='bottom', color=(0,
0, 0, 255)),
Label('Special abilities', x=10, y=20, anchor_y='bottom',
color=(0, 0, 0, 255)),
]
map(self.add, self.labels)
self.width, self.height = director.get_window_size()
self.widgets = [
TextWidget('', 200, 100, self.width - 210, self.batch),
TextWidget('', 200, 60, self.width - 210, self.batch),
TextWidget('', 200, 20, self.width - 210, self.batch),
]
self.text_cursor =
director.window.get_system_mouse_cursor('text')
map(self.add, self.widgets)
self.focus = None
self.set_focus(self.widgets[0])
def draw(self):
pyglet.gl.glClearColor(1, 1, 1, 1)
director.window.clear()
self.batch.draw()
def on_mouse_motion(self, x, y, dx, dy):
for widget in self.widgets:
if widget.hit_test(x, y):
director.window.set_mouse_cursor(self.text_cursor)
break
else:
director.window.set_mouse_cursor(None)
def on_mouse_press(self, x, y, button, modifiers):
for widget in self.widgets:
if widget.hit_test(x, y):
self.set_focus(widget)
break
else:
self.set_focus(None)
if self.focus:
self.focus.caret.on_mouse_press(x, y, button, modifiers)
def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
if self.focus:
self.focus.caret.on_mouse_drag(x, y, dx, dy, buttons,
modifiers)
def on_text(self, text):
if self.focus:
self.focus.caret.on_text(text)
def on_text_motion(self, motion):
if self.focus:
self.focus.caret.on_text_motion(motion)
def on_text_motion_select(self, motion):
if self.focus:
self.focus.caret.on_text_motion_select(motion)
def on_key_press(self, symbol, modifiers):
if symbol == pyglet.window.key.TAB:
if modifiers & pyglet.window.key.MOD_SHIFT:
dir = -1
else:
dir = 1
if self.focus in self.widgets:
i = self.widgets.index(self.focus)
else:
i = 0
dir = 0
self.set_focus(self.widgets[(i + dir) %
len(self.widgets)])
elif symbol == pyglet.window.key.ESCAPE:
pyglet.app.exit()
def set_focus(self, focus):
if self.focus:
self.focus.caret.visible = False
self.focus.caret.mark = self.focus.caret.position = 0
self.focus = focus
if self.focus:
self.focus.caret.visible = True
self.focus.caret.mark = 0
self.focus.caret.position = len(self.focus.document.text)
# basic test code
if __name__ == "__main__":
from cocos.director import director
from pyglet import font
cocos.director.director.init(width=400, height = 140, caption="Text
Entry")
text_layer = textInputLayer ()
main_scene = cocos.scene.Scene (text_layer)
cocos.director.director.run (main_scene)
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"cocos2d discuss" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/cocos-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---