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

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)