DirectScrolledList.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. from DirectFrame import *
  2. from DirectButton import *
  3. import GuiGlobals
  4. import Task
  5. """
  6. from DirectGui import *
  7. def choseAvatar(item):
  8. print item
  9. model = loader.loadModel("phase_4/models/gui/friendslist_gui")
  10. names = ['Top', 'Flippy1', 'Joe', 'Shochet', 'Mother', 'Father', 'Brother', 'Sister', 'One', 'Two', 'Three', 'Flippy2', 'Ashy', 'Bob', 'Moe', 'Funk', 'Bottom']
  11. buttons = []
  12. for name in names:
  13. buttons.append(DirectButton(
  14. text = name,
  15. text_scale = 0.05,
  16. relief = None,
  17. text2_bg = Vec4(1,1,0,1),
  18. text1_bg = Vec4(0.5,0.9,1,1),
  19. command = choseAvatar,
  20. extraArgs = [name],
  21. ))
  22. s = DirectScrolledList(
  23. image = model.find("**/FriendsBox_Open"),
  24. relief = None,
  25. # inc and dec are DirectButtons
  26. incButton_image = (model.find("**/FndsLst_ScrollUp"),
  27. model.find("**/FndsLst_ScrollDN"),
  28. model.find("**/FndsLst_ScrollUp_Rllvr"),
  29. ),
  30. incButton_relief = None,
  31. incButton_scale = (1,1,-1),
  32. incButton_pos = (0,0,-0.316),
  33. decButton_image = (model.find("**/FndsLst_ScrollUp"),
  34. model.find("**/FndsLst_ScrollDN"),
  35. model.find("**/FndsLst_ScrollUp_Rllvr"),
  36. ),
  37. decButton_relief = None,
  38. decButton_scale = (1,1,1),
  39. decButton_pos = (0,0,0.119),
  40. # itemFrame is a DirectFrame
  41. itemFrame_pos = (0,0,0.05),
  42. itemFrame_scale = 0.9,
  43. itemFrame_relief = None,
  44. # each item is a button with text on it
  45. numItemsVisible = 7,
  46. items = buttons,
  47. )
  48. s.addItem(DirectButton(
  49. text = "Added",
  50. text_scale = 0.05,
  51. relief = None,
  52. text2_bg = Vec4(1,1,0,1),
  53. text1_bg = Vec4(0.5,0.9,1,1),
  54. command = choseAvatar,
  55. extraArgs = ["Added"])
  56. s.removeItem(index)
  57. s.setItems(stringList, extraArgList)
  58. """
  59. class DirectScrolledList(DirectFrame):
  60. def __init__(self, parent = guiTop, **kw):
  61. self.index = 0
  62. # Inherits from DirectFrame
  63. optiondefs = (
  64. # Define type of DirectGuiWidget
  65. ('items', [], None),
  66. ('command', None, None),
  67. ('extraArgs', [], None),
  68. ('numItemsVisible', 1, self.setNumItemsVisible),
  69. ('scrollSpeed', 8, self.setScrollSpeed),
  70. )
  71. # Merge keyword options with default options
  72. self.defineoptions(kw, optiondefs, dynamicGroups = ("items",))
  73. # Initialize superclasses
  74. DirectFrame.__init__(self, parent)
  75. self.incButton = self.createcomponent("incButton", (), "incButton",
  76. DirectButton, (),
  77. parent = self,
  78. )
  79. self.incButton.bind(B1PRESS, self.__incButtonDown)
  80. self.incButton.bind(B1RELEASE, self.__buttonUp)
  81. self.decButton = self.createcomponent("decButton", (), "decButton",
  82. DirectButton, (),
  83. parent = self,
  84. )
  85. self.decButton.bind(B1PRESS, self.__decButtonDown)
  86. self.decButton.bind(B1RELEASE, self.__buttonUp)
  87. self.itemFrame = self.createcomponent("itemFrame", (), "itemFrame",
  88. DirectFrame, (),
  89. parent = self,
  90. )
  91. for item in self["items"]:
  92. item.reparentTo(self.itemFrame)
  93. self.initialiseoptions(DirectScrolledList)
  94. self.recordMaxHeight()
  95. if len(self["items"]) > 0:
  96. self.scrollTo(0)
  97. def recordMaxHeight(self):
  98. self.maxHeight = 0.0
  99. for item in self["items"]:
  100. self.maxHeight = max(self.maxHeight, item.getHeight())
  101. def setScrollSpeed(self):
  102. # Items per second to move
  103. self.scrollSpeed = self["scrollSpeed"]
  104. if self.scrollSpeed <= 0:
  105. self.scrollSpeed = 1
  106. def setNumItemsVisible(self):
  107. # Items per second to move
  108. self.numItemsVisible = self["numItemsVisible"]
  109. def destroy(self):
  110. taskMgr.removeTasksNamed(self.taskName("scroll"))
  111. DirectFrame.destroy(self)
  112. def scrollBy(self, delta):
  113. return self.scrollTo(self.index + delta)
  114. def scrollTo(self, index):
  115. self.index = index
  116. if (self.index <= 0):
  117. self.index = 0
  118. self.decButton['state'] = DISABLED
  119. self.incButton['state'] = NORMAL
  120. ret = 0
  121. elif (self.index >= ( len(self["items"]) - self["numItemsVisible"])):
  122. self.index = len(self["items"]) - self["numItemsVisible"]
  123. self.incButton['state'] = DISABLED
  124. self.decButton['state'] = NORMAL
  125. ret = 0
  126. else:
  127. self.incButton['state'] = NORMAL
  128. self.decButton['state'] = NORMAL
  129. ret = 1
  130. # Hide them all
  131. for item in self["items"]:
  132. item.hide()
  133. # Then show the ones in range
  134. upperRange = min(len(self["items"]), self["numItemsVisible"])
  135. for i in range(self.index, self.index + upperRange):
  136. item = self["items"][i]
  137. item.show()
  138. item.setPos(0,0, - (i - self.index) * self.maxHeight)
  139. return ret
  140. def __scrollByTask(self, task):
  141. if ((task.time - task.prevTime) < task.delayTime):
  142. return Task.cont
  143. else:
  144. ret = self.scrollBy(task.delta)
  145. task.prevTime = task.time
  146. if ret:
  147. return Task.cont
  148. else:
  149. return Task.done
  150. def __incButtonDown(self, event):
  151. task = Task.Task(self.__scrollByTask)
  152. task.delayTime = (1.0 / self.scrollSpeed)
  153. task.prevTime = 0.0
  154. task.delta = 1
  155. self.scrollBy(task.delta)
  156. taskMgr.spawnTaskNamed(task, self.taskName("scroll"))
  157. def __decButtonDown(self, event):
  158. task = Task.Task(self.__scrollByTask)
  159. task.delayTime = (1.0 / self.scrollSpeed)
  160. task.prevTime = 0.0
  161. task.delta = -1
  162. self.scrollBy(task.delta)
  163. taskMgr.spawnTaskNamed(task, self.taskName("scroll"))
  164. def __buttonUp(self, event):
  165. taskMgr.removeTasksNamed(self.taskName("scroll"))
  166. def addItem(self, item):
  167. """
  168. Add this string and extraArg to the list
  169. """
  170. self['items'].append(item)
  171. item.reparentTo(self.itemFrame)
  172. self.refresh()
  173. def removeItem(self, item):
  174. """
  175. Remove this item from the panel
  176. """
  177. if item in self["items"]:
  178. self["items"].remove(item)
  179. item.reparentTo(hidden)
  180. self.refresh()
  181. return 1
  182. else:
  183. return 0
  184. def refresh(self):
  185. """
  186. Update the list - useful when adding or deleting items
  187. or changing properties that would effect the scrolling
  188. """
  189. self.recordMaxHeight()
  190. self.scrollTo(self.index)