Changeset 4f80a83 in sasview


Ignore:
Timestamp:
Jul 25, 2018 12:01:03 PM (4 weeks ago)
Author:
tcbennun
Branches:
ESS_GUI_beta_approx
Children:
548f8e2
Parents:
0804c9f
Message:

put sub-heading creation into FittingUtilities?; fix a couple of caused issues; fix affected tests

Location:
src/sas/qtgui/Perspectives/Fitting
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py

    r57be490 r4f80a83  
    158158    item_list[0].setCheckable(True) 
    159159    model.appendRow(item_list) 
     160 
     161def addHeadingRowToModel(model, name): 
     162    """adds a non-interactive top-level row to the model""" 
     163    header_row = [QtGui.QStandardItem() for i in range(5)] 
     164    header_row[0].setText(name) 
     165 
     166    font = header_row[0].font() 
     167    font.setBold(True) 
     168    header_row[0].setFont(font) 
     169 
     170    for item in header_row: 
     171        item.setEditable(False) 
     172        item.setCheckable(False) 
     173        item.setSelectable(False) 
     174 
     175    model.appendRow(header_row) 
    160176 
    161177def addHeadersToModel(model): 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    r0804c9f r4f80a83  
    656656        Return list of all parameters for the current model 
    657657        """ 
    658         return [self._model_model.item(row).text() for row in range(self._model_model.rowCount())] 
     658        return [self._model_model.item(row).text() 
     659                for row in range(self._model_model.rowCount()) 
     660                if self.isCheckable(row)] 
    659661 
    660662    def modifyViewOnRow(self, row, font=None, brush=None): 
     
    684686        assert(isinstance(constraint, Constraint)) 
    685687        assert(0<=row<=self._model_model.rowCount()) 
     688        assert(self.isCheckable(row)) 
    686689 
    687690        item = QtGui.QStandardItem() 
     
    704707        max_col = self.lstParams.itemDelegate().param_max 
    705708        for row in self.selectedParameters(): 
     709            assert(self.isCheckable(row)) 
    706710            param = self._model_model.item(row, 0).text() 
    707711            value = self._model_model.item(row, 1).text() 
     
    746750        max_col = self.lstParams.itemDelegate().param_max 
    747751        for row in range(self._model_model.rowCount()): 
     752            if not self.isCheckable(row): 
     753                continue 
    748754            if not self.rowHasConstraint(row): 
    749755                continue 
     
    774780        For the given row, return its constraint, if any 
    775781        """ 
    776         try: 
     782        if self.isCheckable(row): 
    777783            item = self._model_model.item(row, 1) 
    778             return item.child(0).data() 
    779         except AttributeError: 
    780             # return none when no constraints 
    781             return None 
     784            try: 
     785                return item.child(0).data() 
     786            except AttributeError: 
     787                # return none when no constraints 
     788                pass 
     789        return None 
    782790 
    783791    def rowHasConstraint(self, row): 
     
    785793        Finds out if row of the main model has a constraint child 
    786794        """ 
    787         item = self._model_model.item(row,1) 
    788         if item.hasChildren(): 
    789             c = item.child(0).data() 
    790             if isinstance(c, Constraint): 
    791                 return True 
     795        if self.isCheckable(row): 
     796            item = self._model_model.item(row,1) 
     797            if item.hasChildren(): 
     798                c = item.child(0).data() 
     799                if isinstance(c, Constraint): 
     800                    return True 
    792801        return False 
    793802 
     
    796805        Finds out if row of the main model has an active constraint child 
    797806        """ 
    798         item = self._model_model.item(row,1) 
    799         if item.hasChildren(): 
    800             c = item.child(0).data() 
    801             if isinstance(c, Constraint) and c.active: 
    802                 return True 
     807        if self.isCheckable(row): 
     808            item = self._model_model.item(row,1) 
     809            if item.hasChildren(): 
     810                c = item.child(0).data() 
     811                if isinstance(c, Constraint) and c.active: 
     812                    return True 
    803813        return False 
    804814 
     
    807817        Finds out if row of the main model has an active, nontrivial constraint child 
    808818        """ 
    809         item = self._model_model.item(row,1) 
    810         if item.hasChildren(): 
    811             c = item.child(0).data() 
    812             if isinstance(c, Constraint) and c.func and c.active: 
    813                 return True 
     819        if self.isCheckable(row): 
     820            item = self._model_model.item(row,1) 
     821            if item.hasChildren(): 
     822                c = item.child(0).data() 
     823                if isinstance(c, Constraint) and c.func and c.active: 
     824                    return True 
    814825        return False 
    815826 
     
    15081519            # internal so can use closure for param_dict 
    15091520            param_name = str(self._model_model.item(row, 0).text()) 
    1510             if param_name not in list(param_dict.keys()): 
     1521            if not self.isCheckable(row) or param_name not in list(param_dict.keys()): 
    15111522                return 
    15121523            # modify the param value 
     
    15201531            # Utility function for updateof polydispersity part of the main model 
    15211532            param_name = str(self._model_model.item(row, 0).text())+'.width' 
    1522             if param_name not in list(param_dict.keys()): 
     1533            if not self.isCheckable(row) or param_name not in list(param_dict.keys()): 
    15231534                return 
    15241535            # modify the param value 
     
    16491660            """ 
    16501661            for row_i in range(self._model_model.rowCount()): 
    1651                 func(row_i) 
     1662                if self.isCheckable(row_i): 
     1663                    func(row_i) 
    16521664 
    16531665        def updateFittedValues(row): 
     
    19411953        self.shell_names = self.shellNamesList() 
    19421954 
    1943         # Add a header 
    1944         header_row = [QtGui.QStandardItem() for i in range(5)] 
    1945         header_row[0].setText(self.kernel_module.name) 
    1946         font = header_row[0].font() 
    1947         font.setBold(True) 
    1948         header_row[0].setFont(font) 
    1949         for item in header_row: 
    1950             item.setEditable(False) 
    1951             item.setCheckable(False) 
    1952             item.setSelectable(False) 
    1953  
    1954         self._model_model.appendRow(header_row) 
    1955  
    1956         # Update the QModel 
     1955        # Get new rows for QModel 
    19571956        new_rows = FittingUtilities.addParametersToModel(self.model_parameters, self.kernel_module, self.is2D) 
    19581957 
     1958        # Add heading row 
     1959        FittingUtilities.addHeadingRowToModel(self._model_model, model_name) 
     1960 
     1961        # Update QModel 
    19591962        for row in new_rows: 
    19601963            self._model_model.appendRow(row) 
     
    19721975        self.kernel_module._model_info = product.make_product_info(self.kernel_module._model_info, structure_kernel._model_info) 
    19731976 
    1974         # Add a header 
    1975         header_row = [QtGui.QStandardItem() for i in range(5)] 
    1976         header_row[0].setText(structure_kernel._model_info.name) 
    1977         font = header_row[0].font() 
    1978         font.setBold(True) 
    1979         header_row[0].setFont(font) 
    1980         for item in header_row: 
    1981             item.setEditable(False) 
    1982             item.setCheckable(False) 
    1983             item.setSelectable(False) 
    1984  
    1985         self._model_model.appendRow(header_row) 
    1986  
     1977        # Get new rows for QModel 
    19871978        new_rows = FittingUtilities.addSimpleParametersToModel(structure_parameters, self.is2D) 
     1979 
     1980        # Add heading row 
     1981        FittingUtilities.addHeadingRowToModel(self._model_model, structure_factor) 
     1982 
     1983        # Update QModel 
    19881984        for row in new_rows: 
    19891985            self._model_model.appendRow(row) 
     
    23852381        def updateFunctionCaption(row): 
    23862382            # Utility function for update of polydispersity function name in the main model 
     2383            if not self.isCheckable(row): 
     2384                return 
    23872385            param_name = str(self._model_model.item(row, 0).text()) 
    23882386            if param_name !=  param.name: 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py

    r80468f6 r4f80a83  
    255255 
    256256        # We have 4 more rows now 
    257         self.assertEqual(self.widget._model_model.rowCount(), rowcount+4) 
     257        self.assertEqual(self.widget._model_model.rowCount(), rowcount+5) 
    258258 
    259259        # Switch models 
     
    275275        self.widget.cbStructureFactor.setCurrentIndex(last_index-1) 
    276276        # Do we have all the rows? 
    277         self.assertEqual(self.widget._model_model.rowCount(), 4) 
     277        self.assertEqual(self.widget._model_model.rowCount(), 5) 
    278278 
    279279        # Are the command buttons properly enabled? 
     
    488488        Test opening of the load file dialog for 'array' polydisp. function 
    489489        """ 
     490 
     491        # open a non-existent file 
    490492        filename = os.path.join("UnitTesting", "testdata_noexist.txt") 
     493        with self.assertRaises(OSError, msg="testdata_noexist.txt should be a non-existent file"): 
     494            os.stat(filename) 
    491495        QtWidgets.QFileDialog.getOpenFileName = MagicMock(return_value=(filename,'')) 
    492496        self.widget.show() 
     
    502506 
    503507        # good file 
     508        # TODO: this depends on the working directory being src/sas/qtgui, 
     509        # TODO: which isn't convenient if you want to run this test suite 
     510        # TODO: individually 
    504511        filename = os.path.join("UnitTesting", "testdata.txt") 
     512        try: 
     513            os.stat(filename) 
     514        except OSError: 
     515            self.assertTrue(False, "testdata.txt does not exist") 
    505516        QtWidgets.QFileDialog.getOpenFileName = MagicMock(return_value=(filename,'')) 
    506517 
     
    10011012 
    10021013         # Check the model 
    1003         self.assertEqual(self.widget._model_model.rowCount(), 6) 
     1014        self.assertEqual(self.widget._model_model.rowCount(), 7) 
    10041015        self.assertEqual(self.widget._model_model.columnCount(), 5) 
    10051016 
     
    11171128        # two rows selected 
    11181129        index1 = self.widget.lstParams.model().index(1, 0, QtCore.QModelIndex()) 
    1119         index2 = self.widget.lstParams.model().index(2, 0, QtCore.QModelIndex()) 
     1130        index2 = self.widget.lstParams.model().index(3, 0, QtCore.QModelIndex()) 
    11201131        selection_model = self.widget.lstParams.selectionModel() 
    11211132        selection_model.select(index1, selection_model.Select | selection_model.Rows) 
     
    11531164        # several random parameters 
    11541165        self.assertEqual(self.widget.getRowFromName('scale'), 0) 
    1155         self.assertEqual(self.widget.getRowFromName('length'), 5) 
     1166        self.assertEqual(self.widget.getRowFromName('length'), 6) 
    11561167 
    11571168    def testGetParamNames(self): 
     
    11901201        # Create a constraint object 
    11911202        const = Constraint(parent=None, value=7.0) 
    1192         row = 2 
     1203        row = 3 
    11931204 
    11941205        spy = QtSignalSpy(self.widget, self.widget.constraintAddedSignal) 
     
    12091220        # assign complex constraint now 
    12101221        const = Constraint(parent=None, param='radius', func='5*sld') 
    1211         row = 4 
     1222        row = 5 
    12121223        # call the method tested 
    12131224        self.widget.addConstraintToRow(constraint=const, row=row) 
     
    12681279        self.widget.cbModel.setCurrentIndex(model_index) 
    12691280 
     1281        row1 = 1 
     1282        row2 = 5 
     1283 
     1284        param1 = "background" 
     1285        param2 = "radius" 
     1286 
     1287        #default_value1 = "0.001" 
     1288        default_value2 = "20" 
     1289 
    12701290        # select two rows 
    1271         row1 = 1 
    1272         row2 = 4 
    12731291        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    12741292        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    12871305 
    12881306        # delete one of the constraints 
    1289         self.widget.deleteConstraintOnParameter(param='background') 
     1307        self.widget.deleteConstraintOnParameter(param=param1) 
    12901308 
    12911309        # see that the other constraint is still present 
    1292         cons = self.widget.getConstraintForRow(4) # 4 = radius 
    1293         self.assertEqual(cons.param, "radius") 
    1294         self.assertEqual(cons.value, "20") 
     1310        cons = self.widget.getConstraintForRow(row2) 
     1311        self.assertEqual(cons.param, param2) 
     1312        self.assertEqual(cons.value, default_value2) 
    12951313 
    12961314        # kill the other constraint 
     
    12981316 
    12991317        # see that the other constraint is still present 
    1300         self.assertEqual(self.widget.getConstraintsForModel(), [('radius', None)]) 
     1318        self.assertEqual(self.widget.getConstraintsForModel(), [(param2, None)]) 
    13011319 
    13021320    def testGetConstraintForRow(self): 
     
    13181336        self.widget.cbModel.setCurrentIndex(model_index) 
    13191337 
     1338        row1 = 1 
     1339        row2 = 5 
     1340 
    13201341        # select two rows 
    1321         row1 = 1 
    1322         row2 = 4 
    13231342        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    13241343        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    13301349        self.widget.addSimpleConstraint() 
    13311350 
    1332         con_list = [False, True, False, False, True, False] 
     1351        con_list = [False, True, False, False, False, True, False] 
    13331352        new_list = [] 
    13341353        for row in range(self.widget._model_model.rowCount()): 
     
    13481367        self.widget.cbModel.setCurrentIndex(model_index) 
    13491368 
     1369        row1 = 1 
     1370        row2 = 5 
     1371 
    13501372        # select two rows 
    1351         row1 = 1 
    1352         row2 = 4 
    13531373        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    13541374        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    13641384        constraint_objects[0].active = False 
    13651385 
    1366         con_list = [False, False, False, False, True, False] 
     1386        con_list = [False, False, False, False, False, True, False] 
    13671387        new_list = [] 
    13681388        for row in range(self.widget._model_model.rowCount()): 
     
    13851405        self.assertEqual(self.widget.getConstraintsForModel(),[]) 
    13861406 
     1407        row1 = 1 
     1408        row2 = 5 
     1409 
     1410        param1 = "background" 
     1411        param2 = "radius" 
     1412 
     1413        default_value1 = "0.001" 
     1414        default_value2 = "20" 
     1415 
    13871416        # select two rows 
    1388         row1 = 1 
    1389         row2 = 4 
    13901417        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    13911418        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    13991426        # simple constraints 
    14001427        # self.assertEqual(self.widget.getConstraintsForModel(), [('background', '0.001'), ('radius', '20')]) 
    1401         cons = self.widget.getConstraintForRow(1) # 1 - background 
    1402         self.assertEqual(cons.param, "background") 
    1403         self.assertEqual(cons.value, "0.001") 
    1404         cons = self.widget.getConstraintForRow(4) # 4 = radius 
    1405         self.assertEqual(cons.param, "radius") 
    1406         self.assertEqual(cons.value, "20") 
     1428        cons = self.widget.getConstraintForRow(row1) 
     1429        self.assertEqual(cons.param, param1) 
     1430        self.assertEqual(cons.value, default_value1) 
     1431        cons = self.widget.getConstraintForRow(row2) 
     1432        self.assertEqual(cons.param, param2) 
     1433        self.assertEqual(cons.value, default_value2) 
    14071434 
    14081435        objects = self.widget.getConstraintObjectsForModel() 
    14091436        self.assertEqual(len(objects), 2) 
    1410         self.assertEqual(objects[1].value, '20') 
    1411         self.assertEqual(objects[0].param, 'background') 
     1437        self.assertEqual(objects[1].value, default_value2) 
     1438        self.assertEqual(objects[0].param, param1) 
     1439 
     1440        row = 0 
     1441        param = "scale" 
     1442        func = "5*sld" 
    14121443 
    14131444        # add complex constraint 
    1414         const = Constraint(parent=None, param='scale', func='5*sld') 
    1415         row = 0 
     1445        const = Constraint(parent=None, param=param, func=func) 
    14161446        self.widget.addConstraintToRow(constraint=const, row=row) 
    14171447        #self.assertEqual(self.widget.getConstraintsForModel(),[('scale', '5*sld'), ('background', '0.001'), ('radius', None)]) 
    1418         cons = self.widget.getConstraintForRow(4) # 4 = radius 
    1419         self.assertEqual(cons.param, "radius") 
    1420         self.assertEqual(cons.value, "20") 
     1448        cons = self.widget.getConstraintForRow(row2) 
     1449        self.assertEqual(cons.param, param2) 
     1450        self.assertEqual(cons.value, default_value2) 
    14211451 
    14221452        objects = self.widget.getConstraintObjectsForModel() 
    14231453        self.assertEqual(len(objects), 3) 
    1424         self.assertEqual(objects[0].func, '5*sld') 
     1454        self.assertEqual(objects[0].func, func) 
    14251455 
    14261456    def testReplaceConstraintName(self): 
Note: See TracChangeset for help on using the changeset viewer.