From 9d57ae40095b2928672b2f4b23a87b8d5927753e Mon Sep 17 00:00:00 2001 From: flavio Date: Wed, 07 Dec 2011 23:10:50 +0000 Subject: CucaraSims Base --- (limited to 'BiblioJAM/JAMDialog.py') 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() -- cgit v0.9.1