__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)