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

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