skillImportingMsg.py (14305B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\skillPlan\skillQueuePanel\skillImportingMsg.py 2 import uthread2 3 from carbonui import uiconst 4 from carbonui.primitives.container import Container 5 from carbonui.primitives.containerAutoSize import ContainerAutoSize 6 from carbonui.primitives.sprite import Sprite 7 from carbonui.uicore import uicore 8 from characterskills import SKILLQUEUE_MAX_NUM_SKILLS 9 from carbonui.button.group import ButtonGroup 10 from eve.client.script.ui.control.entries.generic import Generic 11 from eve.client.script.ui.control.entries.util import GetFromClass 12 from eve.client.script.ui.control.eveLabel import EveLabelMedium 13 from eve.client.script.ui.control.eveScroll import Scroll 14 from carbonui.control.window import Window 15 from eve.client.script.ui.control.listgroup import ListGroup 16 from eve.client.script.ui.shared.neocom.skillConst import COLOR_SKILL_1 17 from localization import GetByLabel 18 from skills.client.skillController import SkillController 19 import textImporting.importSkillplanConst as importConst 20 COLOR_GRAY = (1.0, 1.0, 1.0, 0.5) 21 22 class SkillImportStatusWindow(Window): 23 default_width = 500 24 default_height = 540 25 default_windowID = 'skillImportStatusWindow' 26 default_captionLabelPath = 'UI/SkillQueue/SkillImportHeader' 27 __notifyevents__ = ['OnSkillsChanged', 28 'OnSkillQueueChanged', 29 'OnClientEvent_SkillAddedToQueue', 30 'OnClientEvent_SkillsRemovedFromQueue'] 31 32 def ApplyAttributes(self, attributes): 33 Window.ApplyAttributes(self, attributes) 34 self.importingStatus = attributes.importingStatus 35 self.failedLines = attributes.failedLines 36 self.successfulLabel = EveLabelMedium(parent=self.sr.main, align=uiconst.TOTOP, padding=8) 37 self.unsuccessfulLabel = EveLabelMedium(parent=self.sr.main, align=uiconst.TOTOP, padding=8) 38 btnGroup = ButtonGroup(parent=self.sr.main, idx=0) 39 btnGroup.AddButton(label=GetByLabel('UI/Common/Buttons/Close'), func=self.Close) 40 self.scroll = Scroll(parent=self.sr.main, padding=(4, 0, 4, 0)) 41 42 def LoadInitialImportingStatus(self, importingStatus, failedLines): 43 successFullText = GetByLabel('UI/SkillQueue/SkillsImportedToQueue', numSkills=importingStatus.skillLevelsAdded) 44 self.LoadImportingStatus(importingStatus, failedLines, successFullText) 45 46 def LoadImportingStatus(self, importingStatus, failedLines, successFullText = None): 47 self.importingStatus = importingStatus 48 self.failedLines = failedLines 49 if successFullText: 50 self.successfulLabel.text = successFullText 51 self.successfulLabel.display = True 52 else: 53 self.successfulLabel.display = False 54 somethingFailed = importingStatus.alreadyTrainedLevels or importingStatus.alreadyInQueueLevels or importingStatus.failedLevels or failedLines 55 if somethingFailed: 56 self.unsuccessfulLabel.text = GetByLabel('UI/SkillQueue/CouldNotBeAddedHeader') 57 self.scroll.display = True 58 self.width = max(self.width, self.default_width) 59 self.height = max(self.height, self.default_height) 60 else: 61 self.unsuccessfulLabel.text = '' 62 self.scroll.display = False 63 self.width = 256 64 self.height = 128 65 if not somethingFailed and not successFullText: 66 self.Close() 67 return 68 scrollList = [] 69 if importingStatus.alreadyTrainedLevels: 70 scrollList.append(GetFromClass(ListGroup, {'GetSubContent': self.GetSubContent, 71 'label': GetByLabel('UI/SkillQueue/SkillsAlreadyTrained'), 72 'id': ('alreadyTrained', 0), 73 'groupItems': importingStatus.alreadyTrainedLevels, 74 'iconMargin': 32, 75 'showlen': 1, 76 'state': 'locked', 77 'BlockOpenWindow': 1})) 78 if importingStatus.alreadyInQueueLevels: 79 scrollList.append(GetFromClass(ListGroup, {'GetSubContent': self.GetSubContent, 80 'label': GetByLabel('UI/SkillQueue/SkillsAlreadyInQueue'), 81 'id': ('alreadyInQueue', 0), 82 'groupItems': importingStatus.alreadyInQueueLevels, 83 'iconMargin': 32, 84 'showlen': 1, 85 'state': 'locked', 86 'BlockOpenWindow': 1})) 87 if importingStatus.failedLevels: 88 scrollList.append(GetFromClass(ListGroup, {'GetSubContent': self.GetSubContent, 89 'label': GetByLabel('UI/SkillQueue/FailedToImportSkills'), 90 'id': ('failedLevels', 0), 91 'groupItems': importingStatus.failedLevels, 92 'iconMargin': 32, 93 'showlen': 1, 94 'state': 'locked', 95 'BlockOpenWindow': 1})) 96 if failedLines: 97 scrollList.append(GetFromClass(ListGroup, {'GetSubContent': self.GetSubContentFailedLines, 98 'label': GetByLabel('UI/SkillQueue/CouldNotReadLines'), 99 'id': ('failedLevels', 0), 100 'groupItems': failedLines, 101 'iconMargin': 32, 102 'showlen': True, 103 'state': 'locked', 104 'BlockOpenWindow': 1})) 105 self.scroll.Load(contentList=scrollList) 106 107 def GetSubContent(self, nodedata): 108 scrollList = [] 109 for typeID, skillLevel, reason in nodedata.groupItems: 110 entry = GetFromClass(MissingSkillEntry, data={'typeID': typeID, 111 'sublevel': 1, 112 'skillLevel': skillLevel, 113 'reason': reason}) 114 scrollList.append(entry) 115 116 return scrollList 117 118 def GetSubContentFailedLines(self, nodedata): 119 scrollList = [] 120 for text in nodedata.groupItems: 121 entry = GetFromClass(Generic, {'label': text, 122 'sublevel': 1}) 123 scrollList.append(entry) 124 125 return scrollList 126 127 def OnSkillsChanged(self, *args): 128 self._Update() 129 130 def OnSkillQueueChanged(self): 131 self._Update() 132 133 def OnClientEvent_SkillAddedToQueue(self, typeID, level): 134 self._Update() 135 136 def OnClientEvent_SkillsRemovedFromQueue(self, skillRequirements): 137 self._Update() 138 139 def _Update(self): 140 self._UpdateBuffered() 141 142 @uthread2.BufferedCall(500) 143 def _UpdateBuffered(self): 144 skillQueueSvc = sm.GetService('skillqueue') 145 queueLength = skillQueueSvc.GetNumberOfSkillsInQueue() 146 if self.importingStatus.failedLevels: 147 newFailedLevels = [] 148 for typeID, skillLevel, reason in self.importingStatus.failedLevels: 149 skillController = SkillController(typeID) 150 if skillController.IsInjected(): 151 if skillController.GetMyLevel() >= skillLevel: 152 continue 153 posInQueue = skillQueueSvc.FindInQueue(typeID, skillLevel) 154 if posInQueue is not None: 155 continue 156 if reason == importConst.FAILED_SKILL_NOT_INJECTED: 157 reason = importConst.FAILED_TOO_MANY_SKILLS if queueLength >= SKILLQUEUE_MAX_NUM_SKILLS else importConst.FAILED_WAS_NOT_INJECTED 158 newFailedLevels.append((typeID, skillLevel, reason)) 159 160 if newFailedLevels != self.importingStatus.failedLevels: 161 self.importingStatus.failedLevels = newFailedLevels 162 self.LoadImportingStatus(self.importingStatus, self.failedLines) 163 164 165 class MissingSkillEntry(Generic): 166 __guid__ = 'listentry.SkillTreeEntry' 167 default_showHilite = True 168 isDragObject = True 169 170 def ApplyAttributes(self, attributes): 171 Generic.ApplyAttributes(self, attributes) 172 self.missingSkillCont = None 173 self.initialized = False 174 self.skillService = sm.GetService('skills') 175 self.infoService = sm.GetService('info') 176 177 def Load(self, data): 178 Generic.Load(self, data) 179 if not self.missingSkillCont or self.missingSkillCont.destroyed: 180 self.missingSkillCont = MissingSkillCont(parent=self, align=uiconst.TOALL, state=uiconst.UI_PICKCHILDREN, typeID=data.typeID, requiredLevel=data.skillLevel, indent=data.sublevel * 16, reason=data.reason) 181 182 def GetHeight(self, *args): 183 return 28 184 185 def OnDblClick(self, *args): 186 self.missingSkillCont.OnDblClick() 187 188 def GetMenu(self): 189 return self.missingSkillCont.GetMenu() 190 191 def GetDragData(self, *args): 192 return self.missingSkillCont.GetDragData() 193 194 def LoadTooltipPanel(self, tooltipPanel, *args): 195 self.missingSkillCont.LoadTooltipPanel(tooltipPanel) 196 197 def UpdateTimeToTrainLabel(self): 198 pass 199 200 201 class MissingSkillCont(Container): 202 default_name = 'MissingSkillCont' 203 isDragObject = True 204 default_align = uiconst.TOTOP 205 default_state = uiconst.UI_NORMAL 206 default_height = 0 207 __notifyevents__ = ['OnSkillsChanged', 208 'OnSkillQueueChanged', 209 'OnClientEvent_SkillAddedToQueue', 210 'OnClientEvent_SkillsRemovedFromQueue'] 211 reasonsDict = {importConst.FAILED_TOO_MANY_SKILLS: GetByLabel('UI/SkillQueue/TooManySkillsInQueue'), 212 importConst.FAILED_SKILL_NOT_INJECTED: GetByLabel('UI/SkillQueue/SkillNotInjected'), 213 importConst.FAILED_INCORRECT_ORDER: GetByLabel('UI/SkillQueue/IncorrectOrder'), 214 importConst.FAILED_MISSING_PREREQ: GetByLabel('UI/SkillQueue/MissingPrereqs'), 215 importConst.FAILED_SKILL_IN_QUEUE: GetByLabel('UI/SkillQueue/AlreadyInQueue'), 216 importConst.FAILED_OMEGA_RESTRICTION: GetByLabel('UI/SkillQueue/SkillRequiresCloneStateUpgrade'), 217 importConst.FAILED_PREVIOUSLY_TRAINED: GetByLabel('UI/SkillQueue/AlreadyTrained'), 218 importConst.FAILD_QUEUE_TOO_LONG: GetByLabel('UI/SkillQueue/QueueTooLong'), 219 importConst.FAILED_WAS_NOT_INJECTED: ''} 220 221 def ApplyAttributes(self, attributes): 222 Container.ApplyAttributes(self, attributes) 223 sm.RegisterNotify(self) 224 typeID = attributes.typeID 225 self.requiredLevel = attributes.requiredLevel 226 self.reason = attributes.reason 227 indent = attributes.get('indent', 0) 228 self.tooltipPointerDirection = attributes.get('tooltipPointerDirection', None) 229 self.ConstructLayout(indent=indent) 230 self.skillController = SkillController(typeID) 231 self.UpdateTextAndIcon() 232 233 def ConstructLayout(self, indent): 234 iconCont = Container(parent=self, align=uiconst.TOLEFT, width=16, left=indent) 235 self.icon = Sprite(parent=iconCont, align=uiconst.CENTER, pos=(0, 0, 16, 16)) 236 self.reasonLabelCont = ContainerAutoSize(name='reasonLabelCont', parent=self, align=uiconst.TORIGHT, left=8) 237 self.reasonLabel = EveLabelMedium(name='reasonLabel', parent=self.reasonLabelCont, left=8, align=uiconst.CENTERRIGHT, opacity=0.5, text='') 238 self.skillLabelCont = Container(name='skillLabelCont', parent=self, align=uiconst.TOALL, left=5) 239 self.skillLabel = EveLabelMedium(name='skillLabel', parent=self.skillLabelCont, align=uiconst.CENTERLEFT) 240 241 def UpdateTextAndIcon(self): 242 self.UpdateIcon() 243 self.UpdateSkillLabel() 244 self.UpdateReason() 245 246 def UpdateSkillLabel(self): 247 if self.requiredLevel is not None: 248 if self.skillController.GetMyLevel() >= self.requiredLevel: 249 self.skillLabel.opacity = 0.5 250 text = self.skillController.GetRequiredSkillNameAndLevelComparedToTrainedLevel(self.requiredLevel) 251 else: 252 text = self.skillController.GetName() 253 self.skillLabel.SetText(text) 254 255 def UpdateReason(self): 256 if self.reason == importConst.FAILED_WAS_NOT_INJECTED and self.skillController.IsInjected(): 257 text = '' 258 else: 259 text = self.reasonsDict.get(self.reason, None) or GetByLabel('UI/SkillQueue/UnknownReason') 260 self.reasonLabel.text = text 261 262 def SetIcon(self, texturePath, color, hint): 263 self.icon.SetTexturePath(texturePath) 264 self.icon.SetRGBA(*color) 265 self.icon.hint = hint 266 267 def UpdateIcon(self): 268 if self.requiredLevel is None: 269 texturePath = 'res:/ui/Texture/classes/Skills/SkillRequirementNotMet.png' 270 color = COLOR_GRAY 271 hint = None 272 elif not self.skillController.IsInjected(): 273 texturePath = 'res:/ui/Texture/classes/Skills/SkillBookNotInjected.png' 274 color = COLOR_SKILL_1 275 hint = GetByLabel('UI/SkillQueue/SkillBookMissing') 276 elif self.skillController.GetMyLevel() >= self.requiredLevel: 277 texturePath = 'res:/ui/Texture/classes/Skills/SkillRequirementMet.png' 278 color = COLOR_GRAY 279 hint = GetByLabel('UI/InfoWindow/SkillTrainedToRequiredLevel') 280 else: 281 texturePath = 'res:/ui/Texture/classes/Skills/SkillRequirementNotMet.png' 282 color = COLOR_SKILL_1 283 hint = GetByLabel('UI/InfoWindow/SkillNotTrainedToRequiredLevel') 284 self.SetIcon(texturePath=texturePath, color=color, hint=hint) 285 286 def OnDblClick(self, *args): 287 sm.GetService('info').ShowInfo(self.skillController.GetTypeID()) 288 289 def GetMenu(self): 290 return self.skillController.GetMenu() 291 292 def GetDragData(self, *args): 293 return self.skillController.GetDragData() 294 295 def LoadTooltipPanel(self, tooltipPanel, *args): 296 if uicore.uilib.tooltipHandler.IsUnderTooltip(self): 297 return 298 from eve.client.script.ui.shared.tooltip.skill import LoadSkillEntryTooltip 299 LoadSkillEntryTooltip(tooltipPanel, self.skillController.GetTypeID(), self.requiredLevel) 300 301 def GetTooltipPointer(self): 302 return self.tooltipPointerDirection 303 304 def OnSkillsChanged(self, *args): 305 self._Update() 306 307 def OnSkillQueueChanged(self): 308 self._Update() 309 310 def OnClientEvent_SkillAddedToQueue(self, typeID, level): 311 if typeID == self.skillController.GetTypeID(): 312 self._Update() 313 314 def OnClientEvent_SkillsRemovedFromQueue(self, skillRequirements): 315 for typeID, level in skillRequirements: 316 if typeID == self.skillController.GetTypeID(): 317 self._Update() 318 return 319 320 def _Update(self): 321 self._UpdateBuffered() 322 323 @uthread2.BufferedCall(200) 324 def _UpdateBuffered(self): 325 if not self or self.destroyed: 326 return 327 self.UpdateTextAndIcon()