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)
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)
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
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))
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)
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)
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)