1. class ListBoxEx(Window):
  2. class Item(Window):
  3. def __init__(self):
  4. Window.__init__(self)
  5. def __del__(self):
  6. Window.__del__(self)
  7. def SetParent(self, parent):
  8. Window.SetParent(self, parent)
  9. self.parent=proxy(parent)
  10. def OnMouseLeftButtonDown(self):
  11. self.parent.SelectItem(self)
  12. def OnRender(self):
  13. if self.parent.GetSelectedItem()==self:
  14. self.OnSelectedRender()
  15. def OnSelectedRender(self):
  16. x, y = self.GetGlobalPosition()
  17. grp.SetColor(grp.GenerateColor(0.0, 0.0, 0.7, 0.7))
  18. grp.RenderBar(x, y, self.GetWidth(), self.GetHeight())
  19. def __init__(self):
  20. Window.__init__(self)
  21. self.viewItemCount=10
  22. self.basePos=0
  23. self.itemHeight=16
  24. self.itemStep=20
  25. self.selItem=0
  26. self.itemList=[]
  27. self.onSelectItemEvent = lambda *arg: None
  28. # if localeInfo.IsARABIC():
  29. # self.itemWidth=130
  30. # else:
  31. self.itemWidth = 50
  32. self.scrollBar=None
  33. self.__UpdateSize()
  34. def __del__(self):
  35. Window.__del__(self)
  36. def __UpdateSize(self):
  37. height=self.itemStep*self.__GetViewItemCount()
  38. self.SetSize(self.itemWidth, height)
  39. def IsEmpty(self):
  40. if len(self.itemList)==0:
  41. return 1
  42. return 0
  43. def SetItemStep(self, itemStep):
  44. self.itemStep=itemStep
  45. self.__UpdateSize()
  46. def SetItemSize(self, itemWidth, itemHeight):
  47. self.itemWidth=itemWidth
  48. self.itemHeight=itemHeight
  49. self.__UpdateSize()
  50. def SetViewItemCount(self, viewItemCount):
  51. self.viewItemCount=viewItemCount
  52. def SetSelectEvent(self, event):
  53. self.onSelectItemEvent = event
  54. def SetBasePos(self, basePos):
  55. for oldItem in self.itemList[self.basePos:self.basePos+self.viewItemCount]:
  56. oldItem.Hide()
  57. self.basePos=basePos
  58. pos=basePos
  59. for newItem in self.itemList[self.basePos:self.basePos+self.viewItemCount]:
  60. (x, y)=self.GetItemViewCoord(pos, newItem.GetWidth())
  61. newItem.SetPosition(x, y)
  62. newItem.Show()
  63. pos+=1
  64. def GetItemIndex(self, argItem):
  65. return self.itemList.index(argItem)
  66. def GetSelectedItem(self):
  67. return self.selItem
  68. def SelectIndex(self, index):
  69. if index >= len(self.itemList) or index < 0:
  70. self.selItem = None
  71. return
  72. try:
  73. self.selItem=self.itemList[index]
  74. except:
  75. pass
  76. def SelectItem(self, selItem):
  77. self.selItem=selItem
  78. self.onSelectItemEvent(selItem)
  79. def RemoveAllItems(self):
  80. self.selItem=None
  81. self.itemList=[]
  82. if self.scrollBar:
  83. self.scrollBar.SetPos(0)
  84. def RemoveAllItems(self):
  85. for i in self.itemList:
  86. if i.IsShow():
  87. i.Hide()
  88. self.selItem=None
  89. del self.itemList[:]
  90. self.itemList=[]
  91. if self.scrollBar:
  92. self.scrollBar.SetPos(0)
  93. if app.ENABLE_SWITCHBOT:
  94. def GetItems(self):
  95. return self.itemList
  96. def RemoveItem(self, delItem):
  97. if delItem==self.selItem:
  98. self.selItem=None
  99. self.itemList.remove(delItem)
  100. def AppendItem(self, newItem):
  101. newItem.SetParent(self)
  102. newItem.SetSize(self.itemWidth, self.itemHeight)
  103. pos=len(self.itemList)
  104. if self.__IsInViewRange(pos):
  105. (x, y)=self.GetItemViewCoord(pos, newItem.GetWidth())
  106. newItem.SetPosition(x, y)
  107. newItem.Show()
  108. else:
  109. newItem.Hide()
  110. self.itemList.append(newItem)
  111. def SetScrollBar(self, scrollBar):
  112. scrollBar.SetScrollEvent(__mem_func__(self.__OnScroll))
  113. self.scrollBar=scrollBar
  114. def __OnScroll(self):
  115. self.SetBasePos(int(self.scrollBar.GetPos()*self.__GetScrollLen()))
  116. def __GetScrollLen(self):
  117. scrollLen=self.__GetItemCount()-self.__GetViewItemCount()
  118. if scrollLen<0:
  119. return 0
  120. return scrollLen
  121. def __GetViewItemCount(self):
  122. return self.viewItemCount
  123. def __GetItemCount(self):
  124. return len(self.itemList)
  125. def GetItemViewCoord(self, pos, itemWidth):
  126. if localeInfo.IsARABIC():
  127. return (self.GetWidth()-itemWidth-10, (pos-self.basePos)*self.itemStep)
  128. else:
  129. return (0, (pos-self.basePos)*self.itemStep)
  130. def __IsInViewRange(self, pos):
  131. if pos<self.basePos:
  132. return 0
  133. if pos>=self.basePos+self.viewItemCount:
  134. return 0
  135. return 1