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