DirectEntryScroll.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. __all__ = ['DirectEntryScroll']
  2. from pandac.PandaModules import *
  3. import DirectGuiGlobals as DGG
  4. from DirectScrolledFrame import *
  5. from DirectFrame import *
  6. from DirectEntry import *
  7. class DirectEntryScroll(DirectFrame):
  8. def __init__(self, entry, parent = None, **kw):
  9. optiondefs = (
  10. ('pgFunc', PGVirtualFrame, None),
  11. ('relief', None, None),
  12. ('clipSize', (-1, 1, -1, 1), self.setClipSize),
  13. )
  14. self.defineoptions(kw, optiondefs)
  15. DirectFrame.__init__(self, parent, **kw)
  16. self.canvas = None
  17. self.visXMin = 0.0
  18. self.visXMax = 0.0
  19. self.clipXMin = 0.0
  20. self.clipXMax = 0.0
  21. self.initialiseoptions(DirectEntryScroll)
  22. # don't set a scale on the entry
  23. # instead make it the correct size, use something like:
  24. # text_scale = 0.035,
  25. # frameSize = (-0.006, 3.2, -0.015, 0.036),
  26. # if you need to scale the entry scale it's parent instead
  27. self.entry = entry
  28. self.canvas = NodePath(self.guiItem.getCanvasNode())
  29. self.entry.reparentTo(self.canvas)
  30. self.canvas.setPos(0,0,0)
  31. self.entry.bind(DGG.CURSORMOVE,self.cursorMove)
  32. self.canvas.node().setBounds(OmniBoundingVolume())
  33. self.canvas.node().setFinal(1)
  34. self.resetCanvas()
  35. def cursorMove(self, cursorX, cursorY):
  36. cursorX = self.entry.guiItem.getCursorX() * self.entry['text_scale'][0]
  37. canvasX = self.canvas.getX()
  38. visXMin = self.clipXMin - canvasX
  39. visXMax = self.clipXMax - canvasX
  40. visXCenter = (visXMin + visXMax) * 0.5
  41. distanceToCenter = visXCenter - cursorX
  42. clipExtent = self.clipXMax - self.clipXMin
  43. entryExtent = self.entry['text_scale'][0] * self.entry['width']
  44. entryWiggle = entryExtent - clipExtent
  45. if abs(distanceToCenter) > (clipExtent * 0.5):
  46. self.moveToCenterCursor()
  47. def moveToCenterCursor(self):
  48. cursorX = self.entry.guiItem.getCursorX() * self.entry['text_scale'][0]
  49. canvasX = self.canvas.getX()
  50. visXMin = self.clipXMin - canvasX
  51. visXMax = self.clipXMax - canvasX
  52. visXCenter = (visXMin + visXMax) * 0.5
  53. distanceToCenter = visXCenter - cursorX
  54. newX = canvasX + distanceToCenter
  55. clipExtent = self.clipXMax - self.clipXMin
  56. entryExtent = self.entry['text_scale'][0] * self.entry['width']
  57. entryWiggle = entryExtent - clipExtent
  58. if self.entry.guiItem.getCursorPosition() <= 0: #deals with the cursor jump bug
  59. newX = 0.0
  60. elif newX > 0.0:
  61. newX = 0.0
  62. elif newX < (-entryWiggle):
  63. newX = -entryWiggle
  64. #print("CursorX %s CanvasX %s VisCenter %s Distance %s NewX %s Wiggle %s" % (cursorX, canvasX, visXCenter, distanceToCenter, newX, entryWiggle))
  65. self.canvas.setX(newX)
  66. def destroy(self):
  67. # Destroy children of the canvas
  68. for child in self.canvas.getChildren():
  69. childGui = self.guiDict.get(child.getName())
  70. if childGui:
  71. childGui.destroy()
  72. else:
  73. parts = child.getName().split('-')
  74. simpleChildGui = self.guiDict.get(parts[-1])
  75. if simpleChildGui:
  76. simpleChildGui.destroy()
  77. self.entry.destroy()
  78. self.entry = None
  79. DirectFrame.destroy(self)
  80. def getCanvas(self):
  81. return self.canvas
  82. def setClipSize(self):
  83. self.guiItem.setClipFrame(self['clipSize'])
  84. self.clipXMin = self['clipSize'][0]
  85. self.clipXMax = self['clipSize'][1]
  86. self.visXMin = self.clipXMin
  87. self.visXMax = self.clipXMax
  88. if self.canvas:
  89. self.resetCanvas()
  90. def resetCanvas(self):
  91. self.canvas.setPos(0,0,0)