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)