skillTreeCont.py (8549B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\control\skillTreeCont.py 2 import eveicon 3 import localization 4 from carbonui import const as uiconst 5 from carbonui.primitives.container import Container 6 from carbonui.primitives.containerAutoSize import ContainerAutoSize 7 from carbonui.primitives.fill import Fill 8 from carbonui.primitives.sprite import Sprite 9 from carbonui.uicore import uicore 10 from eve.client.script.ui.control.eveLabel import Label 11 from eve.client.script.ui.control.skillBar.skillBar import SkillBar 12 from eve.client.script.ui.shared.neocom.skillConst import COLOR_SKILL_1, COLOR_TRAINED 13 from eve.common.lib import appConst as const 14 from skills.client.skillController import SkillController 15 COLOR_GRAY = (1.0, 1.0, 1.0, 0.5) 16 17 class SkillStateIcon(Sprite): 18 default_width = 16 19 default_height = 16 20 21 def __init__(self, skill_controller, required_level = None, **kw): 22 super(SkillStateIcon, self).__init__(**kw) 23 self.skill_controller = skill_controller 24 self.required_level = required_level 25 self.update() 26 27 def update(self): 28 self.texturePath = self.get_texture_path() 29 self.rgba = self.get_rgba() 30 31 def GetHint(self): 32 if self.required_level is None: 33 return 34 if not self.skill_controller.IsInjected(): 35 if self.skill_controller.IsSkillAvailableForPurchase(): 36 return localization.GetByLabel('UI/SkillQueue/SkillBookMissing') 37 else: 38 return localization.GetByLabel('UI/SkillQueue/RareSkillBookMissing') 39 else: 40 if self.skill_controller.GetMyLevel() >= self.required_level: 41 return localization.GetByLabel('UI/InfoWindow/SkillTrainedToRequiredLevel') 42 return localization.GetByLabel('UI/InfoWindow/SkillNotTrainedToRequiredLevel') 43 44 def get_texture_path(self): 45 if self.required_level is None: 46 return 'res:/ui/Texture/classes/Skills/SkillRequirementNotMet.png' 47 if not self.skill_controller.IsInjected(): 48 if self.skill_controller.IsSkillAvailableForPurchase(): 49 return 'res:/ui/Texture/classes/Skills/SkillBookNotInjected.png' 50 else: 51 return 'res:/ui/Texture/classes/Skills/RareSkillBookNotInjected.png' 52 else: 53 if self.skill_controller.GetMyLevel() >= self.required_level: 54 return eveicon.checkmark 55 return 'res:/ui/Texture/classes/Skills/SkillRequirementNotMet.png' 56 57 def get_rgba(self): 58 if self.required_level is None: 59 return COLOR_GRAY 60 elif not self.skill_controller.IsInjected(): 61 return COLOR_SKILL_1 62 elif self.skill_controller.GetMyLevel() >= self.required_level: 63 return COLOR_TRAINED 64 else: 65 return COLOR_SKILL_1 66 67 68 class SkillTreeCont(Container): 69 default_name = 'SkillTreeCont' 70 isDragObject = True 71 default_align = uiconst.TOTOP 72 default_state = uiconst.UI_NORMAL 73 default_height = 18 74 __notifyevents__ = ['OnSkillsChanged', 75 'OnSkillQueueChanged', 76 'OnClientEvent_SkillAddedToQueue', 77 'OnClientEvent_SkillsRemovedFromQueue'] 78 79 def __init__(self, **kw): 80 self.icon = None 81 self.skillBar = None 82 self.skillAndLevelLabel = None 83 self.skillAndLevelLabelParent = None 84 self.backgroundFill = None 85 self.timeToTrainLabel = None 86 super(SkillTreeCont, self).__init__(**kw) 87 88 def ApplyAttributes(self, attributes): 89 super(SkillTreeCont, self).ApplyAttributes(attributes) 90 typeID = attributes.typeID 91 self.requiredLevel = attributes.requiredLevel 92 indent = attributes.get('indent', 0) 93 self.tooltipPointerDirection = attributes.get('tooltipPointerDirection', None) 94 self.skillController = SkillController(typeID) 95 self.ConstructLayout(indent=indent) 96 self.UpdateTextAndIcon() 97 sm.RegisterNotify(self) 98 99 def _IsLayoutConstructed(self): 100 try: 101 if self.skillBar is None or self.icon is None: 102 return False 103 except AttributeError: 104 return False 105 106 return True 107 108 def ConstructLayout(self, indent): 109 iconCont = Container(parent=self, align=uiconst.TOLEFT, width=16, left=indent) 110 self.icon = SkillStateIcon(parent=iconCont, align=uiconst.CENTER, skill_controller=self.skillController, required_level=self.requiredLevel) 111 skillBarCont = Container(name='SkillBarCont', parent=self, align=uiconst.TORIGHT, width=70) 112 self.timeToTrainLabel = Label(name='Time to train label', parent=ContainerAutoSize(parent=self, align=uiconst.TORIGHT, left=8), align=uiconst.CENTERRIGHT, opacity=0.5) 113 self.skillAndLevelLabelParent = Container(name='labelContainer', parent=self, align=uiconst.TOALL, left=5) 114 self.skillAndLevelLabel = Label(name='SkillNameAndLevelLabel', parent=self.skillAndLevelLabelParent, align=uiconst.CENTERLEFT) 115 self.skillBar = SkillBar(name='SkillBar', parent=skillBarCont, align=uiconst.CENTERLEFT, state=uiconst.UI_DISABLED) 116 self.backgroundFill = None 117 118 def UpdateTextAndIcon(self): 119 if self._IsLayoutConstructed(): 120 self.UpdateIcon() 121 self.UpdateTimeToTrainLabel() 122 self.UpdateSkillAndLevelLabel() 123 self.skillBar.SetSkillID(self.skillController.GetTypeID()) 124 self.skillBar.SetRequiredLevel(self.requiredLevel) 125 self.UpdateBackground() 126 127 def UpdateSkillAndLevelLabel(self): 128 if self.requiredLevel is not None: 129 if self.skillController.GetMyLevel() >= self.requiredLevel: 130 self.skillAndLevelLabel.opacity = 0.5 131 text = self.skillController.GetRequiredSkillNameAndLevelComparedToTrainedLevel(self.requiredLevel) 132 else: 133 text = self.skillController.GetName() 134 self.skillAndLevelLabel.SetText(text) 135 136 def UpdateTimeToTrainLabel(self): 137 if self.requiredLevel is not None: 138 text = self.skillController.GetTimeToTrainToLevelText(self.requiredLevel) 139 else: 140 text = '' 141 self.timeToTrainLabel.SetText(text) 142 143 def UpdateIcon(self): 144 self.icon.update() 145 146 def UpdateBackground(self): 147 if self.requiredLevel is None or self.skillController.GetMyLevel() >= self.requiredLevel: 148 self.HideBackground() 149 else: 150 self.ShowBackground() 151 152 def ShowBackground(self): 153 if self.backgroundFill is None: 154 self.backgroundFill = Fill(bgParent=self, color=COLOR_SKILL_1, opacity=0.05, padding=(0, 1, 0, 1)) 155 156 def HideBackground(self): 157 if self.backgroundFill is not None: 158 self.backgroundFill.Close() 159 self.backgroundFill = None 160 161 def UpdateAlignment(self, *args, **kwargs): 162 alignment = super(SkillTreeCont, self).UpdateAlignment(*args, **kwargs) 163 self.UpdateLabelFade() 164 return alignment 165 166 def UpdateLabelFade(self): 167 if self._IsLayoutConstructed(): 168 availableWidth = self.skillAndLevelLabelParent.displayWidth - const.defaultPadding 169 self.skillAndLevelLabel.SetRightAlphaFade(fadeEnd=availableWidth, maxFadeWidth=20) 170 171 def OnDblClick(self, *args): 172 sm.GetService('info').ShowInfo(self.skillController.GetTypeID()) 173 174 def GetMenu(self): 175 return self.skillController.GetMenu() 176 177 def GetDragData(self, *args): 178 return self.skillController.GetDragData() 179 180 def LoadTooltipPanel(self, tooltipPanel, *args): 181 if uicore.uilib.tooltipHandler.IsUnderTooltip(self): 182 return 183 from eve.client.script.ui.shared.tooltip.skill import LoadSkillEntryTooltip 184 LoadSkillEntryTooltip(tooltipPanel, self.skillController.GetTypeID(), self.requiredLevel) 185 186 def GetTooltipPointer(self): 187 return self.tooltipPointerDirection 188 189 def OnSkillsChanged(self, *args): 190 self._Update() 191 192 def OnSkillQueueChanged(self): 193 self._Update() 194 195 def OnClientEvent_SkillAddedToQueue(self, typeID, level): 196 if typeID == self.skillController.GetTypeID(): 197 self._Update() 198 199 def OnClientEvent_SkillsRemovedFromQueue(self, skillRequirements): 200 for typeID, level in skillRequirements: 201 if typeID == self.skillController.GetTypeID(): 202 self._Update() 203 return 204 205 def _Update(self): 206 if self._IsLayoutConstructed(): 207 self.UpdateTextAndIcon() 208 self.skillBar.Update()