mapViewSearch.py (9684B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\mapViewSearch.py 2 import carbonui.const as uiconst 3 import eveformat 4 import eveicon 5 import evetypes 6 import localization 7 import uthread 8 import weakref 9 from carbon.common.script.util.timerstuff import AutoTimer 10 from carbonui.control.buttonIcon import ButtonIcon 11 from carbonui.control.scrollentries import ScrollEntryNode, SE_BaseClassCore 12 from carbonui.primitives.container import Container 13 from carbonui.primitives.sprite import Sprite 14 from carbonui.uicore import uicore 15 from eve.client.script.ui.control.eveLabel import EveLabelSmall 16 from eve.client.script.ui.control.searchinput import SearchInput 17 from eve.client.script.ui.shared.maps.maputils import GetNameFromMapCache 18 from eve.client.script.ui.util import searchUtil 19 from eve.common.script.search import const as search_const 20 from eveexceptions import UserError 21 from eveservices.menu import StartMenuService 22 from localization import GetByLabel 23 from player_messaging.client.ui_message import prompt_player_fsd_dialog 24 RESULT_WIDTH = 250 25 26 class MapViewSearchControl(Container): 27 default_align = uiconst.TOPLEFT 28 default_width = RESULT_WIDTH 29 default_height = 20 30 searchInput = None 31 searchResult = None 32 searchFor = None 33 mapView = None 34 scrollListResult = None 35 36 def ApplyAttributes(self, attributes): 37 Container.ApplyAttributes(self, attributes) 38 if attributes.mapView: 39 self.mapView = weakref.ref(attributes.mapView) 40 self.icon = ButtonIcon(parent=self, align=uiconst.CENTERRIGHT, texturePath='res:/UI/Texture/Icons/searchMagnifyingGlass.png', pos=(0, 0, 24, 24), state=uiconst.UI_NORMAL, iconSize=24) 41 self.icon.OnClick = self.ClickIcon 42 self.searchFor = [search_const.ResultType.constellation, 43 search_const.ResultType.solar_system, 44 search_const.ResultType.region, 45 search_const.ResultType.station] 46 searchInput = SearchInput(name='MapViewSearchEdit', parent=self, align=uiconst.TOPRIGHT, width=0, maxLength=64, GetSearchEntries=self.GetSearchData, OnSearchEntrySelected=self.OnSearchEntrySelected, OnReturn=self.OnSearchInputConfirm, OnResultMenuClosed=self.OnResultMenuClosed, hintText=GetByLabel('UI/Common/Buttons/Search'), opacity=0.0, setvalue=settings.char.ui.Get('mapView_searchString', None)) 47 searchInput.searchResultVisibleEntries = 10 48 searchInput.SetHistoryVisibility(False) 49 searchInput.OnFocusLost = self.OnSearchFocusLost 50 searchInput.ShowClearButton(hint=GetByLabel('UI/Inventory/Clear')) 51 self.searchInput = searchInput 52 53 def ClickIcon(self, *args): 54 self.ShowInput() 55 56 def OnSearchFocusLost(self, *args): 57 if not self.searchInput.HasResultMenu(): 58 self.HideInput() 59 60 def OnResultMenuClosed(self, *args): 61 if uicore.registry.GetFocus() is not self.searchInput: 62 self.HideInput() 63 64 def ShowInput(self): 65 uicore.registry.SetFocus(self.searchInput) 66 duration = 0.2 67 uicore.animations.FadeTo(self.searchInput, startVal=self.searchInput.opacity, endVal=1.0, duration=duration) 68 uicore.animations.FadeTo(self.icon, startVal=self.icon.opacity, endVal=0.0, callback=self.icon.Hide, duration=duration) 69 uicore.animations.MorphScalar(self.searchInput, 'width', startVal=self.searchInput.width, endVal=self.width, duration=duration, callback=self.OnInputScaleDone) 70 71 def HideInput(self): 72 duration = 0.4 73 uicore.animations.FadeTo(self.searchInput, startVal=self.searchInput.opacity, endVal=0.0, duration=duration) 74 self.icon.Show() 75 uicore.animations.FadeTo(self.icon, startVal=self.icon.opacity, endVal=1.0, duration=duration) 76 uicore.animations.MorphScalar(self.searchInput, 'width', startVal=self.searchInput.width, endVal=0, duration=duration) 77 78 def OnInputScaleDone(self, *args): 79 resultMenu = self.searchInput.GetResultMenu() 80 if resultMenu: 81 l, t, w, h = self.GetAbsolute() 82 resultMenu.left = l 83 uthread.new(self.searchInput.SearchForData) 84 85 def GetSearchData(self, searchString): 86 self.scrollListResult = [] 87 searchString = eveformat.simple_html_unescape(searchString) 88 searchString = searchString.lstrip() 89 settings.char.ui.Set('mapView_searchString', searchString) 90 if len(searchString) >= 64: 91 self.scrollListResult.append(ScrollEntryNode(label=GetByLabel('UI/Common/SearchStringTooLong'))) 92 elif len(searchString) >= search_const.min_wildcard_length or localization.util.IsTextInConciseLanguage(session.languageID, searchString): 93 self.searchInput.SetValue(searchString, docallback=False) 94 try: 95 results = searchUtil.GetResultsScrollList(searchString, self.searchFor) 96 except UserError: 97 results = [] 98 99 landmarkResults = self.FindLandmarks(searchString) 100 self.scrollListResult = self.PrepareResultScrollEntries(results, searchString, landmarkResults) 101 return self.scrollListResult 102 103 def PrepareResultScrollEntries(self, results, searchString, landmarkResults, *args): 104 scrollList = [] 105 if not results and not landmarkResults: 106 label = GetByLabel('UI/Search/UniversalSearch/NoResultsReturned', searchStr=searchString) 107 scrollList.append(ScrollEntryNode(label=label)) 108 else: 109 for groupEntry in results: 110 entryType, typeList = groupEntry['groupItems'] 111 for entryData in typeList: 112 scrollList.append(ScrollEntryNode(decoClass=SearchResultEntry, **entryData)) 113 114 for entryData in landmarkResults: 115 scrollList.append(ScrollEntryNode(decoClass=SearchResultEntry, **entryData)) 116 117 return scrollList 118 119 def OnSearchInputConfirm(self, *args, **kwds): 120 if self.scrollListResult: 121 self.OnSearchEntrySelected(self.scrollListResult[0]) 122 123 def OnSearchEntrySelected(self, entry, *args, **kwds): 124 self.delaySelectionTimer = AutoTimer(100, self._OnSearchEntrySelectedDelayed, entry) 125 126 def _OnSearchEntrySelectedDelayed(self, entry, *args, **kwds): 127 if not entry or not getattr(entry, 'itemID', None): 128 return 129 self.delaySelectionTimer = None 130 if self.mapView: 131 mapView = self.mapView() 132 if mapView: 133 mapView.SetActiveItemID(entry.itemID, zoomToItem=True) 134 135 def FindLandmarks(self, searchString): 136 mapSvc = sm.GetService('map') 137 landmarkMatches = [] 138 searchString = searchString.lower() 139 for landmarkID, landmarkData in mapSvc.GetLandmarks().iteritems(): 140 landmarkName = GetNameFromMapCache(landmarkData.landmarkNameID, 'landmark') 141 landmarkNameLower = landmarkName.lower() 142 if landmarkNameLower.startswith(searchString): 143 entryData = {'itemID': -landmarkID, 144 'typeID': const.typeMapLandmark, 145 'label': landmarkName} 146 landmarkMatches.append(entryData) 147 148 return landmarkMatches 149 150 151 class SearchResultEntry(SE_BaseClassCore): 152 153 def Startup(self, *args): 154 self.icon = Sprite(parent=self, pos=(2, 1, 16, 16), align=uiconst.TOPLEFT, state=uiconst.UI_DISABLED) 155 self.label = EveLabelSmall(parent=self, padding=(20, 3, 4, 0), state=uiconst.UI_DISABLED, align=uiconst.TOTOP) 156 157 def Load(self, node): 158 data = node 159 self.typeID = data.Get('typeID', None) 160 self.itemID = data.Get('itemID', None) 161 if node.selected: 162 self.Select() 163 else: 164 self.Deselect() 165 self.label.text = data.label 166 bracketIconPath = sm.GetService('bracket').GetBracketIcon(self.typeID) 167 if bracketIconPath: 168 self.icon.texturePath = bracketIconPath 169 else: 170 groupID = evetypes.GetGroupID(self.typeID) 171 if groupID == const.groupRegion: 172 self.icon.texturePath = 'res:/UI/Texture/Shared/Brackets/region.png' 173 if groupID == const.groupConstellation: 174 self.icon.texturePath = 'res:/UI/Texture/Shared/Brackets/constellation.png' 175 if groupID == const.groupSolarSystem: 176 self.icon.texturePath = 'res:/UI/Texture/Shared/Brackets/solarSystem.png' 177 if groupID == const.groupLandmark: 178 self.icon.texturePath = eveicon.location 179 180 def GetHeight(self, *args): 181 node, width = args 182 textHeight = EveLabelSmall.MeasureTextSize(text=node.label, width=RESULT_WIDTH - 40)[1] 183 return max(20, textHeight + 5) 184 185 def OnMouseEnter(self, *args): 186 SE_BaseClassCore.OnMouseEnter(self, *args) 187 if self.sr.node: 188 prompt_player_fsd_dialog('ListEntryEnter') 189 190 def OnClick(self, *args): 191 if self.sr.node.Get('selectable', 1): 192 self.sr.node.scroll.SelectNode(self.sr.node) 193 prompt_player_fsd_dialog('ListEntryClick') 194 if self.sr.node.Get('OnClick', None): 195 self.sr.node.OnClick(self) 196 197 def OnMouseDown(self, *args): 198 SE_BaseClassCore.OnMouseDown(self, *args) 199 if self.sr.node and self.sr.node.Get('OnMouseDown', None): 200 self.sr.node.OnMouseDown(self) 201 202 def OnMouseUp(self, *args): 203 SE_BaseClassCore.OnMouseUp(self, *args) 204 if self.sr.node and self.sr.node.Get('OnMouseUp', None): 205 self.sr.node.OnMouseUp(self) 206 207 def GetMenu(self): 208 return StartMenuService().CelestialMenu(self.sr.node.itemID) 209 210 @classmethod 211 def GetCopyData(cls, node): 212 return node.label