dashedCircle.py (4654B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\industry\views\dashedCircle.py 2 from carbonui.const import TOPLEFT, CENTER, TOALL, UI_DISABLED, UI_NORMAL 3 from math import pi, cos, sin 4 from carbonui.primitives.container import Container 5 from carbonui.primitives.sprite import Sprite 6 from carbonui.primitives.transform import Transform 7 from carbonui.primitives.vectorlinetrace import VectorLineTrace 8 from carbonui.util.color import Color 9 from eve.client.script.ui.shared.industry.industryUIConst import OPACITY_LINES, OPACITY_SEGMENTINCOMPLETE 10 from eve.client.script.ui.shared.industry.views.industryLine import IndustryLineTrace 11 import uthread 12 import carbonui.const as uiconst 13 from carbonui.uicore import uicore 14 15 class DashedCircle(Container): 16 default_name = 'DashedCircle' 17 default_radius = 13 18 default_lineWidth = 3.0 19 default_align = TOPLEFT 20 default_state = UI_NORMAL 21 default_rotationCenter = (0.5, 0.5) 22 23 def ApplyAttributes(self, attributes): 24 Container.ApplyAttributes(self, attributes) 25 self.numSegments = attributes.numSegments 26 self.radius = attributes.Get('radius', self.default_radius) 27 self.lineWidth = attributes.Get('lineWidth', self.default_lineWidth) 28 self.updateIconThread = None 29 self.width = self.height = self.radius * 2 30 self.segmentTransform = Transform(name='segmentTransform', parent=self, align=TOALL) 31 self.segments = self.ConstructSegments() 32 self.icon = Sprite(name='icon', parent=self, align=CENTER, state=UI_DISABLED, width=20, height=20) 33 self.AnimEntry() 34 35 def ConstructSegments(self): 36 ret = [] 37 stepSize = 2 * pi / self.numSegments 38 numPoints = max(3, int(30 / self.numSegments)) 39 w = self.lineWidth / 2.0 40 radius = self.radius - self.lineWidth / 2.0 41 for i in xrange(self.numSegments): 42 line = VectorLineTrace(name='line', parent=self.segmentTransform, lineWidth=self.lineWidth, width=100, height=100, state=uiconst.UI_DISABLED) 43 for j in xrange(numPoints + 1): 44 t = float(i) / self.numSegments * 2 * pi + float(j) / numPoints * stepSize 45 t += pi / 2 46 point = (w + radius * (1.0 + cos(t)), w + radius * (1.0 + sin(t))) 47 if self.numSegments > 1 and (j == 0 or j == numPoints): 48 line.AddPoint(point, color=(1, 1, 1, 0)) 49 else: 50 line.AddPoint(point) 51 52 ret.append(line) 53 54 return ret 55 56 def AnimEntry(self): 57 duration = 0.45 / self.numSegments 58 k = 0.3 / self.numSegments 59 uicore.animations.Tr2DRotateTo(self.segmentTransform, 0.3, 0.0, duration=0.45, timeOffset=0.3) 60 offset = 0.3 / self.numSegments 61 for i, segment in enumerate(self.segments): 62 uicore.animations.MorphScalar(segment, 'start', 0.5, 0.0, duration=0.3, timeOffset=0.3 + i * offset) 63 uicore.animations.MorphScalar(segment, 'end', 0.5, 1.0, duration=0.3, timeOffset=0.3 + i * offset) 64 65 def UpdateState(self, numFilledSegments, isReady = True, isOptional = False, isOptionSelected = True, animate = True): 66 isEverythingReady = numFilledSegments == self.numSegments 67 baseColor = IndustryLineTrace.GetLineColor(isReady, isOptionSelected) 68 for i, segment in enumerate(self.segments): 69 if isEverythingReady: 70 opacity = OPACITY_LINES 71 else: 72 isFilled = i < numFilledSegments 73 opacity = OPACITY_LINES if not isFilled else OPACITY_SEGMENTINCOMPLETE 74 color = Color(*baseColor).SetAlpha(opacity).GetRGBA() 75 if animate: 76 uicore.animations.SpColorMorphTo(segment, segment.GetRGBA(), color, duration=0.3) 77 else: 78 segment.SetRGBA(*color) 79 80 self.UpdateIcon(isReady, isOptional) 81 82 def UpdateIcon(self, isEverythingReady, isOptional): 83 if isEverythingReady or isOptional: 84 texturePath = 'res:/UI/Texture/classes/Industry/Input/circleReady.png' 85 else: 86 texturePath = 'res:/UI/Texture/classes/Industry/Input/circleNotReady.png' 87 if self.icon.texturePath == texturePath: 88 return 89 if self.updateIconThread: 90 self.updateIconThread.kill() 91 self.updateIconThread = uthread.new(self._UpdateIconThread, texturePath) 92 93 def _UpdateIconThread(self, texturePath): 94 uicore.animations.FadeOut(self.icon, duration=0.15, sleep=True) 95 self.icon.texturePath = texturePath 96 uicore.animations.FadeIn(self.icon, duration=0.15)