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

skillPlanProgressIndicator.py (9725B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\skillPlan\milestone\skillPlanProgressIndicator.py
      2 import math
      3 from collections import OrderedDict
      4 import uthread2
      5 from carbonui import TextColor, uiconst, fontconst
      6 from carbonui.primitives.base import ReverseScaleDpi
      7 from carbonui.primitives.container import Container
      8 from carbonui.primitives.sprite import Sprite
      9 from carbonui.primitives.stretchspritehorizontal import StretchSpriteHorizontal
     10 from carbonui.util.color import Color
     11 from eve.client.script.ui import eveColor
     12 from eve.client.script.ui.control.eveLabel import EveLabelLarge
     13 from eve.client.script.ui.skillPlan import skillPlanUISignals
     14 from eve.client.script.ui.skillPlan.milestone.milestoneProgressIndicator import MilestoneProgressIndicator
     15 from eve.client.script.ui.skillPlan.milestone.skillPlanProgressGauge import SkillPlanProgressGauge
     16 from eve.client.script.ui.skillPlan.skillPlanConst import TRAINING_TIME_EMPTY_LABEL
     17 from skills.skillplan import skillPlanConst, skillPlanSignals
     18 from skills.skillplan.milestone.milestoneController import MilestoneType
     19 START_ANGLE_BY_NUM_MILESTONES = (0,
     20  0,
     21  -math.pi / 2,
     22  math.pi / 4,
     23  math.pi / 10)
     24 
     25 class SkillPlanProgressIndicator(Container):
     26     default_state = uiconst.UI_NORMAL
     27     default_alignMode = uiconst.CENTERTOP
     28     default_highlightNotInTraining = False
     29     __notifyevents__ = ['OnSkillQueueChanged']
     30 
     31     def ApplyAttributes(self, attributes):
     32         super(SkillPlanProgressIndicator, self).ApplyAttributes(attributes)
     33         sm.RegisterNotify(self)
     34         skillPlanSignals.on_saved.connect(self.OnSkillPlanSaved)
     35         skillPlan = attributes.skillPlan
     36         self.highlightNotInTraining = attributes.get('highlightNotInTraining', self.default_highlightNotInTraining)
     37         self._isInit = False
     38         self.skillPlan = None
     39         self.milestoneIndicators = OrderedDict()
     40         self.updateTrainingTimeThread = None
     41         self.mainCont = Container(name='mainCont', parent=self, align=uiconst.CENTER)
     42         self.ConstructTopWedge()
     43         self.ConstructProgressGauge()
     44         skillPlanUISignals.on_skill_requirements_changed.connect(self.OnSkillRequirementsChanged)
     45         skillPlanUISignals.on_milestone_updated.connect(self.OnMilestoneUpdated)
     46         self._isInit = True
     47         if skillPlan:
     48             self.SetSkillPlan(skillPlan)
     49         uthread2.start_tasklet(self._UpdateProgressThread)
     50 
     51     def ConstructProgressGauge(self):
     52         radius = self.GetOuterRadius()
     53         self.progressGauge = SkillPlanProgressGauge(parent=self.mainCont, align=uiconst.TOALL, state=uiconst.UI_NORMAL, radius=radius, highlightNotInTraining=self.highlightNotInTraining, controller=self.skillPlan)
     54 
     55     def ConstructTopWedge(self):
     56         ratio = 125 / 33.0
     57         size = 0.09
     58         self.topWedgeCont = Container(name='topWedgeCont', parent=self.mainCont, align=uiconst.TOPLEFT_PROP, pos=(0.5,
     59          0.035,
     60          size * ratio,
     61          size))
     62         self.topWedgeBG = Sprite(name='topWedge', bgParent=self.topWedgeCont, texturePath='res:/UI/Texture/classes/SkillPlan/milestones/topWedge.png', opacity=0.6)
     63         self.completedUnderscore = StretchSpriteHorizontal(name='completedUnderscore', parent=self.topWedgeCont, texturePath='res:/UI/Texture/classes/SkillPlan/milestones/completedUnderscore.png', align=uiconst.TOBOTTOM, state=uiconst.UI_HIDDEN, height=24, top=-18, padding=(-1, 0, -1, 0), color=eveColor.LEAFY_GREEN)
     64         self.totalTrainingTimeLabel = EveLabelLarge(parent=self.topWedgeCont, name='totalTrainingTimeLabel', align=uiconst.CENTER, text=TRAINING_TIME_EMPTY_LABEL, color=TextColor.HIGHLIGHT)
     65 
     66     def UpdateGaugeProgress(self, animate = True):
     67         self.progressGauge.UpdateProgress(animate=animate)
     68         self.UpdateTopWedge()
     69 
     70     def UpdateTopWedge(self):
     71         if not self.skillPlan:
     72             return
     73         inTrainingRatio = self.skillPlan.GetInTrainingRatio()
     74         trainedRatio = self.skillPlan.GetProgressRatio()
     75         if self.skillPlan and self.skillPlan.IsCompleted():
     76             color = eveColor.COPPER_OXIDE_GREEN
     77         elif inTrainingRatio + trainedRatio == 0.0:
     78             color = eveColor.LED_GREY
     79         else:
     80             color = eveColor.SMOKE_BLUE
     81         color = Color(*color).SetOpacity(0.6).GetRGBA()
     82         self.topWedgeBG.SetRGBA(*color)
     83         if self.skillPlan and self.skillPlan.IsCompleted():
     84             self.completedUnderscore.Show()
     85         else:
     86             self.completedUnderscore.Hide()
     87 
     88     def ClearSkillPlan(self):
     89         self.ClearMilestones()
     90         self.totalTrainingTimeLabel.SetText(TRAINING_TIME_EMPTY_LABEL)
     91         self.skillPlan = None
     92         self.UpdateGaugeProgress(animate=False)
     93 
     94     def ClearMilestones(self):
     95         for m in self.milestoneIndicators.values():
     96             m.Close()
     97 
     98         self.milestoneIndicators.clear()
     99 
    100     def GetMilestoneIndicator(self, milestoneID):
    101         return self.milestoneIndicators.get(milestoneID, None)
    102 
    103     def AddMilestone(self, milestoneID):
    104         m = self.GetMilestoneIndicator(milestoneID)
    105         if m is not None:
    106             return
    107         milestone = self.skillPlan.GetMilestone(milestoneID)
    108         milestoneIndicator = MilestoneProgressIndicator(parent=self, idx=0, align=uiconst.CENTER, milestone=milestone, skillPlan=self.skillPlan, isEditable=False, highlightNotInTraining=self.highlightNotInTraining)
    109         self.milestoneIndicators[milestoneID] = milestoneIndicator
    110 
    111     def UpdateMilestonePositions(self):
    112         num = len(self.milestoneIndicators)
    113         radius = self.GetOuterRadius()
    114         iconRadius = self._GetMilestoneIconRadius(num, radius)
    115         for i, milestone in enumerate(self.milestoneIndicators.values()):
    116             left, top = self._GetMilestonePosition(i, num, radius)
    117             milestone.left = left
    118             milestone.top = top
    119             milestone.SetRadius(iconRadius)
    120 
    121     def _GetMilestoneIconRadius(self, num, radius):
    122         return radius * 0.45 * (1.0 - 0.085 * num)
    123 
    124     def _GetMilestonePosition(self, i, num, outerRadius):
    125         if num == 1:
    126             left = top = 0
    127         else:
    128             angle = self._GetMilestoneAngle(i, num)
    129             r = self._GetMilestonePositionRadius(num, outerRadius)
    130             left = r * math.cos(angle)
    131             top = r * math.sin(angle)
    132         return (left, top)
    133 
    134     def _GetMilestoneAngle(self, i, num):
    135         startAngle = START_ANGLE_BY_NUM_MILESTONES[num - 1]
    136         angle = startAngle - 2 * math.pi * i / float(num)
    137         return angle
    138 
    139     def _GetMilestonePositionRadius(self, num, outerRadius):
    140         return 0.35 * outerRadius * (1.0 + 0.21 * num / skillPlanConst.MAX_NUM_MILESTONES)
    141 
    142     def GetOuterRadius(self):
    143         width, height = self.GetAbsoluteSize()
    144         return min(width / 2, height / 2)
    145 
    146     def SetSkillPlan(self, skillPlan):
    147         if self.destroyed:
    148             return
    149         self.skillPlan = skillPlan
    150         self.progressGauge.SetController(self.skillPlan)
    151         self.UpdateGaugeProgress(animate=False)
    152         if self.skillPlan:
    153             self.totalTrainingTimeLabel.SetText(self._GetTrainingTimeLeftText())
    154         self.ReconstructMilestones()
    155         self.ApplyRadius()
    156 
    157     def ReconstructMilestones(self):
    158         self.ClearMilestones()
    159         if not self.skillPlan:
    160             return
    161         for m in self.skillPlan.GetMilestones():
    162             self.AddMilestone(m)
    163 
    164     def OnSkillRequirementsChanged(self, skillPlanID):
    165         if self.skillPlan and skillPlanID == self.skillPlan.GetID():
    166             self.UpdateGaugeProgress()
    167             self.totalTrainingTimeLabel.SetText(self._GetTrainingTimeLeftText())
    168 
    169     def OnMilestoneUpdated(self, milestoneID):
    170         if not self.skillPlan:
    171             return
    172         milestoneIndicator = self.GetMilestoneIndicator(milestoneID)
    173         if milestoneIndicator is None:
    174             return
    175         milestone = self.skillPlan.GetMilestone(milestoneID)
    176         if milestone.GetMilestoneType() == MilestoneType.SKILL_REQUIREMENT_MILESTONE:
    177             level = milestone.GetLevel()
    178             self.skillPlan.AddAllSkillsRequiredFor(milestone.GetTypeID(), level)
    179             skillPlanUISignals.on_skill_requirements_changed(self.skillPlan.GetID())
    180         milestoneIndicator.UpdateProgress()
    181 
    182     def _UpdateProgressThread(self):
    183         while not self.destroyed:
    184             if self.skillPlan:
    185                 self.totalTrainingTimeLabel.SetText(self._GetTrainingTimeLeftText())
    186                 self.UpdateGaugeProgress(animate=False)
    187             uthread2.Sleep(1.0)
    188 
    189     def _GetTrainingTimeLeftText(self):
    190         return self.skillPlan.GetTotalTrainingTimeLeftText()
    191 
    192     def _OnSizeChange_NoBlock(self, *args):
    193         if self._isInit:
    194             self.ApplyRadius()
    195 
    196     def ApplyRadius(self):
    197         radius = self.GetOuterRadius()
    198         self.mainCont.width = self.mainCont.height = 2 * radius
    199         self.progressGauge.SetRadius(radius)
    200         self.UpdateMilestonePositions()
    201         if radius > 100:
    202             self.topWedgeBG.Show()
    203             self.totalTrainingTimeLabel.fontsize = fontconst.EVE_LARGE_FONTSIZE
    204         else:
    205             self.topWedgeBG.Hide()
    206             self.totalTrainingTimeLabel.fontsize = fontconst.EVE_SMALL_FONTSIZE
    207 
    208     def OnSkillQueueChanged(self):
    209         if self.destroyed:
    210             return
    211         self.UpdateGaugeProgress()
    212         for milestoneIndicator in self.milestoneIndicators.values():
    213             milestoneIndicator.UpdateProgress()
    214 
    215     def OnSkillPlanSaved(self, skillPlan):
    216         if self.skillPlan and self.skillPlan.GetID() == skillPlan.GetID():
    217             self.SetSkillPlan(skillPlan)
    218 
    219     @property
    220     def maxHeight(self):
    221         return ReverseScaleDpi(self.parent.displayWidth)