def test_thumbwheel():
    def tw_cb(event=None):
        pass
    from mglutil.gui.BasicWidgets.Tk.thumbwheel import ThumbWheel
    descr = InputFormDescr(title = 'Testing InputForm')
    descr.append({'name':'thumbwheel',
                  'widgetType':ThumbWheel,
                  'tooltip':"""Right click on the widget will display the control
                  panel and you can type a value manually""",
                  'defaultValue':100,
                  'wcfg':{'text':None,
                          'showLabel':1, 'width':100,
                          'min':0,
                          'lockBMin':1,
                          'lockBMax':1,
                          'lockBIncrement':1,
                          'value':40,
                          'oneTurn':1000,
                          'type':'int',
                          'increment':2,
                          'canvascfg':{'bg':'red'},
                          'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                          'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                          'callback':tw_cb,
                          'continuous':1, 'wheelPad':1, 'height':20},
                  'gridcfg':{'sticky':'e','row':-1}})
    
    form = InputForm(master, root, descr)
    value = form.testForm()
    assert value['thumbwheel']==100
    form.destroy() 
示例#2
0
def test_inputform_initialize():
    """
    Function to test the creation of an object InputForm with:
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    and the default value for the other argument of the constructor
    initFunc  = initialize()
    Focus on the initFunc
    """
    def initialize(form):
        w = form.descr.entryByName['listchooser']['widget']
        w.add(('Coconut', None))

    descr = createDescr()
    form = InputForm(master, root, descr, initFunc=initialize)
    setWidget = {
        'checkbutton': 1,
        'radioselect': 'rb9',
        'radioselect2': 'rb4',
        'listchooser': 'Pistachio'
    }
    value = form.testForm(setWidget=setWidget)
    ent = form.descr.entryByName['listchooser']['widget'].entries
    assert 'Coconut' in map(lambda x: x[0], ent)
示例#3
0
def test_inputform_1():
    """
    Function to test the instanciation of an InputForm object with the
    following arguments:
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    and the default value for the other argument of the constructor without
    specifying them
    """
    descr = createDescr()
    form = InputForm(master, root, descr)
    setWidget = {
        'checkbutton': 1,
        'radioselect': 'rb9',
        'radioselect2': 'rb4',
        'listchooser': 'Pistachio'
    }

    value = form.testForm(setWidget=setWidget)

    assert value['checkbutton'] == 1, 'Expected 1, got %s' % (
        value['checkbutton'])
    assert value['radioselect'] == 'rb9'
    assert value['radioselect2'] == 'rb4'
    assert value['listchooser'] == [
        'Pistachio',
    ]
    form.destroy()
示例#4
0
def test_scrolledText():
    descr = InputFormDescr(title="Testing ScrolledText")
    descr.append({
        'widgetType': Pmw.ScrolledText,
        'name': 'sText',
        'defaultValue': """DEFAULT TEXT""",
        'wcfg': {
            'labelpos': 'n',
            'label_text': 'ScrolledText with headers',
            'usehullsize': 1,
            'hull_width': 400,
            'hull_height': 300,
            'text_wrap': 'none',
            'text_padx': 4,
            'text_pady': 4,
        },
        'gridcfg': {
            'sticky': 'wens'
        }
    })

    form = InputForm(master, root, descr, modal=0, blocking=0)
    values = form.testForm()
    if not values['sText'] == 'DEFAULT TEXT\n':
        raise RuntimeError
    form.destroy()
示例#5
0
 def getInt(self):
     idf = InputFormDescr(title='Choose a value')
     idf.append({'widgetType':IntThumbWheel,
                 'name':'tw',
                 'wcfg':{'width':125, 'height':30, 'nblines':30}})
     form  = InputForm(master=self.widget.master, root = None, descr=idf)
     values = form.go()
     return values['tw']
示例#6
0
def test_inputform_okcfg():
    """
    Function to test the creation of an object InputForm with:
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    okCfg     = {'text':'Validate', 'command':validate_cb}
    cancelCfg = {'text':'Cancel', 'command':dismiss_cb}
    The other argument keep their default values.
    
    Focus on the ok and cancel buttons option. Adding a function to be called
    after by ok_cb or cancel_cb. In this case the additional functions
    dismiss_cb and validate_cb don't take any arguments
    """
    global dismiss
    global validate
    dismiss = False
    validate = False

    def dismiss_cb():
        global dismiss
        dismiss = True

    def validate_cb():
        print "In validate_cb"
        global validate
        validate = True
        print validate

    descr = createDescr()
    form = InputForm(master,
                     root,
                     descr,
                     modal=1,
                     blocking=0,
                     okCfg={
                         'text': 'Validate',
                         'command': validate_cb
                     },
                     cancelCfg={
                         'text': 'Dismiss',
                         'command': dismiss_cb
                     })
    setWidget = {
        'checkbutton': 1,
        'radioselect': 'rb9',
        'radioselect2': 'rb4',
        'listchooser': 'Pistachio'
    }
    value = form.testForm(setWidget=setWidget)
    print 'validate', validate
    print 'dismiss', dismiss
    assert validate
    assert not dismiss
    form.destroy()
def test_inputform_groupwidgetsdefault():
    descr = InputFormDescr(title = 'Testing InputForm')
    descr.append({'name':'group',
                  'widgetType':Tkinter.Radiobutton,
                  'listtext':['rb1', 'rb2', 'rb3'],
                  'defaultValue':'rb3',
                  'gridcfg':{'sticky':'w'}})
    
    form = InputForm(master, root, descr)
    value = form.testForm()
    assert value['group']=='rb3'
    form.destroy() 
def test_inputForm_notebook():
    descr = InputFormDescr(title = 'Testing InputForm')
    descr.append({'widgetType':Pmw.NoteBook,
                  'name':'notebook',
                  'container':{'Page1':"w.page('Page1')",
                               'Page2':"w.page('Page2')",
                               'Page3':"w.page('Page3')"},
                  'wcfg':{'borderwidth':3},
                  'componentcfg':[{'name':'Page1', 'cfg':{}},
                                  {'name':'Page2', 'cfg':{}},
                                  {'name':'Page3', 'cfg':{}}],
                  'gridcfg':{'sticky':'wnse'}
                  })

    entries = [('Chocolate',None), ('Vanilla', None), ('Strawberry', None),
               ('Coffee',None), ('Pistachio', None), ('Rasberry',None),
               ]

    descr.append({'name':'listchooser',
                  'parent':'Page1',
                  'widgetType':ListChooser,
                  'defaultValue':'Chocolate',
                  'wcfg':{'entries':entries},
                  'gridcfg':{'sticky':'w'}
                  })
    
    descr.append({'name':'radioselect2',
                  'widgetType':Pmw.RadioSelect,
                  'parent':'Page2',
                  'listtext':['rb1', 'rb2', 'rb3','rb4', 'rb5', 'rb6',
                              'rb7', 'rb8', 'rb9','rb10', 'rb11', 'rb12'],
                  'wcfg':{'labelpos':'n',
                          'label_text':'Radiobuttons: ',
                          'orient':'horizontal',
                          'buttontype':'radiobutton'},
                  'gridcfg':{'sticky':'w'} })

    descr.append({'name':'radioselect',
                  'widgetType':Pmw.RadioSelect,
                  'parent':'Page3',
                  'defaultValue':'rb5',
                  'listtext':['rb1', 'rb2', 'rb3','rb4', 'rb5', 'rb6',
                              'rb7', 'rb8', 'rb9','rb10', 'rb11', 'rb12'],
                  'wcfg':{'labelpos':'n',
                          'label_text':'Radiobuttons: ',
                          'orient':'vertical',
                          'buttontype':'radiobutton'},
                  'gridcfg':{'sticky':'w'} })
    form = InputForm(master, root, descr, modal=0, blocking=0)
    values = form.testForm(container='Page3')
    assert values['radioselect']=='rb5'
    form.destroy() 
示例#9
0
 def getInt(self):
     idf = InputFormDescr(title='Choose a value')
     idf.append({
         'widgetType': IntThumbWheel,
         'name': 'tw',
         'wcfg': {
             'width': 125,
             'height': 30,
             'nblines': 30
         }
     })
     form = InputForm(master=self.widget.master, root=None, descr=idf)
     values = form.go()
     return values['tw']
示例#10
0
def test_inputform_2():
    """
    
    Function to test the instanciation of an InputForm object with the
    following arguments:
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    and the default value for the other argument of the constructor
    modal    = 1
    blocking = 0,
    defaultDirection = 'row',
    closeWithWindow = 1,
    onDestroy = None
    okCfg     = {'text':'OK'}
    cancelCfg = {'text':'Cancel'}
    initFunc  = None

    Focus on the scrolled frame options.
    """
    import Pmw
    descr = createDescr()
    form = InputForm(master,
                     root,
                     descr,
                     modal=1,
                     blocking=0,
                     defaultDirection='row',
                     closeWithWindow=1,
                     onDestroy=None,
                     okCfg={'text': 'Validate'},
                     cancelCfg={'text': 'Dismiss'},
                     scrolledFrame=1,
                     width=400,
                     height=500,
                     initFunc=None)

    assert isinstance(form.sf, Pmw.ScrolledFrame)
    setWidget = {
        'checkbutton': 1,
        'radioselect': 'rb9',
        'radioselect2': 'rb4',
        'listchooser': 'Pistachio'
    }

    value = form.testForm(setWidget=setWidget)
    form.destroy()
示例#11
0
def test_inputform_3():
    """
    Function to test the instanciation of an InputForm object with the
    following argument, same options than before but this time the default
    arguments are specified. Change the text of the OK button to VALIDATE and
    the cancel button to DISMISS
    
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    modal    = 1
    blocking = 0,
    defaultDirection = 'row',
    closeWithWindow = 1,
    onDestroy = None,
    sFrameCfg = {}
    okCfg     = {'text':'VALIDATE'}
    cancelCfg = {'text':'DISMISS'}
    initFunc  = None

    Focus on the ok and cancel button options
    """
    descr = createDescr()
    # I don't know how to make sure that the ok button is now labeled VALIDATE
    # and the cancel button 'DISMISS'.
    form = InputForm(master,
                     root,
                     descr,
                     modal=1,
                     blocking=0,
                     defaultDirection='row',
                     closeWithWindow=1,
                     onDestroy=None,
                     okCfg={'text': 'VALIDATE'},
                     cancelCfg={'text': 'DISMISS'},
                     initFunc=None)
    setWidget = {
        'checkbutton': 1,
        'radioselect': 'rb9',
        'radioselect2': 'rb4',
        'listchooser': 'Pistachio'
    }

    value = form.testForm(setWidget=setWidget)
    #value = form.testForm()
    form.destroy()
示例#12
0
    def showForm(self, master, geomDic=None, func=None):
        """create formdescr for setGeoms
        geomDic = a dict of Geom 
        """
        # assign a func so we can log it in Pmv
        # func is a Pmv command
        if func:
            self.assign_func = func

        if geomDic:
            self.assignGeom[0] = geomDic

        if hasattr(self, 'form'):
            if self.guiOn:
                return
            else:
                self.update_lc2()
                self.form.deiconify()
                val = self.form.go()

                if val:
                    geomDic = self.assignGeom[0]
                    self.assign_func(geomDic)
                    self.form.withdraw()
        else:
            if not master:
                master = Tkinter.Toplevel()
                master.title('GeomChooser')
            else:
                master = master

            ifd = self.buildForm()
            self.form = InputForm(master,
                                  None,
                                  descr=ifd,
                                  scrolledFrame=0,
                                  cancelCfg={'command': self.cancel_cb})

            self.lc = self.form.descr.entryByName['availableGeom']['widget']
            self.lc2 = self.form.descr.entryByName['toload']['widget']
            self.addObject(self.viewer.rootObject, None)
            self.update_lc2()
            val = self.form.go()
            if val:
                geomDic = self.assignGeom[0]
                self.assign_func(geomDic)
                self.form.withdraw()
示例#13
0
 def buildText(self,parent,textwcfg, buttonwcfg):
     # Build the LoadOrSaveText widget or ScrolledText
     self.idf = InputFormDescr()
     textwcfg['name']='UserFunction'
     self.text = buttonwcfg['text']
     self.idf.append(textwcfg)
     #windows = InputForm(parent, self.idf)
     master = parent
     root = None
     windows = InputForm(master,root,  self.idf)
     self.vals = windows.go()
     # Uncheck the checkbutton if needed
     if isinstance(self.button,Tkinter.Checkbutton) and \
        buttonwcfg.has_key('variable'):
         if isinstance(buttonwcfg['variable'], Tkinter.StringVar):
             buttonwcfg['variable'].set('0')
         elif isinstance(buttonwcfg['variable'], Tkinter.IntVar):
             buttonwcfg['variable'].set(0)
示例#14
0
 def buildText(self,parent,textwcfg, buttonwcfg):
     # Build the LoadOrSaveText widget or ScrolledText
     self.idf = InputFormDescr()
     textwcfg['name']='UserFunction'
     self.text = buttonwcfg['text']
     self.idf.append(textwcfg)
     #windows = InputForm(parent, self.idf)
     master = parent
     root = None
     windows = InputForm(master,root,  self.idf)
     self.vals = windows.go()
     # Uncheck the checkbutton if needed
     if isinstance(self.button,Tkinter.Checkbutton) and \
        buttonwcfg.has_key('variable'):
         if isinstance(buttonwcfg['variable'], Tkinter.StringVar):
             buttonwcfg['variable'].set('0')
         elif isinstance(buttonwcfg['variable'], Tkinter.IntVar):
             buttonwcfg['variable'].set(0)
示例#15
0
def test_inputform_okcfg():
    """
    Function to test the creation of an object InputForm with:
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    okCfg     = {'text':'Validate', 'command':validate_cb}
    cancelCfg = {'text':'Cancel', 'command':dismiss_cb}
    The other argument keep their default values.
    
    Focus on the ok and cancel buttons option. Adding a function to be called
    after by ok_cb or cancel_cb. In this case the additional functions
    dismiss_cb and validate_cb don't take any arguments
    """
    global dismiss
    global validate
    dismiss = False
    validate = False
    def dismiss_cb():
        global dismiss
        dismiss = True

    def validate_cb():
        print "In validate_cb"
        global validate
        validate = True
        print validate
        
    descr = createDescr()
    form = InputForm(master, root, descr, modal=1, blocking=0,
                     okCfg={'text':'Validate',
                            'command':validate_cb},
                     cancelCfg={'text':'Dismiss',
                                'command':dismiss_cb})
    setWidget = {'checkbutton':1, 'radioselect':'rb9', 'radioselect2':'rb4',
                 'listchooser':'Pistachio'}
    value = form.testForm(setWidget=setWidget)
    print 'validate', validate
    print 'dismiss', dismiss
    assert validate
    assert not dismiss
    form.destroy() 
示例#16
0
def test_scrolledText():
    descr = InputFormDescr(title = "Testing ScrolledText")
    descr.append({'widgetType':Pmw.ScrolledText,
                  'name':'sText',
                  'defaultValue':"""DEFAULT TEXT""",
                  'wcfg':{'labelpos':'n',
                          'label_text':'ScrolledText with headers',
                          'usehullsize': 1,
                          'hull_width': 400,
                          'hull_height': 300,
                          'text_wrap':'none',
                          'text_padx': 4,
                          'text_pady': 4,
                          },
                  'gridcfg':{'sticky':'wens'}})
    
    form = InputForm(master, root, descr, modal=0, blocking=0)
    values = form.testForm()
    if not values['sText'] == 'DEFAULT TEXT\n':
        raise RuntimeError
    form.destroy() 
示例#17
0
def test_inputform_initialize():
    """
    Function to test the creation of an object InputForm with:
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    and the default value for the other argument of the constructor
    initFunc  = initialize()
    Focus on the initFunc
    """
    def initialize(form):
        w = form.descr.entryByName['listchooser']['widget']
        w.add(('Coconut', None))

    descr = createDescr()
    form = InputForm(master, root, descr, 
                     initFunc=initialize)
    setWidget = {'checkbutton':1, 'radioselect':'rb9', 'radioselect2':'rb4',
                 'listchooser':'Pistachio'}
    value = form.testForm(setWidget=setWidget)
    ent = form.descr.entryByName['listchooser']['widget'].entries
    assert 'Coconut' in map(lambda x: x[0], ent)
示例#18
0
def test_inputform_1():
    """
    Function to test the instanciation of an InputForm object with the
    following arguments:
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    and the default value for the other argument of the constructor without
    specifying them
    """
    descr = createDescr()
    form = InputForm(master, root, descr)
    setWidget = {'checkbutton':1, 'radioselect':'rb9', 'radioselect2':'rb4',
                 'listchooser':'Pistachio'}

    value = form.testForm(setWidget=setWidget)

    assert value['checkbutton']==1, 'Expected 1, got %s'%(value['checkbutton'])
    assert value['radioselect']=='rb9'
    assert value['radioselect2']=='rb4'
    assert value['listchooser']==['Pistachio',]
    form.destroy()
示例#19
0
def test_inputform_3():
    """
    Function to test the instanciation of an InputForm object with the
    following argument, same options than before but this time the default
    arguments are specified. Change the text of the OK button to VALIDATE and
    the cancel button to DISMISS
    
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    modal    = 1
    blocking = 0,
    defaultDirection = 'row',
    closeWithWindow = 1,
    onDestroy = None,
    sFrameCfg = {}
    okCfg     = {'text':'VALIDATE'}
    cancelCfg = {'text':'DISMISS'}
    initFunc  = None

    Focus on the ok and cancel button options
    """
    descr = createDescr()
    # I don't know how to make sure that the ok button is now labeled VALIDATE
    # and the cancel button 'DISMISS'.
    form = InputForm(master, root, descr, modal=1, blocking=0,
                     defaultDirection='row', closeWithWindow=1,
                     onDestroy=None, okCfg={'text':'VALIDATE'},
                     cancelCfg={'text':'DISMISS'},
                     initFunc=None)
    setWidget = {'checkbutton':1, 'radioselect':'rb9', 'radioselect2':'rb4',
                 'listchooser':'Pistachio'}

    value = form.testForm(setWidget=setWidget)
    #value = form.testForm()
    form.destroy() 
示例#20
0
def test_inputform_2():
    """
    
    Function to test the instanciation of an InputForm object with the
    following arguments:
    master = Tkinter.Tk()
    root   = None
    descr  = InputFormDescr containing a checkbutton and a radioselect
             widget... very simple.
    and the default value for the other argument of the constructor
    modal    = 1
    blocking = 0,
    defaultDirection = 'row',
    closeWithWindow = 1,
    onDestroy = None
    okCfg     = {'text':'OK'}
    cancelCfg = {'text':'Cancel'}
    initFunc  = None

    Focus on the scrolled frame options.
    """
    import Pmw
    descr = createDescr()
    form = InputForm(master, root, descr, modal=1, blocking=0,
                     defaultDirection='row', closeWithWindow=1,
                     onDestroy=None, okCfg={'text':'Validate'},
                     cancelCfg={'text':'Dismiss'},
                     scrolledFrame = 1,
                     width=400, height=500,
                     initFunc=None)
    
    assert isinstance(form.sf, Pmw.ScrolledFrame)
    setWidget = {'checkbutton':1, 'radioselect':'rb9', 'radioselect2':'rb4',
                 'listchooser':'Pistachio'}

    value = form.testForm(setWidget=setWidget)
    form.destroy() 
    def showForm(self,master,geomDic=None,func=None):
        """create formdescr for setGeoms
        geomDic = a dict of Geom 
        """
        # assign a func so we can log it in Pmv
        # func is a Pmv command
        if func:
            self.assign_func = func
            
        if geomDic:
            self.assignGeom[0]=geomDic
            
        if hasattr(self,'form'):
            if self.guiOn:
                return
            else:
                self.update_lc2()
                self.form.deiconify()
                val = self.form.go()
               
                if val:
                    geomDic =self.assignGeom[0] 
                    self.assign_func(geomDic)
                    self.form.withdraw()
        else:
            if not master:
                master = Tkinter.Toplevel()
                master.title('GeomChooser')
            else:
                master = master

            ifd = self.buildForm()
            self.form = InputForm(master,None,descr=ifd,
                                  scrolledFrame=0,
                                  cancelCfg={'command':self.cancel_cb})
                
            self.lc = self.form.descr.entryByName['availableGeom']['widget']
            self.lc2 = self.form.descr.entryByName['toload']['widget']
            self.addObject(self.viewer.rootObject,None)
            self.update_lc2()
            val = self.form.go()
            if val:
                geomDic =self.assignGeom[0] 
                self.assign_func(geomDic)
                self.form.withdraw()
    def displayPanel(self, create):
        self.flag = 1
        if create == 0:
            self.optionsForm.deiconify()
        else:
            self.optionsForm = InputForm(self.master,
                                         self.root,
                                         descr=self.idf,
                                         modal=0,
                                         blocking=0)

            self.cont_entry = self.idf.entryByName['togCont']['widget']
            self.mode_entry = self.idf.entryByName['togAxes']['widget']
            self.prec_entry = self.idf.entryByName['selPrec']['widget']

            menus = (self.cont_entry, self.mode_entry, self.prec_entry)
            Pmw.alignlabels(menus)

            w = self.idf.entryByName['togCont']['widget']
            if self.master.continuous == None or self.master.continuous == 0:
                w.setvalue('on')  #i=1
            else:
                w.setvalue('off')  #i=0

            axe = self.master.mode
            if axe == 'XY': axe = 0
            elif axe == 'X': axe = 1
            elif axe == 'Y': axe = 2
            elif axe == 'Z': axe = 3
            self.idf.entryByName['togAxes']['widget'].setitems(items=('XY',
                                                                      'X', 'Y',
                                                                      'Z'),
                                                               index=axe)

            prc = int(self.master.precision) - 1
            if prc > 9: prc = 9
            self.idf.entryByName['selPrec']['widget'].setitems(
                items=('1', '2', '3', '4', '5', '6', '7', '8', '9', '10'),
                index=prc)

            self.updateDisplay()
            self.lockUnlockDisplay()
示例#23
0
class geomsChooser:
    def __init__(self, viewer):

        #ViewerGUI(viewer,8,2)
        # the viewe where the geoms are display (for us: pmv or DejaVu)
        if viewer is None:
            return
        self.viewer = viewer
        geomDic = {}
        dpyList = None
        self.assignGeom = [geomDic, dpyList]

    def toggleExpansion(self, event):
        # get a 0-based index into list of names
        o = self.lc.lb.nearest(event.y)
        fullName = self.getFullName(o)
        #obj = self.objectByName(self.olist.get(o))
        obj = self.viewer.FindObjectByName(fullName)
        if obj:
            childGeoms = obj.AllObjects()
            if len(childGeoms) == 1:  # this geoemtry has no children
                return
            else:  # this geometry has children
                if obj.isExpandedInObjectList: self.collapse(obj)
                else: self.expand(obj)

    def expand(self, object):
        # object is a geometry
        if object.isExpandedInObjectList: return
        object.isExpandedInObjectList = 1
        geoms = object.children
        ind = self.objectIndex(object) + 1
        c = self.countParents(object) + 1
        prefix = '~' * c
        for i in range(len(geoms)):
            g = geoms[i]
            if g == object: continue
            if not g.listed: continue
            if len(g.vertexSet) == 0 and len(g.children) == 0: continue
            self.lc.insert(ind, prefix + g.name)
            ind = ind + 1

    def collapse(self, object):
        # object is a geometry, we recursively collapse the sub-tree
        object.isExpandedInObjectList = 0

        # delete the names from the bject list widget
        nbChildren = self.countDecendentsInWidget(object)
        ind = self.objectIndex(object) + 1
        for i in range(ind, ind + nbChildren):
            self.lc.lb.delete(ind)
        # toggle isExpandedInObjectList for all descendents
        for child in object.AllObjects():
            if child.listed:
                child.isExpandedInObjectList = 0

    def countDecendentsInWidget(self, object):
        # object is a geometry, we count and return the number of
        # decendents shown in widget
        ind = self.objectIndex(object)
        allNames = self.lc.lb.get(0, 'end')
        nbTild = string.count(allNames[ind], '~') + 1
        # count children in widget
        nbChildren = 0
        for i in range(ind + 1, len(allNames)):
            nbt = string.count(allNames[i], '~')
            if nbt >= nbTild:
                nbChildren = nbChildren + 1
            else:
                break
        return nbChildren

    def getFullName(self, ind):
        # strip the leading ~
        allNames = self.lc.lb.get(0, 'end')
        nbTild = string.count(allNames[ind], '~')
        fullName = allNames[ind][nbTild:]
        for i in range(ind - 1, -1, -1):
            nbt, name = self.lstripChar(allNames[i], '~')
            if nbt >= nbTild: continue
            nbTild = nbt
            fullName = name + '|' + fullName
        return fullName

    def objectIndex(self, object):
        # object is a geometry and we find this object's index in the list of
        # names displayed in te widget. If the ibecjt is not shown we
        # return -1
        l = self.lc.lb.get(0, 'end')
        for i in range(len(l)):
            indent, n = self.lstripChar(l[i], '~')
            if n == object.name: break
        if i == len(l): return -1
        else: return i

    def lstripChar(self, name, char):
        n = string.count(name, '~')
        return n, name[n:]

    def countParents(self, object):
        c = 0
        while object.parent:
            c = c + 1
            object = object.parent
        return c

    def addObject(self, obj, parent):
        if not obj.listed: return
        if not parent:
            self.lc.insert(0, obj.name)
            self.lc.select(obj.name)
        else:
            if not parent.isExpandedInObjectList: return

            i = self.objectIndex(parent)
            if i == -1: return
            c = self.countParents(obj)
            prefix = '~' * c
            name = prefix + obj.name
            # now we need to skip all children already there
            l = self.lc.lb.get(0, 'end')
            while 1:
                i = i + 1
                if i == len(l): break
                if self.lc.get(i)[:c] != prefix: break

            self.lc.insert(i, name)

    def getFullNameList(self, name, list, dic):
        """ get the list of fullName from geomDic """

        for p in dic.keys():
            name1 = name + '|' + p
            if dic[p] != {}:
                list = self.getFullNameList(name1, list, dic[p])
            else:
                list.append(name1)

        return list

    def getDpyList(self, objects):
        """function to obtain a display list for any object in DejaVu"""
        from opengltk.OpenGL import GL
        # Draw build a display function that contains global coloring,
        # transformation nd all global GL properties of this objects.
        # we cannot use the object's display list that does not contains this
        # info
        #if len(objects) == 1 and objects[0].dpyList:
        #    return objects[0].dpyList
        # transparent object need to be drawn last

        # reorder object so transparent object drawn last
        transparent = []
        opaque = []
        for obj in objects:
            if obj.transparent:  #obj.isTransparent():
                transparent.append(obj)
            else:
                opaque.append(obj)
        objlist = opaque + transparent

        lNewList = GL.glGenLists(1)
        #print "lNewList geomsChooser.getDpyList", lNewList, self.name
        dpyList = (lNewList,
                   self.viewer.currentCamera.tk.call(
                       self.viewer.currentCamera._w, 'contexttag'))

        camera = self.mv.GUI.VIEWER.currentCamera
        camera.Activate()

        GL.glNewList(dpyList, GL.GL_COMPILE)
        #print "geomChooser 208", GL.glGetIntegerv(GL.GL_LIST_INDEX)
        for obj in objlist:
            if obj.immediateRendering:  # or obj.hasChildWithImmediateRendering:
                camera.drawMode = 5
                camera.Draw(obj)
            else:
                camera.drawMode = 2
                camera.drawTransparentObjects = 0
                camera.hasTransparentObjects = 0
                # draw opaque object
                for m in obj.instanceMatricesFortran:
                    GL.glPushMatrix()
                    GL.glMultMatrixf(m)
                    if len(obj.children):
                        map(camera.Draw, obj.children)
                    else:
                        camera.Draw(obj)
                    GL.glPopMatrix()

                # draw transparent children of object
                if camera.hasTransparentObjects:
                    camera.drawTransparentObjects = 1
                    for m in obj.instanceMatricesFortran:
                        GL.glPushMatrix()
                        GL.glMultMatrixf(m)
                        map(camera.Draw, obj.children)
                        GL.glPopMatrix()
                # draw transparent object that do not have children
                if obj.isTransparent() and not len(obj.children):
                    camera.drawTransparentObjects = 1
                    for m in obj.instanceMatricesFortran:
                        GL.glPushMatrix()
                        GL.glMultMatrixf(m)
                        camera.Draw(obj)
                        GL.glPopMatrix()

        GL.glEndList()
        return dpyList

    def buildForm(self):
        ifd = InputFormDescr(title=self.ftitle)
        ifd.append({
            'widgetType': ListChooser,
            'name': 'availableGeom',
            'tooltip': 'geom available in viewer',
            'wcfg': {
                'mode': 'extended',
                'lbwcfg': {
                    'exportselection': 1
                },
                'command': [(self.toggleExpansion, '<Double-Button-1>')],
                'commandEvent': None,
                'title': 'availableGeom'
            },
            'gridcfg': {
                'row': 0,
                'column': 0,
                'sticky': 'wens',
                'rowspan': 3
            }
        })

        ifd.append({
            'name': 'add',
            'widgetType': Tkinter.Button,
            'tooltip': """ Add the selected geom to selected frame""",
            'wcfg': {
                'text': '>>',
                'command': self.add_cb
            },
            'gridcfg': {
                'row': 1,
                'column': 1,
                'rowspan': 1
            }
        })

        ifd.append({
            'name': 'remove',
            'widgetType': Tkinter.Button,
            'tooltip': """ remove the selected geom to selected """,
            'wcfg': {
                'text': '<<',
                'command': self.remove_cb
            },
            'gridcfg': {
                'row': 2,
                'column': 1,
                'rowspan': 1
            }
        })

        ifd.append({
            'name': 'toload',
            'widgetType': ListChooser,
            'tooltip': """list of geom  the user chose to
                    apply to the pattern""",
            'wcfg': {
                'mode': 'extended',
                'lbwcfg': {
                    'exportselection': 0
                },
                'title': self.lc2title
            },
            'gridcfg': {
                'sticky': 'we',
                'row': 0,
                'column': 2,
                'rowspan': 3
            }
        })
        ifd.append({
            'name': 'clear',
            'widgetType': Tkinter.Button,
            'tooltip': """ Clear entry """,
            'wcfg': {
                'text': 'Clear',
                'width': 10,
                'command': self.clear_cb
            },
            'gridcfg': {
                'sticky': 'we',
                'row': 0,
                'column': 3
            }
        })
        ifd.append({
            'name': 'remove',
            'widgetType': Tkinter.Button,
            'tooltip': """ remove the selected geom to selected """,
            'wcfg': {
                'text': '<<',
                'command': self.remove_cb
            },
            'gridcfg': {
                'row': 2,
                'column': 1,
                'rowspan': 1
            }
        })
        return ifd

    def showForm(self, master, geomDic=None, func=None):
        """create formdescr for setGeoms
        geomDic = a dict of Geom 
        """
        # assign a func so we can log it in Pmv
        # func is a Pmv command
        if func:
            self.assign_func = func

        if geomDic:
            self.assignGeom[0] = geomDic

        if hasattr(self, 'form'):
            if self.guiOn:
                return
            else:
                self.update_lc2()
                self.form.deiconify()
                val = self.form.go()

                if val:
                    geomDic = self.assignGeom[0]
                    self.assign_func(geomDic)
                    self.form.withdraw()
        else:
            if not master:
                master = Tkinter.Toplevel()
                master.title('GeomChooser')
            else:
                master = master

            ifd = self.buildForm()
            self.form = InputForm(master,
                                  None,
                                  descr=ifd,
                                  scrolledFrame=0,
                                  cancelCfg={'command': self.cancel_cb})

            self.lc = self.form.descr.entryByName['availableGeom']['widget']
            self.lc2 = self.form.descr.entryByName['toload']['widget']
            self.addObject(self.viewer.rootObject, None)
            self.update_lc2()
            val = self.form.go()
            if val:
                geomDic = self.assignGeom[0]
                self.assign_func(geomDic)
                self.form.withdraw()

    def cancel_cb(self, event=None, func=None):
        """ close setup animation form without setting anything"""
        if hasattr(self, 'geomDicCopy'):
            self.patDic = self.patDicCopy.copy()

    def add_cb(self):
        lgeom = []
        geomDic = self.assignGeom[0]
        # get geom name to load
        o = map(int, self.lc.lb.curselection())
        for Ind in o:
            fullName = self.getFullName(Ind)
            obj = self.viewer.FindObjectByName(fullName)
            # strip the root
            l = string.split(fullName, '|')[1:]
            for i in range(len(l)):
                if i == 0:
                    if not geomDic.has_key(l[i]):
                        dic = geomDic[l[i]] = {}
                    else:
                        dic = geomDic[l[i]]
                else:
                    if not dic.has_key(l[i]):
                        dic[l[i]] = {}

                    dic = dic[l[i]]

        self.update_lc2()

    def insertValue(self, ind, prefix, dic):
        """ insert Value of a dictionnary in the listchooser2"""
        for key in dic.keys():
            if dic[key] == {}:
                ind = ind + 1
                self.lc2.insert(ind, prefix + key)
            else:
                ind = ind + 1
                self.lc2.insert(ind, prefix + key)
                p = prefix + '~'
                ind = self.insertValue(ind, p, dic[key])
        return ind

    def update_lc2(self):
        """ update listchooser entries display"""

        # save current entry selected
        sel = self.lc2.get()
        prefix = '~'
        self.lc2.clear()
        ind = 0
        geomDic = self.assignGeom[0]
        ind = self.insertValue(ind, prefix, geomDic)

        # select the entry save as sel
        # keep the entry selected after the update
        for i in sel:
            self.lc2.select((i, ))

    def findParentMol(self, index):
        """ find the parent value name from a geom ~~
        go up to find first value with onley ~ """
        parent = None
        for i in range(index + 1):
            parent = self.lc2.entries[index - i][0]
            if parent[0] == '~' and parent[1] != '~':
                parent = parent[1:]
                return parent
        return None

    def remove_cb(self):
        """ remove entry in litschooser (geomtoload)"""
        geomDic = self.assignGeom[0]
        selindex = self.lc2.getInd()
        for index in selindex:
            value = self.lc2.entries[index][0]

            if value[1] == '~':
                mol = self.findParentMol(index)
                rindex = geomDic[mol].index(value[2:])
                del geomDic[mol][rindex]
            else:
                mol = value[1:]
                del geomDic[mol]
        self.update_lc2()

    def clear_cb(self):
        """ clear all entry """
        self.lc2.clear()
        if self.assignGeom:
            self.assignGeom[0] = {}  # geomDic
            self.assignGeom[1] = None  # dpyList
示例#24
0
    def buildForm(self, titleStr):
        #??FIX THIS:
        self.stop = 1
        if hasattr(self, 'form'):
            self.form.deiconify()
            return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)
        if self.hasCounter:
            ifd.append({'widgetType':Pmw.Counter,
                    'name':'statesCounter',
                    'required':1,
                    'tooltip':'used to show frames via random access',
                    'wcfg':{#'labelpos': 'n,
                         #'label_text':'conformation:  ',
                        'autorepeat':0,
                        'entryfield_value':self.startFrame,
                        #'entryfield_value':self.idList[0],
                        'datatype': self.custom_counter,
                        'entry_width':9,
                        'entryfield_validate': self.custom_validate },
                     'gridcfg':{'sticky':'nesw', 'columnspan':2}})
        ifd.append({'name': 'playB',
            'widgetType': Tkinter.Button,
            'text':'Play',
            'tooltip':'play sequence according to current play mode',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','columnspan':1},
            'command':self.Play_cb})
        ifd.append({'name': 'playRevB',
            'widgetType': Tkinter.Button,
            'text':'Play Reverse',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'command':self.PlayRev_cb})
        ifd.append({'name': 'playTB',
            'widgetType': Tkinter.Button,
            'text':'Play+Return',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','columnspan':1},
            'command':self.PlayReturn_cb})
        ifd.append({'name': 'loopB',
            'widgetType': Tkinter.Button,
            'text':'Loop',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'command':self.Loop_cb})
        ifd.append({'name': 'stopB',
            'widgetType': Tkinter.Button,
            'text':'Stop',
            'tooltip':'stop play',
            'wcfg':{'bd':4,
                    },
            'gridcfg':{'sticky':'nesw'},
            'command':self.Stop_cb})
        #add fastforward, fastrewind, thumbwheel for speed
        ifd.append({'name': 'pauseB',
            'widgetType': Tkinter.Button,
            'text':'Pause',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'command':self.Pause_cb})

        ifd.append({'name': 'closeB',
            'widgetType': Tkinter.Button,
            'text':'Close',
            'wcfg':{'bd':4},
            #'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'gridcfg':{'sticky':'nesw', 'columnspan':2},
            'command':self.Close_cb})
        form = InputForm(self.master, self.root,
                         descr = ifd, modal = 0,
                         blocking = 0,closeWithWindow=1)
        form.ifd = ifd
        if self.hasCounter:
            ctr = ifd.entryByName['statesCounter']['widget']
            entF = ctr.component('entryfield')
            form.ent2 = entF._entryFieldEntry
            da = ctr.component('downarrow')
            ua = ctr.component('uparrow')
            for item in [da,ua]:
                item.bind('<ButtonPress-1>', self.SetState_cb, '+')
            form.ent2.bind('<Return>', self.SetState_cb, '+')
            form.counter = form.ifd.entryByName['statesCounter']['widget']
        form.stopB = form.ifd.entryByName['stopB']['widget']
        form.playB = form.ifd.entryByName['playB']['widget']
        form.playRevB = form.ifd.entryByName['playRevB']['widget']
        #print 'returning form1'
        self.form = form
        return form
示例#25
0
    def showForm(self):
        """create formdescr for setAnim
        form to set the animation:
        each frame is a list of geom to display
        """

        entryFrame = []
        for i in range(len(self.framelist)):
            val = 'frame_' + str(i)
            entryFrame.append((val, ))

        if not hasattr(self, 'form_Setanim'):
            ifd = InputFormDescr(title="SetAnimation")
            ifd.append({
                'widgetType': ListChooser,
                'name': 'availableGeom',
                'tooltip': 'geom available in viewer',
                'wcfg': {
                    'mode': 'extended',
                    'lbwcfg': {
                        'exportselection': 1
                    },
                    'command': [(self.toggleExpansion, '<Double-Button-1>')],
                    'commandEvent': None,
                    'title': 'availableGeom'
                },
                'gridcfg': {
                    'row': 0,
                    'column': 0,
                    'sticky': 'wens',
                    'rowspan': 3
                }
            })
            ifd.append({
                'name': 'newframe',
                'widgetType': Tkinter.Button,
                'tooltip': """ Add an empty frame to the animation""",
                'wcfg': {
                    'text': 'NewFrame',
                    'command': self.addframe_cb
                },
                'gridcfg': {
                    'row': 0,
                    'column': 1,
                    'rowspan': 1
                }
            })

            ifd.append({
                'name': 'add',
                'widgetType': Tkinter.Button,
                'tooltip': """ Add the selected geom to selected frame""",
                'wcfg': {
                    'text': 'AddGeom',
                    'command': self.add_cb
                },
                'gridcfg': {
                    'row': 1,
                    'column': 1,
                    'rowspan': 1
                }
            })

            ifd.append({
                'name': 'geomtoload',
                'widgetType': ListChooser,
                'tooltip': """list of frame  the user chose to
                        apply to the pattern""",
                'wcfg': {
                    'entries': entryFrame,
                    'mode': 'extended',
                    'lbwcfg': {
                        'exportselection': 0
                    },
                    'title': 'Frame(geom) to be display'
                },
                'gridcfg': {
                    'sticky': 'we',
                    'row': 0,
                    'column': 2,
                    'rowspan': 3
                }
            })
            ifd.append({
                'name': 'remove',
                'widgetType': Tkinter.Button,
                'tooltip': """ Remove the selected entry from the
                        commands to be applied to the object when loaded in the application""",
                'wcfg': {
                    'text': 'REMOVE',
                    'width': 10,
                    'command': self.remove_cb
                },
                'gridcfg': {
                    'sticky': 'we',
                    'row': 0,
                    'column': 3
                }
            })

            ifd.append({
                'name': 'oneup',
                'widgetType': Tkinter.Button,
                'tooltip': """Move the selected entry up one entry""",
                'wcfg': {
                    'text': 'Move up',
                    'width': 10,
                    'command': self.moveup_cb
                },
                'gridcfg': {
                    'sticky': 'we',
                    'row': 1,
                    'column': 3
                }
            })

            ifd.append({
                'name': 'onedown',
                'widgetType': Tkinter.Button,
                'tooltip': """Move the selected entry down one entry""",
                'wcfg': {
                    'text': 'Move down',
                    'width': 10,
                    'command': self.movedown_cb
                },
                'gridcfg': {
                    'sticky': 'we',
                    'row': 2,
                    'column': 3
                }
            })

            self.form_Setanim = InputForm(self.master,
                                          None,
                                          descr=ifd,
                                          scrolledFrame=0)

            self.lc = self.form_Setanim.descr.entryByName['availableGeom'][
                'widget']
            self.lc2 = self.form_Setanim.descr.entryByName['geomtoload'][
                'widget']
            self.addObject(self.viewer.rootObject, None)
            val = self.form_Setanim.go()
            if val:
                self.assign()
                self.form_Setanim.withdraw()
        else:
            self.form_Setanim.deiconify()
            val = self.form_Setanim.go()
            if val:
                self.assign()
                self.form_Setanim.withdraw()
示例#26
0
    def buildForm(self, titleStr):
        # ??FIX THIS:
        self.stop = 1
        if hasattr(self, "form"):
            self.form.deiconify()
            return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)
        if self.hasCounter:
            ifd.append(
                {
                    "widgetType": Pmw.Counter,
                    "name": "statesCounter",
                    "required": 1,
                    "tooltip": "used to show frames via random access",
                    "wcfg": {  #'labelpos': 'n,
                        #'label_text':'conformation:  ',
                        "autorepeat": 0,
                        "entryfield_value": self.startFrame,
                        #'entryfield_value':self.idList[0],
                        "datatype": self.custom_counter,
                        "entry_width": 9,
                        "entryfield_validate": self.custom_validate,
                    },
                    "gridcfg": {"sticky": "nesw", "columnspan": 2},
                }
            )
        ifd.append(
            {
                "name": "playB",
                "widgetType": Tkinter.Button,
                "text": "Play",
                "tooltip": "play sequence according to current play mode",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "columnspan": 1},
                "command": self.Play_cb,
            }
        )
        ifd.append(
            {
                "name": "playRevB",
                "widgetType": Tkinter.Button,
                "text": "Play Reverse",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                "command": self.PlayRev_cb,
            }
        )
        ifd.append(
            {
                "name": "playTB",
                "widgetType": Tkinter.Button,
                "text": "Play+Return",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "columnspan": 1},
                "command": self.PlayReturn_cb,
            }
        )
        ifd.append(
            {
                "name": "loopB",
                "widgetType": Tkinter.Button,
                "text": "Loop",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                "command": self.Loop_cb,
            }
        )
        ifd.append(
            {
                "name": "stopB",
                "widgetType": Tkinter.Button,
                "text": "Stop",
                "tooltip": "stop play",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw"},
                "command": self.Stop_cb,
            }
        )
        # add fastforward, fastrewind, thumbwheel for speed
        ifd.append(
            {
                "name": "pauseB",
                "widgetType": Tkinter.Button,
                "text": "Pause",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                "command": self.Pause_cb,
            }
        )

        ifd.append(
            {
                "name": "closeB",
                "widgetType": Tkinter.Button,
                "text": "Close",
                "wcfg": {"bd": 4},
                #'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
                "gridcfg": {"sticky": "nesw", "columnspan": 2},
                "command": self.Close_cb,
            }
        )
        form = InputForm(self.master, self.root, descr=ifd, modal=0, blocking=0, closeWithWindow=1)
        form.ifd = ifd
        if self.hasCounter:
            ctr = ifd.entryByName["statesCounter"]["widget"]
            entF = ctr.component("entryfield")
            form.ent2 = entF._entryFieldEntry
            da = ctr.component("downarrow")
            ua = ctr.component("uparrow")
            for item in [da, ua]:
                item.bind("<ButtonPress-1>", self.SetState_cb, "+")
            form.ent2.bind("<Return>", self.SetState_cb, "+")
            form.counter = form.ifd.entryByName["statesCounter"]["widget"]
        form.stopB = form.ifd.entryByName["stopB"]["widget"]
        form.playB = form.ifd.entryByName["playB"]["widget"]
        form.playRevB = form.ifd.entryByName["playRevB"]["widget"]
        # print 'returning form1'
        self.form = form
        return form
示例#27
0
class Player(Tkinter.Frame):
    """Widget to play sequence of frames.
    The GUI allows to specify direction and speed of playback.

    the nextFrame(number) methoid should be overridden and define how
    this player plays the animation
    
    the root constructor argument can be a Tkinter container in which to
    embde the control panel.
    
    required attributes:
        currentFrameIndex = 0
        startFrame = 0
        endFrame = 0
        maxFrame = 0
        stepSize = 1
        target = endFrame           #determines direction of play
        increment = 1               #implements decrementing vs incrementing
                                    #  in getNextFrameIndex
        playMode = 0                #playMode options:
                                    #   0   play once and stop
                                    #   1   play continuously in 1 direction
                                    #   2   play once in 2 directions
                                    #   3   play continuously in 2 directions
        framerate =15.              # number of frame per second to be display
        hasSlider = False           #adds Tkinter Scale Widget if True

    customization attributes:
        buttonMask is a dictionary that provides a button name as a key and
        a boolean as a value. For each button in the GUI if the name appears
        in self.buttonMask and the value is False the button willnot be
        addded. This only works when form2 is true. slider and counter
        are handle by the hasSlider and coutner keyword arguments

    required methods:
    #play methods:
        play                           #play according to play mode
        getNextFrameIndex              #returns index of next frame to
                                        play according to current index
                                        and playMode
        nextFrame                      #actually display the nextFrame
                                        ??possibly update widgets???

    #methods to regulate play
        Play_cb                        #play according to playMode
        PlayRev_cb                     #play backwards  
        FastForward_cb()               #play foward at max speed
        FastReverse_cb()               #play reverse at max speed
        Stop_cb                        #stop current play
        ?Pause_cb                      #stop at current frame??
        ?Loop_cb                       #???????


    #methods to set Frame to a specific frame
        SetState_cb                    #counter callback for random access
        GoToStart_cb                   #set to current startFrame
        GoToEnd_cb                     #set to current endFrame
        ?setCurrentFrameIndex          #set currentframe index???


    #methods for player gui
        showGUI                        #show the gui
        buildForm2                     #opens image-based gui
        buildForm                      #opens text-based gui
        Close_cb                       #withdraws gui

    #methods for pmw counter
        custom_validate                #used by pmw to check entry
        custom_counter                 #used by pmw for counter


    #methods for changing playMode
        SetMode_cb                     #opens playModeForm
        setPlayMode_cb                 #sets playMode, sets delay,
                                          startFrame, endFrame 
                                          AND closes playModeForm
        cancelPlayMode_cb              #closes playModeForm w/out changes

        #methods for end points:
            setStartFrame()            #set startFrame
            setEndFrame()              #set endFrame
            setStepSize()              #sets increment, def=1
        additional methods:
    """

    def __init__(
        self,
        master=None,
        root=None,
        height=80,
        width=200,
        currentFrameIndex=0,
        startFrame=0,
        endFrame=0,
        maxFrame=0,
        stepSize=1,
        playMode=0,
        ##afterDelay=50,
        titleStr="Player",
        gotoStartfile="go_to_start.gif",
        gotoEndfile="go_to_end.gif",
        ff_revfile="ff_rev.gif",
        ff_fwdfile="ff_fwd.gif",
        stopfile="stop.gif",
        playfile="play_fwd.gif",
        playRevfile="play_rev.gif",
        chmodfile="chmod.gif",
        closefile="close.gif",
        iconpath=None,
        counter=1,
        form2=1,
        gui=1,
        framerate=15.0,
        hasSlider=False,
        buttonMask=None,
    ):

        # frame rate in fps
        self.framerate = framerate
        self.gui = gui
        self.currentFrameIndex = currentFrameIndex
        self.startFrame = startFrame
        self.endFrame = endFrame
        self.targetFrame = self.endFrame
        self.maxFrame = maxFrame
        if not maxFrame:
            self.maxFrame = endFrame
        self.stepSize = stepSize
        # used for play once in 2 directions
        self.oneDirection = 0
        self.increment = 1
        self.target = self.endFrame
        self.hasSlider = hasSlider
        # used to coordinate switching icons
        # playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions and stop
        #   3   play continuously in 2 directions
        self.playMode = playMode
        ### replace by framerate
        # amt of time to sleep
        # self.delay = delay

        # amt of time for after
        # self.afterDelay = afterDelay

        self.afterID = None
        self.stop = 1
        self.hasCounter = 0
        # gui variable
        # self.master = master
        # self.root = root
        self.form2 = form2
        self.hasCounter = counter

        if buttonMask is None:
            self.buttonMask = {}
            # self.buttonMask provides a button name as a key and a boolean
            # as a value. For each button in the GUI if the name appears in
            # self.buttonMask and the value is False the button willnot be
            # addded
        else:
            self.buttonMask = buttonMask

        if gui:
            self.showGUI(master=master, root=root, titleStr=titleStr, height=height, width=width, iconpath=iconpath)

        # make sure we have a master as we will call master.update in play()
        if hasattr(master, "update"):
            self.masterForUpdate = self.master
        else:
            self.masterForUpdate = self.root

    def showGUI(
        self,
        master=None,
        root=None,
        width=200,
        height=80,
        titleStr="player",
        gotoStartfile="go_to_start.gif",
        gotoEndfile="go_to_end.gif",
        ff_revfile="ff_rev.gif",
        ff_fwdfile="ff_fwd.gif",
        stopfile="stop.gif",
        playfile="play_fwd.gif",
        playRevfile="play_rev.gif",
        chmodfile="chmod.gif",
        closefile="close.gif",
        iconpath=None,
    ):
        """ function to display the player gui."""

        if hasattr(self, "form"):
            if hasattr(self.form, "deiconify"):
                self.form.deiconify()
                return
        self.master = master
        self.root = root

        if not self.form2:
            self.form = self.buildForm(titleStr)  # pass some arguments here
            self.form2 = 0
        else:
            if iconpath is None:
                iconpath = ("mglutil.gui.BasicWidgets.Tk", "icons")
            ICONDIR = findFilePath(iconpath[1], iconpath[0])
            # if findFilePath failed, already returned
            gotoStartfile = os.path.join(ICONDIR, gotoStartfile)
            gotoEndfile = os.path.join(ICONDIR, gotoEndfile)
            ff_revfile = os.path.join(ICONDIR, ff_revfile)
            ff_fwdfile = os.path.join(ICONDIR, ff_fwdfile)
            stopfile = os.path.join(ICONDIR, stopfile)
            playfile = os.path.join(ICONDIR, playfile)
            playRevfile = os.path.join(ICONDIR, playRevfile)
            chmodfile = os.path.join(ICONDIR, chmodfile)
            closefile = os.path.join(ICONDIR, closefile)
            recordfile = os.path.join(ICONDIR, "record.gif")
            record1file = os.path.join(ICONDIR, "record1.gif")

            self.gotoStartIcon = Tkinter.PhotoImage(file=gotoStartfile, master=master)
            self.gotoEndIcon = Tkinter.PhotoImage(file=gotoEndfile, master=master)
            self.ff_revIcon = Tkinter.PhotoImage(file=ff_revfile, master=master)
            self.ff_fwdIcon = Tkinter.PhotoImage(file=ff_fwdfile, master=master)
            self.stopIcon = Tkinter.PhotoImage(file=stopfile, master=master)
            self.playIcon = Tkinter.PhotoImage(file=playfile, master=master)
            self.playRevIcon = Tkinter.PhotoImage(file=playRevfile, master=master)
            self.recIcon = Tkinter.PhotoImage(file=recordfile, master=master)
            self.rec1Icon = Tkinter.PhotoImage(file=record1file, master=master)
            self.chmodIcon = Tkinter.PhotoImage(file=chmodfile, master=master)
            self.closeIcon = Tkinter.PhotoImage(file=closefile, master=master)
            self.form = self.buildForm2(titleStr)  # pass some argument here

    # play methods:
    # play, waitTime, getNextFrameIndex, nextFrame
    def play(self, framerate, event=None):
        t1 = time.time()  # previous frame time
        timestamp = 1.0 / framerate  # rate to update frame
        self.stop = 0
        ind = self.currentFrameIndex

        # if player at the end we resume from begining
        if ind >= self.endFrame:
            self.GoToStart_cb()

        while not self.stop:  # this has to be more complex
            if self.stop:
                print "play stopped!"
                break

            # do something different here if ff_fwd or ff_rev
            if self.gui:
                # self.afterID = self.master.after(self.afterDelay, self.waitTime)
                self.masterForUpdate.update()

            t2 = time.time()  # current time
            t = t2 - t1  # time difference between current frame and previous

            if framerate > -1 and t < timestamp:
                pass
            else:
                id = self.getNextFrameIndex(self.currentFrameIndex)
                if id == None:
                    self.stop = 1
                    if self.gui:
                        self.Stop_cb()
                        break
                self.nextFrame(id)  # maybe set entry then call nextFrame??
                self.currentFrameIndex = id
                t1 = t2

    def getNextFrameIndex(self, index):
        newFrame = index + self.increment * self.stepSize
        # check if  newFrame in current range:
        #       if incrementing, has to be <=self.endFrame
        #       if decrementing, has to be >=self.startFrame
        #   NB: incPos indicates whether currently incrementing or decrementing
        # FORCE newFrame into range
        incPos = self.increment > 0
        if incPos and newFrame > self.endFrame:
            newFrame = self.endFrame
        elif not incPos and newFrame < self.startFrame:
            newFrame = self.startFrame
        # check whether reached current targetFrame
        #       if so, action depends on current playMode
        mode = self.playMode
        if index == self.targetFrame:
            # playModes 0 and 2 are play once and stop (in 1 or 2 directions)
            if not mode % 2:
                if mode == 0:
                    # None means stop
                    return None
                else:
                    # play once in 2 directions
                    #   check whether already reached halfway pt
                    if self.oneDirection:
                        return None
                    self.oneDirection = 1
                    # to reverse direction:
                    #   toggle increment
                    self.increment = -1 * self.increment
                    #   toggle targetFrame
                    if self.targetFrame == self.endFrame:
                        self.targetFrame = self.startFrame
                    else:
                        self.targetFrame = self.endFrame
                    return newFrame
            elif self.playMode == 1:
                # play continuously in 1 direction
                # toggle targetFrame to the opposite end
                if self.targetFrame == self.endFrame:
                    return self.startFrame
                else:
                    return self.endFrame
            elif self.playMode == 3:
                # loop continuously in 2 directions
                #   toggle increment
                self.increment = -1 * self.increment
                newFrame = self.targetFrame + self.stepSize * self.increment
                #   toggle targetFrame
                if self.targetFrame == self.endFrame:
                    self.targetFrame = self.startFrame
                else:
                    self.targetFrame = self.endFrame
                return newFrame
        return newFrame

    ##     def waitTime(self):
    ##         self.afterID = None
    ##         t1 = time.time()
    ##         delta = time.time() - t1
    ##         #curBut is either play or playRev button
    ##         hasCurBut = hasattr(self, 'curBut')
    ##         while delta < self.delay:
    ##             if hasCurBut:
    ##                 self.curBut.config(bg='red')
    ##             self.master.update()
    ##             time.sleep(self.delay/100)
    ##             delta = time.time() - t1
    ##         if hasCurBut:
    ##             self.curBut.config(bg='white')
    ##         if self.afterID is not None and hasCurBut:
    ##             self.curBut.after_cancel(self.afterID)
    ##             self.afterID = self.curBut.after(self.afterDelay, self.waitTime)

    def nextFrame(self, id):
        ##pass #must be overriden
        id = int(id)
        if id == self.currentFrameIndex:
            return
        if self.hasCounter and self.gui:
            self.form.ent2.delete(0, "end")
            self.form.ent2.insert(0, str(id))
            if self.hasSlider:
                self.form.ifd.entryByName["slider"]["widget"].set(id)
        print "playing ", id
        self.currentFrameIndex = int(id)

    # methods to call play
    # Play_cb, PlayRev_cb, FastForward_cb, FastReverse_cb
    # Stop_cb and possibly Pause_cb, Loop_cb
    def startRecording_cb(self, event=None):
        pass

    def stopRecording_cb(self, event=None):
        pass

    def Play_cb(self, framerate=None, event=None):
        # print 'Play_cb'
        self.form.ifd.entryByName["playB"]["widget"].grab_release()
        # this is a new call to Play_cb
        if framerate == None:
            framerate = self.framerate
        self.stop = 0
        self.oneDirection = 0
        self.targetFrame = self.endFrame
        self.increment = 1
        # print 'currentFrameIndex=', self.currentFrameIndex
        # possibly currently playing reverse
        if hasattr(self, "curBut") and self.curBut == self.form.playRevB:
            if self.form2:
                self.curBut.config(command=self.oldCmd, image=self.oldImage, bg="white")
            else:
                self.curBut.config(command=self.oldCmd, text=self.oldText)
        self.oldTT = self.form.playTT
        self.oldTTtext = "play forward according to current play mode"
        self.curBut = self.form.playB
        self.oldCmd = self.Play_cb
        self.oldImage = self.playIcon
        self.oldText = "Play"
        if self.form2:
            self.curBut.config(command=self.Stop_cb, image=self.stopIcon)
        else:
            self.curBut.config(command=self.Stop_cb, text="Stop")
        self.oldTT.bind(self.curBut, "stop play")
        # self.master.update()
        self.play(framerate)
        self.stopRecording_cb()

    def PlayRev_cb(self, framerate=None, event=None):
        # figure out current number and then play backwards
        # print 'currentFrameIndex=', self.currentFrameIndex
        self.form.ifd.entryByName["playRevB"]["widget"].grab_release()
        if framerate == None:
            framerate = self.framerate
        self.increment = -1
        self.targetFrame = self.startFrame
        self.oneDirection = 0
        self.stop = 0
        # possibly currently playing
        if hasattr(self, "curBut") and self.curBut == self.form.playB:
            if self.form2:
                self.curBut.config(command=self.oldCmd, image=self.oldImage, bg="white")
            else:
                self.curBut.config(command=self.oldCmd, text=self.oldText)
        self.oldTT = self.form.playRevTT
        self.oldTTtext = "play reverse according to current play mode"
        self.curBut = self.form.playRevB
        self.oldCmd = self.PlayRev_cb
        self.oldImage = self.playRevIcon
        self.oldText = "Play Reverse"
        if self.form2:
            self.curBut.config(command=self.Stop_cb, image=self.stopIcon)
        else:
            self.curBut.config(command=self.Stop_cb, text="Stop")
        self.oldTT.bind(self.curBut, "stop play")
        self.play(framerate)

    def FastReverse_cb(self, event=None):
        # print 'FastReverse'
        # framerate = self.framerate * 2
        self.oneDirection = 0
        self.PlayRev_cb(framerate=-1)  # framerate)

    def FastForward_cb(self, event=None):
        # print 'FastForward'
        self.oneDirection = 0
        # framerate = self.framerate * 2
        self.Play_cb(framerate=-1)

    def Stop_cb(self, event=None):
        self.stop = 1
        if hasattr(self, "curBut"):
            if self.form2:
                self.curBut.config(command=self.oldCmd, image=self.oldImage)
            else:
                self.curBut.config(command=self.oldCmd, text=self.oldText)
                # FIX THIS!!!!
                # DECIDE if stop means reset to start or not
                # self.nextFrame(self.startFrame)
            self.oldTT.bind(self.curBut, self.oldTTtext)

        self.stopRecording_cb()

        # FIX THIS: does this go here?  or in nextFrame
        # clean up form
        # if self.hasCounter:
        #    self.form.ent2.delete(0,'end')
        #    self.form.ent2.insert(0, str(self.currentFrameIndex))

    # these may be superfluous: called by original form
    def PlayReturn_cb(self, event=None):
        # print 'PlayReturn_cb'
        # this should be superfluous
        self.playMode = 3
        self.Play_cb()

    def Loop_cb(self, event=None):
        # print 'Loop_cb'
        # this should be superfluous
        self.playMode = 3
        self.Play_cb()

    def Pause_cb(self, event=None):
        self.stop = 1

    # methods to set Frame to a specific frame
    # SetState_cb, GoToStart_cb, GoToEnd_cb, setCurrentFrameIndex
    def SetState_cb(self, event=None):
        # do nothing if no counter
        if self.hasCounter:
            index = self.form.counter.get()
            self.nextFrame(index)

    def GoToStart_cb(self, event=None):
        # print "GoToStart_cb", self.startFrame, self.currentFrameIndex
        # self.currentFrameIndex = self.startFrame
        self.oneDirection = 0
        self.nextFrame(self.startFrame)

    def GoToEnd_cb(self, event=None):
        # print 'GoToEnd'
        self.oneDirection = 0
        # self.currentFrameIndex = self.endFrame
        self.nextFrame(self.endFrame)

    def setCurrentFrameIndex(self, index):
        # print 'setting currentFrameIndex to', index
        self.currentFrameIndex = index

    # methods for player gui
    def Close_cb(self, event=None):
        self.stop = 1
        if hasattr(self, "form"):
            self.form.withdraw()

    def SetAnim_cb(self):
        """ function to be overwritten.
        Use to call a functoin to set the animatiom frame."""

        return

    def buildForm2(self, titleStr):
        self.stop = 1
        if hasattr(self, "form"):
            if hasattr(self.form, "deiconify"):
                self.form.deiconify()
                return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)

        if self.buttonMask.get("gotoStartB", None) is not False:
            ifd.append(
                {
                    "name": "gotoStartB",
                    "widgetType": Tkinter.Button,
                    #'text':'gotoStart',
                    "tooltip": "sets frame to current startFrame",
                    "wcfg": {
                        "bd": 4,
                        "image": self.gotoStartIcon,
                        "width": self.gotoStartIcon.width(),
                        "height": self.gotoStartIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw"},
                    "command": self.GoToStart_cb,
                }
            )

        if self.buttonMask.get("fastReverseB", None) is not False:
            ifd.append(
                {
                    "name": "fastReverseB",
                    "widgetType": Tkinter.Button,
                    #'text':'fastReverse',
                    "tooltip": "play reverse as fast as possible",
                    "wcfg": {
                        "bd": 4,
                        "image": self.ff_revIcon,
                        "width": self.ff_revIcon.width(),
                        "height": self.ff_revIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                    "command": self.FastReverse_cb,
                }
            )

        if self.buttonMask.get("playRevB", None) is not False:
            ifd.append(
                {
                    "name": "playRevB",
                    "widgetType": Tkinter.Button,
                    #'text':'Play Reverse',
                    "tooltip": "play reverse according to current play mode",
                    "wcfg": {
                        "bd": 4,
                        "image": self.playRevIcon,
                        "width": self.playRevIcon.width(),
                        "height": self.playRevIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 2},
                    "command": self.PlayRev_cb,
                }
            )

            if self.hasCounter:
                ifd.append(
                    {
                        "widgetType": Pmw.Counter,
                        "name": "statesCounter",
                        "required": 1,
                        "tooltip": "used to show frames via random access",
                        "wcfg": {  #'labelpos': 'n,
                            #'label_text':'conformation:  ',
                            "autorepeat": 0,
                            "entryfield_value": self.startFrame,
                            #'entryfield_value':self.idList[0],
                            "datatype": self.custom_counter,
                            "entry_width": 3,
                            "entryfield_validate": self.custom_validate,
                        },
                        "gridcfg": {"sticky": "nesw", "row": -1, "column": 3, "columnspan": 2},
                    }
                )

        if self.buttonMask.get("playB", None) is not False:
            ifd.append(
                {
                    "name": "playB",
                    "widgetType": Tkinter.Button,
                    #'text':'Play',
                    "tooltip": "play forward according to current play mode",
                    "wcfg": {
                        "bd": 4,
                        "image": self.playIcon,
                        "width": self.playIcon.width(),
                        "height": self.playIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 5},
                    "command": self.Play_cb,
                }
            )

        if self.buttonMask.get("fastForwardB", None) is not False:
            ifd.append(
                {
                    "name": "fastForwardB",
                    "widgetType": Tkinter.Button,
                    #'text':'fastForward',
                    "tooltip": "play as fast as possible",
                    "wcfg": {
                        "bd": 4,
                        "image": self.ff_fwdIcon,
                        "width": self.ff_fwdIcon.width(),
                        "height": self.ff_fwdIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 6},
                    "command": self.FastForward_cb,
                }
            )

        if self.buttonMask.get("gotoEndB", None) is not False:
            ifd.append(
                {
                    "name": "gotoEndB",
                    "widgetType": Tkinter.Button,
                    #'text':'gotoEnd',
                    "tooltip": "sets frame to current endFrame",
                    "wcfg": {
                        "bd": 4,
                        "image": self.gotoEndIcon,
                        "width": self.gotoEndIcon.width(),
                        "height": self.gotoEndIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 7},
                    "command": self.GoToEnd_cb,
                }
            )

        if self.buttonMask.get("modeB", None) is not False:
            ifd.append(
                {
                    "name": "modeB",
                    "widgetType": Tkinter.Button,
                    "text": "Change Mode",
                    "tooltip": "opens panel to change play options",
                    "wcfg": {
                        "bd": 4,
                        "image": self.chmodIcon,
                        "width": self.chmodIcon.width(),
                        "height": self.chmodIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 8},
                    "command": self.SetMode_cb,
                }
            )

        if pymediaFound and self.buttonMask.get("recordB", None) is not False:
            ifd.append(
                {
                    "name": "recordB",
                    "widgetType": Tkinter.Checkbutton,
                    "text": "Record",
                    "tooltip": "record an mpeg movie into movie_####.mpg",
                    "defaultValue": 0,
                    "wcfg": {
                        "bd": 4,
                        "variable": Tkinter.IntVar(),
                        "image": self.recIcon,
                        "width": self.recIcon.width(),
                        "height": self.recIcon.height(),
                        "indicatoron": 0,
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 9},
                    "command": self.startRecording_cb,
                }
            )

        if self.buttonMask.get("setanimB", None) is not False:
            ifd.append(
                {
                    "name": "setanimB",
                    "widgetType": Tkinter.Button,
                    "text": "SetAnim",
                    "tooltip": "Set Animation",
                    "wcfg": {"bd": 4},
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 10},
                    "command": self.SetAnim_cb,
                }
            )

        if self.buttonMask.get("closeB", None) is not False:
            ifd.append(
                {
                    "name": "closeB",
                    "widgetType": Tkinter.Button,
                    "text": "Close",
                    "tooltip": "closes player",
                    "wcfg": {
                        "bd": 4,
                        "image": self.closeIcon,
                        "width": self.closeIcon.width(),
                        "height": self.closeIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 11},
                    #'gridcfg':{'sticky':'nesw', 'columnspan':2},
                    "command": self.Close_cb,
                }
            )

        if self.hasSlider:
            ifd.append(
                {
                    "name": "slider",
                    "widgetType": Tkinter.Scale,
                    "wcfg": {"orient": "horizontal", "from_": self.startFrame, "to": self.maxFrame, "showvalue": False},
                    "gridcfg": {"sticky": "nesw", "row": 1, "column": 0, "columnspan": 12},
                    "command": self.nextFrame,
                }
            )
        # form = self.vf.getUserInput(ifd, modal=0,blocking=0)
        form = InputForm(self.master, self.root, descr=ifd, modal=0, blocking=0, closeWithWindow=1)
        form.ifd = ifd
        form.playB = form.ifd.entryByName["playB"]["widget"]
        form.playRevB = form.ifd.entryByName["playRevB"]["widget"]
        # set up link to balloon help which needs to change, also
        form.playTT = form.ifd.entryByName["playB"]["balloon"]
        form.playRevTT = form.ifd.entryByName["playRevB"]["balloon"]
        if self.hasCounter:
            ctr = ifd.entryByName["statesCounter"]["widget"]
            entF = ctr.component("entryfield")
            form.ent2 = entF._entryFieldEntry
            da = ctr.component("downarrow")
            ua = ctr.component("uparrow")
            for item in [da, ua]:
                item.bind("<ButtonPress-1>", self.SetState_cb, "+")
            form.ent2.bind("<Return>", self.SetState_cb, "+")
            form.counter = form.ifd.entryByName["statesCounter"]["widget"]
        if self.hasSlider:
            slider = form.ifd.entryByName["slider"]["widget"]
            slider.set(self.currentFrameIndex)
        # print 'returning form'
        return form

    def buildForm(self, titleStr):
        # ??FIX THIS:
        self.stop = 1
        if hasattr(self, "form"):
            self.form.deiconify()
            return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)
        if self.hasCounter:
            ifd.append(
                {
                    "widgetType": Pmw.Counter,
                    "name": "statesCounter",
                    "required": 1,
                    "tooltip": "used to show frames via random access",
                    "wcfg": {  #'labelpos': 'n,
                        #'label_text':'conformation:  ',
                        "autorepeat": 0,
                        "entryfield_value": self.startFrame,
                        #'entryfield_value':self.idList[0],
                        "datatype": self.custom_counter,
                        "entry_width": 9,
                        "entryfield_validate": self.custom_validate,
                    },
                    "gridcfg": {"sticky": "nesw", "columnspan": 2},
                }
            )
        ifd.append(
            {
                "name": "playB",
                "widgetType": Tkinter.Button,
                "text": "Play",
                "tooltip": "play sequence according to current play mode",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "columnspan": 1},
                "command": self.Play_cb,
            }
        )
        ifd.append(
            {
                "name": "playRevB",
                "widgetType": Tkinter.Button,
                "text": "Play Reverse",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                "command": self.PlayRev_cb,
            }
        )
        ifd.append(
            {
                "name": "playTB",
                "widgetType": Tkinter.Button,
                "text": "Play+Return",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "columnspan": 1},
                "command": self.PlayReturn_cb,
            }
        )
        ifd.append(
            {
                "name": "loopB",
                "widgetType": Tkinter.Button,
                "text": "Loop",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                "command": self.Loop_cb,
            }
        )
        ifd.append(
            {
                "name": "stopB",
                "widgetType": Tkinter.Button,
                "text": "Stop",
                "tooltip": "stop play",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw"},
                "command": self.Stop_cb,
            }
        )
        # add fastforward, fastrewind, thumbwheel for speed
        ifd.append(
            {
                "name": "pauseB",
                "widgetType": Tkinter.Button,
                "text": "Pause",
                "wcfg": {"bd": 4},
                "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                "command": self.Pause_cb,
            }
        )

        ifd.append(
            {
                "name": "closeB",
                "widgetType": Tkinter.Button,
                "text": "Close",
                "wcfg": {"bd": 4},
                #'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
                "gridcfg": {"sticky": "nesw", "columnspan": 2},
                "command": self.Close_cb,
            }
        )
        form = InputForm(self.master, self.root, descr=ifd, modal=0, blocking=0, closeWithWindow=1)
        form.ifd = ifd
        if self.hasCounter:
            ctr = ifd.entryByName["statesCounter"]["widget"]
            entF = ctr.component("entryfield")
            form.ent2 = entF._entryFieldEntry
            da = ctr.component("downarrow")
            ua = ctr.component("uparrow")
            for item in [da, ua]:
                item.bind("<ButtonPress-1>", self.SetState_cb, "+")
            form.ent2.bind("<Return>", self.SetState_cb, "+")
            form.counter = form.ifd.entryByName["statesCounter"]["widget"]
        form.stopB = form.ifd.entryByName["stopB"]["widget"]
        form.playB = form.ifd.entryByName["playB"]["widget"]
        form.playRevB = form.ifd.entryByName["playRevB"]["widget"]
        # print 'returning form1'
        self.form = form
        return form

    # methods for changing playMode
    def SetMode_cb(self, event=None):
        # print 'SetMode'
        # playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        # play framerate is frame/per second
        if not hasattr(self, "playModeForm"):
            self.playModeList = [
                "once and stop",
                "continuously in 1 direction",
                "once in 2 directions",
                "continuously in 2 directions",
            ]
            ifd2 = InputFormDescr(title="Set Play Mode")

            ifd2.append(
                {
                    "name": "playModeLabel",
                    "widgetType": Tkinter.Label,
                    "wcfg": {"text": "play mode options:", "font": (ensureFontCase("helvetica"), 12, "bold")},
                    "gridcfg": {"sticky": "w"},
                }
            )

            ifd2.append(
                {
                    "name": "playMode",
                    "widgetType": Tkinter.Radiobutton,
                    "defaultValue": self.playModeList[self.playMode],
                    "listtext": self.playModeList,
                    "gridcfg": {"sticky": "w"},
                }
            )

            ifd2.append(
                {
                    "name": "framerateTW",
                    "widgetType": ThumbWheel,
                    "tooltip": """Framerate to enforce during playback""",
                    "gridcfg": {"sticky": "we"},
                    "wcfg": {
                        "value": self.framerate,
                        "oneTurn": 100.0,
                        "type": "float",
                        "continuous": True,
                        "wheelPad": 2,
                        "width": 145,
                        "height": 18,
                        "labCfg": {"text": "framerate:  "},
                    },
                }
            )

            ifd2.append(
                {
                    "name": "startFrameTW",
                    "widgetType": ThumbWheel,
                    "tooltip": """First frame used in playback""",
                    "gridcfg": {"sticky": "we"},
                    "wcfg": {
                        "value": self.startFrame,
                        "oneTurn": 100,
                        "type": "int",
                        "continuous": True,
                        "wheelPad": 2,
                        "width": 145,
                        "height": 18,
                        "labCfg": {"text": "start frame: "},
                    },
                }
            )

            ifd2.append(
                {
                    "name": "endFrameTW",
                    "widgetType": ThumbWheel,
                    "tooltip": """Last frame used in playback""",
                    "gridcfg": {"sticky": "we"},
                    "wcfg": {
                        "value": self.endFrame,
                        "oneTurn": 100,
                        "type": "int",
                        "continuous": True,
                        "wheelPad": 2,
                        "width": 145,
                        "height": 18,
                        "labCfg": {"text": " end frame: "},
                    },
                }
            )

            ifd2.append(
                {
                    "name": "stepSizeTW",
                    "widgetType": ThumbWheel,
                    "tooltip": """???""",
                    "gridcfg": {"sticky": "we"},
                    "wcfg": {
                        "value": self.stepSize,
                        "oneTurn": 100,
                        "type": "int",
                        "continuous": True,
                        "wheelPad": 2,
                        "width": 145,
                        "height": 18,
                        "labCfg": {"text": " step size:  "},
                    },
                }
            )

            ifd2.append(
                {
                    "name": "acceptB",
                    "widgetType": Tkinter.Button,
                    "wcfg": {"text": "ok", "command": self.setPlayMode_cb},
                    "gridcfg": {"sticky": "nesw"},
                }
            )

            ifd2.append(
                {
                    "name": "cancelB",
                    "widgetType": Tkinter.Button,
                    "wcfg": {"text": "cancel", "command": self.cancelPlayMode_cb},
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                }
            )
            if self.master is None:
                master = self.root
            else:
                master = Tkinter.Toplevel()
            self.playModeForm = InputForm(master, None, descr=ifd2, modal=0, blocking=0)
            self.playModeVar = self.playModeForm.descr.entryByName["playMode"]["variable"]
            self.framerateWidget = self.playModeForm.descr.entryByName["framerateTW"]["widget"]
            self.startFrameWidget = self.playModeForm.descr.entryByName["startFrameTW"]["widget"]
            self.endFrameWidget = self.playModeForm.descr.entryByName["endFrameTW"]["widget"]
            self.stepSizeWidget = self.playModeForm.descr.entryByName["stepSizeTW"]["widget"]
        else:
            self.playModeForm.deiconify()

    def setPlayMode_cb(self, event=None):
        curVal = self.playModeVar.get()
        self.playMode = self.playModeList.index(curVal)
        # print 'setting playMode to ', curVal
        self.framerate = round(self.framerateWidget.get(), 4)
        # print 'setting self.framerate ->', self.framerate
        self.timestamp = 1.0 / self.framerate

        self.startFrame = self.startFrameWidget.get()
        self.endFrame = self.endFrameWidget.get()
        self.stepSize = self.stepSizeWidget.get()
        self.cancelPlayMode_cb()
        self.oneDirection = 0

    def cancelPlayMode_cb(self, event=None):
        self.playModeForm.withdraw()

    # methods for counter
    def custom_validate(self, text):
        # print 'in custom_validate, text=', text
        if not len(text):
            return -1

        if text in ["start", "end"]:
            return 1

        tt = int(text)
        okList = range(self.startFrame, self.endFrame + 1)
        if tt in okList:
            return 1
        else:
            return -1

    def custom_counter(self, text, factor, increment, **kw):
        # text is current content of entry
        # factor is 1 for increment and -1 for decrement
        # increment is value of increment megawidget option
        ###if not text in self.idList:
        ###raise ValueError, text + ' not in current idList'
        # check whether ind+factor is in range
        newval = self.currentFrameIndex + factor
        # print 'newval=', newval
        if newval < 0 or newval > self.endFrame:
            # print 'custom_counter returning ', text
            return text
        else:
            # print 'custom_counter returning ', newval
            return newval
示例#28
0
    def setparams_cb(self):
        """Opens a panel to set Video Parameters"""
        if self.paramForm:
            self.paramForm.deiconify()
            return
        self.ifd2 = ifd2 = InputFormDescr(title="Set video options")
        ifd2.append({
            'widgetType': Pmw.EntryField,
            'tooltip': 'Set camera width',
            'name': 'cameraw',
            'gridcfg': {
                'sticky': 'w',
                'columnspan': 2
            },
            'wcfg': {  #'command': self.setCameraWidth_cb,
                'label_text': 'width:',
                'entry_width': 10,
                'validate': {
                    'validator': 'real',
                    'min': 0
                },
                'value': str(self.cameraw),
                'labelpos': 'w'
            }
        })

        ifd2.append({
            'widgetType': Pmw.EntryField,
            'name': 'camerah',
            'tooltip': 'Set camera height',
            'gridcfg': {
                'sticky': 'w',
                'columnspan': 2
            },
            'wcfg': {  #'command': self.setCameraHeight_cb,
                'label_text': 'height',
                'entry_width': 10,
                'validate': {
                    'validator': 'real',
                    'min': 0
                },
                'value': str(self.camerah),
                'labelpos': 'w'
            }
        })
        ifd2.append({
            'name': 'autoPause',
            'wtype': ThumbWheel,
            'widgetType': ThumbWheel,
            'tooltip': 'set auto pause delay (seconds)',
            'wcfg': {
                'labCfg': {
                    'fg': 'black',
                    'side': 'left',
                    'text': 'AutoPause Delay'
                },
                'showLabel': 1,
                'width': 100,
                'min': 0,
                'value': self.autoPauseDelay,
                'oneTurn': 100,
                'type': 'int',
                'increment': 1,
                #'callback':self.setAutoPauseDelay_cb,
                'canvascfg': {
                    'bg': 'red'
                },
                'continuous': 0,
                'wheelPad': 1,
                'height': 15
            },
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 2
            }
        })
        ifd2.append({
            'name': 'pauseLength',
            'wtype': ThumbWheel,
            'widgetType': ThumbWheel,
            'tooltip':
            'set number of frames to be added when\nrecording resumes after autopause',
            'wcfg': {
                'labCfg': {
                    'fg': 'black',
                    'side': 'left',
                    'text': 'AutoPause Length'
                },
                'showLabel': 1,
                'width': 100,
                'min': 0,
                'value': self.pauseLength,
                'oneTurn': 100,
                'type': 'int',
                'increment': 1,
                #'callback':self.setPauseLength_cb,
                'canvascfg': {
                    'bg': 'red'
                },
                'continuous': 0,
                'wheelPad': 1,
                'height': 15
            },
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 2
            }
        })
        ifd2.append({
            'name': 'okB',
            'widgetType': Tkinter.Button,
            'wcfg': {
                'text': 'Apply',
                'command': self.apply_cb,
            },
            'gridcfg': {
                'sticky': 'nesw'
            }
        })
        ifd2.append({
            'name': 'cancelB',
            'widgetType': Tkinter.Button,
            'wcfg': {
                'text': 'Cancel',
                'command': self.cancel_cb,
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1,
                'column': 1
            }
        })
        self.paramForm = InputForm(self.master,
                                   None,
                                   descr=ifd2,
                                   modal=0,
                                   blocking=0)
        self.paramForm.deiconify()

        return self.paramForm
示例#29
0
    def SetMode_cb(self, event=None):
        #print 'SetMode'
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        #play framerate is frame/per second
        if not hasattr(self, 'playModeForm'):
            self.showPlayMode = Tkinter.IntVar()
            self.showFrameParmWidgets = Tkinter.IntVar()
            self.playModeVar = Tkinter.StringVar()
            self.playModeVar.set('once and stop')
            self.playModeList=[ 'once and stop', 
                                'continuously in 1 direction',
                                'once in 2 directions', 
                                'continuously in 2 directions']
            self.frameParmsList=[ 'framerateLabel','framerateTW','startFrameLabel', 
                                  'startFrameTW', 'endFrameLabel', 'endFrameTW', 
                                  'stepSizeLabel', 'stepSizeTW']

            #self.showListVar = Tkinter.IntVar()
            ifd2 = InputFormDescr(title='Set Play Options')    
            ## ifd2.append({'name':'selectCB',
##                 'widgetType': Tkinter.Checkbutton,
##                 'tooltip':'show ids of current ordered conformation list',
##                 'wcfg':{ 'text':'Show Conf List',
##                         #'command': self.showStatesList,
##                         #'variable': self.showListVar,
##                        },
##                 'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})
##                 #'gridcfg':{'sticky':'ew'}})
            ifd2.append({'name':'playModeMb',
                'widgetType': Tkinter.Menubutton,
                'tooltip':'set play mode choice',
                'wcfg':{ 'text':'Play Mode',
                       },
                'gridcfg':{'sticky':'we'}})
                #'gridcfg':{'sticky':'w', 'columnspan':2}})
            ifd2.append({'name':'adjustFrameParmsMb',
                'widgetType': Tkinter.Checkbutton,
                'tooltip':'opens panel to set play rate, start conf number, end conf number \nand step size for playing conf sequence',
                'wcfg':{ 'text':'Play Parameters',
                        'command': self.showFrameParms_cb,
                        'variable': self.showFrameParmWidgets,
                       },
                'gridcfg':{'sticky':'w', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'framerateLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'frame rate:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'framerateTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set max num of confs to be displayed per second',
                    'wcfg':{'labCfg':{'fg':'black', 'side':'left', 'text':''},
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':100,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.framerate,
                        'oneTurn':100,
                        'type':'float',
                        'increment':.1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'red'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'startFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'start frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'startFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set number of first conf to be displayed',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':self.endFrame,
                        'lockBMin':0,
                        'lockBMax':1,
                        'lockBIncrement':1,
                        'value':self.startFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'ew', 'row':-1,  'column':1}})
            ifd2.append( {'name': 'endFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'end frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'endFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set number of last conf to be displayed',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':self.startFrame,
                        'max':self.maxFrame,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.endFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'stepSizeLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'step size:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'stepSizeTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set step before next conf number: default is 1',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':1,
                        'max':1000,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.stepSize,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'blue'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append({'name':'buildB',
                'widgetType': Tkinter.Button,
                'tooltip':'build a new molecule with current conf coords\nand add it to viewer',
                'wcfg':{ 'text':'Build Current',
                        'command': self.Build_cb,
                       },
                'gridcfg':{'sticky':'we'}})
                #'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})

            ifd2.append({'name':'writeB',
                'widgetType': Tkinter.Button,
                'tooltip':'write a new file with current conf coords',
                'wcfg':{ 'text':'Write Current',
                        'command': self.Write_cb,
                       },
                #'gridcfg':{'sticky':'we'}})
                'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})         

            ifd2.append({'name':'cancelB',
                        'widgetType': Tkinter.Button,
                        'wcfg':{
                            'text': 'Close',
                            'command': self.cancelPlayMode_cb,
                        },
                        #'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})
                        'gridcfg':{'sticky':'ew','columnspan':2}}),
            self.playModeForm = InputForm(self.master, self.root,
                        descr = ifd2,
                        modal = 0, blocking = 0)
            self.framerateWidget = ifd2.entryByName['framerateTW']['widget']
            self.startFrameWidget = ifd2.entryByName['startFrameTW']['widget']
            self.endFrameWidget = ifd2.entryByName['endFrameTW']['widget']
            self.stepSizeWidget = ifd2.entryByName['stepSizeTW']['widget']
            self.frameParmCfgs = []
            self.frameParmWidgets = []
            for i in self.frameParmsList:
                ent = ifd2.entryByName[i]
                self.frameParmCfgs.append(ent['gridcfg'])
                self.frameParmWidgets.append(ent['widget'])
            self.playModeMb = ifd2.entryByName['playModeMb']['widget']
            self.playModeMb.bind('<ButtonPress>', self.buildPlayModeMenu, add='+')
            self.showFrameParms_cb()
            #self.showList = ifd2.entryByName['selectCB']['widget']
        else:
            self.playModeVar.set(self.playModeList[self.playMode])
            self.framerateWidget.set(self.framerate)
            self.startFrameWidget.set(self.startFrame)
            self.endFrameWidget.set(self.endFrame)
            self.stepSizeWidget.set(self.stepSize)
            self.playModeForm.deiconify()
        self.playModeForm.autoSize()
示例#30
0
    def buildForm2(self, titleStr):
        self.stop = 1
        if hasattr(self, 'form'):
            if hasattr(self.form, 'deiconify'):
                self.form.deiconify()
                return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)

        if self.buttonMask.get('gotoStartB', None) is not False:
            ifd.append({
                'name': 'gotoStartB',
                'widgetType': Tkinter.Button,
                #'text':'gotoStart',
                'tooltip': 'sets frame to current startFrame',
                'wcfg': {
                    'bd': 4,
                    'image': self.gotoStartIcon,
                    'width': self.gotoStartIcon.width(),
                    'height': self.gotoStartIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw'
                },
                'command': self.GoToStart_cb
            })

        if self.buttonMask.get('fastReverseB', None) is not False:
            ifd.append({
                'name': 'fastReverseB',
                'widgetType': Tkinter.Button,
                #'text':'fastReverse',
                'tooltip': 'play reverse as fast as possible',
                'wcfg': {
                    'bd': 4,
                    'image': self.ff_revIcon,
                    'width': self.ff_revIcon.width(),
                    'height': self.ff_revIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 1
                },
                'command': self.FastReverse_cb
            })

        if self.buttonMask.get('playRevB', None) is not False:
            ifd.append({
                'name': 'playRevB',
                'widgetType': Tkinter.Button,
                #'text':'Play Reverse',
                'tooltip': 'play reverse according to current play mode',
                'wcfg': {
                    'bd': 4,
                    'image': self.playRevIcon,
                    'width': self.playRevIcon.width(),
                    'height': self.playRevIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 2
                },
                'command': self.PlayRev_cb
            })

            if self.hasCounter:
                ifd.append({
                    'widgetType': Pmw.Counter,
                    'name': 'statesCounter',
                    'required': 1,
                    'tooltip': 'used to show frames via random access',
                    'wcfg': {  #'labelpos': 'n,
                        #'label_text':'conformation:  ',
                        'autorepeat': 0,
                        'entryfield_value': self.startFrame,
                        #'entryfield_value':self.idList[0],
                        'datatype': self.custom_counter,
                        'entry_width': 3,
                        'entryfield_validate': self.custom_validate
                    },
                    'gridcfg': {
                        'sticky': 'nesw',
                        'row': -1,
                        'column': 3,
                        'columnspan': 2
                    }
                })

        if self.buttonMask.get('playB', None) is not False:
            ifd.append({
                'name': 'playB',
                'widgetType': Tkinter.Button,
                #'text':'Play',
                'tooltip': 'play forward according to current play mode',
                'wcfg': {
                    'bd': 4,
                    'image': self.playIcon,
                    'width': self.playIcon.width(),
                    'height': self.playIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 5
                },
                'command': self.Play_cb
            })

        if self.buttonMask.get('fastForwardB', None) is not False:
            ifd.append({
                'name': 'fastForwardB',
                'widgetType': Tkinter.Button,
                #'text':'fastForward',
                'tooltip': 'play as fast as possible',
                'wcfg': {
                    'bd': 4,
                    'image': self.ff_fwdIcon,
                    'width': self.ff_fwdIcon.width(),
                    'height': self.ff_fwdIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 6
                },
                'command': self.FastForward_cb
            })

        if self.buttonMask.get('gotoEndB', None) is not False:
            ifd.append({
                'name': 'gotoEndB',
                'widgetType': Tkinter.Button,
                #'text':'gotoEnd',
                'tooltip': 'sets frame to current endFrame',
                'wcfg': {
                    'bd': 4,
                    'image': self.gotoEndIcon,
                    'width': self.gotoEndIcon.width(),
                    'height': self.gotoEndIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 7
                },
                'command': self.GoToEnd_cb
            })

        if self.buttonMask.get('modeB', None) is not False:
            ifd.append({
                'name': 'modeB',
                'widgetType': Tkinter.Button,
                'text': 'Change Mode',
                'tooltip': 'opens panel to change play options',
                'wcfg': {
                    'bd': 4,
                    'image': self.chmodIcon,
                    'width': self.chmodIcon.width(),
                    'height': self.chmodIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 8
                },
                'command': self.SetMode_cb
            })

        if pymediaFound and self.buttonMask.get('recordB', None) is not False:
            ifd.append({
                'name': 'recordB',
                'widgetType': Tkinter.Checkbutton,
                'text': 'Record',
                'tooltip': 'record an mpeg movie into movie.mpeg',
                'defaultValue': 0,
                'wcfg': {
                    'bd': 4,
                    'variable': Tkinter.IntVar(),
                    'image': self.recIcon,
                    'width': self.recIcon.width(),
                    'height': self.recIcon.height(),
                    'indicatoron': 0,
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 9
                },
                'command': self.startRecording_cb
            })

        if self.buttonMask.get('setanimB', None) is not False:
            ifd.append({
                'name': 'setanimB',
                'widgetType': Tkinter.Button,
                'text': 'SetAnim',
                'tooltip': 'Set Animation',
                'wcfg': {
                    'bd': 4
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 10
                },
                'command': self.SetAnim_cb
            })

        if self.buttonMask.get('closeB', None) is not False:
            ifd.append({
                'name': 'closeB',
                'widgetType': Tkinter.Button,
                'text': 'Close',
                'tooltip': 'closes player',
                'wcfg': {
                    'bd': 4,
                    'image': self.closeIcon,
                    'width': self.closeIcon.width(),
                    'height': self.closeIcon.height(),
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 11
                },
                #'gridcfg':{'sticky':'nesw', 'columnspan':2},
                'command': self.Close_cb
            })

        if self.hasSlider:
            ifd.append({
                'name': 'slider',
                'widgetType': Tkinter.Scale,
                'wcfg': {
                    'orient': 'horizontal',
                    'from_': self.startFrame,
                    'to': self.maxFrame,
                    'showvalue': False
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': 1,
                    'column': 0,
                    'columnspan': 12
                },
                'command': self.nextFrame
            })
        #form = self.vf.getUserInput(ifd, modal=0,blocking=0)
        form = InputForm(self.master,
                         self.root,
                         descr=ifd,
                         modal=0,
                         blocking=0,
                         closeWithWindow=1)
        form.ifd = ifd
        form.playB = form.ifd.entryByName['playB']['widget']
        form.playRevB = form.ifd.entryByName['playRevB']['widget']
        #set up link to balloon help which needs to change, also
        form.playTT = form.ifd.entryByName['playB']['balloon']
        form.playRevTT = form.ifd.entryByName['playRevB']['balloon']
        if self.hasCounter:
            ctr = ifd.entryByName['statesCounter']['widget']
            entF = ctr.component('entryfield')
            form.ent2 = entF._entryFieldEntry
            da = ctr.component('downarrow')
            ua = ctr.component('uparrow')
            for item in [da, ua]:
                item.bind('<ButtonPress-1>', self.SetState_cb, '+')
            form.ent2.bind('<Return>', self.SetState_cb, '+')
            form.counter = form.ifd.entryByName['statesCounter']['widget']
        if self.hasSlider:
            slider = form.ifd.entryByName['slider']['widget']
            slider.set(self.currentFrameIndex)
        #print 'returning form'
        return form
示例#31
0
    def buildForm(self, titleStr):
        #??FIX THIS:
        self.stop = 1
        if hasattr(self, 'form'):
            self.form.deiconify()
            return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)
        if self.hasCounter:
            ifd.append({
                'widgetType': Pmw.Counter,
                'name': 'statesCounter',
                'required': 1,
                'tooltip': 'used to show frames via random access',
                'wcfg': {  #'labelpos': 'n,
                    #'label_text':'conformation:  ',
                    'autorepeat': 0,
                    'entryfield_value': self.startFrame,
                    #'entryfield_value':self.idList[0],
                    'datatype': self.custom_counter,
                    'entry_width': 9,
                    'entryfield_validate': self.custom_validate
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'columnspan': 2
                }
            })
        ifd.append({
            'name': 'playB',
            'widgetType': Tkinter.Button,
            'text': 'Play',
            'tooltip': 'play sequence according to current play mode',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 1
            },
            'command': self.Play_cb
        })
        ifd.append({
            'name': 'playRevB',
            'widgetType': Tkinter.Button,
            'text': 'Play Reverse',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1,
                'column': 1
            },
            'command': self.PlayRev_cb
        })
        ifd.append({
            'name': 'playTB',
            'widgetType': Tkinter.Button,
            'text': 'Play+Return',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 1
            },
            'command': self.PlayReturn_cb
        })
        ifd.append({
            'name': 'loopB',
            'widgetType': Tkinter.Button,
            'text': 'Loop',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1,
                'column': 1
            },
            'command': self.Loop_cb
        })
        ifd.append({
            'name': 'stopB',
            'widgetType': Tkinter.Button,
            'text': 'Stop',
            'tooltip': 'stop play',
            'wcfg': {
                'bd': 4,
            },
            'gridcfg': {
                'sticky': 'nesw'
            },
            'command': self.Stop_cb
        })
        #add fastforward, fastrewind, thumbwheel for speed
        ifd.append({
            'name': 'pauseB',
            'widgetType': Tkinter.Button,
            'text': 'Pause',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1,
                'column': 1
            },
            'command': self.Pause_cb
        })

        ifd.append({
            'name': 'closeB',
            'widgetType': Tkinter.Button,
            'text': 'Close',
            'wcfg': {
                'bd': 4
            },
            #'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 2
            },
            'command': self.Close_cb
        })
        form = InputForm(self.master,
                         self.root,
                         descr=ifd,
                         modal=0,
                         blocking=0,
                         closeWithWindow=1)
        form.ifd = ifd
        if self.hasCounter:
            ctr = ifd.entryByName['statesCounter']['widget']
            entF = ctr.component('entryfield')
            form.ent2 = entF._entryFieldEntry
            da = ctr.component('downarrow')
            ua = ctr.component('uparrow')
            for item in [da, ua]:
                item.bind('<ButtonPress-1>', self.SetState_cb, '+')
            form.ent2.bind('<Return>', self.SetState_cb, '+')
            form.counter = form.ifd.entryByName['statesCounter']['widget']
        form.stopB = form.ifd.entryByName['stopB']['widget']
        form.playB = form.ifd.entryByName['playB']['widget']
        form.playRevB = form.ifd.entryByName['playRevB']['widget']
        #print 'returning form1'
        self.form = form
        return form
示例#32
0
    def SetMode_cb(self, event=None):
        #print 'SetMode'
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        #play framerate is frame/per second
        if not hasattr(self, 'playModeForm'):
            self.playModeList = [
                'once and stop', 'continuously in 1 direction',
                'once in 2 directions', 'continuously in 2 directions'
            ]
            ifd2 = InputFormDescr(title='Set Play Mode')

            ifd2.append({
                'name': 'playModeLabel',
                'widgetType': Tkinter.Label,
                'wcfg': {
                    'text': 'play mode options:',
                    'font': (ensureFontCase('helvetica'), 12, 'bold')
                },
                'gridcfg': {
                    'sticky': 'w'
                }
            })

            ifd2.append({
                'name': 'playMode',
                'widgetType': Tkinter.Radiobutton,
                'defaultValue': self.playModeList[self.playMode],
                'listtext': self.playModeList,
                'gridcfg': {
                    'sticky': 'w'
                }
            })

            ifd2.append({
                'name': 'framerateTW',
                'widgetType': ThumbWheel,
                'tooltip': """Framerate to enforce during playback""",
                'gridcfg': {
                    'sticky': 'we'
                },
                'wcfg': {
                    'value': self.framerate,
                    'oneTurn': 100.,
                    'type': 'float',
                    'continuous': True,
                    'wheelPad': 2,
                    'width': 145,
                    'height': 18,
                    'labCfg': {
                        'text': 'framerate:  '
                    },
                },
            })

            ifd2.append({
                'name': 'startFrameTW',
                'widgetType': ThumbWheel,
                'tooltip': """First frame used in playback""",
                'gridcfg': {
                    'sticky': 'we'
                },
                'wcfg': {
                    'value': self.startFrame,
                    'oneTurn': 100,
                    'type': 'int',
                    'continuous': True,
                    'wheelPad': 2,
                    'width': 145,
                    'height': 18,
                    'labCfg': {
                        'text': 'start frame: '
                    },
                },
            })

            ifd2.append({
                'name': 'endFrameTW',
                'widgetType': ThumbWheel,
                'tooltip': """Last frame used in playback""",
                'gridcfg': {
                    'sticky': 'we'
                },
                'wcfg': {
                    'value': self.endFrame,
                    'oneTurn': 100,
                    'type': 'int',
                    'continuous': True,
                    'wheelPad': 2,
                    'width': 145,
                    'height': 18,
                    'labCfg': {
                        'text': ' end frame: '
                    },
                },
            })

            ifd2.append({
                'name': 'stepSizeTW',
                'widgetType': ThumbWheel,
                'tooltip': """???""",
                'gridcfg': {
                    'sticky': 'we'
                },
                'wcfg': {
                    'value': self.stepSize,
                    'oneTurn': 100,
                    'type': 'int',
                    'continuous': True,
                    'wheelPad': 2,
                    'width': 145,
                    'height': 18,
                    'labCfg': {
                        'text': ' step size:  '
                    },
                },
            })

            ifd2.append({
                'name': 'acceptB',
                'widgetType': Tkinter.Button,
                'wcfg': {
                    'text': 'ok',
                    'command': self.setPlayMode_cb,
                },
                'gridcfg': {
                    'sticky': 'nesw'
                }
            })

            ifd2.append({
                'name': 'cancelB',
                'widgetType': Tkinter.Button,
                'wcfg': {
                    'text': 'cancel',
                    'command': self.cancelPlayMode_cb,
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 1
                }
            })
            if self.master is None:
                master = self.root
            else:
                master = Tkinter.Toplevel()
            self.playModeForm = InputForm(master,
                                          None,
                                          descr=ifd2,
                                          modal=0,
                                          blocking=0)
            self.playModeVar = self.playModeForm.descr.entryByName['playMode'][
                'variable']
            self.framerateWidget = self.playModeForm.descr.entryByName[
                'framerateTW']['widget']
            self.startFrameWidget = self.playModeForm.descr.entryByName[
                'startFrameTW']['widget']
            self.endFrameWidget = self.playModeForm.descr.entryByName[
                'endFrameTW']['widget']
            self.stepSizeWidget = self.playModeForm.descr.entryByName[
                'stepSizeTW']['widget']
        else:
            self.playModeForm.deiconify()
示例#33
0
class Player(Tkinter.Frame):
    """Widget to play sequence of frames, with GUI to specify direction and speed.
    required attributes:
        currentFrameIndex = 0
        startFrame = 0
        endFrame = 0
        maxFrame = 0
        stepSize = 1
        target = endFrame           #determines direction of play
        increment = 1               #implements decrementing vs incrementing
                                    #  in getNextFrameIndex
        playMode = 0                #playMode options:
                                    #   0   play once and stop
                                    #   1   play continuously in 1 direction
                                    #   2   play once in 2 directions
                                    #   3   play continuously in 2 directions
        framerate =15.              # number of frame per second to be display
        hasSlider = False           #adds Tkinter Scale Widget if True

    required methods:
    #play methods:
        play                           #play according to play mode
        getNextFrameIndex              #returns index of next frame to
                                        play according to current index
                                        and playMode
        nextFrame                      #actually display the nextFrame
                                        ??possibly update widgets???

    #methods to regulate play
        Play_cb                        #play according to playMode
        PlayRev_cb                     #play backwards  
        FastForward_cb()               #play foward at max speed
        FastReverse_cb()               #play reverse at max speed
        Stop_cb                        #stop current play
        ?Pause_cb                      #stop at current frame??
        ?Loop_cb                       #???????


    #methods to set Frame to a specific frame
        SetState_cb                    #counter callback for random access
        GoToStart_cb                   #set to current startFrame
        GoToEnd_cb                     #set to current endFrame
        ?setCurrentFrameIndex          #set currentframe index???


    #methods for player gui
        showGUI                        #show the gui
        buildForm2                     #opens image-based gui
        buildForm                      #opens text-based gui
        Close_cb                       #withdraws gui

    #methods for pmw counter
        custom_validate                #used by pmw to check entry
        custom_counter                 #used by pmw for counter


    #methods for changing playMode
        SetMode_cb                     #opens playModeForm
        setPlayMode_cb                 #sets playMode, sets delay,
                                          startFrame, endFrame 
                                          AND closes playModeForm
        cancelPlayMode_cb              #closes playModeForm w/out changes

        #methods for end points:
            setStartFrame()            #set startFrame
            setEndFrame()              #set endFrame
            setStepSize()              #sets increment, def=1
        additional methods:
        



    """

    def __init__(self, master=None, root=None,
                        height=80,width=200,
                        currentFrameIndex=0,
                        startFrame=0, 
                        endFrame=0,
                        maxFrame=0,
                        stepSize=1, 
                        playMode=0,
                        ##afterDelay=50,
                        titleStr='Player',
                        gotoStartfile = 'go_to_start.gif',
                        gotoEndfile = 'go_to_end.gif',
                        ff_revfile = 'ff_rev.gif',
                        ff_fwdfile = 'ff_fwd.gif',
                        stopfile = 'stop.gif',
                        playfile = 'play_fwd.gif',
                        playRevfile = 'play_rev.gif',
                        chmodfile = 'chmod.gif',
                        closefile = 'close.gif',
                        iconpath = None,
                        counter = 1,
                        form2=1,gui=1,framerate=15., hasSlider=False):

        # frame rate in fps
        self.framerate = framerate 
        self.gui = gui
        self.currentFrameIndex = currentFrameIndex
        self.startFrame = startFrame
        self.endFrame = endFrame
        self.targetFrame = self.endFrame
        self.maxFrame = maxFrame
        if not maxFrame:
            self.maxFrame = endFrame
        self.stepSize = stepSize
        #used for play once in 2 directions
        self.oneDirection = 0
        self.increment = 1
        self.target = self.endFrame
        self.hasSlider = hasSlider
        #used to coordinate switching icons
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions and stop
        #   3   play continuously in 2 directions
        self.playMode = playMode
        ### replace by framerate
        #amt of time to sleep
        #self.delay = delay


        #amt of time for after
        #self.afterDelay = afterDelay

        self.afterID = None
        self.stop = 1
        self.hasCounter = 0
        # gui variable
        #self.master = master
        #self.root = root
        self.form2 = form2
        self.hasCounter = counter

        if gui:
            self.showGUI(master=master,root=root,
                         titleStr=titleStr,height=height,
                         width=width,iconpath=iconpath)


    def showGUI(self,master=None,root=None,
                width=200,height=80,titleStr='player',
                gotoStartfile = 'go_to_start.gif',
                gotoEndfile = 'go_to_end.gif',
                ff_revfile = 'ff_rev.gif',
                ff_fwdfile = 'ff_fwd.gif',
                stopfile = 'stop.gif',
                playfile = 'play_fwd.gif',
                playRevfile = 'play_rev.gif',
                chmodfile = 'chmod.gif',
                closefile = 'close.gif',iconpath=None):
        """ function to display the player gui."""

        if hasattr(self, 'form'):
	    if hasattr(self.form, "deiconify"):
                self.form.deiconify()
                return   
        self.master=master
        self.root=root

        if not self.form2:
            self.form = self.buildForm(titleStr)  # pass some arguments here
            self.form2=0
        else:
            if iconpath is None:
                iconpath = ('mglutil.gui.BasicWidgets.Tk','icons')
            ICONDIR = findFilePath(iconpath[1], iconpath[0])
            #if findFilePath failed, already returned
            gotoStartfile = os.path.join(ICONDIR,gotoStartfile)
            gotoEndfile = os.path.join(ICONDIR,gotoEndfile)
            ff_revfile = os.path.join(ICONDIR,ff_revfile)
            ff_fwdfile = os.path.join(ICONDIR,ff_fwdfile)
            stopfile = os.path.join(ICONDIR,stopfile)
            playfile = os.path.join(ICONDIR,playfile)
            playRevfile = os.path.join(ICONDIR,playRevfile)
            chmodfile = os.path.join(ICONDIR,chmodfile)
            closefile = os.path.join(ICONDIR,closefile)
            
            self.gotoStartIcon = Tkinter.PhotoImage(file=gotoStartfile, master=master)
            self.gotoEndIcon = Tkinter.PhotoImage(file=gotoEndfile, master=master)
            self.ff_revIcon = Tkinter.PhotoImage(file=ff_revfile, master=master)
            self.ff_fwdIcon = Tkinter.PhotoImage(file=ff_fwdfile, master=master)
            self.stopIcon = Tkinter.PhotoImage(file=stopfile, master=master)
            self.playIcon = Tkinter.PhotoImage(file=playfile, master=master)
            self.playRevIcon = Tkinter.PhotoImage(file=playRevfile, master=master)
            self.chmodIcon = Tkinter.PhotoImage(file=chmodfile, master=master)
            self.closeIcon = Tkinter.PhotoImage(file=closefile, master=master)
            self.form = self.buildForm2(titleStr)  # pass some argument here

    #play methods:
    # play, waitTime, getNextFrameIndex, nextFrame
    def play(self, framerate,event=None):
        t1=  time.time() # previous frame time
        timestamp = 1./framerate # rate to update frame
        self.stop = 0
        ind = self.currentFrameIndex

        
        while not self.stop: #this has to be more complex
            if self.stop: 
                print 'play stopped!'
                break
            
            #do something different here if ff_fwd or ff_rev
            if self.gui:
                #self.afterID = self.master.after(self.afterDelay, self.waitTime)
                self.master.update()

            t2 = time.time()  # current time
            t = t2 -t1        # time difference between current frame and previous
    
            if (t < timestamp):
                pass
            else:
                id = self.getNextFrameIndex(self.currentFrameIndex)
                if id==None:
                    self.stop = 1
                    if self.gui:
                        self.Stop_cb()
                        break
                self.nextFrame(id) #maybe set entry then call nextFrame??
                self.currentFrameIndex = id
                t1 = t2
            
    def getNextFrameIndex(self, index):
        newFrame = index + self.increment*self.stepSize
        # check if  newFrame in current range:
        #       if incrementing, has to be <=self.endFrame
        #       if decrementing, has to be >=self.startFrame
        #   NB: incPos indicates whether currently incrementing or decrementing
        # FORCE newFrame into range 
        incPos = self.increment>0
        if incPos and newFrame>self.endFrame:
            newFrame = self.endFrame
        elif not incPos and newFrame<self.startFrame:
            newFrame = self.startFrame
        # check whether reached current targetFrame
        #       if so, action depends on current playMode 
        mode = self.playMode
        if index==self.targetFrame:
            # playModes 0 and 2 are play once and stop (in 1 or 2 directions)
            if not mode%2:
                if mode==0:
                    # None means stop
                    return None
                else:
                    # play once in 2 directions
                    #   check whether already reached halfway pt
                    if self.oneDirection:
                        return None
                    self.oneDirection = 1
                    # to reverse direction:
                    #   toggle increment
                    self.increment = -1 * self.increment
                    #   toggle targetFrame
                    if self.targetFrame==self.endFrame:
                        self.targetFrame = self.startFrame
                    else:
                        self.targetFrame = self.endFrame
                    return newFrame
            elif self.playMode==1:
                # play continuously in 1 direction
                # toggle targetFrame to the opposite end
                if self.targetFrame==self.endFrame:
                    return self.startFrame
                else:
                    return self.endFrame
            elif self.playMode==3:
                # loop continuously in 2 directions
                #   toggle increment
                self.increment = -1 * self.increment
                newFrame = self.targetFrame + self.stepSize * self.increment
                #   toggle targetFrame
                if self.targetFrame==self.endFrame:
                    self.targetFrame = self.startFrame
                else:
                    self.targetFrame = self.endFrame
                return newFrame
        return newFrame


##     def waitTime(self):
##         self.afterID = None
##         t1 = time.time()
##         delta = time.time() - t1
##         #curBut is either play or playRev button
##         hasCurBut = hasattr(self, 'curBut')
##         while delta < self.delay:
##             if hasCurBut:
##                 self.curBut.config(bg='red')
##             self.master.update()
##             time.sleep(self.delay/100)
##             delta = time.time() - t1
##         if hasCurBut:
##             self.curBut.config(bg='white')
##         if self.afterID is not None and hasCurBut:
##             self.curBut.after_cancel(self.afterID)
##             self.afterID = self.curBut.after(self.afterDelay, self.waitTime)
        

    def nextFrame(self, id):
        ##pass #must be overwritten
        id = int(id)
        if id == self.currentFrameIndex: return        
        if self.hasCounter and self.gui:
            self.form.ent2.delete(0,'end')
            self.form.ent2.insert(0, str(id))
            if self.hasSlider:
                self.form.ifd.entryByName['slider']['widget'].set(id)
        print 'playing ', id
        self.currentFrameIndex = int(id)


    #methods to call play
    #Play_cb, PlayRev_cb, FastForward_cb, FastReverse_cb
    #Stop_cb and possibly Pause_cb, Loop_cb

    def Play_cb(self, framerate=None,event=None):
        #print 'Play_cb'
        self.form.ifd.entryByName['playB']['widget'].grab_release()
        #this is a new call to Play_cb
        if framerate == None:
            framerate =self.framerate
        self.stop = 0
        self.oneDirection = 0
        self.targetFrame = self.endFrame
        self.increment = 1
        #print 'currentFrameIndex=', self.currentFrameIndex
        #possibly currently playing reverse
        if hasattr(self,'curBut') and self.curBut==self.form.playRevB:
            if self.form2:
                self.curBut.config(command=self.oldCmd,
                        image=self.oldImage,bg='white')
            else:
                self.curBut.config(command=self.oldCmd, text=self.oldText)
        self.oldTT = self.form.playTT
        self.oldTTtext = 'play forward according to current play mode'
        self.curBut = self.form.playB
        self.oldCmd = self.Play_cb
        self.oldImage = self.playIcon
        self.oldText = 'Play'
        if self.form2:
            self.curBut.config(command=self.Stop_cb, image=self.stopIcon)
        else:
            self.curBut.config(command=self.Stop_cb, text='Stop')
        self.oldTT.bind(self.curBut,'stop play')
        #self.master.update()
        self.play(framerate)


    def PlayRev_cb(self, framerate=None,event=None):
        #figure out current number and then play backwards
        #print 'currentFrameIndex=', self.currentFrameIndex
        self.form.ifd.entryByName['playRevB']['widget'].grab_release()
        if framerate == None:
            framerate=self.framerate
        self.increment = -1
        self.targetFrame = self.startFrame
        self.oneDirection = 0
        self.stop = 0
        #possibly currently playing 
        if hasattr(self,'curBut') and self.curBut==self.form.playB:
            if self.form2:
                self.curBut.config(command=self.oldCmd, 
                        image=self.oldImage,bg='white')
            else:
                self.curBut.config(command=self.oldCmd, text=self.oldText)
        self.oldTT = self.form.playRevTT
        self.oldTTtext = 'play reverse according to current play mode'
        self.curBut = self.form.playRevB
        self.oldCmd = self.PlayRev_cb
        self.oldImage = self.playRevIcon
        self.oldText = 'Play Reverse'
        if self.form2:
            self.curBut.config(command=self.Stop_cb, image=self.stopIcon)
        else:
            self.curBut.config(command=self.Stop_cb, text='Stop')
        self.oldTT.bind(self.curBut,'stop play')
        self.play(framerate)

    def FastReverse_cb(self, event=None):
        #print 'FastReverse'
        framerate = self.framerate * 2
        self.oneDirection = 0
        self.PlayRev_cb(framerate=framerate)
        

    def FastForward_cb(self, event=None):
        #print 'FastForward'
        self.oneDirection = 0
        framerate = self.framerate * 2
        self.Play_cb(framerate=framerate)
        


    def Stop_cb(self, event=None):
        self.stop = 1
        if hasattr(self, 'curBut'):
            if self.form2:
                self.curBut.config(command=self.oldCmd, image=self.oldImage)
            else:
                self.curBut.config(command=self.oldCmd, text=self.oldText)
                #FIX THIS!!!!
                #DECIDE if stop means reset to start or not
                self.nextFrame(self.startFrame)
            self.oldTT.bind(self.curBut,self.oldTTtext)
        #FIX THIS: does this go here?  or in nextFrame
        #clean up form
        #if self.hasCounter:
        #    self.form.ent2.delete(0,'end')
        #    self.form.ent2.insert(0, str(self.currentFrameIndex))


    #these may be superfluous: called by original form
    def PlayReturn_cb(self, event=None):
        #print 'PlayReturn_cb'
        #this should be superfluous
        self.playMode = 3
        self.Play_cb()


    def Loop_cb(self, event=None):
        #print 'Loop_cb'
        #this should be superfluous
        self.playMode = 3
        self.Play_cb()


    def Pause_cb(self, event=None):
        self.stop = 1


    #methods to set Frame to a specific frame
    #SetState_cb, GoToStart_cb, GoToEnd_cb, setCurrentFrameIndex
    def SetState_cb(self,  event=None):
        #do nothing if no counter
        if self.hasCounter:
            index = self.form.counter.get()
            self.nextFrame(index)


    def GoToStart_cb(self, event=None):
        #print 'GoToStart'
        #self.currentFrameIndex = self.startFrame
        self.oneDirection = 0
        self.nextFrame(self.startFrame)


    def GoToEnd_cb(self, event=None):
        #print 'GoToEnd'
        self.oneDirection = 0
        #self.currentFrameIndex = self.endFrame
        self.nextFrame(self.endFrame)


    def setCurrentFrameIndex(self, index):
        #print 'setting currentFrameIndex to', index
        self.currentFrameIndex = index 


    #methods for player gui
    def Close_cb(self, event=None):
        self.stop = 1
        if hasattr(self,'form'):
            self.form.withdraw()
    def SetAnim_cb(self):
        """ function to be overwritten.
        Use to call a functoin to set the animatiom frame."""

        return

    def buildForm2(self, titleStr):
        self.stop = 1
        if hasattr(self, 'form'):
            if hasattr(self.form, 'deiconify'):
                self.form.deiconify()
                return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)
        ifd.append({'name': 'gotoStartB',
            'widgetType': Tkinter.Button,
            #'text':'gotoStart',
            'tooltip':'sets frame to current startFrame',
            'wcfg':{'bd':4,
                    'image':self.gotoStartIcon,
                    'width':self.gotoStartIcon.width(),
                    'height':self.gotoStartIcon.height()
            },
            'gridcfg':{'sticky':'nesw'},
            'command':self.GoToStart_cb})
        ifd.append({'name': 'fastReverseB',
            'widgetType': Tkinter.Button,
            #'text':'fastReverse',
            'tooltip':'play reverse as fast as possible',
            'wcfg':{'bd':4,
                    'image':self.ff_revIcon,
                    'width':self.ff_revIcon.width(),
                    'height':self.ff_revIcon.height()
            },
            'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1},
            'command':self.FastReverse_cb})
        ifd.append({'name': 'playRevB',
            'widgetType': Tkinter.Button,
            #'text':'Play Reverse',
            'tooltip':'play reverse according to current play mode',
            'wcfg':{'bd':4,
                    'image':self.playRevIcon,
                    'width':self.playRevIcon.width(),
                    'height':self.playRevIcon.height()},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':2},
            'command':self.PlayRev_cb})
        if self.hasCounter:
            ifd.append({'widgetType':Pmw.Counter,
                    'name':'statesCounter',
                    'required':1,
                    'tooltip':'used to show frames via random access',
                    'wcfg':{#'labelpos': 'n,
                         #'label_text':'conformation:  ',
                        'autorepeat':0,
                        'entryfield_value':self.startFrame,
                        #'entryfield_value':self.idList[0],
                        'datatype': self.custom_counter,
                        'entry_width':3,
                        'entryfield_validate': self.custom_validate },
                     'gridcfg':{'sticky':'nesw', 'row':-1, 'column':3,'columnspan':2}})
        ifd.append({'name': 'playB',
            'widgetType': Tkinter.Button,
            #'text':'Play',
            'tooltip':'play forward according to current play mode',
            'wcfg':{'bd':4,
                    'image':self.playIcon,
                    'width':self.playIcon.width(),
                    'height':self.playIcon.height()
            },
            'gridcfg':{'sticky':'nesw', 'row':-1, 'column':5},
            'command':self.Play_cb})
        ifd.append({'name': 'fastForwardB',
            'widgetType': Tkinter.Button,
            #'text':'fastForward',
            'tooltip':'play as fast as possible',
            'wcfg':{'bd':4,
                    'image': self.ff_fwdIcon,
                    'width':self.ff_fwdIcon.width(),
                    'height':self.ff_fwdIcon.height()
                    },
            'gridcfg':{'sticky':'nesw','row':-1, 'column':6},
            'command':self.FastForward_cb})
        ifd.append({'name': 'gotoEndB',
            'widgetType': Tkinter.Button,
            #'text':'gotoEnd',
            'tooltip':'sets frame to current endFrame',
            'wcfg':{'bd':4,
                    'image':self.gotoEndIcon,
                    'width':self.gotoEndIcon.width(),
                    'height':self.gotoEndIcon.height()
            },
            'gridcfg':{'sticky':'nesw','row':-1, 'column':7},
            'command':self.GoToEnd_cb})
        ifd.append({'name': 'modeB',
            'widgetType': Tkinter.Button,
            'text':'Change Mode',
            'tooltip':'opens panel to change play options',
            'wcfg':{'bd':4,
                    'image':self.chmodIcon,
                    'width':self.chmodIcon.width(),
                    'height':self.chmodIcon.height()
                    },
            'gridcfg':{'sticky':'nesw','row':-1, 'column':8},
            'command':self.SetMode_cb})

        ifd.append({'name': 'setanimB',
            'widgetType': Tkinter.Button,
            'text':'SetAnim',
            'tooltip':'Set Animation',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':9},
            'command':self.SetAnim_cb})
        
        ifd.append({'name': 'closeB',
            'widgetType': Tkinter.Button,
            'text':'Close',
            'tooltip':'closes player',
            'wcfg':{'bd':4,
                    'image':self.closeIcon,
                    'width':self.closeIcon.width(),
                    'height':self.closeIcon.height(),
                    },
            'gridcfg':{'sticky':'nesw','row':-1, 'column':10},
            #'gridcfg':{'sticky':'nesw', 'columnspan':2},
            'command':self.Close_cb})
        if self.hasSlider:
            ifd.append({'name': 'slider',
                'widgetType': Tkinter.Scale,
                'wcfg':{'orient':'horizontal',
                        'from_':self.startFrame,
                        'to':self.maxFrame,
                        'showvalue':False},
                'gridcfg':{'sticky':'nesw','row':1, 'column':0, 'columnspan':11},
                'command':self.nextFrame
                })        
        #form = self.vf.getUserInput(ifd, modal=0,blocking=0)
        form = InputForm(self.master, self.root,
                         descr = ifd,
                         modal = 0, blocking = 0,
                         closeWithWindow=1)
        form.ifd = ifd
        form.playB = form.ifd.entryByName['playB']['widget']
        form.playRevB = form.ifd.entryByName['playRevB']['widget']
        #set up link to balloon help which needs to change, also
        form.playTT = form.ifd.entryByName['playB']['balloon']
        form.playRevTT = form.ifd.entryByName['playRevB']['balloon']
        if self.hasCounter:
            ctr = ifd.entryByName['statesCounter']['widget']
            entF = ctr.component('entryfield')
            form.ent2 = entF._entryFieldEntry
            da = ctr.component('downarrow')
            ua = ctr.component('uparrow')
            for item in [da,ua]:
                item.bind('<ButtonPress-1>', self.SetState_cb, '+')
            form.ent2.bind('<Return>', self.SetState_cb, '+')
            form.counter = form.ifd.entryByName['statesCounter']['widget']
        #print 'returning form'
        return form


    def buildForm(self, titleStr):
        #??FIX THIS:
        self.stop = 1
        if hasattr(self, 'form'):
            self.form.deiconify()
            return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)
        if self.hasCounter:
            ifd.append({'widgetType':Pmw.Counter,
                    'name':'statesCounter',
                    'required':1,
                    'tooltip':'used to show frames via random access',
                    'wcfg':{#'labelpos': 'n,
                         #'label_text':'conformation:  ',
                        'autorepeat':0,
                        'entryfield_value':self.startFrame,
                        #'entryfield_value':self.idList[0],
                        'datatype': self.custom_counter,
                        'entry_width':9,
                        'entryfield_validate': self.custom_validate },
                     'gridcfg':{'sticky':'nesw', 'columnspan':2}})
        ifd.append({'name': 'playB',
            'widgetType': Tkinter.Button,
            'text':'Play',
            'tooltip':'play sequence according to current play mode',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','columnspan':1},
            'command':self.Play_cb})
        ifd.append({'name': 'playRevB',
            'widgetType': Tkinter.Button,
            'text':'Play Reverse',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'command':self.PlayRev_cb})
        ifd.append({'name': 'playTB',
            'widgetType': Tkinter.Button,
            'text':'Play+Return',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','columnspan':1},
            'command':self.PlayReturn_cb})
        ifd.append({'name': 'loopB',
            'widgetType': Tkinter.Button,
            'text':'Loop',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'command':self.Loop_cb})
        ifd.append({'name': 'stopB',
            'widgetType': Tkinter.Button,
            'text':'Stop',
            'tooltip':'stop play',
            'wcfg':{'bd':4,
                    },
            'gridcfg':{'sticky':'nesw'},
            'command':self.Stop_cb})
        #add fastforward, fastrewind, thumbwheel for speed
        ifd.append({'name': 'pauseB',
            'widgetType': Tkinter.Button,
            'text':'Pause',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'command':self.Pause_cb})

        ifd.append({'name': 'closeB',
            'widgetType': Tkinter.Button,
            'text':'Close',
            'wcfg':{'bd':4},
            #'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'gridcfg':{'sticky':'nesw', 'columnspan':2},
            'command':self.Close_cb})
        form = InputForm(self.master, self.root,
                         descr = ifd, modal = 0,
                         blocking = 0,closeWithWindow=1)
        form.ifd = ifd
        if self.hasCounter:
            ctr = ifd.entryByName['statesCounter']['widget']
            entF = ctr.component('entryfield')
            form.ent2 = entF._entryFieldEntry
            da = ctr.component('downarrow')
            ua = ctr.component('uparrow')
            for item in [da,ua]:
                item.bind('<ButtonPress-1>', self.SetState_cb, '+')
            form.ent2.bind('<Return>', self.SetState_cb, '+')
            form.counter = form.ifd.entryByName['statesCounter']['widget']
        form.stopB = form.ifd.entryByName['stopB']['widget']
        form.playB = form.ifd.entryByName['playB']['widget']
        form.playRevB = form.ifd.entryByName['playRevB']['widget']
        #print 'returning form1'
        self.form = form
        return form


    #methods for changing playMode
    def SetMode_cb(self, event=None):
        #print 'SetMode'
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        #play framerate is frame/per second
        if not hasattr(self, 'playModeForm'):
            self.playModeList=[ 'once and stop', 
                                'continuously in 1 direction',
                                'once in 2 directions', 
                                'continuously in 2 directions']
            ifd2 = InputFormDescr(title='Set Play Mode')    
            ifd2.append( {'name': 'playModeLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'play mode options:', 
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name':'playMode',
                        'widgetType': Tkinter.Radiobutton,
                        'defaultValue': self.playModeList[self.playMode],
                        'listtext':self.playModeList,
                        'gridcfg':{'sticky':'w'}})
            ifd2.append( {'name': 'framerateLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'framerate:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'framerateTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'wcfg':{
                        'labcfg':{
                            'fg':'black',
                            'side':'left',
                            'text':'       '
                            },
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':100,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.framerate,
                        'oneTurn':100,
                        'type':'float',
                        'increment':.1,
                        'canvascfg':{'bg':'red'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':1, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw'}})

            ifd2.append( {'name': 'startFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'start frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'startFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'wcfg':{
                        'labcfg':{
                            'fg':'black',
                            'side':'left',
                            'text':'       '
                            },
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':self.endFrame,
                        'lockBMin':0,
                        'lockBMax':1,
                        'lockBIncrement':1,
                        'value':self.startFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':1, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw'}})
            ifd2.append( {'name': 'endFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'end frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'endFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'wcfg':{
                        'labcfg':{
                            'fg':'black',
                            'side':'left',
                            'text':'       '
                            },
                        'showLabel':1, 'width':100,
                        'min':self.startFrame,
                        'max':self.maxFrame,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.endFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':1, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw'}})
            ifd2.append( {'name': 'stepSizeLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'step size:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'stepSizeTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'wcfg':{
                        'labcfg':{
                            'fg':'black',
                            'side':'left',
                            'text':'       '
                            },
                        'showLabel':1, 'width':100,
                        'min':1,
                        'max':1000,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.stepSize,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'canvascfg':{'bg':'blue'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':1, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw'}})
            ifd2.append({'name':'acceptB',
                        'widgetType': Tkinter.Button,
                        'wcfg':{
                            'text': 'ok',
                            'command': self.setPlayMode_cb,
                        },
                        'gridcfg':{'sticky':'nesw'}})
            ifd2.append({'name':'cancelB',
                        'widgetType': Tkinter.Button,
                        'wcfg':{
                            'text': 'cancel',
                            'command': self.cancelPlayMode_cb,
                        },
                        'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            self.playModeForm = InputForm(self.master, self.root,
                        descr = ifd2,
                        modal = 0, blocking = 0)
            self.playModeVar = self.playModeForm.descr.entryByName['playMode']['variable']
            self.framerateWidget = self.playModeForm.descr.entryByName['framerateTW']['widget']
            self.startFrameWidget = self.playModeForm.descr.entryByName['startFrameTW']['widget']
            self.endFrameWidget = self.playModeForm.descr.entryByName['endFrameTW']['widget']
            self.stepSizeWidget = self.playModeForm.descr.entryByName['stepSizeTW']['widget']
        else:
            self.playModeForm.deiconify()
        

    def setPlayMode_cb(self, event=None):
        curVal = self.playModeVar.get()
        self.playMode = self.playModeList.index(curVal)
        #print 'setting playMode to ', curVal
        self.framerate = round(self.framerateWidget.get(),4)
        #print 'setting self.framerate ->', self.framerate
        self.timestamp= 1./self.framerate

        self.startFrame = self.startFrameWidget.get()
        self.endFrame = self.endFrameWidget.get()
        self.stepSize = self.stepSizeWidget.get()
        self.cancelPlayMode_cb()
        self.oneDirection = 0
        

    def cancelPlayMode_cb(self, event=None):
        self.playModeForm.withdraw()


    #methods for counter
    def custom_validate(self, text):
        #print 'in custom_validate, text=', text, ':', text in self.idList
        if not len(text):
            
            return -1
        tt = int(text)
        okList = range(self.startFrame, self.endFrame+1)
        if tt in okList:
            return 1
        else:
            return -1


    def custom_counter(self, text, factor, increment, **kw):
        # text is current content of entry
        # factor is 1 for increment and -1 for decrement
        # increment is value of increment megawidget option
        ###if not text in self.idList:
            ###raise ValueError, text + ' not in current idList'
        #check whether ind+factor is in range
        newval = self.currentFrameIndex + factor
        #print 'newval=', newval
        if newval<0 or newval>self.endFrame:
            #print 'returning ', text
            return text
        else:
            #print 'returning ', self.idList[newval]
            return newval
class geomsChooser:

    def __init__(self,viewer):

        #ViewerGUI(viewer,8,2)
        # the viewe where the geoms are display (for us: pmv or DejaVu)
        if viewer is None:
            return
        self.viewer = viewer
        geomDic = {}
        dpyList = None
        self.assignGeom =[geomDic,dpyList]

 
    def toggleExpansion(self, event):
        # get a 0-based index into list of names
	o = self.lc.lb.nearest(event.y)
        fullName = self.getFullName(o)
	#obj = self.objectByName(self.olist.get(o))
        obj = self.viewer.FindObjectByName(fullName)
	if obj:
            childGeoms = obj.AllObjects()
            if len(childGeoms)==1:  # this geoemtry has no children
                return
            else: # this geometry has children
                if obj.isExpandedInObjectList: self.collapse(obj)
                else: self.expand(obj)

    def expand(self, object):
        # object is a geometry
        if object.isExpandedInObjectList: return
        object.isExpandedInObjectList = 1
        geoms = object.children
        ind = self.objectIndex(object) + 1
        c = self.countParents(object) + 1
        prefix = '~'*c
        for i in range(len(geoms)):
            g = geoms[i]
            if g==object: continue
            if not g.listed: continue
            if len(g.vertexSet) == 0 and len(g.children)==0:continue
            self.lc.insert(ind, prefix + g.name)
            ind = ind + 1

            
    def collapse(self, object):
        # object is a geometry, we recursively collapse the sub-tree
        object.isExpandedInObjectList = 0

        # delete the names from the bject list widget
        nbChildren = self.countDecendentsInWidget(object)
        ind = self.objectIndex(object) + 1
        for i in range(ind, ind+nbChildren):
            self.lc.lb.delete(ind)
        # toggle isExpandedInObjectList for all descendents
        for child in object.AllObjects():
            if child.listed:
                child.isExpandedInObjectList = 0

    def countDecendentsInWidget(self, object):
        # object is a geometry, we count and return the number of 
        # decendents shown in widget
        ind = self.objectIndex(object)
        allNames = self.lc.lb.get(0,'end')
        nbTild = string.count(allNames[ind],'~')+1
        # count children in widget
        nbChildren = 0
        for i in range(ind+1, len(allNames)):
            nbt = string.count(allNames[i],'~')
            if nbt >= nbTild:
                nbChildren = nbChildren + 1
            else:
                break
        return nbChildren

        
    def getFullName(self, ind):
        # strip the leading ~
        allNames = self.lc.lb.get(0,'end')
        nbTild = string.count(allNames[ind],'~')
        fullName = allNames[ind][nbTild:]
        for i in range(ind-1, -1, -1):
            nbt, name = self.lstripChar(allNames[i], '~')
            if nbt >= nbTild: continue
            nbTild = nbt
            fullName = name + '|' + fullName
        return fullName

    def objectIndex(self, object):
        # object is a geometry and we find this object's index in the list of
        # names displayed in te widget. If the ibecjt is not shown we
        # return -1
        l = self.lc.lb.get(0,'end')
        for i in range(len(l)):
            indent, n = self.lstripChar(l[i], '~')
            if n==object.name: break
        if i==len(l): return -1
        else: return i

    def lstripChar(self, name, char):
	n = string.count(name,'~')
	return n, name[ n : ]

    def countParents(self, object):
	c = 0
	while object.parent:
	    c = c+1
	    object = object.parent
	return c

    def addObject(self, obj, parent):
        if not obj.listed: return
	if not parent:
	    self.lc.insert(0,obj.name)
	    self.lc.select(obj.name)
	else:
            if not parent.isExpandedInObjectList: return
                
            i = self.objectIndex(parent)
	    if i==-1: return
	    c = self.countParents(obj)
            prefix = '~'*c
	    name = prefix + obj.name
            # now we need to skip all children already there
            l = self.lc.lb.get(0,'end')
            while 1:
                i = i + 1
                if i==len(l): break
                if self.lc.get(i)[:c]!=prefix: break

	    self.lc.insert(i, name)

    def getFullNameList(self,name,list,dic):
        """ get the list of fullName from geomDic """

        for p in dic.keys():
            name1 = name +'|'+p
            if dic[p] != {}:
                list = self.getFullNameList(name1,list,dic[p])
            else:
                list.append(name1)
                
        return list
    

    def getDpyList(self,objects):
        """function to obtain a display list for any object in DejaVu"""
        from opengltk.OpenGL import GL
        # Draw build a display function that contains global coloring,
        # transformation nd all global GL properties of this objects.
        # we cannot use the object's display list that does not contains this
        # info
        #if len(objects) == 1 and objects[0].dpyList:
        #    return objects[0].dpyList
        # transparent object need to be drawn last

        # reorder object so transparent object drawn last
        transparent =[]
        opaque = []
        for obj in objects:
            if obj.transparent: #obj.isTransparent():
                transparent.append(obj)
            else:
                opaque.append(obj)
        objlist = opaque + transparent
        
        lNewList = GL.glGenLists(1)
        #print "lNewList geomsChooser.getDpyList", lNewList, self.name
        dpyList = ( lNewList,
                   self.viewer.currentCamera.tk.call(self.viewer.currentCamera._w, 'contexttag')
                  )

        camera = self.mv.GUI.VIEWER.currentCamera
        camera.Activate()

        GL.glNewList(dpyList, GL.GL_COMPILE)
        #print "geomChooser 208", GL.glGetIntegerv(GL.GL_LIST_INDEX)
        for obj in objlist:
            if obj.immediateRendering: # or obj.hasChildWithImmediateRendering:
                camera.drawMode=5
                camera.Draw(obj)
            else:
                camera.drawMode=2
                camera.drawTransparentObjects = 0
                camera.hasTransparentObjects = 0
                # draw opaque object
                for m in obj.instanceMatricesFortran:
                    GL.glPushMatrix()
                    GL.glMultMatrixf(m)
                    if len(obj.children):
                        map( camera.Draw, obj.children)
                    else:
                        camera.Draw(obj)
                    GL.glPopMatrix()
                
                # draw transparent children of object
                if camera.hasTransparentObjects:
                    camera.drawTransparentObjects = 1
                    for m in obj.instanceMatricesFortran:
                        GL.glPushMatrix()
                        GL.glMultMatrixf(m)
                        map( camera.Draw, obj.children)
                        GL.glPopMatrix()
                # draw transparent object that do not have children
                if obj.isTransparent() and not len(obj.children):
                    camera.drawTransparentObjects =1
                    for m in obj.instanceMatricesFortran:
                        GL.glPushMatrix()
                        GL.glMultMatrixf(m)
                        camera.Draw(obj)
                        GL.glPopMatrix()
                    

        GL.glEndList()    
        return dpyList

    def buildForm(self):
        ifd = InputFormDescr(title=self.ftitle)
        ifd.append({'widgetType':ListChooser,
                    'name':'availableGeom',
                    'tooltip':'geom available in viewer',
                    'wcfg':{'mode':'extended',
                            'lbwcfg':{'exportselection':1},
                            'command':[(self.toggleExpansion,'<Double-Button-1>')],
                            'commandEvent':None,
                            'title':'availableGeom'},
                    
                    'gridcfg':{'row':0,'column':0,
                               'sticky':'wens','rowspan':3}})
        
        ifd.append({'name':'add',
                    'widgetType':Tkinter.Button,
                    'tooltip':""" Add the selected geom to selected frame""",
                    'wcfg':{'text':'>>','command':self.add_cb},
                    'gridcfg':{'row':1,'column':1,'rowspan':1 }})
        
        ifd.append({'name':'remove',
                    'widgetType':Tkinter.Button,
                    'tooltip':""" remove the selected geom to selected """,
                    'wcfg':{'text':'<<','command':self.remove_cb},
                    'gridcfg':{'row':2,'column':1,'rowspan':1 }})
            
        ifd.append({'name':'toload',
                    'widgetType':ListChooser,
                    'tooltip':"""list of geom  the user chose to
                    apply to the pattern""",
                    'wcfg':{
            'mode':'extended',
            'lbwcfg':{'exportselection':0},
            'title':self.lc2title},
                    'gridcfg':{'sticky':'we', 
                               'row':0, 'column':2,'rowspan':3}})
        ifd.append({'name':'clear',
                    'widgetType':Tkinter.Button,
                    'tooltip':""" Clear entry """,
                    'wcfg':{'text':'Clear','width':10,
                            'command':self.clear_cb},
                    'gridcfg':{'sticky':'we','row':0, 'column':3}})
        ifd.append({'name':'remove',
                    'widgetType':Tkinter.Button,
                    'tooltip':""" remove the selected geom to selected """,
                    'wcfg':{'text':'<<','command':self.remove_cb},
                    'gridcfg':{'row':2,'column':1,'rowspan':1 }})
        return ifd
        
    def showForm(self,master,geomDic=None,func=None):
        """create formdescr for setGeoms
        geomDic = a dict of Geom 
        """
        # assign a func so we can log it in Pmv
        # func is a Pmv command
        if func:
            self.assign_func = func
            
        if geomDic:
            self.assignGeom[0]=geomDic
            
        if hasattr(self,'form'):
            if self.guiOn:
                return
            else:
                self.update_lc2()
                self.form.deiconify()
                val = self.form.go()
               
                if val:
                    geomDic =self.assignGeom[0] 
                    self.assign_func(geomDic)
                    self.form.withdraw()
        else:
            if not master:
                master = Tkinter.Toplevel()
                master.title('GeomChooser')
            else:
                master = master

            ifd = self.buildForm()
            self.form = InputForm(master,None,descr=ifd,
                                  scrolledFrame=0,
                                  cancelCfg={'command':self.cancel_cb})
                
            self.lc = self.form.descr.entryByName['availableGeom']['widget']
            self.lc2 = self.form.descr.entryByName['toload']['widget']
            self.addObject(self.viewer.rootObject,None)
            self.update_lc2()
            val = self.form.go()
            if val:
                geomDic =self.assignGeom[0] 
                self.assign_func(geomDic)
                self.form.withdraw()
                
    def cancel_cb(self,event = None, func=None):
        """ close setup animation form without setting anything"""
        if hasattr(self,'geomDicCopy'):
            self.patDic = self.patDicCopy.copy()
        
    def add_cb(self):
        lgeom=[]
        geomDic = self.assignGeom[0]
        # get geom name to load
        o = map(int,self.lc.lb.curselection())
        for Ind in o:
            fullName = self.getFullName(Ind)
            obj = self.viewer.FindObjectByName(fullName)
            # strip the root
            l = string.split(fullName,'|')[1:]
            for i in range(len(l)):
                if i==0:
                    if not geomDic.has_key(l[i]):
                        dic = geomDic[l[i]]={}
                    else:
                        dic = geomDic[l[i]]
                else:
                    if not dic.has_key(l[i]):
                        dic[l[i]]={}
                        
                    dic = dic[l[i]]
            
        self.update_lc2()

    def insertValue(self,ind,prefix,dic):
        """ insert Value of a dictionnary in the listchooser2"""
        for key in dic.keys():
            if dic[key] == {}:
                ind = ind+1
                self.lc2.insert(ind, prefix+key)
            else:
                ind =ind +1
                self.lc2.insert(ind, prefix+key)
                p = prefix + '~'
                ind=self.insertValue(ind,p,dic[key])
        return ind
        
    def update_lc2(self):
        """ update listchooser entries display"""

        # save current entry selected
        sel  = self.lc2.get()
        prefix = '~'
        self.lc2.clear()
        ind = 0
        geomDic = self.assignGeom[0]
        ind = self.insertValue(ind,prefix,geomDic)

        # select the entry save as sel
        # keep the entry selected after the update
        for i in sel:
            self.lc2.select((i,))

    def findParentMol(self,index):
        """ find the parent value name from a geom ~~
        go up to find first value with onley ~ """
        parent = None
        for i in range(index+1):
            parent = self.lc2.entries[index -i][0]
            if parent[0] == '~' and parent[1] !='~':
                parent = parent[1:]
                return parent
        return  None
         
    def remove_cb(self):
        """ remove entry in litschooser (geomtoload)"""
        geomDic = self.assignGeom[0]
        selindex = self.lc2.getInd()
        for index in selindex:
            value = self.lc2.entries[index][0]
           
            if value[1] == '~':
                mol = self.findParentMol(index)
                rindex = geomDic[mol].index(value[2:])
                del geomDic[mol][rindex]
            else:
                mol = value[1:]
                del geomDic[mol]
        self.update_lc2()

    def clear_cb(self):
        """ clear all entry """
        self.lc2.clear()
        if  self.assignGeom:
            self.assignGeom[0] = {} # geomDic
            self.assignGeom[1] = None # dpyList
示例#35
0
    def buildForm2(self, titleStr):
        self.stop = 1
        if hasattr(self, 'form'):
            if hasattr(self.form, 'deiconify'):
                self.form.deiconify()
                return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)
        ifd.append({'name': 'gotoStartB',
            'widgetType': Tkinter.Button,
            #'text':'gotoStart',
            'tooltip':'sets frame to current startFrame',
            'wcfg':{'bd':4,
                    'image':self.gotoStartIcon,
                    'width':self.gotoStartIcon.width(),
                    'height':self.gotoStartIcon.height()
            },
            'gridcfg':{'sticky':'nesw'},
            'command':self.GoToStart_cb})
        ifd.append({'name': 'fastReverseB',
            'widgetType': Tkinter.Button,
            #'text':'fastReverse',
            'tooltip':'play reverse as fast as possible',
            'wcfg':{'bd':4,
                    'image':self.ff_revIcon,
                    'width':self.ff_revIcon.width(),
                    'height':self.ff_revIcon.height()
            },
            'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1},
            'command':self.FastReverse_cb})
        ifd.append({'name': 'playRevB',
            'widgetType': Tkinter.Button,
            #'text':'Play Reverse',
            'tooltip':'play reverse according to current play mode',
            'wcfg':{'bd':4,
                    'image':self.playRevIcon,
                    'width':self.playRevIcon.width(),
                    'height':self.playRevIcon.height()},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':2},
            'command':self.PlayRev_cb})
        if self.hasCounter:
            ifd.append({'widgetType':Pmw.Counter,
                    'name':'statesCounter',
                    'required':1,
                    'tooltip':'used to show frames via random access',
                    'wcfg':{#'labelpos': 'n,
                         #'label_text':'conformation:  ',
                        'autorepeat':0,
                        'entryfield_value':self.startFrame,
                        #'entryfield_value':self.idList[0],
                        'datatype': self.custom_counter,
                        'entry_width':3,
                        'entryfield_validate': self.custom_validate },
                     'gridcfg':{'sticky':'nesw', 'row':-1, 'column':3,'columnspan':2}})
        ifd.append({'name': 'playB',
            'widgetType': Tkinter.Button,
            #'text':'Play',
            'tooltip':'play forward according to current play mode',
            'wcfg':{'bd':4,
                    'image':self.playIcon,
                    'width':self.playIcon.width(),
                    'height':self.playIcon.height()
            },
            'gridcfg':{'sticky':'nesw', 'row':-1, 'column':5},
            'command':self.Play_cb})
        ifd.append({'name': 'fastForwardB',
            'widgetType': Tkinter.Button,
            #'text':'fastForward',
            'tooltip':'play as fast as possible',
            'wcfg':{'bd':4,
                    'image': self.ff_fwdIcon,
                    'width':self.ff_fwdIcon.width(),
                    'height':self.ff_fwdIcon.height()
                    },
            'gridcfg':{'sticky':'nesw','row':-1, 'column':6},
            'command':self.FastForward_cb})
        ifd.append({'name': 'gotoEndB',
            'widgetType': Tkinter.Button,
            #'text':'gotoEnd',
            'tooltip':'sets frame to current endFrame',
            'wcfg':{'bd':4,
                    'image':self.gotoEndIcon,
                    'width':self.gotoEndIcon.width(),
                    'height':self.gotoEndIcon.height()
            },
            'gridcfg':{'sticky':'nesw','row':-1, 'column':7},
            'command':self.GoToEnd_cb})
        ifd.append({'name': 'modeB',
            'widgetType': Tkinter.Button,
            'text':'Change Mode',
            'tooltip':'opens panel to change play options',
            'wcfg':{'bd':4,
                    'image':self.chmodIcon,
                    'width':self.chmodIcon.width(),
                    'height':self.chmodIcon.height()
                    },
            'gridcfg':{'sticky':'nesw','row':-1, 'column':8},
            'command':self.SetMode_cb})

        ifd.append({'name': 'setanimB',
            'widgetType': Tkinter.Button,
            'text':'SetAnim',
            'tooltip':'Set Animation',
            'wcfg':{'bd':4},
            'gridcfg':{'sticky':'nesw','row':-1, 'column':9},
            'command':self.SetAnim_cb})
        
        ifd.append({'name': 'closeB',
            'widgetType': Tkinter.Button,
            'text':'Close',
            'tooltip':'closes player',
            'wcfg':{'bd':4,
                    'image':self.closeIcon,
                    'width':self.closeIcon.width(),
                    'height':self.closeIcon.height(),
                    },
            'gridcfg':{'sticky':'nesw','row':-1, 'column':10},
            #'gridcfg':{'sticky':'nesw', 'columnspan':2},
            'command':self.Close_cb})
        if self.hasSlider:
            ifd.append({'name': 'slider',
                'widgetType': Tkinter.Scale,
                'wcfg':{'orient':'horizontal',
                        'from_':self.startFrame,
                        'to':self.maxFrame,
                        'showvalue':False},
                'gridcfg':{'sticky':'nesw','row':1, 'column':0, 'columnspan':11},
                'command':self.nextFrame
                })        
        #form = self.vf.getUserInput(ifd, modal=0,blocking=0)
        form = InputForm(self.master, self.root,
                         descr = ifd,
                         modal = 0, blocking = 0,
                         closeWithWindow=1)
        form.ifd = ifd
        form.playB = form.ifd.entryByName['playB']['widget']
        form.playRevB = form.ifd.entryByName['playRevB']['widget']
        #set up link to balloon help which needs to change, also
        form.playTT = form.ifd.entryByName['playB']['balloon']
        form.playRevTT = form.ifd.entryByName['playRevB']['balloon']
        if self.hasCounter:
            ctr = ifd.entryByName['statesCounter']['widget']
            entF = ctr.component('entryfield')
            form.ent2 = entF._entryFieldEntry
            da = ctr.component('downarrow')
            ua = ctr.component('uparrow')
            for item in [da,ua]:
                item.bind('<ButtonPress-1>', self.SetState_cb, '+')
            form.ent2.bind('<Return>', self.SetState_cb, '+')
            form.counter = form.ifd.entryByName['statesCounter']['widget']
        #print 'returning form'
        return form
    def showForm(self):
        """create formdescr for setAnim
        form to set the animation:
        each frame is a list of geom to display
        """

        entryFrame = []
        for i in range(len(self.framelist)):
            val = 'frame_'+str(i)
            entryFrame.append((val,))
        
        if not hasattr(self,'form_Setanim'):
            ifd = InputFormDescr(title="SetAnimation")
            ifd.append({'widgetType':ListChooser,
                        'name':'availableGeom',
                        'tooltip':'geom available in viewer',
                        'wcfg':{'mode':'extended',
                                'lbwcfg':{'exportselection':1},
                                'command':[(self.toggleExpansion,'<Double-Button-1>')],
                                'commandEvent':None,
                                'title':'availableGeom'},
                        
                        'gridcfg':{'row':0,'column':0,
                                   'sticky':'wens','rowspan':3}})
            ifd.append({'name':'newframe',
                        'widgetType':Tkinter.Button,
                        'tooltip':""" Add an empty frame to the animation""",
                        'wcfg':{'text':'NewFrame','command':self.addframe_cb},
                        'gridcfg':{'row':0,'column':1,'rowspan':1 }})
            
            ifd.append({'name':'add',
                        'widgetType':Tkinter.Button,
                        'tooltip':""" Add the selected geom to selected frame""",
                        'wcfg':{'text':'AddGeom','command':self.add_cb},
                        'gridcfg':{'row':1,'column':1,'rowspan':1 }})
            
            ifd.append({'name':'geomtoload',
                        'widgetType':ListChooser,
                        'tooltip':"""list of frame  the user chose to
                        apply to the pattern""",
                        'wcfg':{'entries':entryFrame,
                                'mode':'extended',
                                'lbwcfg':{'exportselection':0},
                                'title':'Frame(geom) to be display'},
                        'gridcfg':{'sticky':'we', 
                                   'row':0, 'column':2,'rowspan':3}})
            ifd.append({'name':'remove',
                        'widgetType':Tkinter.Button,
                        'tooltip':""" Remove the selected entry from the
                        commands to be applied to the object when loaded in the application""",
                        'wcfg':{'text':'REMOVE','width':10,
                                'command':self.remove_cb},
                        'gridcfg':{'sticky':'we','row':0, 'column':3}})
            
            ifd.append({'name':'oneup',
                        'widgetType':Tkinter.Button,
                        'tooltip':"""Move the selected entry up one entry""",
                        'wcfg':{'text':'Move up','width':10,
                                'command':self.moveup_cb},
                        'gridcfg':{'sticky':'we','row':1,'column':3}})
            
            ifd.append({'name':'onedown',
                        'widgetType':Tkinter.Button,
                        'tooltip':"""Move the selected entry down one entry""",
                        'wcfg':{'text':'Move down','width':10,
                                'command':self.movedown_cb},
                        'gridcfg':{'sticky':'we','row':2,'column':3}})

            self.form_Setanim = InputForm(self.master,None,descr=ifd,
                                  scrolledFrame=0)
            
            
            self.lc = self.form_Setanim.descr.entryByName['availableGeom']['widget']
            self.lc2 = self.form_Setanim.descr.entryByName['geomtoload']['widget']
            self.addObject(self.viewer.rootObject,None)
            val = self.form_Setanim.go()
            if val:
                self.assign()
                self.form_Setanim.withdraw()
        else:
            self.form_Setanim.deiconify()
            val = self.form_Setanim.go()
            if val:
                self.assign()
                self.form_Setanim.withdraw()
示例#37
0
class TrajPlayer(Player):
    """ a GUI to play a trajectory. The class constructor takes a Trajectory object and
        a correspoonding molecule as arguments."""
    
    def __init__(self, mol, traj, vf, titleStr=None, sequenceList=None,
                        idList = None, delta=0, form2=1,
                        ask=1, **kw):
        
        self.mol = mol
        self.traj = traj
        self.startFrame = 0
        self.ask = ask
        mol.allAtoms.addConformation(mol.allAtoms.coords[:])
        self.coordSlot = len(mol.allAtoms[0]._coords) - 1
        self.update(sequenceList, idList)
        kw['master'] = None
        if vf.hasGui :
            kw['master'] = vf.GUI.ROOT
        kw['endFrame'] = self.endFrame
        kw['maxFrame'] = self.endFrame
        kw['form2'] = form2
        kw['titleStr'] = titleStr
        self.vf = vf
        if self.vf.hasGui :
            apply(Player.__init__, (self,), kw)
        try:
            self.form.ifd.entryByName['setanimB']['widget'].grid_forget()
            #print 'withdrew SetAnim button'
            self.form.autoSize()
        except:
            pass

    def update(self, sequenceList=None, idList=None):
        if not sequenceList:
            self.sequenceList = range(len(self.traj.coords))
            #self.sequenceList = self.traj.coords.keys()
        else :
            self.sequenceList = sequenceList
        lenSeq = len(self.sequenceList)
        self.maxFrame = lenSeq
        self.endFrame = lenSeq
        if self.startFrame>lenSeq:
            self.startFrame = 0

        if hasattr(self, 'playModeForm'):
            e = self.playModeForm.descr.entryByName
            endTW = e['endFrameTW']['widget']
            #print 'setting endTW to ', self.endFrame
            endTW.max = self.endFrame
            endTW.set(self.endFrame)
            startTW = e['startFrameTW']['widget']
            startTW.set(self.startFrame)
        if not idList:
            #insert 0 for original state
            idL = range(0, len(self.sequenceList) + 1)
            self.idList = map(str, idL)
        else:
            self.idList = map(str, idList)
        #print "self.idList", self.idList
        
        if hasattr(self, 'form'):
            if hasattr(self.form, 'ent2'):
                newLen = max(map(len, self.idList))
                if newLen>3:
                    #print 'update:updating ent2 width'
                    self.form.ent2.config(width=newLen)
                self.form.ent2.delete(0,'end')
                #could use startFrame if it is valid here:
                if self.startFrame<=len(self.sequenceList) and self.startFrame>0:
                    next_val = str(self.idList[self.startFrame])
                    self.form.ent2.insert(0, next_val)
                    self.currentFrameIndex = self.startFrame
                    self.applyState(self.startFrame-1)
                else:
                    #print "restarting from frame =", self.idList[0]
                    #print self.startFrame, ": index out of range for ", sequenceList, "; resetting startFrame to  0"
                    self.form.ent2.insert(0, str(self.idList[0]))
                    #this calls applyState with reset flag
                    self.applyState(-1)


    def applyState(self, ind):
        """None<-applyState(ind)"""
        mol = self.mol
        # -1 is key for go back to original
        if int(ind)==-1:
            mol.allAtoms.setConformation(0)
            conf = None
        else:
            #in this case want to get new coords
            #coords = self.traj.coords["frame%d"%ind]
            coords = self.traj.coords[ind]
            coordsarr = (Numeric.array(coords)*10).astype("f")
            allAtoms = self.mol.allAtoms
            allAtoms.updateCoords(coordsarr[:], self.coordSlot)

        if not self.vf.hasGui: return
        event = EditAtomsEvent('coords', mol.allAtoms)
        self.vf.dispatchEvent(event)
        #modEvent = ModificationEvent('edit','coords', mol.allAtoms)
        #mol.geomContainer.updateGeoms(modEvent)
        self.vf.GUI.VIEWER.Redraw()
        #self.showStats()


   


    def SetMode_cb(self, event=None):
        #print 'SetMode'
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        #play framerate is frame/per second
        if not hasattr(self, 'playModeForm'):
            self.showPlayMode = Tkinter.IntVar()
            self.showFrameParmWidgets = Tkinter.IntVar()
            self.playModeVar = Tkinter.StringVar()
            self.playModeVar.set('once and stop')
            self.playModeList=[ 'once and stop', 
                                'continuously in 1 direction',
                                'once in 2 directions', 
                                'continuously in 2 directions']
            self.frameParmsList=[ 'framerateLabel','framerateTW','startFrameLabel', 
                                  'startFrameTW', 'endFrameLabel', 'endFrameTW', 
                                  'stepSizeLabel', 'stepSizeTW']

            #self.showListVar = Tkinter.IntVar()
            ifd2 = InputFormDescr(title='Set Play Options')    
            ## ifd2.append({'name':'selectCB',
##                 'widgetType': Tkinter.Checkbutton,
##                 'tooltip':'show ids of current ordered conformation list',
##                 'wcfg':{ 'text':'Show Conf List',
##                         #'command': self.showStatesList,
##                         #'variable': self.showListVar,
##                        },
##                 'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})
##                 #'gridcfg':{'sticky':'ew'}})
            ifd2.append({'name':'playModeMb',
                'widgetType': Tkinter.Menubutton,
                'tooltip':'set play mode choice',
                'wcfg':{ 'text':'Play Mode',
                       },
                'gridcfg':{'sticky':'we'}})
                #'gridcfg':{'sticky':'w', 'columnspan':2}})
            ifd2.append({'name':'adjustFrameParmsMb',
                'widgetType': Tkinter.Checkbutton,
                'tooltip':'opens panel to set play rate, start conf number, end conf number \nand step size for playing conf sequence',
                'wcfg':{ 'text':'Play Parameters',
                        'command': self.showFrameParms_cb,
                        'variable': self.showFrameParmWidgets,
                       },
                'gridcfg':{'sticky':'w', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'framerateLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'frame rate:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'framerateTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set max num of confs to be displayed per second',
                    'wcfg':{'labCfg':{'fg':'black', 'side':'left', 'text':''},
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':100,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.framerate,
                        'oneTurn':100,
                        'type':'float',
                        'increment':.1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'red'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'startFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'start frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'startFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set number of first conf to be displayed',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':self.endFrame,
                        'lockBMin':0,
                        'lockBMax':1,
                        'lockBIncrement':1,
                        'value':self.startFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'ew', 'row':-1,  'column':1}})
            ifd2.append( {'name': 'endFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'end frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'endFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set number of last conf to be displayed',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':self.startFrame,
                        'max':self.maxFrame,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.endFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'stepSizeLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'step size:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'stepSizeTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set step before next conf number: default is 1',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':1,
                        'max':1000,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.stepSize,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'blue'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append({'name':'buildB',
                'widgetType': Tkinter.Button,
                'tooltip':'build a new molecule with current conf coords\nand add it to viewer',
                'wcfg':{ 'text':'Build Current',
                        'command': self.Build_cb,
                       },
                'gridcfg':{'sticky':'we'}})
                #'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})

            ifd2.append({'name':'writeB',
                'widgetType': Tkinter.Button,
                'tooltip':'write a new file with current conf coords',
                'wcfg':{ 'text':'Write Current',
                        'command': self.Write_cb,
                       },
                #'gridcfg':{'sticky':'we'}})
                'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})         

            ifd2.append({'name':'cancelB',
                        'widgetType': Tkinter.Button,
                        'wcfg':{
                            'text': 'Close',
                            'command': self.cancelPlayMode_cb,
                        },
                        #'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})
                        'gridcfg':{'sticky':'ew','columnspan':2}}),
            self.playModeForm = InputForm(self.master, self.root,
                        descr = ifd2,
                        modal = 0, blocking = 0)
            self.framerateWidget = ifd2.entryByName['framerateTW']['widget']
            self.startFrameWidget = ifd2.entryByName['startFrameTW']['widget']
            self.endFrameWidget = ifd2.entryByName['endFrameTW']['widget']
            self.stepSizeWidget = ifd2.entryByName['stepSizeTW']['widget']
            self.frameParmCfgs = []
            self.frameParmWidgets = []
            for i in self.frameParmsList:
                ent = ifd2.entryByName[i]
                self.frameParmCfgs.append(ent['gridcfg'])
                self.frameParmWidgets.append(ent['widget'])
            self.playModeMb = ifd2.entryByName['playModeMb']['widget']
            self.playModeMb.bind('<ButtonPress>', self.buildPlayModeMenu, add='+')
            self.showFrameParms_cb()
            #self.showList = ifd2.entryByName['selectCB']['widget']
        else:
            self.playModeVar.set(self.playModeList[self.playMode])
            self.framerateWidget.set(self.framerate)
            self.startFrameWidget.set(self.startFrame)
            self.endFrameWidget.set(self.endFrame)
            self.stepSizeWidget.set(self.stepSize)
            self.playModeForm.deiconify()
        self.playModeForm.autoSize()

    def buildPlayModeMenu(self, event=None):
        mB = self.playModeMb
        keyList = self.playModeList
        if not self.showPlayMode.get():
            #mB.config(bg='white')
            if not hasattr(mB, 'menu'):
                mB.menu = Tkinter.Menu(mB)
                mB['menu'] = mB.menu
            else:
                mB.menu.delete(1, 'end')
            for i in range(len(keyList)):
                mB.menu.add_radiobutton(label=keyList[i], var=self.playModeVar, 
                            value=keyList[i], command=self.setMode_cb)
            self.showPlayMode.set(1)
        else:
            mB.menu.unpost()
            self.showPlayMode.set(0)
            
    def showFrameParms_cb(self, event=None):
        if not self.showFrameParmWidgets.get():
            for w in self.frameParmWidgets:
                w.grid_forget()
        else:
            for i in range(len(self.frameParmWidgets)):
                w = self.frameParmWidgets[i]
                cfg = self.frameParmCfgs[i]
                w.grid(cfg)
        self.playModeForm.autoSize()

    def setMode_cb(self, event=None):
        curVal = self.playModeVar.get()
        #print 'setting playMode to ', curVal
        self.playMode = self.playModeList.index(curVal)
        #print 'setting playMode to ', curVal
        self.framerate = round(self.framerateWidget.get(),4)
        #print 'setting self.framerate ->', self.framerate
        self.timestamp= 1./self.framerate
        self.startFrame = self.startFrameWidget.get()
        self.endFrame = self.endFrameWidget.get()
        #print 'set endFrame to', self.endFrame
        self.stepSize = self.stepSizeWidget.get()
        self.playMode = self.playModeList.index(curVal)
        #i think this restarts the player's trip memory
        #that is, hasn't gone in any direction yet
        self.oneDirection = 0
        if not self.stop:
            self.stop = 1
            self.play(self.framerate)

            

    def setPlayMode_cb(self, event=None):
        self.setMode_cb()
        self.cancelPlayMode_cb()
        self.oneDirection = 0
        

    def SetRMSRef_cb(self, event=None):
        print 'in SetRMSRef_cb'
        return


    def Build_cb(self, event=None):
        #print building current
        """None<-Build_cb(mol, event=None)

        builds new molecule with current coordinates and adds it to the viewer
        """
        #FIRST CHECK THAT THIS HASN'T already been built
        #get the current counter content for name of new molecule
        #w = self.form.ifd.entryByName['statesCounter']['widget']
        numStr = self.form.counter.get()
        #numStr = w.get()
        #remember idList has '0' always added at the beginning for input conf
        confInd =  self.idList.index(numStr) - 1
        #CHECK THIS IS CORRECT!!!
        conf = self.sequenceList[confInd]
        self.buildConf(conf, numStr)


    def buildConf(self, conf, nameStr):
        newname = self.mol.name + '_conf_' + nameStr
        if newname in self.vf.Mols.name:
            msg = newname + ' already in viewer. Not building a second copy'
            self.vf.warningMsg(msg)
            return 'ERROR'
        allLines = self.mol.parser.allLines
        newLines = []
        coords = self.mol.allAtoms.coords
        natoms = len(coords)
        ctr = 0
        parser = self.mol.parser.__class__()
        if isinstance(parser, groParser):
            newLines.append(allLines[0])
            newLines.append(allLines[1])
            for l in allLines[2:natoms+2]:
                cc = coords[ctr]/10
                newLines.append(l[:20] +'%8.3f%8.3f%8.3f'%(cc[0],cc[1],cc[2])+ l[44:])
                ctr = ctr+1
            for l in allLines[natoms+2:]:
                newLines.append(l)
        else:
            for l in allLines:
                if find(l, 'ATOM')==0 or find(l, 'HETA')==0:
                    cc = coords[ctr]
                    newLines.append(l[:30] +'%8.3f%8.3f%8.3f'%(cc[0],cc[1],cc[2])+ l[54:])
                    ctr = ctr+1
                else:
                    newLines.append(l)
        
        parser.allLines = newLines
        filename = parser.filename = self.mol.parser.filename + '_conf_' + nameStr
        newMol = parser.parse()[0]          
        newMol.name = newname
        newMol = self.vf.addMolecule(newMol, ask=self.ask)


    def Write_cb(self, event=None):
        #print writing current
        """None<-Write_cb(mol, event=None)
        writes a new file with current coordinates
        """
        filename = self.vf.askFileSave(types=[('pdb files','*.pdb'),('pdbq files', '*.pdbq'),
                        ('pdbqt files', '*.pdbqt'), ('.gro. files', '*.gro'), ("all", "*")], 
                        title="write current conf:")
        if filename is not None:
            self.write_conf(filename)



    def write_conf(self, filename):       
            fptr = open(filename, 'w')
            ctr = 0
            liglines = self.mol.parser.allLines
            coords = self.mol.allAtoms.coords
            natoms = len(coords)
            if isinstance(self.mol.parser, groParser):
                fptr.write(liglines[0])
                fptr.write(liglines[1])
                for l in liglines[2:natoms+2]:
                    cc = coords[ctr]/10
                    fptr.write(l[:20] +'%8.3f%8.3f%8.3f'%(cc[0],cc[1],cc[2])+ l[44:])
                    ctr +=1
            for l in liglines[natoms+2:]:
                fptr.write(l)
            else:
                for l in liglines:
                    if l.find("ATOM")!=0 and l.find("HETATM")!=0:
                        l += "\n"
                        fptr.write(l)
                    else:
                        crds = coords[ctr] 
                        rec = "%s%8.3f%8.3f%8.3f%s\n"%(l[:30],crds[0], crds[1], crds[2],l[54:] ) 
                        fptr.write(rec)
                        ctr += 1
            fptr.close()
示例#38
0
class Player(Tkinter.Frame):
    """Widget to play sequence of frames.
    The GUI allows to specify direction and speed of playback.

    the nextFrame(number) methoid should be overridden and define how
    this player plays the animation
    
    the root constructor argument can be a Tkinter container in which to
    embde the control panel.
    
    required attributes:
        currentFrameIndex = 0
        startFrame = 0
        endFrame = 0
        maxFrame = 0
        stepSize = 1
        target = endFrame           #determines direction of play
        increment = 1               #implements decrementing vs incrementing
                                    #  in getNextFrameIndex
        playMode = 0                #playMode options:
                                    #   0   play once and stop
                                    #   1   play continuously in 1 direction
                                    #   2   play once in 2 directions
                                    #   3   play continuously in 2 directions
        framerate =15.              # number of frame per second to be display
        hasSlider = False           #adds Tkinter Scale Widget if True

    customization attributes:
        buttonMask is a dictionary that provides a button name as a key and
        a boolean as a value. For each button in the GUI if the name appears
        in self.buttonMask and the value is False the button willnot be
        addded. This only works when form2 is true. slider and counter
        are handle by the hasSlider and coutner keyword arguments

    required methods:
    #play methods:
        play                           #play according to play mode
        getNextFrameIndex              #returns index of next frame to
                                        play according to current index
                                        and playMode
        nextFrame                      #actually display the nextFrame
                                        ??possibly update widgets???

    #methods to regulate play
        Play_cb                        #play according to playMode
        PlayRev_cb                     #play backwards  
        FastForward_cb()               #play foward at max speed
        FastReverse_cb()               #play reverse at max speed
        Stop_cb                        #stop current play
        ?Pause_cb                      #stop at current frame??
        ?Loop_cb                       #???????


    #methods to set Frame to a specific frame
        SetState_cb                    #counter callback for random access
        GoToStart_cb                   #set to current startFrame
        GoToEnd_cb                     #set to current endFrame
        ?setCurrentFrameIndex          #set currentframe index???


    #methods for player gui
        showGUI                        #show the gui
        buildForm2                     #opens image-based gui
        buildForm                      #opens text-based gui
        Close_cb                       #withdraws gui

    #methods for pmw counter
        custom_validate                #used by pmw to check entry
        custom_counter                 #used by pmw for counter


    #methods for changing playMode
        SetMode_cb                     #opens playModeForm
        setPlayMode_cb                 #sets playMode, sets delay,
                                          startFrame, endFrame 
                                          AND closes playModeForm
        cancelPlayMode_cb              #closes playModeForm w/out changes

        #methods for end points:
            setStartFrame()            #set startFrame
            setEndFrame()              #set endFrame
            setStepSize()              #sets increment, def=1
        additional methods:
    """
    def __init__(
            self,
            master=None,
            root=None,
            height=80,
            width=200,
            currentFrameIndex=0,
            startFrame=0,
            endFrame=0,
            maxFrame=0,
            stepSize=1,
            playMode=0,
            ##afterDelay=50,
            titleStr='Player',
            gotoStartfile='go_to_start.gif',
            gotoEndfile='go_to_end.gif',
            ff_revfile='ff_rev.gif',
            ff_fwdfile='ff_fwd.gif',
            stopfile='stop.gif',
            playfile='play_fwd.gif',
            playRevfile='play_rev.gif',
            chmodfile='chmod.gif',
            closefile='close.gif',
            iconpath=None,
            counter=1,
            form2=1,
            gui=1,
            framerate=15.,
            hasSlider=False,
            buttonMask=None):

        # frame rate in fps
        self.framerate = framerate
        self.gui = gui
        self.currentFrameIndex = currentFrameIndex
        self.startFrame = startFrame
        self.endFrame = endFrame
        self.targetFrame = self.endFrame
        self.maxFrame = maxFrame
        if not maxFrame:
            self.maxFrame = endFrame
        self.stepSize = stepSize
        #used for play once in 2 directions
        self.oneDirection = 0
        self.increment = 1
        self.target = self.endFrame
        self.hasSlider = hasSlider
        #used to coordinate switching icons
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions and stop
        #   3   play continuously in 2 directions
        self.playMode = playMode
        ### replace by framerate
        #amt of time to sleep
        #self.delay = delay

        #amt of time for after
        #self.afterDelay = afterDelay

        self.afterID = None
        self.stop = 1
        self.hasCounter = 0
        # gui variable
        #self.master = master
        #self.root = root
        self.form2 = form2
        self.hasCounter = counter

        if buttonMask is None:
            self.buttonMask = {}
            # self.buttonMask provides a button name as a key and a boolean
            # as a value. For each button in the GUI if the name appears in
            # self.buttonMask and the value is False the button willnot be
            # addded
        else:
            self.buttonMask = buttonMask

        if gui:
            self.showGUI(master=master,
                         root=root,
                         titleStr=titleStr,
                         height=height,
                         width=width,
                         iconpath=iconpath)

        # make sure we have a master as we will call master.update in play()
        if hasattr(master, 'update'):
            self.masterForUpdate = self.master
        else:
            self.masterForUpdate = self.root

    def showGUI(self,
                master=None,
                root=None,
                width=200,
                height=80,
                titleStr='player',
                gotoStartfile='go_to_start.gif',
                gotoEndfile='go_to_end.gif',
                ff_revfile='ff_rev.gif',
                ff_fwdfile='ff_fwd.gif',
                stopfile='stop.gif',
                playfile='play_fwd.gif',
                playRevfile='play_rev.gif',
                chmodfile='chmod.gif',
                closefile='close.gif',
                iconpath=None):
        """ function to display the player gui."""

        if hasattr(self, 'form'):
            if hasattr(self.form, "deiconify"):
                self.form.deiconify()
                return
        self.master = master
        self.root = root

        if not self.form2:
            self.form = self.buildForm(titleStr)  # pass some arguments here
            self.form2 = 0
        else:
            if iconpath is None:
                iconpath = ('mglutil.gui.BasicWidgets.Tk', 'icons')
            ICONDIR = findFilePath(iconpath[1], iconpath[0])
            #if findFilePath failed, already returned
            gotoStartfile = os.path.join(ICONDIR, gotoStartfile)
            gotoEndfile = os.path.join(ICONDIR, gotoEndfile)
            ff_revfile = os.path.join(ICONDIR, ff_revfile)
            ff_fwdfile = os.path.join(ICONDIR, ff_fwdfile)
            stopfile = os.path.join(ICONDIR, stopfile)
            playfile = os.path.join(ICONDIR, playfile)
            playRevfile = os.path.join(ICONDIR, playRevfile)
            chmodfile = os.path.join(ICONDIR, chmodfile)
            closefile = os.path.join(ICONDIR, closefile)
            recordfile = os.path.join(ICONDIR, "record.gif")
            record1file = os.path.join(ICONDIR, "record1.gif")

            self.gotoStartIcon = Tkinter.PhotoImage(file=gotoStartfile,
                                                    master=master)
            self.gotoEndIcon = Tkinter.PhotoImage(file=gotoEndfile,
                                                  master=master)
            self.ff_revIcon = Tkinter.PhotoImage(file=ff_revfile,
                                                 master=master)
            self.ff_fwdIcon = Tkinter.PhotoImage(file=ff_fwdfile,
                                                 master=master)
            self.stopIcon = Tkinter.PhotoImage(file=stopfile, master=master)
            self.playIcon = Tkinter.PhotoImage(file=playfile, master=master)
            self.playRevIcon = Tkinter.PhotoImage(file=playRevfile,
                                                  master=master)
            self.recIcon = Tkinter.PhotoImage(file=recordfile, master=master)
            self.rec1Icon = Tkinter.PhotoImage(file=record1file, master=master)
            self.chmodIcon = Tkinter.PhotoImage(file=chmodfile, master=master)
            self.closeIcon = Tkinter.PhotoImage(file=closefile, master=master)
            self.form = self.buildForm2(titleStr)  # pass some argument here

    #play methods:
    # play, waitTime, getNextFrameIndex, nextFrame
    def play(self, framerate, event=None):
        t1 = time.time()  # previous frame time
        timestamp = 1. / framerate  # rate to update frame
        self.stop = 0
        ind = self.currentFrameIndex

        # if player at the end we resume from begining
        if ind >= self.endFrame:
            self.GoToStart_cb()

        while not self.stop:  #this has to be more complex
            if self.stop:
                print 'play stopped!'
                break

            #do something different here if ff_fwd or ff_rev
            if self.gui:
                #self.afterID = self.master.after(self.afterDelay, self.waitTime)
                self.masterForUpdate.update()

            t2 = time.time()  # current time
            t = t2 - t1  # time difference between current frame and previous

            if framerate > -1 and t < timestamp:
                pass
            else:
                id = self.getNextFrameIndex(self.currentFrameIndex)
                if id == None:
                    self.stop = 1
                    if self.gui:
                        self.Stop_cb()
                        break
                self.nextFrame(id)  #maybe set entry then call nextFrame??
                self.currentFrameIndex = id
                t1 = t2

    def getNextFrameIndex(self, index):
        newFrame = index + self.increment * self.stepSize
        # check if  newFrame in current range:
        #       if incrementing, has to be <=self.endFrame
        #       if decrementing, has to be >=self.startFrame
        #   NB: incPos indicates whether currently incrementing or decrementing
        # FORCE newFrame into range
        incPos = self.increment > 0
        if incPos and newFrame > self.endFrame:
            newFrame = self.endFrame
        elif not incPos and newFrame < self.startFrame:
            newFrame = self.startFrame
        # check whether reached current targetFrame
        #       if so, action depends on current playMode
        mode = self.playMode
        if index == self.targetFrame:
            # playModes 0 and 2 are play once and stop (in 1 or 2 directions)
            if not mode % 2:
                if mode == 0:
                    # None means stop
                    return None
                else:
                    # play once in 2 directions
                    #   check whether already reached halfway pt
                    if self.oneDirection:
                        return None
                    self.oneDirection = 1
                    # to reverse direction:
                    #   toggle increment
                    self.increment = -1 * self.increment
                    #   toggle targetFrame
                    if self.targetFrame == self.endFrame:
                        self.targetFrame = self.startFrame
                    else:
                        self.targetFrame = self.endFrame
                    return newFrame
            elif self.playMode == 1:
                # play continuously in 1 direction
                # toggle targetFrame to the opposite end
                if self.targetFrame == self.endFrame:
                    return self.startFrame
                else:
                    return self.endFrame
            elif self.playMode == 3:
                # loop continuously in 2 directions
                #   toggle increment
                self.increment = -1 * self.increment
                newFrame = self.targetFrame + self.stepSize * self.increment
                #   toggle targetFrame
                if self.targetFrame == self.endFrame:
                    self.targetFrame = self.startFrame
                else:
                    self.targetFrame = self.endFrame
                return newFrame
        return newFrame


##     def waitTime(self):
##         self.afterID = None
##         t1 = time.time()
##         delta = time.time() - t1
##         #curBut is either play or playRev button
##         hasCurBut = hasattr(self, 'curBut')
##         while delta < self.delay:
##             if hasCurBut:
##                 self.curBut.config(bg='red')
##             self.master.update()
##             time.sleep(self.delay/100)
##             delta = time.time() - t1
##         if hasCurBut:
##             self.curBut.config(bg='white')
##         if self.afterID is not None and hasCurBut:
##             self.curBut.after_cancel(self.afterID)
##             self.afterID = self.curBut.after(self.afterDelay, self.waitTime)

    def nextFrame(self, id):
        ##pass #must be overriden
        id = int(id)
        if id == self.currentFrameIndex: return
        if self.hasCounter and self.gui:
            self.form.ent2.delete(0, 'end')
            self.form.ent2.insert(0, str(id))
            if self.hasSlider:
                self.form.ifd.entryByName['slider']['widget'].set(id)
        print 'playing ', id
        self.currentFrameIndex = int(id)

    #methods to call play
    #Play_cb, PlayRev_cb, FastForward_cb, FastReverse_cb
    #Stop_cb and possibly Pause_cb, Loop_cb
    def startRecording_cb(self, event=None):
        pass

    def stopRecording_cb(self, event=None):
        pass

    def Play_cb(self, framerate=None, event=None):
        #print 'Play_cb'
        self.form.ifd.entryByName['playB']['widget'].grab_release()
        #this is a new call to Play_cb
        if framerate == None:
            framerate = self.framerate
        self.stop = 0
        self.oneDirection = 0
        self.targetFrame = self.endFrame
        self.increment = 1
        #print 'currentFrameIndex=', self.currentFrameIndex
        #possibly currently playing reverse
        if hasattr(self, 'curBut') and self.curBut == self.form.playRevB:
            if self.form2:
                self.curBut.config(command=self.oldCmd,
                                   image=self.oldImage,
                                   bg='white')
            else:
                self.curBut.config(command=self.oldCmd, text=self.oldText)
        self.oldTT = self.form.playTT
        self.oldTTtext = 'play forward according to current play mode'
        self.curBut = self.form.playB
        self.oldCmd = self.Play_cb
        self.oldImage = self.playIcon
        self.oldText = 'Play'
        if self.form2:
            self.curBut.config(command=self.Stop_cb, image=self.stopIcon)
        else:
            self.curBut.config(command=self.Stop_cb, text='Stop')
        self.oldTT.bind(self.curBut, 'stop play')
        #self.master.update()
        self.play(framerate)
        self.stopRecording_cb()

    def PlayRev_cb(self, framerate=None, event=None):
        #figure out current number and then play backwards
        #print 'currentFrameIndex=', self.currentFrameIndex
        self.form.ifd.entryByName['playRevB']['widget'].grab_release()
        if framerate == None:
            framerate = self.framerate
        self.increment = -1
        self.targetFrame = self.startFrame
        self.oneDirection = 0
        self.stop = 0
        #possibly currently playing
        if hasattr(self, 'curBut') and self.curBut == self.form.playB:
            if self.form2:
                self.curBut.config(command=self.oldCmd,
                                   image=self.oldImage,
                                   bg='white')
            else:
                self.curBut.config(command=self.oldCmd, text=self.oldText)
        self.oldTT = self.form.playRevTT
        self.oldTTtext = 'play reverse according to current play mode'
        self.curBut = self.form.playRevB
        self.oldCmd = self.PlayRev_cb
        self.oldImage = self.playRevIcon
        self.oldText = 'Play Reverse'
        if self.form2:
            self.curBut.config(command=self.Stop_cb, image=self.stopIcon)
        else:
            self.curBut.config(command=self.Stop_cb, text='Stop')
        self.oldTT.bind(self.curBut, 'stop play')
        self.play(framerate)

    def FastReverse_cb(self, event=None):
        #print 'FastReverse'
        #framerate = self.framerate * 2
        self.oneDirection = 0
        self.PlayRev_cb(framerate=-1)  #framerate)

    def FastForward_cb(self, event=None):
        #print 'FastForward'
        self.oneDirection = 0
        #framerate = self.framerate * 2
        self.Play_cb(framerate=-1)

    def Stop_cb(self, event=None):
        self.stop = 1
        if hasattr(self, 'curBut'):
            if self.form2:
                self.curBut.config(command=self.oldCmd, image=self.oldImage)
            else:
                self.curBut.config(command=self.oldCmd, text=self.oldText)
                #FIX THIS!!!!
                #DECIDE if stop means reset to start or not
                #self.nextFrame(self.startFrame)
            self.oldTT.bind(self.curBut, self.oldTTtext)

        self.stopRecording_cb()

        #FIX THIS: does this go here?  or in nextFrame
        #clean up form
        #if self.hasCounter:
        #    self.form.ent2.delete(0,'end')
        #    self.form.ent2.insert(0, str(self.currentFrameIndex))

    #these may be superfluous: called by original form
    def PlayReturn_cb(self, event=None):
        #print 'PlayReturn_cb'
        #this should be superfluous
        self.playMode = 3
        self.Play_cb()

    def Loop_cb(self, event=None):
        #print 'Loop_cb'
        #this should be superfluous
        self.playMode = 3
        self.Play_cb()

    def Pause_cb(self, event=None):
        self.stop = 1

    #methods to set Frame to a specific frame
    #SetState_cb, GoToStart_cb, GoToEnd_cb, setCurrentFrameIndex
    def SetState_cb(self, event=None):
        #do nothing if no counter
        if self.hasCounter:
            index = self.form.counter.get()
            self.nextFrame(index)

    def GoToStart_cb(self, event=None):
        #print "GoToStart_cb", self.startFrame, self.currentFrameIndex
        #self.currentFrameIndex = self.startFrame
        self.oneDirection = 0
        self.nextFrame(self.startFrame)

    def GoToEnd_cb(self, event=None):
        #print 'GoToEnd'
        self.oneDirection = 0
        #self.currentFrameIndex = self.endFrame
        self.nextFrame(self.endFrame)

    def setCurrentFrameIndex(self, index):
        #print 'setting currentFrameIndex to', index
        self.currentFrameIndex = index

    #methods for player gui
    def Close_cb(self, event=None):
        self.stop = 1
        if hasattr(self, 'form'):
            self.form.withdraw()

    def SetAnim_cb(self):
        """ function to be overwritten.
        Use to call a functoin to set the animatiom frame."""

        return

    def buildForm2(self, titleStr):
        self.stop = 1
        if hasattr(self, 'form'):
            if hasattr(self.form, 'deiconify'):
                self.form.deiconify()
                return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)

        if self.buttonMask.get('gotoStartB', None) is not False:
            ifd.append({
                'name': 'gotoStartB',
                'widgetType': Tkinter.Button,
                #'text':'gotoStart',
                'tooltip': 'sets frame to current startFrame',
                'wcfg': {
                    'bd': 4,
                    'image': self.gotoStartIcon,
                    'width': self.gotoStartIcon.width(),
                    'height': self.gotoStartIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw'
                },
                'command': self.GoToStart_cb
            })

        if self.buttonMask.get('fastReverseB', None) is not False:
            ifd.append({
                'name': 'fastReverseB',
                'widgetType': Tkinter.Button,
                #'text':'fastReverse',
                'tooltip': 'play reverse as fast as possible',
                'wcfg': {
                    'bd': 4,
                    'image': self.ff_revIcon,
                    'width': self.ff_revIcon.width(),
                    'height': self.ff_revIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 1
                },
                'command': self.FastReverse_cb
            })

        if self.buttonMask.get('playRevB', None) is not False:
            ifd.append({
                'name': 'playRevB',
                'widgetType': Tkinter.Button,
                #'text':'Play Reverse',
                'tooltip': 'play reverse according to current play mode',
                'wcfg': {
                    'bd': 4,
                    'image': self.playRevIcon,
                    'width': self.playRevIcon.width(),
                    'height': self.playRevIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 2
                },
                'command': self.PlayRev_cb
            })

            if self.hasCounter:
                ifd.append({
                    'widgetType': Pmw.Counter,
                    'name': 'statesCounter',
                    'required': 1,
                    'tooltip': 'used to show frames via random access',
                    'wcfg': {  #'labelpos': 'n,
                        #'label_text':'conformation:  ',
                        'autorepeat': 0,
                        'entryfield_value': self.startFrame,
                        #'entryfield_value':self.idList[0],
                        'datatype': self.custom_counter,
                        'entry_width': 3,
                        'entryfield_validate': self.custom_validate
                    },
                    'gridcfg': {
                        'sticky': 'nesw',
                        'row': -1,
                        'column': 3,
                        'columnspan': 2
                    }
                })

        if self.buttonMask.get('playB', None) is not False:
            ifd.append({
                'name': 'playB',
                'widgetType': Tkinter.Button,
                #'text':'Play',
                'tooltip': 'play forward according to current play mode',
                'wcfg': {
                    'bd': 4,
                    'image': self.playIcon,
                    'width': self.playIcon.width(),
                    'height': self.playIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 5
                },
                'command': self.Play_cb
            })

        if self.buttonMask.get('fastForwardB', None) is not False:
            ifd.append({
                'name': 'fastForwardB',
                'widgetType': Tkinter.Button,
                #'text':'fastForward',
                'tooltip': 'play as fast as possible',
                'wcfg': {
                    'bd': 4,
                    'image': self.ff_fwdIcon,
                    'width': self.ff_fwdIcon.width(),
                    'height': self.ff_fwdIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 6
                },
                'command': self.FastForward_cb
            })

        if self.buttonMask.get('gotoEndB', None) is not False:
            ifd.append({
                'name': 'gotoEndB',
                'widgetType': Tkinter.Button,
                #'text':'gotoEnd',
                'tooltip': 'sets frame to current endFrame',
                'wcfg': {
                    'bd': 4,
                    'image': self.gotoEndIcon,
                    'width': self.gotoEndIcon.width(),
                    'height': self.gotoEndIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 7
                },
                'command': self.GoToEnd_cb
            })

        if self.buttonMask.get('modeB', None) is not False:
            ifd.append({
                'name': 'modeB',
                'widgetType': Tkinter.Button,
                'text': 'Change Mode',
                'tooltip': 'opens panel to change play options',
                'wcfg': {
                    'bd': 4,
                    'image': self.chmodIcon,
                    'width': self.chmodIcon.width(),
                    'height': self.chmodIcon.height()
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 8
                },
                'command': self.SetMode_cb
            })

        if pymediaFound and self.buttonMask.get('recordB', None) is not False:
            ifd.append({
                'name': 'recordB',
                'widgetType': Tkinter.Checkbutton,
                'text': 'Record',
                'tooltip': 'record an mpeg movie into movie.mpeg',
                'defaultValue': 0,
                'wcfg': {
                    'bd': 4,
                    'variable': Tkinter.IntVar(),
                    'image': self.recIcon,
                    'width': self.recIcon.width(),
                    'height': self.recIcon.height(),
                    'indicatoron': 0,
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 9
                },
                'command': self.startRecording_cb
            })

        if self.buttonMask.get('setanimB', None) is not False:
            ifd.append({
                'name': 'setanimB',
                'widgetType': Tkinter.Button,
                'text': 'SetAnim',
                'tooltip': 'Set Animation',
                'wcfg': {
                    'bd': 4
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 10
                },
                'command': self.SetAnim_cb
            })

        if self.buttonMask.get('closeB', None) is not False:
            ifd.append({
                'name': 'closeB',
                'widgetType': Tkinter.Button,
                'text': 'Close',
                'tooltip': 'closes player',
                'wcfg': {
                    'bd': 4,
                    'image': self.closeIcon,
                    'width': self.closeIcon.width(),
                    'height': self.closeIcon.height(),
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 11
                },
                #'gridcfg':{'sticky':'nesw', 'columnspan':2},
                'command': self.Close_cb
            })

        if self.hasSlider:
            ifd.append({
                'name': 'slider',
                'widgetType': Tkinter.Scale,
                'wcfg': {
                    'orient': 'horizontal',
                    'from_': self.startFrame,
                    'to': self.maxFrame,
                    'showvalue': False
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': 1,
                    'column': 0,
                    'columnspan': 12
                },
                'command': self.nextFrame
            })
        #form = self.vf.getUserInput(ifd, modal=0,blocking=0)
        form = InputForm(self.master,
                         self.root,
                         descr=ifd,
                         modal=0,
                         blocking=0,
                         closeWithWindow=1)
        form.ifd = ifd
        form.playB = form.ifd.entryByName['playB']['widget']
        form.playRevB = form.ifd.entryByName['playRevB']['widget']
        #set up link to balloon help which needs to change, also
        form.playTT = form.ifd.entryByName['playB']['balloon']
        form.playRevTT = form.ifd.entryByName['playRevB']['balloon']
        if self.hasCounter:
            ctr = ifd.entryByName['statesCounter']['widget']
            entF = ctr.component('entryfield')
            form.ent2 = entF._entryFieldEntry
            da = ctr.component('downarrow')
            ua = ctr.component('uparrow')
            for item in [da, ua]:
                item.bind('<ButtonPress-1>', self.SetState_cb, '+')
            form.ent2.bind('<Return>', self.SetState_cb, '+')
            form.counter = form.ifd.entryByName['statesCounter']['widget']
        if self.hasSlider:
            slider = form.ifd.entryByName['slider']['widget']
            slider.set(self.currentFrameIndex)
        #print 'returning form'
        return form

    def buildForm(self, titleStr):
        #??FIX THIS:
        self.stop = 1
        if hasattr(self, 'form'):
            self.form.deiconify()
            return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)
        if self.hasCounter:
            ifd.append({
                'widgetType': Pmw.Counter,
                'name': 'statesCounter',
                'required': 1,
                'tooltip': 'used to show frames via random access',
                'wcfg': {  #'labelpos': 'n,
                    #'label_text':'conformation:  ',
                    'autorepeat': 0,
                    'entryfield_value': self.startFrame,
                    #'entryfield_value':self.idList[0],
                    'datatype': self.custom_counter,
                    'entry_width': 9,
                    'entryfield_validate': self.custom_validate
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'columnspan': 2
                }
            })
        ifd.append({
            'name': 'playB',
            'widgetType': Tkinter.Button,
            'text': 'Play',
            'tooltip': 'play sequence according to current play mode',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 1
            },
            'command': self.Play_cb
        })
        ifd.append({
            'name': 'playRevB',
            'widgetType': Tkinter.Button,
            'text': 'Play Reverse',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1,
                'column': 1
            },
            'command': self.PlayRev_cb
        })
        ifd.append({
            'name': 'playTB',
            'widgetType': Tkinter.Button,
            'text': 'Play+Return',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 1
            },
            'command': self.PlayReturn_cb
        })
        ifd.append({
            'name': 'loopB',
            'widgetType': Tkinter.Button,
            'text': 'Loop',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1,
                'column': 1
            },
            'command': self.Loop_cb
        })
        ifd.append({
            'name': 'stopB',
            'widgetType': Tkinter.Button,
            'text': 'Stop',
            'tooltip': 'stop play',
            'wcfg': {
                'bd': 4,
            },
            'gridcfg': {
                'sticky': 'nesw'
            },
            'command': self.Stop_cb
        })
        #add fastforward, fastrewind, thumbwheel for speed
        ifd.append({
            'name': 'pauseB',
            'widgetType': Tkinter.Button,
            'text': 'Pause',
            'wcfg': {
                'bd': 4
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1,
                'column': 1
            },
            'command': self.Pause_cb
        })

        ifd.append({
            'name': 'closeB',
            'widgetType': Tkinter.Button,
            'text': 'Close',
            'wcfg': {
                'bd': 4
            },
            #'gridcfg':{'sticky':'nesw','row':-1, 'column':1},
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 2
            },
            'command': self.Close_cb
        })
        form = InputForm(self.master,
                         self.root,
                         descr=ifd,
                         modal=0,
                         blocking=0,
                         closeWithWindow=1)
        form.ifd = ifd
        if self.hasCounter:
            ctr = ifd.entryByName['statesCounter']['widget']
            entF = ctr.component('entryfield')
            form.ent2 = entF._entryFieldEntry
            da = ctr.component('downarrow')
            ua = ctr.component('uparrow')
            for item in [da, ua]:
                item.bind('<ButtonPress-1>', self.SetState_cb, '+')
            form.ent2.bind('<Return>', self.SetState_cb, '+')
            form.counter = form.ifd.entryByName['statesCounter']['widget']
        form.stopB = form.ifd.entryByName['stopB']['widget']
        form.playB = form.ifd.entryByName['playB']['widget']
        form.playRevB = form.ifd.entryByName['playRevB']['widget']
        #print 'returning form1'
        self.form = form
        return form

    #methods for changing playMode
    def SetMode_cb(self, event=None):
        #print 'SetMode'
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        #play framerate is frame/per second
        if not hasattr(self, 'playModeForm'):
            self.playModeList = [
                'once and stop', 'continuously in 1 direction',
                'once in 2 directions', 'continuously in 2 directions'
            ]
            ifd2 = InputFormDescr(title='Set Play Mode')

            ifd2.append({
                'name': 'playModeLabel',
                'widgetType': Tkinter.Label,
                'wcfg': {
                    'text': 'play mode options:',
                    'font': (ensureFontCase('helvetica'), 12, 'bold')
                },
                'gridcfg': {
                    'sticky': 'w'
                }
            })

            ifd2.append({
                'name': 'playMode',
                'widgetType': Tkinter.Radiobutton,
                'defaultValue': self.playModeList[self.playMode],
                'listtext': self.playModeList,
                'gridcfg': {
                    'sticky': 'w'
                }
            })

            ifd2.append({
                'name': 'framerateTW',
                'widgetType': ThumbWheel,
                'tooltip': """Framerate to enforce during playback""",
                'gridcfg': {
                    'sticky': 'we'
                },
                'wcfg': {
                    'value': self.framerate,
                    'oneTurn': 100.,
                    'type': 'float',
                    'continuous': True,
                    'wheelPad': 2,
                    'width': 145,
                    'height': 18,
                    'labCfg': {
                        'text': 'framerate:  '
                    },
                },
            })

            ifd2.append({
                'name': 'startFrameTW',
                'widgetType': ThumbWheel,
                'tooltip': """First frame used in playback""",
                'gridcfg': {
                    'sticky': 'we'
                },
                'wcfg': {
                    'value': self.startFrame,
                    'oneTurn': 100,
                    'type': 'int',
                    'continuous': True,
                    'wheelPad': 2,
                    'width': 145,
                    'height': 18,
                    'labCfg': {
                        'text': 'start frame: '
                    },
                },
            })

            ifd2.append({
                'name': 'endFrameTW',
                'widgetType': ThumbWheel,
                'tooltip': """Last frame used in playback""",
                'gridcfg': {
                    'sticky': 'we'
                },
                'wcfg': {
                    'value': self.endFrame,
                    'oneTurn': 100,
                    'type': 'int',
                    'continuous': True,
                    'wheelPad': 2,
                    'width': 145,
                    'height': 18,
                    'labCfg': {
                        'text': ' end frame: '
                    },
                },
            })

            ifd2.append({
                'name': 'stepSizeTW',
                'widgetType': ThumbWheel,
                'tooltip': """???""",
                'gridcfg': {
                    'sticky': 'we'
                },
                'wcfg': {
                    'value': self.stepSize,
                    'oneTurn': 100,
                    'type': 'int',
                    'continuous': True,
                    'wheelPad': 2,
                    'width': 145,
                    'height': 18,
                    'labCfg': {
                        'text': ' step size:  '
                    },
                },
            })

            ifd2.append({
                'name': 'acceptB',
                'widgetType': Tkinter.Button,
                'wcfg': {
                    'text': 'ok',
                    'command': self.setPlayMode_cb,
                },
                'gridcfg': {
                    'sticky': 'nesw'
                }
            })

            ifd2.append({
                'name': 'cancelB',
                'widgetType': Tkinter.Button,
                'wcfg': {
                    'text': 'cancel',
                    'command': self.cancelPlayMode_cb,
                },
                'gridcfg': {
                    'sticky': 'nesw',
                    'row': -1,
                    'column': 1
                }
            })
            if self.master is None:
                master = self.root
            else:
                master = Tkinter.Toplevel()
            self.playModeForm = InputForm(master,
                                          None,
                                          descr=ifd2,
                                          modal=0,
                                          blocking=0)
            self.playModeVar = self.playModeForm.descr.entryByName['playMode'][
                'variable']
            self.framerateWidget = self.playModeForm.descr.entryByName[
                'framerateTW']['widget']
            self.startFrameWidget = self.playModeForm.descr.entryByName[
                'startFrameTW']['widget']
            self.endFrameWidget = self.playModeForm.descr.entryByName[
                'endFrameTW']['widget']
            self.stepSizeWidget = self.playModeForm.descr.entryByName[
                'stepSizeTW']['widget']
        else:
            self.playModeForm.deiconify()

    def setPlayMode_cb(self, event=None):
        curVal = self.playModeVar.get()
        self.playMode = self.playModeList.index(curVal)
        #print 'setting playMode to ', curVal
        self.framerate = round(self.framerateWidget.get(), 4)
        #print 'setting self.framerate ->', self.framerate
        self.timestamp = 1. / self.framerate

        self.startFrame = self.startFrameWidget.get()
        self.endFrame = self.endFrameWidget.get()
        self.stepSize = self.stepSizeWidget.get()
        self.cancelPlayMode_cb()
        self.oneDirection = 0

    def cancelPlayMode_cb(self, event=None):
        self.playModeForm.withdraw()

    #methods for counter
    def custom_validate(self, text):
        #print 'in custom_validate, text=', text
        if not len(text):
            return -1

        if text in ['start', 'end']:
            return 1

        tt = int(text)
        okList = range(self.startFrame, self.endFrame + 1)
        if tt in okList:
            return 1
        else:
            return -1

    def custom_counter(self, text, factor, increment, **kw):
        # text is current content of entry
        # factor is 1 for increment and -1 for decrement
        # increment is value of increment megawidget option
        ###if not text in self.idList:
        ###raise ValueError, text + ' not in current idList'
        #check whether ind+factor is in range
        newval = self.currentFrameIndex + factor
        #print 'newval=', newval
        if newval < 0 or newval > self.endFrame:
            #print 'custom_counter returning ', text
            return text
        else:
            #print 'custom_counter returning ', newval
            return newval
示例#39
0
class Recorder(Tkinter.Frame):
    """Implements GUI for recording movie clips( *.mpg)"""
    def __init__(self,
                 master=None,
                 height=80,
                 width=100,
                 title="Video recorder",
                 icondir=None,
                 filetypes=[("MPG", ".mpg")],
                 fileName=None,
                 camera=None,
                 gui=True):
        self.ifd = None
        self.form = None
        self.paramForm = None
        self.ifd2 = None
        self.fileName = fileName

        self.autoPauseDelay = 1  # auto pause after 1 second
        self.pauseLength = 30
        self.cameraw = 0
        self.camerah = 0
        self.camera = weakref.ref(camera)
        if self.camera():
            self.cameraw = camera.width
            self.camerah = camera.height

        if not icondir:
            icondir = findFilePath('icons', 'mglutil.gui.BasicWidgets.Tk')
        self.stopIcon = Tkinter.PhotoImage(file=os.path.join(
            icondir, "stop3.gif"),
                                           master=master)
        self.pauseIcon = Tkinter.PhotoImage(file=os.path.join(
            icondir, "stop2.gif"),
                                            master=master)
        self.recordIcon = Tkinter.PhotoImage(file=os.path.join(
            icondir, "record.gif"),
                                             master=master)
        self.record1Icon = Tkinter.PhotoImage(file=os.path.join(
            icondir, "record1.gif"),
                                              master=master)
        self.chmodIcon = Tkinter.PhotoImage(file=os.path.join(
            icondir, 'chmod.gif'),
                                            master=master)
        self.closeIcon = Tkinter.PhotoImage(file=os.path.join(
            icondir, 'close.gif'),
                                            master=master)
        self.fileTypes = filetypes
        if gui:
            self.RecVar = Tkinter.IntVar()
            self.RecVar.set(0)
            self.PauseVar = Tkinter.IntVar()
            self.PauseVar.set(0)
            form = self.buildForm(master=master,
                                  title=title,
                                  height=height,
                                  width=width)
            form.deiconify()

    def buildForm(self, master=None, width=100, height=80, title=None):
        if self.form:
            self.form.deiconify()
            self.createKeyBindings()
            return
        self.master = master
        ifd = self.ifd = InputFormDescr(title=title)
        ifd.append({
            'name': 'fileopen',
            'widgetType': Tkinter.Button,
            'tooltip': "Opens file browser",
            'wcfg': {
                'text': "Save As:",
                'command': self.browseFile,
                'width': 0,
                'height': 0,
            },
            'gridcfg': {
                'sticky': 'w',
                'column': 0
            }
        })
        ifd.append({
            'name': 'filename',
            'widgetType': Pmw.EntryField,
            'tooltip': "type filename",
            'gridcfg': {
                'sticky': 'w',
                #'columnspan': 3},
                'columnspan': 2,
                'row': -1
            },
            'wcfg': {
                'command': self.getFileName,
                #'label_text':'Save As',
                'entry_width': 12,
                'value': self.fileName,
                #'labelpos':'w'}})
            }
        })

        ## ifd.append({'name':'fileopen',
        ##                     'widgetType':Tkinter.Button,
        ##                     'tooltip': "Open file browser",
        ##                     'wcfg':{'text':"...",
        ##                             'command': self.browseFile,
        ##                             'width': 0, 'height': 0,},
        ##                     'gridcfg':{'sticky':'w', 'column':2, 'row':-1}
        ##                     })
        ifd.append({
            'name': 'recordB',
            'widgetType': Tkinter.Checkbutton,
            'tooltip': 'start/stop recording',
            'wcfg': {
                'variable': self.RecVar,
                'bd': 2,
                'image': self.record1Icon,
                'width': self.record1Icon.width(),
                'height': self.record1Icon.height(),
                'indicatoron': 0,
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1
            },
            'command': self.record_cb
        })

        ifd.append({
            'name': 'pauseB',
            'widgetType': Tkinter.Checkbutton,
            'tooltip': 'pause/start recording',
            'wcfg': {
                'variable': self.PauseVar,
                'bd': 2,
                'image': self.pauseIcon,
                'width': self.pauseIcon.width(),
                'height': self.pauseIcon.height(),
                'indicatoron': 0,
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1
            },
            'command': self.pause_cb
        })

        ifd.append({
            'name': 'stopB',
            'widgetType': Tkinter.Button,
            'tooltip': 'stop recording',
            'wcfg': {
                'bd': 2,
                'image': self.stopIcon,
                'width': self.stopIcon.width(),
                'height': self.stopIcon.height(),
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1
            },
            'command': self.stop_cb
        })

        ##         ifd.append({'name': 'recordB',
        ##                     'widgetType': Tkinter.Button,
        ##                     'tooltip':'start/pause recording',
        ##                     'wcfg':{'bd':4,
        ##                             'image':self.recordIcon,
        ##                             'width':self.recordIcon.width(),
        ##                             'height':self.recordIcon.height()
        ##                             },
        ##                     'gridcfg':{'sticky':'nesw','row':-1},
        ##                     'command':self.record_cb})

        ##         ifd.append({'name': 'pauseB',
        ##                     'widgetType': Tkinter.Button,
        ##                     'tooltip':'pause recording',
        ##                     'wcfg':{'bd':4,
        ##                             'image':self.pauseIcon,
        ##                             'width':self.pauseIcon.width(),
        ##                             'height':self.pauseIcon.height()
        ##                             },
        ##                     'gridcfg':{'sticky':'nesw', 'row':-1},
        ##                     'command':self.pause_cb})

        ##         ifd.append({'name': 'modeB',
        ##                     'widgetType': Tkinter.Button,
        ##                     'text':'Change Mode',
        ##                     'tooltip':'opens panel to change video parameters',
        ##                     'wcfg':{'bd':4,
        ##                             'image':self.chmodIcon,
        ##                             'width':self.chmodIcon.width(),
        ##                             'height':self.chmodIcon.height()
        ##                             },
        ##                     'gridcfg':{'sticky':'nesw','row':-1},
        ##                     'command':self.setparams_cb })

        ##         ifd.append({'name': 'closeB',
        ##             'widgetType': Tkinter.Button,
        ##             'text':'Close',
        ##             'tooltip':'closes video recorder',
        ##             'wcfg':{'bd':2,
        ##                     'image':self.closeIcon,
        ##                     'width':self.closeIcon.width(),
        ##                     'height':self.closeIcon.height(),
        ##                     },
        ##             'gridcfg':{'sticky':'nesw','row':-1},
        ##             'command':self.close_cb})
        form = self.form = InputForm(self.master,
                                     None,
                                     descr=ifd,
                                     modal=0,
                                     blocking=0,
                                     closeWithWindow=1,
                                     onDestroy=self.close_cb)
        self.createKeyBindings()
        return form

    def getFileName(self):
        """ Get file name from the input form's entry field."""
        if self.ifd:
            name = self.ifd.entryByName['filename']['widget'].get()
            if name:
                if self.fileName != name:
                    self.fileName = name

    def browseFile(self):
        """Opens file browser."""

        fileDir = None
        if self.fileName:
            if path.exists(self.fileName):
                fileDir = path.dirname(path.realpath(self.fileName))
            else:
                fileDir = os.getcwd()
        file = tkFileDialog.asksaveasfilename(filetypes=self.fileTypes,
                                              initialdir=fileDir,
                                              initialfile=None,
                                              title="Save file")
        if file:
            if self.fileName != file:
                self.fileName = file
                self.ifd.entryByName['filename']['widget'].setentry(file)

    def record_cb(self):

        #get the value of the Record checkbutton
        val = self.RecVar.get()
        if val:  #checked
            self.getFileName()
            res = 1
            if self.camera:
                if self.camera().videoRecordingStatus == "stopped":
                    #kw = {'filename':self.fileName, 'width':self.cameraw, 'hight':self.camerah,
                    #      'autoPauseDelay': self.autoPauseDelay,'pauseLength':self.pauseLength}
                    #kw = {'filename':self.fileName }
                    #apply(self.setVideoParams, (), kw)
                    if os.path.exists(self.fileName):
                        # ask the user if he wants to overwrite the existing file
                        from Dialog import Dialog
                        d = Dialog(
                            None, {
                                'title':
                                'File exisits',
                                'text':
                                'File "%s" already exists.'
                                ' Do you want to overwrite it ?' %
                                self.fileName,
                                'bitmap':
                                'warning',
                                'default':
                                1,
                                'strings': ('Yes', 'No')
                            })
                        ans = d.num
                        if ans == 1:  #no
                            self.RecVar.set(0)
                            return
                    res = self.setVideoParams(filename=self.fileName)
                if res:
                    #print "record_cb: recording"
                    self.camera().start()
            if self.ifd:
                b = self.ifd.entryByName['recordB']['widget']
                if res:
                    b.config(image=self.recordIcon)
                    pauseval = self.PauseVar.get()
                    if pauseval:
                        self.PauseVar.set(0)  #uncheck the Pause checkbutton
        else:  #unchecked
            if self.camera:
                #print "record_cb: stop recording"
                self.stop_cb()

    def stop_cb(self):
        #print "stop_cb"
        if self.camera:
            if not self.camera().videoRecordingStatus == 'stopped':
                #print "stop recording"
                self.camera().stop()
            if self.ifd:
                recval = self.RecVar.get()
                if recval:
                    self.RecVar.set(0)  #uncheck the Record checkbutton
                pauseval = self.PauseVar.get()
                if pauseval:
                    self.PauseVar.set(0)  #uncheck the Pause checkbutton
                b = self.ifd.entryByName['recordB']['widget']
                b.config(image=self.record1Icon)

    def pause_cb(self):
        #print "pause_cb"
        val = self.PauseVar.get()
        if self.camera:
            camerastatus = self.camera().videoRecordingStatus
            if val:  # the Pause button is checked
                if camerastatus == 'recording':
                    #print "pause recording"
                    self.camera().pause()
                    #if self.ifd:
                    #b = self.ifd.entryByName['recordB']['widget']
                    #b.config(command = self.record_cb, image=self.recordIcon)
            else:  # the Pause button is unchecked
                if camerastatus == 'paused':
                    #print "start recording after pause"
                    self.record_cb()

    def spacePress_cb(self, event):
        if self.camera:
            camerastatus = self.camera().videoRecordingStatus
            if camerastatus == "stopped" or camerastatus == "paused":
                self.RecVar.set(1)
                self.record_cb()
            elif camerastatus == "recording":
                self.PauseVar.set(1)
                self.pause_cb()

    def setparams_cb(self):
        """Opens a panel to set Video Parameters"""
        if self.paramForm:
            self.paramForm.deiconify()
            return
        self.ifd2 = ifd2 = InputFormDescr(title="Set video options")
        ifd2.append({
            'widgetType': Pmw.EntryField,
            'tooltip': 'Set camera width',
            'name': 'cameraw',
            'gridcfg': {
                'sticky': 'w',
                'columnspan': 2
            },
            'wcfg': {  #'command': self.setCameraWidth_cb,
                'label_text': 'width:',
                'entry_width': 10,
                'validate': {
                    'validator': 'real',
                    'min': 0
                },
                'value': str(self.cameraw),
                'labelpos': 'w'
            }
        })

        ifd2.append({
            'widgetType': Pmw.EntryField,
            'name': 'camerah',
            'tooltip': 'Set camera height',
            'gridcfg': {
                'sticky': 'w',
                'columnspan': 2
            },
            'wcfg': {  #'command': self.setCameraHeight_cb,
                'label_text': 'height',
                'entry_width': 10,
                'validate': {
                    'validator': 'real',
                    'min': 0
                },
                'value': str(self.camerah),
                'labelpos': 'w'
            }
        })
        ifd2.append({
            'name': 'autoPause',
            'wtype': ThumbWheel,
            'widgetType': ThumbWheel,
            'tooltip': 'set auto pause delay (seconds)',
            'wcfg': {
                'labCfg': {
                    'fg': 'black',
                    'side': 'left',
                    'text': 'AutoPause Delay'
                },
                'showLabel': 1,
                'width': 100,
                'min': 0,
                'value': self.autoPauseDelay,
                'oneTurn': 100,
                'type': 'int',
                'increment': 1,
                #'callback':self.setAutoPauseDelay_cb,
                'canvascfg': {
                    'bg': 'red'
                },
                'continuous': 0,
                'wheelPad': 1,
                'height': 15
            },
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 2
            }
        })
        ifd2.append({
            'name': 'pauseLength',
            'wtype': ThumbWheel,
            'widgetType': ThumbWheel,
            'tooltip':
            'set number of frames to be added when\nrecording resumes after autopause',
            'wcfg': {
                'labCfg': {
                    'fg': 'black',
                    'side': 'left',
                    'text': 'AutoPause Length'
                },
                'showLabel': 1,
                'width': 100,
                'min': 0,
                'value': self.pauseLength,
                'oneTurn': 100,
                'type': 'int',
                'increment': 1,
                #'callback':self.setPauseLength_cb,
                'canvascfg': {
                    'bg': 'red'
                },
                'continuous': 0,
                'wheelPad': 1,
                'height': 15
            },
            'gridcfg': {
                'sticky': 'nesw',
                'columnspan': 2
            }
        })
        ifd2.append({
            'name': 'okB',
            'widgetType': Tkinter.Button,
            'wcfg': {
                'text': 'Apply',
                'command': self.apply_cb,
            },
            'gridcfg': {
                'sticky': 'nesw'
            }
        })
        ifd2.append({
            'name': 'cancelB',
            'widgetType': Tkinter.Button,
            'wcfg': {
                'text': 'Cancel',
                'command': self.cancel_cb,
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1,
                'column': 1
            }
        })
        self.paramForm = InputForm(self.master,
                                   None,
                                   descr=ifd2,
                                   modal=0,
                                   blocking=0)
        self.paramForm.deiconify()

        return self.paramForm

    def setCameraWidth_cb(self):
        """ 'Width' entry field callback of the video parameters form ."""
        w = int(self.ifd2.entryByName['cameraw']['widget'].get())
        if w != self.cameraw:
            self.cameraw = w

    def setCameraHeight_cb(self):
        """'Height' entry field callback of the video parameters form ."""
        h = int(self.ifd2.entryByName['camerah']['widget'].get())
        if h != self.camerah:
            self.camerah = h

    def setAutoPauseDelay_cb(self, val):
        """Callback of the autoPause thumbwheel widget (video parameters input form). """
        #print val
        d = int(val)
        if d != self.autoPauseDelay:
            self.autoPauseDelay = d

    def setPauseLength_cb(self, val):
        """Callback of the pauseLength thumbwheel widget (video parameters input form). """
        #print val
        l = int(val)
        if l != self.pauseLength:
            self.pauseLength = l

    def apply_cb(self):
        """Apply button callback of the video parameters input form."""
        kw = {}
        ebn = self.ifd2.entryByName
        w = float(ebn['cameraw']['widget'].get())
        if w != self.cameraw:
            self.cameraw = w
        kw['width'] = w
        h = float(ebn['camerah']['widget'].get())
        if h != self.camerah:
            self.camerah = h
        kw['height'] = h

        d = ebn['autoPause']['widget'].get()
        if d != self.autoPauseDelay:
            self.autoPauseDelay = d
        kw["autoPauseDelay"] = d

        l = ebn['pauseLength']['widget'].get()
        if l != self.pauseLength:
            self.pauseLength = l
        kw['pauseLength'] = l

        #apply(self.setVideoParams, (), kw)
        self.cancel_cb()

    def setVideoParams(self, **kw):
        """ Uses Recordable Camera methods to set file name and other video parameters"""
        #print kw
        if self.camera:
            filename = kw.get('filename')
            if filename:
                try:
                    self.camera().setVideoOutputFile(filename)
                except IOError:
                    button = tkMessageBox.showerror(
                        "IOError",
                        message="Could not open file %s\nfor writing a movie."
                        % filename,
                        parent=self.master)
                    return False
            ## params = {}
##             w = kw.get('width')
##             if w is not None:
##                 params['width'] = w
##             h = kw.get('height')
##             if h is not None:
##                 params['height']= h
##             pl = kw.get('pauseLength')
##             if pl is not None:
##                 params['pauseLength'] = pl
##             apd = kw.get('autoPauseDelay')
##             if apd is not None:
##                 params['autoPauseDelay'] = apd
##             if len(params):
##                 apply(self.camera().setVideoParameters, (), params)

#use default parameters for now
            self.camera().setVideoParameters()
            return True

    def createKeyBindings(self):
        self.master.bind('<KeyPress-space>', self.spacePress_cb)

    def removeKeyBindings(self):
        self.master.unbind('<KeyPress-space>')

    def cancel_cb(self):
        self.paramForm.withdraw()

    def close_cb(self, event=None):
        if hasattr(self, 'form'):
            self.form.withdraw()
        self.removeKeyBindings()
class AnimPlayer(Player,geomsChooser):
    """ provide a player to display/undisplay DejaVu object
    in a cylce making a animation.

    viewer: DejaVu viewer
    height,width are the property of the player gui
    startFrame: frame to begin
    endFrame: last frame to display
    stepSize: step between new frame
    playMode:                  #playMode options:
                               #   0   play once and stop
                               #   1   play continuously in 1 direction
                               #   2   play once in 2 directions
                               #   3   play continuously in 2 directions
    titleStr: title of the gui windows
    counter: gui with a counter on or not
    gui: #1 show the player gui
         #0 player gui not display
    framerate =15.             # number of frame per second to be display
    """


    def __init__(self,viewer, master=None, root=None,
                 height=80,width=200,
                 currentFrameIndex=0,
                 startFrame=0, 
                 endFrame=0,
                 maxFrame=0,
                 stepSize=1, 
                 playMode=1,
                 titleStr='AnimPlayer',
                 counter = 1,
                 gui=1,framerate=15.):

        if master is None:
            master = Tkinter.Toplevel()

        # viewer from which we get the geom to animate
        self.viewer = viewer
        # frame list, is a list of geom .
        # each frame is made of n DejaVu object to be display
        # it a list of tuple, each tuple is a {} and []
        # {} is: {'objname':['geom1','geom2'],'objname':['geom1','geom2']}
        # [] is list of DejaVu object per frame
        self.framelist=[]

        Player.__init__(self, master=master,root=root,height=height,
                        width=width,currentFrameIndex=currentFrameIndex,
                        startFrame=startFrame,endFrame=endFrame,
                        maxFrame=maxFrame,stepSize=stepSize,
                        playMode=playMode,titleStr=titleStr,counter=counter,
                        gui=gui,framerate=framerate)

    def nextFrame(self, id):
        """ id: index number of the frame to display.
        undisplay object from previous frame, display object
        of new frame.
        """
        if not self.framelist:return
        id = int(id)
        if id >=len(self.framelist):return

        i = self.currentFrameIndex
        ## undisplay previous object
        frame = self.framelist[i]
        for obj in frame[1]:
            obj.Set(visible=0,redo=0)
            
        if self.hasCounter and self.gui:
            self.form.ent2.delete(0,'end')
            self.form.ent2.insert(0, str(id))

        ## display new frame
        currentframe = self.framelist[id]
        for obj in currentframe[1]:
            obj.Set(visible=1,redo=0)
        
        self.viewer.deleteOpenglList()
	self.viewer.Redraw()
        self.currentFrameIndex = id

#####################################################################
#### Animation Setting the frame

    def SetAnim_cb(self):
        self.showForm()
        
    def showForm(self):
        """create formdescr for setAnim
        form to set the animation:
        each frame is a list of geom to display
        """

        entryFrame = []
        for i in range(len(self.framelist)):
            val = 'frame_'+str(i)
            entryFrame.append((val,))
        
        if not hasattr(self,'form_Setanim'):
            ifd = InputFormDescr(title="SetAnimation")
            ifd.append({'widgetType':ListChooser,
                        'name':'availableGeom',
                        'tooltip':'geom available in viewer',
                        'wcfg':{'mode':'extended',
                                'lbwcfg':{'exportselection':1},
                                'command':[(self.toggleExpansion,'<Double-Button-1>')],
                                'commandEvent':None,
                                'title':'availableGeom'},
                        
                        'gridcfg':{'row':0,'column':0,
                                   'sticky':'wens','rowspan':3}})
            ifd.append({'name':'newframe',
                        'widgetType':Tkinter.Button,
                        'tooltip':""" Add an empty frame to the animation""",
                        'wcfg':{'text':'NewFrame','command':self.addframe_cb},
                        'gridcfg':{'row':0,'column':1,'rowspan':1 }})
            
            ifd.append({'name':'add',
                        'widgetType':Tkinter.Button,
                        'tooltip':""" Add the selected geom to selected frame""",
                        'wcfg':{'text':'AddGeom','command':self.add_cb},
                        'gridcfg':{'row':1,'column':1,'rowspan':1 }})
            
            ifd.append({'name':'geomtoload',
                        'widgetType':ListChooser,
                        'tooltip':"""list of frame  the user chose to
                        apply to the pattern""",
                        'wcfg':{'entries':entryFrame,
                                'mode':'extended',
                                'lbwcfg':{'exportselection':0},
                                'title':'Frame(geom) to be display'},
                        'gridcfg':{'sticky':'we', 
                                   'row':0, 'column':2,'rowspan':3}})
            ifd.append({'name':'remove',
                        'widgetType':Tkinter.Button,
                        'tooltip':""" Remove the selected entry from the
                        commands to be applied to the object when loaded in the application""",
                        'wcfg':{'text':'REMOVE','width':10,
                                'command':self.remove_cb},
                        'gridcfg':{'sticky':'we','row':0, 'column':3}})
            
            ifd.append({'name':'oneup',
                        'widgetType':Tkinter.Button,
                        'tooltip':"""Move the selected entry up one entry""",
                        'wcfg':{'text':'Move up','width':10,
                                'command':self.moveup_cb},
                        'gridcfg':{'sticky':'we','row':1,'column':3}})
            
            ifd.append({'name':'onedown',
                        'widgetType':Tkinter.Button,
                        'tooltip':"""Move the selected entry down one entry""",
                        'wcfg':{'text':'Move down','width':10,
                                'command':self.movedown_cb},
                        'gridcfg':{'sticky':'we','row':2,'column':3}})

            self.form_Setanim = InputForm(self.master,None,descr=ifd,
                                  scrolledFrame=0)
            
            
            self.lc = self.form_Setanim.descr.entryByName['availableGeom']['widget']
            self.lc2 = self.form_Setanim.descr.entryByName['geomtoload']['widget']
            self.addObject(self.viewer.rootObject,None)
            val = self.form_Setanim.go()
            if val:
                self.assign()
                self.form_Setanim.withdraw()
        else:
            self.form_Setanim.deiconify()
            val = self.form_Setanim.go()
            if val:
                self.assign()
                self.form_Setanim.withdraw()
                
    def deleteAnim(self):
        """ Delete all frame from the player list."""

        self.Stop_cb()
        self.startFrame=0
        self.endFrame = -1
        self.maxFrame = 0
        self.targetFrame = self.endFrame
        self.target = self.endFrame
        self.currentFrameIndex =0


    def assign(self,list=None):
        """ assign the animation.
        framelist ; list of {}
        return a list of obj for each frame
        """
        self.deleteAnim()
        AllObjects = self.viewer.rootObject.AllObjects()
        if list :
            self.framelist=[]
            for f in list:
                self.framelist.append((f,[]))
        print "assign"
        print "self.framelist",self.framelist
        for frame in self.framelist:
            geomDic = frame[0]
            Namelist=[]
            for parents in geomDic.keys():
                parentlist = filter(lambda x, name=parents:x.name == name,AllObjects)
                obj = parentlist[0]
                childrens = geomDic[obj.name]
                if len(childrens) > 0:
                    for namegeom in childrens:
                        child = filter(lambda x,
                                       name=namegeom:x.name == name,
                                       obj.children)[0]
                        if child.children != []:
                            for c in child.children:
                                frame[1].append(c)
                        else:
                            frame[1].append(child)
                else:
                    frame[1].append(obj)

            self.endFrame = self.endFrame +1
            self.maxFrame = self.maxFrame +1
            self.targetFrame = self.endFrame
            self.target = self.endFrame


    def movedown_cb(self):
        """ move entry one down """
        sel = self.lc2.get()
        index = self.lc2.getInd()
        if not sel: return
        sel = sel[0]
        if string.find(sel,"frame") < 0: return
        # get frame Index
        frameInd = int(string.split(sel,'_')[1])
        currentframe = self.framelist[frameInd]
        if (frameInd + 1) >= len(self.framelist):return
        # select next Frame.
        nextframe = self.framelist[frameInd+1]
        # move current frame one down in list
        self.framelist[frameInd] =nextframe
        self.framelist[frameInd+1] =currentframe
        self.updatelistchooser(self.framelist)

    def moveup_cb(self):
        """ move entry one up """
        sel = self.lc2.get()
        index = self.lc2.getInd()
        if not sel: return
        sel = sel[0]
        if string.find(sel,"frame") < 0: return
        # get frame Index
        frameInd = int(string.split(sel,'_')[1])
        currentframe=self.framelist[frameInd]
        if (frameInd - 1) <  0 :return
        # select previous Frame
        prevframe = self.framelist[frameInd-1]
        # move current frame one up in list
        self.framelist[frameInd] =prevframe
        self.framelist[frameInd-1] =currentframe
        self.updatelistchooser(self.framelist)
        
    def addframe_cb(self):
        """ add a new frame entry"""
        frame = ({},[])
        nb = len(self.framelist)
        #frame.number = nbframe 
        value = 'frame_'+ str(nb)
        self.framelist.append(frame)
        self.lc2.deselect(0,last='end')
        self.lc2.insert('end',value)
        self.lc2.select('end')

    def add_cb(self):
        listgeom=[]
        # get the frame index to add new geom
        if len(self.lc2.entries)>0:
            ind = self.lc2.getInd()
            if len(ind) ==0:return # no entry selected so create a new frame
            # get geom name to load
            o = map(int,self.lc.lb.curselection())
            for Ind in o:
                    fullName = self.getFullName(Ind)
                    listgeom.append(fullName)
            # get frame instance
            for index in ind:
                value = self.lc2.entries[index][0]
                if string.find(value,"frame") < 0: return
                frameInd = int(string.split(value,'_')[1])
                frameGeom = self.framelist[frameInd][0]
                for geom in listgeom:
                    # strip the root
                    l = string.split(geom,'|')
                    if not frameGeom.has_key(l[1]):
                        frameGeom[l[1]]=[]
                    for i in l[2:]:
                        if not( i in frameGeom[l[1]]):
                            frameGeom[l[1]].append(i)

            self.updatelistchooser(self.framelist)
        else:
            return
        
    def updatelistchooser(self,entry):
        """ update what is display in the list chooser """
        # save current selection
        sel  = self.lc2.get()
        # remove current entry
        self.lc2.clear()
        prefix = '~'
        prefix2 = '~~'
        nb= 0
        for e in entry:
            v = 'frame_'+str(nb)
            nb = nb+1
            # listchooser entry has to be a tuple(value,comment)
            self.lc2.add((v,))
            for mol in e[0].keys():
                self.lc2.add((prefix+mol,))
                for geom in e[0][mol]:
                    self.lc2.add((prefix2+geom,))
        # select the entry save as sel
        # keep the entry selected after the update
        for i in sel:
            self.lc2.select((i,))


    def findFramefromGeomInd(self,index):
        """ return the frame number from  which the geom was selected """
        for i in range(index+1):
            value = self.lc2.entries[index-i][0]
            if string.find(value,"frame") >= 0:
                frameInd =  int(string.split(value,'_')[1])
                lcInd = index -i
                return (frameInd,lcInd)
        return 0
    
    def findParentGeom(self,index):
        """ find the parent value name from a geom ~~
        go up to find first value with onley ~ """
        parent = None
        for i in range(index+1):
            parent = self.lc2.entries[index -i][0]
            if parent[0] == '~' and parent[1] !='~':
                parent = parent[1:]
                return parent
        return  None
    
    def removeEntryGeom(self,value,index):
        """ the geom entry in the listchooser"""
        # first find from which frame we need to remove geom
        val = self.findFramefromGeomInd(index)
        if val:
            frameInd =val[0]
            lcInd = val[1]
            if value[1] == '~':
                parent = self.findParentGeom(index)
                if parent:
                    listgeom = self.framelist[frameInd][0][parent]
                    rindex = listgeom.index(value[2:])
                    del listgeom[rindex]
                
            elif self.framelist[frameInd][0].has_key(value[1:]):
                del self.framelist[frameInd][0][value[1:]]
            
            self.updatelistchooser(self.framelist)
            
    def removeEntryFrame(self,value,index):
        """ remove the frame entry in the listchooser"""
        # delete frame from framelist
        frameInd = int(string.split(value,'_')[1])
        del self.framelist[frameInd]
        # Update list chooser
        self.updatelistchooser(self.framelist)
        
    def remove_cb(self):
        """ remove entry in litschooser (geomtoload)"""
        selindex = self.lc2.getInd()
        for index in selindex:
            value = self.lc2.entries[index][0]
            if string.find(value,"frame") >= 0:
                self.removeEntryFrame(value,index)
            elif value[0] == '~':
                self.removeEntryGeom(value,index)
示例#41
0
    def buildForm(self, master=None, width=100, height=80, title=None):
        if self.form:
            self.form.deiconify()
            self.createKeyBindings()
            return
        self.master = master
        ifd = self.ifd = InputFormDescr(title=title)
        ifd.append({
            'name': 'fileopen',
            'widgetType': Tkinter.Button,
            'tooltip': "Opens file browser",
            'wcfg': {
                'text': "Save As:",
                'command': self.browseFile,
                'width': 0,
                'height': 0,
            },
            'gridcfg': {
                'sticky': 'w',
                'column': 0
            }
        })
        ifd.append({
            'name': 'filename',
            'widgetType': Pmw.EntryField,
            'tooltip': "type filename",
            'gridcfg': {
                'sticky': 'w',
                #'columnspan': 3},
                'columnspan': 2,
                'row': -1
            },
            'wcfg': {
                'command': self.getFileName,
                #'label_text':'Save As',
                'entry_width': 12,
                'value': self.fileName,
                #'labelpos':'w'}})
            }
        })

        ## ifd.append({'name':'fileopen',
        ##                     'widgetType':Tkinter.Button,
        ##                     'tooltip': "Open file browser",
        ##                     'wcfg':{'text':"...",
        ##                             'command': self.browseFile,
        ##                             'width': 0, 'height': 0,},
        ##                     'gridcfg':{'sticky':'w', 'column':2, 'row':-1}
        ##                     })
        ifd.append({
            'name': 'recordB',
            'widgetType': Tkinter.Checkbutton,
            'tooltip': 'start/stop recording',
            'wcfg': {
                'variable': self.RecVar,
                'bd': 2,
                'image': self.record1Icon,
                'width': self.record1Icon.width(),
                'height': self.record1Icon.height(),
                'indicatoron': 0,
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1
            },
            'command': self.record_cb
        })

        ifd.append({
            'name': 'pauseB',
            'widgetType': Tkinter.Checkbutton,
            'tooltip': 'pause/start recording',
            'wcfg': {
                'variable': self.PauseVar,
                'bd': 2,
                'image': self.pauseIcon,
                'width': self.pauseIcon.width(),
                'height': self.pauseIcon.height(),
                'indicatoron': 0,
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1
            },
            'command': self.pause_cb
        })

        ifd.append({
            'name': 'stopB',
            'widgetType': Tkinter.Button,
            'tooltip': 'stop recording',
            'wcfg': {
                'bd': 2,
                'image': self.stopIcon,
                'width': self.stopIcon.width(),
                'height': self.stopIcon.height(),
            },
            'gridcfg': {
                'sticky': 'nesw',
                'row': -1
            },
            'command': self.stop_cb
        })

        ##         ifd.append({'name': 'recordB',
        ##                     'widgetType': Tkinter.Button,
        ##                     'tooltip':'start/pause recording',
        ##                     'wcfg':{'bd':4,
        ##                             'image':self.recordIcon,
        ##                             'width':self.recordIcon.width(),
        ##                             'height':self.recordIcon.height()
        ##                             },
        ##                     'gridcfg':{'sticky':'nesw','row':-1},
        ##                     'command':self.record_cb})

        ##         ifd.append({'name': 'pauseB',
        ##                     'widgetType': Tkinter.Button,
        ##                     'tooltip':'pause recording',
        ##                     'wcfg':{'bd':4,
        ##                             'image':self.pauseIcon,
        ##                             'width':self.pauseIcon.width(),
        ##                             'height':self.pauseIcon.height()
        ##                             },
        ##                     'gridcfg':{'sticky':'nesw', 'row':-1},
        ##                     'command':self.pause_cb})

        ##         ifd.append({'name': 'modeB',
        ##                     'widgetType': Tkinter.Button,
        ##                     'text':'Change Mode',
        ##                     'tooltip':'opens panel to change video parameters',
        ##                     'wcfg':{'bd':4,
        ##                             'image':self.chmodIcon,
        ##                             'width':self.chmodIcon.width(),
        ##                             'height':self.chmodIcon.height()
        ##                             },
        ##                     'gridcfg':{'sticky':'nesw','row':-1},
        ##                     'command':self.setparams_cb })

        ##         ifd.append({'name': 'closeB',
        ##             'widgetType': Tkinter.Button,
        ##             'text':'Close',
        ##             'tooltip':'closes video recorder',
        ##             'wcfg':{'bd':2,
        ##                     'image':self.closeIcon,
        ##                     'width':self.closeIcon.width(),
        ##                     'height':self.closeIcon.height(),
        ##                     },
        ##             'gridcfg':{'sticky':'nesw','row':-1},
        ##             'command':self.close_cb})
        form = self.form = InputForm(self.master,
                                     None,
                                     descr=ifd,
                                     modal=0,
                                     blocking=0,
                                     closeWithWindow=1,
                                     onDestroy=self.close_cb)
        self.createKeyBindings()
        return form
    def SetMode_cb(self, event=None):
        #print 'SetMode'
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        #play framerate is frame/per second
        if not hasattr(self, 'playModeForm'):
            self.showPlayMode = Tkinter.IntVar()
            self.showFrameParmWidgets = Tkinter.IntVar()
            self.playModeVar = Tkinter.StringVar()
            self.playModeVar.set('once and stop')
            self.playModeList=[ 'once and stop', 
                                'continuously in 1 direction',
                                'once in 2 directions', 
                                'continuously in 2 directions']
            self.frameParmsList=[ 'framerateLabel','framerateTW','startFrameLabel', 
                                  'startFrameTW', 'endFrameLabel', 'endFrameTW', 
                                  'stepSizeLabel', 'stepSizeTW']

            #self.showListVar = Tkinter.IntVar()
            ifd2 = InputFormDescr(title='Set Play Options')    
            ## ifd2.append({'name':'selectCB',
##                 'widgetType': Tkinter.Checkbutton,
##                 'tooltip':'show ids of current ordered conformation list',
##                 'wcfg':{ 'text':'Show Conf List',
##                         #'command': self.showStatesList,
##                         #'variable': self.showListVar,
##                        },
##                 'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})
##                 #'gridcfg':{'sticky':'ew'}})
            ifd2.append({'name':'playModeMb',
                'widgetType': Tkinter.Menubutton,
                'tooltip':'set play mode choice',
                'wcfg':{ 'text':'Play Mode',
                       },
                'gridcfg':{'sticky':'we'}})
                #'gridcfg':{'sticky':'w', 'columnspan':2}})
            ifd2.append({'name':'adjustFrameParmsMb',
                'widgetType': Tkinter.Checkbutton,
                'tooltip':'opens panel to set play rate, start conf number, end conf number \nand step size for playing conf sequence',
                'wcfg':{ 'text':'Play Parameters',
                        'command': self.showFrameParms_cb,
                        'variable': self.showFrameParmWidgets,
                       },
                'gridcfg':{'sticky':'w', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'framerateLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'frame rate:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'framerateTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set max num of confs to be displayed per second',
                    'wcfg':{'labCfg':{'fg':'black', 'side':'left', 'text':''},
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':100,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.framerate,
                        'oneTurn':100,
                        'type':'float',
                        'increment':.1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'red'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'startFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'start frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'startFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set number of first conf to be displayed',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':self.endFrame,
                        'lockBMin':0,
                        'lockBMax':1,
                        'lockBIncrement':1,
                        'value':self.startFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'ew', 'row':-1,  'column':1}})
            ifd2.append( {'name': 'endFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'end frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'endFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set number of last conf to be displayed',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':self.startFrame,
                        'max':self.maxFrame,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.endFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'stepSizeLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'step size:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'stepSizeTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set step before next conf number: default is 1',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':1,
                        'max':1000,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.stepSize,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'blue'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append({'name':'buildB',
                'widgetType': Tkinter.Button,
                'tooltip':'build a new molecule with current conf coords\nand add it to viewer',
                'wcfg':{ 'text':'Build Current',
                        'command': self.Build_cb,
                       },
                'gridcfg':{'sticky':'we'}})
                #'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})

            ifd2.append({'name':'writeB',
                'widgetType': Tkinter.Button,
                'tooltip':'write a new file with current conf coords',
                'wcfg':{ 'text':'Write Current',
                        'command': self.Write_cb,
                       },
                #'gridcfg':{'sticky':'we'}})
                'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})         

            ifd2.append({'name':'cancelB',
                        'widgetType': Tkinter.Button,
                        'wcfg':{
                            'text': 'Close',
                            'command': self.cancelPlayMode_cb,
                        },
                        #'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})
                        'gridcfg':{'sticky':'ew','columnspan':2}}),
            self.playModeForm = InputForm(self.master, self.root,
                        descr = ifd2,
                        modal = 0, blocking = 0)
            self.framerateWidget = ifd2.entryByName['framerateTW']['widget']
            self.startFrameWidget = ifd2.entryByName['startFrameTW']['widget']
            self.endFrameWidget = ifd2.entryByName['endFrameTW']['widget']
            self.stepSizeWidget = ifd2.entryByName['stepSizeTW']['widget']
            self.frameParmCfgs = []
            self.frameParmWidgets = []
            for i in self.frameParmsList:
                ent = ifd2.entryByName[i]
                self.frameParmCfgs.append(ent['gridcfg'])
                self.frameParmWidgets.append(ent['widget'])
            self.playModeMb = ifd2.entryByName['playModeMb']['widget']
            self.playModeMb.bind('<ButtonPress>', self.buildPlayModeMenu, add='+')
            self.showFrameParms_cb()
            #self.showList = ifd2.entryByName['selectCB']['widget']
        else:
            self.playModeVar.set(self.playModeList[self.playMode])
            self.framerateWidget.set(self.framerate)
            self.startFrameWidget.set(self.startFrame)
            self.endFrameWidget.set(self.endFrame)
            self.stepSizeWidget.set(self.stepSize)
            self.playModeForm.deiconify()
        self.playModeForm.autoSize()
示例#43
0
    def buildForm2(self, titleStr):
        self.stop = 1
        if hasattr(self, "form"):
            if hasattr(self.form, "deiconify"):
                self.form.deiconify()
                return
        maxval = self.endFrame
        ifd = InputFormDescr(title=titleStr)

        if self.buttonMask.get("gotoStartB", None) is not False:
            ifd.append(
                {
                    "name": "gotoStartB",
                    "widgetType": Tkinter.Button,
                    #'text':'gotoStart',
                    "tooltip": "sets frame to current startFrame",
                    "wcfg": {
                        "bd": 4,
                        "image": self.gotoStartIcon,
                        "width": self.gotoStartIcon.width(),
                        "height": self.gotoStartIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw"},
                    "command": self.GoToStart_cb,
                }
            )

        if self.buttonMask.get("fastReverseB", None) is not False:
            ifd.append(
                {
                    "name": "fastReverseB",
                    "widgetType": Tkinter.Button,
                    #'text':'fastReverse',
                    "tooltip": "play reverse as fast as possible",
                    "wcfg": {
                        "bd": 4,
                        "image": self.ff_revIcon,
                        "width": self.ff_revIcon.width(),
                        "height": self.ff_revIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                    "command": self.FastReverse_cb,
                }
            )

        if self.buttonMask.get("playRevB", None) is not False:
            ifd.append(
                {
                    "name": "playRevB",
                    "widgetType": Tkinter.Button,
                    #'text':'Play Reverse',
                    "tooltip": "play reverse according to current play mode",
                    "wcfg": {
                        "bd": 4,
                        "image": self.playRevIcon,
                        "width": self.playRevIcon.width(),
                        "height": self.playRevIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 2},
                    "command": self.PlayRev_cb,
                }
            )

            if self.hasCounter:
                ifd.append(
                    {
                        "widgetType": Pmw.Counter,
                        "name": "statesCounter",
                        "required": 1,
                        "tooltip": "used to show frames via random access",
                        "wcfg": {  #'labelpos': 'n,
                            #'label_text':'conformation:  ',
                            "autorepeat": 0,
                            "entryfield_value": self.startFrame,
                            #'entryfield_value':self.idList[0],
                            "datatype": self.custom_counter,
                            "entry_width": 3,
                            "entryfield_validate": self.custom_validate,
                        },
                        "gridcfg": {"sticky": "nesw", "row": -1, "column": 3, "columnspan": 2},
                    }
                )

        if self.buttonMask.get("playB", None) is not False:
            ifd.append(
                {
                    "name": "playB",
                    "widgetType": Tkinter.Button,
                    #'text':'Play',
                    "tooltip": "play forward according to current play mode",
                    "wcfg": {
                        "bd": 4,
                        "image": self.playIcon,
                        "width": self.playIcon.width(),
                        "height": self.playIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 5},
                    "command": self.Play_cb,
                }
            )

        if self.buttonMask.get("fastForwardB", None) is not False:
            ifd.append(
                {
                    "name": "fastForwardB",
                    "widgetType": Tkinter.Button,
                    #'text':'fastForward',
                    "tooltip": "play as fast as possible",
                    "wcfg": {
                        "bd": 4,
                        "image": self.ff_fwdIcon,
                        "width": self.ff_fwdIcon.width(),
                        "height": self.ff_fwdIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 6},
                    "command": self.FastForward_cb,
                }
            )

        if self.buttonMask.get("gotoEndB", None) is not False:
            ifd.append(
                {
                    "name": "gotoEndB",
                    "widgetType": Tkinter.Button,
                    #'text':'gotoEnd',
                    "tooltip": "sets frame to current endFrame",
                    "wcfg": {
                        "bd": 4,
                        "image": self.gotoEndIcon,
                        "width": self.gotoEndIcon.width(),
                        "height": self.gotoEndIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 7},
                    "command": self.GoToEnd_cb,
                }
            )

        if self.buttonMask.get("modeB", None) is not False:
            ifd.append(
                {
                    "name": "modeB",
                    "widgetType": Tkinter.Button,
                    "text": "Change Mode",
                    "tooltip": "opens panel to change play options",
                    "wcfg": {
                        "bd": 4,
                        "image": self.chmodIcon,
                        "width": self.chmodIcon.width(),
                        "height": self.chmodIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 8},
                    "command": self.SetMode_cb,
                }
            )

        if pymediaFound and self.buttonMask.get("recordB", None) is not False:
            ifd.append(
                {
                    "name": "recordB",
                    "widgetType": Tkinter.Checkbutton,
                    "text": "Record",
                    "tooltip": "record an mpeg movie into movie_####.mpg",
                    "defaultValue": 0,
                    "wcfg": {
                        "bd": 4,
                        "variable": Tkinter.IntVar(),
                        "image": self.recIcon,
                        "width": self.recIcon.width(),
                        "height": self.recIcon.height(),
                        "indicatoron": 0,
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 9},
                    "command": self.startRecording_cb,
                }
            )

        if self.buttonMask.get("setanimB", None) is not False:
            ifd.append(
                {
                    "name": "setanimB",
                    "widgetType": Tkinter.Button,
                    "text": "SetAnim",
                    "tooltip": "Set Animation",
                    "wcfg": {"bd": 4},
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 10},
                    "command": self.SetAnim_cb,
                }
            )

        if self.buttonMask.get("closeB", None) is not False:
            ifd.append(
                {
                    "name": "closeB",
                    "widgetType": Tkinter.Button,
                    "text": "Close",
                    "tooltip": "closes player",
                    "wcfg": {
                        "bd": 4,
                        "image": self.closeIcon,
                        "width": self.closeIcon.width(),
                        "height": self.closeIcon.height(),
                    },
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 11},
                    #'gridcfg':{'sticky':'nesw', 'columnspan':2},
                    "command": self.Close_cb,
                }
            )

        if self.hasSlider:
            ifd.append(
                {
                    "name": "slider",
                    "widgetType": Tkinter.Scale,
                    "wcfg": {"orient": "horizontal", "from_": self.startFrame, "to": self.maxFrame, "showvalue": False},
                    "gridcfg": {"sticky": "nesw", "row": 1, "column": 0, "columnspan": 12},
                    "command": self.nextFrame,
                }
            )
        # form = self.vf.getUserInput(ifd, modal=0,blocking=0)
        form = InputForm(self.master, self.root, descr=ifd, modal=0, blocking=0, closeWithWindow=1)
        form.ifd = ifd
        form.playB = form.ifd.entryByName["playB"]["widget"]
        form.playRevB = form.ifd.entryByName["playRevB"]["widget"]
        # set up link to balloon help which needs to change, also
        form.playTT = form.ifd.entryByName["playB"]["balloon"]
        form.playRevTT = form.ifd.entryByName["playRevB"]["balloon"]
        if self.hasCounter:
            ctr = ifd.entryByName["statesCounter"]["widget"]
            entF = ctr.component("entryfield")
            form.ent2 = entF._entryFieldEntry
            da = ctr.component("downarrow")
            ua = ctr.component("uparrow")
            for item in [da, ua]:
                item.bind("<ButtonPress-1>", self.SetState_cb, "+")
            form.ent2.bind("<Return>", self.SetState_cb, "+")
            form.counter = form.ifd.entryByName["statesCounter"]["widget"]
        if self.hasSlider:
            slider = form.ifd.entryByName["slider"]["widget"]
            slider.set(self.currentFrameIndex)
        # print 'returning form'
        return form
class TrajPlayer(Player):
    """ a GUI to play a trajectory. The class constructor takes a Trajectory object and
        a correspoonding molecule as arguments."""
    
    def __init__(self, mol, traj, vf, titleStr=None, sequenceList=None,
                        idList = None, delta=0, form2=1,
                        ask=1, **kw):
        
        self.mol = mol
        self.traj = traj
        self.startFrame = 0
        self.ask = ask
        mol.allAtoms.addConformation(mol.allAtoms.coords[:])
        self.coordSlot = len(mol.allAtoms[0]._coords) - 1
        self.update(sequenceList, idList)
        kw['master'] = vf.GUI.ROOT
        kw['endFrame'] = self.endFrame
        kw['maxFrame'] = self.endFrame
        kw['form2'] = form2
        kw['titleStr'] = titleStr
        self.vf = vf
        apply(Player.__init__, (self,), kw)
        try:
            self.form.ifd.entryByName['setanimB']['widget'].grid_forget()
            #print 'withdrew SetAnim button'
            self.form.autoSize()
        except:
            pass

    def update(self, sequenceList=None, idList=None):
        if not sequenceList:
            self.sequenceList = range(len(self.traj.coords))
            #self.sequenceList = self.traj.coords.keys()
        else :
            self.sequenceList = sequenceList
        lenSeq = len(self.sequenceList)
        self.maxFrame = lenSeq
        self.endFrame = lenSeq
        if self.startFrame>lenSeq:
            self.startFrame = 0

        if hasattr(self, 'playModeForm'):
            e = self.playModeForm.descr.entryByName
            endTW = e['endFrameTW']['widget']
            #print 'setting endTW to ', self.endFrame
            endTW.max = self.endFrame
            endTW.set(self.endFrame)
            startTW = e['startFrameTW']['widget']
            startTW.set(self.startFrame)
        if not idList:
            #insert 0 for original state
            idL = range(0, len(self.sequenceList) + 1)
            self.idList = map(str, idL)
        else:
            self.idList = map(str, idList)
        #print "self.idList", self.idList
        
        if hasattr(self, 'form'):
            if hasattr(self.form, 'ent2'):
                newLen = max(map(len, self.idList))
                if newLen>3:
                    #print 'update:updating ent2 width'
                    self.form.ent2.config(width=newLen)
                self.form.ent2.delete(0,'end')
                #could use startFrame if it is valid here:
                if self.startFrame<=len(self.sequenceList) and self.startFrame>0:
                    next_val = str(self.idList[self.startFrame])
                    self.form.ent2.insert(0, next_val)
                    self.currentFrameIndex = self.startFrame
                    self.applyState(self.startFrame-1)
                else:
                    #print "restarting from frame =", self.idList[0]
                    #print self.startFrame, ": index out of range for ", sequenceList, "; resetting startFrame to  0"
                    self.form.ent2.insert(0, str(self.idList[0]))
                    #this calls applyState with reset flag
                    self.applyState(-1)


    def applyState(self, ind):
        """None<-applyState(ind)"""
        mol = self.mol
        # -1 is key for go back to original
        if int(ind)==-1:
            mol.allAtoms.setConformation(0)
            conf = None
        else:
            
            #in this case want to get new coords
            #coords = self.traj.coords["frame%d"%ind]
            coords = self.traj.coords[ind]
            coordsarr = (Numeric.array(coords)*10).astype("f")
            allAtoms = self.mol.allAtoms
            allAtoms.updateCoords(coordsarr[:], self.coordSlot)

        if not self.vf.hasGui: return
        event = EditAtomsEvent('coords', mol.allAtoms)
        self.vf.dispatchEvent(event)
        #modEvent = ModificationEvent('edit','coords', mol.allAtoms)
        #mol.geomContainer.updateGeoms(modEvent)
        self.vf.GUI.VIEWER.Redraw()
        #self.showStats()


   


    def SetMode_cb(self, event=None):
        #print 'SetMode'
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        #play framerate is frame/per second
        if not hasattr(self, 'playModeForm'):
            self.showPlayMode = Tkinter.IntVar()
            self.showFrameParmWidgets = Tkinter.IntVar()
            self.playModeVar = Tkinter.StringVar()
            self.playModeVar.set('once and stop')
            self.playModeList=[ 'once and stop', 
                                'continuously in 1 direction',
                                'once in 2 directions', 
                                'continuously in 2 directions']
            self.frameParmsList=[ 'framerateLabel','framerateTW','startFrameLabel', 
                                  'startFrameTW', 'endFrameLabel', 'endFrameTW', 
                                  'stepSizeLabel', 'stepSizeTW']

            #self.showListVar = Tkinter.IntVar()
            ifd2 = InputFormDescr(title='Set Play Options')    
            ## ifd2.append({'name':'selectCB',
##                 'widgetType': Tkinter.Checkbutton,
##                 'tooltip':'show ids of current ordered conformation list',
##                 'wcfg':{ 'text':'Show Conf List',
##                         #'command': self.showStatesList,
##                         #'variable': self.showListVar,
##                        },
##                 'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})
##                 #'gridcfg':{'sticky':'ew'}})
            ifd2.append({'name':'playModeMb',
                'widgetType': Tkinter.Menubutton,
                'tooltip':'set play mode choice',
                'wcfg':{ 'text':'Play Mode',
                       },
                'gridcfg':{'sticky':'we'}})
                #'gridcfg':{'sticky':'w', 'columnspan':2}})
            ifd2.append({'name':'adjustFrameParmsMb',
                'widgetType': Tkinter.Checkbutton,
                'tooltip':'opens panel to set play rate, start conf number, end conf number \nand step size for playing conf sequence',
                'wcfg':{ 'text':'Play Parameters',
                        'command': self.showFrameParms_cb,
                        'variable': self.showFrameParmWidgets,
                       },
                'gridcfg':{'sticky':'w', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'framerateLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'frame rate:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'framerateTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set max num of confs to be displayed per second',
                    'wcfg':{'labCfg':{'fg':'black', 'side':'left', 'text':''},
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':100,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.framerate,
                        'oneTurn':100,
                        'type':'float',
                        'increment':.1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'red'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'startFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'start frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'startFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set number of first conf to be displayed',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':self.endFrame,
                        'lockBMin':0,
                        'lockBMax':1,
                        'lockBIncrement':1,
                        'value':self.startFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'ew', 'row':-1,  'column':1}})
            ifd2.append( {'name': 'endFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'end frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'endFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set number of last conf to be displayed',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':self.startFrame,
                        'max':self.maxFrame,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.endFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append( {'name': 'stepSizeLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'step size:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'stepSizeTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'tooltip':'set step before next conf number: default is 1',
                    'wcfg':{
                        'labCfg':{
                            'fg':'black',
                            'side':'left',
                            'text':''
                            },
                        'showLabel':1, 'width':100,
                        'min':1,
                        'max':1000,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.stepSize,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'callback':self.setMode_cb,
                        'canvascfg':{'bg':'blue'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':0, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            ifd2.append({'name':'buildB',
                'widgetType': Tkinter.Button,
                'tooltip':'build a new molecule with current conf coords\nand add it to viewer',
                'wcfg':{ 'text':'Build Current',
                        'command': self.Build_cb,
                       },
                'gridcfg':{'sticky':'we'}})
                #'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})

            ifd2.append({'name':'writeB',
                'widgetType': Tkinter.Button,
                'tooltip':'write a new file with current conf coords',
                'wcfg':{ 'text':'Write Current',
                        'command': self.Write_cb,
                       },
                #'gridcfg':{'sticky':'we'}})
                'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})         

            ifd2.append({'name':'cancelB',
                        'widgetType': Tkinter.Button,
                        'wcfg':{
                            'text': 'Close',
                            'command': self.cancelPlayMode_cb,
                        },
                        #'gridcfg':{'sticky':'ew', 'row':-1, 'column':1}})
                        'gridcfg':{'sticky':'ew','columnspan':2}}),
            self.playModeForm = InputForm(self.master, self.root,
                        descr = ifd2,
                        modal = 0, blocking = 0)
            self.framerateWidget = ifd2.entryByName['framerateTW']['widget']
            self.startFrameWidget = ifd2.entryByName['startFrameTW']['widget']
            self.endFrameWidget = ifd2.entryByName['endFrameTW']['widget']
            self.stepSizeWidget = ifd2.entryByName['stepSizeTW']['widget']
            self.frameParmCfgs = []
            self.frameParmWidgets = []
            for i in self.frameParmsList:
                ent = ifd2.entryByName[i]
                self.frameParmCfgs.append(ent['gridcfg'])
                self.frameParmWidgets.append(ent['widget'])
            self.playModeMb = ifd2.entryByName['playModeMb']['widget']
            self.playModeMb.bind('<ButtonPress>', self.buildPlayModeMenu, add='+')
            self.showFrameParms_cb()
            #self.showList = ifd2.entryByName['selectCB']['widget']
        else:
            self.playModeVar.set(self.playModeList[self.playMode])
            self.framerateWidget.set(self.framerate)
            self.startFrameWidget.set(self.startFrame)
            self.endFrameWidget.set(self.endFrame)
            self.stepSizeWidget.set(self.stepSize)
            self.playModeForm.deiconify()
        self.playModeForm.autoSize()

    def buildPlayModeMenu(self, event=None):
        mB = self.playModeMb
        keyList = self.playModeList
        if not self.showPlayMode.get():
            #mB.config(bg='white')
            if not hasattr(mB, 'menu'):
                mB.menu = Tkinter.Menu(mB)
                mB['menu'] = mB.menu
            else:
                mB.menu.delete(1, 'end')
            for i in range(len(keyList)):
                mB.menu.add_radiobutton(label=keyList[i], var=self.playModeVar, 
                            value=keyList[i], command=self.setMode_cb)
            self.showPlayMode.set(1)
        else:
            mB.menu.unpost()
            self.showPlayMode.set(0)
            
    def showFrameParms_cb(self, event=None):
        if not self.showFrameParmWidgets.get():
            for w in self.frameParmWidgets:
                w.grid_forget()
        else:
            for i in range(len(self.frameParmWidgets)):
                w = self.frameParmWidgets[i]
                cfg = self.frameParmCfgs[i]
                w.grid(cfg)
        self.playModeForm.autoSize()

    def setMode_cb(self, event=None):
        curVal = self.playModeVar.get()
        #print 'setting playMode to ', curVal
        self.playMode = self.playModeList.index(curVal)
        #print 'setting playMode to ', curVal
        self.framerate = round(self.framerateWidget.get(),4)
        #print 'setting self.framerate ->', self.framerate
        self.timestamp= 1./self.framerate
        self.startFrame = self.startFrameWidget.get()
        self.endFrame = self.endFrameWidget.get()
        #print 'set endFrame to', self.endFrame
        self.stepSize = self.stepSizeWidget.get()
        self.playMode = self.playModeList.index(curVal)
        #i think this restarts the player's trip memory
        #that is, hasn't gone in any direction yet
        self.oneDirection = 0
        if not self.stop:
            self.stop = 1
            self.play(self.framerate)

            

    def setPlayMode_cb(self, event=None):
        self.setMode_cb()
        self.cancelPlayMode_cb()
        self.oneDirection = 0
        

    def SetRMSRef_cb(self, event=None):
        print 'in SetRMSRef_cb'
        return


    def Build_cb(self, event=None):
        #print building current
        """None<-Build_cb(mol, event=None)

        builds new molecule with current coordinates and adds it to the viewer
        """
        #FIRST CHECK THAT THIS HASN'T already been built
        #get the current counter content for name of new molecule
        #w = self.form.ifd.entryByName['statesCounter']['widget']
        numStr = self.form.counter.get()
        #numStr = w.get()
        #remember idList has '0' always added at the beginning for input conf
        confInd =  self.idList.index(numStr) - 1
        #CHECK THIS IS CORRECT!!!
        conf = self.sequenceList[confInd]
        self.buildConf(conf, numStr)


    def buildConf(self, conf, nameStr):
        newname = self.mol.name + '_conf_' + nameStr
        if newname in self.vf.Mols.name:
            msg = newname + ' already in viewer. Not building a second copy'
            self.vf.warningMsg(msg)
            return 'ERROR'
        allLines = self.mol.parser.allLines
        newLines = []
        coords = self.mol.allAtoms.coords
        natoms = len(coords)
        ctr = 0
        parser = self.mol.parser.__class__()
        if isinstance(parser, groParser):
            newLines.append(allLines[0])
            newLines.append(allLines[1])
            for l in allLines[2:natoms+2]:
                cc = coords[ctr]/10
                newLines.append(l[:20] +'%8.3f%8.3f%8.3f'%(cc[0],cc[1],cc[2])+ l[44:])
                ctr = ctr+1
            for l in allLines[natoms+2:]:
                newLines.append(l)
        else:
            for l in allLines:
                if find(l, 'ATOM')==0 or find(l, 'HETA')==0:
                    cc = coords[ctr]
                    newLines.append(l[:30] +'%8.3f%8.3f%8.3f'%(cc[0],cc[1],cc[2])+ l[54:])
                    ctr = ctr+1
                else:
                    newLines.append(l)
        
        parser.allLines = newLines
        filename = parser.filename = self.mol.parser.filename + '_conf_' + nameStr
        newMol = parser.parse()[0]          
        newMol.name = newname
        newMol = self.vf.addMolecule(newMol, ask=self.ask)


    def Write_cb(self, event=None):
        #print writing current
        """None<-Write_cb(mol, event=None)
        writes a new file with current coordinates
        """
        filename = self.vf.askFileSave(types=[('pdb files','*.pdb'),('pdbq files', '*.pdbq'),
                        ('pdbqt files', '*.pdbqt'), ('.gro. files', '*.gro'), ("all", "*")], 
                        title="write current conf:")
        if filename is not None:
            self.write_conf(filename)



    def write_conf(self, filename):       
            fptr = open(filename, 'w')
            ctr = 0
            liglines = self.mol.parser.allLines
            coords = self.mol.allAtoms.coords
            natoms = len(coords)
            if isinstance(self.mol.parser, groParser):
                fptr.write(liglines[0])
                fptr.write(liglines[1])
                for l in liglines[2:natoms+2]:
                    cc = coords[ctr]/10
                    fptr.write(l[:20] +'%8.3f%8.3f%8.3f'%(cc[0],cc[1],cc[2])+ l[44:])
                    ctr +=1
            for l in liglines[natoms+2:]:
                fptr.write(l)
            else:
                for l in liglines:
                    if l.find("ATOM")!=0 and l.find("HETATM")!=0:
                        l += "\n"
                        fptr.write(l)
                    else:
                        crds = coords[ctr] 
                        rec = "%s%8.3f%8.3f%8.3f%s\n"%(l[:30],crds[0], crds[1], crds[2],l[54:] ) 
                        fptr.write(rec)
                        ctr += 1
            fptr.close()
示例#45
0
    def SetMode_cb(self, event=None):
        # print 'SetMode'
        # playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        # play framerate is frame/per second
        if not hasattr(self, "playModeForm"):
            self.playModeList = [
                "once and stop",
                "continuously in 1 direction",
                "once in 2 directions",
                "continuously in 2 directions",
            ]
            ifd2 = InputFormDescr(title="Set Play Mode")

            ifd2.append(
                {
                    "name": "playModeLabel",
                    "widgetType": Tkinter.Label,
                    "wcfg": {"text": "play mode options:", "font": (ensureFontCase("helvetica"), 12, "bold")},
                    "gridcfg": {"sticky": "w"},
                }
            )

            ifd2.append(
                {
                    "name": "playMode",
                    "widgetType": Tkinter.Radiobutton,
                    "defaultValue": self.playModeList[self.playMode],
                    "listtext": self.playModeList,
                    "gridcfg": {"sticky": "w"},
                }
            )

            ifd2.append(
                {
                    "name": "framerateTW",
                    "widgetType": ThumbWheel,
                    "tooltip": """Framerate to enforce during playback""",
                    "gridcfg": {"sticky": "we"},
                    "wcfg": {
                        "value": self.framerate,
                        "oneTurn": 100.0,
                        "type": "float",
                        "continuous": True,
                        "wheelPad": 2,
                        "width": 145,
                        "height": 18,
                        "labCfg": {"text": "framerate:  "},
                    },
                }
            )

            ifd2.append(
                {
                    "name": "startFrameTW",
                    "widgetType": ThumbWheel,
                    "tooltip": """First frame used in playback""",
                    "gridcfg": {"sticky": "we"},
                    "wcfg": {
                        "value": self.startFrame,
                        "oneTurn": 100,
                        "type": "int",
                        "continuous": True,
                        "wheelPad": 2,
                        "width": 145,
                        "height": 18,
                        "labCfg": {"text": "start frame: "},
                    },
                }
            )

            ifd2.append(
                {
                    "name": "endFrameTW",
                    "widgetType": ThumbWheel,
                    "tooltip": """Last frame used in playback""",
                    "gridcfg": {"sticky": "we"},
                    "wcfg": {
                        "value": self.endFrame,
                        "oneTurn": 100,
                        "type": "int",
                        "continuous": True,
                        "wheelPad": 2,
                        "width": 145,
                        "height": 18,
                        "labCfg": {"text": " end frame: "},
                    },
                }
            )

            ifd2.append(
                {
                    "name": "stepSizeTW",
                    "widgetType": ThumbWheel,
                    "tooltip": """???""",
                    "gridcfg": {"sticky": "we"},
                    "wcfg": {
                        "value": self.stepSize,
                        "oneTurn": 100,
                        "type": "int",
                        "continuous": True,
                        "wheelPad": 2,
                        "width": 145,
                        "height": 18,
                        "labCfg": {"text": " step size:  "},
                    },
                }
            )

            ifd2.append(
                {
                    "name": "acceptB",
                    "widgetType": Tkinter.Button,
                    "wcfg": {"text": "ok", "command": self.setPlayMode_cb},
                    "gridcfg": {"sticky": "nesw"},
                }
            )

            ifd2.append(
                {
                    "name": "cancelB",
                    "widgetType": Tkinter.Button,
                    "wcfg": {"text": "cancel", "command": self.cancelPlayMode_cb},
                    "gridcfg": {"sticky": "nesw", "row": -1, "column": 1},
                }
            )
            if self.master is None:
                master = self.root
            else:
                master = Tkinter.Toplevel()
            self.playModeForm = InputForm(master, None, descr=ifd2, modal=0, blocking=0)
            self.playModeVar = self.playModeForm.descr.entryByName["playMode"]["variable"]
            self.framerateWidget = self.playModeForm.descr.entryByName["framerateTW"]["widget"]
            self.startFrameWidget = self.playModeForm.descr.entryByName["startFrameTW"]["widget"]
            self.endFrameWidget = self.playModeForm.descr.entryByName["endFrameTW"]["widget"]
            self.stepSizeWidget = self.playModeForm.descr.entryByName["stepSizeTW"]["widget"]
        else:
            self.playModeForm.deiconify()
    def displayPanel(self, create):
        self.flag = 1
        if create == 0:
            self.optionsForm.deiconify()
        else:
            self.optionsForm = InputForm(self.master.master,
                                         self.root,
                                         descr=self.idf,
                                         modal=0,
                                         blocking=0)

            self.cont_entry = self.idf.entryByName['togCont']['widget']
            self.min_entry = self.idf.entryByName['inpMin']['widget']
            self.bmin_entry = self.idf.entryByName['togMin']['widget']
            self.max_entry = self.idf.entryByName['inpMax']['widget']
            self.bmax_entry = self.idf.entryByName['togMax']['widget']
            self.incr_entry = self.idf.entryByName['inpIncr']['widget']
            self.bincr_entry = self.idf.entryByName['togIncr']['widget']
            self.val_entry = self.idf.entryByName['inpVal']['widget']
            self.sens_entry = self.idf.entryByName['inpSens']['widget']
            self.lab_entry = self.idf.entryByName['togLabel']['widget']
            self.if_entry = self.idf.entryByName['togIntFloat']['widget']
            self.prec_entry = self.idf.entryByName['selPrec']['widget']

            if self.master.min is not None:
                val = self.master.type(self.master.min)
                self.minInput.set(self.master.labelFormat % val)
                self.toggleMin.set(1)
                self.min_entry.configure(state='normal', fg='gray0')
            else:
                self.min_entry.configure(state='disabled', fg='gray40')
            self.bmin_entry.configure(state='normal', fg='gray0')

            if self.master.max is not None:
                val = self.master.type(self.master.max)
                self.maxInput.set(self.master.labelFormat % val)
                self.toggleMax.set(1)
                self.max_entry.configure(state='normal', fg='gray0')
            self.bmax_entry.configure(state='normal', fg='gray0')

            if self.master.increment is not None:
                val = self.master.type(self.master.increment)
                self.incrInput.set(self.master.labelFormat % val)
                if self.master.increment != 0:
                    self.toggleIncr.set(1)
                self.incr_entry.configure(state='normal', fg='gray0')
            self.bincr_entry.configure(state='normal', fg='gray0')

            menus = (self.cont_entry, self.lab_entry, self.if_entry,
                     self.prec_entry)
            Pmw.alignlabels(menus)

            if self.master.continuous == None or self.master.continuous == 0:                \
                               i=1
            else:
                i = 0
            self.cont_entry.setitems(items=('on', 'off'), index=i)

            if self.master.type == int:
                self.if_entry.setitems(items=('float', 'int'), index=1)

            prc = int(self.master.precision) - 1
            if prc > 9: prc = 9
            self.prec_entry.setitems(items=('1', '2', '3', '4', '5', '6', '7',
                                            '8', '9', '10'),
                                     index=prc)

            self.lab_entry.setitems(items=('never', 'always', 'move'),
                                    index=self.master.showLabel)

            if self.if_entry.getcurselection() == 'int':
                self.showHidePrec('int')

            self.updateDisplay()
            self.lockUnlockDisplay()
示例#47
0
class AnimPlayer(Player, geomsChooser):
    """ provide a player to display/undisplay DejaVu object
    in a cylce making a animation.

    viewer: DejaVu viewer
    height,width are the property of the player gui
    startFrame: frame to begin
    endFrame: last frame to display
    stepSize: step between new frame
    playMode:                  #playMode options:
                               #   0   play once and stop
                               #   1   play continuously in 1 direction
                               #   2   play once in 2 directions
                               #   3   play continuously in 2 directions
    titleStr: title of the gui windows
    counter: gui with a counter on or not
    gui: #1 show the player gui
         #0 player gui not display
    framerate =15.             # number of frame per second to be display
    """
    def __init__(self,
                 viewer,
                 master=None,
                 root=None,
                 height=80,
                 width=200,
                 currentFrameIndex=0,
                 startFrame=0,
                 endFrame=0,
                 maxFrame=0,
                 stepSize=1,
                 playMode=1,
                 titleStr='AnimPlayer',
                 counter=1,
                 gui=1,
                 framerate=15.):

        if master is None:
            master = Tkinter.Toplevel()

        # viewer from which we get the geom to animate
        self.viewer = viewer
        # frame list, is a list of geom .
        # each frame is made of n DejaVu object to be display
        # it a list of tuple, each tuple is a {} and []
        # {} is: {'objname':['geom1','geom2'],'objname':['geom1','geom2']}
        # [] is list of DejaVu object per frame
        self.framelist = []

        Player.__init__(self,
                        master=master,
                        root=root,
                        height=height,
                        width=width,
                        currentFrameIndex=currentFrameIndex,
                        startFrame=startFrame,
                        endFrame=endFrame,
                        maxFrame=maxFrame,
                        stepSize=stepSize,
                        playMode=playMode,
                        titleStr=titleStr,
                        counter=counter,
                        gui=gui,
                        framerate=framerate)

    def nextFrame(self, id):
        """ id: index number of the frame to display.
        undisplay object from previous frame, display object
        of new frame.
        """
        if not self.framelist: return
        id = int(id)
        if id >= len(self.framelist): return

        i = self.currentFrameIndex
        ## undisplay previous object
        frame = self.framelist[i]
        for obj in frame[1]:
            obj.Set(visible=0, redo=0)

        if self.hasCounter and self.gui:
            self.form.ent2.delete(0, 'end')
            self.form.ent2.insert(0, str(id))

        ## display new frame
        currentframe = self.framelist[id]
        for obj in currentframe[1]:
            obj.Set(visible=1, redo=0)

        self.viewer.deleteOpenglList()
        self.viewer.Redraw()
        self.currentFrameIndex = id

#####################################################################
#### Animation Setting the frame

    def SetAnim_cb(self):
        self.showForm()

    def showForm(self):
        """create formdescr for setAnim
        form to set the animation:
        each frame is a list of geom to display
        """

        entryFrame = []
        for i in range(len(self.framelist)):
            val = 'frame_' + str(i)
            entryFrame.append((val, ))

        if not hasattr(self, 'form_Setanim'):
            ifd = InputFormDescr(title="SetAnimation")
            ifd.append({
                'widgetType': ListChooser,
                'name': 'availableGeom',
                'tooltip': 'geom available in viewer',
                'wcfg': {
                    'mode': 'extended',
                    'lbwcfg': {
                        'exportselection': 1
                    },
                    'command': [(self.toggleExpansion, '<Double-Button-1>')],
                    'commandEvent': None,
                    'title': 'availableGeom'
                },
                'gridcfg': {
                    'row': 0,
                    'column': 0,
                    'sticky': 'wens',
                    'rowspan': 3
                }
            })
            ifd.append({
                'name': 'newframe',
                'widgetType': Tkinter.Button,
                'tooltip': """ Add an empty frame to the animation""",
                'wcfg': {
                    'text': 'NewFrame',
                    'command': self.addframe_cb
                },
                'gridcfg': {
                    'row': 0,
                    'column': 1,
                    'rowspan': 1
                }
            })

            ifd.append({
                'name': 'add',
                'widgetType': Tkinter.Button,
                'tooltip': """ Add the selected geom to selected frame""",
                'wcfg': {
                    'text': 'AddGeom',
                    'command': self.add_cb
                },
                'gridcfg': {
                    'row': 1,
                    'column': 1,
                    'rowspan': 1
                }
            })

            ifd.append({
                'name': 'geomtoload',
                'widgetType': ListChooser,
                'tooltip': """list of frame  the user chose to
                        apply to the pattern""",
                'wcfg': {
                    'entries': entryFrame,
                    'mode': 'extended',
                    'lbwcfg': {
                        'exportselection': 0
                    },
                    'title': 'Frame(geom) to be display'
                },
                'gridcfg': {
                    'sticky': 'we',
                    'row': 0,
                    'column': 2,
                    'rowspan': 3
                }
            })
            ifd.append({
                'name': 'remove',
                'widgetType': Tkinter.Button,
                'tooltip': """ Remove the selected entry from the
                        commands to be applied to the object when loaded in the application""",
                'wcfg': {
                    'text': 'REMOVE',
                    'width': 10,
                    'command': self.remove_cb
                },
                'gridcfg': {
                    'sticky': 'we',
                    'row': 0,
                    'column': 3
                }
            })

            ifd.append({
                'name': 'oneup',
                'widgetType': Tkinter.Button,
                'tooltip': """Move the selected entry up one entry""",
                'wcfg': {
                    'text': 'Move up',
                    'width': 10,
                    'command': self.moveup_cb
                },
                'gridcfg': {
                    'sticky': 'we',
                    'row': 1,
                    'column': 3
                }
            })

            ifd.append({
                'name': 'onedown',
                'widgetType': Tkinter.Button,
                'tooltip': """Move the selected entry down one entry""",
                'wcfg': {
                    'text': 'Move down',
                    'width': 10,
                    'command': self.movedown_cb
                },
                'gridcfg': {
                    'sticky': 'we',
                    'row': 2,
                    'column': 3
                }
            })

            self.form_Setanim = InputForm(self.master,
                                          None,
                                          descr=ifd,
                                          scrolledFrame=0)

            self.lc = self.form_Setanim.descr.entryByName['availableGeom'][
                'widget']
            self.lc2 = self.form_Setanim.descr.entryByName['geomtoload'][
                'widget']
            self.addObject(self.viewer.rootObject, None)
            val = self.form_Setanim.go()
            if val:
                self.assign()
                self.form_Setanim.withdraw()
        else:
            self.form_Setanim.deiconify()
            val = self.form_Setanim.go()
            if val:
                self.assign()
                self.form_Setanim.withdraw()

    def deleteAnim(self):
        """ Delete all frame from the player list."""

        self.Stop_cb()
        self.startFrame = 0
        self.endFrame = -1
        self.maxFrame = 0
        self.targetFrame = self.endFrame
        self.target = self.endFrame
        self.currentFrameIndex = 0

    def assign(self, list=None):
        """ assign the animation.
        framelist ; list of {}
        return a list of obj for each frame
        """
        self.deleteAnim()
        AllObjects = self.viewer.rootObject.AllObjects()
        if list:
            self.framelist = []
            for f in list:
                self.framelist.append((f, []))
        print "assign"
        print "self.framelist", self.framelist
        for frame in self.framelist:
            geomDic = frame[0]
            Namelist = []
            for parents in geomDic.keys():
                parentlist = filter(lambda x, name=parents: x.name == name,
                                    AllObjects)
                obj = parentlist[0]
                childrens = geomDic[obj.name]
                if len(childrens) > 0:
                    for namegeom in childrens:
                        child = filter(lambda x, name=namegeom: x.name == name,
                                       obj.children)[0]
                        if child.children != []:
                            for c in child.children:
                                frame[1].append(c)
                        else:
                            frame[1].append(child)
                else:
                    frame[1].append(obj)

            self.endFrame = self.endFrame + 1
            self.maxFrame = self.maxFrame + 1
            self.targetFrame = self.endFrame
            self.target = self.endFrame

    def movedown_cb(self):
        """ move entry one down """
        sel = self.lc2.get()
        index = self.lc2.getInd()
        if not sel: return
        sel = sel[0]
        if string.find(sel, "frame") < 0: return
        # get frame Index
        frameInd = int(string.split(sel, '_')[1])
        currentframe = self.framelist[frameInd]
        if (frameInd + 1) >= len(self.framelist): return
        # select next Frame.
        nextframe = self.framelist[frameInd + 1]
        # move current frame one down in list
        self.framelist[frameInd] = nextframe
        self.framelist[frameInd + 1] = currentframe
        self.updatelistchooser(self.framelist)

    def moveup_cb(self):
        """ move entry one up """
        sel = self.lc2.get()
        index = self.lc2.getInd()
        if not sel: return
        sel = sel[0]
        if string.find(sel, "frame") < 0: return
        # get frame Index
        frameInd = int(string.split(sel, '_')[1])
        currentframe = self.framelist[frameInd]
        if (frameInd - 1) < 0: return
        # select previous Frame
        prevframe = self.framelist[frameInd - 1]
        # move current frame one up in list
        self.framelist[frameInd] = prevframe
        self.framelist[frameInd - 1] = currentframe
        self.updatelistchooser(self.framelist)

    def addframe_cb(self):
        """ add a new frame entry"""
        frame = ({}, [])
        nb = len(self.framelist)
        #frame.number = nbframe
        value = 'frame_' + str(nb)
        self.framelist.append(frame)
        self.lc2.deselect(0, last='end')
        self.lc2.insert('end', value)
        self.lc2.select('end')

    def add_cb(self):
        listgeom = []
        # get the frame index to add new geom
        if len(self.lc2.entries) > 0:
            ind = self.lc2.getInd()
            if len(ind) == 0: return  # no entry selected so create a new frame
            # get geom name to load
            o = map(int, self.lc.lb.curselection())
            for Ind in o:
                fullName = self.getFullName(Ind)
                listgeom.append(fullName)
            # get frame instance
            for index in ind:
                value = self.lc2.entries[index][0]
                if string.find(value, "frame") < 0: return
                frameInd = int(string.split(value, '_')[1])
                frameGeom = self.framelist[frameInd][0]
                for geom in listgeom:
                    # strip the root
                    l = string.split(geom, '|')
                    if not frameGeom.has_key(l[1]):
                        frameGeom[l[1]] = []
                    for i in l[2:]:
                        if not (i in frameGeom[l[1]]):
                            frameGeom[l[1]].append(i)

            self.updatelistchooser(self.framelist)
        else:
            return

    def updatelistchooser(self, entry):
        """ update what is display in the list chooser """
        # save current selection
        sel = self.lc2.get()
        # remove current entry
        self.lc2.clear()
        prefix = '~'
        prefix2 = '~~'
        nb = 0
        for e in entry:
            v = 'frame_' + str(nb)
            nb = nb + 1
            # listchooser entry has to be a tuple(value,comment)
            self.lc2.add((v, ))
            for mol in e[0].keys():
                self.lc2.add((prefix + mol, ))
                for geom in e[0][mol]:
                    self.lc2.add((prefix2 + geom, ))
        # select the entry save as sel
        # keep the entry selected after the update
        for i in sel:
            self.lc2.select((i, ))

    def findFramefromGeomInd(self, index):
        """ return the frame number from  which the geom was selected """
        for i in range(index + 1):
            value = self.lc2.entries[index - i][0]
            if string.find(value, "frame") >= 0:
                frameInd = int(string.split(value, '_')[1])
                lcInd = index - i
                return (frameInd, lcInd)
        return 0

    def findParentGeom(self, index):
        """ find the parent value name from a geom ~~
        go up to find first value with onley ~ """
        parent = None
        for i in range(index + 1):
            parent = self.lc2.entries[index - i][0]
            if parent[0] == '~' and parent[1] != '~':
                parent = parent[1:]
                return parent
        return None

    def removeEntryGeom(self, value, index):
        """ the geom entry in the listchooser"""
        # first find from which frame we need to remove geom
        val = self.findFramefromGeomInd(index)
        if val:
            frameInd = val[0]
            lcInd = val[1]
            if value[1] == '~':
                parent = self.findParentGeom(index)
                if parent:
                    listgeom = self.framelist[frameInd][0][parent]
                    rindex = listgeom.index(value[2:])
                    del listgeom[rindex]

            elif self.framelist[frameInd][0].has_key(value[1:]):
                del self.framelist[frameInd][0][value[1:]]

            self.updatelistchooser(self.framelist)

    def removeEntryFrame(self, value, index):
        """ remove the frame entry in the listchooser"""
        # delete frame from framelist
        frameInd = int(string.split(value, '_')[1])
        del self.framelist[frameInd]
        # Update list chooser
        self.updatelistchooser(self.framelist)

    def remove_cb(self):
        """ remove entry in litschooser (geomtoload)"""
        selindex = self.lc2.getInd()
        for index in selindex:
            value = self.lc2.entries[index][0]
            if string.find(value, "frame") >= 0:
                self.removeEntryFrame(value, index)
            elif value[0] == '~':
                self.removeEntryGeom(value, index)
示例#48
0
    def SetMode_cb(self, event=None):
        #print 'SetMode'
        #playMode options:
        #   0   play once and stop
        #   1   play continuously in 1 direction
        #   2   play once in 2 directions
        #   3   play continuously in 2 directions
        #play framerate is frame/per second
        if not hasattr(self, 'playModeForm'):
            self.playModeList=[ 'once and stop', 
                                'continuously in 1 direction',
                                'once in 2 directions', 
                                'continuously in 2 directions']
            ifd2 = InputFormDescr(title='Set Play Mode')    
            ifd2.append( {'name': 'playModeLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'play mode options:', 
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name':'playMode',
                        'widgetType': Tkinter.Radiobutton,
                        'defaultValue': self.playModeList[self.playMode],
                        'listtext':self.playModeList,
                        'gridcfg':{'sticky':'w'}})
            ifd2.append( {'name': 'framerateLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'framerate:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'framerateTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'wcfg':{
                        'labcfg':{
                            'fg':'black',
                            'side':'left',
                            'text':'       '
                            },
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':100,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.framerate,
                        'oneTurn':100,
                        'type':'float',
                        'increment':.1,
                        'canvascfg':{'bg':'red'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':1, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw'}})

            ifd2.append( {'name': 'startFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'start frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'startFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'wcfg':{
                        'labcfg':{
                            'fg':'black',
                            'side':'left',
                            'text':'       '
                            },
                        'showLabel':1, 'width':100,
                        'min':0,
                        'max':self.endFrame,
                        'lockBMin':0,
                        'lockBMax':1,
                        'lockBIncrement':1,
                        'value':self.startFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':1, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw'}})
            ifd2.append( {'name': 'endFrameLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'end frame:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'endFrameTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'wcfg':{
                        'labcfg':{
                            'fg':'black',
                            'side':'left',
                            'text':'       '
                            },
                        'showLabel':1, 'width':100,
                        'min':self.startFrame,
                        'max':self.maxFrame,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.endFrame,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'canvascfg':{'bg':'green'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':1, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw'}})
            ifd2.append( {'name': 'stepSizeLabel',
                    'widgetType':Tkinter.Label,
                    'wcfg':{'text':'step size:',
                        'font':(ensureFontCase('helvetica'),12,'bold')},
                    'gridcfg':{'sticky':'w'}})
            ifd2.append({'name': 'stepSizeTW',
                    'wtype':ThumbWheel,
                    'widgetType':ThumbWheel,
                    'wcfg':{
                        'labcfg':{
                            'fg':'black',
                            'side':'left',
                            'text':'       '
                            },
                        'showLabel':1, 'width':100,
                        'min':1,
                        'max':1000,
                        'lockBMin':1,
                        'lockBMax':0,
                        'lockBIncrement':1,
                        'value':self.stepSize,
                        'oneTurn':10,
                        'type':'int',
                        'increment':1,
                        'canvascfg':{'bg':'blue'},
                        'wheelLabcfg1':{'font':(ensureFontCase('times'),14,'bold')},
                        'wheelLabcfg2':{'font':(ensureFontCase('times'),14,'bold')},
                        'continuous':1, 'wheelPad':1, 'height':20},
                    'gridcfg':{'sticky':'nesw'}})
            ifd2.append({'name':'acceptB',
                        'widgetType': Tkinter.Button,
                        'wcfg':{
                            'text': 'ok',
                            'command': self.setPlayMode_cb,
                        },
                        'gridcfg':{'sticky':'nesw'}})
            ifd2.append({'name':'cancelB',
                        'widgetType': Tkinter.Button,
                        'wcfg':{
                            'text': 'cancel',
                            'command': self.cancelPlayMode_cb,
                        },
                        'gridcfg':{'sticky':'nesw', 'row':-1, 'column':1}})
            self.playModeForm = InputForm(self.master, self.root,
                        descr = ifd2,
                        modal = 0, blocking = 0)
            self.playModeVar = self.playModeForm.descr.entryByName['playMode']['variable']
            self.framerateWidget = self.playModeForm.descr.entryByName['framerateTW']['widget']
            self.startFrameWidget = self.playModeForm.descr.entryByName['startFrameTW']['widget']
            self.endFrameWidget = self.playModeForm.descr.entryByName['endFrameTW']['widget']
            self.stepSizeWidget = self.playModeForm.descr.entryByName['stepSizeTW']['widget']
        else:
            self.playModeForm.deiconify()