qdsfit/CustomWidgets.py

351 lines
11 KiB
Python

#!/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)