chooseNameSection.py (8753B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\login\charcreation_new\steps\sections\chooseNameSection.py 2 import uthread2 3 import utillib 4 from carbonui import const as uiconst 5 from carbonui.control.button import Button 6 from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText 7 from carbonui.primitives.container import Container 8 from carbonui.uicore import uicore 9 from carbonui.util.color import Color 10 from eve.client.script.ui.control.eveIcon import Icon 11 from eve.client.script.ui.control.eveLabel import EveLabelMedium, EveCaptionLarge 12 from eve.client.script.ui.control.infoIcon import MoreInfoIcon 13 from eve.client.script.ui.login.charcreation_new import charCreationSignals 14 from eve.client.script.ui.login.charcreation_new.baseSidePanel import BaseSidePanel 15 from eve.common.lib import appConst 16 from localization import GetByLabel 17 from localization.util import AmOnChineseServer 18 RANDOMIZE_NAME_BUTTON_ANALYTIC_ID = 'RandomizeNameButton' 19 padding = 16 20 VALID = 1 21 invalidNameReasonNamesByID = {-1: 'UI/CharacterCreation/InvalidName/TooShort', 22 -2: 'UI/CharacterCreation/InvalidName/TooLong', 23 -5: 'UI/CharacterCreation/InvalidName/IllegalCharacter', 24 -6: 'UI/CharacterCreation/InvalidName/TooManySpaces', 25 -7: 'UI/CharacterCreation/InvalidName/ConsecutiveSpaces', 26 -101: 'UI/CharacterCreation/InvalidName/Unavailable', 27 -102: 'UI/CharacterCreation/InvalidName/Unavailable'} 28 29 class ChooseNameSection(BaseSidePanel): 30 default_alignMode = uiconst.TOTOP 31 default_mainContPadding = 20 32 33 def ApplyAttributes(self, attributes): 34 super(ChooseNameSection, self).ApplyAttributes(attributes) 35 self.isCheckingName = False 36 self.namesChecked = {} 37 self.checkNameValidThread = None 38 if not uicore.layer.charactercreation.controller.CanChangeName(): 39 return 40 self._ConstructNameSelectionLabel() 41 self._ConstructNameEdit() 42 self._ConstructBottomCont() 43 if self.GetCharacterNameEntered(): 44 self.CheckAvailability() 45 46 def GetInfo(self): 47 return uicore.layer.charactercreation.controller.GetInfo() 48 49 def _ConstructNameSelectionLabel(self): 50 EveCaptionLarge(name='nameSelectionLabel', parent=self.mainCont, text=GetByLabel('UI/CharacterCreation/NameSelection'), align=uiconst.TOTOP, state=uiconst.UI_DISABLED, padTop=10) 51 52 def _ConstructNameEdit(self): 53 editContainer = Container(name='editContainer', parent=self.mainCont, align=uiconst.TOTOP, height=30, padTop=8) 54 self.checkAvailabilityIcon = Icon(name='checkAvailabilityIcon', parent=Container(parent=editContainer, align=uiconst.TORIGHT, width=16), align=uiconst.CENTER, pos=(0, 0, 20, 20), state=uiconst.UI_HIDDEN) 55 self.nameEdit = SingleLineEditText(name='nameEdit', setvalue=self.GetInfo().charName or '', parent=editContainer, maxLength=appConst.maximumCharacterNameLength, align=uiconst.TOALL, OnChange=self.OnTextEditChange, OnSetFocus=self.OnFirstNameFocus, color=(1.0, 1.0, 1.0, 1.0), hintText=GetByLabel('UI/CharacterCreation/FullName'), fontsize=16, width=5, height=0) 56 self.nameEdit.OnReturn = self.CheckAvailability 57 self.nameEdit.OnAnyChar = self.OnCharInName 58 59 def _ConstructBottomCont(self): 60 bottomCont = Container(name='bottomCont', parent=self.mainCont, align=uiconst.TOTOP, height=16, state=uiconst.UI_PICKCHILDREN, padTop=4, padRight=20) 61 MoreInfoIcon(name='moreInfoIcon', parent=bottomCont, align=uiconst.TOLEFT, hint=GetByLabel('UI/CharacterCreation/NameConstraintsHint')) 62 self.checkAvailabilityLabel = EveLabelMedium(name='checkAvailabilityLabel', parent=bottomCont, align=uiconst.TOLEFT, width=300, padLeft=6, state=uiconst.UI_DISABLED, color=Color.RED, opacity=0.75) 63 self.charCounterLabel = EveLabelMedium(name='charCounterLabel', parent=bottomCont, align=uiconst.CENTERRIGHT, opacity=0.75, text=self.CountRemainingCharacters()) 64 if not AmOnChineseServer(): 65 buttonCont = Container(parent=self.mainCont, align=uiconst.TOTOP, height=25, padTop=12) 66 Button(name='randomizeNameButton', parent=buttonCont, label=GetByLabel('UI/CharacterCreation/Randomize'), align=uiconst.TOPLEFT, func=self.RandomizeName, analyticID=RANDOMIZE_NAME_BUTTON_ANALYTIC_ID) 67 68 def RandomizeName(self, *args): 69 name = sm.RemoteSvc('charUnboundMgr').GetValidRandomName(self.GetInfo().raceID) 70 self.CacheNameValid(name, True) 71 self.nameEdit.SetValue(name, docallback=False) 72 self.UpdateIsValidIconAndText(VALID) 73 uicore.layer.charactercreation.controller.metrics.last_name_randomized() 74 self.charCounterLabel.SetText(self.CountRemainingCharacters()) 75 76 def OnTextEditChange(self, *args): 77 self.checkAvailabilityLabel.state = uiconst.UI_HIDDEN 78 self.checkAvailabilityIcon.state = uiconst.UI_HIDDEN 79 if self.checkNameValidThread: 80 self.checkNameValidThread.kill() 81 self.checkNameValidThread = uthread2.start_tasklet(self._CheckNameValidThread) 82 self.charCounterLabel.SetText(self.CountRemainingCharacters()) 83 84 def CountRemainingCharacters(self): 85 nameLength = len(self.nameEdit.GetText()) 86 remainingAllowedCharacters = appConst.maximumCharacterNameLength - nameLength 87 if remainingAllowedCharacters < 0: 88 return 0 89 return remainingAllowedCharacters 90 91 def _CheckNameValidThread(self): 92 uthread2.Sleep(1.0) 93 self.CheckAvailability() 94 95 def OnFirstNameFocus(self, *args): 96 uicore.layer.charactercreation.controller.metrics.first_name_focused() 97 98 def OnLastNameFocus(self, *args): 99 uicore.layer.charactercreation.controller.metrics.last_name_focused() 100 101 def OnCharInName(self, char, *args): 102 if char == uiconst.VK_SPACE: 103 allowedNumSpaces = 2 104 numSpaces = self.nameEdit.text.count(' ') 105 if numSpaces >= allowedNumSpaces: 106 return False 107 return True 108 109 def OnCharInLastName(self, char, *args): 110 if char == uiconst.VK_SPACE: 111 return False 112 return True 113 114 def CheckAvailability(self, *args): 115 if self.isCheckingName: 116 return 117 self.isCheckingName = True 118 try: 119 charName = self.GetCharacterNameEntered() 120 self.NotifyCCLayerOfAvailabilityCheck(charName) 121 isValidCode = self.IsNameValid(charName) 122 self.UpdateIsValidIconAndText(isValidCode) 123 isAvailable = utillib.KeyVal() 124 uicore.layer.charactercreation.controller.metrics.name_available_checked(isValidCode) 125 if isValidCode == VALID: 126 isAvailable.charName = charName 127 isAvailable.reason = '' 128 return isAvailable 129 isAvailable.charName = None 130 isAvailable.reason = self.GetIsValidText(isValidCode) 131 return isAvailable 132 finally: 133 self.isCheckingName = False 134 self.checkNameValidThread = None 135 136 def GetIsValidText(self, isValidCode): 137 if isValidCode == VALID: 138 return '' 139 reason = invalidNameReasonNamesByID.get(isValidCode, 'UI/CharacterCreation/InvalidName/IllegalCharacter') 140 return GetByLabel(reason) 141 142 def UpdateIsValidIconAndText(self, isValidCode): 143 self.checkAvailabilityIcon.state = uiconst.UI_DISABLED 144 self.checkAvailabilityLabel.state = uiconst.UI_DISABLED 145 if isValidCode == VALID: 146 texturePath = 'res:/UI/Texture/Icons/38_16_193.png' 147 self.checkAvailabilityIcon.SetRGBA(*Icon.default_color) 148 else: 149 texturePath = 'res:/UI/Texture/classes/Moonmining/warning.png' 150 self.checkAvailabilityIcon.SetRGBA(*Color.RED) 151 self.checkAvailabilityIcon.SetTexturePath(texturePath) 152 self.checkAvailabilityLabel.text = self.GetIsValidText(isValidCode) 153 charCreationSignals.onNameInputChanged(isValidCode == VALID) 154 155 def GetCharacterNameEntered(self): 156 charName = self.nameEdit.GetValue().strip() 157 self.nameEdit.CloseHistoryMenu() 158 uicore.layer.charactercreation.controller.SetNameCallback(charName) 159 return charName 160 161 def IsNameValid(self, charName): 162 if charName in self.namesChecked: 163 isValid = self.namesChecked[charName] 164 else: 165 isValid = sm.RemoteSvc('charUnboundMgr').ValidateNameEx(charName, len(self.namesChecked)) 166 self.CacheNameValid(charName, isValid) 167 return isValid 168 169 def CacheNameValid(self, charName, isValid): 170 self.namesChecked[charName] = isValid 171 172 def NotifyCCLayerOfAvailabilityCheck(self, name): 173 uicore.layer.charactercreation.controller.OnAvailabilityCheck(name)