#!/usr/bin/env python # -*- coding: utf-8 -*- from PyQt4.QtGui import QGroupBox, QPalette, QColor import ConductivityGroupBox import PeakGroupBox import PowerLawGroupBox __author__ = 'markusro' from PyQt4 import QtGui from PyQt4.QtGui import * from PyQt4.QtCore import QRegExp, pyqtSignal #import PeakWidget class LogFSpinBox(QDoubleSpinBox): scientificNotationValidator = QRegExpValidator(QRegExp("[+-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?")) def __init__(self, parent = None): super(LogFSpinBox, self).__init__(parent) self.setRange(1e-16,1e16) self.setMinimum(1e-16) self.setDecimals(17) self.setValue(1.0) def stepBy(self, up_down): print self.minimum(),self.maximum() if self.value() != 0.0: self.setValue(self.value()*10**(up_down/9.0)) # 19 steps per decade def textFromValue(self, value): return "%.3e"%value def valueFromText(self, str_value): return str_value.toDouble()[0] def validate(self, str_value, p_int): return self.scientificNotationValidator.validate(str_value, p_int) class ParameterWidget(QWidget): def __init__(self, parent = None): super(ParameterWidget, self).__init__(parent) self.vlayout = QVBoxLayout(self) self.vlayout.addSpacerItem(QSpacerItem(10,10,QSizePolicy.Minimum, QSizePolicy.Expanding) ) self.vlayout.addSpacerItem(QSpacerItem(10,10,QSizePolicy.Minimum, QSizePolicy.Expanding) ) #self.vlayout.addStretch(1) if __name__ == "__main__": app = QApplication([]) class PeakWidget(QGroupBox): changedTable = pyqtSignal() removeMe = pyqtSignal() def __init__(self, parent=None): QGroupBox.__init__(self) super(PeakWidget, self).__init__(parent) self.ui = PeakGroupBox.Ui_PeakGroupBox() # replace eps and tau with LogFSpinBox self.ui.setupUi(self) self.ui.doubleSpinBox_1.setParent(None) self.ui.doubleSpinBox_1 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_1,1,1) self.ui.doubleSpinBox_2.setParent(None) self.ui.doubleSpinBox_2 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_2,2,1) self.inputs = [ self.ui.doubleSpinBox_1, self.ui.doubleSpinBox_2, self.ui.doubleSpinBox_3, self.ui.doubleSpinBox_4 ] self.errors = [ self.ui.label_5, self.ui.label_6, self.ui.label_7, self.ui.label_8, ] for dsb in self.inputs: dsb.valueChanged.connect(self.changeValues) self.fixedCheckBoxes = [self.ui.checkBox_1, self.ui.checkBox_2, self.ui.checkBox_3, self.ui.checkBox_4] # self.ui.checkBox_3.stateChanged.connect(self._distrib_cc) # self.ui.checkBox_4.stateChanged.connect(self._distrib_cd) self.ui.comboBox.currentIndexChanged.connect(self._distrib_select) self.ui.removeButton.clicked.connect(self.remove) def remove(self): self.removeMe.emit() def changeValues(self): self.changedTable.emit() def _distrib_select(self, dist): if dist == 0: # hav-neg: self.ui.checkBox_3.setChecked(False) self.ui.checkBox_3.setDisabled(False) self.ui.checkBox_4.setChecked(False) self.ui.checkBox_3.setDisabled(False) self.ui.doubleSpinBox_3.setDisabled(False) self.ui.doubleSpinBox_4.setDisabled(False) if dist == 1: # Cole-Cole: self._distrib_cc(1) if dist == 2: # Cole-Davidson self._distrib_cd(1) def _distrib_cd(self, state): if state: self.ui.doubleSpinBox_3.setValue(1.0) self.ui.doubleSpinBox_3.setDisabled(True) self.ui.doubleSpinBox_4.setDisabled(False) self.ui.checkBox_3.setChecked(True) self.ui.checkBox_3.setDisabled(True) self.ui.checkBox_4.setChecked(False) else: self.ui.doubleSpinBox_3.setDisabled(False) def _distrib_cc(self, state): if state: self.ui.doubleSpinBox_4.setValue(1.0) self.ui.doubleSpinBox_4.setDisabled(True) self.ui.doubleSpinBox_3.setDisabled(False) self.ui.checkBox_3.setChecked(False) self.ui.checkBox_4.setChecked(True) self.ui.checkBox_4.setDisabled(True) else: self.ui.doubleSpinBox_4.setDisabled(False) def fixedParameter(self): return [0 if cb.isChecked() else 1 for cb in self.fixedCheckBoxes] def setId(self, id): self.id = id self.setTitle("Peak %i" % id) def setColor(self, color): palette = self.palette() palette.setColor(QPalette.Foreground, color) self.setPalette(palette) def peakParameter(self): tmp = [i.value() for i in self.inputs] return tmp def update(self): self.changedTable.emit() def updateTable(self, beta=None, sd_beta = None): #print "updateTable", args for i, arg in enumerate(beta): self.inputs[i].setValue(arg) sd_style="" if i in (0,1) and sd_beta is not None: sd = "+/- %.3e"%(sd_beta[i]) elif i in (2,3) and sd_beta is not None: sd = "+/- %.2f"%(sd_beta[i]) if sd_beta is not None: if 0.0 < sd_beta[i]/arg < 0.2: sd_style="background-color: rgba(0, 255, 0, 64);" if 0.2 < sd_beta[i]/arg < 1.0: sd_style="background-color: rgba(255,255, 0, 64);" elif sd_beta[i]/arg > 1.0: sd_style="background-color: rgba(255, 0, 0, 64);" else: sd = "( --- )" self.errors[i].setStyleSheet(sd_style) self.errors[i].setText(sd) def killme(self): self.setParent(None) class ConductivityWidget(QGroupBox): changedTable = pyqtSignal() removeMe = pyqtSignal() def __init__(self, parent=None): QGroupBox.__init__(self) super(ConductivityWidget, self).__init__(parent) self.setTitle(u"Conductivity …") self.ui = ConductivityGroupBox.Ui_ConductivityGroupBox() self.ui.setupUi(self) # eps_static #self.ui.doubleSpinBox_1.setParent(None) #self.ui.doubleSpinBox_1 = LogFSpinBox(self) #self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_1,1,1) # dc_conductivity self.ui.doubleSpinBox_2.setParent(None) self.ui.doubleSpinBox_2 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_2,2,1) self.errors = [ self.ui.label_4, self.ui.label_5, self.ui.label_6, ] self.inputs = [self.ui.doubleSpinBox_1, self.ui.doubleSpinBox_2, self.ui.doubleSpinBox_3] self.fixedCheckBoxes = [self.ui.checkBox_1, self.ui.checkBox_2, self.ui.checkBox_3] for dsb in self.inputs: dsb.valueChanged.connect(self.changeValues) self.ui.removeButton.clicked.connect(self.remove) def remove(self): self.removeMe.emit() def changeValues(self, num): self.changedTable.emit() def fixedParameter(self): return [0 if cb.isChecked() else 1 for cb in self.fixedCheckBoxes] def setColor(self, color): r, g, b = color palette = self.palette() palette.setColor(QPalette.Foreground, QColor(r, g, b)) self.setPalette(palette) def getTable(self): tmp = [i.value() # selects the number, ignores the status for i in self.inputs] #print "peakParams:", tmp return tmp def update(self): self.changedTable.emit() def updateTable(self, beta, sd_beta=None): for i, arg in enumerate(beta): self.inputs[i].setValue(arg) sd_style="" if i in (1,) and sd_beta is not None: sd = "+/- %.3e"%(sd_beta[i]) elif i in (0,2) and sd_beta is not None: sd = "+/- %.2f"%(sd_beta[i]) if sd_beta is not None: if 0.0 < sd_beta[i]/arg < 0.2: sd_style="background-color: rgba(0, 255, 0, 64);" if 0.2 < sd_beta[i]/arg < 1.0: sd_style="background-color: rgba(255,255, 0, 64);" elif sd_beta[i]/arg > 1.0: sd_style="background-color: rgba(255, 0, 0, 64);" else: sd = "( --- )" self.errors[i].setStyleSheet(sd_style) self.errors[i].setText(sd) class PowerLawWidget(QGroupBox): changedTable = pyqtSignal() removeMe = pyqtSignal() def __init__(self, parent=None): QGroupBox.__init__(self) super(PowerLawWidget, self).__init__(parent) self.setTitle(u"Conductivity …") self.ui = PowerLawGroupBox.Ui_PowerLawGroupBox() self.ui.setupUi(self) self.ui.doubleSpinBox_2.setParent(None) self.ui.doubleSpinBox_2 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_2,1,1) self.errors = [self.ui.label_5, self.ui.label_6] self.inputs = [self.ui.doubleSpinBox_2, self.ui.doubleSpinBox_3] self.fixedCheckBoxes = [ self.ui.checkBox_2, self.ui.checkBox_3] for dsb in self.inputs: dsb.valueChanged.connect(self.changeValues) self.ui.removeButton.clicked.connect(self.remove) def remove(self): self.removeMe.emit() def changeValues(self, num): self.changedTable.emit() def fixedParameter(self): return [0 if cb.isChecked() else 1 for cb in self.fixedCheckBoxes] def setColor(self, color): r, g, b = color palette = self.palette() palette.setColor(QPalette.Foreground, QColor(r, g, b)) self.setPalette(palette) def getTable(self): tmp = [i.value() # selects the number, ignores the status for i in self.inputs] #print "peakParams:", tmp return tmp def update(self): self.changedTable.emit() def updateTable(self, beta, sd_beta=None): for i, arg in enumerate(beta): self.inputs[i].setValue(arg) sd_style="" if i in (0,) and sd_beta is not None: sd = "+/- %.3e"%(sd_beta[i]) elif i in (1,) and sd_beta is not None: sd = "+/- %.2f"%(sd_beta[i]) if sd_beta is not None: if 0.0 < sd_beta[i]/arg < 0.2: sd_style="background-color: rgba(0, 255, 0, 64);" if 0.2 < sd_beta[i]/arg < 1.0: sd_style="background-color: rgba(255,255, 0, 64);" elif sd_beta[i]/arg > 1.0: sd_style="background-color: rgba(255, 0, 0, 64);" else: sd = "( --- )" self.errors[i].setStyleSheet(sd_style) self.errors[i].setText(sd)