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

planetUILinks.py (12539B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\planet\planetUILinks.py
      2 import geo2
      3 import localization
      4 import trinity
      5 from carbonui import uiconst
      6 from carbonui.primitives.bracket import Bracket
      7 from carbonui.primitives.fill import Fill
      8 from carbonui.util.color import Color
      9 from eve.client.script.ui.control.eveLabel import EveLabelSmall
     10 from eve.client.script.ui.shared.planet.planetCommon import PLANET_COLOR_LINKEDITMODE
     11 from eve.client.script.ui.shared.planet.planetConst import LINK_COLOR_BASE, LINK_COLOR_DEFAULT, LINK_COLOR_INACTIVE, LINK_COLOR_HOVER, LINK_COLOR_ROUTED
     12 from eve.common.script.planet.surfacePoint import SurfacePoint
     13 from utillib import KeyVal
     14 LINK_WIDTH = 6.0
     15 LINK_OFFSET = 0.0006
     16 LINK_FLOWSPEED = 0.002
     17 LINK_SEGMENTRATIO = 25.0
     18 
     19 class LinkBase:
     20 
     21     def __init__(self, lsName, surfacePoint1, surfacePoint2, color = LINK_COLOR_DEFAULT):
     22         self.destroyed = False
     23         self.state = KeyVal(mouseHover=False, link1AsRoute=False, link2AsRoute=False, selected=False, link1Active=False, link2Active=False)
     24         self.lsName = lsName
     25         self.clDrawer = sm.GetService('planetUI').curveLineDrawer
     26         self.length = surfacePoint1.GetDistanceToOther(surfacePoint2)
     27         self.flowSpeed = LINK_FLOWSPEED / self.length
     28         self.texWidth = 1200.0 * self.length
     29         self.linkGraphicID = self.clDrawer.DrawArc(lsName, surfacePoint2, surfacePoint1, LINK_WIDTH * 0.5, LINK_COLOR_BASE, LINK_COLOR_BASE)
     30         numSegments = max(1, int(self.length * LINK_SEGMENTRATIO))
     31         self.clDrawer.SetLineSetNumSegments(lsName, self.linkGraphicID, numSegments)
     32         self.SetAnimation(color=color, isActive=True)
     33 
     34     def SetAnimation(self, color, isActive, speed = 1.0):
     35         self.clDrawer.ChangeLineAnimation(self.lsName, self.linkGraphicID, color, speed * self.flowSpeed, self.texWidth)
     36         self.clDrawer.SubmitLineset(self.lsName)
     37 
     38     def Remove(self):
     39         self.destroyed = True
     40         self.clDrawer.RemoveLine(self.lsName, self.linkGraphicID)
     41 
     42 
     43 class Link:
     44 
     45     def __init__(self, surfacePoint1, surfacePoint2, parentID, childID, typeID, link = None):
     46         self.destroyed = False
     47         self.link = link
     48         self.state = KeyVal(mouseHover=False, link1AsRoute=False, link2AsRoute=False, selected=False, link1Active=False, link2Active=False)
     49         self.clDrawer = sm.GetService('planetUI').curveLineDrawer
     50         self.sp1A, self.sp1B, self.sp2A, self.sp2B, self.surfacePoint = self._GetLinkEndPoints(surfacePoint1, surfacePoint2)
     51         self.length = surfacePoint1.GetDistanceToOther(surfacePoint2)
     52         self.IDTuple = (childID, parentID)
     53         self.typeID = typeID
     54         self.flowSpeed = LINK_FLOWSPEED / self.length
     55         self.texWidth = 600.0 * self.length
     56         self.currentRouteVolume = None
     57         self.linkGraphicID1 = self.clDrawer.DrawArc('links', self.sp1A, self.sp1B, LINK_WIDTH, LINK_COLOR_BASE, LINK_COLOR_BASE)
     58         self.linkGraphicID2 = self.clDrawer.DrawArc('links', self.sp2B, self.sp2A, LINK_WIDTH, LINK_COLOR_BASE, LINK_COLOR_BASE)
     59         numSegments = max(1, int(self.length * LINK_SEGMENTRATIO))
     60         self.clDrawer.SetLineSetNumSegments('links', self.linkGraphicID1, numSegments)
     61         self.clDrawer.SetLineSetNumSegments('links', self.linkGraphicID2, numSegments)
     62         self.clDrawer.SubmitLineset('links')
     63         self.graphicIDbyID = {(childID, parentID): self.linkGraphicID1,
     64          (parentID, childID): self.linkGraphicID2}
     65         self._InitInfoBracket()
     66         self.state.link1Active, self.state.link2Active = self._GetLinksActiveState()
     67         self.RenderAccordingToState()
     68 
     69     def _InitInfoBracket(self):
     70         self.infoBracket = Bracket()
     71         self.infoBracket.name = '__inflightbracket'
     72         self.infoBracket.align = uiconst.ABSOLUTE
     73         self.infoBracket.state = uiconst.UI_DISABLED
     74         self.infoBracket.dock = False
     75         self.infoBracket.display = False
     76         pad = 2
     77         self.infoBracket.padding = (pad,
     78          pad,
     79          pad,
     80          pad)
     81         self.infoBracket.trackTransform = trinity.EveTransform()
     82         self.infoBracket.trackTransform.name = 'LinkInfoBracket'
     83         t = self.surfacePoint.GetAsXYZTuple()
     84         scale = 1.01
     85         self.infoBracket.trackTransform.translation = (t[0] * scale, t[1] * scale, t[2] * scale)
     86         self.bracketCurveSet = sm.GetService('planetUI').myPinManager.bracketCurveSet
     87         self.bracketCurveSet.curves.append(self.infoBracket.projectBracket)
     88         sm.GetService('planetUI').planetTransform.children.append(self.infoBracket.trackTransform)
     89         sm.GetService('planetUI').pinInfoParent.children.insert(0, self.infoBracket)
     90         self.infoText = EveLabelSmall(text='', parent=self.infoBracket, align=uiconst.TOPLEFT, width=self.infoBracket.width, left=pad, top=pad, color=Color.WHITE, state=uiconst.UI_NORMAL)
     91         self._UpdateInfoBracket()
     92         self._ResizeInfoBracket()
     93         Fill(parent=self.infoBracket, color=(0.0, 0.0, 0.0, 0.5))
     94         self.infoBracket.state = uiconst.UI_HIDDEN
     95 
     96     def _ResizeInfoBracket(self):
     97         pad = 2
     98         l, t, w, h = self.infoText.GetAbsolute()
     99         if self.infoBracket:
    100             self.infoBracket.width = w + pad * 2
    101             self.infoBracket.height = h + pad * 2 - 2
    102 
    103     def _UpdateInfoBracket(self):
    104         linkBandwidthUsage = self.link.GetBandwidthUsage()
    105         if self.currentRouteVolume is not None:
    106             addedPercentage = self.currentRouteVolume / self.link.GetTotalBandwidth() * 100.0
    107             if self.currentRouteVolume + linkBandwidthUsage > self.link.GetTotalBandwidth():
    108                 addedText = localization.GetByLabel('UI/PI/Common/LinkCapacityAddedInvalid', addedPercentage=addedPercentage)
    109             else:
    110                 addedText = localization.GetByLabel('UI/PI/Common/LinkCapacityAddedOK', addedPercentage=addedPercentage)
    111         else:
    112             addedText = ''
    113         usedPercentage = linkBandwidthUsage / self.link.GetTotalBandwidth() * 100.0
    114         bandwidthUsage = localization.GetByLabel('UI/PI/Common/LinkCapacityUsed', usedPercentage=usedPercentage, addedText=addedText)
    115         self.infoText.text = bandwidthUsage
    116         self._ResizeInfoBracket()
    117 
    118     def _GetLinkEndPoints(self, sp1, sp2):
    119         p1 = geo2.Vector(*sp1.GetAsXYZTuple())
    120         p2 = geo2.Vector(*sp2.GetAsXYZTuple())
    121         vecDiff = p2 - p1
    122         pOffset = geo2.Vec3Cross(p1, vecDiff)
    123         pOffset = geo2.Vec3Normalize(pOffset)
    124         pOffset = geo2.Vec3Scale(pOffset, LINK_OFFSET)
    125         link1Start = geo2.Vec3Normalize(p1 + pOffset)
    126         link1End = geo2.Vec3Normalize(p2 + pOffset)
    127         link2Start = geo2.Vec3Normalize(p1 - pOffset)
    128         link2End = geo2.Vec3Normalize(p2 - pOffset)
    129         centerPoint = geo2.Vec3Normalize(p1 + vecDiff * 0.5)
    130         sp = SurfacePoint
    131         return (sp(*link1Start),
    132          sp(*link1End),
    133          sp(*link2Start),
    134          sp(*link2End),
    135          sp(*centerPoint))
    136 
    137     def RenderAccordingToState(self):
    138         if self.destroyed:
    139             return
    140         state = self.state
    141         if state.mouseHover or state.selected:
    142             self.SetLinkAppearance(LINK_COLOR_HOVER)
    143             self._UpdateInfoBracket()
    144             self.infoBracket.state = uiconst.UI_DISABLED
    145         elif state.link1AsRoute or state.link2AsRoute:
    146             if state.link1AsRoute:
    147                 self.SetLinkAppearance(LINK_COLOR_ROUTED, self.linkGraphicID1, speed=3.0)
    148             if state.link2AsRoute:
    149                 self.SetLinkAppearance(LINK_COLOR_ROUTED, self.linkGraphicID2, speed=3.0)
    150             self._UpdateInfoBracket()
    151             self.infoBracket.state = uiconst.UI_DISABLED
    152         else:
    153             if self.link.IsEditModeLink():
    154                 color = PLANET_COLOR_LINKEDITMODE
    155             else:
    156                 color = LINK_COLOR_DEFAULT
    157             self.SetLinkAppearance(color)
    158             self.infoBracket.state = uiconst.UI_HIDDEN
    159 
    160     def SetLinkAppearance(self, color, graphicID = None, speed = 1.0):
    161         link1Active, link2Active = self._GetLinksActiveState()
    162         if graphicID is None:
    163             self.clDrawer.ChangeLineAnimation('links', self.linkGraphicID1, color, link1Active * speed * self.flowSpeed, self.texWidth)
    164             self.clDrawer.ChangeLineAnimation('links', self.linkGraphicID2, color, link2Active * speed * self.flowSpeed, self.texWidth)
    165         else:
    166             self.clDrawer.ChangeLineAnimation('links', graphicID, color, speed * self.flowSpeed, self.texWidth)
    167             self.clDrawer.ChangeLineAnimation('links', graphicID, color, speed * self.flowSpeed, self.texWidth)
    168         if link1Active or self.link.IsEditModeLink():
    169             self.clDrawer.ChangeLineColor('links', self.linkGraphicID1, LINK_COLOR_BASE)
    170         else:
    171             self.clDrawer.ChangeLineColor('links', self.linkGraphicID1, LINK_COLOR_INACTIVE)
    172         if link2Active or self.link.IsEditModeLink():
    173             self.clDrawer.ChangeLineColor('links', self.linkGraphicID2, LINK_COLOR_BASE)
    174         else:
    175             self.clDrawer.ChangeLineColor('links', self.linkGraphicID2, LINK_COLOR_INACTIVE)
    176         self.clDrawer.SubmitLineset('links')
    177 
    178     def _GetLinksActiveState(self):
    179         link1Active = link2Active = False
    180         planet = sm.GetService('planetUI').GetCurrentPlanet()
    181         if planet is None:
    182             return (False, False)
    183         colony = planet.GetColonyByPinID(self.IDTuple[0])
    184         if colony is None:
    185             return (False, False)
    186         for routeID in self.link.routesTransiting:
    187             route = colony.GetRoute(routeID)
    188             if route is None:
    189                 continue
    190             route = route.path
    191             prevId = route[0]
    192             for currId in route[1:]:
    193                 if prevId == self.IDTuple[0] and currId == self.IDTuple[1]:
    194                     link1Active = True
    195                 if prevId == self.IDTuple[1] and currId == self.IDTuple[0]:
    196                     link2Active = True
    197                 prevId = currId
    198                 if link1Active and link2Active:
    199                     break
    200 
    201         return (link1Active, link2Active)
    202 
    203     def RemoveAsRoute(self, id):
    204         graphicID = self.graphicIDbyID[id]
    205         if graphicID == self.linkGraphicID1:
    206             self.state.link1AsRoute = False
    207         else:
    208             self.state.link2AsRoute = False
    209         self.RenderAccordingToState()
    210         self.currentRouteVolume = None
    211 
    212     def ShowAsRoute(self, id, numRoute, numTotal, volume = None):
    213         self.currentRouteVolume = volume
    214         graphicID = self.graphicIDbyID[id]
    215         if graphicID == self.linkGraphicID1:
    216             self.state.link1AsRoute = True
    217         else:
    218             self.state.link2AsRoute = True
    219         self.RenderAccordingToState()
    220 
    221     def HighlightLink(self):
    222         self.state.mouseHover = True
    223         self.RenderAccordingToState()
    224 
    225     def RemoveHighlightLink(self):
    226         self.state.mouseHover = False
    227         self.RenderAccordingToState()
    228 
    229     def OnRefreshPins(self):
    230         self.RenderAccordingToState()
    231 
    232     def SetSelected(self):
    233         self.state.selected = True
    234         self.RenderAccordingToState()
    235 
    236     def SetDeselected(self):
    237         self.state.selected = False
    238         self.RenderAccordingToState()
    239 
    240     def OnMouseEnter(self):
    241         self.state.mouseHover = True
    242         self.RenderAccordingToState()
    243         sm.GetService('audio').SendUIEvent('msg_pi_pininteraction_mouseover_play')
    244 
    245     def OnMouseExit(self):
    246         self.state.mouseHover = False
    247         self.RenderAccordingToState()
    248 
    249     def GetGraphicIDs(self):
    250         return (self.linkGraphicID1, self.linkGraphicID2)
    251 
    252     def GetIDTuple(self):
    253         return self.IDTuple
    254 
    255     def GetMenu(self):
    256         return []
    257 
    258     def Remove(self):
    259         self.destroyed = True
    260         if self.infoBracket and self.bracketCurveSet:
    261             self.bracketCurveSet.curves.fremove(self.infoBracket.projectBracket)
    262             self.bracketCurveSet = None
    263         planetTransform = sm.GetService('planetUI').planetTransform
    264         if self.infoBracket.trackTransform in planetTransform.children:
    265             planetTransform.children.remove(self.infoBracket.trackTransform)
    266         pinInfoParent = sm.GetService('planetUI').pinInfoParent
    267         if self.infoBracket in pinInfoParent.children:
    268             pinInfoParent.children.remove(self.infoBracket)
    269         self.infoBracket = None
    270 
    271     def SetCurrentRouteVolume(self, volume):
    272         self.currentRouteVolume = volume
    273         self.RenderAccordingToState()
    274 
    275     def IsStorage(self):
    276         return False