pilas.ejemplos.cargador

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
     70 -    def _cargar_lista_de_ejemplos(self):
     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
     90 -    def cuando_pulsa_boton_ejecutar(self):
     91          nombre_ejemplo = self._obtener_item_actual()
     92          self._ejecutar_ejemplo(nombre_ejemplo)
     93
     94 -    def cuando_pulsa_boton_fuente(self):
     95          font = self.codigo.font()
     96          font, ok = QtGui.QFontDialog.getFont(font)
     97
     98          if ok:
     99              self.codigo.setFont(font)
    100
    101 -    def cuando_pulsa_boton_guardar(self):
    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
    143 -    def _mostrar_codigo_presentacion_inicial(self):
    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