Ignore:
Timestamp:
Nov 14, 2022 9:28:04 AM (7 months ago)
Author:
toby
Message:

more ValidatedTxtCtrl? fixes: add timer update for expressions & fix widget deletion problems

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIctrlGUI.py

    r5370 r5371  
    554554        self.notBlank = notBlank
    555555        self.ASCIIonly = ASCIIonly
    556         self.type = str
     556       
    557557        # patch: remove this when min & max are no longer used to call this
    558558        if min is not None:
     
    566566                print('Call to ValidatedTxtCtrl using max (change to xmax) here:')
    567567                G2obj.HowDidIgetHere(True)
     568        # end patch
     569       
    568570        # initialization
    569571        self.invalid = False   # indicates if the control has invalid contents
    570572        self.evaluated = False # set to True when the validator recognizes an expression
     573        self.timer = None      # tracks pending updates for expressions in float textctrls
     574        self.delay = 5000      # delay for timer update (5 sec)
     575        self.type = str
     576       
    571577        val = loc[key]
    572578        if 'style' in kw: # add a "Process Enter" to style
     
    672678            if self.nDig and show and not self.invalid:
    673679                wx.TextCtrl.SetValue(self,str(G2py3.FormatValue(val,self.nDig)))
     680                self.evaluated = False # expression has been recast as value, reset flag
    674681            elif show and not self.invalid:
    675682                wx.TextCtrl.SetValue(self,str(G2py3.FormatSigFigs(val)).rstrip('0'))
     683                self.evaluated = False # expression has been recast as value, reset flag
    676684        else:
    677685            if self.ASCIIonly:
     
    705713            self._onLoseFocus(None)
    706714        if event: event.Skip()
     715        if self.timer:
     716            self.timer.Restart(self.delay)
    707717                   
    708718    def _onStringKey(self,event):
     
    783793    def _onLeaveWindow(self,event):
    784794        '''If the mouse leaves the text box, save the result, if valid,
    785         but (unlike _onLoseFocus) don't update the textbox contents.
     795        but (unlike _onLoseFocus) there is a two second delay before
     796        the textbox contents are updated with the value from the formula.
    786797        '''
     798        def delayedUpdate():
     799            self.timer = None
     800            try:
     801                self._setValue(self.result[self.key])
     802            except:
     803                pass
    787804        if self.type is not str:
    788805            if not self.IsModified(): return  #ignore mouse crusing
     
    790807           return
    791808        if self.evaluated and not self.invalid: # deal with computed expressions
    792             self.evaluated = False # expression has been recast as value, reset flag
     809            if self.timer:
     810                self.timer.Restart(self.delay)
     811            else:
     812                self.timer = wx.CallLater(self.delay,delayedUpdate)    # this includes a try in case the widget is deleted
    793813        if self.invalid: # don't update an invalid expression
    794814            if event: event.Skip()
     
    813833            if self.invalid: # don't substitute for an invalid expression
    814834                return
    815             self.evaluated = False # expression has been recast as value, reset flag
    816835            self._setValue(self.result[self.key])
    817836        elif self.result is not None: # show formatted result, as Bob wants
     
    819838            if not self.invalid: # don't update an invalid expression
    820839                self._setValue(self.result[self.key])
     840               
    821841        if self.OnLeave:
    822842            self.event = event
     
    14501470    def _OnEvent(event):
    14511471        if event.GetEventObject() not in buttons:
    1452             print('Strange: unknown button')
     1472            if GSASIIpath.GetConfigValue('debug'): print('Strange: unknown button')
    14531473            return
    14541474        loc[key] = values[buttons.index(event.GetEventObject())]
Note: See TracChangeset for help on using the changeset viewer.