baseTacticalEntry.py (6299B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\baseTacticalEntry.py 2 import carbonui.const as uiconst 3 import evetypes 4 import mathext 5 import telemetry 6 from carbon.client.script.util.misc import GetAttrs 7 from carbon.common.script.util import timerstuff 8 from carbonui.primitives.container import Container 9 from carbonui.primitives.fill import Fill 10 from carbonui.primitives.line import Line 11 from eve.client.script.ui.control import eveLabel 12 from eve.client.script.parklife import states as state 13 from eve.client.script.ui.control.entries.generic import Generic 14 from eve.client.script.util.bubble import InBubble 15 from eveservices.menu import GetMenuService 16 17 class BaseTacticalEntry(Generic): 18 __guid__ = 'listentry.BaseTacticalEntry' 19 __notifyevents__ = ['OnStateChange'] 20 __update_on_reload__ = 1 21 gaugesInited = 0 22 gaugesVisible = 0 23 24 def Startup(self, *args): 25 Generic.Startup(self, *args) 26 sm.RegisterNotify(self) 27 28 @telemetry.ZONE_METHOD 29 def Load(self, node): 30 data = node 31 selected, = sm.GetService('stateSvc').GetStates(data.itemID, [state.selected]) 32 node.selected = selected 33 Generic.Load(self, node) 34 self.sr.label.left = 20 + 16 * data.sublevel 35 self.UpdateDamage() 36 self.sr.label.Update() 37 38 def UpdateDamage(self): 39 if self.destroyed: 40 self.sr.dmgTimer = None 41 return 42 if not InBubble(self.GetShipID()): 43 self.HideDamageDisplay() 44 return False 45 d = self.sr.node 46 if not getattr(d, 'slimItem', None): 47 categoryID = evetypes.GetCategoryID(d.typeID) 48 else: 49 slimItem = d.slimItem() 50 if not slimItem: 51 self.HideDamageDisplay() 52 return False 53 categoryID = slimItem.categoryID 54 shipID = self.GetShipID() 55 ret = False 56 if shipID and categoryID in (const.categoryShip, const.categoryDrone): 57 dmg = self.GetDamage(shipID) 58 if dmg is not None: 59 ret = self.SetDamageState(dmg) 60 if self.sr.dmgTimer is None: 61 self.sr.dmgTimer = timerstuff.AutoTimer(1000, self.UpdateDamage) 62 else: 63 self.HideDamageDisplay() 64 return ret 65 66 def ShowDamageDisplay(self): 67 self.InitGauges() 68 69 def HideDamageDisplay(self): 70 if self.gaugesInited: 71 self.sr.gaugeParent.state = uiconst.UI_HIDDEN 72 73 def GetDamage(self, itemID): 74 bp = sm.GetService('michelle').GetBallpark() 75 if bp is None: 76 self.sr.dmgTimer = None 77 return 78 ret = bp.GetDamageState(itemID) 79 if ret is None: 80 self.sr.dmgTimer = None 81 return ret 82 83 def GetHeight(self, *args): 84 node, width = args 85 node.height = node.Get('height', 0) or 32 86 return node.height 87 88 def GetMenu(self): 89 return GetMenuService().CelestialMenu(self.sr.node.itemID) 90 91 def GetShipID(self): 92 if self.sr.node: 93 return self.sr.node.itemID 94 95 def OnMouseEnter(self, *args): 96 Generic.OnMouseEnter(self, *args) 97 if self.sr.node: 98 sm.GetService('stateSvc').SetState(self.GetIdForItem(), state.mouseOver, 1) 99 100 def OnMouseExit(self, *args): 101 Generic.OnMouseExit(self, *args) 102 if self.sr.node: 103 sm.GetService('stateSvc').SetState(self.GetIdForItem(), state.mouseOver, 0) 104 105 def GetIdForItem(self): 106 return self.sr.node.itemID 107 108 def OnStateChange(self, itemID, flag, isActive, *args): 109 if GetAttrs(self, 'sr', 'node') is None: 110 return 111 if self.sr.node.itemID != itemID: 112 return 113 if flag == state.mouseOver: 114 if isActive: 115 self.ShowHilite() 116 else: 117 self.HideHilite() 118 elif flag == state.selected: 119 if isActive: 120 self.Select() 121 else: 122 self.sr.node.scroll.DeselectAll() 123 124 def Select(self, *args): 125 Generic.Select(self, *args) 126 self.sr.node.selected = True 127 128 def Deselect(self, *args): 129 Generic.Deselect(self, *args) 130 self.sr.node.selected = False 131 132 def SetDamageState(self, state): 133 self.InitGauges() 134 visible = 0 135 gotDmg = False 136 for i, gauge in enumerate((self.sr.gauge_shield, self.sr.gauge_armor, self.sr.gauge_struct)): 137 if state[i] is None: 138 gauge.state = uiconst.UI_HIDDEN 139 else: 140 oldWidth = gauge.sr.bar.width 141 damagePerc = round(state[i], 3) 142 damagePerc = mathext.clamp(damagePerc, 0.0, 1.0) 143 gauge.sr.bar.width = int(gauge.width * damagePerc) 144 if gauge.sr.bar.width < oldWidth: 145 gotDmg = True 146 gauge.state = uiconst.UI_DISABLED 147 visible += 1 148 149 self.gaugesVisible = visible 150 return gotDmg 151 152 def InitGauges(self): 153 if self.gaugesInited: 154 self.sr.gaugeParent.state = uiconst.UI_NORMAL 155 return 156 par = Container(name='gauges', parent=self, align=uiconst.TORIGHT, width=68, height=0, state=uiconst.UI_NORMAL, top=2, idx=0) 157 Container(name='push', parent=par, align=uiconst.TORIGHT, width=4) 158 for each in ('STRUCT', 'ARMOR', 'SHIELD'): 159 g = Container(name=each, align=uiconst.TOTOP, width=64, height=9, left=-2) 160 Container(name='push', parent=g, align=uiconst.TOBOTTOM, height=2) 161 eveLabel.EveLabelSmall(text=each[:2], parent=g, left=68, top=-1, width=64, height=12, state=uiconst.UI_DISABLED) 162 g.name = 'gauge_%s' % each.lower() 163 Line(parent=g, align=uiconst.TOTOP) 164 Line(parent=g, align=uiconst.TOBOTTOM) 165 Line(parent=g, align=uiconst.TOLEFT) 166 Line(parent=g, align=uiconst.TORIGHT) 167 g.sr.bar = Fill(parent=g, align=uiconst.TOLEFT) 168 Fill(parent=g, color=(158 / 256.0, 169 11 / 256.0, 170 14 / 256.0, 171 1.0)) 172 par.children.append(g) 173 setattr(self.sr, 'gauge_%s' % each.lower(), g) 174 175 self.sr.gaugeParent = par 176 self.gaugesInited = 1