111 lines
3.2 KiB
Python
111 lines
3.2 KiB
Python
|
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()
|