squadronManagementCont.py (15496B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\squadrons\squadronManagementCont.py 2 from carbon.common.lib.const import SEC 3 from carbonui.primitives.container import Container 4 from carbonui.primitives.fill import Fill 5 import carbonui.const as uiconst 6 from carbonui.primitives.sprite import Sprite 7 from carbonui.util.color import Color 8 from carbonui.control.buttonIcon import ButtonIcon 9 from eve.client.script.ui.control.eveLabel import EveHeaderSmall, EveLabelSmall 10 from eve.client.script.ui.control.gauge import Gauge 11 from eve.client.script.ui.inflight.squadrons.fightersHealthGaugeCont import FightersHealthGauge 12 from eve.client.script.ui.inflight.squadrons.shipFighterState import GetShipFighterState 13 from eve.client.script.ui.inflight.squadrons.squadronManagementController import SquadronMgmtController 14 from eve.common.script.mgt.fighterConst import TUBE_STATE_EMPTY, COLOR_BY_STATE, LABEL_BY_STATE, TUBE_STATE_RECALLING, TUBE_STATE_LAUNCHING, COLOR_INSPACE, COLOR_RETURNING, TUBE_STATE_READY, TUBE_STATE_INSPACE, COLOR_OPEN, TUBE_STATE_LANDING 15 from fighters import SLOTNUMBER_BY_TUBEFLAG 16 import gametime 17 from localization import GetByLabel 18 from carbonui.uicore import uicore 19 from eve.client.script.ui.inflight.squadrons.squadronMenu import GetSquadronMenu 20 21 class FighterLaunchControlCont(Container): 22 default_height = 196 23 default_width = 86 24 default_align = uiconst.TOLEFT 25 26 def ApplyAttributes(self, attributes): 27 Container.ApplyAttributes(self, attributes) 28 self.controller = SquadronMgmtController() 29 self.shipFighterState = GetShipFighterState() 30 self.tubeFlagID = attributes.tubeFlagID 31 self.leftTube = Sprite(parent=self, texturePath='res:/UI/Texture/classes/CarrierBay/tubeSideElement.png', align=uiconst.TOLEFT_NOPUSH, width=15) 32 self.rightTube = Sprite(parent=self, texturePath='res:/UI/Texture/classes/CarrierBay/tubeSideElementRIGHT.png', align=uiconst.TORIGHT_NOPUSH, width=15) 33 inSpaceCont = Container(name='inSpaceCont', parent=self, height=86, align=uiconst.TOTOP) 34 inSpaceCont.OnDropData = self.OnDropToSpace 35 inSpaceCont.GetMenu = self.GetMenu 36 self.squadronNumber = SquadronNumber(parent=inSpaceCont, top=1, left=1) 37 self.squadronNumber.SetText(self.tubeFlagID) 38 self.inStationCont = Container(parent=inSpaceCont, align=uiconst.TOALL) 39 cantLaunchIcon = Sprite(parent=self.inStationCont, width=44, height=44, align=uiconst.CENTER, texturePath='res:/UI/Texture/classes/CarrierBay/unableToLaunch.png') 40 self.stateCont = Container(name='stateCont', parent=self, height=24, align=uiconst.TOTOP, state=uiconst.UI_NORMAL) 41 self.stateContBG = Fill(bgParent=self.stateCont, color=(0, 0, 0, 0)) 42 deckCont = Container(parent=self, height=86, align=uiconst.TOTOP, state=uiconst.UI_NORMAL) 43 deckCont.OnDropData = self.OnDropToTube 44 deckCont.GetMenu = self.GetMenu 45 self.tubeStatusLabel = EveHeaderSmall(parent=self.stateCont, align=uiconst.CENTER, text='') 46 self.loadingGauge = Gauge(parent=self.stateCont, align=uiconst.CENTERBOTTOM, backgroundColor=(0, 0, 0, 1), color=(0.2, 0.2, 0.2, 0.5), padLeft=1, padRight=1, top=1, width=75, value=0.0, useRealTime=False) 47 self.loadingGauge.display = False 48 spaceColor = Color(*COLOR_INSPACE) 49 spaceColor.a = 1.0 50 self.launchIcon = ButtonIcon(name='launchIcon', parent=inSpaceCont, align=uiconst.CENTER, width=86, height=86, iconSize=44, texturePath='res:/UI/Texture/classes/CarrierBay/tubeLaunch_Up.png', downTexture='res:/UI/Texture/classes/CarrierBay/tubeLaunch_Down.png', hoverTexture='res:/UI/Texture/classes/CarrierBay/tubeLaunch_Over.png', iconColor=spaceColor.GetRGBA(), showGlow=False, hint=GetByLabel('UI/Inventory/Fighters/LaunchFighterHint')) 51 self.launchIcon.OnClick = self.LaunchFightersFromTube 52 self.launchIcon.OnDropData = self.OnDropToSpace 53 returnColor = Color(*COLOR_RETURNING) 54 returnColor.a = 1.0 55 self.scoopIcon = ButtonIcon(parent=deckCont, name='scoopIcon', align=uiconst.CENTER, width=86, height=86, iconSize=44, texturePath='res:/UI/Texture/classes/CarrierBay/tubeRecall_Up.png', downTexture='res:/UI/Texture/classes/CarrierBay/tubeRecall_Down.png', hoverTexture='res:/UI/Texture/classes/CarrierBay/tubeRecall_Over.png', iconColor=returnColor.GetRGBA(), showGlow=False, hint=GetByLabel('UI/Inventory/Fighters/RecallFighterHint')) 56 self.scoopIcon.OnClick = self.RecallFighterToTube 57 self.scoopIcon.OnDropData = self.OnDropToTube 58 self.landingStrip = LandingStrip(parent=deckCont) 59 self.landingStrip.display = False 60 self.emptyTubeIcon = ButtonIcon(parent=deckCont, name='emptyTubeIcon', align=uiconst.CENTER, width=86, height=86, iconSize=44, texturePath='res:/UI/Texture/classes/CarrierBay/tubeOpen_Up.png', downTexture='res:/UI/Texture/classes/CarrierBay/tubeOpen_Down.png', hoverTexture='res:/UI/Texture/classes/CarrierBay/tubeOpen_Over.png', showGlow=False, hint=GetByLabel('UI/Inventory/Fighters/AddFighterHint')) 61 self.emptyTubeIcon.OnDropData = self.OnDropToTube 62 self.emptyTubeIcon.GetMenu = self.GetMenu 63 self.squadronInSpace = FightersHealthGauge(name='squadronInSpace', parent=inSpaceCont, align=uiconst.CENTER, width=86, height=86, state=TUBE_STATE_INSPACE, tubeFlagID=self.tubeFlagID) 64 self.squadronInSpace.display = False 65 self.squadronInSpace.GetMenu = self.GetMenu 66 self.squadronInTube = FightersHealthGauge(name='squadronInTube', parent=deckCont, align=uiconst.CENTER, width=86, height=86, state=TUBE_STATE_READY, tubeFlagID=self.tubeFlagID) 67 self.squadronInTube.OnDropData = self.OnDropToTube 68 self.squadronInTube.display = False 69 self.squadronInTube.GetMenu = self.GetMenu 70 self.launchingStrip = LaunchingStrip(parent=inSpaceCont) 71 self.launchingStrip.display = False 72 self.UpdateLaunchTubeContentUI() 73 self.UpdateLaunchTubeStateUI() 74 self.UpdateInSpaceUI() 75 self.shipFighterState.signalOnFighterTubeStateUpdate.connect(self.OnFighterTubeStateUpdate) 76 self.shipFighterState.signalOnFighterTubeContentUpdate.connect(self.OnFighterTubeContentUpdate) 77 self.shipFighterState.signalOnFighterInSpaceUpdate.connect(self.OnFighterInSpaceUpdate) 78 self.shipFighterState.signalOnShipLocationChange.connect(self.OnShipLocationChange) 79 80 def Close(self): 81 self.shipFighterState.signalOnFighterTubeStateUpdate.disconnect(self.OnFighterTubeStateUpdate) 82 self.shipFighterState.signalOnFighterTubeContentUpdate.disconnect(self.OnFighterTubeContentUpdate) 83 self.shipFighterState.signalOnFighterInSpaceUpdate.disconnect(self.OnFighterInSpaceUpdate) 84 self.shipFighterState.signalOnShipLocationChange.disconnect(self.OnShipLocationChange) 85 86 def LaunchFightersFromTube(self): 87 self.controller.LaunchFightersFromTube(self.tubeFlagID) 88 89 def RecallFighterToTube(self): 90 fighterInSpace = self.shipFighterState.GetFightersInSpace(self.tubeFlagID) 91 self.controller.RecallFighterToTube(fighterInSpace.itemID) 92 93 def ReturnAndOrbit(self): 94 fighterInSpace = self.shipFighterState.GetFightersInSpace(self.tubeFlagID) 95 sm.GetService('fighters').CmdReturnAndOrbit([fighterInSpace.itemID]) 96 97 def OnDropToSpace(self, dragSource, dragData): 98 data = dragData[0] 99 if getattr(data, 'tubeFlagID', None) == self.tubeFlagID and getattr(data, 'squadronState', None) == TUBE_STATE_READY: 100 self.LaunchFightersFromTube() 101 102 def OnDropToTube(self, dragSource, dragData): 103 data = dragData[0] 104 guid = getattr(data, '__guid__', None) 105 if guid == 'uicls.FightersHealthGauge': 106 if data.tubeFlagID == self.tubeFlagID and data.squadronState == TUBE_STATE_INSPACE: 107 self.RecallFighterToTube() 108 elif guid in ('xtriui.InvItem', 'listentry.InvItem'): 109 tubeStatus = self.shipFighterState.GetTubeStatus(self.tubeFlagID) 110 if tubeStatus.statusID in (TUBE_STATE_EMPTY, TUBE_STATE_READY): 111 fighterID = data.itemID 112 self.controller.LoadFightersToTube(fighterID, self.tubeFlagID) 113 114 def UnloadTubeToFighterBay(self): 115 self.controller.UnloadTubeToFighterBay(self.tubeFlagID) 116 117 def UpdateLaunchTubeContentUI(self): 118 fighterInTube = self.shipFighterState.GetFightersInTube(self.tubeFlagID) 119 if fighterInTube is not None: 120 self.squadronInTube.display = True 121 if not ShouldShowDockedUI(): 122 self.launchIcon.display = True 123 self.scoopIcon.display = False 124 self.landingStrip.display = False 125 self.squadronInTube.LoadFighterToSquadron(fighterInTube.typeID) 126 self.squadronInTube.SetSquadronSize(fighterInTube.squadronSize) 127 else: 128 self.squadronInTube.display = False 129 self.launchIcon.display = False 130 131 def ShowStationUI(self): 132 self.inStationCont.display = True 133 self.launchIcon.display = False 134 135 def UpdateLaunchTubeStateUI(self): 136 tubeStatus = self.shipFighterState.GetTubeStatus(self.tubeFlagID) 137 self.UpdateStatusUI(tubeStatus) 138 if tubeStatus.endTime: 139 if tubeStatus.statusID in (TUBE_STATE_RECALLING, TUBE_STATE_LANDING): 140 self.landingStrip.display = True 141 self.scoopIcon.display = False 142 elif tubeStatus.statusID == TUBE_STATE_LAUNCHING: 143 self.launchingStrip.display = True 144 self.launchIcon.display = False 145 else: 146 self.loadingGauge.display = True 147 now = gametime.GetSimTime() 148 duration = float(tubeStatus.endTime - tubeStatus.startTime) 149 loadingProgress = max(0.0, min(1.0, (now - tubeStatus.startTime) / duration)) 150 self.loadingGauge.SetValue(loadingProgress, animate=False) 151 remainingTime = tubeStatus.endTime - now 152 remainingTimeSeconds = max(float(remainingTime) / SEC, 0.1) 153 self.loadingGauge.SetValueTimed(1.0, remainingTimeSeconds) 154 self.tubeStatusLabel.top = -2 155 else: 156 self.loadingGauge.SetValue(0) 157 self.loadingGauge.display = False 158 self.landingStrip.display = False 159 self.launchingStrip.display = False 160 self.tubeStatusLabel.top = 0 161 if tubeStatus.statusID == TUBE_STATE_EMPTY: 162 self.emptyTubeIcon.display = True 163 self.scoopIcon.display = False 164 self.squadronNumber.SetColor(True) 165 else: 166 self.emptyTubeIcon.display = False 167 self.squadronNumber.SetColor(False) 168 169 def UpdateStatusUI(self, tubeStatus): 170 stateText = LABEL_BY_STATE[tubeStatus.statusID] 171 self.tubeStatusLabel.text = GetByLabel(stateText) 172 if ShouldShowDockedUI(): 173 stateColor = Color(*COLOR_OPEN) 174 else: 175 stateColor = Color(*COLOR_BY_STATE[tubeStatus.statusID]) 176 self.leftTube.SetRGBA(*stateColor.GetRGBA()) 177 self.rightTube.SetRGBA(*stateColor.GetRGBA()) 178 stateColor.a = 0.8 179 self.tubeStatusLabel.SetTextColor(stateColor.GetRGBA()) 180 self.loadingGauge.SetColor(stateColor.GetRGBA()) 181 182 def UpdateInSpaceUI(self): 183 if ShouldShowDockedUI(): 184 self.ShowStationUI() 185 return 186 self.inStationCont.display = False 187 fighterInSpace = self.shipFighterState.GetFightersInSpace(self.tubeFlagID) 188 if fighterInSpace is not None: 189 self.scoopIcon.display = True 190 self.squadronInSpace.display = True 191 self.squadronInSpace.LoadFighterToSquadron(fighterInSpace.typeID) 192 self.squadronInSpace.SetSquadronSize(fighterInSpace.squadronSize) 193 else: 194 self.scoopIcon.display = False 195 self.squadronInSpace.display = False 196 197 def GetMenu(self): 198 return GetSquadronMenu(self) 199 200 def OnFighterTubeStateUpdate(self, tubeFlagID): 201 if tubeFlagID == self.tubeFlagID: 202 self.UpdateLaunchTubeStateUI() 203 204 def OnFighterTubeContentUpdate(self, tubeFlagID): 205 if tubeFlagID == self.tubeFlagID: 206 self.UpdateLaunchTubeContentUI() 207 208 def OnFighterInSpaceUpdate(self, fighterID, tubeFlagID): 209 if tubeFlagID == self.tubeFlagID: 210 self.UpdateInSpaceUI() 211 212 def OnShipLocationChange(self): 213 self.UpdateLaunchTubeContentUI() 214 self.UpdateLaunchTubeStateUI() 215 self.UpdateInSpaceUI() 216 217 def LoadFighterToTube(self, fighterID): 218 self.controller.LoadFightersToTube(fighterID, self.tubeFlagID) 219 220 def AbandonFighter(self): 221 fighterInSpace = self.shipFighterState.GetFightersInSpace(self.tubeFlagID) 222 sm.GetService('fighters').AbandonFighter(fighterInSpace.itemID) 223 224 225 class StripCont(Container): 226 default_height = 86 227 default_width = 86 228 default_align = uiconst.TOPLEFT 229 default_lightTexture = None 230 default_gradientTexture = None 231 default_startVal = (0.0, -1.0) 232 default_endVal = (0.0, 1.0) 233 default_textureAlign = uiconst.CENTERTOP 234 235 def ApplyAttributes(self, attributes): 236 Container.ApplyAttributes(self, attributes) 237 stripHeight = 9 238 top = 6 239 for i in xrange(8): 240 sprite = Sprite(parent=self, align=self.default_textureAlign, width=35, height=stripHeight, top=top, texturePath=self.default_lightTexture, state=uiconst.UI_DISABLED) 241 offset = 0.1 * i 242 uicore.animations.SpMaskTo(sprite, startVal=self.default_startVal, endVal=self.default_endVal, texturePath=self.default_gradientTexture, duration=1.0, loops=uiconst.ANIM_REPEAT, timeOffset=offset) 243 top += stripHeight 244 245 246 class LandingStrip(StripCont): 247 default_lightTexture = 'res:/UI/Texture/classes/CarrierBay/animLightsLanding.png' 248 default_gradientTexture = 'res:/UI/Texture/Classes/Animations/maskToGradientDown.png' 249 default_startVal = (0.0, -1.0) 250 default_endVal = (0.0, 1.0) 251 default_textureAlign = uiconst.CENTERTOP 252 253 254 class LaunchingStrip(StripCont): 255 default_lightTexture = 'res:/UI/Texture/classes/CarrierBay/animLightsLaunch.png' 256 default_gradientTexture = 'res:/UI/Texture/Classes/Animations/maskToGradientUp.png' 257 default_startVal = (0.0, 1.0) 258 default_endVal = (0.0, -1.0) 259 default_textureAlign = uiconst.CENTERBOTTOM 260 261 262 class SquadronNumber(Container): 263 default_width = 14 264 default_height = 14 265 default_align = uiconst.TOPLEFT 266 267 def ApplyAttributes(self, attributes): 268 Container.ApplyAttributes(self, attributes) 269 self.squadNrText = EveLabelSmall(parent=self, left=4, top=2) 270 self.squadNrSprite = Sprite(parent=self, align=uiconst.TOPLEFT, texturePath='res:/UI/Texture/classes/ShipUI/Fighters/squadNumberFlag.png', pos=(1, 1, 14, 14)) 271 272 def SetText(self, tubeFlagID): 273 squadronNumber = SLOTNUMBER_BY_TUBEFLAG[tubeFlagID] 274 self.squadNrText.text = squadronNumber 275 276 def SetColor(self, isEmpty = False): 277 if isEmpty or ShouldShowDockedUI(): 278 self.squadNrSprite.color = (0.5, 0.5, 0.5, 0.5) 279 else: 280 self.squadNrSprite.color = COLOR_INSPACE 281 self.squadNrSprite.SetAlpha(0.7) 282 283 284 def ShouldShowDockedUI(): 285 if session.stationid: 286 return True 287 if session.structureid and session.shipid != session.structureid: 288 return True 289 return False