toontown-just-works/otp/speedchat/SCMenuHolder.py
2024-07-07 18:08:39 -05:00

178 lines
5 KiB
Python

from panda3d.core import *
from direct.gui.DirectGui import *
from SCObject import SCObject
from SCElement import SCElement
from SCMenu import SCMenu
import types
class SCMenuHolder(SCElement):
N = 0.9
DefaultFrameColor = (0,
0,
0,
1.0 - N)
del N
MenuColorScaleDown = 0.95
def __init__(self, title, menu = None):
SCElement.__init__(self)
self.title = title
scGui = loader.loadModel(SCMenu.GuiModelName)
self.scArrow = scGui.find('**/chatArrow')
self.menu = None
self.setMenu(menu)
return
def destroy(self):
if self.menu is not None:
self.menu.destroy()
self.menu = None
SCElement.destroy(self)
return
def setTitle(self, title):
self.title = title
self.invalidate()
def getTitle(self):
return self.title
def setMenu(self, menu):
if self.menu is not None:
self.menu.destroy()
self.menu = menu
if self.menu is not None:
self.privAdoptSCObject(self.menu)
self.menu.setHolder(self)
self.menu.reparentTo(self, 1)
self.menu.hide()
self.updateViewability()
return
def getMenu(self):
return self.menu
def showMenu(self):
if self.menu is not None:
cS = SCMenuHolder.MenuColorScaleDown
self.menu.setColorScale(cS, cS, cS, 1)
self.menu.enterVisible()
self.menu.show()
return
def hideMenu(self):
if self.menu is not None:
self.menu.hide()
self.menu.exitVisible()
return
def getMenuOverlap(self):
if self.parentMenu.isTopLevel():
return self.getTopLevelOverlap()
else:
return self.getSubmenuOverlap()
def getMenuOffset(self):
xOffset = self.width * (1.0 - self.getMenuOverlap())
return Point3(xOffset, 0, 0)
def onMouseClick(self, event):
SCElement.enterActive(self)
self.parentMenu.memberSelected(self)
def enterActive(self):
SCElement.enterActive(self)
self.showMenu()
if hasattr(self, 'button'):
r, g, b = self.getColorScheme().getMenuHolderActiveColor()
a = self.getColorScheme().getAlpha()
self.button.frameStyle[DGG.BUTTON_READY_STATE].setColor(r, g, b, a)
self.button.updateFrameStyle()
else:
self.notify.warning('SCMenuHolder has no button (has finalize been called?).')
def exitActive(self):
SCElement.exitActive(self)
self.hideMenu()
self.button.frameStyle[DGG.BUTTON_READY_STATE].setColor(*SCMenuHolder.DefaultFrameColor)
self.button.updateFrameStyle()
def getDisplayText(self):
return self.title
def updateViewability(self):
if self.menu is None:
self.setViewable(0)
return
isViewable = False
for child in self.menu:
if child.isViewable():
isViewable = True
break
self.setViewable(isViewable)
return
def getMinSubmenuWidth(self):
parentMenu = self.getParentMenu()
if parentMenu is None:
myWidth, myWeight = self.getMinDimensions()
else:
myWidth = parentMenu.getWidth()
return 0.15 + myWidth * self.getMenuOverlap()
def getMinDimensions(self):
width, height = SCElement.getMinDimensions(self)
width += 1.0
return (width, height)
def invalidate(self):
SCElement.invalidate(self)
if self.menu is not None:
self.menu.invalidate()
return
def finalize(self, dbArgs = {}):
if not self.isDirty():
return
r, g, b = self.getColorScheme().getArrowColor()
a = self.getColorScheme().getAlpha()
self.scArrow.setColorScale(r, g, b, a)
if self.menu is not None:
self.menu.setPos(self.getMenuOffset())
if self.isActive():
r, g, b = self.getColorScheme().getMenuHolderActiveColor()
a = self.getColorScheme().getAlpha()
frameColor = (r,
g,
b,
a)
else:
frameColor = SCMenuHolder.DefaultFrameColor
args = {'image': self.scArrow,
'image_pos': (self.width - 0.5, 0, -self.height * 0.5),
'frameColor': frameColor}
args.update(dbArgs)
SCElement.finalize(self, dbArgs=args)
return
def hasStickyFocus(self):
return 1
def privSetSettingsRef(self, settingsRef):
SCObject.privSetSettingsRef(self, settingsRef)
if self.menu is not None:
self.menu.privSetSettingsRef(settingsRef)
return
def invalidateAll(self):
SCObject.invalidateAll(self)
if self.menu is not None:
self.menu.invalidateAll()
return
def finalizeAll(self):
SCObject.finalizeAll(self)
if self.menu is not None:
self.menu.finalizeAll()
return