Changeset fbfc488 in sasview for src/sas/qtgui


Ignore:
Timestamp:
Nov 9, 2017 8:43:55 AM (7 years ago)
Author:
Piotr Rozyczko <rozyczko@…>
Branches:
ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
Children:
d6b8a1d
Parents:
7969b9c
git-author:
Piotr Rozyczko <rozyczko@…> (11/03/17 10:58:39)
git-committer:
Piotr Rozyczko <rozyczko@…> (11/09/17 08:43:55)
Message:

More Qt5 related fixes.

Location:
src/sas/qtgui
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/Calculators/DataOperationUtilityPanel.py

    r4992ff2 rfbfc488  
    140140            data1 = self.data1 
    141141            data2 = self.data2 
    142             exec("output = data1 %s data2" % operator) 
    143         except: 
    144             raise 
     142            output = eval("data1 %s data2" % operator) 
     143        except Exception as ex: 
     144            logging.error(ex) 
     145            return 
    145146 
    146147        self.output = output 
  • src/sas/qtgui/Calculators/DensityPanel.py

    r4992ff2 rfbfc488  
    6060 
    6161        # set validators 
    62         self.ui.editMolecularFormula.setValidator(FormulaValidator(self.ui.editMolecularFormula)) 
     62        #self.ui.editMolecularFormula.setValidator(FormulaValidator(self.ui.editMolecularFormula)) 
    6363 
    6464        rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?") 
     
    9494        self.mapper.addMapping(self.ui.editMassDensity     , MODEL.MASS_DENSITY) 
    9595 
    96         # FIXME DOESNT WORK WITH QT5 
    97         #self.mapper.toFirst() 
     96        self.mapper.toFirst() 
    9897 
    9998    def dataChanged(self, top, bottom): 
     
    140139 
    141140    def modelReset(self): 
    142         #self.model.beginResetModel() 
    143141        try: 
    144142            self.setMode(None) 
     
    148146        finally: 
    149147            pass 
    150             #self.model.endResetModel() 
    151148 
    152149    def displayHelp(self): 
  • src/sas/qtgui/Calculators/GenericScatteringCalculator.py

    r4992ff2 rfbfc488  
    135135                                          "SLD files (*.SLD *.sld);;PDB files (*.pdb *.PDB);; " 
    136136                                          "OMF files (*.OMF *.omf);; " 
    137                                           "All files (*.*)") 
     137                                          "All files (*.*)")[0] 
    138138            if self.datafile: 
    139139                self.default_shape = str(self.cbShape.currentText()) 
  • src/sas/qtgui/Calculators/KiessigPanel.py

    r4992ff2 rfbfc488  
    5555            self.thickness.set_deltaq(dq=float(self.deltaq_in.text())) 
    5656            kiessing_result = self.thickness.compute_thickness() 
    57             float_as_str = "{:.3f}".format(kiessing_result) 
    58             self.lengthscale_out.setText(float_as_str) 
     57            if kiessing_result: 
     58                float_as_str = "{:.3f}".format(kiessing_result) 
     59                self.lengthscale_out.setText(float_as_str) 
     60            else: 
     61                # error or division by zero 
     62                self.lengthscale_out.setText("") 
     63 
    5964        except (ArithmeticError, ValueError): 
    6065            self.lengthscale_out.setText("") 
  • src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py

    r4992ff2 rfbfc488  
    317317        if self.cbCustomSpectrum.currentText() == 'Add New': 
    318318            datafile = QtWidgets.QFileDialog.getOpenFileName( 
    319                 self, "Choose a spectral distribution file", "", 
    320                 "All files (*.*)", 
    321                 QtWidgets.QFileDialog.DontUseNativeDialog) 
     319                self, "Choose a spectral distribution file","", 
     320                "All files (*.*)", None, 
     321                QtWidgets.QFileDialog.DontUseNativeDialog)[0] 
    322322 
    323323            if datafile is None or str(datafile) == '': 
     
    568568        : return: image (numpy array) 
    569569        """ 
    570         # This fails in py3 with 
    571         # [Failure instance: Traceback: <class 'TypeError'>: 'map' object is not subscriptable 
    572         # INVESTIGATE 
    573         image = map(func, qx, qy, 
     570        image = list(map(func, qx, qy, 
    574571                    qx_min, qx_max, 
    575                     qy_min, qy_max)[0] 
     572                    qy_min, qy_max))[0] 
     573 
    576574        return image 
    577575 
     
    751749        self.plotter.plot() 
    752750        self.plotter.show() 
     751        self.plotter.update() 
    753752 
    754753    def drawLines(self): 
  • src/sas/qtgui/Calculators/SldPanel.py

    r4992ff2 rfbfc488  
    128128 
    129129        # set validators 
    130         self.ui.editMolecularFormula.setValidator(GuiUtils.FormulaValidator(self.ui.editMolecularFormula)) 
     130        # TODO: GuiUtils.FormulaValidator() crashes with Qt5 - fix 
     131        #self.ui.editMolecularFormula.setValidator(GuiUtils.FormulaValidator(self.ui.editMolecularFormula)) 
    131132 
    132133        rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?") 
     
    148149 
    149150        self.model.dataChanged.connect(self.dataChanged) 
    150         #QtCore.QObject.connect( 
    151         #    self.model, 
    152         #    QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), 
    153         #    self.dataChanged) 
    154151 
    155152        self.modelReset() 
     
    166163            self.mapper.addMapping(edit, key) 
    167164 
    168         # FIXME DOESNT WORK WITH QT5 
    169         #self.mapper.toFirst() 
     165        self.mapper.toFirst() 
    170166 
    171167    def dataChanged(self, top, bottom): 
     
    216212        finally: 
    217213            pass 
    218             #self.model.endResetModel() 
     214        #self.model.endResetModel() 
    219215 
    220216    def displayHelp(self): 
  • src/sas/qtgui/Calculators/SlitSizeCalculator.py

    r4992ff2 rfbfc488  
    44import os 
    55import sys 
     6import logging 
    67 
    78from PyQt5 import QtCore 
     
    6465            return 
    6566        loader = Loader() 
    66         data = loader.load(path_str)[0] 
     67        try: 
     68            data = loader.load(path_str)[0] 
     69        # Can return multiple exceptions - gather them all under one umbrella and complain 
     70        except Exception as ex: 
     71            logging.error(ex) 
     72            return 
    6773 
    6874        self.data_file.setText(os.path.basename(path_str)) 
     
    7985                                                 "SAXSess 1D data (*.txt *.TXT *.dat *.DAT)", 
    8086                                                 None, 
    81                                                  QtWidgets.QFileDialog.DontUseNativeDialog) 
    82  
    83         if path is None: 
    84             return 
    85  
     87                                                 QtWidgets.QFileDialog.DontUseNativeDialog)[0] 
    8688        return path 
    8789 
     
    106108            self.clearResults() 
    107109            msg = "ERROR: Data hasn't been loaded correctly" 
    108             raise RuntimeError(msg) 
     110            logging.error(msg) 
     111            return 
    109112 
    110113        if data.__class__.__name__ == 'Data2D': 
    111114            self.clearResults() 
    112115            msg = "Slit Length cannot be computed for 2D Data" 
    113             raise RuntimeError(msg) 
     116            logging.error(msg) 
     117            return 
    114118 
    115119        #compute the slit size 
     
    119123            if xdata == [] or xdata is None or ydata == [] or ydata is None: 
    120124                msg = "The current data is empty please check x and y" 
    121                 raise ValueError(msg) 
     125                logging.error(msg) 
     126                return 
    122127            slit_length_calculator = SlitlengthCalculator() 
    123128            slit_length_calculator.set_data(x=xdata, y=ydata) 
     
    126131            self.clearResults() 
    127132            msg = "Slit Size Calculator: %s" % (sys.exc_info()[1]) 
    128             raise RuntimeError(msg) 
     133            logging.error(msg) 
     134            return 
    129135 
    130136        slit_length_str = "{:.5f}".format(slit_length) 
  • src/sas/qtgui/MainWindow/DataExplorer.py

    r7969b9c rfbfc488  
    218218            'options'   : QtWidgets.QFileDialog.DontUseNativeDialog 
    219219        } 
    220         filename = str(QtWidgets.QFileDialog.getOpenFileName(**kwargs)) 
     220        filename = QtWidgets.QFileDialog.getOpenFileName(**kwargs)[0] 
    221221        if filename: 
    222222            load_thread = threads.deferToThread(self.readProject, filename) 
     
    582582        # Show the plot 
    583583        new_plot.show() 
     584        new_plot.canvas.draw() 
    584585 
    585586        # Update the active chart list 
     
    628629        paths = QtWidgets.QFileDialog.getOpenFileNames(self, "Choose a file", "", 
    629630                wlist, None, QtWidgets.QFileDialog.DontUseNativeDialog)[0] 
    630         # [0] is new in Qt5 as getOpenFileNames() returns now a tuple! 
    631         if paths is None: 
     631        if not paths: 
    632632            return 
    633633 
  • src/sas/qtgui/MainWindow/GuiManager.py

    r7969b9c rfbfc488  
    88from PyQt5.QtWidgets import * 
    99from PyQt5.QtGui import * 
    10 from PyQt5.QtCore import Qt 
     10from PyQt5.QtCore import Qt, QLocale 
    1111from PyQt5.QtWebKitWidgets import QWebView 
    1212 
     
    198198 
    199199        # Resize to the workspace height 
    200         #workspace_height = self._workspace.workspace.sizeHint().height() 
    201         #perspective_size = self._current_perspective.sizeHint() 
     200        workspace_height = self._workspace.workspace.sizeHint().height() 
     201        perspective_size = self._current_perspective.sizeHint() 
    202202        #if workspace_height < perspective_size.height(): 
    203         #    perspective_width = perspective_size.width() 
    204         #    self._current_perspective.resize(perspective_width, workspace_height-10) 
     203        perspective_width = perspective_size.width() 
     204        self._current_perspective.resize(perspective_width, workspace_height-10) 
    205205 
    206206        self._current_perspective.show() 
     
    592592        self.ipDockWidget.setObjectName("IPythonDockWidget") 
    593593        self.ipDockWidget.setWidget(terminal) 
    594         self._workspace.workspace.addSubWindow(self.ipDockWidget, Qt.RightDockWidgetArea) 
     594        self._workspace.addDockWidget(Qt.RightDockWidgetArea, self.ipDockWidget) 
    595595 
    596596    def actionImage_Viewer(self): 
  • src/sas/qtgui/MainWindow/MainWindow.py

    r4992ff2 rfbfc488  
    6969    # Show the main SV window 
    7070    mainwindow = MainSasViewWindow() 
    71     mainwindow.showMaximized() 
     71    mainwindow.show() 
    7272 
    7373    # no more splash screen 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    r4992ff2 rfbfc488  
    6161        QtGui.QStandardItemModel.__init__(self,parent) 
    6262 
    63     def headerData(self, section, orientation, role): 
     63    def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole): 
    6464        """ 
    6565        Displays tooltip for each column's header 
     
    592592        elif model_column in [self.lstPoly.itemDelegate().poly_min, self.lstPoly.itemDelegate().poly_max]: 
    593593            try: 
    594                 value = float(item.text()) 
     594                value = GuiUtils.toDouble(item.text()) 
    595595            except ValueError: 
    596596                # Can't be converted properly, bring back the old value and exit 
     
    607607        else: 
    608608            try: 
    609                 value = float(item.text()) 
     609                value = GuiUtils.toDouble(item.text()) 
    610610            except ValueError: 
    611611                # Can't be converted properly, bring back the old value and exit 
     
    624624        model_row = item.row() 
    625625        name_index = self._magnet_model.index(model_row, 0) 
    626         parameter_name = str(self._magnet_model.data(name_index).toPyObject()) 
     626        parameter_name = str(self._magnet_model.data(name_index)) 
    627627 
    628628        if model_column == 0: 
     
    640640        # Extract changed value. 
    641641        try: 
    642             value = float(item.text()) 
     642            value = GuiUtils.toDouble(item.text()) 
    643643        except ValueError: 
    644644            # Unparsable field 
    645645            return 
    646646 
    647         property_index = self._magnet_model.headerData(0, 1, model_column).toInt()[0]-1 # Value, min, max, etc. 
     647        property_index = self._magnet_model.headerData(1, model_column)-1 # Value, min, max, etc. 
    648648 
    649649        # Update the parameter value - note: this supports +/-inf as well 
     
    13041304        # Extract changed value. 
    13051305        try: 
    1306             value = float(item.text()) 
     1306            value = GuiUtils.toDouble(item.text()) 
    13071307        except ValueError: 
    13081308            # Unparsable field 
    13091309            return 
    1310         parameter_name = str(self._model_model.data(name_index)) #.toPyObject()) # sld, background etc. 
     1310 
     1311        parameter_name = str(self._model_model.data(name_index)) # sld, background etc. 
    13111312 
    13121313        # Update the parameter value - note: this supports +/-inf as well 
     
    16871688        datafile = QtWidgets.QFileDialog.getOpenFileName( 
    16881689            self, "Choose a weight file", "", "All files (*.*)", None, 
    1689             QtWidgets.QFileDialog.DontUseNativeDialog) 
    1690  
    1691         if datafile is None or str(datafile)=='': 
     1690            QtWidgets.QFileDialog.DontUseNativeDialog)[0] 
     1691 
     1692        if not datafile: 
    16921693            logging.info("No weight data chosen.") 
    16931694            raise IOError 
  • src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py

    r7969b9c rfbfc488  
    44 
    55import sas.qtgui.Utilities.GuiUtils as GuiUtils 
     6 
     7class CommaLessValidator(QtGui.QDoubleValidator): 
     8    """ 
     9    Custom double validator which doesn't allow for commas to be used as decimal point 
     10    """ 
     11    pass 
    612 
    713class ModelViewDelegate(QtWidgets.QStyledItemDelegate): 
     
    4450        if index.column() in self.fancyColumns(): 
    4551            # Units - present in nice HTML 
    46             #options = QtWidgets.QStyleOptionViewItemV4(option) 
    4752            options = QtWidgets.QStyleOptionViewItem(option) 
    4853            self.initStyleOption(options,index) 
     
    236241    def createEditor(self, widget, option, index): 
    237242        # Remember the current choice 
    238         current_text = index.data().toString() 
     243        current_text = index.data() 
    239244        if not index.isValid(): 
    240245            return 0 
  • src/sas/qtgui/Plotting/BoxSum.py

    r4992ff2 rfbfc488  
    1111 
    1212class BoxSum(QtWidgets.QDialog, Ui_BoxSumUI): 
    13     apply_signal = QtCore.pyqtSignal(tuple, str) 
    1413    def __init__(self, parent=None, model=None): 
    1514        super(BoxSum, self).__init__() 
     
    2423 
    2524        self.model = model 
    26         self.mapper = QtGui.QDataWidgetMapper() 
     25        self.mapper = QtWidgets.QDataWidgetMapper() 
    2726        self.mapper.setModel(self.model) 
    2827 
     
    3231        self.mapper.addMapping(self.txtCenterX, 2) 
    3332        self.mapper.addMapping(self.txtCenterY, 3) 
    34         self.mapper.addMapping(self.lblAvg, 4, "text") 
    35         self.mapper.addMapping(self.lblAvgErr, 5, "text") 
    36         self.mapper.addMapping(self.lblSum, 6, "text") 
    37         self.mapper.addMapping(self.lblSumErr, 7, "text") 
    38         self.mapper.addMapping(self.lblNumPoints, 8, "text") 
     33        self.mapper.addMapping(self.lblAvg, 4, b"text") 
     34        self.mapper.addMapping(self.lblAvgErr, 5, b"text") 
     35        self.mapper.addMapping(self.lblSum, 6, b"text") 
     36        self.mapper.addMapping(self.lblSumErr, 7, b"text") 
     37        self.mapper.addMapping(self.lblNumPoints, 8, b"text") 
    3938 
    4039        # Populate the widgets with data from the first column 
     
    4342        self.setFixedSize(self.minimumSizeHint()) 
    4443 
     44        # Handle the Apply button click 
     45        self.buttonBox.button(QtWidgets.QDialogButtonBox.Close).clicked.connect(self.onClose) 
     46 
     47    def onClose(self): 
     48        """ 
     49        close the window containing this panel 
     50        """ 
     51        self.close() 
     52 
  • src/sas/qtgui/Plotting/Plotter.py

    r7969b9c rfbfc488  
    163163 
    164164        # refresh canvas 
    165         self.canvas.draw() 
     165        self.canvas.draw_idle() 
    166166 
    167167    def createContextMenu(self): 
  • src/sas/qtgui/Plotting/Plotter2D.py

    r7969b9c rfbfc488  
    123123        """ 
    124124        # Toggle the scale 
    125         zmin_temp = self.zmin 
     125        zmin_temp = self.zmin if self.zmin else MIN_Z 
    126126        zmax_temp = self.zmax 
    127127        # self.scale predefined in the baseclass 
  • src/sas/qtgui/Plotting/PlotterBase.py

    r7969b9c rfbfc488  
    3434        self.manager = manager 
    3535        self.quickplot = quickplot 
     36 
     37        #plt.style.use('ggplot') 
     38        plt.style.use('seaborn-darkgrid') 
    3639 
    3740        # a figure instance to plot on 
  • src/sas/qtgui/Plotting/Slicers/BoxSum.py

    r4992ff2 rfbfc488  
    66from PyQt5 import QtGui 
    77 
    8 from sas.qtgui.Utilities.GuiUtils import formatNumber 
     8from sas.qtgui.Utilities.GuiUtils import formatNumber, toDouble 
    99 
    1010from .BaseInteractor import BaseInteractor 
     
    137137        """ 
    138138        params = {} 
    139         params["Height"] = float(self.model().item(0, 0).text()) 
    140         params["Width"] = float(self.model().item(0, 1).text()) 
    141         params["center_x"] = float(self.model().item(0, 2).text()) 
    142         params["center_y"] = float(self.model().item(0, 3).text()) 
     139        params["Height"] = toDouble(self.model().item(0, 0).text()) 
     140        params["Width"] = toDouble(self.model().item(0, 1).text()) 
     141        params["center_x"] = toDouble(self.model().item(0, 2).text()) 
     142        params["center_y"] = toDouble(self.model().item(0, 3).text()) 
    143143        self.update_model = False 
    144144        self.setParams(params) 
  • src/sas/qtgui/Utilities/GuiUtils.py

    r4992ff2 rfbfc488  
    249249        plot_item = item.child(index) 
    250250        if plot_item.isCheckable(): 
    251             plot_data = plot_item.child(0).data() #.toPyObject() 
     251            plot_data = plot_item.child(0).data() 
    252252            if plot_data.id is not None and plot_data.id == py_update_data.id: 
    253253                # replace data section in item 
     
    270270    Adds 'update_data' to that row. 
    271271    """ 
    272     #assert isinstance(update_data, QtCore.QVariant) 
    273     #py_update_data = update_data.toPyObject() 
    274272    py_update_data = update_data 
    275273 
     
    339337        if str(item.text()) == filename: 
    340338            # TODO: assure item type is correct (either data1/2D or Plotter) 
    341             plot_data.append(item.child(0).data()) #.toPyObject()) 
     339            plot_data.append(item.child(0).data()) 
    342340            # Going 1 level deeper only 
    343341            for index_2 in range(item.rowCount()): 
     
    345343                if item_2 and item_2.isCheckable(): 
    346344                    # TODO: assure item type is correct (either data1/2D or Plotter) 
    347                     plot_data.append(item_2.child(0).data()) #.toPyObject()) 
     345                    plot_data.append(item_2.child(0).data()) 
    348346 
    349347    return plot_data 
     
    361359        if item.isCheckable() and item.checkState() == QtCore.Qt.Checked: 
    362360            # TODO: assure item type is correct (either data1/2D or Plotter) 
    363             plot_data.append((item, item.child(0).data())) #.toPyObject())) 
     361            plot_data.append((item, item.child(0).data())) 
    364362        # Going 1 level deeper only 
    365363        for index_2 in range(item.rowCount()): 
     
    367365            if item_2 and item_2.isCheckable() and item_2.checkState() == QtCore.Qt.Checked: 
    368366                # TODO: assure item type is correct (either data1/2D or Plotter) 
    369                 plot_data.append((item_2, item_2.child(0).data())) #.toPyObject())) 
     367                plot_data.append((item_2, item_2.child(0).data())) 
    370368 
    371369    return plot_data 
     
    635633   
    636634    def validate(self, input, pos): 
    637         try: 
    638             Formula(str(input)) 
    639             self._setStyleSheet("") 
    640             return QtGui.QValidator.Acceptable, pos 
    641  
    642         except Exception as e: 
    643             self._setStyleSheet("background-color:pink;") 
    644             return QtGui.QValidator.Intermediate, pos 
     635 
     636        self._setStyleSheet("") 
     637        return QtGui.QValidator.Acceptable, pos 
     638 
     639        #try: 
     640        #    Formula(str(input)) 
     641        #    self._setStyleSheet("") 
     642        #    return QtGui.QValidator.Acceptable, pos 
     643 
     644        #except Exception as e: 
     645        #    self._setStyleSheet("background-color:pink;") 
     646        #    return QtGui.QValidator.Intermediate, pos 
    645647 
    646648    def _setStyleSheet(self, value): 
     
    756758    The assumption - data stored in SasView standard, in child 0 
    757759    """ 
    758     return item.child(0).data() #.toPyObject() 
     760    return item.child(0).data() 
    759761 
    760762def formatNumber(value, high=False): 
     
    806808    else: 
    807809        return name 
     810 
     811def toDouble(value_string): 
     812    """ 
     813    toFloat conversion which cares deeply about user's locale 
     814    """ 
     815    # Holy shit this escalated quickly in Qt5. 
     816    # No more float() cast on general locales. 
     817    value = QtCore.QLocale().toFloat(value_string) 
     818    if value[1]: 
     819        return value[0] 
     820 
     821    # Try generic locale 
     822    value = QtCore.QLocale(QtCore.QLocale('en_US')).toFloat(value_string) 
     823    if value[1]: 
     824        return value[0] 
     825    else: 
     826        raise ValueError 
  • src/sas/qtgui/Utilities/IPythonWidget.py

    r4992ff2 rfbfc488  
    33from PyQt5 import QtWidgets 
    44 
    5 ##from PyQt4 import QtSvg 
     5from PyQt5 import QtSvg 
    66 
    77def new_load_qt(api_options): 
     
    1818# Do some monkey patching to satisfy pyinstaller complaining 
    1919# about pyside/pyqt confusion 
    20 qt_loaders.load_qt = new_load_qt 
    21 qtconsole_qt_loaders.load_qt = qtconsole_new_load_qt 
     20#qt_loaders.load_qt = new_load_qt 
     21#qtconsole_qt_loaders.load_qt = qtconsole_new_load_qt 
    2222 
    2323from qtconsole.rich_jupyter_widget import RichJupyterWidget 
Note: See TracChangeset for help on using the changeset viewer.