Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/BiblioJAM/JAMDialog.py
diff options
context:
space:
mode:
Diffstat (limited to 'BiblioJAM/JAMDialog.py')
-rw-r--r--BiblioJAM/JAMDialog.py413
1 files changed, 413 insertions, 0 deletions
diff --git a/BiblioJAM/JAMDialog.py b/BiblioJAM/JAMDialog.py
new file mode 100644
index 0000000..c3cec16
--- /dev/null
+++ b/BiblioJAM/JAMDialog.py
@@ -0,0 +1,413 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# BiblioJAM (Versión 2.0) - 18/04/2011 - CeibalJAM! - Uruguay
+# JAMDialog.py por: Flavio Danesse fdanesse@gmail.com
+# https://sites.google.com/site/flaviodanesse/
+# https://sites.google.com/site/sugaractivities/
+# http://codigosdeejemplo.blogspot.com/
+
+import pygame, gc, sys
+from pygame.locals import *
+gc.enable()
+
+import JAMGlobals as VG
+from JAMLabel import JAMLabel
+from JAMButton import JAMButton
+
+class JAMDialog(pygame.sprite.OrderedUpdates):
+ def __init__(self, mensaje="JAMDialog", funcion_ok=None, funcion_cancel=None):
+ ''' Es un grupo de sprite que contiene: JAMButton aceptar, JAMButton cancelar, Base.'''
+ pygame.sprite.OrderedUpdates.__init__(self)
+ self.resolucion= (800,600)
+ self.mensaje= mensaje
+ self.funcion_ok= None #funcion_ok
+ self.funcion_cancel= None #funcion_cancel
+
+ self.separador= 20
+ self.grosorbor_int= 3
+ self.grosorbor_med= 2
+ self.grosorbor_ext= 7
+
+ self.colores= {"base":VG.get_blanco(), "bordes":VG.get_negro()}
+
+ # Botones
+ self.boton_aceptar, self.boton_cancelar= self.get_buttons()
+ self.connect(funcion_ok=funcion_ok, funcion_cancel=funcion_cancel)
+ # Etiqueta con mensaje
+ self.label = self.get_label()
+ # Base
+ self.base= pygame.sprite.Sprite()
+ self.base.image= self.get_base()
+ self.base.rect= self.base.image.get_rect()
+
+ self.add(self.base)
+ self.add(self.boton_aceptar)
+ self.add(self.boton_cancelar)
+
+ #self.set_center()
+ self.JAMObjects= {"base":self.base, "etiqueta":self.label, "botonaceptar":self.boton_aceptar, "botoncancelar": self.boton_cancelar}
+
+ self.Reconstruye_JAMDialog(["todo"])
+
+ # ------------ SETEOS -----------------------
+ # ------ Etiqueta
+ def set_text(self, tipo=None, tamanio=None, color=None, texto=None):
+ ''' Setea el Texto en JAMLabel. '''
+ self.label.set_text(tipo=tipo, tamanio=tamanio, color=color, texto=texto)
+ self.Reconstruye_JAMDialog(["texto"])
+
+ def set_font_from_file(self, direccion_archivo, tamanio= None):
+ ''' Setea la fuente desde un archivo en JAMLabel. '''
+ self.label.set_font_from_file(direccion_archivo, tamanio)
+ self.Reconstruye_JAMDialog(["texto"])
+
+ def set_imagen(self, origen=None, tamanio=None):
+ ''' Setea el Imagen en JAMLabel. '''
+ self.label.set_imagen(origen=origen, tamanio=tamanio)
+ self.Reconstruye_JAMDialog(["imagen"])
+ # ------ Etiqueta
+
+ # ------ Botones
+ def set_text_buttons(self, tipo=None, tamanio=None, color=None, textoaceptar=None, textocancelar=None):
+ ''' Setea el Texto en los JAMButtons. '''
+ self.boton_aceptar.set_tamanios(tamanio=(0,0))
+ self.boton_cancelar.set_tamanios(tamanio=(0,0))
+ self.boton_aceptar.set_text(tipo=tipo, tamanio=tamanio, color=color, texto=textoaceptar)
+ self.boton_cancelar.set_text(tipo=tipo, tamanio=tamanio, color=color, texto=textocancelar)
+ self.Reconstruye_JAMDialog(["tamaniosbuttons"])
+
+ def set_colors_buttons(self, colorbas=None, colorbor=None, colorcara=None):
+ ''' Setea los colores de los JAMButtons. '''
+ self.boton_aceptar.set_colores(colorbas=colorbas, colorbor=colorbor, colorcara=colorcara)
+ self.boton_cancelar.set_colores(colorbas=colorbas, colorbor=colorbor, colorcara=colorcara)
+ self.Reconstruye_JAMDialog(["colorbuttons"])
+
+ def set_imagenes_buttons(self, imagenceptar=None, imagencancelar=None, tamanio=None):
+ ''' Setea las imágenes de los JAMButtons. '''
+ self.boton_aceptar.set_tamanios(tamanio=(0,0))
+ self.boton_cancelar.set_tamanios(tamanio=(0,0))
+ self.boton_aceptar.set_imagen(origen=imagenceptar , tamanio=tamanio)
+ self.boton_cancelar.set_imagen(origen=imagencancelar , tamanio=tamanio)
+ self.Reconstruye_JAMDialog(["imagenbuttons"])
+
+ def connect(self, funcion_ok=None, funcion_cancel=None):
+ ''' Conecta los Botones a Funciones. '''
+ if funcion_ok != self.funcion_ok:
+ self.funcion_ok= funcion_ok
+ self.boton_aceptar.connect(callback=self.funcion_ok, sonido_select=VG.get_sound_select())
+ if funcion_cancel != self.funcion_cancel:
+ self.funcion_cancel= funcion_cancel
+ self.boton_cancelar.connect(callback=self.funcion_cancel, sonido_select=VG.get_sound_select())
+ if not funcion_ok or not funcion_cancel:
+ self.boton_aceptar.connect(sonido_select=VG.get_sound_select())
+ self.boton_cancelar.connect(sonido_select=VG.get_sound_select())
+ # ------ Botones
+
+ def set_colors_dialog(self, base=None, bordes=None):
+ ''' Setea los Colores del Contenedor de JAMDialog. '''
+ if not base: base= VG.get_blanco()
+ if not bordes: bordes= VG.get_negro()
+
+ if base != self.colores["base"]:
+ self.colores["base"]= base
+ if bordes != self.colores["bordes"]:
+ self.colores["bordes"]= bordes
+ self.label.set_contenedor(colorbas=self.colores["base"])
+ self.Reconstruye_JAMDialog(["colorsdialog"])
+
+ def set_center(self):
+ ''' Centra la base y posiciona los botones. '''
+ '''
+ w,h= (800, 600)
+ try:
+ w,h= (pygame.display.Info().current_w, pygame.display.Info().current_h)
+ except:
+ w,h= (800, 600)'''
+
+ w,h= self.resolucion
+ self.base.rect.center= (w/2,h/2)
+ x= self.base.rect.x+self.separador
+ y= self.base.rect.y+self.base.rect.h-self.separador-self.boton_aceptar.rect.h
+ self.boton_aceptar.set_posicion(punto=(x,y))
+ x= self.base.rect.x+self.base.rect.w-self.separador-self.boton_cancelar.rect.w
+ self.boton_cancelar.set_posicion(punto=(x,y))
+
+ # ------------ CONSTRUCCIÓN -----------------------
+ def Reconstruye_JAMDialog(self, cambios):
+ self.base.image= self.get_base()
+ self.base.rect= self.base.image.get_rect()
+ self.set_reset_tamanios_buttons()
+ self.set_center()
+
+ def set_reset_tamanios_buttons(self):
+ ''' Los dos botones del mismo tamaño. '''
+ botones= [self.boton_aceptar, self.boton_cancelar]
+ for boton in botones:
+ boton.set_tamanios(tamanio=(0,0))
+ w,h= (0,0)
+ for boton in botones:
+ ww,hh= boton.get_tamanio()
+ if w < ww: w= ww
+ if h < hh: h= hh
+ for boton in botones:
+ boton.set_tamanios(tamanio=(w,h))
+
+ def get_label(self):
+ ''' Construye y Devuelve JAMLabel. '''
+ label= JAMLabel(self.mensaje)
+ label.set_text(tipo=None, tamanio=50, color=None, texto=None)
+ label.set_contenedor(colorbas=self.colores["base"], grosor=None, colorbor=None)
+ return label
+
+ def get_buttons(self):
+ ''' Construye y Devuelve los Botones. '''
+ boton_aceptar = JAMButton ("Aceptar", None)
+ boton_cancelar = JAMButton ("Cancelar", None)
+ boton_aceptar.set_text(tipo=None, tamanio=30, color=None, texto=None)
+ boton_cancelar.set_text(tipo=None, tamanio=30, color=None, texto=None)
+ return boton_aceptar, boton_cancelar
+
+ def get_base(self):
+ ''' Construye el sprite base. '''
+ (a,b,c,d)= self.boton_aceptar.rect
+ (aa,bb,cc,dd)= self.boton_cancelar.rect
+ ancho_minimo= (c+cc+self.separador)
+
+ (a,b,w,h)= self.label.rect
+ if w < ancho_minimo: w= ancho_minimo
+
+ # Recuadro Interior con Etiqueta
+ tamanio_frame_interno= (self.grosorbor_int*2+w+self.separador*2, self.grosorbor_int*2+self.separador*2+h)
+ frame1= VG.get_Rectangulo(self.colores["base"], tamanio_frame_interno)
+ frame1= VG.get_my_surface_whit_border(frame1, self.colores["bordes"], self.grosorbor_int)
+ frame1= VG.pegar_imagenes_centradas(self.label.image, frame1)
+
+ ww,hh= frame1.get_size()
+ # Recuadro pre-exterior con Recuadro Interior
+ tamanio_frame_externo= (ww+self.separador*2, hh+self.separador*2+d)
+ frame2= VG.get_Rectangulo(self.colores["base"], tamanio_frame_externo)
+ frame2= VG.get_my_surface_whit_border(frame2, self.colores["bordes"], self.grosorbor_med)
+ frame2.blit(frame1, (self.separador, self.separador))
+
+ ww,hh= frame2.get_size()
+ # Recuadro exterior - imagen final de la base
+ tamanio_frame_externo= (ww+self.grosorbor_ext*3,hh+self.grosorbor_ext*3)
+ base= VG.get_Rectangulo(self.colores["base"], tamanio_frame_externo)
+ base= VG.get_my_surface_whit_border(base, self.colores["bordes"], self.grosorbor_ext)
+ base= VG.pegar_imagenes_centradas(frame2, base)
+ return base
+
+ def Describe(self):
+ ''' Describe la Estructura de Este Control. '''
+ estructura = '''
+ Estructura JAMDialog:
+
+ JAMObject:
+ Base
+ Etiqueta
+ Boton Aceptar
+ Boton Cancelar
+
+ Detalle Estructural:
+ Base: es una imagen construida en tiempo de ejecución sobre la cual se pega la imagen de la etiqueta
+ Etiqueta: JAMLabel con el texto del mensaje
+ Boton Aceptar: JAMButton para detectar evento click y responder con la función asignada mediante connect
+ Boton Cancelar: JAMButton para detectar evento click y responder con la función asignada mediante connect '''
+
+ print estructura, "\n"
+ print "Ejemplo, Configuración actual:\n"
+ print "\t", self.JAMObjects.keys(), "\n"
+ for k in self.JAMObjects.items():
+ print k, "\n"
+
+# ----- FIN DE CLASE JAMDialog - INICIO DE DEBUG Y EJEMPLO DE LA CLASE -----
+class Ejemplo(object):
+ def __init__(self):
+ self.ventana = None
+ self.reloj = None
+ self.nivel = "menu_0"
+
+ self.fondo = None
+ self.widgets = None
+
+ self.resolucion = (1000,800)
+
+ self.setup()
+ self.Run()
+
+ def setup(self):
+ pygame.init()
+ pygame.display.set_mode(self.resolucion , 0, 0)
+ pygame.display.set_caption("Ejemplo")
+
+ self.fondo = self.get_Fondo()
+
+ self.widgets = JAMDialog(mensaje="Prueba JAMDialog", funcion_ok=None, funcion_cancel=None)
+ self.widgets.connect(funcion_ok=self.salir, funcion_cancel=self.salir)
+
+ self.ventana = pygame.display.get_surface()
+ self.reloj = pygame.time.Clock()
+
+ pygame.event.set_blocked([JOYAXISMOTION, JOYBALLMOTION, JOYHATMOTION, JOYBUTTONUP, JOYBUTTONDOWN,
+ KEYUP, USEREVENT, QUIT, ACTIVEEVENT])
+ pygame.event.set_allowed([MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN, KEYDOWN, VIDEORESIZE, VIDEOEXPOSE])
+ pygame.mouse.set_visible(True)
+
+ def Run(self):
+ self.ventana.blit(self.fondo, (0,0))
+ self.widgets.draw(self.ventana)
+ pygame.display.update()
+
+ contador = 0
+ while self.nivel == "menu_0":
+ self.reloj.tick(35)
+
+ cambios=[]
+ self.widgets.clear(self.ventana, self.fondo)
+ if contador == 150:
+ # Activa la siguiente línea para provocar cambios de texto en JAMLabel
+ contador= self.ejemplo_cambia_texto_en_Dialog()
+ # Activa la siguiente línea para provocar cambios de imagen en JAMLabel
+ contador= self.ejemplo_cambia_imagen_en_Dialog()
+ # Activa la siguiente línea para provocar cambios de contenedor en JAMLabel
+ contador= self.ejemplo_cambia_colors_Dialog()
+
+ # Activa la siguiente línea para provocar cambios de texto en Botones
+ contador= self.ejemplo_cambia_texto_en_Buttons()
+ # Activa la siguiente línea para provocar cambios de imagen en Botones
+ contador= self.ejemplo_cambia_imagen_en_Buttons()
+ # Activa la siguiente línea para provocar cambios de color en los botones
+ contador= self.ejemplo_cambia_colors_Buttons()
+ pass
+
+ self.widgets.update()
+ self.handle_event()
+ pygame.event.clear()
+ cambios.extend ( self.widgets.draw(self.ventana) )
+ pygame.display.update(cambios)
+ contador += 1
+
+ def ejemplo_cambia_texto_en_Dialog(self):
+ import random
+ cambios = ["tipo", "tamanio", "color", "texto"]
+ modificar = random.choice(cambios)
+ if modificar == "tipo":
+ tipos= ["Arial", "Purisa", "Times New Roman", "Vardana", "Impact", pygame.font.get_default_font()]
+ tipo=random.choice(tipos)
+ self.widgets.set_text(tipo=random.choice(tipos), tamanio=None, color=None, texto=None)
+ if modificar == "tamanio":
+ tamanios= [10,20,30,40,45]
+ tamanio=random.choice(tamanios)
+ self.widgets.set_text(tipo=None, tamanio=tamanio, color=None, texto=None)
+ if modificar == "color":
+ colores= [(0,0,0,255), (100,100,255,255), (110,25,255,255), (255,125,55,255)]
+ color = random.choice(colores)
+ self.widgets.set_text(tipo=None, tamanio=None, color=color, texto=None)
+ if modificar == "texto":
+ textos= ["JAMLabel", "Presiona escape cuando quieras salir", "Modificando Texto en JAMLabel", "CeibalJAM 2011"]
+ texto = random.choice(textos)
+ self.widgets.set_text(tipo=None, tamanio=None, color=None, texto=texto)
+ return 0
+
+ def ejemplo_cambia_imagen_en_Dialog(self):
+ import random
+ cambios = ["origen", "tamanio"]
+ modificar = random.choice(cambios)
+ if modificar == "tamanio":
+ tamanios= [(10,20),(30,200),(250,100)]
+ tamanio=random.choice(tamanios)
+ self.widgets.set_imagen(origen=None, tamanio=tamanio)
+ if modificar == "origen":
+ origenes= [VG.get_jamimagenes()[0], VG.get_jamimagenes()[1], -1]
+ origen = random.choice(origenes)
+ self.widgets.set_imagen(origen=origen, tamanio=None)
+ return 0
+
+ def ejemplo_cambia_colors_Dialog(self):
+ import random
+ cambios = ["colorbas", "colorbor"]
+ modificar = random.choice(cambios)
+
+ colores= [(10,20,100,255), (128,128,128,255), (255,255,255,255)]
+ color=random.choice(colores)
+
+ if modificar == "colorbor":
+ self.widgets.set_colors_dialog(base=None, bordes=color)
+ if modificar == "colorbas":
+ self.widgets.set_colors_dialog(base=color, bordes=None)
+ return 0
+
+ def ejemplo_cambia_colors_Buttons(self):
+ import random
+ cambios = ["colorbas", "colorbor", "colorcara"]
+ modificar = random.choice(cambios)
+
+ colores= [(10,20,100,255), (128,128,128,255), (255,255,255,255)]
+ color=random.choice(colores)
+
+ if modificar == "colorbor":
+ self.widgets.set_colors_buttons(colorbas=None, colorbor=color, colorcara=None)
+ if modificar == "colorbas":
+ self.widgets.set_colors_buttons(colorbas=color, colorbor=None, colorcara=None)
+ if modificar == "colorcara":
+ self.widgets.set_colors_buttons(colorbas=None, colorbor=None, colorcara=color)
+ return 0
+
+ def ejemplo_cambia_texto_en_Buttons(self):
+ import random
+ cambios = ["tipo", "tamanio", "color", "texto"]
+ modificar = random.choice(cambios)
+ if modificar == "tipo":
+ tipos= ["Arial", "Purisa", "Times New Roman", "Vardana", "Impact", pygame.font.get_default_font()]
+ tipo=random.choice(tipos)
+ self.widgets.set_text_buttons(tipo=tipo)
+ if modificar == "tamanio":
+ tamanios= [10,20,30,40,45]
+ tamanio=random.choice(tamanios)
+ self.widgets.set_text_buttons(tamanio=tamanio)
+ if modificar == "color":
+ colores= [(0,0,0,255), (100,100,255,255), (110,25,255,255), (255,125,55,255)]
+ color = random.choice(colores)
+ self.widgets.set_text_buttons(color=color)
+ if modificar == "texto":
+ textos= ["JAMLabel", "Presiona escape cuando quieras salir", "Modificando Texto en JAMLabel", "CeibalJAM 2011"]
+ texto = random.choice(textos)
+ self.widgets.set_text_buttons(textoaceptar=texto, textocancelar=texto)
+ return 0
+
+ def ejemplo_cambia_imagen_en_Buttons(self):
+ import random
+ cambios = ["origen", "tamanio"]
+ modificar = random.choice(cambios)
+ if modificar == "tamanio":
+ tamanios= [(10,20),(30,200),(250,100)]
+ tamanio=random.choice(tamanios)
+ self.widgets.set_imagenes_buttons(imagenceptar=None, imagencancelar=None, tamanio=tamanio)
+ if modificar == "origen":
+ origenes= [VG.get_jamimagenes()[0], VG.get_jamimagenes()[1], -1]
+ origen = random.choice(origenes)
+ self.widgets.set_imagenes_buttons(imagenceptar=origen, imagencancelar=origen, tamanio=None)
+ return 0
+
+ def get_Fondo(self):
+ superficie = pygame.Surface( self.resolucion, flags=HWSURFACE )
+ superficie.fill((128,128,128,255))
+ return superficie
+
+ def handle_event(self):
+ for event in pygame.event.get():
+ if event.type == pygame.KEYDOWN:
+ self.salir()
+ pygame.event.clear()
+
+ def salir(self):
+ print "\n"
+ self.widgets.Describe()
+ pygame.quit()
+ sys.exit()
+
+
+
+if __name__ == "__main__":
+ Ejemplo()