giftInputPanel.py (7696B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\view\aurumstore\purchasepanels\giftInputPanel.py 2 import carbonui.const as uiconst 3 import localization 4 from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText 5 from carbonui.primitives.container import Container 6 from carbonui.primitives.sprite import Sprite 7 from carbonui.uianimations import animations 8 from carbonui.uicore import uicore 9 from carbonui.util.color import Color 10 from eve.client.script.ui.control import eveLabel 11 from carbonui.control.buttonIcon import ButtonIcon 12 from eve.client.script.ui.control.eveEditPlainText import EditPlainText 13 from eve.client.script.ui.control.eveLabel import Label 14 from eve.client.script.ui.control.searchinput import SearchInput 15 from eve.client.script.ui.shared.userentry import User 16 from eve.client.script.ui.util import searchUtil 17 from eve.client.script.ui.view.aurumstore.purchasepanels.basePurchasePanel import BasePurchasePanel 18 from eve.client.script.ui.view.aurumstore.errorTooltip import ErrorTooltip 19 from utillib import KeyVal 20 DEFAULT_PADDING = 10 21 MAX_SUBJECT_LENGTH = 78 22 MAX_MESSAGE_LENGTH = 140 23 MAX_NAME_LENGTH = 64 24 25 class GiftingInputPanel(BasePurchasePanel): 26 __notifyevents__ = ['OnEndChangeDevice'] 27 default_name = 'giftingInputPanel' 28 29 def ApplyAttributes(self, attributes): 30 super(GiftingInputPanel, self).ApplyAttributes(attributes) 31 self.selectedCharacterID = None 32 self.offer = attributes.offer 33 self.photoSvc = sm.GetService('photo') 34 self.construct_layout() 35 sm.RegisterNotify(self) 36 37 def construct_layout(self): 38 self.mainContainer = Container(parent=self, padding=(DEFAULT_PADDING,) * 4) 39 self.construct_search_input() 40 self.construct_message_input() 41 42 def construct_message_input(self): 43 self.messageMainContainer = Container(name='MessageMainContainer', parent=self.mainContainer, align=uiconst.TOALL, bgColor=Color.GRAY1, top=5) 44 subject_container = Container(name='SubjectContainer', parent=self.messageMainContainer, align=uiconst.TOTOP, height=32) 45 Sprite(parent=subject_container, align=uiconst.TOLEFT, texturePath='res:/UI/Texture/WindowIcons/evemail.png', width=32, height=32, opacity=0.7) 46 self.subjectEdit = SingleLineEditText(name='SubjectTextEdit', parent=subject_container, align=uiconst.TOALL, maxLength=MAX_SUBJECT_LENGTH, hintText=localization.GetByLabel('UI/VirtualGoodsStore/GiftingSubjectPlaceholder'), isCharacterField=True, bgColor=Color.GRAY1, width=0, top=0) 47 message_container = Container(name='MessageContainer', parent=self.messageMainContainer, bgColor=Color.GRAY1) 48 self.characterCounter = Label(text='0/%s' % MAX_MESSAGE_LENGTH, parent=message_container, color=(1.0, 1.0, 1.0, 0.6), fontsize=12, left=5, top=2, align=uiconst.BOTTOMRIGHT, state=uiconst.UI_DISABLED, opacity=0.7) 49 self.messageEdit = EditPlainText(name='messageTextEdit', parent=message_container, hintText=localization.GetByLabel('UI/VirtualGoodsStore/GiftingMessagePlaceholder'), counterMax=MAX_MESSAGE_LENGTH, maxLength=MAX_MESSAGE_LENGTH, customCounter=self.characterCounter) 50 51 def construct_search_input(self): 52 self.searchContainer = Container(name='SearchBarContainer', parent=self.mainContainer, align=uiconst.TOTOP, alignMode=uiconst.TOTOP, state=uiconst.UI_PICKCHILDREN, height=32, bgColor=Color.GRAY1) 53 search_icon_container = Container(parent=self.searchContainer, align=uiconst.TOLEFT, left=5, width=24) 54 Sprite(name='SearchIcon', parent=search_icon_container, align=uiconst.CENTER, width=24, height=24, texturePath='res:/UI/Texture/Icons/searchMagnifyingGlass.png', opacity=0.5) 55 self.searchInput = SearchInput(parent=self.searchContainer, align=uiconst.TOALL, GetSearchEntries=self.search, maxLength=MAX_NAME_LENGTH, OnSearchEntrySelected=self.on_search_entry_selected, hintText=localization.GetByLabel('UI/ActivatePlex/SearchHint'), width=0, top=0, padLeft=5, allowBrowsing=True) 56 self.searchInput.SetHistoryVisibility(False) 57 self.searchInput.underlay.Close() 58 self.errorTooltip = ErrorTooltip(errorMessage=localization.GetByLabel('UI/VirtualGoodsStore/Purchase/NoRecipientErrorBody')) 59 self.entryContainer = Container(name='EntryContainer', parent=self.searchContainer, align=uiconst.TOTOP, state=uiconst.UI_DISABLED, height=32, bgColor=Color.GRAY1, padLeft=5, display=False) 60 self.entryContainerIcon = Sprite(parent=self.entryContainer, align=uiconst.CENTERLEFT, pos=(0, 0, 32, 32)) 61 clip_container = Container(parent=self.entryContainer, clipChildren=True, padding=(40, 0, 36, 0)) 62 self.entryContainerTitle = eveLabel.EveLabelMediumBold(parent=clip_container, align=uiconst.CENTERLEFT, text='', width=150) 63 self.entryContainerButton = ButtonIcon(parent=self.entryContainer, texturePath='res:/UI/Texture/Icons/73_16_210.png', align=uiconst.CENTERRIGHT, func=self.reset_search, width=16, height=16, iconSize=16, left=5, state=uiconst.UI_HIDDEN) 64 65 def search(self, search_string): 66 self.fade_out_error_tooltip() 67 if len(search_string) < 3: 68 return [] 69 else: 70 return searchUtil.SearchCharacters(search_string) 71 72 def on_search_entry_selected(self, result): 73 if isinstance(result, User): 74 result = result.sr.node 75 else: 76 result = result[0] 77 self.selectedCharacterID = result.charID 78 self.entryContainerIcon.texturePath = self.photoSvc.GetPortrait(self.selectedCharacterID, size=64) 79 self.entryContainerTitle.text = result.label 80 self.entryContainerButton.SetState(uiconst.UI_NORMAL) 81 self.searchInput.SetValue('') 82 self.searchInput.display = False 83 self.entryContainer.display = True 84 self.entryContainer.SetState(uiconst.UI_NORMAL) 85 86 def reset_search(self, *args, **kwargs): 87 self.selectedCharacterID = None 88 self.searchInput.display = True 89 self.entryContainer.display = False 90 uicore.registry.SetFocus(self.searchInput) 91 92 def OnPanelActivated(self): 93 self.SetState(uiconst.UI_NORMAL) 94 animations.FadeIn(self) 95 uicore.registry.SetFocus(self.searchInput) 96 97 def get_gifting_information(self): 98 if not self.selectedCharacterID: 99 if not self.errorTooltip.tooltipPanel: 100 self.errorTooltip.CreateTooltip(parent=uicore.layer.menu, owner=self.searchInput, idx=0) 101 self.errorTooltip.tooltipPanel.SetOpacity(1) 102 return 103 return KeyVal(toCharacterID=self.selectedCharacterID, message=self.get_message()) 104 105 def get_message(self): 106 subject = self.subjectEdit.GetValue() 107 message = self.messageEdit.GetValue(html=0) 108 if subject or message: 109 if not subject: 110 return message 111 elif not message: 112 return subject 113 else: 114 return '%s\n%s' % (subject, message) 115 else: 116 return '' 117 118 def fade_out_error_tooltip(self): 119 if self.errorTooltip.tooltipPanel: 120 animations.FadeOut(self.errorTooltip.tooltipPanel, duration=0.5, callback=self.errorTooltip.Close) 121 122 def OnEndChangeDevice(self, *args): 123 if self.errorTooltip.tooltipPanel: 124 self.errorTooltip.Close() 125 self.create_error_tooltip() 126 127 def create_error_tooltip(self): 128 self.errorTooltip.CreateTooltip(parent=uicore.layer.menu, owner=self.searchInput, idx=0) 129 self.errorTooltip.tooltipPanel.SetOpacity(1) 130 131 def Close(self): 132 self.errorTooltip.Close() 133 super(GiftingInputPanel, self).Close()