1
2
3
4
5
6
7
8
9 from pilas.actores import Actor
10 import pilas
11
12 DEMORA = 14
13
15 """Un actor que puede mostrar una lista de opciones a seleccionar."""
16
18 """Inicializa el menú.
19
20 :param opciones: Tupla con al menos dos elementos obligatorios (:texto:, :funcion:) y :argumentos: opcionales
21 :param x: Posicion en el eje x
22 :param y: Posicion en el eje y
23 """
24 self.opciones_como_actores = []
25 self.demora_al_responder = 0
26 Actor.__init__(self, "invisible.png", x=x, y=y)
27 self._verificar_opciones(opciones)
28 self.crear_texto_de_las_opciones(opciones, fuente)
29 self.opciones = opciones
30 self.seleccionar_primer_opcion()
31 self.opcion_actual = 0
32
33 self.activar()
34
35
36 teclas = {pilas.simbolos.IZQUIERDA: 'izquierda',
37 pilas.simbolos.DERECHA: 'derecha',
38 pilas.simbolos.ARRIBA: 'arriba',
39 pilas.simbolos.ABAJO: 'abajo',
40 pilas.simbolos.SELECCION: 'boton'}
41
42
43 self.control_menu = pilas.control.Control(pilas.escena_actual(), teclas)
44
45
50
55
57 """Genera un actor por cada opcion del menu.
58
59 :param opciones: Una lista con todas las opciones que tendrá el menú.
60 """
61
62 for indice, opcion in enumerate(opciones):
63 y = self.y - indice * 50
64 texto, funcion, argumentos = opcion[0],opcion[1],opcion[2:]
65 opciones = pilas.actores.Opcion(texto, x=0, y=y, funcion_a_invocar=funcion, argumentos=argumentos, fuente=fuente)
66
67 self.opciones_como_actores.append(opciones)
68
70 """Destaca la primer opción del menú."""
71 if self.opciones_como_actores:
72 self.opciones_como_actores[0].resaltar()
73
75 """Se asegura de que la lista este bien definida.
76
77 :param opciones: La lista de opciones a inspeccionar.
78 """
79 for x in opciones:
80
81 if not isinstance(x, tuple) or len(x)<2:
82 raise Exception("Opciones incorrectas, cada opcion tiene que ser una tupla.")
83
101
103 """Se ejecuta para activar y lanzar el item actual."""
104 opcion = self.opciones_como_actores[self.opcion_actual]
105 opcion.seleccionar()
106
108 """Realiza un movimiento del cursor que selecciona opciones.
109
110 :param delta: El movimiento a realizar (+1 es avanzar y -1 retroceder).
111 """
112
113 self._deshabilitar_opcion_actual()
114
115
116 self.opcion_actual += delta
117 self.opcion_actual %= len(self.opciones_como_actores)
118
119
120 self.opciones_como_actores[self.opcion_actual].resaltar()
121
123
124 try:
125 for x in self.opciones_como_actores:
126 setattr(x, atributo, valor)
127 except AttributeError:
128 pass
129
130 Actor.__setattr__(self, atributo, valor)
131
133 """Permite cambiar la opcion actual moviendo el mouse. Retorna True si el mouse esta sobre alguna opcion.
134
135 :param evento: El evento que representa el movimiento del mouse.
136 """
137 for indice, opcion in enumerate(self.opciones_como_actores):
138 if opcion.colisiona_con_un_punto(evento.x, evento.y):
139 if indice != self.opcion_actual:
140 self._deshabilitar_opcion_actual()
141 self.opcion_actual = indice
142 self.opciones_como_actores[indice].resaltar()
143 return True
144
146 """Le quita el foco o resaltado a la opción del menú actual."""
147 self.opciones_como_actores[self.opcion_actual].resaltar(False)
148
156