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