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

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)