Poodletooth-iLand/toontown/shtiker/OptionsPage.py

810 lines
38 KiB
Python
Executable file

from direct.directnotify.DirectNotifyGlobal import directNotify
from direct.gui.DirectGui import *
from direct.showbase import PythonUtil
from direct.task import Task
from pandac.PandaModules import *
import DisplaySettingsDialog
import ShtikerPage
from otp.avatar import Avatar
from otp.speedchat import SCColorScheme
from otp.speedchat import SCStaticTextTerminal
from otp.speedchat import SpeedChat
from toontown.toonbase import TTLocalizer, ToontownGlobals
from toontown.toontowngui import TTDialog
import webbrowser
speedChatStyles = (
(
2000,
(200 / 255.0, 60 / 255.0, 229 / 255.0),
(200 / 255.0, 135 / 255.0, 255 / 255.0),
(220 / 255.0, 195 / 255.0, 229 / 255.0)
),
(
2012,
(142 / 255.0, 151 / 255.0, 230 / 255.0),
(173 / 255.0, 180 / 255.0, 237 / 255.0),
(220 / 255.0, 195 / 255.0, 229 / 255.0)
),
(
2001,
(0 / 255.0, 0 / 255.0, 255 / 255.0),
(140 / 255.0, 150 / 255.0, 235 / 255.0),
(201 / 255.0, 215 / 255.0, 255 / 255.0)
),
(
2010,
(0 / 255.0, 119 / 255.0, 190 / 255.0),
(53 / 255.0, 180 / 255.0, 255 / 255.0),
(201 / 255.0, 215 / 255.0, 255 / 255.0)
),
(
2014,
(0 / 255.0, 64 / 255.0, 128 / 255.0),
(0 / 255.0, 64 / 255.0, 128 / 255.0),
(201 / 255.0, 215 / 255.0, 255 / 255.0)
),
(
2002,
(90 / 255.0, 175 / 255.0, 225 / 255.0),
(120 / 255.0, 215 / 255.0, 255 / 255.0),
(208 / 255.0, 230 / 255.0, 250 / 255.0)
),
(
2003,
(130 / 255.0, 235 / 255.0, 235 / 255.0),
(120 / 255.0, 225 / 255.0, 225 / 255.0),
(234 / 255.0, 255 / 255.0, 255 / 255.0)
),
(
2004,
(0 / 255.0, 200 / 255.0, 70 / 255.0),
(0 / 255.0, 200 / 255.0, 80 / 255.0),
(204 / 255.0, 255 / 255.0, 204 / 255.0)
),
(
2015,
(13 / 255.0, 255 / 255.0, 100 / 255.0),
(64 / 255.0, 255 / 255.0, 131 / 255.0),
(204 / 255.0, 255 / 255.0, 204 / 255.0)
),
(
2005,
(235 / 255.0, 230 / 255.0, 0 / 255.0),
(255 / 255.0, 250 / 255.0, 100 / 255.0),
(255 / 255.0, 250 / 255.0, 204 / 255.0)
),
(
2006,
(255 / 255.0, 153 / 255.0, 0 / 255.0),
(229 / 255.0, 147 / 255.0, 0 / 255.0),
(255 / 255.0, 234 / 255.0, 204 / 255.0)
),
(
2011,
(255 / 255.0, 177 / 255.0, 62 / 255.0),
(255 / 255.0, 200 / 255.0, 117 / 255.0),
(255 / 255.0, 234 / 255.0, 204 / 255.0)
),
(
2007,
(255 / 255.0, 0 / 255.0, 50 / 255.0),
(229 / 255.0, 0 / 255.0, 50 / 255.0),
(255 / 255.0, 204 / 255.0, 204 / 255.0)
),
(
2013,
(130 / 255.0, 0 / 255.0, 26 / 255.0),
(179 / 255.0, 0 / 255.0, 50 / 255.0),
(255 / 255.0, 204 / 255.0, 204 / 255.0)
),
(
2016,
(176 / 255.0, 35 / 255.0, 0 / 255.0),
(240 / 255.0, 48 / 255.0, 0 / 255.0),
(255 / 255.0, 204 / 255.0, 204 / 255.0)
),
(
2008,
(255 / 255.0, 153 / 255.0, 193 / 255.0),
(240 / 255.0, 157 / 255.0, 192 / 255.0),
(255 / 255.0, 215 / 255.0, 238 / 255.0)
),
(
2009,
(170 / 255.0, 120 / 255.0, 20 / 255.0),
(165 / 255.0, 120 / 255.0, 50 / 255.0),
(210 / 255.0, 200 / 255.0, 180 / 255.0)
)
)
PageMode = PythonUtil.Enum('Options, Codes, Extra')
class OptionsPage(ShtikerPage.ShtikerPage):
notify = directNotify.newCategory('OptionsPage')
def __init__(self):
ShtikerPage.ShtikerPage.__init__(self)
self.optionsTabPage = None
self.codesTabPage = None
self.extraOptionsTabPage = None
self.title = None
self.optionsTab = None
self.codesTab = None
self.extraOptionsTab = None
def load(self):
ShtikerPage.ShtikerPage.load(self)
self.optionsTabPage = OptionsTabPage(self)
self.optionsTabPage.hide()
self.codesTabPage = CodesTabPage(self)
self.codesTabPage.hide()
self.extraOptionsTabPage = ExtraOptionsTabPage(self)
self.extraOptionsTabPage.hide()
self.title = DirectLabel(
parent=self, relief=None, text=TTLocalizer.OptionsPageTitle,
text_scale=0.12, pos=(0, 0, 0.61))
gui = loader.loadModel('phase_3.5/models/gui/fishingBook.bam')
normalColor = (1, 1, 1, 1)
clickColor = (0.8, 0.8, 0, 1)
rolloverColor = (0.15, 0.82, 1.0, 1)
diabledColor = (1.0, 0.98, 0.15, 1)
self.optionsTab = DirectButton(
parent=self, relief=None, text=TTLocalizer.OptionsPageTitle,
text_scale=TTLocalizer.OPoptionsTab, text_align=TextNode.ALeft,
text_pos=(0.01, 0.0, 0.0), image=gui.find('**/tabs/polySurface1'),
image_pos=(0.55, 1, -0.91), image_hpr=(0, 0, -90),
image_scale=(0.033, 0.033, 0.035), image_color=normalColor,
image1_color=clickColor, image2_color=rolloverColor,
image3_color=diabledColor, text_fg=Vec4(0.2, 0.1, 0, 1),
command=self.setMode, extraArgs=[PageMode.Options],
pos=(-0.64, 0, 0.77))
self.codesTab = DirectButton(
parent=self, relief=None, text=TTLocalizer.OptionsPageCodesTab,
text_scale=TTLocalizer.OPoptionsTab, text_align=TextNode.ALeft,
text_pos=(-0.035, 0.0, 0.0),
image=gui.find('**/tabs/polySurface2'), image_pos=(0.12, 1, -0.91),
image_hpr=(0, 0, -90), image_scale=(0.033, 0.033, 0.035),
image_color=normalColor, image1_color=clickColor,
image2_color=rolloverColor, image3_color=diabledColor,
text_fg=Vec4(0.2, 0.1, 0, 1), command=self.setMode,
extraArgs=[PageMode.Codes], pos=(-0.12, 0, 0.77))
self.extraOptionsTab = DirectButton(
parent=self, relief=None, text=TTLocalizer.ExtraOptionsPageTitle,
text_scale=TTLocalizer.OPextraOptionsTab, text_align=TextNode.ALeft,
text_pos=(0.027, 0.0, 0.0),
image=gui.find('**/tabs/polySurface2'), image_pos=(0.12, 1, -0.91),
image_hpr=(0, 0, -90), image_scale=(0.033, 0.033, 0.035),
image_color=normalColor, image1_color=clickColor,
image2_color=rolloverColor, image3_color=diabledColor,
text_fg=Vec4(0.2, 0.1, 0, 1), command=self.setMode,
extraArgs=[PageMode.Extra], pos=(0.42, 0, 0.77))
gui.removeNode()
def enter(self):
self.setMode(PageMode.Options, updateAnyways=1)
ShtikerPage.ShtikerPage.enter(self)
def exit(self):
self.optionsTabPage.exit()
self.codesTabPage.exit()
ShtikerPage.ShtikerPage.exit(self)
def unload(self):
if self.optionsTabPage is not None:
self.optionsTabPage.unload()
self.optionsTabPage = None
if self.codesTabPage is not None:
self.codesTabPage.unload()
self.codesTabPage = None
if self.title is not None:
self.title.destroy()
self.title = None
if self.optionsTab is not None:
self.optionsTab.destroy()
self.optionsTab = None
if self.codesTab is not None:
self.codesTab.destroy()
self.codesTab = None
ShtikerPage.ShtikerPage.unload(self)
def setMode(self, mode, updateAnyways=0):
messenger.send('wakeup')
if not updateAnyways:
if self.mode == mode:
return
self.mode = mode
if mode == PageMode.Options:
self.title['text'] = TTLocalizer.OptionsPageTitle
self.optionsTab['state'] = DGG.DISABLED
self.optionsTabPage.enter()
self.codesTab['state'] = DGG.NORMAL
self.codesTabPage.exit()
self.extraOptionsTab['state'] = DGG.NORMAL
self.extraOptionsTabPage.exit()
elif mode == PageMode.Codes:
self.title['text'] = TTLocalizer.CdrPageTitle
self.optionsTab['state'] = DGG.NORMAL
self.optionsTabPage.exit()
self.extraOptionsTab['state'] = DGG.NORMAL
self.extraOptionsTabPage.exit()
self.codesTab['state'] = DGG.DISABLED
self.codesTabPage.enter()
elif mode == PageMode.Extra:
self.title['text'] = TTLocalizer.ExtraOptionsPageTitle
self.optionsTab['state'] = DGG.NORMAL
self.optionsTabPage.exit()
self.codesTab['state'] = DGG.NORMAL
self.codesTabPage.exit()
self.extraOptionsTab['state'] = DGG.DISABLED
self.extraOptionsTabPage.enter()
class OptionsTabPage(DirectFrame):
notify = directNotify.newCategory('OptionsTabPage')
DisplaySettingsTaskName = 'save-display-settings'
DisplaySettingsDelay = 60
ChangeDisplaySettings = base.config.GetBool('change-display-settings', 1)
ChangeDisplayAPI = base.config.GetBool('change-display-api', 0)
def __init__(self, parent = aspect2d):
self.parent = parent
self.currentSizeIndex = None
DirectFrame.__init__(self, parent=self.parent, relief=None, pos=(0.0, 0.0, 0.0), scale=(1.0, 1.0, 1.0))
self.load()
def destroy(self):
self.parent = None
DirectFrame.destroy(self)
def load(self):
self.displaySettings = None
self.displaySettingsChanged = 0
self.displaySettingsSize = (None, None)
self.displaySettingsFullscreen = None
self.displaySettingsApi = None
self.displaySettingsApiChanged = 0
guiButton = loader.loadModel('phase_3/models/gui/quit_button')
gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui')
circleModel = loader.loadModel('phase_3/models/gui/tt_m_gui_mat_nameShop')
titleHeight = 0.61
textStartHeight = 0.45
textRowHeight = 0.145
leftMargin = -0.72
buttonbase_xcoord = 0.35
buttonbase_ycoord = 0.45
button_image_scale = (0.7, 1, 1)
button_textpos = (0, -0.02)
options_text_scale = 0.052
disabled_arrow_color = Vec4(0.6, 0.6, 0.6, 1.0)
self.speed_chat_scale = 0.055
self.Music_Label = DirectLabel(parent=self, relief=None, text='Music Volume:', text_align=TextNode.ALeft, text_scale=options_text_scale, pos=(leftMargin, 0, textStartHeight))
self.SoundFX_Label = DirectLabel(parent=self, relief=None, text='SFX Volume:', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - textRowHeight))
self.Friends_Label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 3 * textRowHeight))
self.Whispers_Label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 4 * textRowHeight))
self.DisplaySettings_Label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=10, pos=(leftMargin, 0, textStartHeight - 5 * textRowHeight))
self.SpeedChatStyle_Label = DirectLabel(parent=self, relief=None, text=TTLocalizer.OptionsPageSpeedChatStyleLabel, text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=10, pos=(leftMargin, 0, textStartHeight - 6 * textRowHeight))
self.ToonChatSounds_Label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=15, pos=(leftMargin, 0, textStartHeight - 2 * textRowHeight + 0.025))
self.ToonChatSounds_Label.setScale(0.9)
self.Music_toggleSlider = DirectSlider(parent=self, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord),
value=settings['musicVol']*100, pageSize=5, range=(0, 100), command=self.__doMusicLevel,
thumb_geom=(circleModel.find('**/tt_t_gui_mat_namePanelCircle')), thumb_relief=None, thumb_geom_scale=2)
self.Music_toggleSlider.setScale(0.25)
self.SoundFX_toggleSlider = DirectSlider(parent=self, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - textRowHeight),
value=settings['sfxVol']*100, pageSize=5, range=(0, 100), command=self.__doSfxLevel,
thumb_geom=(circleModel.find('**/tt_t_gui_mat_namePanelCircle')), thumb_relief=None, thumb_geom_scale=2)
self.SoundFX_toggleSlider.setScale(0.25)
self.Friends_toggleButton = DirectButton(parent=self, relief=None, image=(guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - textRowHeight * 3), command=self.__doToggleAcceptFriends)
self.Whispers_toggleButton = DirectButton(parent=self, relief=None, image=(guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - textRowHeight * 4), command=self.__doToggleAcceptWhispers)
self.DisplaySettingsButton = DirectButton(parent=self, relief=None, image=(guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image3_color=Vec4(0.5, 0.5, 0.5, 0.5), image_scale=button_image_scale, text=TTLocalizer.OptionsPageChange, text3_fg=(0.5, 0.5, 0.5, 0.75), text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - textRowHeight * 5), command=self.__doDisplaySettings)
self.speedChatStyleLeftArrow = DirectButton(parent=self, relief=None, image=(gui.find('**/Horiz_Arrow_UP'),
gui.find('**/Horiz_Arrow_DN'),
gui.find('**/Horiz_Arrow_Rllvr'),
gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), scale=(-1.0, 1.0, 1.0), pos=(0.25, 0, buttonbase_ycoord - textRowHeight * 6), command=self.__doSpeedChatStyleLeft)
self.speedChatStyleRightArrow = DirectButton(parent=self, relief=None, image=(gui.find('**/Horiz_Arrow_UP'),
gui.find('**/Horiz_Arrow_DN'),
gui.find('**/Horiz_Arrow_Rllvr'),
gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), pos=(0.65, 0, buttonbase_ycoord - textRowHeight * 6), command=self.__doSpeedChatStyleRight)
self.ToonChatSounds_toggleButton = DirectButton(parent=self, relief=None, image=(guiButton.find('**/QuitBtn_UP'),
guiButton.find('**/QuitBtn_DN'),
guiButton.find('**/QuitBtn_RLVR'),
guiButton.find('**/QuitBtn_UP')), image3_color=Vec4(0.5, 0.5, 0.5, 0.5), image_scale=button_image_scale, text='', text3_fg=(0.5, 0.5, 0.5, 0.75), text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - textRowHeight * 2 + 0.025), command=self.__doToggleToonChatSounds)
self.ToonChatSounds_toggleButton.setScale(0.8)
self.speedChatStyleText = SpeedChat.SpeedChat(name='OptionsPageStyleText', structure=[2000], backgroundModelName='phase_3/models/gui/ChatPanel', guiModelName='phase_3.5/models/gui/speedChatGui')
self.speedChatStyleText.setScale(self.speed_chat_scale)
self.speedChatStyleText.setPos(0.37, 0, buttonbase_ycoord - textRowHeight * 6 + 0.03)
self.speedChatStyleText.reparentTo(self, DGG.FOREGROUND_SORT_INDEX)
self.exitButton = DirectButton(parent=self, relief=None, image=(guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale=1.15, text=TTLocalizer.OptionsPageExitToontown, text_scale=options_text_scale, text_pos=button_textpos, textMayChange=0, pos=(0.45, 0, -0.6), command=self.__handleExitShowWithConfirm)
guiButton.removeNode()
gui.removeNode()
def enter(self):
self.show()
taskMgr.remove(self.DisplaySettingsTaskName)
self.settingsChanged = 0
self.__setAcceptFriendsButton()
self.__setAcceptWhispersButton()
self.__setDisplaySettings()
self.__setToonChatSoundsButton()
self.speedChatStyleText.enter()
self.speedChatStyleIndex = base.localAvatar.getSpeedChatStyleIndex()
self.updateSpeedChatStyle()
if self.parent.book.safeMode:
self.exitButton.hide()
else:
self.exitButton.show()
def exit(self):
self.ignore('confirmDone')
self.hide()
self.speedChatStyleText.exit()
if self.displaySettingsChanged:
taskMgr.doMethodLater(self.DisplaySettingsDelay, self.writeDisplaySettings, self.DisplaySettingsTaskName)
def unload(self):
self.writeDisplaySettings()
taskMgr.remove(self.DisplaySettingsTaskName)
if self.displaySettings != None:
self.ignore(self.displaySettings.doneEvent)
self.displaySettings.unload()
self.displaySettings = None
self.exitButton.destroy()
self.Music_toggleSlider.destroy()
self.SoundFX_toggleSlider.destroy()
self.Friends_toggleButton.destroy()
self.Whispers_toggleButton.destroy()
self.DisplaySettingsButton.destroy()
self.speedChatStyleLeftArrow.destroy()
self.speedChatStyleRightArrow.destroy()
del self.exitButton
del self.SoundFX_Label
del self.Music_Label
del self.Friends_Label
del self.Whispers_Label
del self.SpeedChatStyle_Label
del self.SoundFX_toggleSlider
del self.Music_toggleSlider
del self.Friends_toggleButton
del self.Whispers_toggleButton
del self.speedChatStyleLeftArrow
del self.speedChatStyleRightArrow
self.speedChatStyleText.exit()
self.speedChatStyleText.destroy()
del self.speedChatStyleText
self.currentSizeIndex = None
def __doMusicLevel(self):
vol = self.Music_toggleSlider['value']
vol = float(vol) / 100
settings['musicVol'] = vol
base.musicManager.setVolume(vol)
if vol == 0.0:
settings['music'] = False
base.musicActive = False
else:
settings['music'] = True
base.musicActive = True
def __doSfxLevel(self):
vol = self.SoundFX_toggleSlider['value']
vol = float(vol) / 100
settings['sfxVol'] = vol
for sfm in base.sfxManagerList:
sfm.setVolume(vol)
if vol == 0.0:
settings['sfx'] = False
base.sfxActive = False
else:
settings['sfx'] = True
base.sfxActive = True
self.__setToonChatSoundsButton()
def __doToggleToonChatSounds(self):
messenger.send('wakeup')
if base.toonChatSounds:
base.toonChatSounds = 0
settings['toonChatSounds'] = False
else:
base.toonChatSounds = 1
settings['toonChatSounds'] = True
self.settingsChanged = 1
self.__setToonChatSoundsButton()
def __setToonChatSoundsButton(self):
if base.toonChatSounds:
self.ToonChatSounds_Label['text'] = TTLocalizer.OptionsPageToonChatSoundsOnLabel
self.ToonChatSounds_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff
else:
self.ToonChatSounds_Label['text'] = TTLocalizer.OptionsPageToonChatSoundsOffLabel
self.ToonChatSounds_toggleButton['text'] = TTLocalizer.OptionsPageToggleOn
if base.sfxActive:
self.ToonChatSounds_Label.setColorScale(1.0, 1.0, 1.0, 1.0)
self.ToonChatSounds_toggleButton['state'] = DGG.NORMAL
else:
self.ToonChatSounds_Label.setColorScale(0.5, 0.5, 0.5, 0.5)
self.ToonChatSounds_toggleButton['state'] = DGG.DISABLED
def __doToggleAcceptFriends(self):
messenger.send('wakeup')
acceptingNewFriends = settings.get('acceptingNewFriends', {})
if base.localAvatar.acceptingNewFriends:
base.localAvatar.acceptingNewFriends = 0
acceptingNewFriends[str(base.localAvatar.doId)] = False
else:
base.localAvatar.acceptingNewFriends = 1
acceptingNewFriends[str(base.localAvatar.doId)] = True
settings['acceptingNewFriends'] = acceptingNewFriends
self.settingsChanged = 1
self.__setAcceptFriendsButton()
def __doToggleAcceptWhispers(self):
messenger.send('wakeup')
acceptingNonFriendWhispers = settings.get('acceptingNonFriendWhispers', {})
if base.localAvatar.acceptingNonFriendWhispers:
base.localAvatar.acceptingNonFriendWhispers = 0
acceptingNonFriendWhispers[str(base.localAvatar.doId)] = False
else:
base.localAvatar.acceptingNonFriendWhispers = 1
acceptingNonFriendWhispers[str(base.localAvatar.doId)] = True
settings['acceptingNonFriendWhispers'] = acceptingNonFriendWhispers
self.settingsChanged = 1
self.__setAcceptWhispersButton()
def __setAcceptFriendsButton(self):
if base.localAvatar.acceptingNewFriends:
self.Friends_Label['text'] = TTLocalizer.OptionsPageFriendsEnabledLabel
self.Friends_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff
else:
self.Friends_Label['text'] = TTLocalizer.OptionsPageFriendsDisabledLabel
self.Friends_toggleButton['text'] = TTLocalizer.OptionsPageToggleOn
def __setAcceptWhispersButton(self):
if base.localAvatar.acceptingNonFriendWhispers:
self.Whispers_Label['text'] = TTLocalizer.OptionsPageWhisperEnabledLabel
self.Whispers_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff
else:
self.Whispers_Label['text'] = TTLocalizer.OptionsPageWhisperDisabledLabel
self.Whispers_toggleButton['text'] = TTLocalizer.OptionsPageToggleOn
def __doDisplaySettings(self):
if self.displaySettings == None:
self.displaySettings = DisplaySettingsDialog.DisplaySettingsDialog()
self.displaySettings.load()
self.accept(self.displaySettings.doneEvent, self.__doneDisplaySettings)
self.displaySettings.enter(self.ChangeDisplaySettings, self.ChangeDisplayAPI)
def __doneDisplaySettings(self, anyChanged, apiChanged):
if anyChanged:
self.__setDisplaySettings()
properties = base.win.getProperties()
self.displaySettingsChanged = 1
self.displaySettingsSize = (properties.getXSize(), properties.getYSize())
self.displaySettingsFullscreen = properties.getFullscreen()
self.displaySettingsApi = base.pipe.getInterfaceName()
self.displaySettingsApiChanged = apiChanged
def __setDisplaySettings(self):
properties = base.win.getProperties()
if properties.getFullscreen():
screensize = '%s x %s' % (properties.getXSize(), properties.getYSize())
else:
screensize = TTLocalizer.OptionsPageDisplayWindowed
api = base.pipe.getInterfaceName()
settings = {'screensize': screensize,
'api': api}
if self.ChangeDisplayAPI:
OptionsPage.notify.debug('change display settings...')
text = TTLocalizer.OptionsPageDisplaySettings % settings
else:
OptionsPage.notify.debug('no change display settings...')
text = TTLocalizer.OptionsPageDisplaySettingsNoApi % settings
self.DisplaySettings_Label['text'] = text
def __doSpeedChatStyleLeft(self):
if self.speedChatStyleIndex > 0:
self.speedChatStyleIndex = self.speedChatStyleIndex - 1
self.updateSpeedChatStyle()
def __doSpeedChatStyleRight(self):
if self.speedChatStyleIndex < len(speedChatStyles) - 1:
self.speedChatStyleIndex = self.speedChatStyleIndex + 1
self.updateSpeedChatStyle()
def updateSpeedChatStyle(self):
nameKey, arrowColor, rolloverColor, frameColor = speedChatStyles[self.speedChatStyleIndex]
newSCColorScheme = SCColorScheme.SCColorScheme(arrowColor=arrowColor, rolloverColor=rolloverColor, frameColor=frameColor)
self.speedChatStyleText.setColorScheme(newSCColorScheme)
self.speedChatStyleText.clearMenu()
colorName = SCStaticTextTerminal.SCStaticTextTerminal(nameKey)
self.speedChatStyleText.append(colorName)
self.speedChatStyleText.finalize()
self.speedChatStyleText.setPos(0.445 - self.speedChatStyleText.getWidth() * self.speed_chat_scale / 2, 0, self.speedChatStyleText.getPos()[2])
if self.speedChatStyleIndex > 0:
self.speedChatStyleLeftArrow['state'] = DGG.NORMAL
else:
self.speedChatStyleLeftArrow['state'] = DGG.DISABLED
if self.speedChatStyleIndex < len(speedChatStyles) - 1:
self.speedChatStyleRightArrow['state'] = DGG.NORMAL
else:
self.speedChatStyleRightArrow['state'] = DGG.DISABLED
base.localAvatar.b_setSpeedChatStyleIndex(self.speedChatStyleIndex)
def writeDisplaySettings(self, task=None):
if not self.displaySettingsChanged:
return
taskMgr.remove(self.DisplaySettingsTaskName)
settings['res'] = (self.displaySettingsSize[0], self.displaySettingsSize[1])
settings['fullscreen'] = self.displaySettingsFullscreen
return Task.done
def __handleExitShowWithConfirm(self):
self.confirm = TTDialog.TTGlobalDialog(doneEvent='confirmDone', message=TTLocalizer.OptionsPageExitConfirm, style=TTDialog.TwoChoice)
self.confirm.show()
self.parent.doneStatus = {'mode': 'exit',
'exitTo': 'closeShard'}
self.accept('confirmDone', self.__handleConfirm)
def __handleConfirm(self):
status = self.confirm.doneStatus
self.ignore('confirmDone')
self.confirm.cleanup()
del self.confirm
if status == 'ok':
base.cr._userLoggingOut = True
messenger.send(self.parent.doneEvent)
class CodesTabPage(DirectFrame):
notify = directNotify.newCategory('CodesTabPage')
def __init__(self, parent = aspect2d):
self.parent = parent
DirectFrame.__init__(self, parent=self.parent, relief=None, pos=(0.0, 0.0, 0.0), scale=(1.0, 1.0, 1.0))
self.load()
return
def destroy(self):
self.parent = None
DirectFrame.destroy(self)
return
def load(self):
self.notice = DirectLabel(parent=self, relief=None, text='NOTICE: All codes can only be entered once!', text_scale=0.06, pos=(0.0, 0, 0.53), text_fg=Vec4(1.0, 0, 0, 1))
cdrGui = loader.loadModel('phase_3.5/models/gui/tt_m_gui_sbk_codeRedemptionGui')
instructionGui = cdrGui.find('**/tt_t_gui_sbk_cdrPresent')
flippyGui = cdrGui.find('**/tt_t_gui_sbk_cdrFlippy')
codeBoxGui = cdrGui.find('**/tt_t_gui_sbk_cdrCodeBox')
self.resultPanelSuccessGui = cdrGui.find('**/tt_t_gui_sbk_cdrResultPanel_success')
self.resultPanelFailureGui = cdrGui.find('**/tt_t_gui_sbk_cdrResultPanel_failure')
self.resultPanelErrorGui = cdrGui.find('**/tt_t_gui_sbk_cdrResultPanel_error')
self.successSfx = base.loadSfx('phase_3.5/audio/sfx/tt_s_gui_sbk_cdrSuccess.ogg')
self.failureSfx = base.loadSfx('phase_3.5/audio/sfx/tt_s_gui_sbk_cdrFailure.ogg')
self.instructionPanel = DirectFrame(parent=self, relief=None, image=instructionGui, image_scale=0.8, text=TTLocalizer.CdrInstructions, text_pos=TTLocalizer.OPCodesInstructionPanelTextPos, text_align=TextNode.ACenter, text_scale=TTLocalizer.OPCodesResultPanelTextScale, text_wordwrap=TTLocalizer.OPCodesInstructionPanelTextWordWrap, pos=(-0.429, 0, -0.05))
self.codeBox = DirectFrame(parent=self, relief=None, image=codeBoxGui, pos=(0.433, 0, 0.35))
self.flippyFrame = DirectFrame(parent=self, relief=None, image=flippyGui, pos=(0.44, 0, -0.353))
self.codeInput = DirectEntry(parent=self.codeBox, relief=DGG.GROOVE, scale=0.08, pos=(-0.33, 0, -0.006), borderWidth=(0.05, 0.05), frameColor=((1, 1, 1, 1), (1, 1, 1, 1), (0.5, 0.5, 0.5, 0.5)), state=DGG.NORMAL, text_align=TextNode.ALeft, text_scale=TTLocalizer.OPCodesInputTextScale, width=10.5, numLines=1, focus=1, backgroundFocus=0, cursorKeys=1, text_fg=(0, 0, 0, 1), suppressMouse=1, autoCapitalize=0, command=self.__submitCode)
submitButtonGui = loader.loadModel('phase_3/models/gui/quit_button')
self.submitButton = DirectButton(parent=self, relief=None, image=(submitButtonGui.find('**/QuitBtn_UP'),
submitButtonGui.find('**/QuitBtn_DN'),
submitButtonGui.find('**/QuitBtn_RLVR'),
submitButtonGui.find('**/QuitBtn_UP')), image3_color=Vec4(0.5, 0.5, 0.5, 0.5), image_scale=1.15, state=DGG.NORMAL, text=TTLocalizer.NameShopSubmitButton, text_scale=TTLocalizer.OPCodesSubmitTextScale, text_align=TextNode.ACenter, text_pos=TTLocalizer.OPCodesSubmitTextPos, text3_fg=(0.5, 0.5, 0.5, 0.75), textMayChange=0, pos=(0.45, 0.0, 0.0896), command=self.__submitCode)
self.resultPanel = DirectFrame(parent=self, relief=None, image=self.resultPanelSuccessGui, text='', text_pos=TTLocalizer.OPCodesResultPanelTextPos, text_align=TextNode.ACenter, text_scale=TTLocalizer.OPCodesResultPanelTextScale, text_wordwrap=TTLocalizer.OPCodesResultPanelTextWordWrap, pos=(-0.42, 0, -0.0567))
self.resultPanel.hide()
closeButtonGui = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
self.closeButton = DirectButton(parent=self.resultPanel, pos=(0.296, 0, -0.466), relief=None, state=DGG.NORMAL, image=(closeButtonGui.find('**/CloseBtn_UP'), closeButtonGui.find('**/CloseBtn_DN'), closeButtonGui.find('**/CloseBtn_Rllvr')), image_scale=(1, 1, 1), command=self.__hideResultPanel)
closeButtonGui.removeNode()
cdrGui.removeNode()
submitButtonGui.removeNode()
return
def enter(self):
self.show()
localAvatar.chatMgr.fsm.request('otherDialog')
self.codeInput['focus'] = 1
self.codeInput.enterText('')
self.__enableCodeEntry()
def exit(self):
self.resultPanel.hide()
self.hide()
localAvatar.chatMgr.fsm.request('mainMenu')
def unload(self):
self.instructionPanel.destroy()
self.instructionPanel = None
self.codeBox.destroy()
self.codeBox = None
self.flippyFrame.destroy()
self.flippyFrame = None
self.codeInput.destroy()
self.codeInput = None
self.submitButton.destroy()
self.submitButton = None
self.resultPanel.destroy()
self.resultPanel = None
self.closeButton.destroy()
self.closeButton = None
del self.successSfx
del self.failureSfx
return
def __submitCode(self, input = None):
if input == None:
input = self.codeInput.get()
self.codeInput['focus'] = 1
if input == '':
return
messenger.send('wakeup')
if hasattr(base.cr, 'codeRedemptionMgr'):
base.cr.codeRedemptionMgr.redeemCode(input, self.__getCodeResult)
self.codeInput.enterText('')
self.__disableCodeEntry()
return
def __getCodeResult(self, result):
self.notify.debug('result = %s' % result)
self.__enableCodeEntry()
if result == 0:
self.resultPanel['image'] = self.resultPanelSuccessGui
self.resultPanel['text'] = TTLocalizer.CdrResultSuccess
elif result == 1:
self.resultPanel['image'] = self.resultPanelFailureGui
self.resultPanel['text'] = TTLocalizer.CdrResultInvalidCode
elif result == 2:
self.resultPanel['image'] = self.resultPanelFailureGui
self.resultPanel['text'] = TTLocalizer.CdrResultExpiredCode
elif result == 3:
self.resultPanel['image'] = self.resultPanelErrorGui
elif result == 4:
self.resultPanel['image'] = self.resultPanelErrorGui
self.resultPanel['text'] = TTLocalizer.CdrResultAlreadyRedeemed
elif result == 5:
self.resultPanel['image'] = self.resultPanelErrorGui
self.resultPanel['text'] = TTLocalizer.CdrResultNotReady
elif result == 6:
self.resultPanel['image'] = self.resultPanelErrorGui
self.resultPanel['text'] = TTLocalizer.CdrResultNotEligible
if result == 0:
self.successSfx.play()
else:
self.failureSfx.play()
self.resultPanel.show()
def __hideResultPanel(self):
self.resultPanel.hide()
def __disableCodeEntry(self):
self.codeInput['state'] = DGG.DISABLED
self.submitButton['state'] = DGG.DISABLED
def __enableCodeEntry(self):
self.codeInput['state'] = DGG.NORMAL
self.codeInput['focus'] = 1
self.submitButton['state'] = DGG.NORMAL
class ExtraOptionsTabPage(DirectFrame):
notify = directNotify.newCategory('ExtraOptionsTabPage')
def __init__(self, parent = aspect2d):
self.parent = parent
self.currentSizeIndex = None
DirectFrame.__init__(self, parent=self.parent, relief=None, pos=(0.0, 0.0, 0.0), scale=(1.0, 1.0, 1.0))
self.load()
def destroy(self):
self.parent = None
DirectFrame.destroy(self)
def load(self):
guiButton = loader.loadModel('phase_3/models/gui/quit_button')
titleHeight = 0.61
textStartHeight = 0.45
textRowHeight = 0.145
leftMargin = -0.72
buttonbase_xcoord = 0.35
buttonbase_ycoord = 0.45
button_image_scale = (0.7, 1, 1)
button_textpos = (0, -0.02)
options_text_scale = 0.052
disabled_arrow_color = Vec4(0.6, 0.6, 0.6, 1.0)
button_image = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR'))
self.speed_chat_scale = 0.055
self.speedchatPlus_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight))
self.trueFriends_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - textRowHeight))
self.cogInterface_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 2 * textRowHeight))
self.speedchatPlus_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord), command=self.__doToggleSpeedchatPlus)
self.trueFriends_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - textRowHeight), command=self.__doToggleTrueFriends)
self.cogInterface_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - 2 * textRowHeight), command=self.__doToggleCogInterface)
self.bugReportButton = DirectButton(parent=self, relief=None, text=TTLocalizer.BugReportButton, image=button_image, image_scale=button_image_scale, text_pos=(0, -0.01), text_fg=(0, 0, 0, 1),
command=self.showReportNotice, pos=(0.0, 0.0, -0.6), text_scale=(0.045))
guiButton.removeNode()
def enter(self):
self.show()
self.settingsChanged = 0
self.__setSpeedchatPlusButton()
self.__setTrueFriendsButton()
self.__setCogInterfaceButton()
def exit(self):
self.ignore('confirmDone')
self.destroyReportNotice()
self.hide()
def unload(self):
self.speedchatPlus_label.destroy()
del self.speedchatPlus_label
self.trueFriends_label.destroy()
del self.trueFriends_label
self.cogInterface_label.destroy()
del self.cogInterface_label
self.cogInterface_toggleButton.destroy()
del self.cogInterface_toggleButton
def __doToggleCogInterface(self):
messenger.send('wakeup')
settings['cogInterface'] = not settings['cogInterface']
self.settingsChanged = 1
self.__setCogInterfaceButton()
def __setCogInterfaceButton(self):
self.cogInterface_label['text'] = TTLocalizer.CogInterfaceLabelOn if settings['cogInterface'] else TTLocalizer.CogInterfaceLabelOff
self.cogInterface_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff if settings['cogInterface'] else TTLocalizer.OptionsPageToggleOn
def __doToggleSpeedchatPlus(self):
messenger.send('wakeup')
settings['speedchatPlus'] = not settings['speedchatPlus']
Avatar.reconsiderAllUnderstandable()
self.settingsChanged = 1
self.__setSpeedchatPlusButton()
def __setSpeedchatPlusButton(self):
self.speedchatPlus_label['text'] = TTLocalizer.SpeedchatPlusLabelOn if settings['speedchatPlus'] else TTLocalizer.SpeedchatPlusLabelOff
self.speedchatPlus_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff if settings['speedchatPlus'] else TTLocalizer.OptionsPageToggleOn
def __doToggleTrueFriends(self):
messenger.send('wakeup')
settings['trueFriends'] = not settings['trueFriends']
Avatar.reconsiderAllUnderstandable()
self.settingsChanged = 1
self.__setTrueFriendsButton()
def __setTrueFriendsButton(self):
self.trueFriends_label['text'] = TTLocalizer.TrueFriendsLabelOn if settings['trueFriends'] else TTLocalizer.TrueFriendsLabelOff
self.trueFriends_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff if settings['trueFriends'] else TTLocalizer.OptionsPageToggleOn
def destroyReportNotice(self):
if hasattr(self, 'dialog'):
self.dialog.destroy()
del self.dialog
def showReportNotice(self):
self.destroyReportNotice()
self.dialog = TTDialog.TTDialog(style=TTDialog.YesNo, text=TTLocalizer.BugReportNotice, command=self.confirmBugReport)
self.dialog.show()
def confirmBugReport(self, value):
self.destroyReportNotice()
if value > 0:
webbrowser.open(ToontownGlobals.BugReportSite, new=2, autoraise=True)