2019-12-30 00:00:16 -06:00
|
|
|
from .SCElement import SCElement
|
|
|
|
from .SCObject import SCObject
|
|
|
|
from .SCMenu import SCMenu
|
2019-11-02 17:27:54 -05:00
|
|
|
from direct.fsm.StatePush import StateVar, FunctionCall
|
|
|
|
from direct.showbase.DirectObject import DirectObject
|
|
|
|
from otp.avatar import Emote
|
|
|
|
SCTerminalSelectedEvent = 'SCTerminalSelected'
|
|
|
|
SCTerminalLinkedEmoteEvent = 'SCTerminalLinkedEmoteEvent'
|
|
|
|
SCWhisperModeChangeEvent = 'SCWhisperModeChange'
|
|
|
|
|
|
|
|
class SCTerminal(SCElement):
|
|
|
|
|
|
|
|
def __init__(self, linkedEmote = None):
|
|
|
|
SCElement.__init__(self)
|
|
|
|
self.setLinkedEmote(linkedEmote)
|
|
|
|
scGui = loader.loadModel(SCMenu.GuiModelName)
|
|
|
|
self.emotionIcon = scGui.find('**/emotionIcon')
|
|
|
|
self.setDisabled(False)
|
|
|
|
self.__numCharges = -1
|
|
|
|
self._handleWhisperModeSV = StateVar(False)
|
|
|
|
self._handleWhisperModeFC = None
|
|
|
|
return
|
|
|
|
|
|
|
|
def destroy(self):
|
|
|
|
self._handleWhisperModeSV.set(False)
|
|
|
|
if self._handleWhisperModeFC:
|
|
|
|
self._handleWhisperModeFC.destroy()
|
|
|
|
self._handleWhisperModeSV.destroy()
|
|
|
|
SCElement.destroy(self)
|
|
|
|
|
|
|
|
def privSetSettingsRef(self, settingsRef):
|
|
|
|
SCElement.privSetSettingsRef(self, settingsRef)
|
|
|
|
if self._handleWhisperModeFC is None:
|
|
|
|
self._handleWhisperModeFC = FunctionCall(self._handleWhisperModeSVChanged, self._handleWhisperModeSV)
|
|
|
|
self._handleWhisperModeFC.pushCurrentState()
|
|
|
|
self._handleWhisperModeSV.set(self.settingsRef is not None and not self.isWhisperable())
|
|
|
|
return
|
|
|
|
|
|
|
|
def _handleWhisperModeSVChanged(self, handleWhisperMode):
|
|
|
|
if handleWhisperMode:
|
|
|
|
self._wmcListener = DirectObject()
|
|
|
|
self._wmcListener.accept(self.getEventName(SCWhisperModeChangeEvent), self._handleWhisperModeChange)
|
|
|
|
elif hasattr(self, '_wmcListener'):
|
|
|
|
self._wmcListener.ignoreAll()
|
|
|
|
del self._wmcListener
|
|
|
|
self.invalidate()
|
|
|
|
|
|
|
|
def _handleWhisperModeChange(self, whisperMode):
|
|
|
|
self.invalidate()
|
|
|
|
|
|
|
|
def handleSelect(self):
|
|
|
|
messenger.send(self.getEventName(SCTerminalSelectedEvent))
|
|
|
|
if self.hasLinkedEmote() and self.linkedEmoteEnabled():
|
|
|
|
messenger.send(self.getEventName(SCTerminalLinkedEmoteEvent), [self.linkedEmote])
|
|
|
|
|
|
|
|
def isWhisperable(self):
|
|
|
|
return True
|
|
|
|
|
|
|
|
def getLinkedEmote(self):
|
|
|
|
return self.linkedEmote
|
|
|
|
|
|
|
|
def setLinkedEmote(self, linkedEmote):
|
|
|
|
self.linkedEmote = linkedEmote
|
|
|
|
self.invalidate()
|
|
|
|
|
|
|
|
def hasLinkedEmote(self):
|
|
|
|
return self.linkedEmote is not None
|
|
|
|
|
|
|
|
def linkedEmoteEnabled(self):
|
|
|
|
if Emote.globalEmote:
|
|
|
|
return Emote.globalEmote.isEnabled(self.linkedEmote)
|
|
|
|
|
|
|
|
def getCharges(self):
|
|
|
|
return self.__numCharges
|
|
|
|
|
|
|
|
def setCharges(self, nCharges):
|
|
|
|
self.__numCharges = nCharges
|
2020-01-11 23:25:04 -06:00
|
|
|
if nCharges == 0:
|
2019-11-02 17:27:54 -05:00
|
|
|
self.setDisabled(True)
|
|
|
|
|
|
|
|
def isDisabled(self):
|
|
|
|
return self.__disabled or self.isWhispering() and not self.isWhisperable()
|
|
|
|
|
|
|
|
def setDisabled(self, bDisabled):
|
|
|
|
self.__disabled = bDisabled
|
|
|
|
|
|
|
|
def onMouseClick(self, event):
|
|
|
|
if not self.isDisabled():
|
|
|
|
SCElement.onMouseClick(self, event)
|
|
|
|
self.handleSelect()
|
|
|
|
|
|
|
|
def getMinDimensions(self):
|
|
|
|
width, height = SCElement.getMinDimensions(self)
|
|
|
|
if self.hasLinkedEmote():
|
|
|
|
width += 1.3
|
|
|
|
return (width, height)
|
|
|
|
|
|
|
|
def finalize(self, dbArgs = {}):
|
|
|
|
if not self.isDirty():
|
|
|
|
return
|
|
|
|
args = {}
|
|
|
|
if self.hasLinkedEmote():
|
|
|
|
self.lastEmoteIconColor = self.getEmoteIconColor()
|
|
|
|
self.emotionIcon.setColorScale(*self.lastEmoteIconColor)
|
|
|
|
args.update({'image': self.emotionIcon,
|
|
|
|
'image_pos': (self.width - 0.6, 0, -self.height * 0.5)})
|
|
|
|
if self.isDisabled():
|
|
|
|
args.update({'rolloverColor': (0, 0, 0, 0),
|
|
|
|
'pressedColor': (0, 0, 0, 0),
|
|
|
|
'rolloverSound': None,
|
|
|
|
'clickSound': None,
|
|
|
|
'text_fg': self.getColorScheme().getTextDisabledColor() + (1,)})
|
|
|
|
args.update(dbArgs)
|
|
|
|
SCElement.finalize(self, dbArgs=args)
|
|
|
|
return
|
|
|
|
|
|
|
|
def getEmoteIconColor(self):
|
|
|
|
if self.linkedEmoteEnabled() and not self.isWhispering():
|
|
|
|
r, g, b = self.getColorScheme().getEmoteIconColor()
|
|
|
|
else:
|
|
|
|
r, g, b = self.getColorScheme().getEmoteIconDisabledColor()
|
|
|
|
return (r,
|
|
|
|
g,
|
|
|
|
b,
|
|
|
|
1)
|
|
|
|
|
|
|
|
def updateEmoteIcon(self):
|
|
|
|
if hasattr(self, 'button'):
|
|
|
|
self.lastEmoteIconColor = self.getEmoteIconColor()
|
|
|
|
for i in range(self.button['numStates']):
|
|
|
|
self.button['image%s_image' % i].setColorScale(*self.lastEmoteIconColor)
|
|
|
|
|
|
|
|
else:
|
|
|
|
self.invalidate()
|
|
|
|
|
|
|
|
def enterVisible(self):
|
|
|
|
SCElement.enterVisible(self)
|
|
|
|
if hasattr(self, 'lastEmoteIconColor'):
|
|
|
|
if self.getEmoteIconColor() != self.lastEmoteIconColor:
|
|
|
|
self.invalidate()
|
|
|
|
|
|
|
|
def handleWhisperModeChange(whisperMode, self = self):
|
|
|
|
if self.hasLinkedEmote():
|
|
|
|
if self.isVisible() and not self.isWhispering():
|
|
|
|
self.updateEmoteIcon()
|
|
|
|
|
|
|
|
self.accept(self.getEventName(SCWhisperModeChangeEvent), handleWhisperModeChange)
|
|
|
|
|
|
|
|
def handleEmoteEnableStateChange(self = self):
|
|
|
|
if self.hasLinkedEmote():
|
|
|
|
if self.isVisible() and not self.isWhispering():
|
|
|
|
self.updateEmoteIcon()
|
|
|
|
|
|
|
|
if self.hasLinkedEmote():
|
|
|
|
if Emote.globalEmote:
|
|
|
|
self.accept(Emote.globalEmote.EmoteEnableStateChanged, handleEmoteEnableStateChange)
|
|
|
|
|
|
|
|
def exitVisible(self):
|
|
|
|
SCElement.exitVisible(self)
|
|
|
|
self.ignore(self.getEventName(SCWhisperModeChangeEvent))
|
|
|
|
if Emote.globalEmote:
|
|
|
|
self.ignore(Emote.globalEmote.EmoteEnableStateChanged)
|
|
|
|
|
|
|
|
def getDisplayText(self):
|
2020-01-11 23:25:04 -06:00
|
|
|
if self.getCharges() != -1:
|
2019-11-02 17:27:54 -05:00
|
|
|
return self.text + ' (%s)' % self.getCharges()
|
|
|
|
else:
|
|
|
|
return self.text
|