Beispiel #1
0
 def flipFlop(self, line, value):
     # puede ser un poco repetitivo, pero no se si es mas costoso el enable/disable que comprobar cada
     # vez si lo esta. Por lo menos el codigo es menos complejo y todavia no veo una razon para modificarlo
     if not is_number(value):
         return
     if value == 0:
         self.sheet.setEnabled(line, 1, False)
         self.sheet.setEnabled(line, 2, False)
     elif value == 1:
         self.sheet.setEnabled(line, 1, True)
         self.sheet.setEnabled(line, 2, False)
     else:
         self.sheet.setEnabled(line, 1, True)
         self.sheet.setEnabled(line, 2, True)
Beispiel #2
0
 def setupModel(self):
     self.vista.toNewTree2D()
     array = self.vista.toExpandedArray(self.vista)
     self.setRowCount(len(array))
     self.setColumnCount(len(array[0]))
     for i, linea in enumerate(array):
         for j, columna in enumerate(linea):
             item = QTableWidgetItem(str(columna) if columna else '')
             if i < self.vista.dim_col:
                 item.setBackground(QColor(Qt.lightGray))
             if j < self.vista.dim_row:
                 item.setBackground(QColor(Qt.lightGray))
             if is_number(columna):
                 item.setTextAlignment(Qt.AlignRight)
             else:
                 item.setTextAlignment(Qt.AlignLeft)
             self.setItem(i, j, item)
Beispiel #3
0
    def __getitem__(self, key):

        x, y = keyCoord(key)
        if x is not None and y is not None:
            item = self.model.item(y, x)
            c = item.data(Qt.UserRole + 1)
            if is_number(c):
                c = s2n(c)
        else:
            item = None
            c = key
        if isinstance(c, str) and c[0] == '=':
            while True:
                try:
                    resultado = eval(c[1:], SpreadSheet.tools, self)
                    #self._cells.clear()
                    return resultado
                except NameError as ne:
                    dato = ne.args[0][6:-16]
                    self._cells[dato] = self[dato]

        else:
            return c
        return c
Beispiel #4
0
 def setCurrentValue(self, value, role=Qt.UserRole):
     #TODO ¿y si es una estructura?
     if is_number(value):
         self.setCurrentIndex(value)
     else:
         self.setCurrentIndex(self.index(value, DISP))
Beispiel #5
0
def setWidgetData(parent, editor, dato, valor_defecto):
    if isinstance(editor, WMultiList):
        if dato:
            editor.setEntries(dato)
        if not dato and valor_defecto is not None:
            editor.selectEntry(valor_defecto)

    elif isinstance(
            editor,
        (WComboMulti,
         )):  # WMC siemre antes que QCB porque es una especializacion
        for entrada in dato:
            editor.set(entrada)
        if len(dato) == 0 and valor_defecto is not None:
            editor.set(valor_defecto)
    elif isinstance(editor, WComboBox):
        if dato:
            editor.setCurrentValue(dato)
        elif valor_defecto:
            editor.setCurrentValue(valor_defecto)
        else:
            editor.setCurrentIndex(-1)
    elif isinstance(editor, WComboBoxIdx):
        if dato:
            if is_number(dato):
                editor.setCurrentIndex(dato)
            else:
                editor.setCurrentIndex(parent.currentList.index(dato))
        elif valor_defecto:
            if is_number(valor_defecto):
                editor.setCurrentIndex(valor_defecto)
            else:
                editor.setCurrentIndex(parent.currentList.index(valor_defecto))
        else:
            editor.setCurrentIndex(-1)

    elif isinstance(editor, QComboBox):
        if dato:
            editor.setCurrentIndex(editor.findText(dato))
        elif valor_defecto:
            editor.setCurrentIndex(editor.findText(valor_defecto))
        else:
            editor.setCurrentIndex(-1)

    elif isinstance(editor, QSpinBox):
        if dato:
            editor.setValue(int(dato))
        elif valor_defecto:
            editor.setValue(int(valor_defecto))
        else:
            editor.setValue(1)

    elif isinstance(editor, QCheckBox):
        if dato is not None:
            editor.setCheckState(dato)
        else:
            if valor_defecto:
                editor.setChecked(valor_defecto)
            else:
                editor.setChecked(False)

    elif isinstance(editor, QTextEdit):
        # FIXME esto tiene que mejorar. Solo me sirve para el caso de case_sql
        if dato is not None:
            editor.setText(dato)
        else:
            editor.setText(valor_defecto)
        editor.setMinimumHeight(220)
        #editor.resize(editor.document().size().width(), editor.document().size().height() + 10)

    elif isinstance(editor, WPowerTable):
        for x, linea in enumerate(dato):
            for y in range(len(linea)):
                editor.set(x, y, linea[y])
        editor.resizeRowsToContents()
    elif isinstance(editor, QDialog):
        if dato:
            editor.setData(dato)
        elif valor_defecto is not None:
            editor.setData(valor_defecto)
    else:
        if dato is not None:
            editor.setText(dato)
        elif valor_defecto is not None:
            editor.setText(valor_defecto)
Beispiel #6
0
    def data(self, index, role):
        """
        Reimplementation of QStandardItemModel.data for the needs of danacube. It will be invoked when a view associated with the model is redrawn
        
        * Input parameters
            * __index__ a QIndexModel which identifies the item
            * __role__ which Qt.Role are we handling
            
        * Programming notes
        We define special actions for following cases
            * Qt.BackgroundRole. Color if the conditions in TreeFormat are met 
            * Qt.DisplayRole. Formats the numeric vector
        """
        if not index.isValid():
            return None
        item = self.itemFromIndex(index)
        retorno = item.data(role)
        displayData = baseData = item.data(Qt.UserRole + 1)

        if role not in (Qt.DisplayRole,
                        Qt.UserRole + 2) and baseData and isinstance(
                            baseData, str) and baseData[0] == '=':
            displayData = self.data(index, Qt.UserRole + 2)

        if role == Qt.TextAlignmentRole:
            if not baseData:
                return retorno
            if is_number(displayData):
                return Qt.AlignRight | Qt.AlignVCenter
            else:
                return Qt.AlignLeft | Qt.AlignVCenter

        if role == Qt.BackgroundRole:
            if baseData is None:
                return retorno
            else:
                datos = baseData
                if datos is None or datos == '':
                    return retorno
                if is_number(displayData):
                    datos = float(displayData)
                    if self.datos.format['rednegatives'] and datos < 0:
                        retorno = QColor(Qt.red)
                    else:
                        return retorno
                else:
                    return retorno
            return retorno

        elif role == Qt.DisplayRole:
            if not baseData or baseData == '':
                return None
            if isinstance(baseData,
                          str) and len(baseData) > 0 and baseData[0] == '=':
                baseData = self.ss[baseData]
            if is_number(baseData):
                text, sign = fmtNumber(s2n(baseData), self.datos.format)
                return '{}{}'.format(sign if sign == '-' else '', text)
            else:
                return baseData

        elif role == Qt.UserRole + 2:  #es como el display pero sin formatos numericos
            if not baseData or baseData == '':
                return None
            if isinstance(baseData,
                          str) and len(baseData) > 0 and baseData[0] == '=':
                baseData = self.ss[baseData]
                return baseData
            else:
                return baseData
        else:
            return item.data(role)
Beispiel #7
0
    def accept(self):
        self.mensaje.setText(self.origMsg)
        fallo = False
        errorTxt = ''
        self.queryArray = []
        values = self.sheet.unloadData()
        for pos,item in enumerate(values):
            opcode = item[2]
            values = item[3]
            if opcode in ('is null','is not null'): #TODO, esto no es así
                self.queryArray.append((item[0],
                                    opcode.upper(),
                                    None,None))
                continue
            if not values: # or item[3] == '':  #Existe  de datos
                continue
            aslist = norm2List(values)
            #primero comprobamos la cardinalidad. Ojo en sentencias separadas o el elif no funciona bien
            if opcode in ('between','not between'): 
                if len(aslist) != 2:
                    errorTxt = 'La operacion between exige exactamente dos valores'
                    fallo = True
            elif opcode not in ('in','not in') :
                if len(aslist) != 1:
                    errorTxt = ' La operacion elegida exige un único valor'
                    fallo = True
            
            if not fallo:
                testElem = aslist[0].lower().strip()
                formato = item[1]
                if formato in ('numerico','entero') and not is_number(testElem):
                    # vago. no distingo entre ambos tipos numericos FIXME
                    errorTxt = 'No contiene un valor numerico aceptable'
                    fallo = True
                #elif formato in ('texto','binario'):
                    #pass
                elif formato in ('booleano',) and testElem not in ('true','false'):
                    errorTxt = 'Solo admitimos como booleanos: True y False'
                    fallo = True
                elif formato in ('fecha','fechahora','hora') and not isDate(testElem):
                    errorTxt = 'Formato o fecha incorrecta. Verifique que es del tipo AAAA-MM-DD HH:mm:SS'
                    fallo = True
                else:
                    pass

            if fallo:
                self.mensaje.setText('ERROR @{}: {}'.format(item[0],errorTxt))
                #self.sheet.cellWidget(pos,3).selectAll()  FIXME ¿que hay para combos ?
                self.sheet.setCurrentCell(pos,3)
                self.sheet.setFocus()
                return
            qfmt = 't'     
            if formato in ('entero','numerico'):
                qfmt = 'n'
            elif formato in ('fecha','fechahora','hora'):
                qfmt = 'f'
            elif formato in ('booleano'):
                qfmt = 'n' #me parece 
                
            self.queryArray.append((item[0],
                                opcode.upper(),
                                aslist[0] if len(aslist) == 1 else aslist,
                                qfmt))

        self.result = mergeStrings('AND',
                                    searchConstructor('where',where=self.queryArray,driver=self.driver),
                                    self.freeSql.text(),
                                    spaced=True)
        self.data = self.sheet.values()
        QDialog.accept(self)