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

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)