Changeset 3370


Ignore:
Timestamp:
May 3, 2018 6:45:33 PM (3 years ago)
Author:
toby
Message:

add spinners for parameter display and clean up

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIctrlGUI.py

    r3368 r3370  
    32713271        self.varyList = varyList
    32723272        self.fullVaryList = fullVaryList
    3273 
    3274         self.parmNames = list(parmDict.keys())
    3275         self.parmNames.sort()
     3273        self.choiceDict = {}
     3274
     3275        # make lists of variables of different types along with lists of parameter names, histogram #s, phase #s,...
     3276        self.parmNames = sorted(list(parmDict.keys()))
    32763277        splitNames = [item.split(':') for item in self.parmNames if len(item) > 3 and not isinstance(self.parmDict[item],basestring)]
    3277         self.globNames = [':'.join(item) for item in splitNames if not item[0] and not item[1]]
    3278         self.globVars = list(set([' ',]+[item[2] for item in splitNames if not item[0] and not item[1]]))
    3279         self.globVars.sort()
    3280         self.hisNames = [':'.join(item) for item in splitNames if not item[0] and item[1]]
    3281         self.hisNums = list(set([int(item.split(':')[1]) for item in self.hisNames]))
    3282         self.hisNums.sort()
     3278        globNames = [':'.join(item) for item in splitNames if not item[0] and not item[1]]
     3279        if len(globNames):
     3280            self.choiceDict['Global'] = G2obj.SortVariables(globNames)
     3281        self.globVars = sorted(list(set([' ',]+[item[2] for item in splitNames if not item[0] and not item[1]])))
     3282        hisNames = [':'.join(item) for item in splitNames if not item[0] and item[1]]
     3283        self.choiceDict['Histogram'] = G2obj.SortVariables(hisNames)
     3284        self.hisNums = sorted(list(set([int(item.split(':')[1]) for item in hisNames])))
    32833285        self.hisNums = [' ',]+[str(item) for item in self.hisNums]
    3284         self.hisVars = list(set([' ',]+[item[2] for item in splitNames if not item[0]]))
    3285         self.hisVars.sort()
    3286         self.phasNames = [':'.join(item) for item in splitNames if not item[1] and 'is' not in item[2]]
    3287         self.phasNums = [' ',]+list(set([item.split(':')[0] for item in self.phasNames]))
     3286        self.hisVars = sorted(list(set([' ',]+[item[2] for item in splitNames if not item[0]])))
     3287        phasNames = [':'.join(item) for item in splitNames if not item[1] and 'is' not in item[2]]
     3288        self.choiceDict['Phase'] = G2obj.SortVariables(phasNames)
     3289        self.phasNums = sorted([' ',]+list(set([item.split(':')[0] for item in phasNames])))
    32883290        if '' in self.phasNums: self.phasNums.remove('')
    3289         self.phasVars = list(set([' ',]+[item[2] for item in splitNames if not item[1] and 'is' not in item[2]]))
    3290         self.phasVars.sort()
    3291         self.phasNums.sort()
    3292         self.hapNames = [':'.join(item) for item in splitNames if item[0] and item[1]]
    3293         self.hapVars = list(set([' ',]+[item[2] for item in splitNames if item[0] and item[1]]))
    3294         self.hapVars.sort()
     3291        self.phasVars = sorted(list(set([' ',]+[item[2] for item in splitNames if not item[1] and 'is' not in item[2]])))
     3292        hapNames = [':'.join(item) for item in splitNames if item[0] and item[1]]
     3293        self.choiceDict['Phase/Histo'] = G2obj.SortVariables(hapNames)
     3294        self.hapVars = sorted(list(set([' ',]+[item[2] for item in splitNames if item[0] and item[1]])))
     3295       
    32953296        self.hisNum = ' '
    32963297        self.phasNum = ' '
     
    32993300        self.DrawPanel()
    33003301       
    3301            
    3302     def DrawPanel(self):
    3303            
    3304         def _OnParmSel(event):
    3305             self.parmChoice = parmSel.GetStringSelection()
    3306             self.varName = ' '
    3307             wx.CallLater(100,self.DrawPanel)
    3308            
    3309         def OnPhasSel(event):
    3310             event.Skip()
    3311             self.phasNum = phasSel.GetValue()
    3312             self.varName = ' '
    3313             wx.CallLater(100,self.DrawPanel)
    3314 
    3315         def OnHistSel(event):
    3316             event.Skip()
    3317             self.hisNum = histSel.GetValue()
    3318             self.varName = ' '
    3319             wx.CallLater(100,self.DrawPanel)
    3320            
    3321         def OnVarSel(event):
    3322             self.varName = varSel.GetValue()
    3323             self.phasNum = ' '
    3324             self.hisNum = ' '
    3325             wx.CallLater(100,self.DrawPanel)
    3326            
    3327         def OnListSel(event):
    3328             self.listSel = listSel.GetStringSelection()
    3329             wx.CallLater(100,self.DrawPanel)
    3330 
    3331         if self.GetSizer(): self.GetSizer().Clear(True)
    3332         mainSizer = wx.BoxSizer(wx.VERTICAL)
    3333         num = len(self.varyList)
    3334         mainSizer.Add(wx.StaticText(self,label=' Number of refined variables: '+str(num)),0)
    3335         if len(self.varyList) != len(self.fullVaryList):
    3336             num = len(self.fullVaryList) - len(self.varyList)
    3337             mainSizer.Add(wx.StaticText(self,label=' + '+str(num)+' parameters are varied via constraints'))
    3338         choiceDict = {'Global':self.globNames,'Phase':self.phasNames,'Phase/Histo':self.hapNames,'Histogram':self.hisNames}
    3339         choice = ['Phase','Phase/Histo','Histogram']
    3340         if len(self.globNames):
    3341             choice += ['Global',]
    3342         parmSizer = wx.FlexGridSizer(0,3,5,5)
    3343         parmSel = wx.RadioBox(self,wx.ID_ANY,'Parameter type:',choices=choice,
    3344             majorDimension=1,style=wx.RA_SPECIFY_COLS)
    3345         parmSel.Bind(wx.EVT_RADIOBOX,_OnParmSel)
    3346         parmSel.SetStringSelection(self.parmChoice)
    3347         parmSizer.Add(parmSel,0)
    3348         numSizer = wx.BoxSizer(wx.VERTICAL)
    3349         numSizer.Add((5,25),0)
    3350         if self.parmChoice in ['Phase','Phase/Histo'] and len(self.phasNums) > 1:
    3351             numSizer.Add(wx.StaticText(self,label='Phase'),0)
    3352             phasSel = wx.ComboBox(self,choices=self.phasNums,value=self.phasNum,
    3353                 style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3354             phasSel.Bind(wx.EVT_COMBOBOX,OnPhasSel)
    3355             numSizer.Add(phasSel,0)
    3356         if self.parmChoice in ['Histogram','Phase/Histo'] and len(self.hisNums) > 1:
    3357             numSizer.Add(wx.StaticText(self,label='Histogram'),0)
    3358             histSel = wx.ComboBox(self,choices=self.hisNums,value=self.hisNum,
    3359                 style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3360             histSel.Bind(wx.EVT_COMBOBOX,OnHistSel)
    3361 #            histSel = wx.TextCtrl(self,size=(50,25),value='0',style=wx.TE_PROCESS_ENTER)
    3362 #            histSel.Bind(wx.EVT_TEXT_ENTER,OnHistSel)
    3363 #            histSel.Bind(wx.EVT_KILL_FOCUS,OnHistSel)
    3364             numSizer.Add(histSel,0)
    3365         parmSizer.Add(numSizer)
    3366         varSizer = wx.BoxSizer(wx.VERTICAL)
    3367         if self.parmChoice in ['Phase',]:
    3368             varSel = wx.ComboBox(self,choices=self.phasVars,value=self.varName,
    3369                 style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3370             varSel.Bind(wx.EVT_COMBOBOX,OnVarSel)
    3371         elif self.parmChoice in ['Histogram',]:
    3372             varSel = wx.ComboBox(self,choices=self.hisVars,value=self.varName,
    3373                 style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3374             varSel.Bind(wx.EVT_COMBOBOX,OnVarSel)
    3375         elif self.parmChoice in ['Phase/Histo',]:
    3376             varSel = wx.ComboBox(self,choices=self.hapVars,value=self.varName,
    3377                 style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3378             varSel.Bind(wx.EVT_COMBOBOX,OnVarSel)
    3379         if self.parmChoice != 'Global':
    3380             varSizer.Add(wx.StaticText(self,label='Parameter'))
    3381             varSizer.Add(varSel,0)
    3382         parmSizer.Add(varSizer,0)
    3383         mainSizer.Add(parmSizer,0)
    3384         listSel = wx.RadioBox(self,wx.ID_ANY,'Parameter type:',
    3385             choices=['All','Refined'],
    3386             majorDimension=0,style=wx.RA_SPECIFY_COLS)
    3387         listSel.SetStringSelection(self.listSel)
    3388         listSel.Bind(wx.EVT_RADIOBOX,OnListSel)
    3389         mainSizer.Add(listSel,0)
    3390        
    3391         headSizer = wx.wx.BoxSizer(wx.HORIZONTAL) # non-scrolling header       
    3392         self.panel = wxscroll.ScrolledPanel(self)       
    3393         subSizer = wx.FlexGridSizer(cols=4,hgap=2,vgap=2)
    3394         # header now gets created later
    3395 #        subSizer.Add((-1,-1))
    3396 #        subSizer.Add(wx.StaticText(self.panel,wx.ID_ANY,'Parameter name  '))
    3397 #        subSizer.Add(wx.StaticText(self.panel,wx.ID_ANY,'refine?'))
    3398 #        subSizer.Add(wx.StaticText(self.panel,wx.ID_ANY,'value'),0,wx.ALIGN_RIGHT)
     3302    def repaintScrollTbl(self):
     3303        '''Shows the selected variables
     3304
     3305        This routine is pretty slow when lots of variables are selected. Why?
     3306        '''
     3307        self.countSizer.Clear(True)
     3308        self.headSizer.Clear(True)
     3309        self.scrolledSizer.Clear(True)
     3310        self.explainSizer.Clear(True)
     3311       
    33993312        explainRefine = False
    34003313        count = 0
    3401         for name in choiceDict[self.parmChoice]:
     3314        for name in self.choiceDict[self.parmChoice]:
    34023315            # skip entries without numerical values
    34033316            if isinstance(self.parmDict[name],basestring): continue
     
    34173330            v = G2obj.getVarDescr(name)
    34183331            if v is None or v[-1] is None:
    3419                 subSizer.Add((-1,-1))
     3332                self.scrolledSizer.Add((-1,-1))
    34203333            else:               
    34213334                ch = HelpButton(self.panel,G2obj.fmtVarDescr(name))
    3422                 subSizer.Add(ch,0,wx.LEFT|wx.RIGHT|WACV|wx.ALIGN_CENTER,1)
    3423             subSizer.Add(wx.StaticText(self.panel,wx.ID_ANY,str(name)))
     3335                self.scrolledSizer.Add(ch,0,wx.LEFT|wx.RIGHT|WACV|wx.ALIGN_CENTER,1)
     3336            self.scrolledSizer.Add(wx.StaticText(self.panel,wx.ID_ANY,str(name)))
    34243337            if name in self.varyList:
    3425                 subSizer.Add(wx.StaticText(self.panel,label='R',size=(50,-1)))   #TODO? maybe a checkbox for one stop refinemnt flag setting?
     3338                self.scrolledSizer.Add(wx.StaticText(self.panel,label='R',size=(50,-1)))   #TODO? maybe a checkbox for one stop refinemnt flag setting?
    34263339            elif name in self.fullVaryList:
    3427                 subSizer.Add(wx.StaticText(self.panel,label='C',size=(50,-1)))
     3340                self.scrolledSizer.Add(wx.StaticText(self.panel,label='C',size=(50,-1)))
    34283341                explainRefine = True
    34293342            else:
    3430                 subSizer.Add((50,-1))
    3431             subSizer.Add(wx.StaticText(self.panel,label=value),0,wx.ALIGN_RIGHT)
     3343                self.scrolledSizer.Add((50,-1))
     3344            self.scrolledSizer.Add(wx.StaticText(self.panel,label=value),0,wx.ALIGN_RIGHT)
    34323345            count += 1
    34333346            if count > 200:
    34343347                msg = wx.StaticText(self,label='Too many parameters selected. Showing first 200')
    34353348                msg.SetBackgroundColour(wx.YELLOW)
    3436                 mainSizer.Add(msg,0,wx.ALIGN_LEFT)
    3437                 mainSizer.Add((-1,10))
     3349                self.countSizer.Add(msg,0,wx.ALIGN_LEFT)
     3350                self.countSizer.Add((-1,10))
    34383351                break
    3439         mainSizer.Add(headSizer,0)
    3440         self.panel.SetSizer(subSizer)
    3441         mainSizer.Add(self.panel,1,wx.ALL|wx.EXPAND,1)
    34423352       
    34433353        if explainRefine:
    3444             mainSizer.Add(
     3354            self.explainSizer.Add(
    34453355                wx.StaticText(self,label='"R" indicates a refined variable\n'+
    34463356                    '"C" indicates generated from a constraint'),0, wx.ALL,0)
     3357        self.panel.SetAutoLayout(1)
     3358        self.panel.SetupScrolling()
     3359        self.SetMinSize(self.GetSize())        # Allow window to be enlarged but not made smaller
     3360        for txt,wid,loc in zip(['','Parameter name','refine?','value'],self.scrolledSizer.GetColWidths(),
     3361                           [wx.ALIGN_LEFT,wx.ALIGN_LEFT,wx.ALIGN_LEFT,wx.ALIGN_RIGHT]):
     3362            self.headSizer.Add(wx.StaticText(self,wx.ID_ANY,txt,size=(wid,-1),style=loc),0,loc)
     3363        self.SendSizeEvent()
     3364           
     3365    def DrawPanel(self):
     3366        '''Draws the contents of the entire dialog. Called initially & when radio buttons are pressed
     3367        '''
     3368        def _OnParmSel(event):
     3369            self.parmChoice = parmSel.GetStringSelection()
     3370            self.varName = ' '
     3371            wx.CallLater(100,self.DrawPanel)
     3372           
     3373        def OnPhasSel(event):
     3374            event.Skip()
     3375            self.phasNum = phasSel.GetValue()
     3376            self.varName = ' '
     3377            if varSel: varSel.SetSelection(0)
     3378            wx.CallAfter(self.repaintScrollTbl)
     3379
     3380        def OnHistSel(event):
     3381            event.Skip()
     3382            self.hisNum = histSel.GetValue()
     3383            self.varName = ' '
     3384            if varSel: varSel.SetSelection(0)
     3385            wx.CallAfter(self.repaintScrollTbl)
     3386           
     3387        def OnVarSel(event):
     3388            event.Skip()
     3389            self.varName = varSel.GetValue()
     3390            self.phasNum = ' '
     3391            if phasSel: phasSel.SetSelection(0)
     3392            self.hisNum = ' '
     3393            if histSel: histSel.SetSelection(0)
     3394            wx.CallAfter(self.repaintScrollTbl)
     3395           
     3396        def OnListSel(event):
     3397            self.listSel = listSel.GetStringSelection()
     3398            wx.CallLater(100,self.DrawPanel)
     3399                       
     3400        def OnVarSpin(event):
     3401            '''Respond when any of the SpinButton widgets are pressed'''
     3402            event.Skip()
     3403            Spinner = event.GetEventObject()
     3404            move = Spinner.GetValue()
     3405            Spinner.SetValue(0)
     3406            varSel,binding = self.SpinDict[Spinner.GetId()]
     3407            i = varSel.GetSelection() - move
     3408            if i < 0:
     3409                i = varSel.GetCount()-1
     3410            elif i >= varSel.GetCount():
     3411                i = 0
     3412            varSel.SetSelection(i)
     3413            wx.CallLater(100,binding,event)
     3414
     3415        def AddSpinner(varSizer,label,SelCtrl,binding):
     3416            '''Add a label and a SpinButton to a Combo widget (SelCtrl)
     3417            Saves a pointer to the combo widget and the callback used by that widget
     3418            '''
     3419            SelCtrl.Bind(wx.EVT_COMBOBOX,binding)
     3420            varSizer.Add(wx.StaticText(self,label=label))
     3421            varSelSizer = wx.BoxSizer(wx.HORIZONTAL)
     3422            varSelSizer.Add(SelCtrl,0)
     3423            varSpin = wx.SpinButton(self,style=wx.wx.SP_VERTICAL)
     3424            varSpin.SetValue(0)
     3425            varSpin.SetRange(-1,1)
     3426            varSpin.Bind(wx.EVT_SPIN, OnVarSpin)
     3427            self.SpinDict[varSpin.GetId()] = SelCtrl,binding
     3428            varSelSizer.Add(varSpin,0)
     3429            varSizer.Add(varSelSizer,0)
     3430           
     3431        if self.GetSizer(): self.GetSizer().Clear(True)
     3432        self.SpinDict = {}
     3433        mainSizer = wx.BoxSizer(wx.VERTICAL)
     3434        num = len(self.varyList)
     3435        mainSizer.Add(wx.StaticText(self,label=' Number of refined variables: '+str(num)),0,wx.ALIGN_CENTER)
     3436        if len(self.varyList) != len(self.fullVaryList):
     3437            num = len(self.fullVaryList) - len(self.varyList)
     3438            mainSizer.Add(wx.StaticText(self,label=' + '+str(num)+' parameters are varied via constraints'))
     3439        choice = ['Phase','Phase/Histo','Histogram']
     3440        if 'Global' in self.choiceDict:
     3441            choice += ['Global',]
     3442        parmSizer = wx.BoxSizer(wx.HORIZONTAL)
     3443        parmSel = wx.RadioBox(self,wx.ID_ANY,'Parameter type:',choices=choice,
     3444            majorDimension=1,style=wx.RA_SPECIFY_COLS)
     3445        parmSel.Bind(wx.EVT_RADIOBOX,_OnParmSel)
     3446        parmSel.SetStringSelection(self.parmChoice)
     3447        parmSizer.Add(parmSel,0)
     3448       
     3449        selectionsSizer = wx.BoxSizer(wx.VERTICAL)       
     3450        varSizer = wx.BoxSizer(wx.VERTICAL)
     3451        varSel = None
     3452        if self.parmChoice != 'Global':
     3453            if self.parmChoice in ['Phase',]:
     3454                varSel = wx.ComboBox(self,choices=self.phasVars,value=self.varName,
     3455                    style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3456            elif self.parmChoice in ['Histogram',]:
     3457                varSel = wx.ComboBox(self,choices=self.hisVars,value=self.varName,
     3458                    style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3459            elif self.parmChoice in ['Phase/Histo',]:
     3460                varSel = wx.ComboBox(self,choices=self.hapVars,value=self.varName,
     3461                    style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3462            AddSpinner(varSizer,'Parameter',varSel,OnVarSel)
     3463        selectionsSizer.Add(varSizer,0)
     3464               
     3465        varSizer = wx.BoxSizer(wx.HORIZONTAL)
     3466        phasSel = None
     3467        if self.parmChoice in ['Phase','Phase/Histo'] and len(self.phasNums) > 1:
     3468            numSizer = wx.BoxSizer(wx.VERTICAL)
     3469            phasSel = wx.ComboBox(self,choices=self.phasNums,value=self.phasNum,
     3470                style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3471            AddSpinner(numSizer,'Phase',phasSel,OnPhasSel)
     3472            varSizer.Add(numSizer)
     3473
     3474        histSel = None
     3475        if self.parmChoice in ['Histogram','Phase/Histo'] and len(self.hisNums) > 1:
     3476            numSizer = wx.BoxSizer(wx.VERTICAL)
     3477            histSel = wx.ComboBox(self,choices=self.hisNums,value=self.hisNum,
     3478                style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3479            AddSpinner(numSizer,'Histogram',histSel,OnHistSel)
     3480            varSizer.Add(numSizer)
     3481        selectionsSizer.Add(varSizer,0)
     3482        parmSizer.Add(selectionsSizer,0)
     3483        mainSizer.Add(parmSizer,0)
     3484       
     3485        listSel = wx.RadioBox(self,wx.ID_ANY,'Parameter type:',
     3486            choices=['All','Refined'],
     3487            majorDimension=0,style=wx.RA_SPECIFY_COLS)
     3488        listSel.SetStringSelection(self.listSel)
     3489        listSel.Bind(wx.EVT_RADIOBOX,OnListSel)
     3490        mainSizer.Add(listSel,0)
     3491       
     3492        self.countSizer = wx.BoxSizer(wx.VERTICAL)
     3493        mainSizer.Add(self.countSizer)
     3494        self.headSizer = wx.BoxSizer(wx.HORIZONTAL) # non-scrolling header       
     3495        mainSizer.Add(self.headSizer,0)
     3496        self.panel = wxscroll.ScrolledPanel(self)       
     3497        self.scrolledSizer = wx.FlexGridSizer(cols=4,hgap=2,vgap=2)
     3498        self.panel.SetSizer(self.scrolledSizer)
     3499        mainSizer.Add(self.panel,1,wx.ALL|wx.EXPAND,1)
     3500        self.explainSizer = wx.BoxSizer(wx.VERTICAL)
     3501        mainSizer.Add(self.explainSizer)
    34473502        # make OK button
    34483503        btnsizer = wx.BoxSizer(wx.HORIZONTAL)
     
    34523507        mainSizer.Add(btnsizer, 0, wx.ALIGN_CENTER|wx.ALL, 5)
    34533508        self.SetSizer(mainSizer)
    3454         self.panel.SetAutoLayout(1)
    3455         self.panel.SetupScrolling()
    3456         self.SetMinSize(self.GetSize())        # Allow window to be enlarged but not made smaller
    3457         for txt,wid,loc in zip(['','Parameter name','refine?','value'],subSizer.GetColWidths(),
    3458                            [wx.ALIGN_LEFT,wx.ALIGN_LEFT,wx.ALIGN_LEFT,wx.ALIGN_RIGHT]):
    3459             headSizer.Add(wx.StaticText(self,wx.ID_ANY,txt,size=(wid,-1),style=loc),0,loc)
    3460         self.SendSizeEvent()
    3461        
     3509        wx.CallAfter(self.repaintScrollTbl)
     3510               
    34623511    def _onClose(self,event):
    34633512        self.EndModal(wx.ID_CANCEL)
Note: See TracChangeset for help on using the changeset viewer.