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

browserJobs.py (13914B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\industry\browserJobs.py
      2 import threadutils
      3 from carbonui.control.combo import Combo
      4 from carbonui.primitives.container import Container
      5 from carbonui.util.bunch import Bunch
      6 from carbonui.button.group import ButtonGroup
      7 from eve.client.script.ui.control.eveScroll import Scroll
      8 from eve.client.script.ui.shared.industry import industryUIConst
      9 from eve.client.script.ui.shared.industry.viewModeButtons import ViewModeButtons
     10 from eve.client.script.ui.shared.industry.industryUIConst import ACTIVITY_NAMES
     11 from eve.client.script.ui.quickFilter import QuickFilterEdit
     12 import carbonui.const as uiconst
     13 import localization
     14 import industry
     15 import blue
     16 from eve.client.script.ui.shared.industry.jobEntry import JobEntry
     17 import uthread
     18 import log
     19 import telemetry
     20 STATION_CURRENT = -1
     21 STATION_ALL = -2
     22 OWNER_ME = 1
     23 OWNER_CORP = 2
     24 INSTALLER_ANY = 1
     25 INSTALLER_ME = 2
     26 INSTALLER_CORPMATE = 3
     27 STATUS_COMPLETED = 1
     28 STATUS_INCOMPLETE = 2
     29 STATUS_READY = 3
     30 STATUS_INSTALLED = 4
     31 STATUS_PAUSED = 5
     32 STATUS_ICONS = {STATUS_INSTALLED: 'res:/UI/Texture/Classes/industry/status/installed.png',
     33  STATUS_PAUSED: 'res:/UI/Texture/Classes/industry/status/halted.png',
     34  STATUS_READY: 'res:/UI/Texture/Classes/industry/status/ready.png',
     35  STATUS_COMPLETED: 'res:/UI/Texture/Classes/industry/status/delivered.png'}
     36 INTERVAL_FLASH = 5000
     37 INTERVAL_UPDATE = 500
     38 
     39 class BrowserJobs(Container):
     40     default_name = 'BrowserJobs'
     41     __notifyevents__ = ['OnIndustryJobClient', 'OnFacilitiesReloaded', 'OnSessionChanged']
     42 
     43     def ApplyAttributes(self, attributes):
     44         Container.ApplyAttributes(self, attributes)
     45         sm.RegisterNotify(self)
     46         self.callback = attributes.callback
     47         self.isInitialized = False
     48 
     49     def _OnClose(self, *args):
     50         sm.UnregisterNotify(self)
     51 
     52     def OnTabSelect(self):
     53         if self.isInitialized:
     54             self.UpdateOwnerCombo()
     55             self.UpdateInstallerCombo()
     56             self.UpdateScroll()
     57             return
     58         self.isInitialized = True
     59         self.topPanel = Container(name='topPanel', parent=self, align=uiconst.TOTOP, height=32, padding=(0, 6, 0, 6))
     60         self.bottomButtons = ButtonGroup(parent=self)
     61         self.deliverSelectedBtn = self.bottomButtons.AddButton(localization.GetByLabel('UI/Industry/DeliverSelectedJobs'), self.DeliverSelectedJobs)
     62         self.deliverAllBtn = self.bottomButtons.AddButton(localization.GetByLabel('UI/Industry/DeliverAllJobs'), self.DeliverAllJobs)
     63         self.scroll = Scroll(parent=self, id='JobBrowser')
     64         self.scroll.OnSelectionChange = self.OnScrollSelectionChange
     65         self.scroll.Confirm = self.OnScrollReturn
     66         self.viewModeButtons = ViewModeButtons(parent=self.topPanel, align=uiconst.TORIGHT, controller=self, settingsID='IndustryBlueprintBrowserViewMode')
     67         self.ownerCombo = Combo(name='ownerCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnOwnerCombo, width=128, padRight=4)
     68         self.statusCombo = Combo(name='statusCombo', parent=self.topPanel, align=uiconst.TOLEFT, prefsKey='IndustryJobStatus', callback=self.OnStatusCombo, width=134, padRight=4)
     69         self.activityCombo = Combo(name='activityCombo', parent=self.topPanel, align=uiconst.TOLEFT, prefsKey='IndustryBlueprintActivity', callback=self.OnActivityCombo, options=self.GetActivityOptions(), width=120, padRight=4, maxVisibleEntries=7)
     70         self.installerCombo = Combo(name='installerCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnInstallerCombo, options=self.GetInstallerOptions(), width=140, padRight=4)
     71         self.filterEdit = QuickFilterEdit(name='searchField', parent=self.topPanel, maxLength=64, align=uiconst.TORIGHT, OnClearFilter=self.OnFilterEditCleared, padRight=4, isTypeField=True, width=144)
     72         self.filterEdit.ReloadFunction = self.OnFilterEdit
     73         self.UpdateStatusCombo()
     74         self.UpdateOwnerCombo()
     75         self.UpdateInstallerCombo()
     76         self.UpdateScroll()
     77         uthread.new(self._UpdateJobCountersThread)
     78 
     79     def OnTabDeselect(self):
     80         if self.isInitialized:
     81             self.scroll.Clear()
     82 
     83     def OnScrollSelectionChange(self, entries):
     84         if entries:
     85             self.callback(entries[0].jobData)
     86         self.UpdateDeliverButtons()
     87 
     88     def OnScrollReturn(self, *args):
     89         self.DeliverJobs(self.scroll.GetSelected())
     90 
     91     def OnFilterEdit(self):
     92         self.UpdateScroll()
     93 
     94     def OnFilterEditCleared(self):
     95         self.UpdateScroll()
     96 
     97     def OnViewModeChanged(self, viewMode):
     98         self.UpdateScroll()
     99 
    100     @telemetry.ZONE_METHOD
    101     def OnIndustryJobClient(self, jobID = None, status = None, successfulRuns = None, **kwargs):
    102         if self.destroyed or self.IsHidden():
    103             return
    104         if self.isInitialized and self.display:
    105             self.UpdateJobEntry(jobID, status, successfulRuns)
    106             self.UpdateDeliverButtons()
    107 
    108     def OnFacilitiesReloaded(self, facilityIDs):
    109         if self.destroyed or self.IsHidden() or not (self.isInitialized and self.display):
    110             return
    111         if facilityIDs is None:
    112             self.UpdateScroll()
    113             return
    114         for node in self.scroll.GetNodes():
    115             if node.jobData.facilityID in facilityIDs:
    116                 self.UpdateScroll()
    117                 return
    118 
    119     def OnSessionChanged(self, isRemote, session, change):
    120         if 'solarsystemid2' in change or 'stationid' in change:
    121             self.UpdateScroll()
    122         if 'corpid' in change:
    123             self.UpdateOwnerCombo()
    124             self.UpdateScroll()
    125 
    126     @telemetry.ZONE_METHOD
    127     def UpdateJobEntry(self, jobID, status, successfulRuns):
    128         for node in self.scroll.GetNodes():
    129             if node.jobData.jobID == jobID:
    130                 if node.panel:
    131                     node.panel.OnStatusChanged(status, successfulRuns)
    132                 else:
    133                     node.jobData.status = status
    134                     node.jobData.successfulRuns = successfulRuns
    135                 break
    136         else:
    137             log.LogInfo("UpdateJobEntry: Reloading scroll because job couldn't be found, jobId=", jobID)
    138             self.UpdateScroll_throttled()
    139 
    140     def IsSomeJobReady(self):
    141         for node in self.scroll.GetNodes():
    142             if node.jobData.status == industry.STATUS_READY:
    143                 return True
    144 
    145         return False
    146 
    147     def IsSomeReadyJobSelected(self):
    148         for node in self.scroll.GetSelected():
    149             if node.jobData.status == industry.STATUS_READY:
    150                 return True
    151 
    152         return False
    153 
    154     @telemetry.ZONE_METHOD
    155     def UpdateDeliverButtons(self):
    156         self.deliverAllBtn.display = self.IsSomeJobReady()
    157         self.bottomButtons.display = self.deliverAllBtn.display
    158         self.deliverSelectedBtn.display = self.IsSomeReadyJobSelected()
    159         self.bottomButtons.ResetLayout()
    160 
    161     @threadutils.throttled(1.0)
    162     def UpdateScroll_throttled(self):
    163         self.UpdateScroll()
    164 
    165     @telemetry.ZONE_METHOD
    166     def UpdateScroll(self):
    167         if not self.isInitialized:
    168             return
    169         self.scroll.ShowLoading()
    170         statusFilter = self.statusCombo.selectedValue
    171         jobs = self.GetJobData(statusFilter == STATUS_COMPLETED)
    172         toPrime = filter(None, [ x.outputLocationID for x in jobs if not x.IsOutputLocationSameAsFacility() ])
    173         cfg.evelocations.Prime(toPrime)
    174         scrollList = self.GetScrollList(jobs)
    175         self.scroll.sr.defaultColumnWidth = JobEntry.GetDefaultColumnWidth()
    176         isPersonalJob = self.ownerCombo.GetValue() == OWNER_ME
    177         self.scroll.LoadContent(contentList=scrollList, headers=JobEntry.GetHeaders(isPersonalJob=isPersonalJob), noContentHint=localization.GetByLabel('UI/Industry/NoJobsFound'))
    178         self.scroll.HideLoading()
    179         self.UpdateDeliverButtons()
    180 
    181     def GetJobData(self, includeCompleted):
    182         if self.IsCorpSelected():
    183             jobs = sm.GetService('industrySvc').GetCorporationJobs(includeCompleted)
    184         else:
    185             jobs = sm.GetService('industrySvc').GetCharacterJobs(includeCompleted)
    186         return jobs
    187 
    188     @telemetry.ZONE_METHOD
    189     def GetScrollList(self, jobs):
    190         scrollList = []
    191         for jobData in jobs:
    192             if self.IsFilteredOut(jobData):
    193                 continue
    194             node = Bunch(jobData=jobData, decoClass=JobEntry, sortValues=JobEntry.GetColumnSortValues(jobData, jobData.distance), viewMode=self.viewModeButtons.GetViewMode(), jumps=max(0, jobData.distance), name=u'JobEntry_{}'.format(jobData.blueprint.typeID))
    195             scrollList.append(node)
    196 
    197         return scrollList
    198 
    199     def IsFilteredOut(self, jobData):
    200         statusFilter = self.statusCombo.selectedValue
    201         if statusFilter == STATUS_INCOMPLETE and jobData.completed or statusFilter == STATUS_READY and not jobData.status == industry.STATUS_READY or statusFilter == STATUS_INSTALLED and not jobData.status == industry.STATUS_INSTALLED or statusFilter == STATUS_COMPLETED and not jobData.completed or statusFilter == STATUS_PAUSED and not jobData.status == industry.STATUS_PAUSED:
    202             return True
    203         if self.IsCorpSelected():
    204             installerType = self.installerCombo.GetValue()
    205             if installerType == INSTALLER_ME and jobData.installerID != session.charid:
    206                 return True
    207             if installerType == INSTALLER_CORPMATE and jobData.installerID == session.charid:
    208                 return True
    209         filterText = self.filterEdit.GetValue().strip().lower()
    210         if filterText:
    211             text = jobData.blueprint.GetName() + jobData.GetFacilityName() + jobData.GetInstallerName()
    212             if text.lower().find(filterText) == -1:
    213                 return True
    214         activityValue = self.activityCombo.GetValue()
    215         if activityValue and activityValue != jobData.activityID:
    216             return True
    217         return False
    218 
    219     def OnStatusCombo(self, combo, key, value):
    220         settings.user.ui.Set('IndustryJobBrowserStatus', value)
    221         self.UpdateScroll()
    222 
    223     def UpdateStatusCombo(self):
    224         options = ((localization.GetByLabel('UI/Industry/StatusAllActiveJobs'), STATUS_INCOMPLETE),
    225          (localization.GetByLabel('UI/Industry/StatusInProgress'),
    226           STATUS_INSTALLED,
    227           None,
    228           STATUS_ICONS[STATUS_INSTALLED]),
    229          (localization.GetByLabel('UI/Industry/StatusReady'),
    230           STATUS_READY,
    231           None,
    232           STATUS_ICONS[STATUS_READY]),
    233          (localization.GetByLabel('UI/Industry/StatusHalted'),
    234           STATUS_PAUSED,
    235           None,
    236           STATUS_ICONS[STATUS_PAUSED]),
    237          (localization.GetByLabel('UI/Industry/StatusHistory'),
    238           STATUS_COMPLETED,
    239           None,
    240           STATUS_ICONS[STATUS_COMPLETED]))
    241         select = settings.user.ui.Get('IndustryJobBrowserStatus', STATUS_INCOMPLETE)
    242         self.statusCombo.LoadOptions(options, select=select)
    243 
    244     def OnActivityCombo(self, *args):
    245         self.UpdateScroll()
    246 
    247     def GetActivityOptions(self):
    248         ret = [ (localization.GetByLabel(ACTIVITY_NAMES[activityID]),
    249          activityID,
    250          None,
    251          industryUIConst.ACTIVITY_ICONS_SMALL[activityID]) for activityID in industry.ACTIVITIES ]
    252         ret.insert(0, (localization.GetByLabel('UI/Industry/AllActivities'), 0))
    253         return ret
    254 
    255     def GetInstallerOptions(self):
    256         return ((localization.GetByLabel('UI/Industry/InstalledByAnyone'), INSTALLER_ANY), (localization.GetByLabel('UI/Industry/InstalledByMe'),
    257           INSTALLER_ME,
    258           None,
    259           'res:/UI/Texture/classes/Industry/iconPersonal.png'), (localization.GetByLabel('UI/Industry/InstalledByCorpmates'),
    260           INSTALLER_CORPMATE,
    261           None,
    262           'res:/UI/Texture/classes/Industry/iconCorp.png'))
    263 
    264     def OnInstallerCombo(self, combo, key, value):
    265         settings.user.ui.Set('IndustryJobsBrowserInstaller', value)
    266         self.UpdateScroll()
    267 
    268     def UpdateInstallerCombo(self):
    269         self.installerCombo.display = self.IsCorpSelected()
    270         value = settings.user.ui.Get('IndustryJobsBrowserInstaller', INSTALLER_ANY)
    271         self.installerCombo.SelectItemByValue(value)
    272 
    273     def OnOwnerCombo(self, combo, key, value):
    274         settings.user.ui.Set('IndustryBlueprintBrowserOwner', value)
    275         self.UpdateInstallerCombo()
    276         self.UpdateScroll()
    277 
    278     def IsCorpSelected(self):
    279         return self.ownerCombo.GetValue() == OWNER_CORP
    280 
    281     def UpdateOwnerCombo(self):
    282         options = [(localization.GetByLabel('UI/Industry/OwnedByMe'), OWNER_ME)]
    283         if sm.GetService('blueprintSvc').CanSeeCorpBlueprints():
    284             options.append((localization.GetByLabel('UI/Industry/OwnedByCorp'),
    285              OWNER_CORP,
    286              None,
    287              'res:/UI/Texture/classes/Industry/iconCorp.png'))
    288         select = settings.user.ui.Get('IndustryBlueprintBrowserOwner', OWNER_ME)
    289         self.ownerCombo.LoadOptions(options, select=select)
    290 
    291     def _UpdateJobCountersThread(self):
    292         msecs = 0
    293         while not self.destroyed:
    294             animate = False
    295             msecs += INTERVAL_UPDATE
    296             if msecs >= INTERVAL_FLASH:
    297                 msecs = 0
    298                 animate = True
    299             nodes = self.scroll.GetVisibleNodes()
    300             for i, node in enumerate(nodes):
    301                 if node.panel:
    302                     node.panel.UpdateValues(animate, i)
    303 
    304             blue.synchro.SleepWallclock(INTERVAL_UPDATE)
    305 
    306     def DeliverAllJobs(self, *args):
    307         self.DeliverJobs(self.scroll.GetNodes())
    308 
    309     def DeliverSelectedJobs(self, *args):
    310         self.DeliverJobs(self.scroll.GetSelected())
    311 
    312     def DeliverJobs(self, nodes):
    313         jobIDsAndSolarSystems = [ (node.jobData.jobID, node.jobData.solarSystemID) for node in nodes if node.jobData.status == industry.STATUS_READY ]
    314         sm.GetService('industrySvc').CompleteJobs(jobIDsAndSolarSystems)
    315         sm.GetService('audio').SendUIEvent('ind_jobDelivered')