179 lines
5 KiB
Python
179 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
|