ToonTownRewritten/otp/namepanel/NameTumbler.py

143 lines
5.7 KiB
Python

from pandac.PandaModules import *
from direct.showbase import DirectObject
import random
from direct.task import Task
from direct.gui.DirectGui import *
import string
from direct.gui import OnscreenText
class NameTumbler(DirectFrame):
def __init__(self, nameList, category):
DirectFrame.__init__(self, parent=aspect2d, relief='flat', scale=(1, 1, 1), state='disabled', frameColor=(1, 1, 1, 0))
self.initialiseoptions(NameTumbler)
self.nameList = nameList
self.nameList.sort()
self.category = category
self.tumblerColor = Vec4(1, 1, 1, 1)
self.displayList = [' '] + [' '] + self.nameList + [' '] + [' ']
self.nameIndex = -1
self.isActive = 1
self.loadTumblerGUI()
def loadTumblerGUI(self):
self.circle = 'src/maps/NameTumblerCheck.tif'
self.background = 'src/maps/NameTumbler.tif'
self.upArrow = 'src/maps/NameTumblerUpArrow.tif'
self.downArrow = 'src/maps/NameTumblerDownArrow.tif'
self.tumblerscrollList = self.makeScrollList(self.displayList, self.makeLabel, [TextNode.ACenter, 'title'])
self.tumblerscrollList['command'] = self.listsChanged
self.tumblerscrollList.reparentTo(self)
self.hilight = self.makeHighlight((0, 0, -0.15))
self.hilight.reparentTo(self.tumblerscrollList)
if self.category != '':
self.check = self.makeCheckBox((-0.617, 0, 0.374), self.category, (0, 0.25, 0.5, 1), self.toggleTumbler)
self.check.reparentTo(self)
self.getRandomResult()
def unloadTumblerGUI(self):
if self.category != '':
self.check.destroy()
del self.check
self.tumblerscrollList.destroy()
del self.tumblerscrollList
self.hilight.destroy()
del self.hilight
def toggleTumbler(self, value):
if self.isActive:
if self.priority == 1:
messenger.send('CheckTumblerPriority', [self.category])
else:
self.deactivateTumbler()
else:
self.activateTumbler()
if self.linkage > 0:
messenger.send('CheckTumblerLinkage', [self.category])
self.listsChanged()
if self.isActive:
self.tumblerscrollList.refresh()
self.updateCheckBoxes()
def listsChanged(self):
newname = ''
self.nameIndex = self.tumblerscrollList.index + 2
messenger.send('updateNameResult')
def updateLists(self):
self.tumblerscrollList.scrollTo(self.nameIndex - 2)
messenger.send('updateNameResult')
def updateCheckBoxes(self):
if self.category != '':
if self.isActive:
self.check['indicatorValue'] = self.isActive
else:
self.check['indicatorValue'] = -1
self.check.setIndicatorValue()
def nameClickedOn(self, index):
self.nameIndex = index
self.updateLists()
self.listsChanged()
def activateTumbler(self):
self.hilight.show()
self.isActive = 1
self.tumblerscrollList.itemFrame['frameColor'] = self.tumblerColor
def deactivateTumbler(self):
self.hilight.hide()
self.isActive = 0
self.tumblerscrollList.itemFrame['frameColor'] = (0.7, 0.7, 0.7, 1)
def getName(self):
if self.isActive:
name = self.nameList[self.nameIndex - 2]
else:
name = ''
return name
def makeLabel(self, te, index, others):
alig = others[0]
if alig == TextNode.ARight:
newpos = (0.44, 0, 0)
elif alig == TextNode.ALeft:
newpos = (0, 0, 0)
else:
newpos = (0.2, 0, 0)
df = DirectFrame(state='normal', relief=None, text=te, text_scale=0.1, text_pos=newpos, text_align=alig, textMayChange=0)
df.bind(DGG.B1PRESS, lambda x, df = df: self.nameClickedOn(index))
return df
def makeScrollList(self, nitems, nitemMakeFunction, nitemMakeExtraArgs):
it = nitems[:]
ds = DirectScrolledList(items=it, itemMakeFunction=nitemMakeFunction, itemMakeExtraArgs=nitemMakeExtraArgs, parent=aspect2d, relief=None, command=None, scale=0.6, pad=(0.1, 0.1), incButton_image=(self.downArrow,
self.upArrow,
self.circle,
self.downArrow), incButton_relief=None, incButton_scale=(0.2, 0.05, 0.05), incButton_pos=(0, 0, -0.58), decButton_image=(self.upArrow,
self.downArrow,
self.circle,
self.upArrow), decButton_relief=None, decButton_scale=(0.2, 0.05, 0.05), decButton_pos=(0, 0, 0.23), itemFrame_pos=(-.2, 0, 0.028), itemFrame_scale=1.0, itemFrame_relief=None, itemFrame_image=self.background, itemFrame_image_scale=(0.38, 0, 0.33), itemFrame_image_pos=(0.2, 0, -0.2), itemFrame_frameSize=(-0.05,
0.48,
-0.5,
0.1), itemFrame_borderWidth=(0.01, 0.01), numItemsVisible=5)
ds.setTransparency(1)
return ds
def makeCheckBox(self, npos, ntex, ntexcolor, comm):
dcf = DirectCheckButton(parent=aspect2d, relief=None, scale=0.1, boxBorder=0.08, boxImage=self.circle, boxImageScale=(0.4, 0.4, 0.4), boxRelief=None, pos=npos, text=ntex, text_fg=ntexcolor, text_scale=0.8, text_pos=(0.2, 0), indicator_pos=(-0.566667, 0, -0.045), indicator_image_pos=(-0.26, 0, 0.075), command=comm, text_align=TextNode.ALeft)
dcf.setTransparency(1)
return dcf
def makeHighlight(self, npos):
return DirectFrame(parent=aspect2d, relief='flat', state='disabled', frameSize=(-0.25,
0.26,
-0.05,
0.05), borderWidth=(0.01, 0.01), pos=npos, frameColor=(1, 0, 1, 0.4))
def getRandomResult(self):
randomName = random.choice(self.nameList)
self.nameIndex = self.displayList.index(randomName)
self.updateCheckBoxes()
self.updateLists()