ownerSearch.py (11302B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\neocom\ownerSearch.py 2 import copy 3 import types 4 import localization 5 import utillib 6 from carbonui import uiconst 7 from carbonui.control.combo import Combo 8 from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText 9 from carbonui.primitives.container import Container 10 from carbonui.util.various_unsorted import SortListOfTuples 11 from eve.client.script.ui.control import eveLabel, eveScroll 12 from carbonui.button.group import ButtonGroup 13 from carbonui.control.button import Button 14 from eve.client.script.ui.control.entries.user import SearchedUser 15 from carbonui.control.window import Window 16 from carbonui.control.tabGroup import TabGroup 17 from eve.client.script.ui.util import searchOld, searchUtil 18 from eve.common.script.search.const import MatchBy 19 from eve.common.script.sys import idCheckers 20 from eve.common.lib import appConst as const 21 22 class OwnerSearchWindow(Window): 23 __guid__ = 'form.OwnerSearchWindow' 24 __notifyevents__ = ['OnContactChange', 25 'OnContactNoLongerContact', 26 'OnSearcedUserRemoved', 27 'OnSearcedUserAdded'] 28 default_windowID = 'ownerSearchWindow' 29 default_minSize = (250, 250) 30 default_width = 300 31 default_height = 400 32 default_isMinimizable = False 33 34 def ApplyAttributes(self, attributes): 35 Window.ApplyAttributes(self, attributes) 36 actionBtns = attributes.actionBtns or [] 37 caption = attributes.caption or '' 38 inpt = attributes.input or '' 39 showContactList = attributes.get('showContactList', False) 40 extraIconHintFlag = attributes.extraIconHintFlag or None 41 configname = attributes.configname or '' 42 multiSelect = attributes.get('multiSelect', True) 43 ownerGroups = attributes.get('ownerGroups', [const.groupCharacter]) 44 self.contactsLoaded = 0 45 self.SetCaption(caption) 46 self.showContactList = showContactList 47 self.extraIconHintFlag = extraIconHintFlag 48 self.configname = configname 49 self.ownerGroups = ownerGroups 50 self.sr.hintCont = Container(name='hintCont', parent=self.sr.main, align=uiconst.TOTOP, pos=(0, 0, 0, 16), state=uiconst.UI_HIDDEN) 51 searchParent = self.sr.main 52 if showContactList: 53 self.sr.searchCont = Container(name='searchCont', parent=self.sr.main, align=uiconst.TOALL) 54 self.sr.scroll = eveScroll.Scroll(name='searchScroll', parent=self.sr.searchCont, multiSelect=multiSelect) 55 self.sr.scroll.OnSelectionChange = self.RefreshSelection 56 self.sr.contactsScroll = eveScroll.Scroll(name='contactsScroll', parent=self.sr.main, multiSelect=multiSelect) 57 self.sr.contactsScroll.OnSelectionChange = self.RefreshSelection 58 self.sr.tabs = TabGroup(name='tabs', parent=self.sr.main, tabs=[[localization.GetByLabel('UI/Mail/Search'), 59 self.sr.searchCont, 60 self, 61 'search'], [localization.GetByLabel('UI/Mail/AllContacts'), 62 self.sr.contactsScroll, 63 self, 64 'contacts']], groupID='calenderEvent_tabs', autoselecttab=1, idx=0) 65 searchParent = self.sr.searchCont 66 else: 67 self.sr.scroll = eveScroll.Scroll(parent=self.sr.main, multiSelect=multiSelect) 68 self.sr.scroll.OnSelectionChange = self.RefreshSelection 69 self.currentScroll = self.sr.scroll 70 searchCont = Container(name='searchCont', parent=searchParent, align=uiconst.TOTOP, idx=0, height=40) 71 searchByCont = Container(name='searchByCont', parent=searchParent, align=uiconst.TOTOP, idx=0, height=40) 72 searchBtnCont = Container(name='searchBtnCont', parent=searchCont, align=uiconst.TORIGHT, height=40) 73 inputCont = Container(name='inputCont', parent=searchCont, align=uiconst.TOALL) 74 self.sr.searchBy = Combo(label=localization.GetByLabel('UI/Common/SearchBy'), parent=searchByCont, options=searchUtil.GetSearchByChoices(), name='ownerSearchSearchBy', select=settings.user.ui.Get('ownersSearchBy', MatchBy.partial_terms), width=170, labelleft=65, callback=self.ChangeSearchBy) 75 self.sr.inpt = inpt = SingleLineEditText(name='input', parent=inputCont, maxLength=50, label='', setvalue=inpt, align=uiconst.TOTOP, isCharacterField=True) 76 self.sr.searchBtn = Button(parent=searchBtnCont, label=localization.GetByLabel('UI/Mail/Search'), func=self.Search, btn_default=1, padLeft=8) 77 searchBtnCont.width = self.sr.searchBtn.width 78 btns = [] 79 self.dblClickFunc = None 80 for each in actionBtns: 81 text, func, dblClickFunc = each 82 btns.append([text, 83 func, 84 lambda : self.GetSelectedInCurrentScroll(), 85 None]) 86 if dblClickFunc: 87 self.dblClickFunc = func 88 89 self.sr.btns = ButtonGroup(btns=btns, parent=self.sr.main, idx=0) 90 self.sr.btns.state = uiconst.UI_HIDDEN 91 self.sr.scroll.Load(contentList=[], headers=[], noContentHint=localization.GetByLabel('UI/Common/TypeInSearch')) 92 93 def ChangeSearchBy(self, entry, header, value, *args): 94 settings.user.ui.Set('ownersSearchBy', value) 95 96 def GetSelectedInCurrentScroll(self, *args): 97 return self.currentScroll.GetSelected() 98 99 def Load(self, key, *args): 100 if not self or self.destroyed: 101 return 102 if key == 'contacts': 103 if not self.contactsLoaded: 104 self.LoadContacts() 105 self.contactsLoaded = 1 106 self.currentScroll = self.sr.contactsScroll 107 elif key == 'search': 108 self.currentScroll = self.sr.scroll 109 self.RefreshSelection() 110 111 def RefreshSelection(self, *args): 112 sel = self.currentScroll.GetSelected() 113 if len(sel) < 1: 114 self.sr.btns.state = uiconst.UI_HIDDEN 115 return 116 self.sr.btns.state = uiconst.UI_PICKCHILDREN 117 118 def DblClickEntry(self, entry, ignoreConfirm = False, *args): 119 if ignoreConfirm or entry.confirmOnDblClick: 120 self.currentScroll.SelectNode(entry.sr.node) 121 if self.dblClickFunc is not None: 122 self.dblClickFunc(self.currentScroll.GetSelected) 123 124 def ClickEntry(self, *args): 125 self.RefreshSelection() 126 127 def ExtraMenuFunction(self, *args): 128 return [] 129 130 def Search(self, *args): 131 inpt = self.sr.inpt.GetValue() 132 if inpt.strip() == '': 133 self.sr.scroll.Load(contentList=[], headers=[], noContentHint=localization.GetByLabel('UI/Common/TypeInSearch')) 134 return 135 hint = '' 136 searchBy = settings.user.ui.Get('ownersSearchBy', MatchBy.partial_terms) 137 lst = [] 138 for groupID in self.ownerGroups: 139 lst += searchOld.Search(inpt, groupID, getWindow=0, hideNPC=1, notifyOneMatch=1, modal=0, getError=1, exact=searchBy) 140 141 if len(lst) >= 500: 142 hint = localization.GetByLabel('UI/Mail/25OrMoreFound', name=inpt) 143 try: 144 scrolllist = self.GetUserEntries(lst) 145 extraEntries = self.GetExtraSearchEntries(inpt, searchBy) 146 scrolllist = extraEntries + scrolllist 147 noContentHint = localization.GetByLabel('UI/Market/NothingFoundWithSearch', search=inpt) 148 self.sr.scroll.Load(contentList=scrolllist, headers=[], noContentHint=noContentHint) 149 self.SetHint(hint) 150 self.RefreshSelection() 151 except: 152 if not self or self.destroyed: 153 return 154 raise 155 156 def GetExtraSearchEntries(self, searchString, searchBy): 157 return [] 158 159 def GetUserEntries(self, lst): 160 scrolllist = [] 161 for info in lst: 162 if type(info) in [types.StringType, types.UnicodeType]: 163 continue 164 entryTuple = self.GetUserEntryTuple(info[1]) 165 scrolllist.append(entryTuple) 166 167 scrolllist = SortListOfTuples(scrolllist) 168 return scrolllist 169 170 def SetHint(self, hint): 171 hp = self.sr.hintCont 172 hp.Flush() 173 if hint: 174 t = eveLabel.EveLabelMedium(text=hint, parent=hp, top=-3, align=uiconst.CENTER, width=self.minsize[0] - 32, state=uiconst.UI_DISABLED) 175 hp.state = uiconst.UI_DISABLED 176 hp.height = t.height + 4 177 else: 178 hp.state = uiconst.UI_HIDDEN 179 180 def LoadContacts(self, *args): 181 allContacts = sm.GetService('addressbook').GetContacts() 182 contacts = allContacts.contacts.values() 183 scrolllist = [] 184 for contact in contacts: 185 if idCheckers.IsNPC(contact.contactID): 186 continue 187 if cfg.eveowners.Get(contact.contactID).groupID not in self.ownerGroups: 188 continue 189 entryTuple = self.GetUserEntryTuple(contact.contactID, contact) 190 scrolllist.append(entryTuple) 191 192 scrolllist = SortListOfTuples(scrolllist) 193 self.sr.contactsScroll.Load(contentList=scrolllist, headers=[], noContentHint=localization.GetByLabel('UI/AddressBook/NoContacts')) 194 195 def GetUserEntryTuple(self, ownerID, contact = None, *args): 196 if contact is None: 197 contact = utillib.KeyVal(contactID=ownerID) 198 extraIconHintFlag = copy.copy(self.extraIconHintFlag) 199 if extraIconHintFlag and self.IsAdded(ownerID): 200 extraIconHintFlag[-1] = True 201 extraInfo = utillib.KeyVal(extraIconHintFlag=extraIconHintFlag, wndConfigname=self.configname) 202 entryTuple = sm.GetService('addressbook').GetContactEntry(None, contact, dblClick=self.DblClickContact, menuFunction=self.ExtraMenuFunction, extraInfo=extraInfo, listentryType=SearchedUser) 203 return entryTuple 204 205 def IsAdded(self, contactID, *args): 206 return False 207 208 def DblClickContact(self, entry, *args): 209 self.DblClickEntry(entry, ignoreConfirm=True) 210 211 def OnContactChange(self, contactIDs, contactType): 212 if contactType == 'contact': 213 self.ReloadContactList() 214 215 def OnContactNoLongerContact(self, ownerID): 216 self.ReloadContactList() 217 218 def ReloadContactList(self, *args): 219 if self.showContactList and self.contactsLoaded: 220 self.LoadContacts() 221 222 def OnSearcedUserAdded(self, ownerID, configname, *args): 223 self.MarkEntriesAddedOrRemoved(configname, [ownerID], isAdded=1) 224 225 def OnSearcedUserRemoved(self, ownerIDs, configname, *args): 226 self.MarkEntriesAddedOrRemoved(configname, ownerIDs, isAdded=0) 227 228 def MarkEntriesAddedOrRemoved(self, configname, ownerIDs, isAdded = 0, *args): 229 if self.configname != configname: 230 return 231 if len(ownerIDs) < 1: 232 return 233 scrolls = [] 234 for scrollName in ['scroll', 'contactsScroll']: 235 scroll = self.sr.Get(scrollName, None) 236 if scroll is not None: 237 scrolls.append(scroll) 238 239 for scroll in scrolls: 240 ids = ownerIDs[:] 241 for entry in scroll.GetNodes(): 242 if entry.charID in ids: 243 ids.remove(entry.charID) 244 entry.isAdded = isAdded 245 if entry.panel: 246 entry.panel.SearcedUserAddedOrRemoved(entry.isAdded) 247 if len(ids) < 1: 248 break