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

  1.  
  2.  
  3. import BUIx
  4. import Bladex
  5. import Raster
  6. import ScorerWidgets
  7. import WidgetsExtra
  8. import SpinWidget
  9. import TextFXWidget
  10. import pdb
  11. #import Bldb
  12. import BInput
  13. #import IDebug
  14. import BBLib
  15. import MenuText
  16. import sys
  17.  
  18.  
  19. import netgame
  20.  
  21. #if netgame.GetNetState()==0:
  22. #  import Scorer
  23.  
  24. class Stack:
  25.   def __init__(self):
  26.     #print "Stack.__init__()"
  27.     self.Items=[]
  28.  
  29.   def __del__(self):
  30.     #print "Stack.__del__()"
  31.     pass
  32.  
  33.   def nItems(self):
  34.     return len(self.Items)
  35.  
  36.   def Push(self,item):
  37.     self.Items.append(item)
  38.  
  39.   def Pop(self):
  40.     self.Items=self.Items[:-1]
  41.  
  42.   def Top(self):
  43.     try:
  44.       return self.Items[-1]
  45.     except:
  46.       return None
  47.  
  48.   def Reset(self):
  49.     self.Items=[]
  50.  
  51.  
  52.  
  53.  
  54. class MenuStack(Stack):
  55.   def __init__(self,final_callback):
  56.     Stack.__init__(self)
  57.     self.FinalCallBack=final_callback
  58.  
  59.   def Push(self,menu_item):
  60.     #print "MenuStack Pushing",menu_item,"with refcount",sys.getrefcount(menu_item)
  61.     s=self.Top()
  62.     if not s:
  63.       Bladex.SetAppMode("Menu")
  64.     Bladex.SetRootWidget(menu_item.GetPointer())
  65.     Stack.Push(self,menu_item)
  66.     #print "RefCount (pushed)",sys.getrefcount(menu_item)
  67.  
  68.   def Pop(self):
  69.     #print "MenuStack.Popping",self.Top(),"with refcount",sys.getrefcount(self.Top())
  70.     Stack.Pop(self)
  71.     s=self.Top()
  72.     if s:
  73.       Bladex.SetRootWidget(s.GetPointer())
  74.     else:
  75.       #print "Final CallBack"
  76.       self.FinalCallBack()
  77.  
  78.  
  79.  
  80. class B_MenuFocusManager:
  81.   def __init__(self):
  82.     #print "B_MenuFocusManager.__init__()"
  83.     self.MenuItems=[]
  84.     self.Focus=None # Voy a llevar el foco aquφ en vez de dejarselo al C.
  85.  
  86.   def __del__(self):
  87.     #print "B_MenuFocusManager.__del__()"
  88.     self.Focus=None
  89.     self.MenuItems=[]
  90.  
  91.   def AddMenuElement(self,menu_element):
  92.     #print "B_MenuFocusManager.AddMenuElement()  (init)->",menu_element, sys.getrefcount(self)
  93.     self.MenuItems.append(menu_element)
  94.     self.Focus=menu_element
  95.     #print "B_MenuFocusManager.AddMenuElement()  (end)->", sys.getrefcount(self)
  96.  
  97.  
  98.   def GetFocus(self):
  99.     return self.Focus
  100.  
  101.  
  102.   def SetFocus(self,menu_element):
  103.     accepts_focus=0
  104.     try:
  105.       accepts_focus=menu_element.AcceptsFocus()
  106.     except:
  107.       pass
  108.  
  109.     if accepts_focus==1:
  110.       old_foc=self.GetFocus()
  111.       if menu_element==old_foc:
  112.         return 1
  113.       if old_foc:
  114.           old_foc.SetHasFocus(0)
  115.       menu_element.SetHasFocus(1)
  116.       self.Focus=menu_element
  117.       return 1
  118.  
  119.     return 0
  120.  
  121.  
  122.  
  123.   def SetFocus_Idx(self,menu_element_idx):
  124.     try:
  125.       menu_element=self.MenuItems[menu_element_idx]
  126.       self.SetFocus(menu_element)
  127.     except:
  128.       print "Error setting focus to index",menu_element_idx
  129.  
  130.  
  131.  
  132.   def NextFocus(self):
  133.     try:
  134.       old_focus=self.GetFocus()
  135.       index=self.MenuItems.index(old_focus)
  136.       list=self.MenuItems[index+1:]+self.MenuItems[:index]
  137.       for i in list:
  138.         if self.SetFocus(i):
  139.           try:
  140.               i.FocusCallBack(i)
  141.           except AttributeError:
  142.               pass
  143.           return
  144.     except:
  145.       print "B_MenuFocusManager::NextFocus() -> Exception ocurred."
  146.       pass
  147.  
  148.  
  149.  
  150.   def PrevFocus(self):
  151.     try:
  152.       old_focus=self.GetFocus()
  153.       index=self.MenuItems.index(old_focus)
  154.  
  155.       l1=self.MenuItems[:index]
  156.       l2=self.MenuItems[index+1:]
  157.       l1.reverse()
  158.       l2.reverse()
  159.       list=l1+l2
  160.  
  161.       for i in list:
  162.         if self.SetFocus(i):
  163.           try:
  164.               i.FocusCallBack(i)
  165.           except AttributeError:
  166.               pass
  167.           return
  168.  
  169.     except:
  170.       print "B_MenuFocusManager::PrevFocus() -> Exception ocurred."
  171.       pass
  172.  
  173.   def FinalRelease(self):
  174. ##    print "B_MenuFocusManager.FinalRelease()"
  175.     for i in self.MenuItems:
  176.       try:
  177.         i.FinalRelease()
  178.       except:
  179.         pass
  180.  
  181.  
  182.  
  183.  
  184. class B_MenuFrameWidget(B_MenuFocusManager,BUIx.B_FrameWidget):
  185.   def __init__(self,Parent,Name,Width,Height,VertPos=0):
  186.     #pdb.set_trace()
  187.     #print "B_MenuFrameWidget.__init__()"
  188.     BUIx.B_FrameWidget.__init__(self,Parent,Name,Width,Height)
  189.     B_MenuFocusManager.__init__(self)
  190.     self.VertPos=VertPos
  191.     self.thisown=1
  192.     self.SetAutoScale(1)
  193.     #print "B_MenuFrameWidget.__init__() End",Name,Width,Height
  194.  
  195.   def __del__(self):
  196.     #print "B_MenuFrameWidget.__del__()",self.Name()
  197.     for i in self.MenuItems:
  198.       #print "Deletting SetDrawFunc() of",i
  199.       i.SetDrawFunc(None)
  200.  
  201.     B_MenuFocusManager.__del__(self)
  202.     BUIx.B_FrameWidget.__del__(self)
  203.  
  204.  
  205. #  def __str__(self):
  206. #    print "class B_MenuFrameWidget ",self.Name()
  207.  
  208.  
  209.   def AddMenuElement(self,menu_element,sep=0,
  210.                      HPos=0.5,HIndicator=BUIx.B_FrameWidget.B_FR_HRelative,HAnchor=BUIx.B_FrameWidget.B_FR_HCenter):
  211.     B_MenuFocusManager.AddMenuElement(self,menu_element)
  212.  
  213.     self.AddWidget(menu_element,HPos,self.VertPos+sep,
  214.                    HIndicator,HAnchor,
  215.                    BUIx.B_FrameWidget.B_FR_AbsoluteTop,BUIx.B_FrameWidget.B_FR_Top)
  216.  
  217.     self.VertPos=self.VertPos+menu_element.GetSize()[1]+sep
  218.     #print self.VertPos
  219.     self.SetFocus(menu_element.Name())
  220.     #print "B_MenuFrameWidget.AddMenuElement()  (end)->", sys.getrefcount(self)
  221.  
  222.  
  223.   def AddMenuElementEx(self,menu_element,VPos=0,HPos=0.5,
  224.                        HIndicator=BUIx.B_FrameWidget.B_FR_HRelative,HAnchor=BUIx.B_FrameWidget.B_FR_HCenter):
  225.     B_MenuFocusManager.AddMenuElement(self,menu_element)
  226.  
  227.     self.AddWidget(menu_element,HPos,self.VertPos+sep,
  228.                    HIndicator,HAnchor,
  229.                    BUIx.B_FrameWidget.B_FR_AbsoluteTop,BUIx.B_FrameWidget.B_FR_Top)
  230.  
  231.     self.VertPos=self.VertPos+menu_element.GetSize()[1]+sep
  232.     #print self.VertPos
  233.     self.SetFocus(menu_element.Name())
  234.     #print "B_MenuFrameWidget.AddMenuElement()  (end)->", sys.getrefcount(self)
  235.  
  236.  
  237.  
  238. # MenuDescr es un diccionario con los siguientes campos para describir el men·:
  239. # "Name",            Nombre del men·.
  240. # "Kind",            Clase de elemento, es una clase. Si no existe se usa B_MenuItemText.
  241. # "FrameKind",       Clase del marco del elemento, es una clase. Si no existe se usa B_MenuTree.
  242. # "ListDescr",       Lista de MenuDesc, puede no existir.
  243. # "Command",         Si ListDscr estß vacφa o no existe, trata de ejecutar este.
  244. # "VSep",            Separaci≤n con el elemento anterior, si es el primero es el margen vertical.
  245. # "Font",            Fuente para el elemento.
  246. # "Options",         Lista de opciones para un elemento de tipo B_MenuItemOption.
  247. # "SelOptionFunc",   Llama a esta funci≤n para saber la opci≤n seleccionada para un elemento 
  248. #                    de tipo B_MenuItemOption. Tiene que devolver una de las opciones de Options.
  249. #                    Si no existe esta funci≤n, toma la primera.
  250. # "Actions",         Lista para las acciones que se pueden definir en la pßgina de teclado.
  251. # "Position",        Lista que indica c≤mo colocar los men·s.
  252. # "PositionEx",      Lista que indica c≤mo colocar los men·s, ampliaci≤n.
  253. # "Size",            Lista con el ancho y el alto.
  254. # "BackGround",      Imagen de fondo.
  255. # "PageDscrs",       Lista de Descripci≤n de pßginas.
  256. # "PageDscr",        Descripci≤n de pßginas, es una diccionario con los siguientes campos:
  257. #                    "PrevLabel",   Etiqueta a la pßgina anterior.
  258. #                    "NextLabel",   Etiqueta a la pßgina siguiente.
  259. #                    "Title",       Tφtulo de la pßgina. (Obligatorio).
  260. # "SpinValues",      Tupla con tres valores para configurar un SpinWidget: inferior, superior, pasos.
  261. # "SpinGetValue"     Funci≤n que le dice al SpinWidget c≤mo obtener su valor inicial.
  262. # "SpinSetValueEnd"  Funci≤n que llama un SpinWidget al salir de contexto.
  263. # "SpinOnChange"     Funci≤n que llama un SpinWidget al cambiarse el valor
  264.  
  265. class B_MenuTreeItem:
  266.   def __init__(self,MenuDescr,StackMenu):
  267.     #print "MenuTreeItem.__init__()"
  268.     self.SetAlpha(0.5)
  269.     self.StackMenu=StackMenu
  270.     self.MenuDescr=MenuDescr
  271.     try:
  272.         self.FocusCallBack = MenuDescr["FocusCallBack"]
  273.     except:
  274.         pass
  275.  
  276.   def __del__(self):
  277.     #print "MenuTreeItem.__del__()"
  278.     pass
  279.  
  280.   def __str__(self):
  281.     print "B_MenuTreeItem widget with descriptor",self.MenuDescr
  282.  
  283.   def ActivateItem(self,activate):
  284.     if activate==1:
  285.       NewFrame=self.CreateFrame()
  286.       if NewFrame:
  287.         self.StackMenu.Push(NewFrame)
  288.         return 1
  289.       else:
  290.         try:
  291.           command=self.MenuDescr["Command"]
  292.           command(self)
  293.           return 1
  294.         except:
  295.           return 0
  296.     elif activate==0:
  297.       w=self.StackMenu.Top()
  298.       try:
  299.         w.FinalRelease()
  300.       except:
  301.         pass
  302.       self.StackMenu.Pop()
  303.       #del(w)
  304.  
  305.  
  306.   def CreateFrame(self):
  307.     #print "CreateFrame()"
  308.     frame_class=None
  309.  
  310.     try:
  311.       frame_class=self.MenuDescr["FrameKind"]
  312.     except KeyError:
  313.       # B_MenuTree Necesita MenuDescr["ListDescr"], con esto me aseguro que lo tenga y si no, no pasa nada
  314.       frame_class=B_MenuTree
  315.       l_dscr=[]
  316.       try:
  317.         l_dscr=self.MenuDescr["ListDescr"]
  318.       except KeyError:
  319.         pass
  320.       if l_dscr==[]:
  321.         print "l_dscr==[]"
  322.         return None
  323.     try:
  324.       NewFrame=frame_class(self,self.MenuDescr,self.StackMenu)
  325.       return NewFrame
  326.     except:
  327.       print "Error Creating frame of class",frame_class
  328.     
  329.  
  330.  
  331.  
  332.  
  333. class B_MenuTree(B_MenuFrameWidget):
  334.   def __init__(self,Parent,Menudesc,StackMenu,VertPos=0):
  335.     #print "MenuTree.__init__()"
  336.     #print "MenuTree initial refcount",sys.getrefcount(self)
  337.     
  338.     Width,Height=Raster.GetSize()
  339.     try:
  340.       Width,Height=Menudesc["Size"]
  341.     except KeyError:
  342.       pass
  343.  
  344.     B_MenuFrameWidget.__init__(self,Parent,"MenuTree"+Menudesc["Name"],Width,Height,VertPos)
  345.  
  346.     self.Menudesc=Menudesc
  347.  
  348.     ValidIndex   = 0
  349.     isValidIndex = 0
  350.     
  351.     for i in Menudesc["ListDescr"]:
  352.       m_class=B_MenuItemTextNoFX
  353.       try:
  354.         m_class=i["Kind"]
  355.       except KeyError:
  356.         pass
  357.  
  358.       vsep=0
  359.       try:
  360.         vsep=i["VSep"]
  361.       except KeyError:
  362.         pass
  363.  
  364.       wSubMenu=m_class(self,i,StackMenu)
  365.       if not isValidIndex:
  366.         if wSubMenu.AcceptsFocus():
  367.           isValidIndex = 1
  368.         else:
  369.           ValidIndex = ValidIndex+1
  370.  
  371.       HPos=0.5
  372.       HIndicator=BUIx.B_FrameWidget.B_FR_HRelative
  373.       HAnchor=BUIx.B_FrameWidget.B_FR_HCenter
  374.       try:
  375.         PosDscr=i["Position"]
  376.         HPos=PosDscr[0]
  377.         HIndicator=PosDscr[1]
  378.         HAnchor=PosDscr[2]
  379.       except KeyError:
  380.         pass
  381.  
  382.       try:
  383.         PosDscr=i["PositionEx"]
  384.         HPos=PosDscr[0]
  385.         HIndicator=PosDscr[1]
  386.         HAnchor=PosDscr[2]
  387.       except KeyError:
  388.         B_MenuFrameWidget.AddMenuElement(self,wSubMenu,vsep,HPos,HIndicator,HAnchor)
  389.  
  390.     if Menudesc.has_key("iFocus"):
  391.         self.SetFocus_Idx(Menudesc["iFocus"])
  392.     else:
  393.         self.SetFocus_Idx(ValidIndex)
  394.     #print "MenuTree refcount (widgets added)",sys.getrefcount(self)
  395.       
  396.  
  397.   def __del__(self):
  398.     #print "B_MenuTree.__del__()"
  399.     B_MenuFrameWidget.__del__(self)
  400.  
  401.   def __str__(self):
  402.     print "B_MenuTree widget with Frame",self.Name()
  403.  
  404.  
  405.  
  406. class B_MenuSpin(SpinWidget.B_SpinWidget,B_MenuTreeItem):
  407.   def __init__(self,Parent,MenuDescr,StackMenu,font_server=ScorerWidgets.font_server):
  408.     w=220
  409.     h=19
  410.     try:
  411.       w,h=MenuDescr["Size"]
  412.     except KeyError:
  413.       pass
  414.  
  415.     font="..\\..\\Data\\Letras menu med.bmp"
  416.     try:
  417.       font=MenuDescr["Font"]
  418.     except KeyError:
  419.       pass
  420.  
  421.     SpinWidget.B_SpinWidget.__init__(self,Parent,MenuDescr["Name"],w,h,font_server,font)
  422.     B_MenuTreeItem.__init__(self,MenuDescr,StackMenu)
  423.  
  424.     try:
  425.       val_func=MenuDescr["SpinGetValue"]
  426.       val=val_func()
  427.       SpinWidget.B_SpinWidget.SetValue(self,val)
  428.     except KeyError:
  429.       pass
  430.  
  431.     try:
  432.       l,u,s=MenuDescr["SpinValues"]
  433.       SpinWidget.B_SpinWidget.SetLimits(self,l,u)
  434.       SpinWidget.B_SpinWidget.SetSteps(self,s)
  435.     except KeyError:
  436.       pass
  437.  
  438.     try:
  439.       self.SetValueEnd=MenuDescr["SpinSetValueEnd"]
  440.     except KeyError:
  441.       self.SetValueEnd=None
  442.     
  443.     if MenuDescr.has_key("SpinOnChange"):
  444.         self.SpinOnChange = MenuDescr["SpinOnChange"]
  445.     else:
  446.         self.SpinOnChange = None
  447.     
  448.     
  449.  
  450.   def IncMenuItem(self):
  451.     self.IncrementValue()
  452.     if self.SpinOnChange:
  453.        self.SpinOnChange(self.GetValue())
  454.  
  455.  
  456.   def DecMenuItem(self):
  457.     self.DecrementValue()
  458.     if self.SpinOnChange:
  459.        self.SpinOnChange(self.GetValue())
  460.  
  461.  
  462.   def FinalRelease(self):
  463.     if self.SetValueEnd is not None:
  464.       self.SetValueEnd(self.GetValue())
  465.  
  466.  
  467.  
  468. class B_MenuItemTextNoFX(BUIx.B_TextWidget,B_MenuTreeItem):
  469.   def __init__(self,Parent,MenuDescr,StackMenu,
  470.                font_server=ScorerWidgets.font_server):
  471.     #print "B_MenuItemText.__init__()",MenuDescr["Name"]
  472.     font="..\\..\\Data\\Letras menu med.bmp"
  473.     try:
  474.       font=MenuDescr["Font"]
  475.     except KeyError:
  476.       pass
  477.  
  478.     BUIx.B_TextWidget.__init__(self,Parent,"SubMenu"+MenuDescr["Name"],MenuDescr["Name"],font_server,font)
  479.     B_MenuTreeItem.__init__(self,MenuDescr,StackMenu)
  480.     self.SetDrawFunc(self.Draw)
  481.     self.SetAlpha(1.0)
  482.     self.thisown=1
  483.  
  484.  
  485.  
  486.   def __del__(self):
  487.     #print "B_MenuItemText.__del__()",self.Name()
  488.     pass
  489.  
  490.   def __str__(self):
  491.     print "B_MenuItemTextNoFX widget with text",self.GetTextData()
  492.  
  493.  
  494.   def Draw(self,x,y,time):
  495.     if self.GetVisible()==0:
  496.       return
  497.  
  498.     #print "MenuItemText",self.Name()
  499.     foc=self.GetHasFocus()
  500.     if foc:
  501.       self.SetColor(254,148,1)
  502.     else:
  503.       self.SetColor(220,10,10)
  504.  
  505.     self.DefDraw(x,y,time)
  506.  
  507.  
  508.  
  509.  
  510. class B_MenuItemTextNoFXNoFocus(BUIx.B_TextWidget,B_MenuTreeItem):
  511.   def __init__(self,Parent,MenuDescr,StackMenu,
  512.                font_server=ScorerWidgets.font_server):
  513.     #print "B_MenuItemText.__init__()",MenuDescr["Name"]
  514.     font="..\\..\\Data\\Letras menu med.bmp"
  515.     try:
  516.       font=MenuDescr["Font"]
  517.     except KeyError:
  518.       pass
  519.  
  520.     BUIx.B_TextWidget.__init__(self,Parent,"SubMenu"+MenuDescr["Name"],MenuDescr["Name"],font_server,font)
  521.     B_MenuTreeItem.__init__(self,MenuDescr,StackMenu)
  522.     self.SetDrawFunc(self.Draw)
  523.     self.SetAlpha(1.0)
  524.     self.thisown=1
  525.  
  526.   def __del__(self):
  527.     #print "B_MenuItemText.__del__()",self.Name()
  528.     pass
  529.  
  530.   def __str__(self):
  531.     print "B_MenuItemTextNoFX widget with text",self.GetTextData()
  532.  
  533.  
  534.   def Draw(self,x,y,time):
  535.     if self.GetVisible()==0:
  536.       return
  537.  
  538.     #print "MenuItemText",self.Name()
  539.     foc=self.GetHasFocus()
  540.     if foc:
  541.       self.SetColor(254,148,1)
  542.     else:
  543.       self.SetColor(220,10,10)
  544.     self.SetAlpha(0.4)
  545.     self.DefDraw(x,y,time)
  546.     self.SetAlpha(1.0)
  547.   def AcceptsFocus(self):
  548.     return 0
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557. class B_MenuItemText(TextFXWidget.B_TextFXWidget,B_MenuTreeItem):
  558.   def __init__(self,Parent,MenuDescr,StackMenu,font_server=ScorerWidgets.font_server):
  559.     #print "B_MenuItemText.__init__()",MenuDescr["Name"]
  560.     font="..\\..\\Data\\Letras menu med.bmp"
  561.     try:
  562.       font=MenuDescr["Font"]
  563.     except KeyError:
  564.       pass
  565.  
  566.     TextFXWidget.B_TextFXWidget.__init__(self,Parent,"SubMenu"+MenuDescr["Name"],MenuDescr["Name"],font_server,font)
  567.     B_MenuTreeItem.__init__(self,MenuDescr,StackMenu)
  568.  
  569.  
  570.   def __del__(self):
  571. ##    print "B_MenuItemText.__del__()",self.Name()
  572.     TextFXWidget.B_TextFXWidget.__del__(self)
  573.     B_MenuTreeItem.__del__(self)
  574.  
  575.   def __str__(self):
  576.     print "B_MenuItemText widget with text",self.GetTextData()
  577.  
  578.  
  579. #if Bladex.GetMapType() > 0:
  580. #  class B_VariableFocusTextMenuItem(B_MenuItemText):
  581. #    def AcceptsFocus(self):
  582. #      return 0
  583. #else:
  584. #  class B_VariableFocusTextMenuItem(B_MenuItemText):
  585. #    def __str__(self):
  586. #      print "B_MenuItemText widget with text",self.GetTextData()
  587.  
  588.  
  589.  
  590. class B_MenuItemTextNoFocus(B_MenuItemText):
  591.   def AcceptsFocus(self):
  592.     return 0
  593.  
  594.  
  595.  
  596.  
  597. class B_MenuItemOption(B_MenuItemTextNoFX):
  598.   def __init__(self,Parent,MenuDescr,StackMenu,
  599.                font_server=ScorerWidgets.font_server):
  600.  
  601.     self.Options=["No option defined.",]
  602.     self.SelOption=0
  603.     self.OptionText=MenuDescr["Name"]
  604.  
  605.     try:
  606.       self.Options=MenuDescr["Options"]
  607.     except KeyError:
  608.       pass
  609.  
  610.     try:
  611.       GetSelFunc=MenuDescr["SelOptionFunc"]
  612.       OptionSel=GetSelFunc()
  613.       #print "DM OptionSel",self.OptionText,OptionSel,self.Options
  614.       self.SelOption=OptionSel
  615.       print self.SelOption
  616.     except KeyError:
  617.       pass
  618.  
  619.     B_MenuItemTextNoFX.__init__(self,Parent,MenuDescr,StackMenu)
  620.     #self.SetDrawFunc(self.Draw)
  621.     self.Parent=Parent
  622.  
  623.     OptionText=self.OptionText+"    "+str(self.Options[self.SelOption])
  624.     self.SetText(OptionText)
  625.  
  626.  
  627.   def __del__(self):
  628.     pass
  629.     #print "B_MenuItemOption.__del__()",self.Name()
  630.  
  631. ##  def Draw(self,x,y,time):
  632. ##    if self.GetVisible()==0:
  633. ##      return
  634. ##    foc=self.GetHasFocus()
  635. ##    if foc:
  636. ##      self.SetColor(240,240,240)
  637. ##    else:
  638. ##      self.SetColor(240,10,10)
  639. ##
  640. ##    self.DefDraw(x,y,time)
  641.  
  642.   def ActivateItem(self,activate):
  643.     check_pass = None
  644.     val = 1
  645.     if self.MenuDescr.has_key("CheckPass"):
  646.       check_pass=self.MenuDescr["CheckPass"]
  647.       val = check_pass()
  648.       
  649.     if ((activate==1) and (val==1)):
  650.       self.SelOption=self.SelOption+1
  651.       self.SelOption=self.SelOption% len(self.Options)
  652.       OptionText=self.OptionText+"    "+self.Options[self.SelOption]
  653.       self.SetText(OptionText)
  654.  
  655.       try: # Puede que Parent no herede de Frame
  656.         self.Parent.RecalcLayout()
  657.       except:
  658.         pass
  659.  
  660.       try:
  661.         command=self.MenuDescr["Command"]
  662.         command(MenuText.GetInverseMenuText(self.Options[self.SelOption]))
  663.       except KeyError:
  664.         pass
  665.     elif activate==0:
  666.       self.StackMenu.Pop()
  667.  
  668.   def FinalRelease(self):
  669.     print "B_MenuItemOption.FinalRelease()"
  670.     self.Parent=None
  671.     #self.SetDrawFunc(None)
  672.  
  673.     
  674.  
  675. class B_MenuItemPage(B_MenuFrameWidget):
  676.   def __init__(self,Parent,PageDscr,MenuDescr,StackMenu):
  677.     #print "Creating B_MenuItemPage()"
  678.     #IDebug.set_trace()
  679.     #Bldb.set_trace()
  680.     #pdb.set_trace()
  681.     self.TitleText=PageDscr["Title"]  #Tienen que tener tφtulo
  682.     B_MenuFrameWidget.__init__(self,Parent,"MenuItemPage "+self.TitleText)
  683.     #B_MenuTreeItem.__init__(self,MenuDescr,StackMenu)
  684.     font="..\\..\\Data\\Letras menu peq.bmp" # Provisional
  685.     font_server=ScorerWidgets.font_server    # Provisional
  686.  
  687.     self.BackgroundImage=None
  688.     try:
  689.       self.BackgroundImage=PageDscr["Background"]
  690.     except KeyError:
  691.       pass
  692.  
  693.     self.PrevLabel="Prev"
  694.     try:
  695.       self.PrevLabel=PageDscr["PrevLabel"]
  696.     except KeyError:
  697.       pass
  698.  
  699.     self.Title=BUIx.B_TextWidget(self,"Title MenuItemPage "+self.TitleText,self.TitleText,font_server,"..\\..\\Data\\Letras menu gra.bmp")
  700.     self.Title.SetAlpha(0.8)
  701.     self.Title.SetColor(240,10,10)
  702.     self.AddWidget(self.Title,10,10,
  703.                    BUIx.B_FrameWidget.B_FR_AbsoluteRight,BUIx.B_FrameWidget.B_FR_Right,
  704.                    BUIx.B_FrameWidget.B_FR_AbsoluteTop,BUIx.B_FrameWidget.B_FR_Top)
  705.  
  706.  
  707.     # Truco, cada PageDscr puede tener un font, pero los B_MenuItemText lo leen de MenuDescr
  708.     try:
  709.       font=PageDscr["Font"]
  710.       MenuDescr["Font"]=font
  711.     except KeyError:
  712.       pass
  713.  
  714.     self.PrevItem=B_MenuItemText(self,self.TitleText+self.PrevLabel,self.PrevLabel,None,StackMenu)
  715.     self.PrevItem.SetAlpha(1.0)
  716.     self.PrevItem.SetColor(240,10,10)
  717.     B_MenuFocusManager.AddMenuElement(self,self.PrevItem)
  718.     self.AddWidget(self.PrevItem,10,10,
  719.                    BUIx.B_FrameWidget.B_FR_AbsoluteLeft,BUIx.B_FrameWidget.B_FR_Left,
  720.                    BUIx.B_FrameWidget.B_FR_AbsoluteBottom,BUIx.B_FrameWidget.B_FR_Bottom)
  721.  
  722.  
  723.     self.NextLabel="Next"
  724.     try:
  725.       self.NextLabel=PageDscr["NextLabel"]
  726.     except KeyError:
  727.       pass
  728.  
  729.     self.NextItem=B_MenuItemText(self,self.TitleText+self.NextLabel,self.NextLabel,None,StackMenu)
  730.     self.NextItem.SetAlpha(1.0)
  731.     self.NextItem.SetColor(240,10,10)
  732.     B_MenuFocusManager.AddMenuElement(self,self.NextItem)
  733.     self.AddWidget(self.NextItem,10,10,
  734.                    BUIx.B_FrameWidget.B_FR_AbsoluteRight,BUIx.B_FrameWidget.B_FR_Right,
  735.                    BUIx.B_FrameWidget.B_FR_AbsoluteBottom,BUIx.B_FrameWidget.B_FR_Bottom)
  736.  
  737.  
  738.     self.ContinueItem=B_MenuItemText(self,self.TitleText+" Continue","Continue",None,StackMenu)
  739.     self.ContinueItem.SetAlpha(1.0)
  740.     self.ContinueItem.SetColor(240,10,10)
  741.     B_MenuFocusManager.AddMenuElement(self,self.ContinueItem)
  742.     self.AddWidget(self.ContinueItem,0.4,10,
  743.                    BUIx.B_FrameWidget.B_FR_HRelative,BUIx.B_FrameWidget.B_FR_Left,
  744.                    BUIx.B_FrameWidget.B_FR_AbsoluteBottom,BUIx.B_FrameWidget.B_FR_Bottom)
  745.  
  746.     self.BackItem=B_MenuItemText(self,self.TitleText+" Back","Back",None,StackMenu)
  747.     self.BackItem.SetAlpha(0.5)
  748.     self.BackItem.SetColor(240,10,10)
  749.     B_MenuFocusManager.AddMenuElement(self,self.BackItem)
  750.     self.AddWidget(self.BackItem,0.4,10,
  751.                    BUIx.B_FrameWidget.B_FR_HRelative,BUIx.B_FrameWidget.B_FR_Right,
  752.                    BUIx.B_FrameWidget.B_FR_AbsoluteBottom,BUIx.B_FrameWidget.B_FR_Bottom)
  753.  
  754.     #self.SetDrawFunc(self.Draw)
  755.     self.Description="No Description"
  756.     try:
  757.       self.Description=PageDscr["Description"]
  758.     except KeyError:
  759.       pass
  760.  
  761.     self.DescriptionItem=B_MenuItemTextNoFocus(self,self.TitleText+" Description",self.Description,None,StackMenu)
  762.     B_MenuFocusManager.AddMenuElement(self,self.DescriptionItem)
  763.     self.DescriptionItem.SetAlpha(1.0)
  764.     self.DescriptionItem.SetColor(240,10,10)
  765.     self.AddWidget(self.DescriptionItem,25,0.7,
  766.                    BUIx.B_FrameWidget.B_FR_AbsoluteRight,BUIx.B_FrameWidget.B_FR_Right,
  767.                    BUIx.B_FrameWidget.B_FR_VRelative,BUIx.B_FrameWidget.B_FR_VCenter)
  768.  
  769.  
  770.     try:
  771.       BackgroundImage=PageDscr["BackGround"]
  772.       self.BackgroundItem=WidgetsExtra.B_ImageWidget(self,self.TitleText+" Background",BackgroundImage)
  773.       self.AddWidget(self.BackgroundItem,0.5,0.5,
  774.                    BUIx.B_FrameWidget.B_FR_HRelative,BUIx.B_FrameWidget.B_FR_HCenter,
  775.                    BUIx.B_FrameWidget.B_FR_VRelative,BUIx.B_FrameWidget.B_FR_VCenter)
  776.     except KeyError:
  777.       pass
  778.  
  779.     B_MenuFocusManager.SetFocus(self,self.ContinueItem)
  780.  
  781.  
  782.   def __del__(self):
  783.     #print "Destroying ",self
  784.     pass
  785.  
  786.   def __str__(self):
  787.     print "B_MenuItemPage",self.TitleText
  788.  
  789.  
  790.   def SetVisible(self,v):
  791.     B_MenuFrameWidget.SetVisible(self,v)
  792.  
  793.  
  794. #  def Draw(self,x,y,time):
  795. #    if self.GetVisible()==0:
  796. #      return
  797. #    foc=self.GetHasFocus()
  798. #    if foc:
  799. #      self.SetColor(240,240,240)
  800. #    else:
  801. #      self.SetColor(240,10,10)
  802. #
  803. #    self.DefDraw(x,y,time)
  804.  
  805.  
  806.  
  807.  
  808. class B_MenuItemPages(BUIx.B_TextWidget,B_MenuTreeItem):
  809.   def __init__(self,Parent,MenuDescr,StackMenu):
  810.     font="..\\..\\Data\\Letras menu med.bmp" # Provisional
  811.     font_server=ScorerWidgets.font_server    # Provisional
  812.     BUIx.B_TextWidget.__init__(self,Parent,"B_MenuItemPages","B_MenuItemPages Text",font_server,font)
  813.     B_MenuTreeItem.__init__(self,MenuDescr,StackMenu)
  814.     self.Pages=[]
  815.     self.ActivePage=None
  816.     self.SetDrawFunc(self.Draw)
  817.     self.SetSizeChangedFunc(self.SizeChanged)
  818.     PageDscrs=MenuDescr["PageDscrs"]
  819.     for i in PageDscrs:
  820.       self.AddPage(Parent,i,MenuDescr,StackMenu)
  821.     self.SetActivePage(self.Pages[0])
  822.     self.thisown=1
  823.     
  824.   def __del__(self):
  825.     print "Deleting",self
  826.     #del(self.Pages)
  827.  
  828.  
  829.   def AddPage(self,Parent,pagedscr,MenuDescr,StackMenu):
  830.     page=B_MenuItemPage(Parent,640,480,pagedscr,MenuDescr,StackMenu)
  831.     self.Pages.append(page)
  832.  
  833.  
  834.   def SetActivePage(self,page):
  835.     if self.ActivePage:
  836.       self.ActivePage.SetVisible(0)
  837.     self.ActivePage=page
  838.     if self.ActivePage:
  839.       self.ActivePage.SetVisible(1)
  840.       Bladex.SetRootWidget(self.ActivePage.GetPointer())
  841.  
  842.   def NextPageAux(self,desp):
  843.     old_page=self.ActivePage
  844.     index=self.Pages.index(old_page)
  845.     index=index+desp
  846.     index=index%len(self.Pages)
  847.     self.SetActivePage(self.Pages[index])
  848.  
  849.   def NextPage(self):
  850.     self.NextPageAux(1)
  851.  
  852.   def PrevPage(self):
  853.     self.NextPageAux(-1)
  854.  
  855.  
  856.   def GetPointer(self):
  857.     if self.ActivePage:
  858.       return self.ActivePage.GetPointer()
  859.     else:
  860.       return self.GetPointer()
  861.  
  862.  
  863.   def AcceptsFocus(self):
  864.     return 0
  865.  
  866.   def GetFocus(self):
  867.     return self
  868.  
  869.   def NextFocus(self):
  870.     if self.ActivePage:
  871.       self.ActivePage.NextFocus()
  872.     else:
  873.       pass
  874.  
  875.   def PrevFocus(self):
  876.     if self.ActivePage:
  877.       self.ActivePage.PrevFocus()
  878.     else:
  879.       pass
  880.  
  881.  
  882.   def ActivateItem(self,act):
  883.     #print "B_MenuItemPages.ActivateItem()"
  884.     if act and self.ActivePage:
  885.       wTemp=self.ActivePage.GetFocus()
  886.       #pdb.set_trace()
  887.       if not wTemp.ActivateItem(1):
  888.         if self.ActivePage.GetFocus()==self.ActivePage.PrevItem:
  889.           self.PrevPage()
  890.         elif self.ActivePage.GetFocus()==self.ActivePage.NextItem:
  891.           self.NextPage()
  892.     else:
  893.       self.SetActivePage(None)
  894.       B_MenuTreeItem.ActivateItem(self,act)
  895.  
  896.  
  897.   def __str__(self):
  898.     print "class B_MenuItemPages with",len(self.Pages),"pages"
  899.  
  900.  
  901.   def Draw(self,x,y,time):
  902.     if self.ActivePage:
  903.       self.ActivePage.Draw(x,y,time)
  904.     else:
  905.       self.SetColor(100,100,240)
  906.       self.SetAlpha(0.5)
  907.       BUIx.B_TextWidget.DefDraw(self,100,100,time)
  908.  
  909.  
  910.   def SizeChanged(self,reshz,resvt):
  911.     for i in self.Pages:
  912.       i.SizeChanged(reshz,resvt)
  913.  
  914.   def CreateFrame(self):
  915.     return None
  916.  
  917.  
  918.  
  919.  
  920. class B_BackImageWidget(BUIx.B_RectWidget):
  921.  
  922.     def __init__(self,Parent,MenuDescr,StackMenu):
  923.         self.Bitmap  = BBLib.B_BitMap24()
  924.         self.Bitmap.ReadFromBMP("..\\..\\Data\\menu.bmp")
  925.         self.vidw = 1
  926.         self.vidh = 1
  927.         BUIx.B_RectWidget.__init__(self,Parent,MenuDescr["Name"],self.vidw,self.vidh)
  928.         self.Selected=0
  929.         self.Solid=0
  930.         self.Border=0
  931.         self.SetDrawFunc(self.Draw)
  932.  
  933.     def Draw(self,x,y,time):
  934.         Raster.SetPosition(0,0)
  935.         Raster.DrawImage(640,480,"BGR","Stretch",self.Bitmap.GetData())
  936.         self.DefDraw(x,y,time)
  937.  
  938.     def FinalRelease(self):
  939.         BUIx.B_RectWidget.FinalRelease(self)
  940.  
  941.     def AcceptsFocus(self):
  942.         return 0
  943.  
  944. class B_BackBlank(BUIx.B_RectWidget):
  945.  
  946.     def __init__(self,Parent,MenuDescr,StackMenu):
  947.         self.Bitmap  = BBLib.B_BitMap24()
  948.         self.Bitmap.ReadFromBMP("..\\..\\Data\\Black.bmp")
  949.         self.vidw = 1
  950.         self.vidh = 1
  951.         BUIx.B_RectWidget.__init__(self,Parent,MenuDescr["Name"],self.vidw,self.vidh)
  952.         self.Selected=0
  953.         self.Solid=0
  954.         self.Border=0
  955.         self.SetDrawFunc(self.Draw)
  956.  
  957.     def Draw(self,x,y,time):
  958.         Raster.SetPosition(0,0)
  959.         Raster.DrawImage(640,480,"BGR","Stretch",self.Bitmap.GetData())
  960.         self.DefDraw(x,y,time)
  961.  
  962.     def FinalRelease(self):
  963.         BUIx.B_RectWidget.FinalRelease(self)
  964.  
  965.     def AcceptsFocus(self):
  966.         return 0
  967.  
  968. class B_BackWeapon(BUIx.B_RectWidget):
  969.  
  970.     def __init__(self,Parent,MenuDescr,StackMenu):
  971.         self.Bitmap  = BBLib.B_BitMap24()
  972.         self.Bitmap.ReadFromBMP("..\\..\\Data\\demo0.bmp")
  973.         self.Bitmap2  = BBLib.B_BitMap24()
  974.         self.Bitmap2.ReadFromBMP("..\\..\\Data\\demo1.bmp")
  975.         #self.Bitmap3  = BBLib.B_BitMap24()
  976.         #self.Bitmap3.ReadFromBMP("..\\..\\Data\\armaslibroviaje2.bmp")
  977.         self.vidw = 1
  978.         self.vidh = 1
  979.         BUIx.B_RectWidget.__init__(self,Parent,MenuDescr["Name"],self.vidw,self.vidh)
  980.         self.Selected=0
  981.         self.Solid=0
  982.         self.Border=0
  983.         self.SetDrawFunc(self.Draw)
  984.         self.image = 0
  985.         self.NumImages = 2
  986.         self.SndCorreGema=Bladex.CreateSound("..\\..\\Sounds\\golpe-2.wav","Chanje")
  987.         self.SndCorreGema.Volume=0.5
  988.         self.SndCorreGema.MinDistance=1000000.0
  989.         self.SndCorreGema.MaxDistance=2000000
  990.  
  991.  
  992.     def Draw(self,x,y,time):
  993.         x,y = Raster.GetSize()
  994.         Raster.SetPosition((x - 640)/2, (y - 480)/2)
  995.         # Set logic conditions Cacao
  996.         if self.image == 0:
  997.             Raster.DrawImage(640,480,"BGR","Normal",self.Bitmap2.GetData())
  998.         if self.image == 1:
  999.             Raster.DrawImage(640,480,"BGR","Normal",self.Bitmap.GetData())
  1000.         #if self.image == 2:
  1001.         #    Raster.DrawImage(640,480,"BGR","Normal",self.Bitmap2.GetData())
  1002.         if self.image < 0:
  1003.             self.image = (self.NumImages - 1)
  1004.         if self.image > (self.NumImages - 1):
  1005.             self.image = 0
  1006.         self.DefDraw(x,y,time)
  1007.  
  1008.     def FinalRelease(self):
  1009.         BUIx.B_RectWidget.FinalRelease(self)
  1010.  
  1011.     def AcceptsFocus(self):
  1012.         return 1
  1013.  
  1014.     def IncMenuItem(self):
  1015.         self.SndCorreGema.PlayStereo()
  1016.         self.image = self.image + 1
  1017.  
  1018.     def DecMenuItem(self):
  1019.         self.SndCorreGema.PlayStereo()
  1020.         self.image = self.image - 1
  1021.         
  1022.     def GetFocus(self):
  1023.         return self
  1024.  
  1025.     def ActivateItem(self,activate):
  1026.         import Menu
  1027.         Menu.ActivateMenu()
  1028.         return
  1029.  
  1030.  
  1031.  
  1032. class B_BackFeatures(BUIx.B_RectWidget):
  1033.  
  1034.     def __init__(self,Parent,MenuDescr,StackMenu):
  1035.         self.Bitmap1  = BBLib.B_BitMap24()
  1036.         self.Bitmap1.ReadFromBMP("..\\..\\Data\\Blade_features1.bmp")
  1037.         self.Bitmap2  = BBLib.B_BitMap24()
  1038.         self.Bitmap2.ReadFromBMP("..\\..\\Data\\Blade_features2.bmp")
  1039.         self.CurrentBitmap = BBLib.B_BitMap24()
  1040.         self.CurrentBitmap = self.Bitmap1
  1041.         self.vidw = 1
  1042.         self.vidh = 1
  1043.         BUIx.B_RectWidget.__init__(self,Parent,MenuDescr["Name"],self.vidw,self.vidh)
  1044.         self.Selected=0
  1045.         self.Solid=0
  1046.         self.Border=0
  1047.         self.SetDrawFunc(self.Draw)
  1048.         self.Time2Exit=None
  1049.  
  1050.     def Draw(self,x,y,time):
  1051.         if self.Time2Exit==None:
  1052.             self.Time2Exit=time
  1053.         if time-self.Time2Exit>10.0:
  1054.             Bladex.Quit()
  1055.         elif time-self.Time2Exit>5.0:
  1056.             self.CurrentBitmap = self.Bitmap2
  1057.         Raster.SetPosition(0,0)
  1058.         Raster.DrawImage(640,480,"BGR","Stretch",self.CurrentBitmap.GetData())
  1059.         self.DefDraw(x,y,time)
  1060.  
  1061.     def FinalRelease(self):
  1062.         BUIx.B_RectWidget.FinalRelease(self)
  1063.  
  1064.     def AcceptsFocus(self):
  1065.         return 0
  1066.