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

listSurroundingsBtn.py (20092B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\infoPanels\listSurroundingsBtn.py
      2 import sys
      3 from collections import defaultdict
      4 import eveicon
      5 import evetypes
      6 import localization
      7 import logging
      8 import traceback
      9 import uthread2
     10 import utillib
     11 from carbon.common.script.util.commonutils import StripTags
     12 from carbonui.control.buttonIcon import ButtonIcon
     13 from carbonui.control.contextMenu.menuConst import DISABLED_ENTRY0
     14 from carbonui.control.contextMenu.menuEntryData import MenuEntryData, MenuEntryDataCheckbox, MenuEntryDataCaption
     15 from carbonui.util.various_unsorted import SortListOfTuples
     16 from eve.client.script.ui import eveColor
     17 from eve.client.script.ui.services.menuSvcExtras import movementFunctions
     18 from eve.client.script.ui.shared.infoPanels.const.infoPanelConst import PANEL_LOCATION_INFO
     19 from eve.client.script.ui.shared.infoPanels.locationInfoConst import SYSTEM_INFO_SHOW_NEAREST_SETTING, SYSTEM_INFO_SHOW_SOVEREIGNTY
     20 from eve.client.script.ui.shared.mapView.markers.mapMarkerUtil import ICONS_BY_SCANGROUP
     21 from eve.client.script.ui.shared.planet.planetConst import PLANETTYPE_NAMES
     22 from eve.client.script.ui.util import uix
     23 from eve.common.lib import appConst
     24 from eve.common.script.sys.idCheckers import IsStructure, IsAbyssalSpaceSystem, IsVoidSpaceSystem, IsHiddenSpaceSystem
     25 from evedungeons.common.instance_identifier import DungeonInstanceIdentifier
     26 from eveformat import client as eveformat
     27 from eveservices.menu import GetMenuService
     28 from localization import GetByLabel
     29 from menu import MenuLabel
     30 from operations.client.operationscontroller import GetOperationsController
     31 from operations.client.util import are_operations_active
     32 from probescanning.explorationSites import get_exploration_site_name_label
     33 from sovereignty.mercenaryden.client.repository import get_mercenary_den_repository
     34 logger = logging.getLogger(__name__)
     35 
     36 def GetBracketIconTexturePath(typeID):
     37     bracketSvc = sm.GetService('bracket')
     38     bracketData = bracketSvc.GetBracketDataByTypeID(typeID)
     39     if bracketData:
     40         texturePath = bracketData.texturePath
     41     return texturePath
     42 
     43 
     44 class ListSurroundingsBtn(ButtonIcon):
     45     isDragObject = True
     46     default_iconSize = 24
     47     default_texturePath = 'res:/ui/texture/icons/77_32_49.png'
     48 
     49     def ApplyAttributes(self, attributes):
     50         super(ListSurroundingsBtn, self).ApplyAttributes(attributes)
     51         self.infoPanelService = sm.GetService('infoPanel')
     52         self.expandOnLeft = 1
     53         self.filterCurrent = 1
     54         self._is_in_space_menu = attributes.get('isInSpaceMenu', False)
     55         self.useDynamicMapItems = attributes.get('useDynamicMapItems', False)
     56         if not attributes.showIcon:
     57             self.icon.Hide()
     58         SYSTEM_INFO_SHOW_NEAREST_SETTING.on_change.connect(self.OnShowNearestSettingChanged)
     59         SYSTEM_INFO_SHOW_SOVEREIGNTY.on_change.connect(self.OnShowSovereigntySettingChanged)
     60 
     61     def SetSolarsystemID(self, solarsystemID):
     62         self.solarsystemID = solarsystemID
     63         self.sr.itemID = solarsystemID
     64         self.sr.typeID = appConst.typeSolarSystem
     65 
     66     def _GetMapItems(self):
     67         if self.useDynamicMapItems and self.solarsystemID:
     68             return sm.GetService('map').GetSolarsystemItems(self.solarsystemID, True, False)
     69         else:
     70             return self.sr.mapitems
     71 
     72     def GetInt(self, string):
     73         value = filter(lambda x: x in '0123456789', string)
     74         try:
     75             value = int(value)
     76         except:
     77             sys.exc_clear()
     78 
     79         return value
     80 
     81     def ExpandCelestial(self, mapItem):
     82         return GetMenuService().CelestialMenu(mapItem.itemID, mapItem=mapItem)
     83 
     84     def ExpandCategoryMenu(self, itemList):
     85         itemsByGroupID = defaultdict(list)
     86         for eachItem in itemList:
     87             itemsByGroupID[eachItem.groupID].append(eachItem)
     88 
     89         listToSort = []
     90         for groupID, groupList in itemsByGroupID.iteritems():
     91             groupName = evetypes.GetGroupNameByGroup(groupID)
     92             listToSort.append((groupName.lower(), (groupName, groupList)))
     93 
     94         sortedList = SortListOfTuples(listToSort)
     95         m = []
     96         for entry in sortedList:
     97             menuLabel, itemList = entry
     98             m.append(MenuEntryData(menuLabel, subMenuData=lambda _itemList = itemList: self.ExpandTypeMenu(_itemList), texturePath=GetBracketIconTexturePath(itemList[0].typeID)))
     99 
    100         return m
    101 
    102     def ExpandTypeMenu(self, items):
    103         typemenu = []
    104         for item in items:
    105             entryName = self._GetEntryName(item)
    106             typemenu.append(((item.celestialIndex, item.orbitIndex, entryName.lower()), MenuEntryData(entryName, subMenuData=lambda _item = item: self.ExpandCelestial(_item), texturePath=self._GetItemEntryTexturePath(item), func=lambda itemID = item.itemID: movementFunctions.WarpToItem(itemID))))
    107 
    108         typemenu = SortListOfTuples(typemenu)
    109         return typemenu
    110 
    111     def _GetItemEntryTexturePath(self, item):
    112         texturePath = None
    113         if IsStructure(evetypes.GetCategoryID(item.typeID)):
    114             bracketData = sm.GetService('bracket').GetBracketDataByTypeID(item.typeID)
    115             if bracketData:
    116                 texturePath = bracketData.texturePath
    117         return texturePath
    118 
    119     def _GetEntryName(self, item):
    120         itemName = cfg.evelocations.Get(item.itemID).name
    121         if item.groupID == appConst.groupStation:
    122             name = uix.EditStationName(itemName, 1)
    123             if sm.GetService('home_station').is_home_station(item.itemID):
    124                 name = '<color=%s>%s</color>' % (eveColor.CRYO_BLUE_HEX, name)
    125             return name
    126         if item.groupID == appConst.groupPlanet:
    127             return '%s (%s)' % (itemName, GetByLabel(PLANETTYPE_NAMES.get(item.typeID, '')))
    128         if item.groupID == appConst.groupStargate:
    129             slimItem = sm.StartService('michelle').GetItem(item.itemID)
    130             if self._IsGateUnavailable(item.itemID):
    131                 itemName = eveformat.color(itemName, eveColor.DANGER_RED_HEX)
    132             if slimItem and slimItem.jumps:
    133                 return '%s %s' % (itemName, eveformat.solar_system_security_status(slimItem.jumps[0].locationID))
    134             else:
    135                 return itemName
    136         else:
    137             return itemName or item.itemName or 'no name!'
    138 
    139     def _IsGateUnavailable(self, gateID):
    140         lock_details = sm.GetService('gatejump').GetGateLockDetails()
    141         if lock_details and lock_details.gate_id != gateID:
    142             return True
    143         return False
    144 
    145     def GetMenu(self, *args):
    146         m = []
    147         mapitems = self._GetMapItems()
    148         if self.sr.Get('groupByType', 0):
    149             if self.sr.typeID and self.sr.itemID and not (IsAbyssalSpaceSystem(self.sr.itemID) or IsVoidSpaceSystem(self.sr.itemID) or IsHiddenSpaceSystem(self.sr.itemID)):
    150                 m += [(MenuLabel('UI/Commands/ShowInfo'), GetMenuService().ShowInfo, (self.sr.typeID, self.sr.itemID))]
    151             if IsAbyssalSpaceSystem(self.sr.itemID) or IsVoidSpaceSystem(self.sr.itemID) or IsHiddenSpaceSystem(self.sr.itemID):
    152                 m.append((MenuLabel('UI/Commands/ShowInfo'), DISABLED_ENTRY0))
    153 
    154             def GetGroupingKeyVal(labelPath):
    155                 return utillib.KeyVal(labelPath=labelPath, typeIDs=[])
    156 
    157             categoriesToSplitToGroups = [(appConst.categoryStructure, 10)]
    158             groupDict = {appConst.groupAsteroidBelt: GetGroupingKeyVal('UI/Common/LocationTypes/AsteroidBelts'),
    159              appConst.groupPlanet: GetGroupingKeyVal('UI/Common/LocationTypes/Planets'),
    160              appConst.groupStargate: GetGroupingKeyVal('UI/Common/LocationTypes/Stargates'),
    161              appConst.groupStation: GetGroupingKeyVal('UI/Common/LocationTypes/Stations')}
    162             categoryDict = {appConst.categoryStructure: GetGroupingKeyVal('UI/Common/LocationTypes/Structures')}
    163             for item in mapitems:
    164                 if item.groupID in groupDict:
    165                     groupDict[item.groupID].typeIDs.append(item)
    166                 categoryID = evetypes.GetCategoryID(item.typeID)
    167                 if categoryID in categoryDict:
    168                     categoryDict[categoryID].typeIDs.append(item)
    169 
    170             categoryGroupsToAdd = []
    171             for eachCategoryID, eachThreshold in categoriesToSplitToGroups:
    172                 cat = categoryDict.get(eachCategoryID)
    173                 if cat and len(cat.typeIDs) > eachThreshold:
    174                     categoryGroupsToAdd.append((cat.labelPath, cat.typeIDs))
    175                     categoryDict.pop(eachCategoryID)
    176 
    177             menuItemDict = {}
    178             menuItemDict.update(groupDict)
    179             menuItemDict.update(categoryDict)
    180             listToSort = []
    181             for groupingID, groupingInfo in menuItemDict.iteritems():
    182                 itemList = groupingInfo.typeIDs
    183                 if not itemList:
    184                     continue
    185                 labelPath = groupingInfo.labelPath
    186                 menuLabel = MenuLabel(labelPath)
    187                 listToSort.append((localization.GetByLabel(labelPath), (menuLabel, itemList)))
    188 
    189             sortedList = SortListOfTuples(listToSort)
    190             for entry in sortedList:
    191                 menuLabel, itemList = entry
    192                 m.append(MenuEntryData(menuLabel, subMenuData=lambda _itemList = itemList: self.ExpandTypeMenu(_itemList), texturePath=GetBracketIconTexturePath(itemList[0].typeID)))
    193 
    194             for eachCatLablePath, items in categoryGroupsToAdd:
    195                 m.append(MenuEntryData(MenuLabel(eachCatLablePath), subMenuData=lambda _items = items: self.ExpandCategoryMenu(_items), texturePath=GetBracketIconTexturePath(items[0].typeID)))
    196 
    197             anomalies = sm.GetService('sensorSuite').GetAnomalies()
    198             if len(anomalies) > 0:
    199                 m.append(MenuEntryData(MenuLabel('UI/Inflight/Scanner/AnomalySiteFilterLabel'), subMenuData=lambda : self._GetAnomaliesMenu(anomalies), texturePath='res:/UI/Texture/Shared/Brackets/combatSite_16.png'))
    200             m += sm.GetService('bookmarkSvc').GetBookmarkMenuForNavigation()
    201             m += self._GetAgentMissonsMenu()
    202             m = self._AddOperationsMenu(m)
    203             m = self._AddContractsMenu(m)
    204             m += self._GetMercenaryDenActivitiesMenu()
    205         else:
    206             celestialMenu = GetMenuService().CelestialMenu
    207             mapitems = SortListOfTuples([ (item.itemName.lower(), item) for item in mapitems ])
    208             maxmenu = 25
    209             if len(mapitems) > maxmenu:
    210                 groups = []
    211                 counter = 0
    212                 while counter < len(mapitems):
    213                     groups.append(mapitems[counter:counter + maxmenu])
    214                     counter = counter + maxmenu
    215 
    216                 for group in groups:
    217                     groupmenu = []
    218                     for item in group:
    219                         groupmenu.append((item.itemName or 'no name!', celestialMenu(item.itemID, mapItem=item)))
    220 
    221                     if len(groupmenu):
    222                         fromLetter = '???'
    223                         if group[0].itemName:
    224                             fromLetter = StripTags(group[0].itemName)[0]
    225                         toLetter = '???'
    226                         if group[-1].itemName:
    227                             toLetter = StripTags(group[-1].itemName)[0]
    228                         m.append((fromLetter + '...' + toLetter, groupmenu))
    229 
    230                 return m
    231             for item in mapitems[:30]:
    232                 m.append((item.itemName or 'no name!', celestialMenu(item.itemID, mapItem=item)))
    233 
    234         m.append(None)
    235         starmapSvc = sm.GetService('starmap')
    236         if len(starmapSvc.GetWaypoints()) > 0:
    237             m.append((MenuLabel('UI/Neocom/ClearAllAutopilotWaypoints'), starmapSvc.ClearWaypoints, (None,)))
    238         m.append(None)
    239         if not self._is_in_space_menu:
    240             m.append(MenuEntryDataCheckbox(localization.GetByLabel('UI/Locations/ShowNearestLocation'), setting=SYSTEM_INFO_SHOW_NEAREST_SETTING))
    241             m.append(MenuEntryDataCheckbox(localization.GetByLabel('UI/Locations/ShowSystemSovereignty'), setting=SYSTEM_INFO_SHOW_SOVEREIGNTY))
    242         return m
    243 
    244     def _GetMercenaryDenActivitiesMenu(self):
    245         try:
    246             repository = get_mercenary_den_repository()
    247             mercenary_den_activities = repository.get_all_mercenary_den_activities_for_solar_system(session.solarsystemid2)
    248             if len(mercenary_den_activities) == 0:
    249                 return []
    250             activities_submenu = []
    251             for mercenary_den_activity in mercenary_den_activities:
    252                 if not mercenary_den_activity.is_started:
    253                     continue
    254                 activity_id = mercenary_den_activity.id
    255                 activity_name_message_id = mercenary_den_activity.template_name_id
    256                 activity_description_message_id = mercenary_den_activity.template_description_id
    257                 activity_name = localization.GetByMessageID(activity_name_message_id)
    258                 activity_description = localization.GetByMessageID(activity_description_message_id)
    259                 dungeon_instance_identifier = DungeonInstanceIdentifier.create_external_activity_instance_id(activity_id)
    260                 activity_submenu = [MenuEntryData(localization.GetByLabel('UI/Commands/WarpTo'), subMenuData=None, func=lambda _dungeon_instance_id = dungeon_instance_identifier: sm.GetService('michelle').CmdWarpToExternalDungeon(_dungeon_instance_id))]
    261                 activities_submenu.append(MenuEntryData(activity_name, subMenuData=activity_submenu, hint=activity_description, texturePath=eveicon.mercenary_den_bracket))
    262 
    263             if len(activities_submenu) == 0:
    264                 return []
    265             return [MenuEntryData(MenuLabel('UI/Common/LocationTypes/MercenaryTacticalOperations'), subMenuData=activities_submenu, texturePath=eveicon.mercenary_den_bracket)]
    266         except Exception:
    267             logger.exception('Errored while building mercenary den activities menu: %s', traceback.format_exc())
    268 
    269         return []
    270 
    271     def _GetAnomaliesMenu(self, anomalies):
    272         menu = []
    273         allSitesByGroupID = self._GetAnomaliesByScanGroupID(anomalies)
    274         menusByScanGroup = defaultdict(set)
    275         sitesByMenu = defaultdict(list)
    276         for scanGroupID, sites in sorted(allSitesByGroupID.items()):
    277             for siteData in sites:
    278                 menuGroup = get_exploration_site_name_label(site_type=scanGroupID, archetype_id=siteData.archetypeID)
    279                 menusByScanGroup[scanGroupID].add(menuGroup)
    280                 sitesByMenu[menuGroup].append(siteData)
    281 
    282         for scanGroupID in sorted(menusByScanGroup.keys()):
    283             for menuGroup in sorted(menusByScanGroup[scanGroupID], reverse=True):
    284                 sites = sitesByMenu[menuGroup]
    285                 menu += self._GetAnomaliesMenuGroup(sites, menuGroup)
    286 
    287         return menu
    288 
    289     def _GetAnomaliesMenuGroup(self, sites, groupName):
    290         menu = [MenuEntryDataCaption(MenuLabel(groupName))]
    291         for siteData in sites:
    292             menu.append(MenuEntryData('%s (%s)' % (siteData.GetDungeonName(), siteData.GetName()), subMenuData=lambda _siteData = siteData: sm.GetService('scanSvc').GetScanResultMenuWithoutIgnore(_siteData), func=lambda _siteData = siteData: _siteData.WarpToAction(None, 0), texturePath=ICONS_BY_SCANGROUP[siteData.scanStrengthAttribute]))
    293 
    294         return menu
    295 
    296     def _GetAnomaliesByScanGroupID(self, anomalies):
    297         ret = defaultdict(list)
    298         for siteData in anomalies:
    299             ret[siteData.scanStrengthAttribute].append(siteData)
    300 
    301         for sites in ret.values():
    302             sites.sort(key=lambda x: x.GetDungeonName())
    303 
    304         return ret
    305 
    306     def _GetAgentMissonsMenu(self):
    307         missionData = sm.GetService('journal').GetMyAgentJournalBookmarks()
    308         if not missionData:
    309             return []
    310         menu = self._GetAgentMissionEntries(missionData)
    311         if menu:
    312             return [MenuEntryData(MenuLabel('UI/PeopleAndPlaces/AgentMissions'), subMenuData=lambda : menu, texturePath=eveicon.agent_mission)]
    313         return []
    314 
    315     def _GetAgentMissionEntries(self, missionData):
    316         menu = []
    317         for missionNameID, bookmarks, agentID in missionData:
    318             if isinstance(missionNameID, (int, long)):
    319                 missionName = localization.GetByMessageID(missionNameID)
    320             else:
    321                 missionName = missionNameID
    322             entries = []
    323             for bookmark in bookmarks:
    324                 if bookmark.solarsystemID == session.solarsystemid2:
    325                     entries.append(MenuEntryData(self._GetAgentEntryText(bookmark), subMenuData=lambda b = bookmark: GetMenuService().BookmarkMenu(b), func=lambda b = bookmark: movementFunctions.WarpToBookmark(b, warpRange=0)))
    326 
    327             if entries:
    328                 agentMenuText = MenuLabel('UI/Neocom/MissionNameSubmenu', {'missionName': missionName,
    329                  'agent': agentID})
    330                 menu.append([agentMenuText, entries])
    331 
    332         return menu
    333 
    334     def _GetAgentEntryText(self, bm):
    335         txt = bm.hint
    336         systemName = cfg.evelocations.Get(bm.solarsystemID).name
    337         if bm.locationType == 'dungeon':
    338             txt = txt.replace(' - %s' % systemName, '')
    339         if '- Moon ' in txt:
    340             txt = txt.replace(' - Moon ', ' - M')
    341         if txt.endswith('- '):
    342             txt = txt[:-2]
    343         return txt
    344 
    345     def _AddOperationsMenu(self, m):
    346         if are_operations_active() and GetOperationsController().is_any_operation_active():
    347             objective = self.infoPanelService.GetActiveOperationObjective()
    348             if objective:
    349                 text, callback, icon = objective.GetLocation()
    350                 if all([text, callback, icon]):
    351                     categoryName = objective.GetCategoryName()
    352                     operationName = objective.GetOperationName()
    353                     operationMenuTitle = MenuLabel('UI/Operations/InfoPanel/OperationMenuTitle')
    354                     operationMenuText = MenuLabel('UI/Operations/InfoPanel/OperationMenuText', {'operationName': operationName,
    355                      'categoryName': categoryName})
    356                     if len(callback) > 0:
    357                         func = callback[0]
    358                         args = callback[1:] if len(callback) > 1 else ()
    359                         operationSubmenu = [(text, func, args)]
    360                         operationMenu = [(operationMenuText, operationSubmenu)]
    361                         m += [None, (operationMenuTitle, lambda : None)] + operationMenu
    362         return m
    363 
    364     def _AddContractsMenu(self, m):
    365         contractsMenu = sm.GetService('contracts').GetContractsBookmarkMenu()
    366         if contractsMenu:
    367             m += contractsMenu
    368         return m
    369 
    370     def DoWarpToHidden(self, instanceID):
    371         sm.GetService('michelle').CmdWarpToStuff('epinstance', instanceID)
    372 
    373     def GetDragData(self, *args):
    374         itemID = self.sr.Get('itemID', None)
    375         typeID = self.sr.Get('typeID', None)
    376         if not itemID or not typeID:
    377             return []
    378         if IsAbyssalSpaceSystem(session.solarsystemid2) or IsVoidSpaceSystem(session.solarsystemid2) or IsHiddenSpaceSystem(session.solarsystemid2):
    379             return []
    380         label = ''
    381         if typeID in (appConst.typeRegion, appConst.typeConstellation, appConst.typeSolarSystem):
    382             label += cfg.evelocations.Get(itemID).name
    383             elabel = {appConst.typeRegion: localization.GetByLabel('UI/Neocom/Region'),
    384              appConst.typeConstellation: localization.GetByLabel('UI/Neocom/Constellation'),
    385              appConst.typeSolarSystem: localization.GetByLabel('UI/Neocom/SolarSystem')}
    386             label += ' %s' % elabel.get(typeID)
    387         entry = utillib.KeyVal()
    388         entry.itemID = itemID
    389         entry.typeID = typeID
    390         entry.__guid__ = 'xtriui.ListSurroundingsBtn'
    391         entry.label = label
    392         return [entry]
    393 
    394     def OnShowNearestSettingChanged(self, value):
    395         uthread2.StartTasklet(self.infoPanelService.UpdatePanel, PANEL_LOCATION_INFO)
    396 
    397     def OnShowSovereigntySettingChanged(self, value):
    398         uthread2.StartTasklet(self.infoPanelService.UpdatePanel, PANEL_LOCATION_INFO)