def __init__(self, parent, idu, gestoroperaciones, vsalida): self.__diccionariowidgets = {} self.__init_dic_widgets() self.__gestorcategorias = GestorCategorias() DialogoOperaciones.__init__(self, parent, "Dialogo casos", 0, 0) self.__idu = idu self.__gestoroperaciones = gestoroperaciones self.__init_widgets_operaciones() self.__init_arbol() self.__conexiones() self.__vsalida = vsalida self.listView2.setRootIsDecorated(True) self.listView2.addColumn("Operaciones") self.__operacion = None #Guarda la operacion actual self.__init_widgets_categorias() self.__init_dic_widgets_otros()
class DOperaciones(DialogoOperaciones): """Dialogo de operaciones. Muestra las operaciones disponibles Y ademas muestra el woperaciones de la operación actualmente seleccionada """ def __init__(self, parent, idu, gestoroperaciones, vsalida): self.__diccionariowidgets = {} self.__init_dic_widgets() self.__gestorcategorias = GestorCategorias() DialogoOperaciones.__init__(self, parent, "Dialogo casos", 0, 0) self.__idu = idu self.__gestoroperaciones = gestoroperaciones self.__init_widgets_operaciones() self.__init_arbol() self.__conexiones() self.__vsalida = vsalida self.listView2.setRootIsDecorated(True) self.listView2.addColumn("Operaciones") self.__operacion = None #Guarda la operacion actual self.__init_widgets_categorias() self.__init_dic_widgets_otros() def accept(self): """Acepta el dialogo. Coge la operacion con la que esta trabajando el usuario e inicia el procedimiento de calculo""" from Driza.excepciones import OpcionesIncorrectaException from rpy import RException nombre = unicode(self.listView2.currentItem().text(0).latin1(),'iso-8859-1') widget = self.__diccionariowidgets["operaciones"][nombre] try: resultado = self.__gestoroperaciones[nombre].procedimiento(widget.seleccion(), widget.opciones()) except OpcionesIncorrectaException: QErrorMessage(self, "error").message(u"Las opciones no son correctas") except IndexError: QErrorMessage(self, "error").message(u"Seleccion Incorrecta") LOG.exception("excepcion capturada") except KeyError: mensaje = u"Hay elementos de la salida sin definir(o mal definidos) en la operación" QErrorMessage(self, "error").message(mensaje) LOG.exception("Excepción Generada por un módulo de operaciones") except RException: QErrorMessage(self, "error").message(u"R devolvio un error") LOG.exception("Excepción de RPY") except AssertionError: QErrorMessage(self, "error").message(u"Error desconocido") else: self.__vsalida.ana_res(resultado) #Añadir a la salida el resultado self.__vsalida.hide() #TODO averiguar como hacer para que recupere el foco sin ocultar la ventana self.__vsalida.show() def mostrar(self, operacion): """Muestra el dialogo con la operacion pasada""" self.__operacion = operacion LOG.debug("Mostrando operacion:" + operacion) self.show() def showEvent(self, ev): """Redefinición showEvent""" self.__myUpdate() DialogoOperaciones.showEvent(self, ev) #MIEMBROS PRIVADOS def __cambiar_elemento(self): """Procedimiento que actualiza el widget en función de la selección del arbol""" self.__operacion = unicode(self.listView2.currentItem().text(0).latin1(), 'iso-8859-1') self.__mostrar_widget() def __conexiones(self): """Bloque de conexiones""" self.connect(self.listView2, SIGNAL("selectionChanged ()"), self.__cambiar_elemento) self.connect(self.pushButton2, SIGNAL("clicked()"), self.reject) self.connect(self.pushButton1, SIGNAL("clicked()"), self.accept) def __init_arbol(self): """Inicializa el arbol con todas las operaciones conocidas """ self.listView2.clear() listalistasetiquetas = [operacion.etiquetas for operacion in self.__gestoroperaciones.values()] from Driza import categorias from sets import Set arbol = categorias.conv_categorias_arbol("Raiz", listalistasetiquetas) for hijo in arbol.enlaces: conv_arbol_listview(self.listView2, hijo) #FIXME No todos las operaciones van en elementos finales. conv_arbol_listview esta mal listaelementosfinales = listview_elementos_finales(self.listView2) for operacion in self.__gestoroperaciones.values(): for elementofinal in listaelementosfinales: if Set(operacion.etiquetas) == elementofinal[1]: QListViewItem(elementofinal[0], operacion.nombre) def __init_dic_widgets(self): """Inicializa los diccionarios de widgets, que permiten el acceso posterior a estos""" self.__diccionariowidgets["categorias"] = {} self.__diccionariowidgets["operaciones"] = {} self.__diccionariowidgets["otros"] = {} def __init_dic_widgets_otros(self): """Inicializa el diccionario de widgets en la categoria otros""" noimplementado = QLabel(None, "No implementado") noimplementado.setText("No implementado") condicionesincorrectas = QLabel(None, "No se dan las condiciones adecuadas") condicionesincorrectas.setText("No se dan las condiciones adecuadas") self.__diccionariowidgets["otros"]["condicionesincorrectas"] = condicionesincorrectas self.__diccionariowidgets["otros"]["noimplementado"] = noimplementado self.widgetStack1.addWidget(noimplementado) self.widgetStack1.addWidget(condicionesincorrectas) def __init_widgets_categorias(self): """Inicializa los widgets de cada categoria""" from sets import ImmutableSet for categoria in self.__gestorcategorias.listacategorias: tmpset = ImmutableSet(categoria.etiquetas) label = QLabel(None, "") label.setAlignment(QLabel.WordBreak) label.setText(categoria.descripcion) self.__diccionariowidgets["categorias"][tmpset] = label self.widgetStack1.addWidget(label) def __init_widgets_operaciones(self): """Añade los widgets en el widgetstack y en el diccionario de widgets""" for titulo, operacion in self.__gestoroperaciones.items(): widget = self.__render_widget(titulo, operacion.widget) self.__diccionariowidgets["operaciones"][titulo] = widget self.widgetStack1.addWidget(widget) def __myUpdate(self): """Es llamado por showEvent, garantiza la actualización de los elementos""" self.__mostrar_arbol() self.__mostrar_widget() def __render_widget(self, nombre, diccionariowidget): """Renderiza un widget a partir de una descripcion en dicccionario""" from Driza.listas import SL if not SL.TIPOSWIDGETOPERACIONESQT3.has_key(diccionariowidget["tipo"]): raise NameError from Driza.iuqt3.operaciones.woperaciones import WidgetOperacionSelectorOpcion widget = WidgetOperacionSelectorOpcion(nombre, \ SL.TIPOSWIDGETOPERACIONESQT3[diccionariowidget["tipo"]]["seleccion"], \ diccionariowidget["opciones"], self.__idu) return widget def __mostrar_arbol(self): """Muestra el arbol segun el contenido de gestoroperaciones""" self.listView2.ensureItemVisible(self.listView2.findItem(self.__operacion, 0)) self.listView2.setCurrentItem(self.listView2.findItem(self.__operacion, 0)) def __mostrar_widget(self): """Muestra el widget asociado a la seleccion actual""" from sets import Set, ImmutableSet nombre = unicode(self.listView2.currentItem().text(0).latin1(),'iso-8859-1') listaetiquetas = self.__tags() LOG.debug('mostrando widget:' + nombre) if self.__gestoroperaciones.has_key(nombre) and \ Set(listaetiquetas[:-1]) == Set(self.__gestoroperaciones[nombre].etiquetas): if self.__gestoroperaciones.funcionchequeocondiciones(nombre): self.widgetStack1.raiseWidget(self.__diccionariowidgets["operaciones"][nombre]) else: self.widgetStack1.raiseWidget(self.__diccionariowidgets["otros"]["condicionesincorrectas"]) elif self.__gestorcategorias.obtener_categoria_aprox(listaetiquetas) != False: labelaprox = ImmutableSet(self.__gestorcategorias.obtener_categoria_aprox(listaetiquetas).etiquetas) self.widgetStack1.raiseWidget(self.__diccionariowidgets["categorias"][labelaprox]) else: LOG.debug("No encontro widget apropiado para la categoria") self.widgetStack1.raiseWidget(self.__diccionariowidgets["otros"]["noimplementado"]) def __tags(self): """Devuelve las tags asociadas al item actual""" return tags_de_item(self.listView2.currentItem())