Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py =================================================================== --- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py (revision 9d266d2a26a5ec599562e4892355fd031c3ef5ff) +++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py (revision e1e3e09a03e38fca76bc8ef51c8bfcc5d6441d3c) @@ -30,4 +30,5 @@ from sas.qtgui.Perspectives.Fitting.FittingLogic import FittingLogic from sas.qtgui.Perspectives.Fitting import FittingUtilities +from SmearingWidget import SmearingWidget TAB_MAGNETISM = 4 @@ -91,4 +92,11 @@ self.communicate = self.parent.communicate + # Smearing widget + layout = QtGui.QGridLayout() + self.smearing_widget = SmearingWidget(self) + layout.addWidget(self.smearing_widget) + #self.tabFitting.removeTab(2) + self.tabFitting.insertTab(2, self.smearing_widget, "Resolution") + # Define bold font for use in various controls self.boldFont=QtGui.QFont() @@ -161,5 +169,16 @@ self.logic.data = GuiUtils.dataFromItem(value) + # Overwrite data type descriptor + self.is2D = True if isinstance(self.logic.data, Data2D) else False + self.data_is_loaded = True + + # Enable/disable UI components + self.setEnablementOnDataLoad() + + def setEnablementOnDataLoad(self): + """ + Enable/disable various UI elements based on data loaded + """ # Tag along functionality self.label.setText("Data loaded from: ") @@ -173,4 +192,36 @@ self.txtNptsFit.setEnabled(False) self.chkLogData.setEnabled(False) + # Switch off Data2D control + self.chk2DView.setEnabled(False) + self.chk2DView.setVisible(False) + self.chkMagnetism.setEnabled(True) + + # Weighting and smearing controls + if self.is2D: + #self.slit_smearer.Disable() + #self.pinhole_smearer.Enable(True) + #self.default_mask = copy.deepcopy(self.data.mask) + if self.logic.data.err_data is None or\ + numpy.all(err == 1 for err in self.logic.data.err_data) or \ + not numpy.any(self.logic.data.err_data): + self.rbWeighting2.setEnabled(False) + self.rbWeighting1.setChecked(True) + else: + self.rbWeighting2.setEnabled(True) + self.rbWeighting2.setChecked(True) + else: + #self.slit_smearer.Enable(True) + #self.pinhole_smearer.Enable(True) + if self.logic.data.dy is None or\ + numpy.all(self.logic.data.dy == 1) or\ + not numpy.any(self.logic.data.dy): + self.rbWeighting2.setEnabled(False) + self.rbWeighting1.setChecked(True) + else: + self.rbWeighting2.setEnabled(True) + self.rbWeighting2.setChecked(True) + + # Smearing tab + self.smearing_widget.updateSmearing(self.data) def acceptsData(self): @@ -211,5 +262,6 @@ self.is2D = isChecked # Reload the current model - self.onSelectModel() + if self.kernel_module: + self.onSelectModel() def toggleLogData(self, isChecked): @@ -242,4 +294,6 @@ self.weightingGroup.addButton(self.rbWeighting3) self.weightingGroup.addButton(self.rbWeighting4) + # Smearing tab + self.smearing_widget.updateSmearing(self.data) def initializeSignals(self): @@ -251,5 +305,5 @@ self.cbCategory.currentIndexChanged.connect(self.onSelectCategory) self.cbModel.currentIndexChanged.connect(self.onSelectModel) - self.cbSmearing.currentIndexChanged.connect(self.onSelectSmearing) + #self.cbSmearing.currentIndexChanged.connect(self.onSelectSmearing) # Checkboxes self.chk2DView.toggled.connect(self.toggle2D) @@ -266,6 +320,6 @@ self.txtMinRange.editingFinished.connect(self.onMinRange) self.txtMaxRange.editingFinished.connect(self.onMaxRange) - self.txtSmearUp.editingFinished.connect(self.onSmearUp) - self.txtSmearDown.editingFinished.connect(self.onSmearDown) + #self.txtSmearUp.editingFinished.connect(self.onSmearUp) + #self.txtSmearDown.editingFinished.connect(self.onSmearDown) # Button groups self.weightingGroup.buttonClicked.connect(self.onWeightingChoice) @@ -717,6 +771,8 @@ # Check the state of the Weighting radio buttons button_id = self.weightingGroup.checkedId() + # Cast the id to a valid index button_id = abs(button_id + 2) if button_id == 0: + # No weight added return # Send original data for weighting Index: src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py =================================================================== --- src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py (revision e1e3e09a03e38fca76bc8ef51c8bfcc5d6441d3c) +++ src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py (revision e1e3e09a03e38fca76bc8ef51c8bfcc5d6441d3c) @@ -0,0 +1,152 @@ +""" +Widget/logic for smearing data. +""" +from PyQt4 import QtGui +from PyQt4 import QtCore + +from sas.sasgui.guiframe.dataFitting import Data1D +from sas.sasgui.guiframe.dataFitting import Data2D + +# Local UI +from UI.SmearingWidgetUI import Ui_SmearingWidgetUI + +class DataWidgetMapper(QtGui.QDataWidgetMapper): + def addMapping(self, widget, section, propertyName=None): + if propertyName is None: + super(DataWidgetMapper, self).addMapping(widget, section) + else: + super(DataWidgetMapper, self).addMapping(widget, section, propertyName) + + if isinstance(widget, QtGui.QComboBox): + delegate = self.itemDelegate() + widget.currentIndexChanged.connect(lambda: delegate.commitData.emit(widget)) + +SMEARING_1D = ["Custom Pinhole Smear", "Custom Slit Smear"] +SMEARING_2D = ["Custom Pinhole Smear"] + +MODEL = [ + 'SMEARING', + 'PINHOLE_MIN', + 'PINHOLE_MAX', + 'ACCURACY'] + +class SmearingWidget(QtGui.QWidget, Ui_SmearingWidgetUI): + def __init__(self, parent=None): + super(SmearingWidget, self).__init__() + + self.setupUi(self) + self.cbSmearing.currentIndexChanged.connect(self.onIndexChange) + self.cbSmearing.setCurrentIndex(0) + self.is_data = None + self.model = None + self.mapper = None + + self.initModel() + self.initMapper() + + def initModel(self): + """ + Initialize the state + """ + self.model = QtGui.QStandardItemModel() + for model_item in xrange(len(MODEL)): + self.model.setItem(model_item, QtGui.QStandardItem()) + + self.model.dataChanged.connect(self.onModelChange) + + ##self.modelReset() + + def initMapper(self): + """ + Initialize model item <-> UI element mapping + """ + #self.mapper = QtGui.QDataWidgetMapper(self) + self.mapper = DataWidgetMapper(self) + + self.mapper.setModel(self.model) + self.mapper.setOrientation(QtCore.Qt.Vertical) + + self.mapper.addMapping(self.txtSmearUp, MODEL.index('PINHOLE_MIN')) + self.mapper.addMapping(self.txtSmearDown, MODEL.index('PINHOLE_MAX')) + self.mapper.addMapping(self.cbSmearing, MODEL.index('SMEARING')) + self.mapper.addMapping(self.cbAccuracy, MODEL.index('ACCURACY')) + self.mapper.toFirst() + + def updateSmearing(self, data=None): + """ + Update control elements based on data passed + """ + self.cbSmearing.clear() + self.cbSmearing.addItem("None") + self.cbAccuracy.setVisible(False) + + if data is None: + self.setElementsVisibility(False) + elif isinstance(data, Data1D): + self.cbSmearing.addItems(SMEARING_1D) + self.is_data = Data1D + else: + self.cbSmearing.addItems(SMEARING_2D) + self.is_data = Data2D + self.cbSmearing.setCurrentIndex(0) + + def onIndexChange(self, index): + """ + Callback for smearing combobox index change + """ + if index == 0: + self.setElementsVisibility(False) + return + elif index == 1: + self.setElementsVisibility(True) + self.setPinholeLabels() + elif index == 2: + self.setElementsVisibility(True) + self.setSlitLabels() + + def onModelChange(self, top, bottom): + """ + """ + print "MODEL CHANGED: ", top, bottom + pass + + def setElementsVisibility(self, visible): + """ + Labels and linedits visibility control + """ + self.lblSmearDown.setVisible(visible) + self.lblSmearUp.setVisible(visible) + self.txtSmearDown.setVisible(visible) + self.txtSmearUp.setVisible(visible) + self.label_14.setVisible(visible) + self.label_15.setVisible(visible) + self.setAccuracyVisibility() + + def setAccuracyVisibility(self): + """ + Accuracy combobox visibility + """ + if self.is_data == Data2D and self.cbSmearing.currentIndex() == 1: + self.cbAccuracy.setVisible(True) + else: + self.cbAccuracy.setVisible(False) + + def setPinholeLabels(self): + """ + Use pinhole labels + """ + self.lblSmearUp.setText('
dQlow
') + self.lblSmearDown.setText('dQhigh
') + + def setSlitLabels(self): + """ + Use pinhole labels + """ + self.lblSmearUp.setText('Slit height') + self.lblSmearDown.setText('Slit width') + + def state(self): + """ + Returns current state of controls + """ + Index: src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui =================================================================== --- src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui (revision 9d266d2a26a5ec599562e4892355fd031c3ef5ff) +++ src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui (revision e1e3e09a03e38fca76bc8ef51c8bfcc5d6441d3c) @@ -561,115 +561,4 @@ -