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

statsPanel.py (15328B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\fittingScreen\statsPanel.py
      2 import dogma.data as dogma_data
      3 from carbonui import const as uiconst, fontconst
      4 from carbonui.primitives.container import Container
      5 import dogma.const as dogmaConst
      6 from eve.client.script.ui.control.expandablemenu import ExpandableMenuContainer
      7 from eve.client.script.ui.shared.fitting.fittingUtil import EatSignalChangingErrors
      8 from eve.client.script.ui.shared.fittingScreen.fittingPanels.capacitorPanel import CapacitorPanel
      9 from eve.client.script.ui.shared.fittingScreen.fittingPanels.defensePanel import DefensePanel
     10 from eve.client.script.ui.shared.fittingScreen.fittingPanels.dronePanel import DronePanel
     11 from eve.client.script.ui.shared.fittingScreen.fittingPanels.fighterPanel import FighterPanel
     12 from eve.client.script.ui.shared.fittingScreen.fittingPanels.fuelPanel import FuelPanel
     13 from eve.client.script.ui.shared.fittingScreen.fittingPanels.navigationPanel import NavigationPanel
     14 from eve.client.script.ui.shared.fittingScreen.fittingPanels.offensePanel import OffensePanel
     15 from eve.client.script.ui.shared.fittingScreen.fittingPanels.targetingPanel import TargetingPanel
     16 from eve.client.script.ui.shared.fittingScreen.priceLabel import LabelPriceLabelCont
     17 from eveui.decorators import lock_and_set_pending
     18 from signals.signalUtil import ChangeSignalConnect
     19 import inventorycommon.const as invConst
     20 from localization import GetByLabel
     21 import uthread
     22 import eve.client.script.ui.shared.pointerTool.pointerToolConst as pConst
     23 NO_HILITE_GROUPS_DICT = {invConst.groupRemoteSensorBooster: [dogmaConst.attributeCpu, dogmaConst.attributePower],
     24  invConst.groupRemoteSensorDamper: [dogmaConst.attributeCpu, dogmaConst.attributePower]}
     25 MENU_NAME_BY_UI_NAME = {pConst.UNIQUE_NAME_FITTING_CAP: 'Capacitor',
     26  pConst.UNIQUE_NAME_FITTING_OFFENSE: 'Offense',
     27  pConst.UNIQUE_NAME_FITTING_DEFENSE: 'Defense',
     28  pConst.UNIQUE_NAME_FITTING_NAVIGATION: 'Navigation',
     29  pConst.UNIQUE_NAME_FITTING_TARGETING: 'Targeting',
     30  pConst.UNIQUE_NAME_FITTING_DRONES: 'Drones',
     31  pConst.UNIQUE_NAME_FITTING_FIGHTERS: 'Fighters',
     32  pConst.UNIQUE_NAME_FITTING_FUEL: 'Fuel'}
     33 
     34 class StatsPanel(Container):
     35 
     36     def ApplyAttributes(self, attributes):
     37         Container.ApplyAttributes(self, attributes)
     38         self.subCont = Container(parent=self)
     39         self.controller = attributes.controller
     40         self.ChangeSignalConnection(connect=True)
     41         self.ConstructPriceLabel()
     42         self.CreateCapacitorPanel()
     43         self.CreateOffensePanel()
     44         self.CreateDefensePanel()
     45         self.CreateTargetingPanel()
     46         self.CreateNavigationPanel()
     47         self.CreateDronePanel()
     48         self.CreateFighterPanel()
     49         self.CreateFuelPanel()
     50         self.CreateExpandableMenus()
     51         uthread.new(self.UpdateStats)
     52 
     53     def ChangeSignalConnection(self, connect = True):
     54         signalAndCallback = [(self.controller.on_new_itemID, self.OnNewItemID),
     55          (self.controller.on_stats_changed, self.UpdateStatsOnSignal),
     56          (self.controller.on_drones_changed, self.UpdateStatsOnSignal),
     57          (self.controller.on_item_ghost_fitted, self.UpdateStatsOnSignal)]
     58         ChangeSignalConnect(signalAndCallback, connect)
     59 
     60     def ConstructPriceLabel(self):
     61         self.priceLabelCont = LabelPriceLabelCont(parent=self)
     62 
     63     def CreateCapacitorPanel(self):
     64         self.capacitorStatsParent = CapacitorPanel(name='capacitorStatsParent', controller=self.controller)
     65         return self.capacitorStatsParent
     66 
     67     def CreateOffensePanel(self):
     68         self.offenseStatsParent = OffensePanel(name='offenseStatsParent', tooltipName='DamagePerSecond', labelHint=GetByLabel('UI/Fitting/FittingWindow/ShipDpsTooltip'), controller=self.controller)
     69         return self.offenseStatsParent
     70 
     71     def CreateDefensePanel(self):
     72         self.defenceStatsParent = DefensePanel(name='defenceStatsParent', state=uiconst.UI_PICKCHILDREN, tooltipName='EffectiveHitPoints', labelHint=GetByLabel('UI/Fitting/FittingWindow/EffectiveHitpoints'), controller=self.controller)
     73         return self.defenceStatsParent
     74 
     75     def CreateTargetingPanel(self):
     76         self.targetingStatsParent = TargetingPanel(name='targetingStatsParent', tooltipName='MaxTargetingRange', controller=self.controller)
     77         return self.targetingStatsParent
     78 
     79     def CreateNavigationPanel(self):
     80         self.navigationStatsParent = NavigationPanel(name='navigationStatsParent', state=uiconst.UI_PICKCHILDREN, tooltipName='MaximumVelocity', labelHint=GetByLabel('UI/Fitting/FittingWindow/MaxVelocityHint'), controller=self.controller)
     81         return self.navigationStatsParent
     82 
     83     def CreateDronePanel(self):
     84         self.droneStatsParent = DronePanel(name='droneStatsParent', tooltipName='DamagePerSecondDrones', labelHint=GetByLabel('UI/Fitting/FittingWindow/ShipDpsTooltip'), controller=self.controller)
     85         return self.droneStatsParent
     86 
     87     def CreateFighterPanel(self):
     88         self.fighterStatsParent = FighterPanel(name='fighterStatsParent', tooltipName='DamagePerSecondDrones', labelHint=GetByLabel('UI/Fitting/FittingWindow/ShipDpsTooltip'), controller=self.controller)
     89         return self.fighterStatsParent
     90 
     91     def CreateFuelPanel(self):
     92         self.fuelStatsParent = FuelPanel(name='fuelStatsParent', tooltipName='FuelUsage', controller=self.controller)
     93         return self.fuelStatsParent
     94 
     95     def GetSingleMenuPanelInfo(self, menuDict):
     96         return (GetByLabel(menuDict['label']),
     97          menuDict['content'],
     98          menuDict['callback'],
     99          None,
    100          menuDict['maxHeight'],
    101          menuDict['headerContent'],
    102          False,
    103          menuDict.get('expandedByDefault', False),
    104          menuDict.get('uniqueUiName', None),
    105          menuDict.get('name', None))
    106 
    107     def GetMenuData(self):
    108         sizeFactor = fontconst.fontSizeFactor ** 0.1
    109         capInfo = self.GetSingleMenuPanelInfo({'label': 'UI/Fitting/FittingWindow/Capacitor',
    110          'content': self.capacitorStatsParent,
    111          'callback': self.LoadCapacitorStats,
    112          'maxHeight': 64 * sizeFactor,
    113          'headerContent': self.capacitorStatsParent.headerParent,
    114          'expandedByDefault': True,
    115          'uniqueUiName': pConst.UNIQUE_NAME_FITTING_CAP,
    116          'name': MENU_NAME_BY_UI_NAME[pConst.UNIQUE_NAME_FITTING_CAP]})
    117         offenseInfo = self.GetSingleMenuPanelInfo({'label': 'UI/Fitting/FittingWindow/Offense',
    118          'content': self.offenseStatsParent,
    119          'callback': self.LoadOffenseStats,
    120          'maxHeight': 50 * sizeFactor,
    121          'headerContent': self.offenseStatsParent.headerParent,
    122          'uniqueUiName': pConst.UNIQUE_NAME_FITTING_OFFENSE,
    123          'name': MENU_NAME_BY_UI_NAME[pConst.UNIQUE_NAME_FITTING_OFFENSE]})
    124         defenseInfo = self.GetSingleMenuPanelInfo({'label': 'UI/Fitting/FittingWindow/Defense',
    125          'content': self.defenceStatsParent,
    126          'callback': self.LoadDefenceStats,
    127          'maxHeight': 146 * sizeFactor,
    128          'headerContent': self.defenceStatsParent.headerParent,
    129          'uniqueUiName': pConst.UNIQUE_NAME_FITTING_DEFENSE,
    130          'name': MENU_NAME_BY_UI_NAME[pConst.UNIQUE_NAME_FITTING_DEFENSE]})
    131         targetingInfo = self.GetSingleMenuPanelInfo({'label': 'UI/Fitting/FittingWindow/Targeting',
    132          'content': self.targetingStatsParent,
    133          'callback': self.LoadTargetingStats,
    134          'maxHeight': 76 * sizeFactor,
    135          'headerContent': self.targetingStatsParent.headerParent,
    136          'uniqueUiName': pConst.UNIQUE_NAME_FITTING_TARGETING,
    137          'name': MENU_NAME_BY_UI_NAME[pConst.UNIQUE_NAME_FITTING_TARGETING]})
    138         menuData = [capInfo,
    139          offenseInfo,
    140          defenseInfo,
    141          targetingInfo]
    142         if self.controller.HasNavigationPanel():
    143             navigationInfo = self.GetSingleMenuPanelInfo({'label': 'UI/Fitting/FittingWindow/Navigation',
    144              'content': self.navigationStatsParent,
    145              'callback': self.LoadNavigationStats,
    146              'maxHeight': 76 * sizeFactor,
    147              'headerContent': self.navigationStatsParent.headerParent,
    148              'uniqueUiName': pConst.UNIQUE_NAME_FITTING_NAVIGATION,
    149              'name': MENU_NAME_BY_UI_NAME[pConst.UNIQUE_NAME_FITTING_NAVIGATION]})
    150             menuData += [navigationInfo]
    151         if self.controller.HasDronePanel():
    152             droneInfo = self.GetSingleMenuPanelInfo({'label': 'UI/Drones/Drones',
    153              'content': self.droneStatsParent,
    154              'callback': self.LoadDroneStats,
    155              'maxHeight': 90 * sizeFactor,
    156              'headerContent': self.droneStatsParent.headerParent,
    157              'uniqueUiName': pConst.UNIQUE_NAME_FITTING_DRONES,
    158              'name': MENU_NAME_BY_UI_NAME[pConst.UNIQUE_NAME_FITTING_DRONES]})
    159             menuData += [droneInfo]
    160         droneInfo = self.GetSingleMenuPanelInfo({'label': 'UI/Common/Fighters',
    161          'content': self.fighterStatsParent,
    162          'callback': self.LoadFighterStats,
    163          'maxHeight': 70 * sizeFactor,
    164          'headerContent': self.fighterStatsParent.headerParent,
    165          'uniqueUiName': pConst.UNIQUE_NAME_FITTING_FIGHTERS,
    166          'name': MENU_NAME_BY_UI_NAME[pConst.UNIQUE_NAME_FITTING_FIGHTERS]})
    167         menuData += [droneInfo]
    168         if self.controller.HasFuelPanel():
    169             fuelInfo = self.GetSingleMenuPanelInfo({'label': 'UI/Fitting/FittingWindow/Fuel',
    170              'content': self.fuelStatsParent,
    171              'callback': self.LoadFuelStats,
    172              'maxHeight': 60 * sizeFactor,
    173              'headerContent': self.fuelStatsParent.headerParent,
    174              'uniqueUiName': pConst.UNIQUE_NAME_FITTING_FUEL,
    175              'name': MENU_NAME_BY_UI_NAME[pConst.UNIQUE_NAME_FITTING_FUEL]})
    176             menuData += [fuelInfo]
    177         return menuData
    178 
    179     def CreateExpandableMenus(self):
    180         self.expandableMenu = ExpandableMenuContainer(parent=self.subCont, pos=(0, 0, 0, 0), clipChildren=True)
    181         self.expandableMenu.multipleExpanded = True
    182         menuData = self.GetMenuData()
    183         self.expandableMenu.Load(menuData=menuData, prefsKey='fittingRightside')
    184         self.ChangeDroneAndFighterPanelDisplays()
    185 
    186     def LoadDroneStats(self, initialLoad = False):
    187         if self.controller.HasDronePanel():
    188             self.droneStatsParent.LoadPanel(initialLoad=initialLoad)
    189 
    190     def LoadFighterStats(self, initialLoad = False):
    191         if self.controller.HasFighterBay():
    192             self.fighterStatsParent.LoadPanel(initialLoad=initialLoad)
    193 
    194     def LoadNavigationStats(self, initialLoad = False):
    195         if self.controller.HasNavigationPanel():
    196             self.navigationStatsParent.LoadPanel(initialLoad=initialLoad)
    197 
    198     def LoadTargetingStats(self, initialLoad = False):
    199         self.targetingStatsParent.LoadPanel(initialLoad=initialLoad)
    200 
    201     def LoadOffenseStats(self, initialLoad = False):
    202         self.offenseStatsParent.LoadPanel(initialLoad)
    203 
    204     def LoadFuelStats(self, initialLoad = False):
    205         if self.controller.HasFuelPanel():
    206             self.fuelStatsParent.LoadPanel(initialLoad=initialLoad)
    207 
    208     def UpdateOffenseStats(self):
    209         self.offenseStatsParent.UpdateOffenseStats()
    210 
    211     def UpdateDroneStats(self):
    212         if self.controller.HasDronePanel():
    213             self.droneStatsParent.UpdateDroneStats()
    214 
    215     def UpdateFighterStats(self):
    216         if self.controller.HasFighterBay():
    217             self.fighterStatsParent.UpdateFighterStats()
    218 
    219     def LoadDefenceStats(self, initialLoad = False):
    220         self.defenceStatsParent.LoadPanel(initialLoad)
    221 
    222     def LoadCapacitorStats(self, initialLoad = False):
    223         self.capacitorStatsParent.LoadPanel(initialLoad)
    224 
    225     def ExpandBestRepair(self, *args):
    226         self.defenceStatsParent.ExpandBestRepair(*args)
    227 
    228     def UpdateBestRepair(self):
    229         return self.defenceStatsParent.UpdateBestRepair()
    230 
    231     def UpdateNavigationPanel(self):
    232         if self.controller.HasNavigationPanel():
    233             self.navigationStatsParent.UpdateNavigationPanel()
    234 
    235     def UpdateTargetingPanel(self):
    236         self.targetingStatsParent.UpdateTargetingPanel()
    237 
    238     def UpdateCapacitor(self):
    239         self.capacitorStatsParent.UpdateCapacitorPanel()
    240 
    241     def UpdateDefensePanel(self):
    242         return self.defenceStatsParent.UpdateDefensePanel()
    243 
    244     def UpdateFuelPanel(self):
    245         if self.controller.HasFuelPanel():
    246             self.fuelStatsParent.UpdateFuelPanel()
    247 
    248     def UpdateStatsOnSignal(self):
    249         uthread.new(self.UpdateStats)
    250 
    251     @lock_and_set_pending()
    252     def UpdateStats(self):
    253         if not self.controller or not self.controller.CurrentShipIsLoaded():
    254             return
    255         dsp = getattr(self, 'defenceStatsParent', None)
    256         if not dsp or dsp.destroyed:
    257             return
    258         self.UpdateDefensePanel()
    259         self.UpdateBestRepair()
    260         self.UpdateNavigationPanel()
    261         self.UpdateTargetingPanel()
    262         self.UpdateCapacitor()
    263         self.UpdateOffenseStats()
    264         self.UpdateDroneStats()
    265         self.UpdateFighterStats()
    266         self.UpdateFuelPanel()
    267         uthread.new(self.priceLabelCont.UpdateLabel, self.controller)
    268 
    269     def MaxTargetRangeBonusMultiplier(self, typeID):
    270         for effect in dogma_data.get_type_effects(typeID):
    271             if effect.effectID in (dogmaConst.effectShipMaxTargetRangeBonusOnline, dogmaConst.effectMaxTargetRangeBonus):
    272                 return 1
    273 
    274     def ArmorOrShieldMultiplier(self, typeID):
    275         for effect in dogma_data.get_type_effects(typeID):
    276             if effect.effectID == dogmaConst.effectShieldResonanceMultiplyOnline:
    277                 return 1
    278 
    279     def ArmorShieldStructureMultiplierPostPercent(self, typeID):
    280         ret = []
    281         for effect in dogma_data.get_type_effects(typeID):
    282             if effect.effectID == dogmaConst.effectModifyArmorResonancePostPercent:
    283                 ret.append('armor')
    284             elif effect.effectID == dogmaConst.effectModifyShieldResonancePostPercent:
    285                 ret.append('shield')
    286             elif effect.effectID == dogmaConst.effectModifyHullResonancePostPercent:
    287                 ret.append('structure')
    288 
    289         return ret
    290 
    291     def OnNewItemID(self, *args):
    292         if self.destroyed:
    293             return
    294         self.ChangeDroneAndFighterPanelDisplays()
    295         for eachPanel in [self.capacitorStatsParent,
    296          self.offenseStatsParent,
    297          self.defenceStatsParent,
    298          self.targetingStatsParent,
    299          self.navigationStatsParent,
    300          self.droneStatsParent,
    301          self.fighterStatsParent]:
    302             eachPanel.SetDogmaLocation()
    303 
    304         self.UpdateStats()
    305 
    306     def ChangeDroneAndFighterPanelDisplays(self):
    307         if self.controller.HasFighterBay():
    308             self.expandableMenu.HideMenuByLabel(GetByLabel('UI/Drones/Drones'))
    309             self.expandableMenu.ShowMenuByLabel(GetByLabel('UI/Common/Fighters'))
    310         else:
    311             self.expandableMenu.HideMenuByLabel(GetByLabel('UI/Common/Fighters'))
    312             self.expandableMenu.ShowMenuByLabel(GetByLabel('UI/Drones/Drones'))
    313 
    314     def IsPanelExpanded(self, uniqueUiName):
    315         if self.expandableMenu and not self.expandableMenu.destroyed:
    316             return self.expandableMenu.IsMenuExpanded(uniqueUiName)
    317         return False
    318 
    319     def Close(self):
    320         with EatSignalChangingErrors(errorMsg='StatsPanelGhost'):
    321             self.ChangeSignalConnection(connect=False)
    322         Container.Close(self)