source: sasview/src/sas/qtgui/DensityPanel.py @ f140169

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalc
Last change on this file since f140169 was f140169, checked in by Piotr Rozyczko <rozyczko@…>, 8 years ago

fixed size widget

  • Property mode set to 100644
File size: 5.9 KB
Line 
1# global
2import logging
3import functools
4
5from periodictable import formula as Formula
6
7from PyQt4 import QtGui, QtCore
8
9# Local UI
10from UI.DensityPanel import Ui_DensityPanel
11
12def enum(*sequential, **named):
13    enums = dict(zip(sequential, range(len(sequential))), **named)
14    return type('Enum', (), enums)
15
16MODEL = enum(
17    'MOLECULAR_FORMULA',
18    'MOLAR_MASS',
19    'MOLAR_VOLUME',
20    'MASS_DENSITY',
21)
22
23MODES = enum(
24    'VOLUME_TO_DENSITY',
25    'DENSITY_TO_VOLUME',
26)
27
28def toMolarMass(formula):
29    AVOGADRO = 6.02214129e23
30
31    try:
32        f = Formula(str(formula))
33        return "%g" % (f.molecular_mass * AVOGADRO)
34    except:
35        return ""
36
37
38class FormulaValidator(QtGui.QValidator):
39    def __init__(self, parent=None):
40        super(FormulaValidator, self).__init__(parent)
41 
42    def validate(self, input, pos):
43        try:
44            Formula(str(input))
45            self._setStyleSheet("")
46            return QtGui.QValidator.Acceptable, pos
47
48        except Exception as e:
49            self._setStyleSheet("background-color:pink;")
50            return QtGui.QValidator.Intermediate, pos
51
52    def _setStyleSheet(self, value):
53        try:
54            if self.parent():
55                self.parent().setStyleSheet(value)
56        except:
57            pass
58
59
60class DensityPanel(QtGui.QDialog):
61
62    def __init__(self, parent=None):
63        super(DensityPanel, self).__init__()
64
65        self.mode = None
66        self.manager = parent
67        self.setupUi()
68        self.setupModel()
69        self.setupMapper()
70
71    def setupUi(self):
72        self.ui = Ui_DensityPanel()
73        self.ui.setupUi(self)
74
75        # no reason to have this widget resizable
76        self.setFixedSize(self.minimumSizeHint())
77
78        # set validators
79        self.ui.editMolecularFormula.setValidator(FormulaValidator(self.ui.editMolecularFormula))
80
81        rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?")
82        self.ui.editMolarVolume.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMolarVolume))
83        self.ui.editMassDensity.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMassDensity))
84
85        # signals
86        self.ui.editMolarVolume.textEdited.connect(functools.partial(self.setMode, MODES.VOLUME_TO_DENSITY))
87        self.ui.editMassDensity.textEdited.connect(functools.partial(self.setMode, MODES.DENSITY_TO_VOLUME))
88
89        self.ui.buttonBox.button(QtGui.QDialogButtonBox.Reset).clicked.connect(self.modelReset)
90        self.ui.buttonBox.button(QtGui.QDialogButtonBox.Help).clicked.connect(self.displayHelp)
91
92    def setupModel(self):
93        self.model = QtGui.QStandardItemModel(self)
94        self.model.setItem(MODEL.MOLECULAR_FORMULA, QtGui.QStandardItem())
95        self.model.setItem(MODEL.MOLAR_MASS       , QtGui.QStandardItem())
96        self.model.setItem(MODEL.MOLAR_VOLUME     , QtGui.QStandardItem())
97        self.model.setItem(MODEL.MASS_DENSITY     , QtGui.QStandardItem())
98
99        self.model.dataChanged.connect(self.dataChanged)
100
101        self.modelReset()
102
103    def setupMapper(self):
104        self.mapper = QtGui.QDataWidgetMapper(self)
105        self.mapper.setModel(self.model)
106        self.mapper.setOrientation(QtCore.Qt.Vertical)
107
108        self.mapper.addMapping(self.ui.editMolecularFormula, MODEL.MOLECULAR_FORMULA)
109        self.mapper.addMapping(self.ui.editMolarMass       , MODEL.MOLAR_MASS)
110        self.mapper.addMapping(self.ui.editMolarVolume     , MODEL.MOLAR_VOLUME)
111        self.mapper.addMapping(self.ui.editMassDensity     , MODEL.MASS_DENSITY)
112
113        self.mapper.toFirst()
114
115    def dataChanged(self, top, bottom):
116        for index in xrange(top.row(), bottom.row() + 1):
117            if index == MODEL.MOLECULAR_FORMULA:
118                molarMass = toMolarMass(self.model.item(MODEL.MOLECULAR_FORMULA).text())
119                self.model.item(MODEL.MOLAR_MASS).setText(molarMass)
120
121                if self.mode == MODES.VOLUME_TO_DENSITY:
122                    self._updateDensity()
123                elif self.mode == MODES.DENSITY_TO_VOLUME:
124                    self._updateVolume()
125
126            elif index == MODEL.MOLAR_VOLUME and self.mode == MODES.VOLUME_TO_DENSITY:
127                self._updateDensity()
128
129            elif index == MODEL.MASS_DENSITY and self.mode == MODES.DENSITY_TO_VOLUME:
130                self._updateVolume()
131
132    def setMode(self, mode):
133        self.mode = mode
134
135    def _updateDensity(self):
136        try:
137            molarMass = float(toMolarMass(self.model.item(MODEL.MOLECULAR_FORMULA).text()))
138            molarVolume = float(self.model.item(MODEL.MOLAR_VOLUME).text())
139
140            molarDensity = molarMass / molarVolume
141            self.model.item(MODEL.MASS_DENSITY).setText(str(molarDensity))
142
143        except (ArithmeticError, ValueError):
144            self.model.item(MODEL.MASS_DENSITY).setText("")
145
146    def _updateVolume(self):
147        try:
148            molarMass = float(toMolarMass(self.model.item(MODEL.MOLECULAR_FORMULA).text()))
149            molarDensity = float(self.model.item(MODEL.MASS_DENSITY).text())
150
151            molarVolume = molarMass / molarDensity
152            self.model.item(MODEL.MOLAR_VOLUME).setText(str(molarVolume))
153
154        except (ArithmeticError, ValueError):
155            self.model.item(MODEL.MOLAR_VOLUME).setText("")
156
157    def modelReset(self):
158        #self.model.beginResetModel()
159        try:
160            self.setMode(None)
161            self.model.item(MODEL.MOLECULAR_FORMULA).setText("H2O")
162            self.model.item(MODEL.MOLAR_VOLUME     ).setText("")
163            self.model.item(MODEL.MASS_DENSITY     ).setText("")
164        finally:
165            pass
166            #self.model.endResetModel()
167
168    def displayHelp(self):
169        try:
170            location = self.manager.HELP_DIRECTORY_LOCATION + \
171                "/user/sasgui/perspectives/calculator/density_calculator_help.html"
172
173            self.manager._helpView.load(QtCore.QUrl(location))
174            self.manager._helpView.show()
175        except AttributeError:
176            # No manager defined - testing and standalone runs
177            pass
Note: See TracBrowser for help on using the repository browser.