source: sasview/src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py @ e1e3e09

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 e1e3e09 was e1e3e09, checked in by Piotr Rozyczko <rozyczko@…>, 7 years ago

Refactor instrumental smearing tab + make it functional

  • Property mode set to 100755
File size: 4.6 KB
Line 
1"""
2Widget/logic for smearing data.
3"""
4from PyQt4 import QtGui
5from PyQt4 import QtCore
6
7from sas.sasgui.guiframe.dataFitting import Data1D
8from sas.sasgui.guiframe.dataFitting import Data2D
9
10# Local UI
11from UI.SmearingWidgetUI import Ui_SmearingWidgetUI
12
13class DataWidgetMapper(QtGui.QDataWidgetMapper):
14    def addMapping(self, widget, section, propertyName=None):
15        if propertyName is None:
16            super(DataWidgetMapper, self).addMapping(widget, section)
17        else:
18            super(DataWidgetMapper, self).addMapping(widget, section, propertyName)
19
20        if isinstance(widget, QtGui.QComboBox):
21            delegate = self.itemDelegate()
22            widget.currentIndexChanged.connect(lambda: delegate.commitData.emit(widget))
23
24SMEARING_1D = ["Custom Pinhole Smear", "Custom Slit Smear"]
25SMEARING_2D = ["Custom Pinhole Smear"]
26
27MODEL = [
28    'SMEARING',
29    'PINHOLE_MIN',
30    'PINHOLE_MAX',
31    'ACCURACY']
32
33class SmearingWidget(QtGui.QWidget, Ui_SmearingWidgetUI):
34    def __init__(self, parent=None):
35        super(SmearingWidget, self).__init__()
36
37        self.setupUi(self)
38        self.cbSmearing.currentIndexChanged.connect(self.onIndexChange)
39        self.cbSmearing.setCurrentIndex(0)
40        self.is_data = None
41        self.model = None
42        self.mapper = None
43
44        self.initModel()
45        self.initMapper()
46
47    def initModel(self):
48        """
49        Initialize the state
50        """
51        self.model = QtGui.QStandardItemModel()
52        for model_item in xrange(len(MODEL)):
53            self.model.setItem(model_item, QtGui.QStandardItem())
54
55        self.model.dataChanged.connect(self.onModelChange)
56
57        ##self.modelReset()
58
59    def initMapper(self):
60        """
61        Initialize model item <-> UI element mapping
62        """
63        #self.mapper = QtGui.QDataWidgetMapper(self)
64        self.mapper = DataWidgetMapper(self)
65
66        self.mapper.setModel(self.model)
67        self.mapper.setOrientation(QtCore.Qt.Vertical)
68
69        self.mapper.addMapping(self.txtSmearUp,   MODEL.index('PINHOLE_MIN'))
70        self.mapper.addMapping(self.txtSmearDown, MODEL.index('PINHOLE_MAX'))
71        self.mapper.addMapping(self.cbSmearing,   MODEL.index('SMEARING'))
72        self.mapper.addMapping(self.cbAccuracy,   MODEL.index('ACCURACY'))
73        self.mapper.toFirst()
74
75    def updateSmearing(self, data=None):
76        """
77        Update control elements based on data passed
78        """
79        self.cbSmearing.clear()
80        self.cbSmearing.addItem("None")
81        self.cbAccuracy.setVisible(False)
82
83        if data is None:
84            self.setElementsVisibility(False)
85        elif isinstance(data, Data1D):
86            self.cbSmearing.addItems(SMEARING_1D)
87            self.is_data = Data1D
88        else:
89            self.cbSmearing.addItems(SMEARING_2D)
90            self.is_data = Data2D
91        self.cbSmearing.setCurrentIndex(0)
92
93    def onIndexChange(self, index):
94        """
95        Callback for smearing combobox index change
96        """
97        if index == 0:
98            self.setElementsVisibility(False)
99            return
100        elif index == 1:
101            self.setElementsVisibility(True)
102            self.setPinholeLabels()
103        elif index == 2:
104            self.setElementsVisibility(True)
105            self.setSlitLabels()
106
107    def onModelChange(self, top, bottom):
108        """
109        """
110        print "MODEL CHANGED: ", top, bottom
111        pass
112
113    def setElementsVisibility(self, visible):
114        """
115        Labels and linedits visibility control
116        """
117        self.lblSmearDown.setVisible(visible)
118        self.lblSmearUp.setVisible(visible)
119        self.txtSmearDown.setVisible(visible)
120        self.txtSmearUp.setVisible(visible)
121        self.label_14.setVisible(visible)
122        self.label_15.setVisible(visible)
123        self.setAccuracyVisibility()
124
125    def setAccuracyVisibility(self):
126        """
127        Accuracy combobox visibility
128        """
129        if self.is_data == Data2D and self.cbSmearing.currentIndex() == 1:
130            self.cbAccuracy.setVisible(True)
131        else:
132            self.cbAccuracy.setVisible(False)
133
134    def setPinholeLabels(self):
135        """
136        Use pinhole labels
137        """
138        self.lblSmearUp.setText('<html><head/><body><p>dQ<span style=" vertical-align:sub;">low</span></p></body></html>')
139        self.lblSmearDown.setText('<html><head/><body><p>dQ<span style=" vertical-align:sub;">high</span></p></body></html>')
140
141    def setSlitLabels(self):
142        """
143        Use pinhole labels
144        """
145        self.lblSmearUp.setText('Slit height')
146        self.lblSmearDown.setText('Slit width')
147
148    def state(self):
149        """
150        Returns current state of controls
151        """
152       
Note: See TracBrowser for help on using the repository browser.