Пример #1
0
    def __init__(self, parent, config, portero, idu, gestorproyectos, gestortemas, gestoroperaciones): 
        """Inicializador de la ventana principal"""
        QtGui.QMainWindow.__init__(self,None)
        self.ui=Ui_VentanaPrincipal()
        self.ui.setupUi(self)
        self.stackedWidget=self.ui.stackedWidget
        gestorsalida = gestores.GestorSalida()
        vsalida = VSalida(self,gestorsalida,gestortemas)
        idf = interfaces.InterfazDatosFicheros(portero)
        idr = interfaces.InterfazDatosR(portero)
        #VARIABLES PUBLICAS
        self.parent = parent
        self.__config = config
        self.__gestortemas = gestortemas
        self.__idu = idu
        #Bloque de inicialización de dialogos
        self.__dbuscar = DBuscar(self,"busqueda")
        self.__dconfig = DConfig(config,self)
        self.__dfiltro = DFiltrado(self,self.__idu)
        #self.__dimportartexto=DImportarTexto(self,idf)
        self.__portero = portero
        self.__gestorproyectos = gestorproyectos
        self.grid = Grid(self, self.__idu, self.__portero)
        self.stackedWidget.addWidget(self.grid)
        self.stackedWidget.setCurrentWidget(self.grid)
        # Funciones de inicializacion de componentes
        self.__init_toolbar()
        self.mostrar_undo_redo()

        #self.setIcon(self.__gestortemas.iconoprograma())
        self.__diccionarioarbolmenu = {}
        self.__diccionarioacciones = {}
        self.__colectorfunciones = []
        listalistasetiquetas = [operacion.etiquetas for operacion in gestoroperaciones.values()]
        from Driza import categorias
        arbol = categorias.conv_categorias_arbol("Raiz", listalistasetiquetas)
        LOG.debug("Arbol generado:"+str(arbol))
        self.__conv_arbol_menu(self.ui.menuAnalizar , arbol, self.__diccionarioarbolmenu)
        listaelementosmenu =  self.__lista_etiquetas_menu(self.__diccionarioarbolmenu, [])
        from sets import Set
        for operacion in gestoroperaciones.values():
            LOG.debug("Operacion procesada para generar el menu")
            for elementofinal in listaelementosmenu:
                LOG.debug("Elemento final procesado para generar el menu")
                if Set(operacion.etiquetas) == Set(elementofinal[1]):
                    LOG.debug("Elemento final encontrado, generando hoja")
                    accion = QtGui.QAction(self)
                    accion.setText(unicode(operacion.nombre))
                    elementofinal[0].addAction(accion)
                    self.__diccionarioacciones[operacion.nombre] = accion
Пример #2
0
class VPrincipal(QtGui.QMainWindow):
    """Ventana principal, hereda de vprincipal, que esta generado por el designer. 
    Esta clase es padre de la mayoria de los dialogos, y es la que permite introducir los datos a el usuario"""

    def __init__(self, parent, config, portero, idu, gestorproyectos, gestortemas, gestoroperaciones): 
        """Inicializador de la ventana principal"""
        QtGui.QMainWindow.__init__(self,None)
        self.ui=Ui_VentanaPrincipal()
        self.ui.setupUi(self)
        self.stackedWidget=self.ui.stackedWidget
        gestorsalida = gestores.GestorSalida()
        vsalida = VSalida(self,gestorsalida,gestortemas)
        idf = interfaces.InterfazDatosFicheros(portero)
        idr = interfaces.InterfazDatosR(portero)
        #VARIABLES PUBLICAS
        self.parent = parent
        self.__config = config
        self.__gestortemas = gestortemas
        self.__idu = idu
        #Bloque de inicialización de dialogos
        self.__dbuscar = DBuscar(self,"busqueda")
        self.__dconfig = DConfig(config,self)
        self.__dfiltro = DFiltrado(self,self.__idu)
        #self.__dimportartexto=DImportarTexto(self,idf)
        self.__portero = portero
        self.__gestorproyectos = gestorproyectos
        self.grid = Grid(self, self.__idu, self.__portero)
        self.stackedWidget.addWidget(self.grid)
        self.stackedWidget.setCurrentWidget(self.grid)
        # Funciones de inicializacion de componentes
        self.__init_toolbar()
        self.mostrar_undo_redo()

        #self.setIcon(self.__gestortemas.iconoprograma())
        self.__diccionarioarbolmenu = {}
        self.__diccionarioacciones = {}
        self.__colectorfunciones = []
        listalistasetiquetas = [operacion.etiquetas for operacion in gestoroperaciones.values()]
        from Driza import categorias
        arbol = categorias.conv_categorias_arbol("Raiz", listalistasetiquetas)
        LOG.debug("Arbol generado:"+str(arbol))
        self.__conv_arbol_menu(self.ui.menuAnalizar , arbol, self.__diccionarioarbolmenu)
        listaelementosmenu =  self.__lista_etiquetas_menu(self.__diccionarioarbolmenu, [])
        from sets import Set
        for operacion in gestoroperaciones.values():
            LOG.debug("Operacion procesada para generar el menu")
            for elementofinal in listaelementosmenu:
                LOG.debug("Elemento final procesado para generar el menu")
                if Set(operacion.etiquetas) == Set(elementofinal[1]):
                    LOG.debug("Elemento final encontrado, generando hoja")
                    accion = QtGui.QAction(self)
                    accion.setText(unicode(operacion.nombre))
                    elementofinal[0].addAction(accion)
                    self.__diccionarioacciones[operacion.nombre] = accion
        #self.__atajos()

    #FUNCIONES PUBLICAS
    
    def abrir_proyecto(self, parent = None, filename = None):
        """ Lanza el diálogo de apertura de fichero """
        from Driza.excepciones import FicheroNoExisteException, FicheroErroneoException,FicheroTipoDesconocidoException
        if not parent: 
            parent = self
        if not self.__dproyecto_modificado(): 
            return
        if not filename:
            filtro = ""
            for fmt in SL.extensiones_fichero:
                filtro = filtro + "%s files (*.%s);;" % (fmt, string.lower(fmt))
            from PyQt4.QtGui import QFileDialog
            from PyQt4.QtCore import QString
            filename = QFileDialog.getOpenFileName(self, "Dialogo abrir fichero", "", filtro)
            filename = str(filename)
        if filename:
            try:
                self.__gestorproyectos.cargar(filename)
            except FicheroErroneoException:
                QMessageBox.warning(parent, u'Atención', 'El fichero no ha podido ser leido')
            except FicheroTipoDesconocidoException:
                QMessageBox.warning(parent, u'Atención', 'El fichero no ha podido ser leido')
            except FicheroNoExisteException:
                QMessageBox.warning(parent, u'Atención', 'El fichero no ha podido ser leido')
            except AttributeError:
                QErrorMessage(parent, "Error").message(u"Parece que ha intentado cargar un fichero de una versión anterior. Lo siento")
                LOG.exception("excepcion capturada")
            else:
                self.__myUpdate()
                self.grid.myUpdate()
                return True
        return False

    def __myUpdate(self):
        """Acciones de actualizacion"""
        from Driza import VERSION
        if self.__gestorproyectos.fichero:
            nfichero = self.__gestorproyectos.fichero
        else:
            nfichero = "Nuevo fichero"
        self.setWindowTitle("Driza " + VERSION + " - " + nfichero)

    def showEvent(self, ev):
        self.__myUpdate()
        QtGui.QMainWindow.showEvent(self, ev)

    def closeEvent(self, ev):
        """Acciones que se realizaran cuando el usuario cierre la ventana. Guarda el estado de la configuración, 
        incluyendo los ficheros recientemente abiertos"""
        if not self.__dproyecto_modificado(): 
            return
        if not self.parent.vsalida.isVisible():
            self.__config.guardar()
            QtGui.qApp.exit(0)
        else:
            self.hide()
    
    def mostrar_undo_redo(self):
        """Determina que botones estan activados y cuales no del submenu de edición"""
        if self.__portero.puedo_undo():
            self.ui.actionDeshacer.setEnabled(True)
        else:
            self.ui.actionDeshacer.setEnabled(False)

        if self.__portero.puedo_redo():
            self.ui.actionRehacer.setEnabled(True)
        else:
            self.ui.actionRehacer.setEnabled(False)

    #FUNCIONES PRIVADAS

    def __importar(self):
        """Importa los datos de un fichero"""
        if not self.__dproyecto_modificado(): 
            return
        self.parent.dimportartexto.show()

    def __dproyecto_modificado(self):
        """Pregunta en caso de que haya sido modificado el proyecto si desea ser guardado"""
        if not self.__idu.original():
            returncode = QMessageBox.information(self, 'Atencion:', 'El proyecto actual ha sido modificado, desea guardarlo?', 'Guardarlo', 'No guardarlo', 'Volver', 0, 1)
            if returncode == 0:
                self.__guardar()
            elif returncode == 2:
                return False
        return True


    def __dacerca_de(self):
        """Mensaje acerca de"""
        from Driza import VERSION
        separador = "<hr>"
        ristra ="<html>"
        betatesters = u"Carlos Mestre Gonzalez <br> Luis de Bethencourt Guimerá"
        iconos = "Iconos del Tango Desktop Project: http://tango.freedesktop.org/"
        ristra += u"Driza %s es una interfaz estadística <br> (C) Néstor Arocha Rodríguez - Tutorizado por Inmaculada luengo Merino<br> Distribuido bajo licencia GPL" +\
                separador + "Betatesters:\n" + betatesters + separador + iconos + "</html>"
        QMessageBox.about(self, "Acerca de Driza", ristra % (VERSION))
    
    def __undo(self):
        """Deshace el último cambio"""
        self.__portero.undo()
        self.grid.myUpdate()
        self.mostrar_undo_redo()
    
    def __redo(self):
        """Rehace el último cambio"""
        self.__portero.redo()
        self.grid.myUpdate()
        self.mostrar_undo_redo()

    def __init_toolbar(self):
        """Inicializa la toolbar"""
        #self.setIconSize(QtCore.QSize(64,64))
        #self.ui.toolBar.setIconSize(QtCore.QSize(64,64))
        self.__boton1 = QtGui.QToolButton(self.ui.toolBar)
        self.ui.toolBar.addWidget(self.__boton1)
        self.__boton1.setText("ABRIR")
        icono=QIcon()
        icono.addPixmap(self.__gestortemas.icono_abrir())
        self.__boton1.setIcon(icono)
        self.__boton2 = QtGui.QToolButton(self.ui.toolBar)
        self.__boton2.setText("GUARDAR")
        icono = QIcon()
        icono.addPixmap(self.__gestortemas.icono_guardar())
        self.__boton2.setIcon(icono)
        self.ui.toolBar.addWidget(self.__boton2)

    def conexiones(self):
        """Funcion llamada en el constructor que almacena todas las conexiones accion-funcion"""
        from PyQt4.QtCore import SIGNAL
        self.connect(self.ui.actionSalir,SIGNAL("triggered()"),self.__salir_programa)
        self.connect(self.ui.actionNuevo_proyecto,SIGNAL("triggered()"),self.__nuevo)
        self.connect(self.ui.actionAbrir_Proyecto,SIGNAL("triggered()"),self.abrir_proyecto)
        self.connect(self.ui.actionGuardar_como,SIGNAL("triggered()"),self.__guardar_como)
        self.connect(self.ui.actionGuardar,SIGNAL("triggered()"),self.__guardar)
        self.connect(self.ui.actionImportar,SIGNAL("triggered()"),self.__importar)
        self.connect(self.ui.actionConfiguraci_n,SIGNAL("triggered()"),self.__dconfig.show)
        self.connect(self.ui.actionFiltrar,SIGNAL("triggered()"),self.__dfiltro.show)
        self.connect(self.ui.actionCrear_nuevas_variables,SIGNAL("triggered()"),self.parent.dcrevar.show)
        self.connect(self.ui.actionBuscar,SIGNAL("triggered()"),self.__dbuscar.show)
        self.connect(self.ui.actionCopiar,SIGNAL("triggered()"),self.__copiar)
        self.connect(self.ui.actionCotar,SIGNAL("triggered()"),self.__cortar)
        self.connect(self.ui.actionPegar,SIGNAL("triggered()"),self.__pegar)
        self.connect(self.ui.actionDeshacer,SIGNAL("triggered()"),self.__undo)
        self.connect(self.ui.actionRehacer,SIGNAL("triggered()"),self.__redo)
        self.connect(self.ui.actionBorrar,SIGNAL("triggered()"),self.__borrar)
        self.connect(self.ui.actionAcerca, SIGNAL("triggered()"), self.__dacerca_de)
        self.connect(self.__boton1, SIGNAL("clicked()"), self.abrir_proyecto)
        self.connect(self.__boton2, SIGNAL("clicked()"), self.__guardar)
        #self.__conexionesanalizar()
        for (key, valor) in self.__diccionarioacciones.items():
            self.__colectorfunciones.append(lambda k=key: self.parent.doperaciones.mostrar(k))
            self.connect(valor, SIGNAL("activated()"), self.__colectorfunciones[-1])



    def __copiar(self):
        """Funcion que copia y borra la seleccion"""
        try:
            self.__copiar_privado()
        except AssertionError:
            QMessageBox.warning(self, u'Atención', 'Las operaciones de copiado, cortado y pegado no han sido implementadas')
        else:
            self.grid.borrar_seleccion() 

   #http://www.google.com/codesearch?hl=en&q=+%22qtable%22+%22cut%22+%22paste%22+show:z9otKZeV6U8:R6dK3Cx-dYg:Gh37-3Ie27E&sa=N&cd=48&ct=rc&cs_p=http://mde.abo.fi/confluence/download/attachments/1011/coral-0.9.1.tar.gz&cs_f=coral-0.9.1/coral/modeler/property/propertyeditor.py#a0 
    def __cortar(self):
        """Copia, borra la seleccion y su contenido"""
        from Driza.excepciones import SeleccionIncorrectaException
        try:
            self.grid.verificar_seleccion_registros()
            self.__portero.guardar_estado()
            self.__copiar_privado()
        except SeleccionIncorrectaException:
            QMessageBox.warning(self, u'Atención', 'Solo se permite cortar registros')
        except AssertionError:
            QMessageBox.warning(self, u'Atención', 'Las operaciones de copiado, cortado y pegado no han sido implementadas')
        else:
            self.grid.borrar_seleccion(borrardatos=True)
            self.grid.myUpdate()


    def __pegar(self):
        """Funcion que envuelve a __pegar recogiendo sus excepciones"""
        #TODO Capturar otras excepciones
        try:
            self.__pegar_privado()
        except AssertionError:
            QErrorMessage(self, "Error").message(u"Error desconocido")
            LOG.exception("excepcion capturada en el pegado")


    def __pegar_privado(self):
        """Pega lo que haya sido copiado"""
        clipboard = QApplication.clipboard()
        registro = clipboard.text().latin1()
        lista = eval(registro)
        pos = self.grid.table1.currentRow()
        lista.reverse() #Escribimos los registros al reves para que queden ordenados
        if pos > self.__idu.numReg():
            for x in range(self.__idu.numReg(),pos):
                self.__idu.appReg()
        #Hacemos el pegado efectivo
        for registro in lista:
            self.__idu.insReg(pos,registro)
        self.grid.myUpdate()

    def __salir_programa(self):
        """Funcion de salida del programa. Guarda la configuracion"""
        if not self.__dproyecto_modificado(): 
            return
        self.__config.guardar()
        QtGui.qApp.exit(0)


    def __nuevo(self):
        """Accion realizada cuando el usuario clickea en Nuevo"""
        if not self.__dproyecto_modificado(): 
            return
        self.__idu.borrar_todo()
        self.__gestorproyectos.fichero = None
        self.__myUpdate()
        self.grid.myUpdate()


    
    def __guardar(self):
        """Funcion de guardado del fichero. Si el fichero no es conocido se llama a guardarcomo"""
        if self.__gestorproyectos.fichero:
            self.__gestorproyectos.guardar(sobreescribir = True)
            self.__idu.establecer_original()
        else:
            self.__guardar_como()

    def __guardar_como(self):
        """Abre un diálogo pidiendo el nombre de archivo y guarda en dicho archivo"""
        filtro = ""
        for fmt in SL.extensiones_fichero:
            filtro = filtro+ "%s files (*.%s);;" % (fmt, string.lower(fmt))
        from PyQt4.QtGui import QFileDialog
        fn = QFileDialog.getSaveFileName(self,"Dialogo guardarFichero","",filtro)
        filename = str(fn)
        if filename:
            from Driza.excepciones import FicheroExisteException,FicheroTipoDesconocidoException
            import re
            extension = re.compile('.*\..*')
            if not extension.match(filename):
                filename += ".driza"
            try:
                self.__gestorproyectos.guardar(filename)
            except FicheroExisteException, fichero:
                returncode = QMessageBox.information(self, 'Atencion:', 'El fichero' + fichero.fichero + ' ya existe' , 'Sobreescribir', 'Otro nombre', 'Cancelar', 0, 1)
                if returncode == 0:
                    self.__gestorproyectos.guardar(filename, True)
                    self.__idu.establecer_original()
                    self.__myUpdate()
                elif returncode == 1:
                    self.__guardarcomo()
            except FicheroTipoDesconocidoException:
                QMessageBox.warning(self, u'Atención', u'La extensión del fichero es incorrecta.\nPruebe con otra extensión')
                self.__gestorproyectos.fichero = None
            else: