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

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()