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

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