fheroes3/testtest.py
2014-06-21 14:41:07 +02:00

110 lines
3.2 KiB
Python
Executable file

import time
import pyglet
from pyglet import graphics
from pyglet import text
from pyglet import event
from pyglet.gl import *
class SimpleMenu(event.EventDispatcher, graphics.Batch):
def __init__(self, parent, x, y, options):
super(SimpleMenu, self).__init__()
self.parent = parent
self.x, self.y = x, y
self.options = []
y = y
self.width = 0
for option in options:
l = text.Label(option, x=x, y=y, color=(0, 0, 0, 255), anchor_y='top', batch=self)
self.options.append(l)
self.width = max(self.width, l.content_width)
y -= l.content_height
self.height = abs(self.y - y)
# add some padding
self.height += 4
self.width += 4
# adjust menu position to make sure whole menu is visible
if self.x < 0:
self.x = 0
if self.x + self.width> parent.width:
self.x = parent.width - self.width
if self.y - self.height < 0:
self.y = self.height
if self.y > parent.height:
self.y = parent.height
# reposition the items
y = self.y - 2
for option in self.options:
option.x = self.x + 2
option.y = y
y -= l.content_height
self.created_time = time.time()
parent.push_handlers(self)
def on_mouse_motion(self, x, y, dx, dy):
ret = event.EVENT_UNHANDLED
for option in self.options:
if (option.x < x < option.x + self.width and
option.y - option.content_height < y < option.y):
option.color = (200, 0, 0, 255)
ret = event.EVENT_HANDLED
elif option.color != (0, 0, 0, 255):
option.color = (0, 0, 0, 255)
return ret
def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
return self.on_mouse_motion(x, y, dx, dy)
def on_mouse_press(self, x, y, buttons, modifiers):
# determine action to take
selected_option = None
for option in self.options:
if (option.x < x < option.x + self.width and
option.y - option.content_height < y < option.y):
selected_option = option.text
break
self.parent.remove_handlers(self)
self.options = None
self.dispatch_event('on_close', selected_option)
return event.EVENT_HANDLED
def on_mouse_release(self, x, y, button, modifiers):
if time.time() - self.created_time > .5:
return self.on_mouse_press(x, y, button, modifiers)
return event.EVENT_UNHANDLED
def draw(self):
glColor4f(255, 255, 255, 255)
glRectf(self.x, self.y, self.x + self.width, self.y - self.height)
super(SimpleMenu, self).draw()
SimpleMenu.register_event_type('on_close')
if __name__ == '__main__':
win = pyglet.window.Window(height=400)
m = None
@win.event
def on_draw():
win.clear()
if m: m.draw()
m = SimpleMenu(win, 0, 0, ['New', 'Load', 'Save', 'Quit'])
@m.event
def on_close(selected_option):
print selected_option
if selected_option == 'Quit':
pyglet.app.exit()
global m
m = None
pyglet.app.run()