Package pilas :: Package ejemplos :: Module cargador
[hide private]
[frames] | no frames]

Source Code for Module pilas.ejemplos.cargador

  1  # -*- encoding: utf-8 -*- 
  2  # pilas engine - a video game framework. 
  3  # 
  4  # copyright 2010 - hugo ruscitti 
  5  # license: lgplv3 (see http://www.gnu.org/licenses/lgpl.html) 
  6  # 
  7  # website - http://www.pilas-engine.com.ar 
  8   
  9  import ui 
 10  import os 
 11  import sys 
 12  import glob 
 13   
 14  from PyQt4 import QtGui, QtCore 
 15   
 16  import syntax 
 17  import pilas 
 18   
 19   
 20  MENSAJE_PRESENTACION = u"""Bienvenido al cargador de ejemplos. 
 21   
 22  Selecciona un ejemplo usando el panel de 
 23  la izquierda y luego verás el código acá. 
 24  """ 
 25   
 26   
27 -class VentanaEjemplos(ui.Ui_Ejemplos):
28
29 - def setupUi(self, main):
30 self.main = main 31 ui.Ui_Ejemplos.setupUi(self, main) 32 33 self._conectar_signals() 34 syntax.PythonHighlighter(self.codigo.document()) 35 36 self._definir_estado_habilitado(True) 37 self._mostrar_image_inicial() 38 self._mostrar_codigo_presentacion_inicial() 39 40 self.this_dir = os.path.abspath(os.path.dirname(__file__)) 41 self.example_dir = os.path.join(self.this_dir, 'ejemplos') 42 self._cargar_lista_de_ejemplos() 43 pilas.utils.centrar_ventana(self.main)
44
45 - def _conectar_signals(self):
46 self.ejecutar.connect(self.ejecutar, QtCore.SIGNAL("clicked()"), self.cuando_pulsa_boton_ejecutar) 47 self.fuente.connect(self.fuente, QtCore.SIGNAL("clicked()"), self.cuando_pulsa_boton_fuente) 48 self.guardar.connect(self.guardar, QtCore.SIGNAL("clicked()"), self.cuando_pulsa_boton_guardar) 49 self.arbol.connect(self.arbol, QtCore.SIGNAL("itemSelectionChanged()"), self.cuando_cambia_seleccion) 50 self.arbol.connect(self.arbol, QtCore.SIGNAL("itemActivated(QListWidgetItem *)"), self.cuando_pulsa_boton_ejecutar)
51
52 - def _definir_estado_habilitado(self, esta_habilitado):
53 "Oculta la barra de progreso y habilita todos los controles." 54 55 widgets = [self.progreso, self.ejecutar, self.guardar, self.arbol, self.fuente, self.codigo, self.imagen] 56 57 self.progreso.setVisible(not esta_habilitado) 58 59 for x in widgets: 60 x.setEnabled(esta_habilitado)
61
62 - def keyPressEvent(self, event):
63 if event.key() == QtCore.Qt.Key_Return and \ 64 self.arbol.hasFocus() and \ 65 self.arbol.currentItem().childCount() == 0: 66 self.cuando_pulsa_boton_ejecutar() 67 68 return QtGui.QMainWindow.keyPressEvent(self, event)
69
71 self.ejemplos = {} 72 self.arbol.setColumnCount(1) 73 self.arbol.setHeaderLabels(["Nombre"]) 74 75 directorios = glob.glob(self.example_dir + '/*') 76 77 for directorio in directorios: 78 raiz = QtGui.QTreeWidgetItem([os.path.basename(directorio), ""]) 79 self.arbol.addTopLevelItem(raiz) 80 81 archivos = glob.glob(directorio + '/*.py') 82 archivos.sort() 83 84 for archivo in archivos: 85 nombre_legible = os.path.basename(archivo).replace(".py", "") 86 item = QtGui.QTreeWidgetItem([nombre_legible, archivo]) 87 raiz.addChild(item) 88 self.ejemplos[nombre_legible] = archivo
89
91 nombre_ejemplo = self._obtener_item_actual() 92 self._ejecutar_ejemplo(nombre_ejemplo)
93
95 font = self.codigo.font() 96 font, ok = QtGui.QFontDialog.getFont(font) 97 98 if ok: 99 self.codigo.setFont(font)
100
102 nombre = self._obtener_item_actual() 103 path = unicode(QtGui.QFileDialog.getSaveFileName(self.main, 'Guardar ejemplo', nombre, "py (*.py)")) 104 if path: 105 contenido = self._obtener_codigo_del_ejemplo(nombre) 106 107 archivo = open(path, "wt") 108 archivo.write(contenido) 109 archivo.close()
110
111 - def cuando_cambia_seleccion(self):
112 ruta = self._obtener_item_actual() 113 114 if ruta: 115 self._mostrar_codigo_del_ejemplo(ruta) 116 self._mostrar_imagen_del_ejemplo(ruta)
117
118 - def _obtener_item_desde_ruta(self, ruta):
119 nombres = ruta.split('/') 120 categoria = nombres[-2] 121 nombre = nombres[-1].replace('.py', '') 122 123 items = self.arbol.findItems(nombre, QtCore.Qt.MatchRecursive) 124 125 if items: 126 return items[0]
127
128 - def _mostrar_imagen_del_ejemplo(self, ruta):
129 escena = QtGui.QGraphicsScene() 130 self.imagen.setScene(escena) 131 pixmap = QtGui.QGraphicsPixmapItem(QtGui.QPixmap(ruta.replace('.py', '.png'))) 132 #ancho = self.imagen.width() 133 escena.addItem(pixmap)
134
135 - def _mostrar_image_inicial(self):
136 path = os.path.join(os.path.dirname(__file__), "data/_presentacion") 137 self._mostrar_imagen_del_ejemplo(path)
138
139 - def _mostrar_codigo_del_ejemplo(self, nombre):
140 contenido = self._obtener_codigo_del_ejemplo(nombre) 141 self.codigo.document().setPlainText(contenido)
142
144 self.codigo.document().setPlainText(MENSAJE_PRESENTACION)
145
146 - def _obtener_codigo_del_ejemplo(self, nombre):
147 archivo = open(nombre) 148 contenido = archivo.read() 149 archivo.close() 150 return contenido
151
152 - def _obtener_item_actual(self):
153 return self.arbol.currentItem().text(1)
154
155 - def _ejecutar_ejemplo(self, ruta):
156 self.process = QtCore.QProcess(self.main) 157 self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels) 158 self.process.finished.connect(self._cuando_termina_la_ejecucion_del_ejemplo) 159 self.process.start(sys.executable, [ruta]) 160 161 # Deshabilita todos los controles para que se pueda 162 # ejecutar un ejemplo a la vez. 163 self._definir_estado_habilitado(False)
164
165 - def _cuando_termina_la_ejecucion_del_ejemplo(self, estado, process):
166 "Vuelve a permitir que se usen todos los botone de la interfaz." 167 salida = str(self.process.readAll()) 168 169 if estado: 170 QtGui.QMessageBox.critical(self.main, "Error al iniciar ejemplo", "Error: \n" + salida) 171 172 self._definir_estado_habilitado(True) 173 self.arbol.setFocus()
174
175 -def main(parent=None):
176 dialog = QtGui.QDialog(parent) 177 dialog.setWindowFlags(dialog.windowFlags() | QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowMinMaxButtonsHint) 178 ui = VentanaEjemplos() 179 ui.setupUi(dialog) 180 dialog.exec_()
181 182 if __name__ == "__main__": 183 main() 184