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)