Changeset 548f8e2 in sasview


Ignore:
Timestamp:
Jul 26, 2018 9:46:27 AM (4 weeks ago)
Author:
tcbennun
Branches:
ESS_GUI_beta_approx
Children:
0f959ef
Parents:
4f80a83 (diff), 3f5b901 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'ESS_GUI' into ESS_GUI_beta_approx

Files:
1 added
20 edited

Legend:

Unmodified
Added
Removed
  • docs/sphinx-docs/source/conf.py

    r3597f07 rd8f4d9b  
    8080version = '4.1' 
    8181# The full version, including alpha/beta/rc tags. 
    82 release = '4.1.2' 
     82release = '5.0.0' 
    8383 
    8484# The language for content autogenerated by Sphinx. Refer to documentation 
  • src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py

    rfa05c6c r144fe21  
    707707        Create a template for 2D data 
    708708        """ 
    709         self.plotter = Plotter2DWidget(self, quickplot=True) 
     709        self.plotter = Plotter2DWidget(self, manager=self.manager, quickplot=True) 
    710710        self.plotter.scale = 'linear' 
    711711        self.plotter.cmap = None 
  • src/sas/qtgui/Calculators/UnitTesting/ResolutionCalculatorPanelTest.py

    re90988c r144fe21  
    1212from twisted.internet import threads 
    1313 
    14 # from UnitTesting.TestUtils import QtSignalSpy 
    15 # from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
     14from sas.qtgui.Utilities.GuiUtils import Communicate 
    1615from sas.qtgui.Calculators.ResolutionCalculatorPanel \ 
    1716    import ResolutionCalculatorPanel 
    18  
    19 # from sas.qtgui.MainWindow.DataManager import DataManager 
    20 # from sas.qtgui.MainWindow.GuiManager import GuiManager 
    21 # from sas.qtgui.Utilities.GuiUtils import * 
    22  
    2317 
    2418BG_COLOR_ERR = 'background-color: rgb(244, 170, 164);' 
     
    3428    """Test the ResolutionCalculator""" 
    3529    def setUp(self): 
     30        class dummy_manager(object): 
     31            communicator = Communicate() 
    3632        """Create the ResolutionCalculator""" 
    37         self.widget = ResolutionCalculatorPanel(None) 
     33        self.widget = ResolutionCalculatorPanel(dummy_manager()) 
    3834 
    3935        # self.widget.onCompute = MagicMock() 
     
    4137    def tearDown(self): 
    4238        """Destroy the ResolutionCalculator""" 
     39        if self.widget.plotter is not None: 
     40            self.widget.plotter.close() 
    4341        self.widget.close() 
    4442        self.widget = None 
  • src/sas/qtgui/Calculators/UnitTesting/SLDCalculatorTest.py

    re90988c r144fe21  
    2020import sas.qtgui.Utilities.LocalConfig 
    2121 
    22 #if not QtWidgets.QApplication.instance(): 
    23 #    app = QtWidgets.QApplication(sys.argv) 
    24 app = QtWidgets.QApplication(sys.argv) 
     22if not QtWidgets.QApplication.instance(): 
     23    app = QtWidgets.QApplication(sys.argv) 
    2524 
    2625class SldResultTest(unittest.TestCase): 
  • src/sas/qtgui/GUITests.py

    rd0528c4 r7dd309a  
    1111by running ``python setup.py install`` in both repositories. 
    1212 
    13 The tests can be run with ``python GUITests.py``, or to get more verbose 
    14 console output (recommended), use ``python GUITests.py -v``. 
     13The tests can be run with ``python GUITests.py``, or 
     14``python GUITests.py suiteName1 suiteName2 ...`` for a subset of tests. 
     15 
     16To get more verbose console output (recommended), use ``python GUITests.py -v`` 
    1517""" 
     18 
     19# Llist of all suite names. Every time a new suite is added, its name should 
     20# also be added here 
     21ALL_SUITES = [ 
     22    'calculatorsSuite', 
     23    'mainSuite', 
     24    'fittingSuite', 
     25    'plottingSuite', 
     26    'utilitiesSuite', 
     27    'perspectivesSuite', 
     28    ] 
    1629 
    1730# Prepare the general QApplication instance 
     
    8396from Perspectives.Inversion.UnitTesting import InversionPerspectiveTest 
    8497 
    85 def suite(): 
     98def plottingSuite(): 
    8699    suites = ( 
    87100        # Plotting 
     
    101114        unittest.makeSuite(PlotterBaseTest.PlotterBaseTest,           'test'), 
    102115        unittest.makeSuite(PlotterTest.PlotterTest,                   'test'), 
    103  
     116        ) 
     117    return unittest.TestSuite(suites) 
     118 
     119def mainSuite(): 
     120    suites = ( 
    104121        # Main window 
    105122        unittest.makeSuite(DataExplorerTest.DataExplorerTest,  'test'), 
     
    109126        unittest.makeSuite(AboutBoxTest.AboutBoxTest,          'test'), 
    110127        unittest.makeSuite(WelcomePanelTest.WelcomePanelTest,  'test'), 
    111  
    112         # Utilities 
     128        ) 
     129    return unittest.TestSuite(suites) 
     130 
     131def utilitiesSuite(): 
     132    suites = ( 
     133        ## Utilities 
    113134        unittest.makeSuite(TestUtilsTest.TestUtilsTest,           'test'), 
    114135        unittest.makeSuite(SasviewLoggerTest.SasviewLoggerTest,   'test'), 
     
    122143        unittest.makeSuite(AddMultEditorTest.AddMultEditorTest, 'test'), 
    123144        unittest.makeSuite(ReportDialogTest.ReportDialogTest,     'test'), 
    124  
     145        ) 
     146    return unittest.TestSuite(suites) 
     147 
     148def calculatorsSuite(): 
     149    suites = ( 
    125150        # Calculators 
    126151        unittest.makeSuite(KiessigCalculatorTest.KiessigCalculatorTest,                     'test'), 
     
    131156        unittest.makeSuite(ResolutionCalculatorPanelTest.ResolutionCalculatorPanelTest, 'test'), 
    132157        unittest.makeSuite(DataOperationUtilityTest.DataOperationUtilityTest, 'test'), 
    133  
     158        ) 
     159    return unittest.TestSuite(suites) 
     160 
     161def fittingSuite(): 
     162    suites = ( 
    134163        # Perspectives 
    135164        #  Fitting 
     
    143172        unittest.makeSuite(ConstraintWidgetTest.ConstraintWidgetTest,     'test'), 
    144173        unittest.makeSuite(ComplexConstraintTest.ComplexConstraintTest,   'test'), 
    145  
     174        ) 
     175    return unittest.TestSuite(suites) 
     176 
     177def perspectivesSuite(): 
     178    suites = ( 
    146179        #  Invariant 
    147180        unittest.makeSuite(InvariantPerspectiveTest.InvariantPerspectiveTest,  'test'), 
    148181        #  Inversion 
    149         unittest.makeSuite(InversionPerspectiveTest.InversionTest,  'test'), 
     182        #unittest.makeSuite(InversionPerspectiveTest.InversionTest,  'test'), 
    150183        ) 
    151184    return unittest.TestSuite(suites) 
    152185 
    153186if __name__ == "__main__": 
    154     unittest.main(defaultTest="suite") 
    155  
     187 
     188    user_suites = ALL_SUITES 
     189    # Check if user asked for specific suites: 
     190    if len(sys.argv) > 1: 
     191        user_suites = sys.argv[1:] 
     192    errors = {} 
     193    for suite in user_suites: 
     194        # create the suite object from name 
     195        try: 
     196 
     197            suite_instance = globals()[suite]() 
     198            result=unittest.TextTestResult(sys.stdout,True,True) 
     199            print("\nRunning %d test cases for %s"%(suite_instance.countTestCases(), suite)) 
     200            result.buffer=True 
     201            suite_instance.run(result) 
     202 
     203            if not result.wasSuccessful(): 
     204                if len(result.errors) or len(result.failures): 
     205                    errors[suite] = (result.errors, result.failures) 
     206                if len(result.errors): 
     207                    print("\n============ Errors disovered ===================") 
     208                if len(result.failures): 
     209                    print("\n============ Failures disovered =================") 
     210            else: 
     211                print("\nAll tests successful") 
     212 
     213        except KeyError: 
     214            print("Failure : %s "%str(ex)) 
     215            print("ERROR: Incorrect suite name: %s " % suite) 
     216            pass 
     217 
     218    if len(errors.keys())>0: 
     219        for suite, errors in errors.items(): 
     220            for r in errors[0]: 
     221                    print("\nSuite: %s had following errors:\n %s : %s"%(suite, r[0], r[1])) 
     222            for r in errors[1]: 
     223                    print("\nSuite: %s had following failures:\n %s : %s"%(suite, r[0], r[1])) 
     224            print("=================================================") 
  • src/sas/qtgui/MainWindow/UnitTesting/DataExplorerTest.py

    rd9150d8 r573c383  
    908908        self.assertEqual(len(PlotHelper.currentPlots()), 1) 
    909909        self.assertEqual(len(self.form.plot_widgets), 1) 
    910         self.assertEqual(list(self.form.plot_widgets.keys()), ['Graph3']) 
     910        # could have leftovers from previous tests 
     911        #self.assertEqual(list(self.form.plot_widgets.keys()), ['Graph3']) 
     912        self.assertEqual(len(self.form.plot_widgets.keys()), 1) 
    911913 
    912914        # data index 
  • src/sas/qtgui/MainWindow/UnitTesting/GuiManagerTest.py

    r725d9c06 r144fe21  
    251251 
    252252        # Check the initial state 
     253        self.assertFalse(self.manager._workspace.toolBar.isVisible()) 
     254        self.assertEqual('Show Toolbar', self.manager._workspace.actionHide_Toolbar.text()) 
     255 
     256        # Invoke action 
     257        self.manager.actionHide_Toolbar() 
     258 
     259        # Assure changes propagated correctly 
    253260        self.assertTrue(self.manager._workspace.toolBar.isVisible()) 
    254261        self.assertEqual('Hide Toolbar', self.manager._workspace.actionHide_Toolbar.text()) 
    255262 
    256         # Invoke action 
     263        # Revert 
    257264        self.manager.actionHide_Toolbar() 
    258265 
    259         # Assure changes propagated correctly 
     266        # Assure the original values are back 
    260267        self.assertFalse(self.manager._workspace.toolBar.isVisible()) 
    261268        self.assertEqual('Show Toolbar', self.manager._workspace.actionHide_Toolbar.text()) 
    262  
    263         # Revert 
    264         self.manager.actionHide_Toolbar() 
    265  
    266         # Assure the original values are back 
    267         self.assertTrue(self.manager._workspace.toolBar.isVisible()) 
    268         self.assertEqual('Hide Toolbar', self.manager._workspace.actionHide_Toolbar.text()) 
    269269 
    270270 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    r4f80a83 r548f8e2  
    19391939            name = os.path.join(ModelUtilities.find_plugins_dir(), model_name+".py") 
    19401940        kernel_module = generate.load_kernel_module(name) 
    1941         self.model_parameters = modelinfo.make_parameter_table(getattr(kernel_module, 'parameters', [])) 
     1941 
     1942        if hasattr(kernel_module, 'parameters'): 
     1943            # built-in and custom models 
     1944            self.model_parameters = modelinfo.make_parameter_table(getattr(kernel_module, 'parameters', [])) 
     1945 
     1946        elif hasattr(kernel_module, 'model_info'): 
     1947            # for sum/multiply models 
     1948            self.model_parameters = kernel_module.model_info.parameters 
     1949 
     1950        elif hasattr(kernel_module, 'Model') and hasattr(kernel_module.Model, "_model_info"): 
     1951            # this probably won't work if there's no model_info, but just in case 
     1952            self.model_parameters = kernel_module.Model._model_info.parameters 
     1953        else: 
     1954            # no parameters - default to blank table 
     1955            msg = "No parameters found in model '{}'.".format(model_name) 
     1956            logger.warning(msg) 
     1957            self.model_parameters = modelinfo.ParameterTable([]) 
    19421958 
    19431959        # Instantiate the current sasmodel 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingPerspectiveTest.py

    r6548a01 r144fe21  
    4444        self.assertEqual(len(self.widget.tabs), 1) 
    4545        self.assertEqual(self.widget.maxIndex, 2) 
    46         self.assertEqual(self.widget.getTabName(), "FitPage1") 
     46        self.assertEqual(self.widget.getTabName(), "FitPage2") 
    4747 
    4848    def testAddTab(self): 
     
    5252        self.widget.addFit(None) 
    5353        self.assertEqual(len(self.widget.tabs), 2) 
    54         self.assertEqual(self.widget.getTabName(), "FitPage2") 
     54        self.assertEqual(self.widget.getTabName(), "FitPage3") 
    5555        self.assertEqual(self.widget.maxIndex, 3) 
    5656        # Add an empty batch tab 
    5757        self.widget.addFit(None, is_batch=True) 
    5858        self.assertEqual(len(self.widget.tabs), 3) 
    59         self.assertEqual(self.widget.getTabName(2), "BatchPage3") 
     59        self.assertEqual(self.widget.getTabName(2), "BatchPage4") 
    6060        self.assertEqual(self.widget.maxIndex, 4) 
    6161 
     
    6969        ''' Remove data from last tab''' 
    7070        self.assertEqual(len(self.widget.tabs), 1) 
    71         self.assertEqual(self.widget.getTabName(), "FitPage1") 
     71        self.assertEqual(self.widget.getTabName(), "FitPage2") 
    7272        self.assertEqual(self.widget.maxIndex, 2) 
    7373 
     
    7777        # see that the tab didn't disappear, just changed the name/id 
    7878        self.assertEqual(len(self.widget.tabs), 1) 
    79         self.assertEqual(self.widget.getTabName(), "FitPage2") 
     79        self.assertEqual(self.widget.getTabName(), "FitPage3") 
    8080        self.assertEqual(self.widget.maxIndex, 3) 
    8181 
     
    101101        self.assertEqual(len(self.widget.tabs), 1) 
    102102        self.assertEqual(self.widget.maxIndex, 3) 
    103         self.assertEqual(self.widget.getTabName(), "FitPage2") 
     103        self.assertEqual(self.widget.getTabName(), "FitPage3") 
    104104 
    105105        # Attemtp to remove the last tab 
     
    108108        self.assertEqual(len(self.widget.tabs), 1) 
    109109        self.assertEqual(self.widget.maxIndex, 4) 
    110         self.assertEqual(self.widget.getTabName(), "FitPage3") 
     110        self.assertEqual(self.widget.getTabName(), "FitPage4") 
    111111 
    112112    def testAllowBatch(self): 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py

    r4f80a83 r548f8e2  
    411411        category_index = self.widget.cbCategory.findText("Cylinder") 
    412412        self.widget.cbCategory.setCurrentIndex(category_index) 
     413        model_index = self.widget.cbModel.findText("barbell") 
     414        self.widget.cbModel.setCurrentIndex(model_index) 
    413415 
    414416        # click on a poly parameter checkbox 
    415417        index = self.widget._poly_model.index(0,0) 
     418 
     419        #self.widget.show() 
     420        #QtWidgets.QApplication(sys.argv).exec_() 
     421 
     422 
    416423        # Set the checbox 
    417424        self.widget._poly_model.item(0,0).setCheckState(2) 
     
    455462        category_index = self.widget.cbCategory.findText("Cylinder") 
    456463        self.widget.cbCategory.setCurrentIndex(category_index) 
     464        model_index = self.widget.cbModel.findText("barbell") 
     465        self.widget.cbModel.setCurrentIndex(model_index) 
    457466 
    458467        # call method with default settings 
     
    465474        # check values 
    466475        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 35) 
    467         self.assertAlmostEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 1.70325, 5) 
     476        self.assertAlmostEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 1.73205, 5) 
    468477        # Change the index 
    469478        self.widget.onPolyComboIndexChange('lognormal', 0) 
     
    498507        category_index = self.widget.cbCategory.findText("Cylinder") 
    499508        self.widget.cbCategory.setCurrentIndex(category_index) 
     509        model_index = self.widget.cbModel.findText("barbell") 
     510        self.widget.cbModel.setCurrentIndex(model_index) 
    500511 
    501512        self.widget.onPolyComboIndexChange('array', 0) 
     
    546557 
    547558        header_tooltips = ['Select parameter for fitting', 
    548                              'Enter parameter value', 
    549                              'Enter minimum value for parameter', 
    550                              'Enter maximum value for parameter', 
    551                              'Unit of the parameter'] 
     559                           'Enter parameter value', 
     560                           'Enter minimum value for parameter', 
     561                           'Enter maximum value for parameter', 
     562                           'Unit of the parameter'] 
    552563        for column, tooltip in enumerate(header_tooltips): 
    553564             self.assertEqual(self.widget._magnet_model.headerData(column, 
  • src/sas/qtgui/Perspectives/Invariant/UnitTesting/InvariantPerspectiveTest.py

    r80468f6 r144fe21  
    2323import sas.qtgui.Utilities.GuiUtils as GuiUtils 
    2424 
    25 #if not QtWidgets.QApplication.instance(): 
    26 app = QtWidgets.QApplication(sys.argv) 
     25if not QtWidgets.QApplication.instance(): 
     26    app = QtWidgets.QApplication(sys.argv) 
    2727 
    2828BG_COLOR_ERR = 'background-color: rgb(244, 170, 164);' 
  • src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py

    • Property mode changed from 100755 to 100644
    r72ecbdf2 r144fe21  
    1212import sas.qtgui.Utilities.GuiUtils as GuiUtils 
    1313 
    14 #if not QtWidgets.QApplication.instance(): 
    15 app = QtWidgets.QApplication(sys.argv) 
     14if not QtWidgets.QApplication.instance(): 
     15    app = QtWidgets.QApplication(sys.argv) 
    1616 
    1717 
     
    1919    HELP_DIRECTORY_LOCATION = "html" 
    2020    communicate = Communicate() 
    21  
    2221    def communicator(self): 
    2322        return self.communicate 
     
    2928    def setUp(self): 
    3029        """ Create the InversionWindow """ 
    31         self.widget = InversionWindow(dummy_manager()) 
     30 
     31        self.widget = InversionWindow(parent=dummy_manager()) 
     32        self.widget._parent = QtWidgets.QMainWindow() 
     33        self.widget.showBatchOutput = MagicMock() 
     34        self.widget.startThread = MagicMock() 
     35        self.widget.startThreadAll = MagicMock() 
    3236        self.widget.show() 
     37 
    3338        self.fakeData1 = GuiUtils.HashableStandardItem("A") 
    3439        self.fakeData2 = GuiUtils.HashableStandardItem("B") 
     
    96101        self.assertTrue(self.widget.allowBatch()) 
    97102        self.assertFalse(self.widget.isBatch) 
    98         self.assertIsNone(self.widget.batchResultsWindow) 
    99103        self.assertFalse(self.widget.calculateAllButton.isEnabled()) 
    100104        self.assertEqual(len(self.widget.batchResults), 0) 
    101105        self.assertEqual(len(self.widget.batchComplete), 0) 
    102106        self.widget.closeBatchResults() 
    103         self.assertIsNone(self.widget.batchResultsWindow) 
    104107 
    105108    def zeroDataSetState(self): 
     
    206209        self.assertTrue(self.widget.isMinimized()) 
    207210        self.assertIsNone(self.widget.dmaxWindow) 
    208         self.assertIsNone(self.widget.batchResultsWindow) 
    209211        self.widget.setClosable(False) 
    210212        self.assertFalse(self.widget.isClosable()) 
  • src/sas/qtgui/Plotting/UnitTesting/PlotHelperTest.py

    r83eb5208 r573c383  
    1818        self.assertIsInstance(PlotHelper._plots, dict) 
    1919        self.assertEqual(PlotHelper._plots, {}) 
    20         self.assertEqual(PlotHelper._plot_id, 0) 
     20        # could have leftovers from previous tests 
     21        #self.assertEqual(PlotHelper._plot_id, 0) 
    2122 
    2223    def testFunctions(self): 
  • src/sas/qtgui/Plotting/UnitTesting/Plotter2DTest.py

    r53c771e r144fe21  
    148148        self.assertEqual(len(actions), 7) 
    149149 
    150         # Trigger Save Image and make sure the method is called 
    151         self.assertEqual(actions[0].text(), "Save Image") 
    152         self.plotter.toolbar.save_figure = MagicMock() 
    153         actions[0].trigger() 
    154         self.assertTrue(self.plotter.toolbar.save_figure.called) 
    155  
    156150        # Trigger Print Image and make sure the method is called 
    157151        self.assertEqual(actions[1].text(), "Print Image") 
  • src/sas/qtgui/Plotting/UnitTesting/PlotterBaseTest.py

    rdd150ef r144fe21  
    4747        self.assertIsInstance(self.plotter, QtWidgets.QWidget) 
    4848        self.assertIsInstance(self.plotter.canvas, FigureCanvas) 
    49         self.assertIsInstance(self.plotter.toolbar, NavigationToolbar) 
    5049        self.assertIsInstance(self.plotter.properties, ScaleProperties) 
    5150 
     
    8483        self.plotter.closeEvent(None) 
    8584        self.assertTrue(PlotHelper.deletePlot.called) 
    86  
    87     def testOnImageSave(self): 
    88         ''' test the workspace save ''' 
    89         self.plotter.toolbar.save_figure = MagicMock() 
    90         self.plotter.onImageSave() 
    91         self.assertTrue(self.plotter.toolbar.save_figure.called) 
    9285 
    9386    def testOnImagePrint(self): 
     
    132125        actions = self.plotter.contextMenu.actions() 
    133126        self.assertEqual(len(actions), 4) 
    134  
    135         # Trigger Save Image and make sure the method is called 
    136         self.assertEqual(actions[0].text(), "Save Image") 
    137         self.plotter.toolbar.save_figure = MagicMock() 
    138         actions[0].trigger() 
    139         self.assertTrue(self.plotter.toolbar.save_figure.called) 
    140127 
    141128        # Trigger Print Image and make sure the method is called 
  • src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py

    r63319b0 r144fe21  
    104104        actions = self.plotter.contextMenu.actions() 
    105105        self.assertEqual(len(actions), 7) 
    106  
    107         # Trigger Save Image and make sure the method is called 
    108         self.assertEqual(actions[0].text(), "Save Image") 
    109         self.plotter.toolbar.save_figure = MagicMock() 
    110         actions[0].trigger() 
    111         self.assertTrue(self.plotter.toolbar.save_figure.called) 
    112106 
    113107        # Trigger Print Image and make sure the method is called 
  • src/sas/qtgui/Utilities/UnitTesting/ReportDialogTest.py

    • Property mode changed from 100755 to 100644
    r57be490 r144fe21  
    1010 
    1111from PyQt5 import QtWidgets, QtPrintSupport 
     12from PyQt5.QtTest import QTest 
    1213 
    1314# set up import paths 
     
    4041    def tearDown(self): 
    4142        '''Destroy the GUI''' 
    42         #self.widget.close() 
    4343        self.widget = None 
    4444 
     
    5252        document = self.widget.txtBrowser.document() 
    5353        document.print = MagicMock() 
    54  
     54        self.setUp() 
    5555        # test rejected dialog 
    5656        QtPrintSupport.QPrintDialog.exec_ = MagicMock(return_value=QtWidgets.QDialog.Rejected) 
     
    6565        QtPrintSupport.QPrintDialog.exec_ = MagicMock(return_value=QtWidgets.QDialog.Accepted) 
    6666 
     67        # This potentially spawns a "file to write to" dialog, if say, a PrintToPDF is the 
     68        # default printer 
     69 
    6770        # invoke the method 
    68         self.widget.onPrint() 
     71        #self.widget.onPrint() 
    6972 
    7073        # Assure printing was done 
    71         self.assertTrue(document.print.called) 
     74        #self.assertTrue(document.print.called) 
    7275 
    7376 
     
    7881        os.startfile = MagicMock() 
    7982        os.system = MagicMock() 
     83        self.setUp() 
    8084 
    8185        # conversion failed 
     
    9296 
    9397        # conversion succeeded 
     98        temp_html2pdf = self.widget.HTML2PDF 
    9499        self.widget.HTML2PDF = MagicMock(return_value=0) 
    95100 
     
    121126        self.assertTrue(self.widget.onHTMLSave) 
    122127 
     128        self.widget.HTML2PDF = temp_html2pdf 
     129 
     130 
    123131    def testGetPictures(self): 
    124132        ''' Saving MPL charts and returning filenames ''' 
     
    131139        pisa.CreatePDF = MagicMock(return_value=pisa_dummy()) 
    132140        open = MagicMock(return_value="y") 
     141        self.setUp() 
     142 
     143        QTest.qWait(100) 
    133144 
    134145        data = self.widget.txtBrowser.toHtml() 
  • 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/UI/FittingWidgetUI.ui

    rd4dac80 r1f95cbe  
    77    <x>0</x> 
    88    <y>0</y> 
    9     <width>680</width> 
    10     <height>605</height> 
     9    <width>552</width> 
     10    <height>609</height> 
    1111   </rect> 
    1212  </property> 
     
    1919  <property name="minimumSize"> 
    2020   <size> 
    21     <width>434</width> 
     21    <width>481</width> 
    2222    <height>466</height> 
    2323   </size> 
     
    8282      </attribute> 
    8383      <layout class="QGridLayout" name="gridLayout_4"> 
    84        <item row="0" column="0" colspan="4"> 
     84       <item row="1" column="0"> 
     85        <widget class="QGroupBox" name="groupBox_7"> 
     86         <property name="title"> 
     87          <string>Options </string> 
     88         </property> 
     89         <layout class="QVBoxLayout" name="verticalLayout"> 
     90          <item> 
     91           <widget class="QCheckBox" name="chkPolydispersity"> 
     92            <property name="enabled"> 
     93             <bool>true</bool> 
     94            </property> 
     95            <property name="toolTip"> 
     96             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on orientational polydispersity.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     97            </property> 
     98            <property name="text"> 
     99             <string>Polydispersity</string> 
     100            </property> 
     101            <property name="checkable"> 
     102             <bool>true</bool> 
     103            </property> 
     104           </widget> 
     105          </item> 
     106          <item> 
     107           <widget class="QCheckBox" name="chk2DView"> 
     108            <property name="enabled"> 
     109             <bool>true</bool> 
     110            </property> 
     111            <property name="toolTip"> 
     112             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on 2D view of the model.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     113            </property> 
     114            <property name="text"> 
     115             <string>2D view</string> 
     116            </property> 
     117            <property name="checkable"> 
     118             <bool>true</bool> 
     119            </property> 
     120           </widget> 
     121          </item> 
     122          <item> 
     123           <widget class="QCheckBox" name="chkMagnetism"> 
     124            <property name="enabled"> 
     125             <bool>true</bool> 
     126            </property> 
     127            <property name="toolTip"> 
     128             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on magnetic scattering parameters.&lt;/p&gt;&lt;p&gt;This option is available only for 2D models.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     129            </property> 
     130            <property name="text"> 
     131             <string>Magnetism</string> 
     132            </property> 
     133            <property name="checkable"> 
     134             <bool>true</bool> 
     135            </property> 
     136           </widget> 
     137          </item> 
     138          <item> 
     139           <widget class="QCheckBox" name="chkChainFit"> 
     140            <property name="enabled"> 
     141             <bool>true</bool> 
     142            </property> 
     143            <property name="toolTip"> 
     144             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on Chain Fitting (parameter reuse) for batch datasets.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     145            </property> 
     146            <property name="text"> 
     147             <string>Chain fit</string> 
     148            </property> 
     149            <property name="checkable"> 
     150             <bool>true</bool> 
     151            </property> 
     152           </widget> 
     153          </item> 
     154         </layout> 
     155        </widget> 
     156       </item> 
     157       <item row="1" column="3"> 
     158        <widget class="QGroupBox" name="groupBox_8"> 
     159         <property name="title"> 
     160          <string>Fitting details </string> 
     161         </property> 
     162         <layout class="QGridLayout" name="gridLayout_17"> 
     163          <item row="0" column="0" colspan="2"> 
     164           <layout class="QGridLayout" name="gridLayout_8"> 
     165            <item row="0" column="0"> 
     166             <widget class="QLabel" name="label_16"> 
     167              <property name="text"> 
     168               <string>Min range</string> 
     169              </property> 
     170             </widget> 
     171            </item> 
     172            <item row="0" column="1"> 
     173             <widget class="QLabel" name="lblMinRangeDef"> 
     174              <property name="text"> 
     175               <string>0.005</string> 
     176              </property> 
     177             </widget> 
     178            </item> 
     179            <item row="0" column="2"> 
     180             <widget class="QLabel" name="label_17"> 
     181              <property name="text"> 
     182               <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
     183&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     184              </property> 
     185             </widget> 
     186            </item> 
     187            <item row="1" column="0"> 
     188             <widget class="QLabel" name="label_18"> 
     189              <property name="text"> 
     190               <string>Max range</string> 
     191              </property> 
     192             </widget> 
     193            </item> 
     194            <item row="1" column="1"> 
     195             <widget class="QLabel" name="lblMaxRangeDef"> 
     196              <property name="text"> 
     197               <string>0.1</string> 
     198              </property> 
     199             </widget> 
     200            </item> 
     201            <item row="1" column="2"> 
     202             <widget class="QLabel" name="label_19"> 
     203              <property name="text"> 
     204               <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
     205&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     206              </property> 
     207             </widget> 
     208            </item> 
     209           </layout> 
     210          </item> 
     211          <item row="1" column="0"> 
     212           <widget class="QLabel" name="label_20"> 
     213            <property name="text"> 
     214             <string>Smearing:</string> 
     215            </property> 
     216           </widget> 
     217          </item> 
     218          <item row="1" column="1"> 
     219           <widget class="QLabel" name="lblCurrentSmearing"> 
     220            <property name="text"> 
     221             <string>None</string> 
     222            </property> 
     223           </widget> 
     224          </item> 
     225         </layout> 
     226        </widget> 
     227       </item> 
     228       <item row="0" column="0" colspan="6"> 
    85229        <widget class="QGroupBox" name="groupBox_6"> 
    86230         <property name="sizePolicy"> 
     
    156300        </widget> 
    157301       </item> 
    158        <item row="1" column="0"> 
    159         <widget class="QGroupBox" name="groupBox_7"> 
    160          <property name="title"> 
    161           <string>Options </string> 
    162          </property> 
    163          <layout class="QVBoxLayout" name="verticalLayout"> 
    164           <item> 
    165            <widget class="QCheckBox" name="chkPolydispersity"> 
    166             <property name="enabled"> 
    167              <bool>true</bool> 
    168             </property> 
    169             <property name="toolTip"> 
    170              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on orientational polydispersity.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    171             </property> 
    172             <property name="text"> 
    173              <string>Polydispersity</string> 
    174             </property> 
    175             <property name="checkable"> 
    176              <bool>true</bool> 
    177             </property> 
    178            </widget> 
    179           </item> 
    180           <item> 
    181            <widget class="QCheckBox" name="chk2DView"> 
    182             <property name="enabled"> 
    183              <bool>true</bool> 
    184             </property> 
    185             <property name="toolTip"> 
    186              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on 2D view of the model.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    187             </property> 
    188             <property name="text"> 
    189              <string>2D view</string> 
    190             </property> 
    191             <property name="checkable"> 
    192              <bool>true</bool> 
    193             </property> 
    194            </widget> 
    195           </item> 
    196           <item> 
    197            <widget class="QCheckBox" name="chkMagnetism"> 
    198             <property name="enabled"> 
    199              <bool>true</bool> 
    200             </property> 
    201             <property name="toolTip"> 
    202              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on magnetic scattering parameters.&lt;/p&gt;&lt;p&gt;This option is available only for 2D models.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    203             </property> 
    204             <property name="text"> 
    205              <string>Magnetism</string> 
    206             </property> 
    207             <property name="checkable"> 
    208              <bool>true</bool> 
    209             </property> 
    210            </widget> 
    211           </item> 
    212           <item> 
    213            <widget class="QCheckBox" name="chkChainFit"> 
    214             <property name="enabled"> 
    215              <bool>true</bool> 
    216             </property> 
    217             <property name="toolTip"> 
    218              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on Chain Fitting (parameter reuse) for batch datasets.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    219             </property> 
    220             <property name="text"> 
    221              <string>Chain fit</string> 
    222             </property> 
    223             <property name="checkable"> 
    224              <bool>true</bool> 
    225             </property> 
    226            </widget> 
    227           </item> 
    228          </layout> 
    229         </widget> 
    230        </item> 
    231        <item row="1" column="1"> 
    232         <widget class="QGroupBox" name="groupBox_8"> 
    233          <property name="title"> 
    234           <string>Fitting details </string> 
    235          </property> 
    236          <layout class="QGridLayout" name="gridLayout_17"> 
    237           <item row="0" column="0" colspan="2"> 
    238            <layout class="QGridLayout" name="gridLayout_8"> 
    239             <item row="0" column="0"> 
    240              <widget class="QLabel" name="label_16"> 
    241               <property name="text"> 
    242                <string>Min range</string> 
    243               </property> 
    244              </widget> 
    245             </item> 
    246             <item row="0" column="1"> 
    247              <widget class="QLabel" name="lblMinRangeDef"> 
    248               <property name="text"> 
    249                <string>0.005</string> 
    250               </property> 
    251              </widget> 
    252             </item> 
    253             <item row="0" column="2"> 
    254              <widget class="QLabel" name="label_17"> 
    255               <property name="text"> 
    256                <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
    257 &lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    258               </property> 
    259              </widget> 
    260             </item> 
    261             <item row="1" column="0"> 
    262              <widget class="QLabel" name="label_18"> 
    263               <property name="text"> 
    264                <string>Max range</string> 
    265               </property> 
    266              </widget> 
    267             </item> 
    268             <item row="1" column="1"> 
    269              <widget class="QLabel" name="lblMaxRangeDef"> 
    270               <property name="text"> 
    271                <string>0.1</string> 
    272               </property> 
    273              </widget> 
    274             </item> 
    275             <item row="1" column="2"> 
    276              <widget class="QLabel" name="label_19"> 
    277               <property name="text"> 
    278                <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
    279 &lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    280               </property> 
    281              </widget> 
    282             </item> 
    283            </layout> 
    284           </item> 
    285           <item row="1" column="0"> 
    286            <widget class="QLabel" name="label_20"> 
    287             <property name="text"> 
    288              <string>Smearing:</string> 
    289             </property> 
    290            </widget> 
    291           </item> 
    292           <item row="1" column="1"> 
    293            <widget class="QLabel" name="lblCurrentSmearing"> 
    294             <property name="text"> 
    295              <string>None</string> 
    296             </property> 
    297            </widget> 
    298           </item> 
    299          </layout> 
    300         </widget> 
    301        </item> 
    302302       <item row="1" column="2"> 
    303303        <spacer name="horizontalSpacer_3"> 
     
    307307         <property name="sizeHint" stdset="0"> 
    308308          <size> 
    309            <width>207</width> 
     309           <width>150</width> 
    310310           <height>20</height> 
    311311          </size> 
     
    313313        </spacer> 
    314314       </item> 
    315        <item row="1" column="3"> 
     315       <item row="1" column="5"> 
    316316        <widget class="QGroupBox" name="groupBox_9"> 
    317317         <property name="title"> 
     
    336336            </item> 
    337337           </layout> 
     338          </item> 
     339         </layout> 
     340        </widget> 
     341       </item> 
     342       <item row="1" column="1"> 
     343        <widget class="QGroupBox" name="groupBox"> 
     344         <property name="title"> 
     345          <string>S(Q) options</string> 
     346         </property> 
     347         <layout class="QVBoxLayout" name="verticalLayout_2"> 
     348          <item> 
     349           <widget class="QLabel" name="label_3"> 
     350            <property name="text"> 
     351             <string>Calc. method</string> 
     352            </property> 
     353           </widget> 
     354          </item> 
     355          <item> 
     356           <widget class="QComboBox" name="cbProductMethod"> 
     357            <property name="enabled"> 
     358             <bool>false</bool> 
     359            </property> 
     360            <property name="minimumSize"> 
     361             <size> 
     362              <width>83</width> 
     363              <height>0</height> 
     364             </size> 
     365            </property> 
     366           </widget> 
     367          </item> 
     368          <item> 
     369           <spacer name="verticalSpacer"> 
     370            <property name="orientation"> 
     371             <enum>Qt::Vertical</enum> 
     372            </property> 
     373            <property name="sizeType"> 
     374             <enum>QSizePolicy::Fixed</enum> 
     375            </property> 
     376            <property name="sizeHint" stdset="0"> 
     377             <size> 
     378              <width>20</width> 
     379              <height>40</height> 
     380             </size> 
     381            </property> 
     382           </spacer> 
    338383          </item> 
    339384         </layout> 
  • src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py

    rfde5bcd r78f18d1  
    44 
    55import sas.qtgui.Utilities.GuiUtils as GuiUtils 
     6 
     7import logging 
     8logger = logging.getLogger(__name__) 
    69 
    710class ModelViewDelegate(QtWidgets.QStyledItemDelegate): 
     
    102105                return 
    103106        QtWidgets.QStyledItemDelegate.setModelData(self, editor, model, index) 
    104  
    105107 
    106108class PolyViewDelegate(QtWidgets.QStyledItemDelegate): 
Note: See TracChangeset for help on using the changeset viewer.