Button.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. from ShowBaseGlobal import *
  2. from DirectObject import *
  3. from GuiGlobals import *
  4. import GuiButton
  5. import Label
  6. class Button(DirectObject):
  7. def __init__(self, name,
  8. label = None,
  9. scale = 0.1,
  10. width = None,
  11. drawOrder = getDefaultDrawOrder(),
  12. font = getDefaultFont(),
  13. pos = (0, 0),
  14. geomRect = None,
  15. supportInactive = 0,
  16. inactive = 0,
  17. upStyle = Label.ButtonUp,
  18. litStyle = Label.ButtonLit,
  19. downStyle = Label.ButtonDown,
  20. inactiveStyle = Label.ButtonInactive):
  21. self.name = name
  22. self.width = width
  23. # if no label given, use the button name
  24. if (label == None):
  25. label = self.name
  26. self.inactive = inactive
  27. if inactive:
  28. supportInactive = 1
  29. # check to see if this is an actual guiLabel or just text
  30. if (type(label) == type('')):
  31. # text label, make text button
  32. self.label = label
  33. self.lUp = Label.textLabel(self.label, upStyle,
  34. scale, width, drawOrder, font)
  35. if width == None:
  36. width = self.lUp.getWidth() / scale
  37. self.width = width
  38. self.lLit = Label.textLabel(self.label, litStyle,
  39. scale, width, drawOrder, font)
  40. self.lDown = Label.textLabel(self.label, downStyle,
  41. scale, width, drawOrder, font)
  42. if supportInactive:
  43. self.lInactive = Label.textLabel(self.label, inactiveStyle,
  44. scale, width, drawOrder, font)
  45. elif (isinstance(label, NodePath)):
  46. # If it's a NodePath, assume it's a little texture card.
  47. self.lUp = Label.modelLabel(label,
  48. geomRect = geomRect,
  49. style = upStyle,
  50. scale = scale,
  51. drawOrder = drawOrder)
  52. if width == None:
  53. width = self.lUp.getWidth() / scale
  54. self.width = width
  55. self.lLit = Label.modelLabel(label,
  56. geomRect = geomRect,
  57. style = litStyle,
  58. scale = scale,
  59. drawOrder = drawOrder)
  60. self.lDown = Label.modelLabel(label,
  61. geomRect = geomRect,
  62. style = downStyle,
  63. scale = scale,
  64. drawOrder = drawOrder)
  65. if supportInactive:
  66. self.lInactive = Label.modelLabel(label,
  67. geomRect = geomRect,
  68. style = inactiveStyle,
  69. scale = scale,
  70. drawOrder = drawOrder)
  71. else:
  72. # label provided, use it for all labels
  73. self.lUp = self.lLit = self.lDown = self.lInactive = label
  74. if width == None:
  75. width = self.lUp.getWidth()
  76. if not supportInactive:
  77. self.lInactive = self.lUp
  78. self.button = GuiButton.GuiButton(self.name, self.lUp, self.lLit,
  79. self.lDown, self.lDown, self.lInactive)
  80. self.button.setDrawOrder(drawOrder)
  81. self.setPos(pos[0], pos[1])
  82. self.managed = 0
  83. return None
  84. def cleanup(self):
  85. if (self.managed):
  86. self.unmanage()
  87. self.lUp = None
  88. self.lLit = None
  89. self.lDown = None
  90. self.lInactive = None
  91. self.button = None
  92. return None
  93. def __str__(self):
  94. return "Button: %s" % self.name
  95. def getName(self):
  96. return self.name
  97. def getLabel(self):
  98. return self.label
  99. def getGuiItem(self):
  100. return self.button
  101. def getWidth(self):
  102. return self.width
  103. def setWidth(self, width):
  104. self.lUp.setWidth(width)
  105. self.lLit.setWidth(width)
  106. self.lDown.setWidth(width)
  107. self.lInactive.setWidth(width)
  108. def setInactive(self, inactive):
  109. self.inactive = inactive
  110. if self.managed:
  111. self.button.exit()
  112. if self.inactive:
  113. self.button.inactive()
  114. else:
  115. self.button.up()
  116. def manage(self, nodepath = aspect2d):
  117. if nodepath:
  118. self.button.manage(guiMgr, base.eventMgr.eventHandler,
  119. nodepath.node())
  120. else:
  121. self.button.manage(guiMgr, base.eventMgr.eventHandler)
  122. self.managed = 1
  123. if self.inactive:
  124. self.button.exit()
  125. self.button.inactive()
  126. def unmanage(self):
  127. self.button.unmanage()
  128. self.managed = 0
  129. def getPos(self):
  130. return self.button.getPos()
  131. def setPos(self, x, y, node = None):
  132. if node == None:
  133. v3 = Vec3(x, 0., y)
  134. else:
  135. mat = node.getMat(base.render2d)
  136. v3 = Vec3(mat.xformPoint(Point3(x, 0., y)))
  137. self.button.setPos(v3)
  138. def setBehaviorEvent(self, eventName):
  139. self.button.setBehaviorEvent(eventName)
  140. def startBehavior(self):
  141. self.button.startBehavior()
  142. def stopBehavior(self):
  143. self.button.stopBehavior()