mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-26 13:12:30 -06:00
119 lines
4 KiB
Python
119 lines
4 KiB
Python
|
__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)
|
||
|
|
||
|
|
||
|
|