skillPlanProgressIndicatorEditable.py (8609B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\skillPlan\milestone\skillPlanProgressIndicatorEditable.py 2 import math 3 from carbonui import uiconst 4 from carbonui.primitives.container import Container 5 from carbonui.uianimations import animations 6 from carbonui.util.color import Color 7 from carbonui.util.various_unsorted import IsUnder 8 from eve.client.script.ui import eveColor 9 from eve.client.script.ui.skillPlan import skillPlanUISignals, skillPlanUtil 10 from eve.client.script.ui.skillPlan.milestone.milestoneTooltips import AddMilestonesTooltip 11 from eve.client.script.ui.skillPlan.milestone.milestoneProgressIndicator import MilestoneProgressIndicator 12 from eve.client.script.ui.skillPlan.milestone.skillPlanProgressIndicator import SkillPlanProgressIndicator 13 from eve.client.script.ui.skillPlan.milestone.skillPlanProgressGauge import SkillPlanProgressGauge 14 from eveui import Sprite 15 from player_messaging.client.ui_message import prompt_player_fsd_dialog 16 from signals import Signal 17 from skills.skillplan.milestone.milestoneController import MilestoneType 18 from carbonui.uicore import uicore 19 OPACITY_IDLE = 0.1 20 START_ANGLE_BY_NUM_MILESTONES = (0, 21 -math.pi / 6, 22 0, 23 math.pi / 10, 24 math.pi / 10) 25 26 class SkillPlanProgressIndicatorEditable(SkillPlanProgressIndicator): 27 28 def ApplyAttributes(self, attributes): 29 super(SkillPlanProgressIndicatorEditable, self).ApplyAttributes(attributes) 30 self.onMilestoneDataDroppedSignal = Signal('onMilestoneDataDroppedSignal') 31 skillPlanUISignals.on_milestone_added.connect(self.OnMilestoneAdded) 32 skillPlanUISignals.on_milestone_removed.connect(self.OnMilestoneRemoved) 33 self.tooltipPanelClassInfo = AddMilestonesTooltip() 34 self.ConstructEmptyMilestone() 35 self.defaultStateCont = Container() 36 37 def GetTooltipDelay(self): 38 return 0 39 40 def OnMilestoneAdded(self, skillPlanID, milestoneID): 41 if skillPlanID != self.skillPlan.GetID(): 42 return 43 self.ReconstructMilestones() 44 self.UpdateMilestonePositions() 45 46 def OnMilestoneRemoved(self, skillPlanID, milestoneID): 47 if skillPlanID != self.skillPlan.GetID(): 48 return 49 self.ReconstructMilestones() 50 self.UpdateMilestonePositions() 51 52 def OnMouseEnter(self, *args): 53 if self.defaultStateCont.display: 54 self.defaultStateCont.OnMouseEnter() 55 56 def OnMouseExit(self, *args): 57 if self.plusIcon.display: 58 self.plusIcon.OnDragExit() 59 60 def OnDragEnter(self, dragSource, dragData): 61 dragData = dragData[0] 62 if self.plusIcon.display: 63 if self.IsValidDragData(dragData): 64 self.plusIcon.OnDragEnter() 65 else: 66 self.plusIcon.OnDragEnterInvalid() 67 68 def IsValidDragData(self, dragData): 69 typeID, level = skillPlanUtil.GetDragDataTypeIDAndLevel(dragData) 70 if not skillPlanUtil.IsTypeValidMilestone(typeID): 71 return 72 if typeID is None: 73 return False 74 for milestone in self.skillPlan.GetMilestones().values(): 75 if milestone.GetMilestoneType() == MilestoneType.TYPE_ID_MILESTONE and milestone.GetTypeID() == typeID: 76 return False 77 if milestone.GetMilestoneType() == MilestoneType.SKILL_REQUIREMENT_MILESTONE and milestone.GetData() == (typeID, level): 78 return False 79 80 return True 81 82 def ConstructProgressGauge(self): 83 radius = self.GetOuterRadius() 84 self.progressGauge = SkillPlanProgressGauge(parent=self.mainCont, align=uiconst.TOALL, radius=radius, highlightNotInTraining=self.highlightNotInTraining, controller=self.skillPlan) 85 86 def OnDragExit(self, dragSource, dragData): 87 if IsUnder(uicore.uilib.mouseOver, self): 88 return 89 if self.plusIcon: 90 self.plusIcon.OnDragExit() 91 92 def OnDropData(self, dragSource, dragData): 93 return self._OnDataDropped(dragData) 94 95 def _OnDataDropped(self, dragData, milestoneID = None): 96 dragData = dragData[0] 97 typeID, level = skillPlanUtil.GetDragDataTypeIDAndLevel(dragData) 98 if typeID is None or not skillPlanUtil.IsTypeValidMilestone(typeID): 99 prompt_player_fsd_dialog('CantAddAsMilestone') 100 elif typeID: 101 self.onMilestoneDataDroppedSignal(typeID, level, milestoneID) 102 if self.plusIcon: 103 self.plusIcon.OnDragExit() 104 105 def OnDataDroppedOnTypeIndicator(self, dragSource, dragData, milestoneID): 106 return self._OnDataDropped(dragData, milestoneID) 107 108 def UpdateMilestonePositions(self): 109 super(SkillPlanProgressIndicatorEditable, self).UpdateMilestonePositions() 110 self.UpdatePlusIconPosition() 111 112 def UpdatePlusIconPosition(self): 113 numMilestones = len(self.milestoneIndicators) 114 if numMilestones == 5: 115 self.plusIcon.Hide() 116 elif numMilestones == 0: 117 self.plusIcon.top = 0 118 self.plusIcon.width = self.plusIcon.height = 114 119 self.plusIcon.Show() 120 else: 121 self.plusIcon.width = self.plusIcon.height = 54 122 self.plusIcon.top = self._GetMilestonePositionRadius(5, self.GetOuterRadius()) 123 self.plusIcon.Show() 124 125 def _GetMilestonePosition(self, i, num, outerRadius): 126 if num == 1: 127 left = 0 128 top = -0.25 * outerRadius 129 else: 130 if num < 5: 131 num += 1 132 angle = self._GetMilestoneAngle(i, num) 133 posRadius = self._GetMilestonePositionRadius(num, outerRadius) 134 left = posRadius * math.cos(angle) 135 top = posRadius * math.sin(angle) 136 return (left, top) 137 138 def _GetMilestoneAngle(self, i, num): 139 startAngle = START_ANGLE_BY_NUM_MILESTONES[num - 2] 140 angle = startAngle - 2 * math.pi * i / float(num) 141 return angle 142 143 def _GetMilestoneIconRadius(self, num, radius): 144 if num < 5: 145 num += 1 146 return super(SkillPlanProgressIndicatorEditable, self)._GetMilestoneIconRadius(num, radius) 147 148 def AddMilestone(self, milestoneID): 149 m = self.GetMilestoneIndicator(milestoneID) 150 if m is not None: 151 return 152 milestone = self.skillPlan.GetMilestone(milestoneID) 153 milestoneIndicator = MilestoneProgressIndicator(parent=self, align=uiconst.CENTER, milestone=milestone, skillPlan=self.skillPlan, isEditable=True, highlightNotInTraining=self.highlightNotInTraining) 154 milestoneIndicator.on_data_dropped.connect(self.OnDataDroppedOnTypeIndicator) 155 self.milestoneIndicators[milestoneID] = milestoneIndicator 156 157 def ConstructEmptyMilestone(self): 158 self.plusIcon = EmptySlot(name='plusIcon', parent=self.mainCont, align=uiconst.CENTER, state=uiconst.UI_DISABLED) 159 160 def _GetTrainingTimeLeftText(self): 161 return self.skillPlan.GetTotalTrainingTimeText() 162 163 164 class EmptySlot(Container): 165 default_width = 54 166 default_height = 54 167 168 def ApplyAttributes(self, attributes): 169 super(EmptySlot, self).ApplyAttributes(attributes) 170 Sprite(name='plusIcon', parent=self, align=uiconst.CENTER, pos=(0, 0, 12, 12), texturePath='res:/UI/Texture/Classes/SkillPlan/milestones/plus.png') 171 self.bg = Sprite(name='bg', bgParent=self, texturePath='res:/UI/Texture/Classes/SkillPlan/milestones/plusIconBG.png', color=eveColor.SMOKE_BLUE, opacity=0.6) 172 self.frame = Sprite(name='frame', bgParent=self, texturePath='res:/UI/Texture/Classes/SkillPlan/milestones/plusIconFrame.png', color=eveColor.CRYO_BLUE, opacity=1.0) 173 174 def SetRadius(self, radius): 175 self.width = self.height = radius 176 177 def OnDragEnter(self): 178 duration = 0.3 179 animations.SpColorMorphTo(self.frame, self.frame.GetRGBA(), eveColor.WHITE, duration=duration) 180 color = Color(*eveColor.CRYO_BLUE).SetOpacity(0.9).GetRGBA() 181 animations.SpColorMorphTo(self.bg, self.bg.GetRGBA(), color, duration=duration) 182 183 def OnDragEnterInvalid(self): 184 duration = uiconst.TIME_ENTRY 185 animations.SpColorMorphTo(self.frame, self.frame.GetRGBA(), eveColor.HOT_RED, duration=duration) 186 color = Color(*eveColor.HOT_RED).SetOpacity(0.6).GetRGBA() 187 animations.SpColorMorphTo(self.bg, self.bg.GetRGBA(), color, duration=duration) 188 189 def OnDragExit(self): 190 animations.SpColorMorphTo(self.frame, self.frame.GetRGBA(), eveColor.CRYO_BLUE, duration=uiconst.TIME_EXIT) 191 color = Color(*eveColor.SMOKE_BLUE).SetOpacity(0.6).GetRGBA() 192 animations.SpColorMorphTo(self.bg, self.bg.GetRGBA(), color, duration=uiconst.TIME_EXIT)