Hello,
If you try to use the text input example without using batches it
doesnt work anymore. I've included a changed version below of
text_input.py with changes to make it not use batches and a diff to
show the changes more simply.
Dunk
#!/usr/bin/env python
'''Demonstrates basic use of IncrementalTextLayout and Caret.
A simple widget-like system is created in this example supporting keyboard and
mouse focus.
'''
__docformat__ = 'restructuredtext'
__version__ = '$Id: $'
import pyglet
class Rectangle(object):
'''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(object):
def __init__(self, text, x, y, width, batch):
self.document = pyglet.text.document.UnformattedDocument(text)
self.document.set_style(0, len(self.document.text),
dict(color=(0, 0, 0, 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 draw(self):
self.layout.draw()
def hit_test(self, x, y):
return (0 < x - self.layout.x < self.layout.width and
0 < y - self.layout.y < self.layout.height)
class Window(pyglet.window.Window):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(400, 140, caption='Text entry')
self.batch = pyglet.graphics.Batch()
self.labels = [
pyglet.text.Label('Name', x=10, y=100, anchor_y='bottom',
color=(0, 0, 0, 255), batch=self.batch),
pyglet.text.Label('Species', x=10, y=60, anchor_y='bottom',
color=(0, 0, 0, 255), batch=self.batch),
pyglet.text.Label('Special abilities', x=10, y=20,
anchor_y='bottom', color=(0, 0, 0, 255),
batch=self.batch)
]
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 = self.get_system_mouse_cursor('text')
self.focus = None
self.set_focus(self.widgets[0])
def on_resize(self, width, height):
super(Window, self).on_resize(width, height)
for widget in self.widgets:
widget.width = width - 110
def on_draw(self):
pyglet.gl.glClearColor(1, 1, 1, 1)
self.clear()
for w in self.widgets:
w.draw()
def on_mouse_motion(self, x, y, dx, dy):
for widget in self.widgets:
if widget.hit_test(x, y):
self.set_mouse_cursor(self.text_cursor)
break
else:
self.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)
window = Window(resizable=True)
pyglet.app.run()
Index: text_input.py
===================================================================
--- text_input.py (revision 2095)
+++ text_input.py (working copy)
@@ -40,6 +40,9 @@
self.rectangle = Rectangle(x - pad, y - pad,
x + width + pad, y + height + pad, batch)
+ def draw(self):
+ self.layout.draw()
+
def hit_test(self, x, y):
return (0 < x - self.layout.x < self.layout.width and
0 < y - self.layout.y < self.layout.height)
@@ -76,7 +79,8 @@
def on_draw(self):
pyglet.gl.glClearColor(1, 1, 1, 1)
self.clear()
- self.batch.draw()
+ for w in self.widgets:
+ w.draw()
def on_mouse_motion(self, x, y, dx, dy):
for widget in self.widgets:
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"pyglet-users" 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/pyglet-users?hl=en
-~----------~----~----~----~------~----~------~--~---