Changeset a5f3f60 in sasview


Ignore:
Timestamp:
Jul 17, 2018 10:23:14 AM (5 weeks ago)
Author:
tcbennun
Branches:
ESS_GUI_beta_approx
Children:
8a001cd
Parents:
bb3b1c2 (diff), 085e3c9 (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 S(Q) tab functionality into this branch for further development

Files:
15 edited

Legend:

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

    re20870b r085e3c9  
    4545from sas.qtgui.Perspectives.Fitting.ViewDelegate import PolyViewDelegate 
    4646from sas.qtgui.Perspectives.Fitting.ViewDelegate import MagnetismViewDelegate 
     47from sas.qtgui.Perspectives.Fitting.ViewDelegate import StructureViewDelegate 
    4748from sas.qtgui.Perspectives.Fitting.Constraint import Constraint 
    4849from sas.qtgui.Perspectives.Fitting.MultiConstraint import MultiConstraint 
     
    5051 
    5152 
    52  
    53 TAB_MAGNETISM = 4 
    54 TAB_POLY = 3 
     53TAB_STRUCTURE = 3 
     54TAB_POLY = 4 
     55TAB_MAGNETISM = 5 
     56 
    5557CATEGORY_DEFAULT = "Choose category..." 
    5658CATEGORY_STRUCTURE = "Structure Factor" 
     
    195197        # Enable/disable UI components 
    196198        self.setEnablementOnDataLoad() 
     199 
     200    @property 
     201    def structureView(self): 
     202        return self.lstStructureOptions 
    197203 
    198204    def initializeGlobals(self): 
     
    307313        self._poly_model = ToolTippedItemModel() 
    308314        self._magnet_model = ToolTippedItemModel() 
     315        self._structure_model = ToolTippedItemModel() 
    309316 
    310317        # Param model displayed in param list 
     
    326333            QTreeView::item:hover { 
    327334                background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1); 
    328                 border: 1px solid #bfcde4; 
     335                /* border: 1px solid #bfcde4; */ 
    329336            } 
    330337 
     
    361368        # Delegates for custom editing and display 
    362369        self.lstMagnetic.setItemDelegate(MagnetismViewDelegate(self)) 
     370 
     371        # Structure factor options model (TEMPORARY EXAMPLE) 
     372 
     373        header_list = ["Property", "Option", "Custom value"] 
     374        num_cols = len(header_list) 
     375        self._structure_model.setHorizontalHeaderLabels(header_list) 
     376 
     377        self.structure_params = [ 
     378            "mixture", 
     379            "effective radius", 
     380            "volume fraction" 
     381        ] 
     382 
     383        param_vals = [ 
     384            "P(Q)*S(Q)", 
     385            "ER_mean_curvature", 
     386            "VR_something" 
     387        ] 
     388 
     389        num_SoQs = 3 
     390        for i in range(num_SoQs): 
     391            item_toplevel = QtGui.QStandardItem() 
     392            item_toplevel.setEditable(False) 
     393            item_toplevel.setText("S{}(Q)".format(i+1)) 
     394 
     395            for param, val in zip(self.structure_params, param_vals): 
     396                item1 = QtGui.QStandardItem() 
     397                item1.setEditable(False) 
     398                item1.setText(param) 
     399 
     400                item2 = QtGui.QStandardItem() 
     401                item2.setText(val) 
     402 
     403                item3 = QtGui.QStandardItem() 
     404                item3.setEditable(False) 
     405 
     406                item_toplevel.appendRow([item1, item2, item3]) 
     407 
     408            row_toplevel = [item_toplevel] 
     409            for i in range(num_cols - 1): 
     410                item = QtGui.QStandardItem() 
     411                item.setEditable(False) 
     412                row_toplevel.append(item) 
     413 
     414            self._structure_model.appendRow(row_toplevel) 
     415 
     416        self._structure_model.itemChanged.connect( 
     417           self.onStructureViewItemChanged 
     418        ) 
     419 
     420        view = self.lstStructureOptions 
     421 
     422        view.setModel(self._structure_model) 
     423        view.setItemDelegate(StructureViewDelegate(self)) 
     424 
     425        view.setAlternatingRowColors(True) 
     426        view.setSizePolicy( 
     427            QtWidgets.QSizePolicy.MinimumExpanding, 
     428            QtWidgets.QSizePolicy.Expanding 
     429        ) 
     430        view.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) 
     431 
     432        # resize all columns 
     433        for col in range(view.header().count()): 
     434            view.resizeColumnToContents(col) 
     435 
     436        view.setStyleSheet(stylesheet) 
     437 
     438        header = view.header() 
     439        #header.setSectionResizeMode(QtWidgets.QHeaderView.Interactive) 
     440        header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) 
     441        font = header.font() 
     442        font.setBold(True) 
     443        header.setFont(font) 
     444 
     445        view.expandAll() 
    363446 
    364447    def initializeCategoryCombo(self): 
     
    10051088                if func is not None: 
    10061089                    self.communicate.statusBarUpdateSignal.emit("Active constrain: "+func) 
     1090 
     1091    def onStructureViewItemChanged(self, item): 
     1092        """ 
     1093        Make changes as necessary when an item is modified in the structure 
     1094        factor options view. 
     1095        """ 
     1096        if -1 in [item.row(), item.column()]: 
     1097            # not a child item (ignore) 
     1098            return 
     1099 
     1100        # TODO: replace magic numbers, strings with stored params 
     1101        if item.column() == 1: 
     1102            custom_val_item = item.parent().child(item.row(), 2) 
     1103            if item.text() == "custom": 
     1104                custom_val_item.setEditable(True) 
     1105                custom_val_item.setText("type here") 
     1106            else: 
     1107                custom_val_item.setEditable(False) 
     1108                custom_val_item.setText("") 
    10071109 
    10081110    def replaceConstraintName(self, old_name, new_name=""): 
  • src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui

    rd4dac80 r6052c02  
    77    <x>0</x> 
    88    <y>0</y> 
    9     <width>680</width> 
     9    <width>487</width> 
    1010    <height>605</height> 
    1111   </rect> 
     
    352352      </attribute> 
    353353     </widget> 
     354     <widget class="QWidget" name="tabStructure"> 
     355      <attribute name="title"> 
     356       <string>S(Q) Options</string> 
     357      </attribute> 
     358      <layout class="QGridLayout" name="gridLayout_7"> 
     359       <property name="leftMargin"> 
     360        <number>15</number> 
     361       </property> 
     362       <property name="topMargin"> 
     363        <number>15</number> 
     364       </property> 
     365       <property name="rightMargin"> 
     366        <number>15</number> 
     367       </property> 
     368       <property name="bottomMargin"> 
     369        <number>15</number> 
     370       </property> 
     371       <item row="0" column="0"> 
     372        <widget class="QTreeView" name="lstStructureOptions"/> 
     373       </item> 
     374      </layout> 
     375     </widget> 
    354376     <widget class="QWidget" name="tab_4"> 
    355377      <attribute name="title"> 
  • src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py

    rfde5bcd r085e3c9  
    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): 
     
    280282            # Just the default paint 
    281283            QtWidgets.QStyledItemDelegate.paint(self, painter, option, index) 
     284 
     285class StructureViewDelegate(QtWidgets.QStyledItemDelegate): 
     286    """ 
     287    Custom delegate for appearance and behaviour control of the structure 
     288    factor options view 
     289    """ 
     290    def __init__(self, parent=None): 
     291        """ 
     292        Override parent constructor 
     293        """ 
     294 
     295        super(StructureViewDelegate, self).__init__() 
     296 
     297        self.fittingWidget = parent 
     298 
     299    def paint(self, painter, option, index): 
     300        """ 
     301        Override generic painter 
     302        """ 
     303        # TODO override this with something useful ... ? 
     304        super(StructureViewDelegate, self).paint( 
     305            painter, option, index 
     306        ) 
     307 
     308    def createEditor(self, parent, option, index): 
     309        """ 
     310        Override generic createEditor -- certain elements have combo boxes 
     311        """ 
     312        print("gotta create me an editor") 
     313 
     314        model = self.fittingWidget.structureView.model() 
     315 
     316        if index.parent(): 
     317            # we only care about child items since we don't edit top-level 
     318            # items in this view anyway 
     319            print("the item has a parent") 
     320 
     321            if index.column() == 1: 
     322                print("the item's col. is 1") 
     323                # col. 1 contains elements that may be combo boxes 
     324 
     325                # navigate to the parameter name through the parent item (it'll 
     326                # be on the same row, but col. 0) 
     327                parent_item = model.itemFromIndex(index.parent()) 
     328                param_item = parent_item.child(index.row(), 0) 
     329 
     330                if param_item.text() == "mixture": 
     331                    print("gonna do a mixture combo box") 
     332                    # TODO: ONLY TEMPORARY EXAMPLE STUFF HERE RIGHT NOW 
     333                    cbox = QtWidgets.QComboBox(parent) 
     334                    cbox.addItems([ 
     335                        "P(Q)*S(Q)", 
     336                        "P(Q)+S(Q)", 
     337                        "custom" 
     338                    ]) 
     339                    return cbox 
     340 
     341                elif param_item.text() == "effective radius": 
     342                    print("gonna do an effective radius combo box") 
     343                    # TODO: ONLY TEMPORARY EXAMPLE STUFF HERE RIGHT NOW 
     344                    cbox = QtWidgets.QComboBox(parent) 
     345                    cbox.addItems([ 
     346                        "ER_mean_curvature", 
     347                        "ER_equivalent_sphere", 
     348                        "ER_maximum_radius", 
     349                        "ER_minimum_radius" 
     350                    ]) 
     351                    return cbox 
     352 
     353                elif param_item.text() == "volume fraction": 
     354                    print("gonna do a volume fraction combo box") 
     355                    # TODO: ONLY TEMPORARY EXAMPLE STUFF HERE RIGHT NOW 
     356                    cbox = QtWidgets.QComboBox(parent) 
     357                    cbox.addItems([ 
     358                        "VR_something", 
     359                        "VR_something_else", 
     360                        "VR_something_completely_different" 
     361                    ]) 
     362                    return cbox 
     363 
     364        # return default otherwise 
     365        print("let's do a normal thing instead") 
     366        return super(StructureViewDelegate, self).createEditor( 
     367            parent, option, index 
     368        ) 
  • .gitignore

    r846a063 rce1f491  
    1010# Feel free to add more stuff to this as and when it becomes an issue. 
    1111 
     12# stack dumps due to Git Bash internal crashes 
     13*.stackdump 
     14 
    1215# Editor files 
     16*.pyproj 
     17*.sln 
    1318.DS_Store 
    1419/.settings 
     
    1722/.pydevproject 
    1823/.idea 
     24/.vs 
    1925 
    2026# Build and run files 
  • build_tools/conda_qt5_osx.yml

    ra36517ad r4dd5766  
    3232  - libgfortran=3.0.0=0 
    3333  - libtiff=4.0.9=0 
    34   - libxml2=2.9.8=0 
    3534  - libxslt=1.1.32=0 
    3635  - llvm-meta=6.0.0=0 
  • installers/sasview_qt5.spec

    ra0ed202 rbb3b1c2  
    4343datas = [('../src/sas/sasview/images', 'images')] 
    4444 
    45 datas = [('../src/sas/sasview/images/ball.png', '.')] 
     45#datas = [('../src/sas/sasview/images/ball.png', '.')] 
    4646 
    4747datas.append(('../src/sas/sasview/media','media')) 
     
    6565datas.append((os.path.join('..', 'src','sas','sasgui','perspectives','fitting','plugin_models'),'plugin_models')) 
    6666datas.append((os.path.join(PYTHON_LOC,'Library','plugins','platforms'),'platforms')) 
    67 datas.append((os.path.join(PYTHON_LOC,'Lib','site-packages','zmq','libzmq.cp36-win_amd64.pyd'),'.')) 
     67datas.append((os.path.join(PYTHON_LOC,'Lib','site-packages','jedi'),'jedi')) 
     68datas.append((os.path.join(PYTHON_LOC,'Library','bin', 'libzmq.dll'),'libzmq.pyd')) 
    6869 
    6970# These depend on whether we have MKL or Atlas numpy 
  • src/sas/qtgui/GUITests.py

    r57be490 rd0528c4  
    33from PyQt5 import QtGui 
    44from PyQt5 import QtWidgets 
     5 
     6""" 
     7Unit tests for the QT GUI 
     8========================= 
     9 
     10In order to run the tests, first install SasView and sasmodels to site-packages 
     11by running ``python setup.py install`` in both repositories. 
     12 
     13The tests can be run with ``python GUITests.py``, or to get more verbose 
     14console output (recommended), use ``python GUITests.py -v``. 
     15""" 
    516 
    617# Prepare the general QApplication instance 
  • src/sas/qtgui/MainWindow/DataExplorer.py

    r515c23df r6ff103a  
    5656        self.mutex = QtCore.QMutex() 
    5757 
    58         # Active plots 
     58        # Plot widgets {name:widget}, required to keep track of plots shown as MDI subwindows 
     59        self.plot_widgets = {} 
     60 
     61        # Active plots {id:Plotter1D/2D}, required to keep track of currently displayed plots 
    5962        self.active_plots = {} 
    6063 
     
    493496        # Now query the model item for available plots 
    494497        plots = GuiUtils.plotsFromFilename(filename, model) 
    495         item = GuiUtils.itemFromFilename(filename, model) 
    496498 
    497499        new_plots = [] 
    498         for plot in plots: 
     500        for item, plot in plots.items(): 
    499501            plot_id = plot.id 
    500502            if plot_id in list(self.active_plots.keys()): 
     
    554556                if not 'new_plot' in locals(): 
    555557                    new_plot = Plotter(self) 
     558                    new_plot.item = item 
    556559                new_plot.plot(plot_set) 
    557560                # active_plots may contain multiple charts 
     
    592595 
    593596        # Add the plot to the workspace 
    594         self.parent.workspace().addSubWindow(new_plot) 
     597        plot_widget = self.parent.workspace().addSubWindow(new_plot) 
    595598 
    596599        # Show the plot 
    597600        new_plot.show() 
    598601        new_plot.canvas.draw() 
     602 
     603        # Update the plot widgets dict 
     604        self.plot_widgets[title]=plot_widget 
    599605 
    600606        # Update the active chart list 
     
    10261032            return 
    10271033 
    1028         proxy = self.current_view.model() 
    1029         model = proxy.sourceModel() 
    1030  
    1031         deleted_items = [] 
    1032         deleted_names = [] 
    1033  
    10341034        # Every time a row is removed, the indices change, so we'll just remove 
    10351035        # rows and keep calling selectedIndexes until it returns an empty list. 
    10361036        indices = self.current_view.selectedIndexes() 
     1037 
     1038        proxy = self.current_view.model() 
     1039        model = proxy.sourceModel() 
     1040 
     1041        deleted_items = [] 
     1042        deleted_names = [] 
    10371043 
    10381044        while len(indices) > 0: 
     
    10461052                deleted_names.append(item_to_delete.text()) 
    10471053                deleted_items.append(item_to_delete) 
     1054 
     1055                # Delete corresponding open plots 
     1056                self.closePlotsForItem(item_to_delete) 
    10481057 
    10491058                if item_to_delete.parent(): 
     
    10601069        # update stored_data 
    10611070        self.manager.update_stored_data(deleted_names) 
     1071 
     1072    def closePlotsForItem(self, item): 
     1073        """ 
     1074        Given standard item, close all its currently displayed plots 
     1075        """ 
     1076        # item - HashableStandardItems of active plots 
     1077 
     1078        # {} -> 'Graph1' : HashableStandardItem() 
     1079        current_plot_items = {} 
     1080        for plot_name in PlotHelper.currentPlots(): 
     1081            current_plot_items[plot_name] = PlotHelper.plotById(plot_name).item 
     1082 
     1083        # item and its hashable children 
     1084        items_being_deleted = [] 
     1085        if item.rowCount() > 0: 
     1086            items_being_deleted = [item.child(n) for n in range(item.rowCount()) 
     1087                                   if isinstance(item.child(n), GuiUtils.HashableStandardItem)] 
     1088        items_being_deleted.append(item) 
     1089        # Add the parent in case a child is selected 
     1090        if isinstance(item.parent(), GuiUtils.HashableStandardItem): 
     1091            items_being_deleted.append(item.parent()) 
     1092 
     1093        # Compare plot items and items to delete 
     1094        plots_to_close = set(current_plot_items.values()) & set(items_being_deleted) 
     1095 
     1096        for plot_item in plots_to_close: 
     1097            for plot_name in current_plot_items.keys(): 
     1098                if plot_item == current_plot_items[plot_name]: 
     1099                    plotter = PlotHelper.plotById(plot_name) 
     1100                    # try to delete the plot 
     1101                    try: 
     1102                        plotter.close() 
     1103                        #self.parent.workspace().removeSubWindow(plotter) 
     1104                        self.plot_widgets[plot_name].close() 
     1105                        self.plot_widgets.pop(plot_name, None) 
     1106                    except AttributeError as ex: 
     1107                        logging.error("Closing of %s failed:\n %s" % (plot_name, str(ex))) 
     1108 
     1109        pass # debugger anchor 
    10621110 
    10631111    def onAnalysisUpdate(self, new_perspective=""): 
     
    11741222        self.theory_model.appendRow(model_item) 
    11751223 
    1176  
    1177 if __name__ == "__main__": 
    1178     app = QtWidgets.QApplication([]) 
    1179     dlg = DataExplorerWindow() 
    1180     dlg.show() 
    1181     sys.exit(app.exec_()) 
  • src/sas/qtgui/MainWindow/UnitTesting/DataExplorerTest.py

    r80468f6 rd9150d8  
    6767        # Buttons - data tab 
    6868        self.assertEqual(self.form.cmdLoad.text(), "Load data") 
    69         self.assertEqual(self.form.cmdDeleteData.text(), "Delete") 
     69        self.assertEqual(self.form.cmdDeleteData.text(), "Delete Data") 
    7070        self.assertEqual(self.form.cmdDeleteTheory.text(), "Delete") 
    7171        self.assertEqual(self.form.cmdFreeze.text(), "Freeze Theory") 
     
    819819        pass 
    820820 
    821     def notestDeleteItem(self): 
     821    def testDeleteItem(self): 
    822822        """ 
    823823        Delete selected item from data explorer 
     
    876876        self.assertEqual(self.form.model.rowCount(), 3) 
    877877 
     878    def testClosePlotsForItem(self): 
     879        """ 
     880        Delete selected item from data explorer should also delete corresponding plots 
     881        """ 
     882        # Mock the confirmation dialog with return=No 
     883        QMessageBox.question = MagicMock(return_value=QMessageBox.No) 
     884 
     885        loader = Loader() 
     886        manager = DataManager() 
     887        PlotHelper.clear() 
     888        self.form.enableGraphCombo(None) 
     889 
     890        # Make sure the controls are disabled 
     891        self.assertFalse(self.form.cbgraph.isEnabled()) 
     892        self.assertFalse(self.form.cmdAppend.isEnabled()) 
     893 
     894        # Populate the model 
     895        filename = ["cyl_400_20.txt"] 
     896        self.form.readData(filename) 
     897 
     898        # Mask plotting 
     899        self.form.parent.workspace = MagicMock() 
     900 
     901        # Call the plotting method 
     902        self.form.newPlot() 
     903 
     904        time.sleep(1) 
     905        QApplication.processEvents() 
     906 
     907        # The plot was registered 
     908        self.assertEqual(len(PlotHelper.currentPlots()), 1) 
     909        self.assertEqual(len(self.form.plot_widgets), 1) 
     910        self.assertEqual(list(self.form.plot_widgets.keys()), ['Graph3']) 
     911 
     912        # data index 
     913        model_item = self.form.model.item(0,0) 
     914 
     915        # Call the method 
     916        self.form.closePlotsForItem(model_item) 
     917 
     918        # See that no plot remained 
     919        self.assertEqual(len(PlotHelper.currentPlots()), 0) 
     920        self.assertEqual(len(self.form.plot_widgets), 0) 
     921 
    878922 
    879923if __name__ == "__main__": 
  • src/sas/qtgui/Plotting/Masks/SectorMask.py

    r05fa132 rd9150d8  
    44import numpy as np 
    55 
    6 from qtgui.Plotting.Slicers.BaseInteractor import BaseInteractor 
    7 from qtgui.Plotting.Slicers.SectorSlicer import SideInteractor 
    8 from qtgui.Plotting.Slicers.SectorSlicer import LineInteractor 
     6from sas.qtgui.Plotting.Slicers.BaseInteractor import BaseInteractor 
     7from sas.qtgui.Plotting.Slicers.SectorSlicer import SideInteractor 
     8from sas.qtgui.Plotting.Slicers.SectorSlicer import LineInteractor 
    99 
    1010class SectorMask(BaseInteractor): 
  • src/sas/qtgui/Plotting/Plotter2D.py

    re20870b rd9150d8  
    8585        self.yLabel = "%s(%s)"%(data._yaxis, data._yunit) 
    8686        self.title(title=data.title) 
    87  
    88     @property 
    89     def item(self): 
    90         ''' getter for this plot's QStandardItem ''' 
    91         return self._item 
    92  
    93     @item.setter 
    94     def item(self, item=None): 
    95         ''' setter for this plot's QStandardItem ''' 
    96         self._item = item 
    9787 
    9888    def plot(self, data=None, marker=None, show_colorbar=True): 
  • src/sas/qtgui/Plotting/PlotterBase.py

    re30646ab rd9150d8  
    133133 
    134134    @property 
     135    def item(self): 
     136        ''' getter for this plot's QStandardItem ''' 
     137        return self._item 
     138 
     139    @item.setter 
     140    def item(self, item=None): 
     141        ''' setter for this plot's QStandardItem ''' 
     142        self._item = item 
     143 
     144    @property 
    135145    def xLabel(self, xlabel=""): 
    136146        """ x-label setter """ 
  • src/sas/qtgui/Utilities/GuiUtils.py

    re20870b r6ff103a  
    415415    assert isinstance(filename, str) 
    416416 
    417     plot_data = [] 
     417    plot_data = {} 
    418418    # Iterate over model looking for named items 
    419419    for index in range(model_item.rowCount()): 
     
    421421        if str(item.text()) == filename: 
    422422            # TODO: assure item type is correct (either data1/2D or Plotter) 
    423             plot_data.append(item.child(0).data()) 
     423            plot_data[item] = item.child(0).data() 
    424424            # Going 1 level deeper only 
    425425            for index_2 in range(item.rowCount()): 
     
    427427                if item_2 and item_2.isCheckable(): 
    428428                    # TODO: assure item type is correct (either data1/2D or Plotter) 
    429                     plot_data.append(item_2.child(0).data()) 
     429                    plot_data[item_2] = item_2.child(0).data() 
    430430 
    431431    return plot_data 
  • src/sas/qtgui/convertUI.py

    rc03692f r67642f7  
    1313    os.system(execute) 
    1414 
     15def file_in_newer(file_in, file_out): 
     16    """ 
     17    Check whether file_in is newer than file_out, if file_out exists. 
     18 
     19    Returns True if file_in is newer, or if file_out doesn't exist; False 
     20    otherwise. 
     21    """ 
     22    try: 
     23        out_stat = os.stat(file_out) 
     24    except OSError: 
     25        # file_out does not exist 
     26        return True 
     27 
     28    in_stat = os.stat(file_in) 
     29 
     30    # simple comparison of modification time 
     31    return in_stat.st_mtime >= out_stat.st_mtime 
     32 
    1533# look for .ui files 
    1634for root, dirs, files in os.walk("."): 
     
    1937            file_in = os.path.join(root, file) 
    2038            file_out = os.path.splitext(file_in)[0]+'.py' 
    21             pyuic(file_in, file_out) 
     39            if file_in_newer(file_in, file_out): 
     40                print("Generating " + file_out + " ...") 
     41                pyuic(file_in, file_out) 
    2242 
    2343# RC file in UI directory 
     
    2747out_file = 'main_resources_rc.py' 
    2848 
    29 pyrrc(os.path.join(ui_root, rc_file), os.path.join(ui_root, out_file)) 
     49in_file = os.path.join(ui_root, rc_file) 
     50out_file = os.path.join(ui_root, out_file) 
     51 
     52if file_in_newer(in_file, out_file): 
     53    print("Generating " + out_file + " ...") 
     54    pyrrc(in_file, out_file) 
    3055 
    3156# Images 
     
    3459rc_file = 'images.qrc' 
    3560out_file = 'images_rc.py' 
    36 pyrrc(os.path.join(images_root, rc_file), os.path.join(out_root, out_file)) 
     61 
     62in_file = os.path.join(images_root, rc_file) 
     63out_file = os.path.join(ui_root, out_file) 
     64 
     65if file_in_newer(in_file, out_file): 
     66    print("Generating " + out_file + " ...") 
     67    pyrrc(in_file, out_file) 
     68 
  • src/sas/sasview/__init__.py

    r6a88ad9 r18f11a6  
    1 __version__ = "4.1" 
     1__version__ = "5.0" 
    22__build__ = "GIT_COMMIT" 
Note: See TracChangeset for help on using the changeset viewer.