| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- __all__ = ['DirectEntryScroll']
- from pandac.PandaModules import *
- import DirectGuiGlobals as DGG
- from DirectScrolledFrame import *
- from DirectFrame import *
- from DirectEntry import *
- class DirectEntryScroll(DirectFrame):
- def __init__(self, entry, parent = None, **kw):
- optiondefs = (
- ('pgFunc', PGVirtualFrame, None),
- ('relief', None, None),
- ('clipSize', (-1, 1, -1, 1), self.setClipSize),
- )
-
- self.defineoptions(kw, optiondefs)
- DirectFrame.__init__(self, parent, **kw)
- self.canvas = None
- self.visXMin = 0.0
- self.visXMax = 0.0
- self.clipXMin = 0.0
- self.clipXMax = 0.0
- self.initialiseoptions(DirectEntryScroll)
-
- # don't set a scale on the entry
- # instead make it the correct size, use something like:
- # text_scale = 0.035,
- # frameSize = (-0.006, 3.2, -0.015, 0.036),
- # if you need to scale the entry scale it's parent instead
-
- self.entry = entry
- self.canvas = NodePath(self.guiItem.getCanvasNode())
- self.entry.reparentTo(self.canvas)
- self.canvas.setPos(0,0,0)
-
- self.entry.bind(DGG.CURSORMOVE,self.cursorMove)
-
- self.canvas.node().setBounds(OmniBoundingVolume())
- self.canvas.node().setFinal(1)
- self.resetCanvas()
-
-
-
- def cursorMove(self, cursorX, cursorY):
- cursorX = self.entry.guiItem.getCursorX() * self.entry['text_scale'][0]
- canvasX = self.canvas.getX()
- visXMin = self.clipXMin - canvasX
- visXMax = self.clipXMax - canvasX
- visXCenter = (visXMin + visXMax) * 0.5
- distanceToCenter = visXCenter - cursorX
- clipExtent = self.clipXMax - self.clipXMin
-
- entryExtent = self.entry['text_scale'][0] * self.entry['width']
- entryWiggle = entryExtent - clipExtent
-
- if abs(distanceToCenter) > (clipExtent * 0.5):
- self.moveToCenterCursor()
-
-
- def moveToCenterCursor(self):
- cursorX = self.entry.guiItem.getCursorX() * self.entry['text_scale'][0]
- canvasX = self.canvas.getX()
- visXMin = self.clipXMin - canvasX
- visXMax = self.clipXMax - canvasX
- visXCenter = (visXMin + visXMax) * 0.5
- distanceToCenter = visXCenter - cursorX
- newX = canvasX + distanceToCenter
-
- clipExtent = self.clipXMax - self.clipXMin
- entryExtent = self.entry['text_scale'][0] * self.entry['width']
- entryWiggle = entryExtent - clipExtent
-
- if self.entry.guiItem.getCursorPosition() <= 0: #deals with the cursor jump bug
- newX = 0.0
- elif newX > 0.0:
- newX = 0.0
- elif newX < (-entryWiggle):
- newX = -entryWiggle
-
- #print("CursorX %s CanvasX %s VisCenter %s Distance %s NewX %s Wiggle %s" % (cursorX, canvasX, visXCenter, distanceToCenter, newX, entryWiggle))
-
- self.canvas.setX(newX)
-
- def destroy(self):
- # Destroy children of the canvas
- for child in self.canvas.getChildren():
- childGui = self.guiDict.get(child.getName())
- if childGui:
- childGui.destroy()
- else:
- parts = child.getName().split('-')
- simpleChildGui = self.guiDict.get(parts[-1])
- if simpleChildGui:
- simpleChildGui.destroy()
- self.entry.destroy()
- self.entry = None
- DirectFrame.destroy(self)
-
-
- def getCanvas(self):
- return self.canvas
-
- def setClipSize(self):
- self.guiItem.setClipFrame(self['clipSize'])
- self.clipXMin = self['clipSize'][0]
- self.clipXMax = self['clipSize'][1]
- self.visXMin = self.clipXMin
- self.visXMax = self.clipXMax
- if self.canvas:
- self.resetCanvas()
-
- def resetCanvas(self):
- self.canvas.setPos(0,0,0)
-
-
-
|