예제 #1
0
    def __init__(self, matriz, titulo_corto, titulo_largo=None, parent=None):
        u"""
        Constructor de la clase.

        :param parent: Widget padre.
        """
        super(ShowMatrizDialog, self).__init__(parent)

        self.ShowMatrizD = Ui_MatrizDialog()
        self.ShowMatrizD.setupUi(self)

        self.setWindowFlags(QtCore.Qt.Dialog |
                            QtCore.Qt.WindowSystemMenuHint |
                            QtCore.Qt.WindowTitleHint |
                            QtCore.Qt.WindowMinMaxButtonsHint)

        self.matriz = matriz
        self.titulo_corto_dialogo = titulo_corto
        self.titulo_largo_dialogo = titulo_largo

        self.init_vars()
        self.initialize_dialog()
예제 #2
0
class ShowMatrizDialog(QtGui.QDialog):
    u"""
    Clase de diálogo 'Opciones' heredada de QDialog.
    """
    def __init__(self, matriz, titulo_corto, titulo_largo=None, parent=None):
        u"""
        Constructor de la clase.

        :param parent: Widget padre.
        """
        super(ShowMatrizDialog, self).__init__(parent)

        self.ShowMatrizD = Ui_MatrizDialog()
        self.ShowMatrizD.setupUi(self)

        self.setWindowFlags(QtCore.Qt.Dialog |
                            QtCore.Qt.WindowSystemMenuHint |
                            QtCore.Qt.WindowTitleHint |
                            QtCore.Qt.WindowMinMaxButtonsHint)

        self.matriz = matriz
        self.titulo_corto_dialogo = titulo_corto
        self.titulo_largo_dialogo = titulo_largo

        self.init_vars()
        self.initialize_dialog()

    def init_vars(self):
        self.window_config = {"item":
                              {"show_tooltip": False,
                               "size": 30}}

    def initialize_dialog(self):
        u"""
        Configura y establece estado de los widgets en el cuadro de diálogo.
        """
        self._set_dialog_signals()
        self.setWindowTitle(self.titulo_corto_dialogo)

        # Cachear acceso a atributos y métodos
        matriz = self.matriz
        tbl_set_item = self.ShowMatrizD.tblMatriz.setItem

        # Dimensiones de la matriz
        ancho_mat, alto_mat = matriz.shape

        # Dimensiones del GridWorld
        self.alto_gw = int(alto_mat ** 0.5)
        self.ancho_gw = int(ancho_mat ** 0.5)

        alto_gw = self.alto_gw
        ancho_gw = self.ancho_gw

        ancho_estado_px = self.window_config["item"]["size"]
        # ancho_gw_px = ancho_estado_px * ancho_gw

        # Establecer propiedades visuales de la tabla
        self.ShowMatrizD.tblMatriz.setRowCount(alto_mat)
        self.ShowMatrizD.tblMatriz.setColumnCount(ancho_mat)
        self.ShowMatrizD.tblMatriz.setMouseTracking(True)

        # Desactivar actualización de la tabla para optimizar la carga
        self.ShowMatrizD.tblMatriz.setUpdatesEnabled(False)

        headers_horizontales = []
        headers_verticales = []

        for fila in xrange(alto_mat):
            # Coordenadas del estado
            coord_x = int(fila / alto_gw)
            coord_y = fila - (coord_x * ancho_gw)

            # Armar headers horizontales (Acciones)
            headers_horizontales.append("A{0}\n({1},{2})".format(fila + 1,
                                                                 coord_x + 1,
                                                                 coord_y + 1))

            # Armar headers verticales (Estados)
            headers_verticales.append("E{0} ({1},{2})".format(fila + 1,
                                                              coord_x + 1,
                                                              coord_y + 1))

        # Ítem para transición válida
        item_bg_color_val = QtGui.QColor("#FFFFFF")
        item_flags_val = QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable

        # Ítem para transición inválida
        item_bg_color_inv = QtGui.QColor(240, 240, 240)
        item_flags_inv = QtCore.Qt.ItemIsEnabled
        item_text_align = QtCore.Qt.AlignHCenter | QtCore.Qt.AlignCenter

        for i, accion in numpy.ndenumerate(matriz):
            if numpy.isnan(accion):
                item = QtGui.QTableWidgetItem('-')
                item.setBackgroundColor(item_bg_color_inv)
                item.setFlags(item_flags_inv)
                item.setTextAlignment(item_text_align)
            else:
                # Cada item muestra el valor asociado a la acción
                if isinstance(accion, float):
                    item = QtGui.QTableWidgetItem("{0:.2f}".format(accion))
                elif isinstance(accion, int):
                    item = QtGui.QTableWidgetItem(str(accion))

                item.setBackgroundColor(item_bg_color_val)
                item.setFlags(item_flags_val)
                item.setTextAlignment(item_text_align)

            # Coordenadas de origen
            coord_x_orig = int(i[0] / alto_gw)
            coord_y_orig = i[0] - (coord_x_orig * ancho_gw)

            # Coordenadas de destino
            coord_x_dest = int(i[1] / alto_gw)
            coord_y_dest = i[1] - (coord_x_dest * ancho_gw)

            item.setToolTip(u"({0},{1}) --> ({2},{3})".format(coord_x_orig + 1,
                                                              coord_y_orig + 1,
                                                              coord_x_dest + 1,
                                                              coord_y_dest + 1))

            # Agregar ítem a GridWorld
            tbl_set_item(i[0], i[1], item)

        self.ShowMatrizD.tblMatriz.setHorizontalHeaderLabels(headers_horizontales)
        self.ShowMatrizD.tblMatriz.setVerticalHeaderLabels(headers_verticales)

        # Reactivar la actualización de la tabla
        self.ShowMatrizD.tblMatriz.setUpdatesEnabled(True)

        self.ShowMatrizD.tblMatriz.horizontalHeader().setDefaultSectionSize(ancho_estado_px)
        self.ShowMatrizD.tblMatriz.horizontalHeader().setResizeMode(QtGui.QHeaderView.Fixed)
        self.ShowMatrizD.tblMatriz.verticalHeader().setDefaultSectionSize(ancho_estado_px)
        self.ShowMatrizD.tblMatriz.verticalHeader().setResizeMode(QtGui.QHeaderView.Fixed)
        self.ShowMatrizD.tblMatriz.resizeColumnsToContents()

    def _set_dialog_signals(self):
        self.ShowMatrizD.tblMatriz.itemEntered.connect(self.mostrar_info_item)

    def mostrar_info_item(self, item):
        nro_estado = item.row()
        nro_accion = item.column()
        item_valor = str(item.text())

        try:
            item_text = "Valor = {0}".format(float(item_valor))
        except ValueError:
            item_text = "Sin transición"

        self.ShowMatrizD.lblMatrizItemInfo.setText(_tr("Estado {0} --> Acción {1} ({2})"
                                                       .format(nro_estado,
                                                               nro_accion,
                                                               item_text)))

    def accept(self):
        super(ShowMatrizDialog, self).accept()

    def reject(self):
        super(ShowMatrizDialog, self).reject()