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)