Changeset cb39d66 in sasview for src


Ignore:
Timestamp:
Sep 25, 2018 3:50:43 PM (6 years ago)
Author:
GitHub <noreply@…>
Branches:
ESS_GUI, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
Children:
49699a3
Parents:
34f13a83 (diff), d99b1a5 (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.
git-author:
Torin Cooper-Bennun <40573959+tcbennun@…> (09/25/18 15:50:43)
git-committer:
GitHub <noreply@…> (09/25/18 15:50:43)
Message:

Merge pull request #184 from SasView?/ESS_GUI_iss1052

SASVIEW-1052: Let user choose if radius_effective is computed from form factor, or free/fittable

Location:
src/sas
Files:
29 edited

Legend:

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

    ra54bbf2b radf1c2a  
    223223        return plots 
    224224 
     225    def getScalarIntermediateResults(self, return_data): 
     226        """ 
     227        Returns a dict of scalar-only intermediate results from the return data. 
     228        """ 
     229        res = {} 
     230        for name, int_res in return_data["intermediate_results"].items(): 
     231            if isinstance(int_res, np.ndarray): 
     232                continue 
     233            res[name] = int_res 
     234        return res 
     235 
    225236    def computeDataRange(self): 
    226237        """ 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    r9b9ec10 rcb39d66  
    22972297        # TODO: multishell params in self.kernel_module.details[??] = value 
    22982298 
     2299        # handle display of effective radius parameter according to radius_effective_mode; pass ER into model if 
     2300        # necessary 
     2301        self.processEffectiveRadius() 
     2302 
    22992303        # Force the chart update when actual parameters changed 
    23002304        if model_column == 1: 
     
    23032307        # Update state stack 
    23042308        self.updateUndo() 
     2309 
     2310    def processEffectiveRadius(self): 
     2311        """ 
     2312        Checks the value of radius_effective_mode, if existent, and processes radius_effective as necessary. 
     2313        * mode == 0: This means 'unconstrained'; ensure use can specify ER. 
     2314        * mode > 0: This means it is constrained to a P(Q)-computed value in sasmodels; prevent user from editing ER. 
     2315 
     2316        Note: If ER has been computed, it is passed back to SasView as an intermediate result. That value must be 
     2317        displayed for the user; that is not dealt with here, but in complete1D. 
     2318        """ 
     2319        ER_row = self.getRowFromName("radius_effective") 
     2320        if ER_row is None: 
     2321            return 
     2322 
     2323        ER_mode_row = self.getRowFromName("radius_effective_mode") 
     2324        if ER_mode_row is None: 
     2325            return 
     2326 
     2327        try: 
     2328            ER_mode = int(self._model_model.item(ER_mode_row, 1).text()) 
     2329        except ValueError: 
     2330            logging.error("radius_effective_mode was set to an invalid value.") 
     2331            return 
     2332 
     2333        if ER_mode == 0: 
     2334            # ensure the ER value can be modified by user 
     2335            self.setParamEditableByRow(ER_row, True) 
     2336        elif ER_mode > 0: 
     2337            # ensure the ER value cannot be modified by user 
     2338            self.setParamEditableByRow(ER_row, False) 
     2339        else: 
     2340            logging.error("radius_effective_mode was set to an invalid value.") 
     2341 
     2342    def setParamEditableByRow(self, row, editable=True): 
     2343        """ 
     2344        Sets whether the user can edit a parameter in the table. If they cannot, the parameter name's font is changed, 
     2345        the value itself cannot be edited if clicked on, and the parameter may not be fitted. 
     2346        """ 
     2347        item_name = self._model_model.item(row, 0) 
     2348        item_value = self._model_model.item(row, 1) 
     2349 
     2350        item_value.setEditable(editable) 
     2351 
     2352        if editable: 
     2353            # reset font 
     2354            item_name.setFont(QtGui.QFont()) 
     2355            # reset colour 
     2356            item_name.setForeground(QtGui.QBrush()) 
     2357            # make checkable 
     2358            item_name.setCheckable(True) 
     2359        else: 
     2360            # change font 
     2361            font = QtGui.QFont() 
     2362            font.setItalic(True) 
     2363            item_name.setFont(font) 
     2364            # change colour 
     2365            item_name.setForeground(QtGui.QBrush(QtGui.QColor(50, 50, 50))) 
     2366            # make not checkable (and uncheck) 
     2367            item_name.setCheckState(QtCore.Qt.Unchecked) 
     2368            item_name.setCheckable(False) 
    23052369 
    23062370    def isCheckable(self, row): 
     
    25352599            self.communicate.plotUpdateSignal.emit([plot]) 
    25362600 
     2601        # Update radius_effective if relevant 
     2602        self.updateEffectiveRadius(return_data) 
     2603 
    25372604    def complete2D(self, return_data): 
    25382605        """ 
     
    25612628        for plot in new_plots: 
    25622629            self.communicate.plotUpdateSignal.emit([plot]) 
     2630 
     2631    def updateEffectiveRadius(self, return_data): 
     2632        """ 
     2633        Given return data from sasmodels, update the effective radius parameter in the GUI table with the new 
     2634        calculated value as returned by sasmodels (if the value was returned). 
     2635        """ 
     2636        ER_mode_row = self.getRowFromName("radius_effective_mode") 
     2637        if ER_mode_row is None: 
     2638            return 
     2639        try: 
     2640            ER_mode = int(self._model_model.item(ER_mode_row, 1).text()) 
     2641        except ValueError: 
     2642            logging.error("radius_effective_mode was set to an invalid value.") 
     2643            return 
     2644        if ER_mode < 1: 
     2645            # does not need updating if it is not being computed 
     2646            return 
     2647 
     2648        ER_row = self.getRowFromName("radius_effective") 
     2649        if ER_row is None: 
     2650            return 
     2651 
     2652        scalar_results = self.logic.getScalarIntermediateResults(return_data) 
     2653        ER_value = scalar_results.get("effective_radius") # note name of key 
     2654        if ER_value is None: 
     2655            return 
     2656        # ensure the model does not recompute when updating the value 
     2657        self._model_model.blockSignals(True) 
     2658        self._model_model.item(ER_row, 1).setText(str(ER_value)) 
     2659        self._model_model.blockSignals(False) 
     2660        # ensure the view is updated immediately 
     2661        self._model_model.layoutChanged.emit() 
    25632662 
    25642663    def calculateResiduals(self, fitted_data): 
  • src/sas/qtgui/Calculators/GenericScatteringCalculator.py

    raed0532 r30e0be0  
    3232 
    3333    trigger_plot_3d = QtCore.pyqtSignal() 
     34    calculationFinishedSignal = QtCore.pyqtSignal() 
    3435 
    3536    def __init__(self, parent=None): 
     
    100101        # plots - 3D in real space 
    101102        self.trigger_plot_3d.connect(lambda: self.plot3d(has_arrow=False)) 
     103 
     104        # plots - 3D in real space 
     105        self.calculationFinishedSignal.connect(self.plot_1_2d) 
    102106 
    103107        # TODO the option Ellipsoid has not been implemented 
     
    545549            d = threads.deferToThread(self.complete, inputs, self._update) 
    546550            # Add deferred callback for call return 
    547             d.addCallback(self.plot_1_2d) 
     551            #d.addCallback(self.plot_1_2d) 
     552            d.addCallback(self.calculateComplete) 
    548553            d.addErrback(self.calculateFailed) 
    549554        except: 
     
    563568        print("Calculate Failed with:\n", reason) 
    564569        pass 
     570 
     571    def calculateComplete(self, d): 
     572        """ 
     573        Notify the main thread 
     574        """ 
     575        self.calculationFinishedSignal.emit() 
    565576 
    566577    def complete(self, input, update=None): 
     
    629640        self.graph_num += 1 
    630641 
    631     def plot_1_2d(self, d): 
     642    def plot_1_2d(self): 
    632643        """ Generate 1D or 2D plot, called in Compute""" 
    633644        if self.is_avg or self.is_avg is None: 
     
    637648            data.xaxis('\\rm{Q_{x}}', '\AA^{-1}') 
    638649            data.yaxis('\\rm{Intensity}', 'cm^{-1}') 
    639             plot1D = Plotter(self) 
     650            plot1D = Plotter(self, quickplot=True) 
    640651            plot1D.plot(data) 
    641652            plot1D.show() 
     
    655666            data.title = "GenSAS {}  #{} 2D".format(self.file_name, 
    656667                                                    int(self.graph_num)) 
    657             plot2D = Plotter2D(self) 
     668            plot2D = Plotter2D(self, quickplot=True) 
    658669            plot2D.plot(data) 
    659670            plot2D.show() 
     
    825836        self.figure.canvas.draw() 
    826837 
     838    def createContextMenu(self): 
     839        """ 
     840        Define common context menu and associated actions for the MPL widget 
     841        """ 
     842        return 
     843 
     844    def createContextMenuQuick(self): 
     845        """ 
     846        Define context menu and associated actions for the quickplot MPL widget 
     847        """ 
     848        return 
     849 
    827850 
    828851class Plotter3D(QtWidgets.QDialog, Plotter3DWidget): 
  • src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py

    r144fe21 r30e0be0  
    517517            cal_res.addErrback(self.calculateFailed) 
    518518 
    519             # logging.info("Computation is in progress...") 
    520519            self.cmdCompute.setText('Wait...') 
    521520            self.cmdCompute.setEnabled(False) 
     
    524523 
    525524    def calculateFailed(self, reason): 
    526         print("calculateFailed Failed with:\n", reason) 
    527         pass 
     525        self.cmdCompute.setText('Compute') 
     526        self.cmdCompute.setEnabled(True) 
     527        logging.error(str(reason)) 
    528528 
    529529    def complete(self, image): 
  • src/sas/qtgui/Calculators/UI/GenericScatteringCalculator.ui

    r457d961 r30e0be0  
    164164           </property> 
    165165          </item> 
    166           <item> 
    167            <property name="text"> 
    168             <string>Ellipsoid</string> 
    169            </property> 
    170           </item> 
    171166         </widget> 
    172167        </item> 
  • src/sas/qtgui/Calculators/UnitTesting/GenericScatteringCalculatorTest.py

    re90988c r30e0be0  
    9191                             ['Fixed orientation', 'Debye full avg.']) 
    9292 
    93         self.assertEqual(self.widget.cbShape.count(), 2) 
     93        self.assertEqual(self.widget.cbShape.count(), 1) 
    9494        self.assertEqual(self.widget.cbShape.currentIndex(), 0) 
    9595        self.assertListEqual([self.widget.cbShape.itemText(i) for i in 
    9696                              range(self.widget.cbShape.count())], 
    97                              ['Rectangular', 'Ellipsoid']) 
     97                             ['Rectangular']) 
     98                             #['Rectangular', 'Ellipsoid']) 
    9899        self.assertFalse(self.widget.cbShape.isEditable()) 
    99100        # disable buttons 
  • src/sas/qtgui/GUITests.py

    rccd2b87 r712db9e  
    211211                print("\nAll tests successful") 
    212212 
    213         except KeyError: 
     213        except KeyError as ex: 
    214214            print("Failure : %s "%str(ex)) 
    215215            print("ERROR: Incorrect suite name: %s " % suite) 
  • src/sas/qtgui/MainWindow/DataExplorer.py

    r30bed93 r6ae7466  
    385385        # Which perspective has been selected? 
    386386        if len(selected_items) > 1 and not self._perspective().allowBatch(): 
    387             msg = self._perspective().title() + " does not allow multiple data." 
     387            if hasattr(self._perspective(), 'title'): 
     388                title = self._perspective().title() 
     389            else: 
     390                title = self._perspective().windowTitle() 
     391            msg = title + " does not allow multiple data." 
    388392            msgbox = QtWidgets.QMessageBox() 
    389393            msgbox.setIcon(QtWidgets.QMessageBox.Critical) 
     
    394398 
    395399        # Notify the GuiManager about the send request 
    396         self._perspective().setData(data_item=selected_items, is_batch=self.chkBatch.isChecked()) 
     400        try: 
     401            self._perspective().setData(data_item=selected_items, is_batch=self.chkBatch.isChecked()) 
     402        except Exception as ex: 
     403            msg = "%s perspective returned the following message: \n%s\n" %(self._perspective().name, str(ex)) 
     404            logging.error(msg) 
     405            msg = str(ex) 
     406            msgbox = QtWidgets.QMessageBox() 
     407            msgbox.setIcon(QtWidgets.QMessageBox.Critical) 
     408            msgbox.setText(msg) 
     409            msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) 
     410            retval = msgbox.exec_() 
     411 
    397412 
    398413    def freezeCheckedData(self): 
  • src/sas/qtgui/MainWindow/GuiManager.py

    rdad086f rfa762f4  
    138138        self.categoryManagerWidget = CategoryManager(self._parent, manager=self) 
    139139        self.grid_window = None 
     140        self.grid_window = BatchOutputPanel(parent=self) 
     141        self.grid_subwindow = self._workspace.workspace.addSubWindow(self.grid_window) 
     142        self.grid_subwindow.setVisible(False) 
     143        self.grid_window.windowClosedSignal.connect(lambda: self.grid_subwindow.setVisible(False)) 
     144 
    140145        self._workspace.toolBar.setVisible(LocalConfig.TOOLBAR_SHOW) 
    141146        self._workspace.actionHide_Toolbar.setText("Show Toolbar") 
     
    202207        Open a local url in the default browser 
    203208        """ 
    204         location = GuiUtils.HELP_DIRECTORY_LOCATION + url 
    205         #WP: Added to handle OSX bundle docs 
    206         if os.path.isdir(location) == False: 
    207             sas_path = os.path.abspath(os.path.dirname(sys.argv[0])) 
    208             location = sas_path+"/"+location 
    209         try: 
    210             webbrowser.open('file://' + os.path.realpath(location)) 
    211         except webbrowser.Error as ex: 
    212             logging.warning("Cannot display help. %s" % ex) 
     209        GuiUtils.showHelp(url) 
    213210 
    214211    def workspace(self): 
     
    624621        Display/redisplay the batch fit viewer 
    625622        """ 
    626         if self.grid_window is None: 
    627             self.grid_window = BatchOutputPanel(parent=self, output_data=output_data) 
    628             subwindow = self._workspace.workspace.addSubWindow(self.grid_window) 
    629  
    630             #self.grid_window = BatchOutputPanel(parent=self, output_data=output_data) 
    631             self.grid_window.show() 
    632             return 
     623        self.grid_subwindow.setVisible(True) 
    633624        if output_data: 
    634625            self.grid_window.addFitResults(output_data) 
    635         self.grid_window.show() 
    636         if self.grid_window.windowState() == Qt.WindowMinimized: 
    637             self.grid_window.setWindowState(Qt.WindowActive) 
    638626 
    639627    def actionHide_Toolbar(self): 
  • src/sas/qtgui/MainWindow/UnitTesting/GuiManagerTest.py

    r768387e0 rfa762f4  
    6161        self.assertIsInstance(self.manager.ackWidget, Acknowledgements) 
    6262        self.assertIsInstance(self.manager.aboutWidget, AboutBox) 
    63         self.assertIsInstance(self.manager.welcomePanel, WelcomePanel) 
     63        #self.assertIsInstance(self.manager.welcomePanel, WelcomePanel) 
    6464 
    6565    def skip_testLogging(self): 
  • src/sas/qtgui/MainWindow/UnitTesting/MainWindowTest.py

    r8353d90 rfa762f4  
    4747        tmp_main.showMaximized() 
    4848        # See that only one subwindow is up 
    49         self.assertEqual(len(tmp_main.workspace.subWindowList()), 1) 
     49        self.assertEqual(len(tmp_main.workspace.subWindowList()), 2) 
    5050        # and that the subwindow is the fitting perspective 
    5151        self.assertIsInstance(tmp_main.workspace.subWindowList()[0].widget(), 
  • src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py

    r10fee37 r9b9ec10  
    6363        self.fittingStoppedSignal.connect(self.onFittingStopped) 
    6464 
     65        self.communicate.copyFitParamsSignal.connect(self.onParamCopy) 
     66        self.communicate.pasteFitParamsSignal.connect(self.onParamPaste) 
     67 
    6568        # Perspective window not allowed to close by default 
    6669        self._allow_close = False 
     
    9497 
    9598        self._allow_close = value 
     99 
     100    def onParamCopy(self): 
     101        self.currentTab.onParameterCopy("") 
     102 
     103    def onParamPaste(self): 
     104        self.currentTab.onParameterPaste() 
    96105 
    97106    def closeEvent(self, event): 
     
    298307            page_name = "Page%s"%tab_object.tab_id 
    299308            if any([page_name in tab for tab in tabs_for_fitting]): 
    300                 tab_object.setFittingStarted() 
     309                tab_object.disableInteractiveElements() 
    301310 
    302311        pass 
     
    315324            page_name = "Page%s"%tab_object.tab_id 
    316325            if any([page_name in tab for tab in tabs_for_fitting]): 
    317                 tab_object.setFittingStopped() 
     326                tab_object.enableInteractiveElements() 
    318327 
    319328        pass 
  • src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py

    r30bed93 r65759c7  
    484484                    endl = i 
    485485                    break 
    486             # make sure we have correct lengths 
    487             assert len(x_current) == len(x_reference[begin:end-endl]) 
    488486 
    489487            y = (fn - gn[begin:end-endl])/en 
     
    549547                      "Data2D": residualsData2D} 
    550548 
    551     residuals = residuals_dict[method_name](reference_data, data_copy) 
     549    try: 
     550        residuals = residuals_dict[method_name](reference_data, data_copy) 
     551    except ValueError: 
     552        return None 
    552553 
    553554    theory_name = str(current_data.name.split()[0]) 
  • src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py

    r9a7c81c r8b6e4be  
    6161        self.data = None 
    6262        self.current_smearer = None 
     63        self.kernel_model = None 
    6364 
    6465        # Let only floats in the line edits 
     
    110111        if data is None: 
    111112            self.setElementsVisibility(False) 
    112         elif isinstance(data, Data1D): 
     113 
     114    def updateKernelModel(self, kernel_model=None): 
     115        """ 
     116        Update the model 
     117        """ 
     118        self.kernel_model = kernel_model 
     119        if self.data is None: 
     120            self.setElementsVisibility(False) 
     121            return 
     122        if self.kernel_model is None: 
     123            return 
     124        elif isinstance(self.data, Data1D): 
    113125            self.cbSmearing.addItems(SMEARING_1D) 
    114126        else: 
    115127            self.cbSmearing.addItems(SMEARING_2D) 
    116128        self.cbSmearing.setCurrentIndex(0) 
    117  
    118     def updateKernelModel(self, kernel_model=None): 
    119         """ 
    120         Update the model 
    121         """ 
    122         self.kernel_model = kernel_model 
    123129 
    124130    def smearer(self): 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py

    r8faac15 r712db9e  
    393393 
    394394        # Test tooltips 
    395         self.assertEqual(len(self.widget._poly_model.header_tooltips), 9) 
     395        self.assertEqual(len(self.widget._poly_model.header_tooltips), 8) 
    396396 
    397397        header_tooltips = ['Select parameter for fitting', 
     
    702702        # Force same data into logic 
    703703        self.widget.data = item 
     704 
    704705        category_index = self.widget.cbCategory.findText("Sphere") 
    705706        self.widget.cbCategory.setCurrentIndex(category_index) 
    706  
    707         self.widget.show() 
    708707 
    709708        # Test no fitting params 
  • src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py

    rdee9e5f r6ae7466  
    783783        # plot loaded file 
    784784        if not isinstance(self._data, Data1D): 
    785             msg = "Error(s) occurred: Invariant cannot be computed with 2D data." 
    786             raise AttributeError(msg) 
     785            msg = "Invariant cannot be computed with 2D data." 
     786            raise ValueError(msg) 
    787787 
    788788        try: 
    789789            filename = data.filename 
    790790        except: 
    791             msg = 'No filename' 
     791            msg = 'No filename chosen.' 
    792792            raise ValueError(msg) 
    793793        try: 
  • src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py

    rdee9e5f r6ae7466  
    465465            self.logic.data = GuiUtils.dataFromItem(data) 
    466466            if not isinstance(self.logic.data, Data1D): 
    467                 msg = "P(r) perspective works for 1D data only" 
    468                 logger.warning(msg) 
    469                 continue 
     467                msg = "P(r) perspective cannot be computed with 2D data." 
     468                logger.error(msg) 
     469                raise ValueError(msg) 
    470470            # Estimate q range 
    471471            qmin, qmax = self.logic.computeDataRange() 
  • src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py

    rccd2b87 r6ae7466  
    152152        self.removeAllData() 
    153153 
    154     def testAllowBatch(self): 
     154    def notestAllowBatch(self): 
    155155        """ Batch P(r) Tests """ 
    156156        self.baseBatchState() 
  • src/sas/qtgui/Plotting/Plotter.py

    r863ebca r34f13a83  
    7575        if isinstance(data, Data1D): 
    7676            self.data = data 
    77         assert(self._data) 
     77 
     78        if not self._data: 
     79            return 
    7880 
    7981        is_fit = (self.data.id=="fit") 
  • src/sas/qtgui/Plotting/Plotter2D.py

    r676a430 r34f13a83  
    9595            self.data = data 
    9696 
    97         assert self._data 
     97        if not self._data: 
     98            return 
    9899 
    99100        # Toggle the scale 
  • src/sas/qtgui/Plotting/PlotterBase.py

    r863ebca r34f13a83  
    114114        if not quickplot: 
    115115            # Add the toolbar 
    116             self.toolbar.show() 
     116            # self.toolbar.show() 
     117            self.toolbar.hide() # hide for the time being 
    117118            # Notify PlotHelper about the new plot 
    118119            self.upatePlotHelper() 
     
    220221        self.actionPrintImage = self.contextMenu.addAction("Print Image") 
    221222        self.actionCopyToClipboard = self.contextMenu.addAction("Copy to Clipboard") 
    222         self.contextMenu.addSeparator() 
    223         self.actionToggleMenu = self.contextMenu.addAction("Toggle Navigation Menu") 
     223        #self.contextMenu.addSeparator() 
     224        #self.actionToggleMenu = self.contextMenu.addAction("Toggle Navigation Menu") 
    224225        self.contextMenu.addSeparator() 
    225226 
     
    229230        self.actionPrintImage.triggered.connect(self.onImagePrint) 
    230231        self.actionCopyToClipboard.triggered.connect(self.onClipboardCopy) 
    231         self.actionToggleMenu.triggered.connect(self.onToggleMenu) 
     232        #self.actionToggleMenu.triggered.connect(self.onToggleMenu) 
    232233 
    233234    def createContextMenu(self): 
     
    381382        Toggle navigation menu visibility in the chart 
    382383        """ 
    383         if self.toolbar.isVisible(): 
    384             self.toolbar.hide() 
    385         else: 
    386             self.toolbar.show() 
     384        self.toolbar.hide() 
     385        # Current toolbar menu is too buggy. 
     386        # Comment out until we support 3.x, then recheck. 
     387        #if self.toolbar.isVisible(): 
     388        #    self.toolbar.hide() 
     389        #else: 
     390        #    self.toolbar.show() 
    387391 
    388392    def offset_graph(self): 
  • src/sas/qtgui/Plotting/SlicerParameters.py

    raed0532 ree22241  
    44import numpy 
    55import functools 
     6 
    67from PyQt5 import QtCore 
    78from PyQt5 import QtGui 
     
    8687        Display generic data averaging help 
    8788        """ 
    88         location = "/user/qtgui/MainWindow/graph_help.html#d-data-averaging" 
    89         self.parent.showHelp(location) 
    90  
     89        url = "/user/qtgui/MainWindow/graph_help.html#d-data-averaging" 
     90        GuiUtils.showHelp(url) 
    9191 
    9292class ProxyModel(QtCore.QIdentityProxyModel): 
  • src/sas/qtgui/Plotting/UnitTesting/Plotter2DTest.py

    r863ebca r34f13a83  
    146146        self.plotter.createContextMenuQuick() 
    147147        actions = self.plotter.contextMenu.actions() 
    148         self.assertEqual(len(actions), 9) 
     148        self.assertEqual(len(actions), 7) 
    149149 
    150150        # Trigger Print Image and make sure the method is called 
     
    158158 
    159159        # Trigger Toggle Grid and make sure the method is called 
    160         self.assertEqual(actions[6].text(), "Toggle Grid On/Off") 
     160        self.assertEqual(actions[4].text(), "Toggle Grid On/Off") 
    161161        self.plotter.ax.grid = MagicMock() 
     162        actions[4].trigger() 
     163        self.assertTrue(self.plotter.ax.grid.called) 
     164 
     165        # Trigger Change Scale and make sure the method is called 
     166        self.assertEqual(actions[6].text(), "Toggle Linear/Log Scale") 
     167        FigureCanvas.draw_idle = MagicMock() 
    162168        actions[6].trigger() 
    163         self.assertTrue(self.plotter.ax.grid.called) 
    164  
    165         # Trigger Change Scale and make sure the method is called 
    166         self.assertEqual(actions[8].text(), "Toggle Linear/Log Scale") 
    167         FigureCanvas.draw_idle = MagicMock() 
    168         actions[8].trigger() 
    169169        self.assertTrue(FigureCanvas.draw_idle.called) 
    170170 
  • src/sas/qtgui/Plotting/UnitTesting/PlotterBaseTest.py

    r863ebca r34f13a83  
    124124 
    125125        actions = self.plotter.contextMenu.actions() 
    126         self.assertEqual(len(actions), 6) 
     126        self.assertEqual(len(actions), 4) 
    127127 
    128128        # Trigger Print Image and make sure the method is called 
     
    147147        self.assertTrue(self.clipboard_called) 
    148148 
    149         # Trigger toggle navigation bar and make sure the method is called 
    150         self.assertEqual(actions[4].text(), "Toggle Navigation Menu") 
    151         isShown = self.plotter.toolbar.isVisible() 
    152         self.assertTrue(isShow) 
    153         actions[4].trigger() 
    154         isShown = self.plotter.toolbar.isVisible() 
    155         self.assertFalse(isShow) 
    156         actions[4].trigger() 
    157         isShown = self.plotter.toolbar.isVisible() 
    158         self.assertTrue(isShow) 
     149        ## Trigger toggle navigation bar and make sure the method is called 
     150        #self.assertEqual(actions[4].text(), "Toggle Navigation Menu") 
     151        #isShown = self.plotter.toolbar.isVisible() 
     152        #self.assertTrue(isShow) 
     153        #actions[4].trigger() 
     154        #isShown = self.plotter.toolbar.isVisible() 
     155        #self.assertFalse(isShow) 
     156        #actions[4].trigger() 
     157        #isShown = self.plotter.toolbar.isVisible() 
     158        #self.assertTrue(isShow) 
    159159 
    160160 
  • src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py

    r863ebca r34f13a83  
    103103        self.plotter.createContextMenuQuick() 
    104104        actions = self.plotter.contextMenu.actions() 
    105         self.assertEqual(len(actions), 9) 
     105        self.assertEqual(len(actions), 7) 
    106106 
    107107        # Trigger Print Image and make sure the method is called 
     
    115115 
    116116        # Trigger Toggle Grid and make sure the method is called 
    117         self.assertEqual(actions[6].text(), "Toggle Grid On/Off") 
     117        self.assertEqual(actions[4].text(), "Toggle Grid On/Off") 
    118118        self.plotter.ax.grid = MagicMock() 
     119        actions[4].trigger() 
     120        self.assertTrue(self.plotter.ax.grid.called) 
     121 
     122        # Trigger Change Scale and make sure the method is called 
     123        self.assertEqual(actions[6].text(), "Change Scale") 
     124        self.plotter.properties.exec_ = MagicMock(return_value=QtWidgets.QDialog.Rejected) 
    119125        actions[6].trigger() 
    120         self.assertTrue(self.plotter.ax.grid.called) 
    121  
    122         # Trigger Change Scale and make sure the method is called 
    123         self.assertEqual(actions[8].text(), "Change Scale") 
    124         self.plotter.properties.exec_ = MagicMock(return_value=QtWidgets.QDialog.Rejected) 
    125         actions[8].trigger() 
    126126        self.assertTrue(self.plotter.properties.exec_.called) 
    127127 
  • src/sas/qtgui/Utilities/GridPanel.py

    r4fbf0db rfa762f4  
    1818    ERROR_COLUMN_CAPTION = " (Err)" 
    1919    IS_WIN = (sys.platform == 'win32') 
     20    windowClosedSignal = QtCore.pyqtSignal() 
    2021    def __init__(self, parent = None, output_data=None): 
    2122 
     
    5455        # Fill in the table from input data 
    5556        self.setupTable(widget=self.tblParams, data=output_data) 
    56         #TODO: This is not what was inteded to be. 
    5757        if output_data is not None: 
    5858            # Set a table tooltip describing the model 
    59             model_name = list(output_data.keys())[0] 
     59            model_name = output_data[0][0].model.id 
    6060            self.tabWidget.setTabToolTip(0, model_name) 
    6161 
     
    6464        Overwrite QDialog close method to allow for custom widget close 
    6565        """ 
    66         # Maybe we should just minimize 
    67         self.setWindowState(QtCore.Qt.WindowMinimized) 
     66        # notify the parent so it hides this window 
     67        self.windowClosedSignal.emit() 
    6868        event.ignore() 
    6969 
     
    153153        Create a new tab with batch fitting results 
    154154        """ 
    155         self.addTabPage() 
     155        if self.has_data: 
     156            self.addTabPage() 
    156157        # Update the new widget 
    157158        # Fill in the table from input data in the last/newest page 
     
    311312        # Check if 2D model. If not, remove theta/phi 
    312313        if isinstance(model.data.sas_data, Data1D): 
    313             param_list.remove('theta') 
    314             param_list.remove('phi') 
     314            if 'theta' in param_list: 
     315                param_list.remove('theta') 
     316            if 'phi' in param_list: 
     317                param_list.remove('phi') 
    315318 
    316319        rows = len(data) 
  • src/sas/qtgui/Utilities/GuiUtils.py

    r9ce69ec ree22241  
    584584        msg = "Attempt at opening an invalid URL" 
    585585        raise AttributeError(msg) 
     586 
     587def showHelp(url): 
     588    """ 
     589    Open a local url in the default browser 
     590    """ 
     591    location = HELP_DIRECTORY_LOCATION + url 
     592    #WP: Added to handle OSX bundle docs 
     593    if os.path.isdir(location) == False: 
     594        sas_path = os.path.abspath(os.path.dirname(sys.argv[0])) 
     595        location = sas_path+"/"+location 
     596    try: 
     597        webbrowser.open('file://' + os.path.realpath(location)) 
     598    except webbrowser.Error as ex: 
     599        logging.warning("Cannot display help. %s" % ex) 
    586600 
    587601def retrieveData1d(data): 
  • src/sas/sascalc/calculator/resolution_calculator.py

    rb8080e1 r30e0be0  
    10081008            detector_offset = self.sample2detector_distance[1] 
    10091009        except: 
    1010             logger.error(sys.exc_value) 
     1010            logger.error(str(sys.exc_info()[1])) 
    10111011 
    10121012        # detector size in [no of pix_x,no of pix_y] 
  • src/sas/sascalc/corfunc/corfunc_calculator.py

    ra26f67f r6ae7466  
    8888        # Only process data of the class Data1D 
    8989        if not issubclass(data.__class__, Data1D): 
    90             raise ValueError("Data must be of the type DataLoader.Data1D") 
     90            raise ValueError("Correlation function cannot be computed with 2D Data.") 
    9191 
    9292        # Prepare the data 
Note: See TracChangeset for help on using the changeset viewer.