home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 56 / CDPowerplay56Disc2.iso / demos / blade / data1.cab / Program_Executable_Files / Lib / Widgets / KeybWidget.py < prev    next >
Encoding:
Python Source  |  2000-10-27  |  15.9 KB  |  428 lines

  1.  
  2.  
  3. import MenuWidget
  4. import ScorerWidgets
  5. import Raster
  6. import BInput
  7. import BUIx
  8. import MenuText
  9. import ListWidget
  10. import pdb
  11. import math
  12.  
  13. import Raster
  14. import Bladex
  15. import acts
  16. import netwidgets
  17.  
  18. AdditionalKeysCallBack = None
  19.  
  20. DefInfoText = "Press ENTER to define key, DELETE to delete bindings, ESC to exit"
  21.  
  22. ActionDescriptor= {
  23.                    "Attack"        : "Used to kill, mutilate and destroy",
  24.                    "Forwards"      : "Double-tap FORWARDS to Run.",
  25.                    "Backwards"     : "Press FORWARDS and BACKWARDS simultaneously to turn 180 degrees.",
  26.                    "Select Enemy"  : "Press SELECT ENEMY to lock the movement around an enemy",
  27.                    "Use"           : "To pick up an object, press USE",
  28.                    "Jump"          : "Press JUMP while running to perform a long jump.",
  29.                    "Throw"         : "While holding down THROW, press ATTACK.",
  30.                   }
  31.  
  32. class B_ControlItemText(MenuWidget.B_MenuItemText):
  33.   def __init__(self,Parent,MenuDescr,StackMenu,font_server=ScorerWidgets.font_server):
  34.     MenuWidget.B_MenuItemText.__init__(self,Parent,MenuDescr,StackMenu,font_server)
  35.     self.SetDrawFunc(self.Draw)
  36.     self.SetAlpha(1.0)
  37.     self.ChangingKey=0  #
  38.     #self.SetColor(1.0)
  39.     self.SelectionFilterUpdated=0
  40.     self.FilterUpdated=0
  41.     self.SetColor(220,10,10)
  42.     self._foc=-1
  43.     self.ActionName = None
  44.  
  45.   def SetText(self,text,ActionName=None):
  46.     MenuWidget.B_MenuItemText.SetText(self,text)
  47.     self.SelectionFilterUpdated=0
  48.     self.FilterUpdated=0
  49.     self.ActionName = ActionName
  50.  
  51.   def Draw(self,x,y,time):
  52.     if self.GetVisible()==0:
  53.       return
  54.  
  55.     #self.SetAlpha(0.5)
  56.  
  57.     foc=self.GetHasFocus()
  58.     if foc!=self._foc:        
  59.       self.SelectionFilterUpdated=0
  60.       self.FilterIncX=0
  61.       self.FilterUpdated=0
  62.  
  63.     self._foc=foc
  64.     w,h=self.GetSize()
  65.  
  66.     if foc:
  67.       if self.ActionName:
  68.         if ActionDescriptor.has_key(self.ActionName):
  69.           netwidgets.LabelName = MenuText.GetMenuText(ActionDescriptor[self.ActionName])
  70.         else:
  71.           netwidgets.LabelName = " "
  72.       if self.ChangingKey:
  73.         mult=math.cos(time*2)
  74.         self.SetColor(80*mult+150,80*mult+150,45*mult+105)
  75.         self.DefDraw(x,y,time)
  76.         return
  77.       elif self.SelectionFilterUpdated:
  78.         Raster.SetPosition(x-self.FilterIncX,y-self.FilterIncY)
  79.         Raster.DrawImage(w+2*self.FilterIncX,h+2*self.FilterIncY,"RGB","Native",self.SelectionFilter.GetImageBuffer())
  80.         self.SetColor(220,220,150)
  81.         self.DefDraw(x,y,time)
  82.         self.SetColor(220,10,10)
  83.         return
  84.     else:
  85. ##      if self.Filter is None:
  86. ##        self.CreateBlur(x,y,time)
  87. ##      Raster.SetPosition(x-2,y-2)
  88. ##      Raster.DrawImage(w+4,h+4,"RGB","Native",self.Filter.GetImageBuffer())
  89. ##      if Raster.GetClipActive():
  90. ##        print self.Name(),"ClipActive:",Raster.GetClipWindow()
  91. ##      else:
  92. ##        print self.Name(),"ClipNoActive:"
  93.       self.DefDraw(x,y,time)
  94.       return
  95.  
  96.     if foc:
  97.       #self.CreateDistorsion(x,y,time)
  98.       #if self.Filter is None:
  99.       #  self.CreateBlur(x,y,time)
  100.       #  self.FilterUpdated=1
  101.       #sfw,sfh=self.Filter.GetDimension()
  102.       #self.SelectionFilter.CopySubBuffer(self.FilterIncX-2,0,sfw,sfh,self.Filter.GetImageBuffer(),"AddInc")
  103.       #self.SelectionFilter.GetFromBuffer2("Substract")
  104.       #Raster.SetPosition(x-self.FilterIncX,y-self.FilterIncY)
  105.       #Raster.DrawImage(w+2*self.FilterIncX,h+2*self.FilterIncY,"RGB","Native",self.SelectionFilter.GetImageBuffer())
  106.       self.SetColor(250,250,250)
  107.       self.DefDraw(x,y,time)
  108.       self.SetColor(220,10,10)
  109.  
  110.       if self.FilterIncX>25:
  111.         self.SelectionFilterUpdated=1
  112.       else:
  113.         self.SelectionFilterUpdated=0
  114.  
  115.  
  116.  
  117.  
  118. class B_ControlItemTexts(BUIx.B_FrameWidget,MenuWidget.B_MenuTreeItem):
  119.   def __init__(self,Parent,MenuDescr,StackMenu):
  120.     BUIx.B_FrameWidget.__init__(self,Parent,MenuDescr["Name"],400,15)
  121.     MenuWidget.B_MenuTreeItem.__init__(self,MenuDescr,StackMenu)
  122.     self.wActionName=B_ControlItemText(self,MenuDescr,StackMenu)
  123.     self.wActionKeys=B_ControlItemText(self,MenuDescr,StackMenu)
  124.     self.AddWidget(self.wActionName,0,0,
  125.                    BUIx.B_FrameWidget.B_FR_AbsoluteLeft,BUIx.B_FrameWidget.B_FR_Left,
  126.                    BUIx.B_FrameWidget.B_FR_AbsoluteTop,BUIx.B_FrameWidget.B_FR_Top)
  127.     self.AddWidget(self.wActionKeys,0,0,
  128.                    BUIx.B_FrameWidget.B_FR_AbsoluteRight,BUIx.B_FrameWidget.B_FR_Right,
  129.                    BUIx.B_FrameWidget.B_FR_AbsoluteTop,BUIx.B_FrameWidget.B_FR_Top)
  130.     self.HasFocus=0
  131.     self.SetClipDraw(0)
  132.  
  133.  
  134.   def __del__(self):
  135.     BUIx.B_FrameWidget.__del__(self)
  136.     MenuWidget.B_MenuTreeItem.__del__(self)
  137.  
  138.   def SetHasFocus(self,foc):
  139.     self.HasFocus=foc
  140.     self.wActionName.SetHasFocus(foc)
  141.     self.wActionKeys.SetHasFocus(foc)
  142.  
  143.   def GetHasFocus(self,foc):
  144.     return self.HasFocus
  145.  
  146.  
  147.  
  148.  
  149. class ControlMenuItem(B_ControlItemTexts):
  150.   def __init__(self,Parent,MenuDescr,StackMenu):
  151.     #Bldb.set_trace()
  152.     B_ControlItemTexts.__init__(self,Parent,MenuDescr,StackMenu)
  153.     self.ActionName=MenuDescr["Action"]
  154.     self.IManager=BInput.GetInputManager()
  155.     oldInputActionsSet=self.IManager.GetInputActionsSet()
  156.     self.IManager.SetInputActionsSet("Default")
  157.     IActions=self.IManager.GetInputActions()
  158.     self.IAction=IActions.Find(self.ActionName)
  159.     self.KeyBounded=[]
  160.     self.Parent=Parent
  161.     self.Extras = MenuDescr["kFlags"]
  162.  
  163.     if self.IAction.Name()!="NULL":
  164.       for i in range(self.IAction.nInputEvents()):
  165.           IEvent=self.IAction.GetnInputEvent(i)
  166.           if(IEvent.GetDevice()=="Keyboard" or IEvent.GetDevice()=="Mouse" or IEvent.GetDevice()=="Pad"):
  167.             self.KeyBounded.append(IEvent.GetKey())
  168.     else:
  169.       print "Can┤t find",self.ActionName
  170.  
  171.     self.BaseText=MenuDescr["Name"]
  172.     self.wActionName.SetText(self.BaseText,self.ActionName)
  173.     self.wActionKeys.SetText(str(self.KeyBounded))
  174.     self.RecalcLayout()
  175.     self.IManager.SetInputActionsSet(oldInputActionsSet)
  176.  
  177.     self.ListenerName=MenuDescr["Name"]+" Listener"
  178.     self.Listener=BInput.B_InputListener(self.ListenerName) #No se puede heredar m·ltiple de una clase generada por SWIG
  179.     self.Listener.SetPythonFunc(self.ListenDevice)
  180.  
  181.  
  182.     self.MouseListenerName=MenuDescr["Name"]+" MouseListener"
  183.     self.MouseListener=BInput.B_InputListener(self.MouseListenerName) #No se puede heredar m·ltiple de una clase generada por SWIG
  184.     self.MouseListener.SetPythonFunc(self.ListenMouseDevice)
  185.  
  186.     self.PadListenerName=MenuDescr["Name"]+" PadListener"
  187.     self.PadListener=BInput.B_InputListener(self.PadListenerName) #No se puede heredar m·ltiple de una clase generada por SWIG
  188.     self.PadListener.SetPythonFunc(self.ListenPadDevice)
  189.  
  190.  
  191.   def BeginDefineKey(self):
  192.     if len(self.KeyBounded)>=3:
  193.       self.SetStatusText(MenuText.GetMenuText("Maximun number of key bindings reached."))
  194.       return
  195.     self.SetStatusText(MenuText.GetMenuText("Press desired key, ESC to end"))
  196.     keyb=self.IManager.GetAttachedDevice("Keyboard")
  197.     if keyb.this!="NULL":
  198.         keyb.AddListener(self.Listener)
  199.     keyb=self.IManager.GetAttachedDevice("Mouse")
  200.     if keyb.this!="NULL":
  201.         keyb.AddListener(self.MouseListener)
  202.     keyb=self.IManager.GetAttachedDevice("Pad")
  203.     if keyb.this!="NULL":
  204.         keyb.AddListener(self.PadListener)
  205.     self.oldInputActionsSet=self.IManager.GetInputActionsSet()
  206.     self.IManager.SetInputActionsSet("MenuRedefine")
  207.     self.wActionName.ChangingKey=1
  208.     self.wActionKeys.ChangingKey=1
  209.  
  210.  
  211.  
  212.   def EndDefineKey(self):
  213.     self.SetStatusText(MenuText.GetMenuText(DefInfoText))
  214.     self.IManager.SetInputActionsSet(self.oldInputActionsSet)
  215.     keyb=self.IManager.GetAttachedDevice("Keyboard")
  216.     if keyb.this!="NULL":
  217.         keyb.RemoveListener(self.ListenerName)
  218.     keyb=self.IManager.GetAttachedDevice("Mouse")
  219.     if keyb.this!="NULL":
  220.         keyb.RemoveListener(self.MouseListenerName)
  221.     keyb=self.IManager.GetAttachedDevice("Pad")
  222.     if keyb.this!="NULL":
  223.         keyb.RemoveListener(self.PadListenerName)
  224.  
  225.     self.wActionName.ChangingKey=0
  226.     self.wActionName.SelectionFilterUpdated=0
  227.     self.wActionName.FilterUpdated=0
  228.  
  229.     self.wActionKeys.ChangingKey=0
  230.     self.wActionKeys.SelectionFilterUpdated=0
  231.     self.wActionKeys.FilterUpdated=0
  232.  
  233.  
  234.   def ListenDevice(self,x,y,z):
  235.     if z==1.0:
  236.       if x=="Esc":
  237.         self.EndDefineKey()
  238.       elif x not in self.KeyBounded:
  239.         keyb=self.IManager.GetAttachedDevice("Keyboard")
  240.         self.IManager.SetInputActionsSet("Default")
  241.         if keyb.IsBinded(x):
  242.           self.SetStatusText(MenuText.GetMenuText("The key <")+x+MenuText.GetMenuText("> is already used!"))
  243.         elif len(self.KeyBounded)>=3:
  244.           self.SetStatusText(MenuText.GetMenuText("You already have 3 keys assigned to that action"))
  245.         else:
  246.           self.IAction.AddEvent(keyb,x,1)
  247.           for k in self.Extras:
  248.               if   k[0] == "Press":
  249.                   self.IManager.GetInputActions().Find(k[1]).AddEvent(keyb,x,1)
  250.               elif k[0] == "Release":
  251.                   self.IManager.GetInputActions().Find(k[1]).AddEvent(keyb,x,0)
  252.               else:
  253.                   print "ERROR : '",k[0],"' is not defined yet!"
  254.           self.KeyBounded.append(x)
  255.           self.IManager.SetInputActionsSet("MenuRedefine")
  256.           self.wActionKeys.SetText(str(self.KeyBounded))
  257.           self.RecalcLayout()
  258.           self.EndDefineKey()
  259.  
  260.   def ListenMouseDevice(self,x,y,z):
  261.     if (x!="X_Axis") and (x!="Y_Axis") and (x!="Z_Axis"):
  262.       if x not in self.KeyBounded:
  263.         keyb=self.IManager.GetAttachedDevice("Mouse")
  264.         self.IManager.SetInputActionsSet("Default")
  265.         if keyb.IsBinded(x) or len(self.KeyBounded)>=3:
  266.           self.SetStatusText(MenuText.GetMenuText("The mouse action <")+x+MenuText.GetMenuText("> is already used!"))
  267.           pass
  268.         else:
  269.           self.IAction.AddEvent(keyb,x,1)
  270.           for k in self.Extras:
  271.               if   k[0] == "Press":
  272.                   self.IManager.GetInputActions().Find(k[1]).AddEvent(keyb,x,1)
  273.               elif k[0] == "Release":
  274.                   self.IManager.GetInputActions().Find(k[1]).AddEvent(keyb,x,0)
  275.               else:
  276.                   print "ERROR : '",k[0],"' is not defined yet!"
  277.           self.KeyBounded.append(x)
  278.           self.IManager.SetInputActionsSet("MenuRedefine")
  279.           self.wActionKeys.SetText(str(self.KeyBounded))
  280.           self.RecalcLayout()
  281.           self.EndDefineKey()
  282.  
  283.   def ListenPadDevice(self,x,y,z):
  284.       if x not in self.KeyBounded:
  285.         keyb=self.IManager.GetAttachedDevice("Pad")
  286.         self.IManager.SetInputActionsSet("Default")
  287.         if keyb.IsBinded(x) or len(self.KeyBounded)>=3:
  288.           self.SetStatusText(MenuText.GetMenuText("The pad action <")+x+MenuText.GetMenuText("> is already used!"))
  289.           pass
  290.         else:
  291.           self.IAction.AddEvent(keyb,x,1)
  292.           for k in self.Extras:
  293.               if   k[0] == "Press":
  294.                   self.IManager.GetInputActions().Find(k[1]).AddEvent(keyb,x,1)
  295.               elif k[0] == "Release":
  296.                   self.IManager.GetInputActions().Find(k[1]).AddEvent(keyb,x,0)
  297.               else:
  298.                   print "ERROR : '",k[0],"' is not defined yet!"
  299.           self.KeyBounded.append(x)
  300.           self.IManager.SetInputActionsSet("MenuRedefine")
  301.           self.wActionKeys.SetText(str(self.KeyBounded))
  302.           self.RecalcLayout()
  303.           self.EndDefineKey()
  304.  
  305.   def SuprMenuItem(self):
  306.     self.IManager.SetInputActionsSet("Default")
  307.     self.IAction.RemoveAllEvents()
  308.     for k in self.Extras:
  309.       if   k[0] == "Press":
  310.         self.IManager.GetInputActions().Find(k[1]).RemoveAllEvents()
  311.       elif k[0] == "Release":
  312.         self.IManager.GetInputActions().Find(k[1]).RemoveAllEvents()
  313.       else:
  314.         print "ERROR : '",k[0],"' is not defined yet!"
  315.     
  316.     self.KeyBounded=[]
  317.     self.wActionKeys.SetText("")
  318.     self.wActionKeys.SelectionFilterUpdated=0
  319.     self.wActionKeys.FilterUpdated=0
  320.     self.RecalcLayout()
  321.     self.IManager.SetInputActionsSet("Menu")
  322.  
  323.   def SetStatusText(self,text):
  324.     self.Parent.SetStatusText(text)
  325.  
  326.  
  327.   def FinalRelease(self):
  328.     self.Parent=None
  329.  
  330.  
  331.  
  332.  
  333. MOUSE_CONTROLS = ["RightButton","LeftButton","MiddleButton","OtherButton"]
  334.  
  335. class B_KeybListWidget(ListWidget.B_ListWidget):
  336.   def __init__(self,Parent,Menudesc,StackMenu,VertPos=0):
  337.     ListWidget.B_ListWidget.__init__(self,Parent,Menudesc,StackMenu,VertPos)
  338.     self.StatusText=BUIx.B_TextWidget(self,"Status",MenuText.GetMenuText(DefInfoText),ScorerWidgets.font_server,"..\\..\\Data\\Letras menu peq.bmp")
  339.     self.StatusText.SetColor(200,200,200)
  340.     self.StatusText.SetAlpha(1)
  341.     self.AddLabel(self.StatusText,0.5,25,BUIx.B_Widget.B_LAB_HCenter,BUIx.B_Widget.B_LAB_Bottom,
  342.                   BUIx.B_Widget.B_FR_HRelative,BUIx.B_Widget.B_LAB_HCenter,
  343.                   BUIx.B_Widget.B_FR_AbsoluteTop,BUIx.B_Widget.B_FR_Top)
  344.     self.DownArrow.SetAlpha(1) # Parche, no funciona la llamada a AdjustScrollArrows() en AddMenuElement(),
  345.                             
  346.                                # hasta que lo averigⁿe.
  347.     self.SetClipDraw(1)
  348.     self.SetDrawFunc(self.Draw)
  349.  
  350.   def __del__(self):
  351.     #print "B_KeybListWidget.B_KeybListWidget.__del__()"
  352.     SaveListConfig()
  353.     if AdditionalKeysCallBack:
  354.        AdditionalKeysCallBack()
  355.     ListWidget.B_ListWidget.__del__(self)
  356.  
  357.   def Draw(self,x,y,time):
  358.     #pdb.set_trace()
  359.     self.SetClipDraw(1)
  360.     self.DefDraw(x,y,time)
  361.  
  362.   def SetStatusText(self,text):
  363.     self.StatusText.SetText(text)
  364.     self.RecalcLabelLayout(BUIx.B_Widget.B_LAB_HCenter,BUIx.B_Widget.B_LAB_Bottom)
  365.  
  366.  
  367.   def FinalRelease(self):
  368.     ListWidget.B_ListWidget.FinalRelease(self)
  369.  
  370. def SaveReleaseKey(cfgfile,Action,key,adaction,device):
  371.           text='Bladex.AssocKey("%s","%s","%s",ON_RELEASE)\n'%(adaction,device,key)
  372.           cfgfile.write(text)
  373.  
  374. def NewAction(cfgfile,Action,key,adaction,device):
  375.  
  376.           text='Bladex.AssocKey("%s","%s","%s")\n'%(adaction,device,key)
  377.           cfgfile.write(text)
  378.  
  379.  
  380. def SaveListConfig():
  381.     cfgfile=open('..\\..\\Scripts\\Control.py','w')
  382.     cfgfile.write('\n\n# File generated automatically\n')
  383.     cfgfile.write('# DO NOT EDIT: Changes will be lost\n\n\n')
  384.  
  385.     cfgfile.write('ON_RELEASE=0\n')
  386.     cfgfile.write('ON_PRESS=1    # default\n\n\n\n')
  387.  
  388.     cfgfile.write('import BInput\n')
  389.     cfgfile.write('InputManager=BInput.GetInputManager()\n')
  390.     cfgfile.write('InputManager.SetInputActionsSet("Default")  # Me aseguro de definir las acciones en el grupo correcto\n\n\n')
  391.  
  392.     IManager = BInput.GetInputManager()
  393.     oldInputActionsSet = IManager.GetInputActionsSet()
  394.     IManager.SetInputActionsSet("Default")
  395.     IActions=IManager.GetInputActions()
  396.     
  397.     for i in acts.ConfigurableActions:
  398.       IAction=IActions.Find(i[1])
  399.       
  400.       if IAction.Name()=="NULL":
  401.         print "Can┤t find",self.ActionName
  402.         continue
  403.       
  404.       for j in range(IAction.nInputEvents()):
  405.           IEvent=IAction.GetnInputEvent(j)
  406.           IDevice=IEvent.GetDevice()
  407.           if(IDevice=="Keyboard" or IDevice=="Mouse" or IDevice=="Pad"):
  408.             text='Bladex.AssocKey("%s","%s","%s")\n'%(IAction.Name(),IDevice,IEvent.GetKey())
  409.             cfgfile.write(text)
  410.             for k in i[2]:
  411.               if   k[0]=="Release":
  412.                 SaveReleaseKey(cfgfile,IAction.Name(),IEvent.GetKey(),k[1],IDevice)
  413.               elif k[0]=="Press":
  414.                 NewAction(cfgfile,IAction.Name(),IEvent.GetKey(),k[1],IDevice)
  415.               else:
  416.                 print "ERROR: '"+k[0]+" is not defined!"
  417.  
  418.     IManager.SetInputActionsSet(oldInputActionsSet)
  419.     
  420.     cfgfile.write('\n# Mouse stuff\nBladex.AssocKey("RotateX","Mouse","X_Axis")\nBladex.AssocKey("RotateY","Mouse","Y_Axis")\n')
  421.     MouseData = Bladex.GetMouseState()
  422.     text = 'Bladex.SetMouseState(%i,%f,%f)\n'%(MouseData[0],MouseData[1],MouseData[2])
  423.     cfgfile.write(text)
  424.     
  425.  
  426.     cfgfile.write('\n# Have a nice day.\n\n\n')
  427.     cfgfile.close()
  428.