NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)