Changeset b1e36a3 in sasview


Ignore:
Timestamp:
Mar 23, 2017 7:53:10 AM (7 years ago)
Author:
Piotr Rozyczko <rozyczko@…>
Branches:
ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
Children:
9934e48
Parents:
29eb947
Message:

FittingWidget? code review SASVIEW-561

Location:
src/sas/qtgui
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/GuiManager.py

    r811bec1 rb1e36a3  
    180180        # Close the previous perspective 
    181181        if self._current_perspective: 
     182            self._current_perspective.setClosable() 
    182183            self._current_perspective.close() 
    183184        # Default perspective 
  • src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py

    r811bec1 rb1e36a3  
    4242        self.tabCloseRequested.connect(self.tabCloses) 
    4343 
     44        # Perspective window not allowed to close by default 
     45        self._allow_close = False 
     46 
    4447        self.setWindowTitle('Fit panel - Active Fitting Optimizer: %s' % self.optimizer) 
     48 
     49    def setClosable(self, value=True): 
     50        """ 
     51        Allow outsiders close this widget 
     52        """ 
     53        assert isinstance(value, bool) 
     54 
     55        self._allow_close = value 
     56 
     57    def closeEvent(self, event): 
     58        """ 
     59        Overwrite QDialog close method to allow for custom widget close 
     60        """ 
     61        if self._allow_close: 
     62            # reset the closability flag 
     63            self.setClosable(value=False) 
     64            event.accept() 
     65        else: 
     66            event.ignore() 
     67            # Maybe we should just minimize 
     68            self.setWindowState(QtCore.Qt.WindowMinimized) 
    4569 
    4670    def addFit(self, data): 
  • src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py

    r7248d75d rb1e36a3  
    3939        item_name = param.name 
    4040        if param in multishell_parameters: 
    41             item_name = replaceShellName(param.name, 1) 
     41            continue 
     42        #    item_name = replaceShellName(param.name, 1) 
    4243 
    4344        item1 = QtGui.QStandardItem(item_name) 
     
    127128    for i in xrange(index): 
    128129        for par in multishell_parameters: 
    129             param_name = replaceShellName(par.name, i+2) 
     130            # Create the name: <param>[<i>], e.g. "sld1" for parameter "sld[n]" 
     131            param_name = replaceShellName(par.name, i+1) 
    130132            item1 = QtGui.QStandardItem(param_name) 
    131133            item1.setCheckable(True) 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    r29eb947 rb1e36a3  
    7979        self.communicate = self.parent.communicate 
    8080 
     81        # Define bold font for use in various controls 
     82        self.boldFont=QtGui.QFont() 
     83        self.boldFont.setBold(True) 
     84 
     85        # Set data label 
     86        self.label.setFont(self.boldFont) 
     87        self.label.setText("No data loaded") 
     88        self.lblFilename.setText("") 
     89 
    8190        # Set the main models 
    8291        # We can't use a single model here, due to restrictions on flattening 
     
    116125        self.cbCategory.setCurrentIndex(0) 
    117126 
    118         self._index = data 
     127        self._index = None 
    119128        if data is not None: 
    120129            self.data = data 
     
    136145        # _index contains the QIndex with data 
    137146        self._index = value 
     147 
    138148        # Update logics with data items 
    139149        self.logic.data = GuiUtils.dataFromItem(value[0]) 
     
    141151        self.data_is_loaded = True 
    142152        # Tag along functionality 
     153        self.label.setText("Data loaded from: ") 
     154        self.lblFilename.setText(self.logic.data.title) 
    143155        self.updateQRange() 
    144156        self.cmdFit.setEnabled(True) 
     
    151163        """ Disable the combobox """ 
    152164        self.cbModel.setEnabled(False) 
    153         self.label_3.setEnabled(False) 
     165        self.lblModel.setEnabled(False) 
    154166 
    155167    def enableModelCombo(self): 
    156168        """ Enable the combobox """ 
    157169        self.cbModel.setEnabled(True) 
    158         self.label_3.setEnabled(True) 
     170        self.lblModel.setEnabled(True) 
    159171 
    160172    def disableStructureCombo(self): 
    161173        """ Disable the combobox """ 
    162174        self.cbStructureFactor.setEnabled(False) 
    163         self.label_4.setEnabled(False) 
     175        self.lblStructure.setEnabled(False) 
    164176 
    165177    def enableStructureCombo(self): 
    166178        """ Enable the combobox """ 
    167179        self.cbStructureFactor.setEnabled(True) 
    168         self.label_4.setEnabled(True) 
     180        self.lblStructure.setEnabled(True) 
    169181 
    170182    def updateQRange(self): 
     
    271283        models = [] 
    272284        # Populate the models combobox 
    273         self.cbModel.addItems(sorted([model for (model,_) in model_list])) 
     285        self.cbModel.addItems(sorted([model for (model, _) in model_list])) 
    274286 
    275287    def createDefaultDataset(self): 
     
    303315            self.createDefaultDataset() 
    304316        else: 
    305             self.calculateDataForModel() 
     317            self.calculateQGridForModel() 
    306318 
    307319    def onSelectStructureFactor(self): 
     
    427439            value = item.checkState() 
    428440        else: 
    429             value = float(item.text()) 
     441            try: 
     442                value = float(item.text()) 
     443            except ValueError: 
     444                # Can't be converted properly, bring back the old value and exit 
     445                return 
     446 
    430447        parameter_name = str(self._poly_model.data(name_index).toPyObject()) # "distribution of sld" etc. 
    431448        if "Distribution of" in parameter_name: 
     
    506523        if self.data is None or not self.data.is_data: 
    507524            self.createDefaultDataset() 
    508         self.calculateDataForModel() 
     525        self.calculateQGridForModel() 
    509526 
    510527    def onNpts(self, text): 
     
    515532        try: 
    516533            self.npts = int(text) 
    517         except: 
     534        except ValueError: 
     535            # TODO 
     536            # This will return the old value to model/view and return 
     537            # notifying the user about format available. 
    518538            pass 
    519539 
     
    525545        try: 
    526546            self.q_range_min = float(text) 
    527         except: 
    528             pass 
     547        except ValueError: 
     548            # TODO 
     549            # This will return the old value to model/view and return 
     550            # notifying the user about format available. 
     551            return 
    529552        # set Q range labels on the main tab 
    530553        self.lblMinRangeDef.setText(str(self.q_range_min)) 
     
    550573        return self.complete1D if isinstance(self.data, Data1D) else self.complete2D 
    551574 
    552     def calculateDataForModel(self): 
     575    def calculateQGridForModel(self): 
    553576        """ 
    554577        Prepare the fitting data object, based on current ModelModel 
     
    603626    def calcException(self, etype, value, tb): 
    604627        """ 
    605         Something horrible happened in the deferred. Cry me a river. 
     628        Something horrible happened in the deferred. 
    606629        """ 
    607630        logging.error("".join(traceback.format_exception(etype, value, tb))) 
    608         msg = traceback.format_exception(etype, value, tb, limit=1) 
    609631 
    610632    def setTableProperties(self, table): 
     
    624646 
    625647        header.ResizeMode(QtGui.QHeaderView.Interactive) 
     648        # Resize column 0 and 6 to content 
    626649        header.setResizeMode(0, QtGui.QHeaderView.ResizeToContents) 
    627650        header.setResizeMode(6, QtGui.QHeaderView.ResizeToContents) 
     
    694717 
    695718        func = QtGui.QComboBox() 
    696         func.addItems([str(i+1) for i in xrange(param_length)]) 
     719        # Available range of shells displayed in the combobox 
     720        func.addItems([str(i) for i in xrange(param_length+1)]) 
     721        # Respond to index change 
    697722        func.currentIndexChanged.connect(self.modifyShellsInList) 
    698723 
  • src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui

    r5236449 rb1e36a3  
    7474            </item> 
    7575            <item row="0" column="1"> 
    76              <widget class="QLabel" name="label_3"> 
     76             <widget class="QLabel" name="lblModel"> 
    7777              <property name="text"> 
    7878               <string>Model name</string> 
     
    8181            </item> 
    8282            <item row="0" column="2"> 
    83              <widget class="QLabel" name="label_4"> 
     83             <widget class="QLabel" name="lblStructure"> 
    8484              <property name="text"> 
    8585               <string>Structure factor</string> 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingUtilitiesTest.py

    r7248d75d rb1e36a3  
    114114 
    115115        # Test the resulting model 
    116         self.assertEqual(model.rowCount(), 5) 
     116        self.assertEqual(model.rowCount(), 3) 
    117117        self.assertTrue(model.item(0).isCheckable()) 
    118118        self.assertEqual(model.item(0).text(), "sld_core") 
    119         self.assertFalse(model.item(3).hasChildren()) 
    120119        self.assertEqual(model.item(1).text(), "radius") 
    121120        self.assertEqual(model.item(2).text(), "sld_solvent") 
    122         self.assertEqual(model.item(3).text(), "sld1") 
    123  
    124         self.assertEqual(model.item(4).text(), "thickness1") 
    125         self.assertTrue(model.item(4).hasChildren()) 
    126121 
    127122    def testAddSimpleParametersToModel(self): 
     
    139134 
    140135        # Test the resulting model 
    141         self.assertEqual(model.rowCount(), 5) 
     136        self.assertEqual(model.rowCount(), 3) 
    142137        self.assertTrue(model.item(0).isCheckable()) 
    143138        self.assertEqual(model.item(0).text(), "sld_core") 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py

    r351b53e rb1e36a3  
    165165 
    166166        # invoke the method by changing the index 
    167         self.widget.cbCategory.setCurrentIndex(1) 
     167        category_index = self.widget.cbCategory.findText("Shape-Independent") 
     168        self.widget.cbCategory.setCurrentIndex(category_index) 
    168169 
    169170        # test the model combo content 
     
    190191        self.widget.show() 
    191192        # Change the category index so we have some models 
    192         self.widget.cbCategory.setCurrentIndex(1) 
     193        category_index = self.widget.cbCategory.findText("Shape-Independent") 
     194        self.widget.cbCategory.setCurrentIndex(category_index) 
    193195 
    194196        # check the enablement of controls 
     
    202204        self.widget.SASModelToQModel = MagicMock() 
    203205        self.widget.createDefaultDataset = MagicMock() 
    204         self.widget.calculateDataForModel = MagicMock() 
     206        self.widget.calculateQGridForModel = MagicMock() 
    205207        #  
    206208        # Now change the model 
     
    211213        self.assertTrue(self.widget.createDefaultDataset.called) 
    212214        self.assertTrue(self.widget.SASModelToQModel.called) 
    213         self.assertFalse(self.widget.calculateDataForModel.called) 
     215        self.assertFalse(self.widget.calculateQGridForModel.called) 
    214216 
    215217        # Let's set a dummy index on widget 
     
    219221        self.assertEqual(self.widget.cbModel.currentText(),'be_polyelectrolyte') 
    220222 
    221         # Observe calculateDataForModel called 
    222         self.assertTrue(self.widget.calculateDataForModel.called) 
     223        # Observe calculateQGridForModel called 
     224        self.assertTrue(self.widget.calculateQGridForModel.called) 
    223225 
    224226    def testSelectFactor(self): 
     
    228230        self.widget.show() 
    229231        # Change the category index so we have some models 
    230         self.widget.cbCategory.setCurrentIndex(1) 
     232        category_index = self.widget.cbCategory.findText("Shape-Independent") 
     233        self.widget.cbCategory.setCurrentIndex(category_index) 
    231234        # Change the model to one that supports structure factors 
    232235        model_index = self.widget.cbModel.findText('fractal_core_shell') 
     
    296299        # Check the index 
    297300 
    298     def testCalculateDataForModel(self): 
     301    def testCalculateQGridForModel(self): 
    299302        """ 
    300303        Check that the fitting 1D data object is ready 
     
    303306        threads.deferToThread = MagicMock() 
    304307        # Call the tested method 
    305         self.widget.calculateDataForModel() 
     308        self.widget.calculateQGridForModel() 
    306309        # Test the mock 
    307310        self.assertTrue(threads.deferToThread.called) 
     
    328331        self.widget.show() 
    329332        # Change the category index so we have a model with no poly 
    330         self.widget.cbCategory.setCurrentIndex(1) 
     333        category_index = self.widget.cbCategory.findText("Shape-Independent") 
     334        self.widget.cbCategory.setCurrentIndex(category_index) 
    331335        # Check the poly model 
    332336        self.assertEqual(self.widget._poly_model.rowCount(), 0) 
     
    356360        self.widget.show() 
    357361        # Change the category index so we have a model available 
    358         self.widget.cbCategory.setCurrentIndex(2) 
     362        category_index = self.widget.cbCategory.findText("Shapes") 
     363        self.widget.cbCategory.setCurrentIndex(category_index) 
    359364 
    360365        # Check the magnetic model 
     
    384389        self.widget.show() 
    385390        # Change the model to multi shell 
    386         self.widget.cbCategory.setCurrentIndex(2) 
    387         self.widget.cbModel.setCurrentIndex(4) 
     391        category_index = self.widget.cbCategory.findText("Shapes") 
     392        self.widget.cbCategory.setCurrentIndex(category_index) 
     393        model_index = self.widget.cbModel.findText("core_multi_shell") 
     394        self.widget.cbModel.setCurrentIndex(model_index) 
    388395 
    389396        # Assure we have the combobox available 
  • src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py

    r0979dfb rb1e36a3  
    7878        self._data = None 
    7979        self._path = "" 
     80 
     81        self._allow_close = False 
    8082 
    8183        # Mask file selector 
     
    106108        self.setupMapper() 
    107109 
    108     #def closeEvent(self, event): 
    109     #    """ 
    110     #    Overwrite the default close method of QWidget 
    111     #    """ 
    112     #    # No close on perspectives - one must always be active. 
    113     #    event.ignore() 
     110    def setClosable(self, value=True): 
     111        """ 
     112        Allow outsiders close this widget 
     113        """ 
     114        assert isinstance(value, bool) 
     115 
     116        self._allow_close = value 
     117 
     118    def closeEvent(self, event): 
     119        """ 
     120        Overwrite QDialog close method to allow for custom widget close 
     121        """ 
     122        if self._allow_close: 
     123            # reset the closability flag 
     124            self.setClosable(value=False) 
     125            event.accept() 
     126        else: 
     127            event.ignore() 
     128            # Maybe we should just minimize 
     129            self.setWindowState(QtCore.Qt.WindowMinimized) 
    114130 
    115131    def communicator(self): 
Note: See TracChangeset for help on using the changeset viewer.