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

Reply via email to