Changeset 2e5081b in sasview


Ignore:
Timestamp:
Nov 26, 2018 9:07:55 AM (3 weeks ago)
Author:
Piotr Rozyczko <piotr.rozyczko@…>
Branches:
ESS_GUI, ESS_GUI_Invariant, ESS_GUI_batch_fitting, ESS_GUI_ordering
Children:
9c207f5
Parents:
9c05f22
Message:

Redone the widget slightly, to fit with requirements in trac#1135.
Added comboboxes for all available fitpage names
Removed constraint of needing two selected fitpages
Removed the "Swap" button - it is redundant now.
Added context dependence on the "Select All" action.
Removed immediate constraint validation to allow for more complex
formulas

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

Legend:

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

    rd72ac57 r2e5081b  
    3737        self.operator = '=' 
    3838        self._constraint = Constraint() 
     39        self.all_menu   = None 
    3940 
    4041        self.warning = self.lblWarning.text() 
     
    6061        self.cmdOK.clicked.connect(self.onApply) 
    6162        self.cmdHelp.clicked.connect(self.onHelp) 
    62         self.cmdRevert.clicked.connect(self.onRevert) 
    6363        self.txtConstraint.editingFinished.connect(self.validateFormula) 
     64        self.cbModel1.currentIndexChanged.connect(self.onModelIndexChange) 
     65        self.cbModel2.currentIndexChanged.connect(self.onModelIndexChange) 
    6466 
    6567        self.cbParam1.currentIndexChanged.connect(self.onParamIndexChange) 
     
    7173        Setup widgets based on current parameters 
    7274        """ 
    73         self.txtName1.setText(self.tab_names[0]) 
    74         self.txtName2.setText(self.tab_names[1]) 
     75        self.cbModel1.insertItems(0, self.tab_names) 
     76        self.cbModel2.insertItems(0, self.tab_names) 
    7577 
    7678        self.setupParamWidgets() 
    7779 
    78         # Add menu to the Apply button 
    79         all_menu   = QtWidgets.QMenu() 
     80        self.setupMenu() 
     81 
     82    def setupMenu(self): 
     83        # Add menu to the Apply button, if necessary 
     84        if self.cbModel1.currentText() ==self.cbModel2.currentText(): 
     85            self.cmdOK.setArrowType(QtCore.Qt.NoArrow) 
     86            self.cmdOK.setPopupMode(QtWidgets.QToolButton.DelayedPopup) 
     87            self.cmdOK.setMenu(None) 
     88            return 
     89        self.all_menu   = QtWidgets.QMenu() 
    8090        self.actionAddAll = QtWidgets.QAction(self) 
    8191        self.actionAddAll.setObjectName("actionAddAll") 
     
    8494        self.actionAddAll.setToolTip(ttip) 
    8595        self.actionAddAll.triggered.connect(self.onSetAll) 
    86         all_menu.addAction(self.actionAddAll) 
     96        self.all_menu.addAction(self.actionAddAll) 
    8797        # https://bugreports.qt.io/browse/QTBUG-13663 
    88         all_menu.setToolTipsVisible(True) 
    89         self.cmdOK.setMenu(all_menu) 
     98        self.all_menu.setToolTipsVisible(True) 
     99        self.cmdOK.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) 
     100        self.cmdOK.setArrowType(QtCore.Qt.DownArrow) 
     101        self.cmdOK.setMenu(self.all_menu) 
    90102 
    91103    def setupParamWidgets(self): 
     
    94106        """ 
    95107        self.cbParam1.clear() 
    96         items1 = [param for param in self.params[0] if not self.tabs[0].paramHasConstraint(param)] 
     108        tab_index1 = self.cbModel1.currentIndex() 
     109        items1 = [param for param in self.params[tab_index1] if not self.tabs[tab_index1].paramHasConstraint(param)] 
    97110        self.cbParam1.addItems(items1) 
    98111 
    99112        # M2 doesn't have to be non-constrained 
    100113        self.cbParam2.clear() 
    101         #items2 = [param for param in self.params[1] if not self.tabs[1].paramHasConstraint(param)] 
    102         items2 = [param for param in self.params[1]] 
     114        tab_index2 = self.cbModel2.currentIndex() 
     115        items2 = [param for param in self.params[tab_index2]] 
    103116        self.cbParam2.addItems(items2) 
    104117 
    105         self.txtParam.setText(self.tab_names[0] + ":" + self.cbParam1.currentText()) 
     118        self.txtParam.setText(self.tab_names[tab_index1] + ":" + self.cbParam1.currentText()) 
    106119 
    107120        self.cbOperator.clear() 
     
    109122        self.txtOperator.setText(self.cbOperator.currentText()) 
    110123 
    111         self.txtConstraint.setText(self.tab_names[1]+"."+self.cbParam2.currentText()) 
     124        self.txtConstraint.setText(self.tab_names[tab_index2]+"."+self.cbParam2.currentText()) 
    112125 
    113126        # disable Apply if no parameters available 
     
    155168        self.lblWarning.setText(txt) 
    156169 
     170    def onModelIndexChange(self, index): 
     171        """ 
     172        Respond to mode combo box changes 
     173        """ 
     174        # disable/enable Add All 
     175        self.setupMenu() 
     176        # Reload parameters 
     177        self.setupParamWidgets() 
    157178 
    158179    def onOperatorChange(self, index): 
     
    162183        self.txtOperator.setText(self.cbOperator.currentText()) 
    163184 
    164     def onRevert(self): 
    165         """ 
    166         switch M1 <-> M2 
    167         """ 
    168         # Switch parameters 
    169         self.params[1], self.params[0] = self.params[0], self.params[1] 
    170         self.tab_names[1], self.tab_names[0] = self.tab_names[0], self.tab_names[1] 
    171         self.tabs[1], self.tabs[0] = self.tabs[0], self.tabs[1] 
    172         # Try to swap parameter names in the line edit 
    173         current_text = self.txtConstraint.text() 
    174         new_text = current_text.replace(self.cbParam1.currentText(), self.cbParam2.currentText()) 
    175         self.txtConstraint.setText(new_text) 
    176         # Update labels and tooltips 
    177         index1 = self.cbParam1.currentIndex() 
    178         index2 = self.cbParam2.currentIndex() 
    179         indexOp = self.cbOperator.currentIndex() 
    180         self.setupWidgets() 
    181  
    182         # Original indices 
    183         index2 = index2 if index2 >= 0 else 0 
    184         index1 = index1 if index1 >= 0 else 0 
    185         self.cbParam1.setCurrentIndex(index2) 
    186         self.cbParam2.setCurrentIndex(index1) 
    187         self.cbOperator.setCurrentIndex(indexOp) 
    188         self.setupTooltip() 
    189  
    190185    def validateFormula(self): 
    191186        """ 
    192187        Add visual cues when formula is incorrect 
    193188        """ 
     189        # temporarily disable validation 
     190        return 
     191        # 
    194192        formula_is_valid = self.validateConstraint(self.txtConstraint.text()) 
    195193        if not formula_is_valid: 
     
    208206            return False 
    209207 
    210         # M1.scale  --> model_str='M1', constraint_text='scale' 
     208        # M1.scale --> model_str='M1', constraint_text='scale' 
    211209        param_str = self.cbParam2.currentText() 
    212210        constraint_text = constraint_text.strip() 
    213         model_str = self.txtName2.text() 
     211        model_str = self.cbModel2.currentText() 
    214212 
    215213        # 0. Has to contain the model name 
    216         if model_str != self.txtName2.text(): 
     214        if model_str != model_str: 
    217215            return False 
    218216 
     
    249247        value = self.cbParam2.currentText() 
    250248        func = self.txtConstraint.text() 
    251         value_ex = self.txtName2.text() + "." + self.cbParam2.currentText() 
    252         model1 = self.txtName1.text() 
     249        value_ex = self.cbModel2.currentText() + "." + self.cbParam2.currentText() 
     250        model1 = self.cbModel1.currentText() 
    253251        operator = self.cbOperator.currentText() 
    254252 
     
    284282            param = item 
    285283            value = item 
    286             func = self.txtName2.text() + "." + param 
    287             value_ex = self.txtName1.text() + "." + param 
    288             model1 = self.txtName1.text() 
     284            func = self.cbModel2.currentText() + "." + param 
     285            value_ex = self.cbModel1.currentText() + "." + param 
     286            model1 = self.cbModel1.currentText() 
    289287            operator = self.cbOperator.currentText() 
    290288 
  • src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py

    r72651df r2e5081b  
    3333        self.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) 
    3434 
    35         self._is_dragged = True 
     35        self._is_dragged = False 
    3636 
    3737    def isDragged(self): 
     
    872872        """ 
    873873        selected_rows = self.selectedParameters(self.tblTabList) 
    874         if len(selected_rows)!=2: 
    875             msg = "Please select two fit pages from the Source Choice table." 
    876             msgbox = QtWidgets.QMessageBox(self.parent) 
    877             msgbox.setIcon(QtWidgets.QMessageBox.Warning) 
    878             msgbox.setText(msg) 
    879             msgbox.setWindowTitle("2 fit page constraints") 
    880             retval = msgbox.exec_() 
    881             return 
    882  
    883         tab_list = [ObjectLibrary.getObject(self.tblTabList.item(s, 0).data(0)) for s in selected_rows] 
     874 
     875        tab_list = [ObjectLibrary.getObject(self.tblTabList.item(s, 0).data(0)) for s in range(self.tblTabList.rowCount())] 
    884876        # Create and display the widget for param1 and param2 
    885877        cc_widget = ComplexConstraint(self, tabs=tab_list) 
  • src/sas/qtgui/Perspectives/Fitting/UI/ComplexConstraintUI.ui

    recc5d043 r2e5081b  
    77    <x>0</x> 
    88    <y>0</y> 
    9     <width>478</width> 
    10     <height>257</height> 
     9    <width>496</width> 
     10    <height>260</height> 
    1111   </rect> 
    1212  </property> 
     
    2121     </property> 
    2222     <layout class="QGridLayout" name="gridLayout"> 
     23      <item row="0" column="0"> 
     24       <layout class="QHBoxLayout" name="horizontalLayout"> 
     25        <item> 
     26         <widget class="QComboBox" name="cbModel1"/> 
     27        </item> 
     28        <item> 
     29         <widget class="QComboBox" name="cbParam1"> 
     30          <property name="sizePolicy"> 
     31           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> 
     32            <horstretch>0</horstretch> 
     33            <verstretch>0</verstretch> 
     34           </sizepolicy> 
     35          </property> 
     36          <property name="sizeAdjustPolicy"> 
     37           <enum>QComboBox::AdjustToContents</enum> 
     38          </property> 
     39          <item> 
     40           <property name="text"> 
     41            <string>sld</string> 
     42           </property> 
     43          </item> 
     44         </widget> 
     45        </item> 
     46        <item> 
     47         <widget class="QComboBox" name="cbOperator"> 
     48          <item> 
     49           <property name="text"> 
     50            <string>&gt;</string> 
     51           </property> 
     52          </item> 
     53         </widget> 
     54        </item> 
     55        <item> 
     56         <widget class="QComboBox" name="cbModel2"/> 
     57        </item> 
     58        <item> 
     59         <widget class="QComboBox" name="cbParam2"> 
     60          <property name="sizePolicy"> 
     61           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> 
     62            <horstretch>0</horstretch> 
     63            <verstretch>0</verstretch> 
     64           </sizepolicy> 
     65          </property> 
     66          <property name="sizeAdjustPolicy"> 
     67           <enum>QComboBox::AdjustToContents</enum> 
     68          </property> 
     69          <item> 
     70           <property name="text"> 
     71            <string>sld_a</string> 
     72           </property> 
     73          </item> 
     74         </widget> 
     75        </item> 
     76       </layout> 
     77      </item> 
    2378      <item row="1" column="0"> 
    2479       <layout class="QHBoxLayout" name="horizontalLayout_2"> 
     
    52107       </layout> 
    53108      </item> 
    54       <item row="0" column="0"> 
    55        <layout class="QHBoxLayout" name="horizontalLayout"> 
    56         <item> 
    57          <widget class="QLabel" name="txtName1"> 
    58           <property name="text"> 
    59            <string>name1</string> 
    60           </property> 
    61          </widget> 
    62         </item> 
    63         <item> 
    64          <widget class="QComboBox" name="cbParam1"> 
    65           <property name="sizePolicy"> 
    66            <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> 
    67             <horstretch>0</horstretch> 
    68             <verstretch>0</verstretch> 
    69            </sizepolicy> 
    70           </property> 
    71           <property name="sizeAdjustPolicy"> 
    72            <enum>QComboBox::AdjustToContents</enum> 
    73           </property> 
    74           <item> 
    75            <property name="text"> 
    76             <string>sld</string> 
    77            </property> 
    78           </item> 
    79          </widget> 
    80         </item> 
    81         <item> 
    82          <widget class="QComboBox" name="cbOperator"> 
    83           <item> 
    84            <property name="text"> 
    85             <string>&gt;</string> 
    86            </property> 
    87           </item> 
    88          </widget> 
    89         </item> 
    90         <item> 
    91          <widget class="QLabel" name="txtName2"> 
    92           <property name="text"> 
    93            <string>name2</string> 
    94           </property> 
    95          </widget> 
    96         </item> 
    97         <item> 
    98          <widget class="QComboBox" name="cbParam2"> 
    99           <property name="sizePolicy"> 
    100            <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> 
    101             <horstretch>0</horstretch> 
    102             <verstretch>0</verstretch> 
    103            </sizepolicy> 
    104           </property> 
    105           <property name="sizeAdjustPolicy"> 
    106            <enum>QComboBox::AdjustToContents</enum> 
    107           </property> 
    108           <item> 
    109            <property name="text"> 
    110             <string>sld_a</string> 
    111            </property> 
    112           </item> 
    113          </widget> 
    114         </item> 
    115         <item> 
    116          <spacer name="horizontalSpacer"> 
    117           <property name="orientation"> 
    118            <enum>Qt::Horizontal</enum> 
    119           </property> 
    120           <property name="sizeHint" stdset="0"> 
    121            <size> 
    122             <width>40</width> 
    123             <height>20</height> 
    124            </size> 
    125           </property> 
    126          </spacer> 
    127         </item> 
    128         <item> 
    129          <widget class="QPushButton" name="cmdRevert"> 
    130           <property name="text"> 
    131            <string>Swap</string> 
    132           </property> 
    133          </widget> 
    134         </item> 
    135        </layout> 
    136       </item> 
    137109     </layout> 
    138110    </widget> 
     
    188160       </property> 
    189161       <property name="popupMode"> 
    190         <enum>QToolButton::MenuButtonPopup</enum> 
     162        <enum>QToolButton::InstantPopup</enum> 
    191163       </property> 
    192164       <property name="toolButtonStyle"> 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/ComplexConstraintTest.py

    rd72ac57 r2e5081b  
    6969        self.assertEqual(self.widget.txtConstraint.text(), 'M1.scale') 
    7070        self.assertEqual(self.widget.txtOperator.text(), '=') 
    71         self.assertEqual(self.widget.txtName1.text(), 'M1') 
    72         self.assertEqual(self.widget.txtName2.text(), 'M1') 
     71        self.assertEqual(self.widget.cbModel1.currentText(), 'M1') 
     72        self.assertEqual(self.widget.cbModel2.currentText(), 'M1') 
    7373 
    7474    def testTooltip(self): 
     
    8181        self.assertEqual(self.widget.txtConstraint.toolTip(), tooltip) 
    8282 
    83     def testValidateFormula(self): 
     83    def notestValidateFormula(self): 
    8484        ''' assure enablement and color for valid formula ''' 
    8585        # Invalid string 
     
    141141        c = self.widget.constraint() 
    142142        self.assertEqual(c[0], 'M1') 
    143         self.assertEqual(c[1].func, 'M1.sld_solvent') 
     143        self.assertEqual(c[1].func, 'M1.bjerrum_length') 
    144144        #self.assertEqual(c[1].operator, '>=') 
    145145 
Note: See TracChangeset for help on using the changeset viewer.