capitalnavigation.py (12713B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\capitalnavigation.py 2 import utillib 3 from carbonui.primitives.container import Container 4 from eve.client.script.ui.control.entries.generic import Generic 5 from eve.client.script.ui.control.entries.util import GetFromClass 6 from carbonui.control.window import Window 7 from carbonui.control.tabGroup import TabGroup 8 from eve.client.script.ui.control.themeColored import SpriteThemeColored 9 from eve.common.lib import appConst as const 10 from eve.common.script.sys import eveCfg 11 from eve.common.script.sys.eveCfg import InShipInSpace 12 import evetypes 13 from eve.client.script.ui.util import uix 14 from eve.client.script.ui.control import eveLabel, eveScroll 15 import uthread 16 import blue 17 import carbonui.const as uiconst 18 import localization 19 from eveservices.menu import GetMenuService 20 from eveuniverse.security import is_low_sec_or_lower 21 from menu import MenuLabel 22 23 class CapitalNav(Window): 24 default_windowID = 'capitalnav' 25 default_captionLabelPath = 'UI/CapitalNavigation/CapitalNavigationWindow/CapitalNavigationLabel' 26 default_iconNum = 'res:/ui/Texture/WindowIcons/capitalNavigation.png' 27 default_minSize = (350, 200) 28 default_height = 300 29 __notifyevents__ = ['OnSessionChanged'] 30 31 def ApplyAttributes(self, attributes): 32 Window.ApplyAttributes(self, attributes) 33 self.soldict = {} 34 topParent = Container(name='topParent', parent=self.GetMainArea(), align=uiconst.TOTOP, height=30, clipChildren=True) 35 eveLabel.EveLabelMedium(parent=topParent, align=uiconst.CENTERLEFT, text=localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/OnlinedStarbaseMessage')) 36 self.sr.scroll = eveScroll.Scroll(name='scroll', parent=self.sr.main, padding=(const.defaultPadding, 37 const.defaultPadding, 38 const.defaultPadding, 39 const.defaultPadding)) 40 self.sr.settingsParent = Container(name='settingsParent', parent=self.sr.main, align=uiconst.TOALL, state=uiconst.UI_HIDDEN, idx=1, pos=(const.defaultPadding, 41 const.defaultPadding, 42 const.defaultPadding, 43 const.defaultPadding), clipChildren=1) 44 maintabs = [[localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/JumpTo'), 45 self.sr.scroll, 46 self, 47 'jumpto', 48 self.sr.scroll], [localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/WithinRange'), 49 self.sr.scroll, 50 self, 51 'inrange', 52 self.sr.scroll]] 53 shipID = eveCfg.GetActiveShip() 54 if shipID and sm.GetService('clientDogmaIM').GetDogmaLocation().GetItem(shipID).groupID == const.groupTitan: 55 maintabs.insert(1, [localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/BridgeTo'), 56 self.sr.scroll, 57 self, 58 'bridgeto', 59 self.sr.scroll]) 60 self.sr.maintabs = TabGroup(name='tabparent', parent=self.sr.main, idx=1, tabs=maintabs, groupID='capitaljumprangepanel') 61 62 def OnSessionChanged(self, isRemote, session, change): 63 if 'solarsystemid' in change: 64 self.sr.showing = '' 65 self.sr.maintabs.ReloadVisible() 66 67 def _OnClose(self, *args): 68 self.soldict = {} 69 70 def Load(self, args): 71 self.sr.scroll.sr.id = 'capitalnavigationscroll' 72 if args == 'inrange': 73 self.ShowInRangeTab() 74 elif args == 'jumpto': 75 self.ShowJumpBridgeToTab() 76 elif args == 'bridgeto': 77 self.ShowJumpBridgeToTab(1) 78 elif args == 'settings': 79 self.ShowSettingsTab() 80 81 def GetSolarSystemsInRange_thread(self, solarSystemID): 82 shipID = eveCfg.GetActiveShip() 83 if not shipID: 84 return 85 self.sr.scroll.Load(contentList=[], noContentHint=localization.GetByLabel('UI/Common/GettingData')) 86 jumpDriveRange, consumptionType, consumptionAmount = self.GetJumpDriveInfo(shipID) 87 inRange = set() 88 soldict = self.soldict.get(solarSystemID, None) 89 for solID, solData in cfg.mapSystemCache.iteritems(): 90 if session.solarsystemid2 != solID and is_low_sec_or_lower(solData.securityStatus): 91 distance = uix.GetLightYearDistance(solarSystemID, solID, False) 92 if distance is not None and distance <= jumpDriveRange: 93 inRange.add(solID) 94 self.soldict[solarSystemID] = inRange 95 96 scrolllist = [] 97 if inRange: 98 for solarSystemID in inRange: 99 blue.pyos.BeNice() 100 if not self or self.destroyed: 101 return 102 requiredQty, requiredType = self.GetFuelConsumptionForMyShip(session.solarsystemid2, solarSystemID, consumptionType, consumptionAmount) 103 entry = self.GetSolarSystemBeaconEntry(solarSystemID, requiredQty, requiredType, jumpDriveRange) 104 if entry: 105 scrolllist.append(entry) 106 107 if not len(scrolllist): 108 self.sr.scroll.ShowHint(localization.GetByLabel('UI/Common/NothingFound')) 109 if self.sr.scroll and scrolllist and self.sr.Get('showing', None) == 'inrange': 110 self.sr.scroll.ShowHint('') 111 self.sr.scroll.Load(contentList=scrolllist, headers=[localization.GetByLabel('UI/Common/LocationTypes/SolarSystem'), 112 localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/SecurityColumnHeader'), 113 localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/FuelColumnHeader'), 114 localization.GetByLabel('UI/Common/Volume'), 115 localization.GetByLabel('UI/Common/Distance'), 116 localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/JumpTo')]) 117 118 def ShowInRangeTab(self): 119 if not eveCfg.GetActiveShip(): 120 return None 121 if self.sr.Get('showing', '') != 'inrange': 122 self.sr.scroll.Load(contentList=[], noContentHint=localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/CalculatingStellarDistancesMessage')) 123 uthread.pool('form.CapitalNav::ShowInRangeTab', self.GetSolarSystemsInRange_thread, session.solarsystemid2) 124 self.sr.showing = 'inrange' 125 126 def ShowJumpBridgeToTab(self, isBridge = False): 127 showing = 'UI/CapitalNavigation/CapitalNavigationWindow/BridgeTo' if isBridge else 'UI/CapitalNavigation/CapitalNavigationWindow/JumpTo' 128 if self.sr.Get('showing', '') != showing: 129 scrolllist = [] 130 shipID = eveCfg.GetActiveShip() 131 if shipID: 132 jumpDriveRange, consumptionType, consumptionAmount = self.GetJumpDriveInfo(shipID) 133 structureBeacons = sm.GetService('structureDirectory').GetAccessibleOnlineCynoBeaconStructures() 134 structureBeaconAction = self.BridgeToStructure if isBridge else self.JumpToStructure 135 for structureID, typeID, ownerID, solarSystemID, structureState, name in structureBeacons: 136 if solarSystemID == session.solarsystemid: 137 continue 138 requiredQty, requiredType = self.GetFuelConsumptionForMyShip(session.solarsystemid2, solarSystemID, consumptionType, consumptionAmount) 139 if requiredQty: 140 entry = self.GetSolarSystemBeaconEntry(solarSystemID, requiredQty, requiredType, jumpDriveRange, structureID, structureBeaconAction, typeID) 141 scrolllist.append(entry) 142 143 headers = [localization.GetByLabel('UI/Common/Type'), 144 localization.GetByLabel('UI/Common/LocationTypes/SolarSystem'), 145 localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/SecurityColumnHeader'), 146 localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/FuelColumnHeader'), 147 localization.GetByLabel('UI/Common/Volume'), 148 localization.GetByLabel('UI/Common/Distance'), 149 localization.GetByLabel(showing)] 150 self.sr.scroll.state = uiconst.UI_NORMAL 151 self.sr.scroll.Load(contentList=scrolllist, headers=headers, noContentHint=localization.GetByLabel('UI/Common/NothingFound')) 152 self.sr.showing = showing 153 154 def JumpToStructure(self, entry, *args): 155 m = [] 156 if entry.sr.node.itemID != session.solarsystemid2 and InShipInSpace(): 157 m = [(MenuLabel('UI/CapitalNavigation/CapitalNavigationWindow/JumpTo'), self._JumpToStructure, (entry.sr.node.itemID, entry.sr.node.beaconID))] 158 return m 159 160 def _JumpToStructure(self, solarSystemID, beaconID): 161 GetMenuService().JumpToStructureBeacon(solarSystemID, beaconID) 162 163 def BridgeToStructure(self, entry, *args): 164 m = [] 165 if entry.sr.node.itemID != session.solarsystemid2 and InShipInSpace(): 166 m = [(MenuLabel('UI/CapitalNavigation/CapitalNavigationWindow/BridgeTo'), self._BridgeToStructure, (entry.sr.node.itemID, entry.sr.node.beaconID))] 167 return m 168 169 def _BridgeToStructure(self, solarSystemID, beaconID): 170 GetMenuService().BridgeToBeaconStructure(solarSystemID, beaconID) 171 172 def GetSolarSystemBeaconEntry(self, solarSystemID, requiredQty, requiredType, jumpDriveRange, beaconID = None, action = None, beaconTypeID = None): 173 if solarSystemID is None or requiredQty is None or requiredType is None or jumpDriveRange is None: 174 return 175 lightYearDistance = uix.GetLightYearDistance(session.solarsystemid2, solarSystemID, False) 176 solarSystemName = localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/SolarSystemName', solarSystem=solarSystemID) 177 securityStatus = sm.GetService('map').GetSecurityStatus(solarSystemID) 178 requiredVolume = evetypes.GetVolume(requiredType) * requiredQty 179 if jumpDriveRange > lightYearDistance: 180 rangeString = 'UI/CapitalNavigation/CapitalNavigationWindow/WithinRange' 181 else: 182 rangeString = 'UI/CapitalNavigation/CapitalNavigationWindow/NotInRange' 183 label = '%s<t>%s<t>%s<t>%s<t>%s<t>%s' % (solarSystemName, 184 localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/SecurityStatus', securityStatus=securityStatus), 185 localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/FuelTypeRequired', fuelType=requiredType, requiredQty=requiredQty), 186 localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/FuelVolumeRequired', requiredVolume=requiredVolume), 187 localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/DistanceToSystem', lightYearDistance=lightYearDistance), 188 localization.GetByLabel(rangeString)) 189 if beaconTypeID: 190 label = '%s<t>%s' % (evetypes.GetName(beaconTypeID), label) 191 data = utillib.KeyVal() 192 data.label = label 193 data.showinfo = 1 194 data.typeID = const.typeSolarSystem 195 data.itemID = solarSystemID 196 data.charIndex = solarSystemName.lower() 197 if beaconID and action: 198 data.beaconID = beaconID 199 data.GetMenu = action 200 data.Set('sort_%s' % localization.GetByLabel('UI/Common/Distance'), lightYearDistance) 201 data.Set('sort_%s' % localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/FuelColumnHeader'), requiredQty) 202 data.Set('sort_%s' % localization.GetByLabel('UI/Common/Destination'), solarSystemName) 203 data.Set('sort_%s' % localization.GetByLabel('UI/CapitalNavigation/CapitalNavigationWindow/SecurityColumnHeader'), securityStatus) 204 data.Set('sort_%s' % localization.GetByLabel('UI/Common/Volume'), requiredVolume) 205 return GetFromClass(Generic, data) 206 207 def GetJumpDriveInfo(self, shipID): 208 if shipID: 209 dogmaLocation = sm.GetService('clientDogmaIM').GetDogmaLocation() 210 jumpDriveRange = dogmaLocation.GetAttributeValue(shipID, const.attributeJumpDriveRange) 211 consumptionType = dogmaLocation.GetAttributeValue(shipID, const.attributeJumpDriveConsumptionType) 212 consumptionAmount = dogmaLocation.GetAttributeValue(shipID, const.attributeJumpDriveConsumptionAmount) 213 return (jumpDriveRange, consumptionType, consumptionAmount) 214 215 def GetFuelConsumptionForMyShip(self, fromSystem, toSystem, consumptionType, consumptionAmount): 216 if not eveCfg.GetActiveShip(): 217 return (None, None) 218 myDist = uix.GetLightYearDistance(fromSystem, toSystem, False) 219 if myDist is None: 220 return (None, None) 221 consumptionAmount = myDist * consumptionAmount 222 return (int(consumptionAmount), consumptionType)