browserBlueprints.py (27994B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\industry\browserBlueprints.py 2 from __future__ import absolute_import 3 from collections import defaultdict 4 import gametime 5 from carbonui.control.combo import Combo 6 from carbonui.primitives.container import Container 7 from carbonui.primitives.containerAutoSize import ContainerAutoSize 8 from carbonui.util.bunch import Bunch 9 from eve.client.script.ui.control.eveScroll import Scroll 10 from player_messaging.client.ui_message import message_player 11 from eve.client.script.ui.control.utilMenu import UtilMenu 12 from eve.client.script.ui.quickFilter import QuickFilterEdit 13 from eve.client.script.ui.shared.industry.viewModeButtons import ViewModeButtons 14 from eve.client.script.ui.shared.industry.blueprintEntry import BlueprintEntry 15 from eve.common.lib import appConst as const 16 import evetypes 17 import industry 18 import localization 19 import carbonui.const as uiconst 20 import blue 21 import telemetry 22 from carbonui.uicore import uicore 23 from eveexceptions import UserError 24 from carbonui import TextColor 25 from carbonui.text.styles import TextDetail 26 from industry import facility 27 from .labelUtils import GetFacilityLabelWithJump 28 FACILITY_CURRENT = -1 29 FACILITY_NONE = -2 30 FACILITY_ALL = -3 31 FACILITY_NO_SELECTION = -4 32 FACILITY_NOT_SPECIFIC = (FACILITY_NONE, FACILITY_ALL, FACILITY_NO_SELECTION) 33 OWNER_ME = 1 34 OWNER_CORP = 2 35 BLUEPRINTS_ALL = 1 36 BLUEPRINTS_ORIGINAL = 2 37 BLUEPRINTS_COPY = 3 38 BLUEPRINTS_ANCIENT_RELICS = 4 39 BLUEPRINTS_FORMULAS = 5 40 GROUPS_ALL = (None, None) 41 42 class BrowserBlueprints(Container): 43 default_name = 'BrowserBlueprints' 44 default_isCorp = False 45 __notifyevents__ = ['OnBlueprintReload', 'OnIndustryJobClient', 'OnSessionChanged'] 46 47 def ApplyAttributes(self, attributes): 48 Container.ApplyAttributes(self, attributes) 49 sm.RegisterNotify(self) 50 self.callback = attributes.callback 51 self.isInitialized = False 52 self.jobData = None 53 self.solarsystemIDbyFacilityID = {} 54 self.maxBlueprintCount = sm.GetService('blueprintSvc').blueprintLimit 55 self.updateScrollTimestamp = None 56 57 def SetFocus(self, *args): 58 if self.isInitialized: 59 uicore.registry.SetFocus(self.scroll) 60 61 def UpdateSelectedEntry(self): 62 if self.jobData: 63 self.OnActivitySelected(self.jobData.blueprintID, self.jobData.activityID) 64 65 def OnNewJobData(self, jobData): 66 self.jobData = jobData 67 if self.isInitialized: 68 self.UpdateSelectedEntry() 69 70 def OnTabSelect(self): 71 if self.isInitialized: 72 self.UpdateOwnerCombo() 73 self.UpdateScroll() 74 return 75 self.isInitialized = True 76 self.topPanel = Container(name='topPanel', parent=self, align=uiconst.TOTOP, height=32, padding=(0, 6, 0, 6)) 77 self.ConstructFilterTextCont() 78 self.scroll = Scroll(parent=self, id='BlueprintBrowser', discardNonVisibleNodes=True) 79 self.scroll.OnSelectionChange = self.OnScrollSelectionChange 80 self.scroll.OnKeyDown = self.OnScrollKeyDown 81 self.scroll.OnChar = self.OnScrollChar 82 utilMenuCont = Container(align=uiconst.TOLEFT, parent=self.topPanel, width=20) 83 UtilMenu(menuAlign=uiconst.BOTTOMLEFT, parent=utilMenuCont, align=uiconst.CENTERLEFT, GetUtilMenu=self.GetSettingsMenu, texturePath='res:/UI/Texture/SettingsCogwheel.png', width=16, height=16, iconSize=18) 84 self.ownerCombo = Combo(name='ownerCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnOwnerCombo, width=126) 85 self.facilityCombo = Combo(name='facilityCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnFacilityCombo, width=200, padLeft=5) 86 self.invLocationCombo = Combo(name='invLocationCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnInvLocationCombo, padLeft=5, width=180, settingsID='IndustryBlueprintBrowserInvLocation') 87 self.blueprintTypeCombo = Combo(name='blueprintTypeCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnBlueprintTypeCombo, padLeft=5, width=124, settingsID='IndustryBlueprintBrowserType', options=self.GetBlueprintTypeComboOptions()) 88 self.categoryGroupCombo = Combo(name='categoryGroupCombo ', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnCategoryGroupCombo, padLeft=5, width=104) 89 self.viewModeButtons = ViewModeButtons(parent=self.topPanel, align=uiconst.TORIGHT, controller=self, settingsID='IndustryBlueprintBrowserViewMode') 90 self.filterEdit = QuickFilterEdit(name='searchField', parent=self.topPanel, maxLength=64, align=uiconst.TORIGHT, padRight=4, isTypeField=True, width=144) 91 self.filterEdit.ReloadFunction = self.OnFilterEdit 92 self.UpdateOwnerCombo() 93 self.UpdateBlueprintTypeCombo() 94 self.UpdateScroll() 95 96 def ConstructFilterTextCont(self): 97 self.filterTextCont = ContainerAutoSize(name='filterTextCont', parent=self, align=uiconst.TOBOTTOM, padTop=8, state=uiconst.UI_NORMAL, alignMode=uiconst.TOTOP) 98 self.totalFilterLabel = TextDetail(name='totalFilterLabel', parent=self.filterTextCont, align=uiconst.TORIGHT) 99 currentCont = ContainerAutoSize(parent=self.filterTextCont, align=uiconst.TOTOP, padRight=8) 100 self.currentFilterLabel = TextDetail(name='currentFilterLabel', parent=currentCont, align=uiconst.TOPLEFT, maxLines=1, autoFadeSides=16) 101 self.UpdateBlueprintCounterVisibility() 102 103 def UpdateFilterText(self, visibleBp, numBpInFacility, totalBp, facilityID): 104 if not self.IsBlueprintCounterVisible(): 105 return 106 try: 107 facilityName = self.GetFacilityLabelFromID(facilityID) 108 except UserError: 109 facilityName = localization.GetByLabel('UI/Industry/UnknownLocation') 110 111 self.currentFilterLabel.text = localization.GetByLabel('UI/Industry/NumShowingBpInLocation', numVisible=visibleBp, numInLocation=numBpInFacility, locationName=facilityName, color=TextColor.SECONDARY.hex_argb) 112 self.totalFilterLabel.text = localization.GetByLabel('UI/Industry/NumTotalBlueprints', numBp=totalBp, color=TextColor.SECONDARY.hex_argb) 113 114 def GetSettingsMenu(self, menuParent): 115 (menuParent.AddCheckBox(text=localization.GetByLabel('UI/Industry/ShowBlueprintsInUse'), checked=self.IsBlueprintsInUseShown(), callback=self.ToggleShowBlueprintsInUse),) 116 menuParent.AddCheckBox(text=localization.GetByLabel('UI/Industry/ShowAvailableOnly'), checked=self.IsAvailableBlueprintsOnlyShown(), callback=self.ToggleShowAvailableBlueprintsOnly) 117 menuParent.AddCheckBox(text=localization.GetByLabel('UI/Industry/ShowBlueprintCounter'), checked=self.IsBlueprintCounterVisible(), callback=self.ToggleShowBlueprintCounter) 118 119 def ToggleShowBlueprintsInUse(self): 120 settings.user.ui.Set('industryShowBlueprintsInUse', not self.IsBlueprintsInUseShown()) 121 self.UpdateScroll() 122 123 def ToggleShowAvailableBlueprintsOnly(self): 124 settings.user.ui.Set('industryShowAvailableBlueprintsOnly', not self.IsAvailableBlueprintsOnlyShown()) 125 self.UpdateScroll() 126 127 def ToggleShowBlueprintCounter(self): 128 settings.user.ui.Set('industryShowBlueprintCounter', not self.IsBlueprintCounterVisible()) 129 self.UpdateBlueprintCounterVisibility() 130 131 @telemetry.ZONE_METHOD 132 def OnActivitySelected(self, itemID, activityID = None): 133 if not self.isInitialized or activityID is None: 134 return 135 for node in self.scroll.GetNodes(): 136 node.selected = node.bpData.blueprintID == itemID 137 self.scroll.UpdateSelection(node) 138 if node.panel is None: 139 continue 140 node.panel.OnActivitySelected(itemID, activityID) 141 142 def OnBlueprintReload(self, ownerID): 143 if self.destroyed or not self.isInitialized: 144 return 145 if self.isInitialized and self.display: 146 currentOwnerID = session.corpid if self.IsCorpSelected() else session.charid 147 if currentOwnerID == ownerID: 148 self.UpdateScroll() 149 150 @telemetry.ZONE_METHOD 151 def OnIndustryJobClient(self, jobID = None, blueprintID = None, status = None, **kwargs): 152 if not self.isInitialized: 153 return 154 for node in self.scroll.GetNodes(): 155 if node.bpData.blueprintID == blueprintID: 156 if status < industry.STATUS_COMPLETED: 157 node.bpData.jobID = jobID 158 else: 159 node.bpData.jobID = None 160 if node.panel: 161 node.panel.OnJobStateChanged(status) 162 163 def OnSessionChanged(self, isremote, session, change): 164 if set(change.keys()) & {'stationid', 'structureid', 'solarsystemid2'}: 165 self.UpdateScroll() 166 167 def OnFilterEdit(self): 168 self.UpdateScroll() 169 170 def OnViewModeChanged(self, viewMode): 171 self.UpdateScroll() 172 173 def UpdateFacilityCombo(self, blueprintCountByfacilityID, suppressCollections): 174 defaultFacilityID = self.GetDefaultFacilitySelection() 175 if defaultFacilityID not in FACILITY_NOT_SPECIFIC: 176 blueprintCountByfacilityID.setdefault(defaultFacilityID, 0) 177 suppressCollections = suppressCollections or sum(blueprintCountByfacilityID.values()) >= self.maxBlueprintCount 178 if not suppressCollections: 179 options = [(localization.GetByLabel('UI/Industry/AllFacilities'), FACILITY_ALL)] 180 elif defaultFacilityID in FACILITY_NOT_SPECIFIC: 181 options = [(' - ', FACILITY_NO_SELECTION)] 182 else: 183 options = [] 184 facilitySvc = sm.GetService('facilitySvc') 185 for facilityID, blueprintCount in blueprintCountByfacilityID.iteritems(): 186 if facilityID is None and not suppressCollections: 187 label = localization.GetByLabel('UI/ScienceAndIndustry/ScienceAndIndustryWindow/NonFacilityLocationsNumberOfBlueprints', blueprints=blueprintCount) 188 options.append((label, FACILITY_NONE)) 189 elif facilityID is not None: 190 try: 191 facility = facilitySvc.GetFacility(facilityID) 192 self.solarsystemIDbyFacilityID[facilityID] = facility.solarSystemID 193 options.append((self.GetFacilityLabel(facility, blueprintCount), facilityID)) 194 except UserError: 195 pass 196 197 options = sorted(options, key=self._GetFacilitySortKey) 198 self.facilityCombo.LoadOptions(options, select=defaultFacilityID) 199 200 def GetDefaultFacilitySelection(self): 201 if self.IsCorpSelected(): 202 facilityID = settings.user.ui.Get('BrowserBlueprintsFacilitiesCorp', FACILITY_CURRENT) 203 else: 204 facilityID = settings.user.ui.Get('BrowserBlueprintsFacilities', FACILITY_CURRENT) 205 if isinstance(facilityID, tuple) or facilityID is None: 206 facilityID = FACILITY_CURRENT 207 if facilityID == FACILITY_CURRENT: 208 dockableLocationID = session.stationid or session.structureid 209 if dockableLocationID: 210 facilityID = dockableLocationID 211 else: 212 facilityID = FACILITY_ALL 213 return facilityID 214 215 def GetDefaultInvLocationSelection(self): 216 if self.IsCorpSelected(): 217 return settings.user.ui.Get('BrowserBlueprintsInvLocationCorp', None) 218 else: 219 return settings.user.ui.Get('BrowserBlueprintsInvLocation', None) 220 221 def _GetFacilitySortKey(self, option): 222 _, facilityID = option 223 if facilityID in FACILITY_NOT_SPECIFIC: 224 return facilityID 225 if facilityID == session.stationid: 226 return FACILITY_CURRENT 227 solarsystemID = self.solarsystemIDbyFacilityID[facilityID] 228 return self.GetJumpsTo(solarsystemID) 229 230 def GetFacilityLabel(self, facility, blueprintCount): 231 if session.stationid and facility.facilityID == session.stationid or session.structureid and facility.facilityID == session.structureid: 232 return localization.GetByLabel('UI/Industry/CurrentStation') 233 if blueprintCount is None: 234 return facility.GetName() 235 return GetFacilityLabelWithJump(localization.GetByLabel, facility.GetName(), blueprintCount, facility.distance) 236 237 def GetFacilityLabelFromID(self, facilityID): 238 if facilityID in (None, FACILITY_NONE): 239 return localization.GetByLabel('UI/Industry/OtherLocations') 240 if facilityID == FACILITY_ALL: 241 return localization.GetByLabel('UI/Industry/AllFacilities') 242 facility = sm.GetService('facilitySvc').GetFacility(facilityID) 243 return self.GetFacilityLabel(facility, None) 244 245 def GetJumpsTo(self, solarsystemID): 246 return sm.GetService('clientPathfinderService').GetJumpCountFromCurrent(solarsystemID) or 0 247 248 def OnFacilityCombo(self, combo, key, value): 249 if value == session.stationid: 250 value = FACILITY_CURRENT 251 if self.IsCorpSelected(): 252 settings.user.ui.Set('BrowserBlueprintsFacilitiesCorp', value) 253 else: 254 settings.user.ui.Set('BrowserBlueprintsFacilities', value) 255 self.UpdateScroll() 256 257 def GetInvLocations(self, blueprints): 258 locations = {} 259 for bpData in blueprints: 260 flagID = bpData.flagID 261 if self.IsContainerFlag(flagID): 262 flagID = const.flagHangar 263 locations[bpData.locationID, flagID] = bpData 264 265 locations = sorted(locations.items(), cmp=self._CompareLocations) 266 return locations 267 268 def _CompareLocations(self, location1, location2): 269 (locationID1, flagID1), bpData1 = location1 270 (locationID2, flagID2), bpData2 = location2 271 idx1 = const.corpDivisionsByFlag.get(flagID1) 272 idx2 = const.corpDivisionsByFlag.get(flagID2) 273 if idx1 is None and idx2 is None: 274 return cmp(bpData1.GetLocationName(), bpData2.GetLocationName()) 275 elif idx1 is None and idx2 is not None: 276 return 1 277 elif idx1 is not None and idx2 is None: 278 return -1 279 else: 280 return cmp(idx1, idx2) 281 282 def GetSelectedFacilityID(self): 283 facilityID = self.facilityCombo.GetValue() 284 if facilityID == FACILITY_CURRENT: 285 return session.stationid 286 return facilityID 287 288 def UpdateInvLocationCombo(self, blueprints): 289 facilityID = self.GetSelectedFacilityID() 290 options = [] 291 if facilityID and facilityID not in FACILITY_NOT_SPECIFIC: 292 locations = self.GetInvLocations((b for b in blueprints if b.facilityID == facilityID)) 293 options = sorted([ (bpData.GetLocationName(), 294 key, 295 None, 296 bpData.location.GetIcon()) for key, bpData in locations ]) 297 if len(options) != 1: 298 options.insert(0, (localization.GetByLabel('UI/Industry/AllInventoryLocations'), (None, None))) 299 selection = self.GetDefaultInvLocationSelection() 300 if selection not in (o[1] for o in options): 301 selection = options[0][1] 302 self.invLocationCombo.LoadOptions(options, select=selection) 303 304 def OnOwnerCombo(self, combo, key, value): 305 settings.user.ui.Set('IndustryBlueprintBrowserOwner', value) 306 self.UpdateBlueprintTypeCombo() 307 self.UpdateScroll() 308 309 def OnInvLocationCombo(self, combo, key, value): 310 if self.IsCorpSelected(): 311 settings.user.ui.Set('BrowserBlueprintsInvLocationCorp', value) 312 else: 313 settings.user.ui.Set('BrowserBlueprintsInvLocation', value) 314 self.UpdateScroll() 315 316 def UpdateBlueprintTypeCombo(self): 317 value = self.GetDefaultBlueprintTypeSelection() 318 self.blueprintTypeCombo.SelectItemByValue(value) 319 320 def GetDefaultBlueprintTypeSelection(self): 321 if self.IsCorpSelected(): 322 return settings.user.ui.Get('BrowserBlueprintsBlueprintTypeCorp', BLUEPRINTS_ALL) 323 else: 324 return settings.user.ui.Get('BrowserBlueprintsBlueprintType', BLUEPRINTS_ALL) 325 326 def OnBlueprintTypeCombo(self, combo, key, value): 327 if self.IsCorpSelected(): 328 settings.user.ui.Set('BrowserBlueprintsBlueprintTypeCorp', value) 329 else: 330 settings.user.ui.Set('BrowserBlueprintsBlueprintType', value) 331 self.UpdateScroll() 332 333 def GetBlueprintTypeComboOptions(self): 334 options = ((localization.GetByLabel('UI/Industry/AllBlueprints'), BLUEPRINTS_ALL), 335 (localization.GetByLabel('UI/Industry/Originals'), 336 BLUEPRINTS_ORIGINAL, 337 None, 338 'res:/UI/Texture/icons/bpo.png'), 339 (localization.GetByLabel('UI/Industry/Copies'), 340 BLUEPRINTS_COPY, 341 None, 342 'res:/UI/Texture/icons/bpc.png'), 343 (localization.GetByLabel('UI/Industry/AncientRelics'), 344 BLUEPRINTS_ANCIENT_RELICS, 345 None, 346 'res:/UI/Texture/icons/relic.png'), 347 (localization.GetByLabel('UI/Industry/ReactionFormulas'), 348 BLUEPRINTS_FORMULAS, 349 None, 350 'res:/UI/Texture/icons/reaction.png')) 351 return options 352 353 def OnCategoryGroupCombo(self, combo, key, value): 354 if self.IsCorpSelected(): 355 settings.user.ui.Set('BrowserBlueprintsCategoryGroupCorp', value) 356 else: 357 settings.user.ui.Set('BrowserBlueprintsCategoryGroup', value) 358 self.UpdateScroll() 359 360 def GetDefaultCategoryGroup(self): 361 if self.IsCorpSelected(): 362 return settings.user.ui.Get('BrowserBlueprintsCategoryGroupCorp', GROUPS_ALL) 363 else: 364 return settings.user.ui.Get('BrowserBlueprintsCategoryGroup', GROUPS_ALL) 365 366 def UpdateCategoryGroupCombo(self, blueprints): 367 groupsByCategories = self.GetGroupsByCategories(blueprints) 368 options = [(localization.GetByLabel('UI/Industry/AllGroups'), GROUPS_ALL)] 369 for (categoryName, categoryID), groups in groupsByCategories: 370 options.append((categoryName, (categoryID, None))) 371 for groupName, groupID in groups: 372 options.append((groupName, 373 (categoryID, groupID), 374 '', 375 None, 376 1)) 377 378 self.categoryGroupCombo.LoadOptions(options, select=self.GetDefaultCategoryGroup()) 379 380 @telemetry.ZONE_METHOD 381 def GetGroupsByCategories(self, blueprints): 382 ids = defaultdict(set) 383 uniqueBluprintTypes = set() 384 for bpData in blueprints: 385 typeID = bpData.GetProductOrBlueprintTypeID() 386 if typeID in uniqueBluprintTypes: 387 continue 388 uniqueBluprintTypes.add(typeID) 389 groupAndCategory = bpData.GetProductGroupAndCategory() 390 ids[groupAndCategory.categoryName, groupAndCategory.categoryID].add((groupAndCategory.groupName, groupAndCategory.groupID)) 391 392 ret = [] 393 for category, groups in ids.iteritems(): 394 ret.append((category, list(groups))) 395 396 ret.sort() 397 for category, groups in ret: 398 groups.sort() 399 400 return ret 401 402 def IsCorpSelected(self): 403 return self.ownerCombo.GetValue() == OWNER_CORP 404 405 def UpdateBlueprintCounterVisibility(self): 406 isVisible = self.IsBlueprintCounterVisible() 407 self.filterTextCont.display = isVisible 408 409 def UpdateScroll(self): 410 if self.IsHidden() or self.destroyed: 411 return None 412 currentUpdateTimestamp = gametime.GetWallclockTime() 413 self.updateScrollTimestamp = currentUpdateTimestamp 414 self.scroll.ShowLoading() 415 facilityID = self.GetDefaultFacilitySelection() 416 blueprints, facilities = self.GetBlueprintsData(facilityID) 417 if not self.IsLatestUpdateScroll(currentUpdateTimestamp): 418 return None 419 numTotalBp = self.GetTotalNumBlueprints() 420 bpCountLimitReached = facilityID in FACILITY_NOT_SPECIFIC and len(blueprints) == 0 and len(facilities) != 0 421 self.UpdateFacilityCombo(facilities, bpCountLimitReached) 422 self.UpdateInvLocationCombo(blueprints) 423 if not self.IsLatestUpdateScroll(currentUpdateTimestamp): 424 return None 425 numVisibleBp = 0 426 if not len(blueprints): 427 self.scroll.LoadContent(noContentHint=localization.GetByLabel('UI/Industry/NoBlueprintsFound')) 428 self.scroll.HideLoading() 429 self.UpdateFilterText(numVisibleBp, 0, numTotalBp, facilityID) 430 return None 431 filterdBps, numBpInFacility = self.GetFilteredBlueprints(blueprints, facilityID) 432 scrollList = self.GetScrollList(filterdBps, facilityID, currentUpdateTimestamp) 433 if not self.IsLatestUpdateScroll(currentUpdateTimestamp): 434 return None 435 if len(scrollList) >= self.maxBlueprintCount: 436 message_player(localization.GetByLabel('UI/Industry/MaximumEntryCountReached', count=self.maxBlueprintCount)) 437 numVisibleBp = len(scrollList) 438 self.scroll.sr.defaultColumnWidth = BlueprintEntry.GetDefaultColumnWidth() 439 self.scroll.sr.fixedColumns = BlueprintEntry.GetFixedColumns(self.viewModeButtons.GetViewMode()) 440 showImpounded = not self.IsAvailableBlueprintsOnlyShown() or facilityID == FACILITY_NONE 441 if not self.IsLatestUpdateScroll(currentUpdateTimestamp): 442 return None 443 self.scroll.LoadContent(contentList=scrollList, headers=BlueprintEntry.GetHeaders(showFacility=facilityID == FACILITY_ALL, showLocation=self.invLocationCombo.GetValue() == (None, None), showImpounded=showImpounded), noContentHint=localization.GetByLabel('UI/Industry/NoBlueprintsFound')) 444 self.UpdateFilterText(numVisibleBp, numBpInFacility, numTotalBp, facilityID) 445 self.scroll.HideLoading() 446 self.UpdateSelectedEntry() 447 448 def IsLatestUpdateScroll(self, timestamp): 449 return self.updateScrollTimestamp == timestamp 450 451 @telemetry.ZONE_METHOD 452 def GetFilteredBlueprints(self, blueprints, facilityID): 453 jumpsCache = {} 454 jumpsAndBlueprints = [] 455 numBpInFacility = 0 456 for bpData in blueprints: 457 if bpData.facilityID is None and facilityID != FACILITY_NONE: 458 continue 459 elif facilityID not in (bpData.facilityID if bpData.facilityID else FACILITY_NONE, FACILITY_ALL): 460 continue 461 numBpInFacility += 1 462 if self.IsFilteredOut(bpData): 463 continue 464 jumpsAndBlueprints.append((jumpsCache.setdefault(bpData.facilityID, bpData.GetDistance()), bpData)) 465 blue.pyos.BeNice() 466 467 self.UpdateCategoryGroupCombo([ bpData for _, bpData in jumpsAndBlueprints ]) 468 categoryID, groupID = self.categoryGroupCombo.GetValue() 469 if (categoryID, groupID) == GROUPS_ALL: 470 return (jumpsAndBlueprints, numBpInFacility) 471 ret = [] 472 for jumps, bpData in jumpsAndBlueprints: 473 typeID = bpData.GetProductOrBlueprintTypeID() 474 if groupID: 475 if evetypes.GetGroupID(typeID) == groupID: 476 ret.append((jumps, bpData)) 477 elif evetypes.GetCategoryID(typeID) == categoryID: 478 ret.append((jumps, bpData)) 479 480 return (ret, numBpInFacility) 481 482 @telemetry.ZONE_METHOD 483 def GetScrollList(self, blueprints, facilityID, currentUpdateTimestamp): 484 showFacility = facilityID == FACILITY_ALL 485 showLocation = self.invLocationCombo.GetValue() == (None, None) 486 scrollList = [] 487 for jumps, bpData in blueprints: 488 if not self.IsLatestUpdateScroll(currentUpdateTimestamp): 489 return [] 490 node = Bunch(bpData=bpData, decoClass=BlueprintEntry, sortValues=BlueprintEntry.GetColumnSortValues(bpData, jumps, showFacility, showLocation), viewMode=self.viewModeButtons.GetViewMode(), jumps=jumps, activityCallback=self.SelectActivity, showFacility=showFacility, showLocation=showLocation, item=bpData.GetItem(), charIndex=bpData.GetLabel(), name=u'BlueprintEntry_{}'.format(bpData.blueprintTypeID)) 491 scrollList.append(node) 492 blue.pyos.BeNice() 493 494 return scrollList 495 496 def GetBlueprintsData(self, facilityID): 497 facilityID = facilityID if facilityID > 0 else None 498 if self.IsCorpSelected(): 499 return sm.GetService('blueprintSvc').GetCorporationBlueprints(facilityID) 500 else: 501 return sm.GetService('blueprintSvc').GetCharacterBlueprints(facilityID) 502 503 def GetTotalNumBlueprints(self): 504 if self.IsCorpSelected(): 505 ownerID = session.corpid 506 else: 507 ownerID = session.charid 508 numTotalBp = sm.GetService('blueprintSvc').GetTotalNumBlueprintsForOwner(ownerID) 509 return numTotalBp 510 511 def IsFilteredOut(self, bpData): 512 filterText = self.filterEdit.GetValue().strip().lower() 513 if filterText: 514 productTypeObj = bpData.GetProductGroupAndCategory() 515 text = bpData.GetName() 516 if bpData.facility: 517 text += bpData.GetFacilityName() 518 text += bpData.GetLocationName() + productTypeObj.groupName + productTypeObj.categoryName 519 if text.lower().find(filterText) == -1: 520 return True 521 locationID, flagID = self.invLocationCombo.GetValue() 522 if locationID: 523 if bpData.locationID != locationID: 524 return True 525 if bpData.flagID != flagID and not self.IsContainerFlag(bpData.flagID): 526 return True 527 bpType = self.blueprintTypeCombo.GetValue() 528 if bpType != BLUEPRINTS_ALL: 529 if bpType in (BLUEPRINTS_ORIGINAL, BLUEPRINTS_COPY): 530 if bpData.IsReactionBlueprint() or bpData.IsAncientRelic(): 531 return True 532 if bpData.original != (bpType == BLUEPRINTS_ORIGINAL): 533 return True 534 elif bpType == BLUEPRINTS_FORMULAS: 535 if not bpData.IsReactionBlueprint(): 536 return True 537 elif bpType == BLUEPRINTS_ANCIENT_RELICS: 538 if not bpData.IsAncientRelic(): 539 return True 540 if not self.IsBlueprintsInUseShown(): 541 if bpData.jobID is not None: 542 return True 543 if self.IsAvailableBlueprintsOnlyShown() and bpData.IsImpounded(): 544 return True 545 return False 546 547 def IsBlueprintsInUseShown(self): 548 return settings.user.ui.Get('industryShowBlueprintsInUse', True) 549 550 def IsAvailableBlueprintsOnlyShown(self): 551 return settings.user.ui.Get('industryShowAvailableBlueprintsOnly', True) 552 553 def IsBlueprintCounterVisible(self): 554 return settings.user.ui.Get('industryShowBlueprintCounter', True) 555 556 def IsContainerFlag(self, flagID): 557 return flagID in (const.flagLocked, const.flagUnlocked) 558 559 def OnScrollSelectionChange(self, entries): 560 entry = entries[0].bpData 561 if uicore.uilib.Key(uiconst.VK_SHIFT) and uicore.uilib.Key(uiconst.VK_DOWN): 562 entry = entries[-1].bpData 563 self.SelectActivity(entry) 564 565 def OnScrollKeyDown(self, key, flag): 566 Scroll.OnKeyDown(self.scroll, key, flag) 567 if key in (uiconst.VK_LEFT, uiconst.VK_RIGHT): 568 sm.ScatterEvent('OnIndustryLeftOrRightKey', key) 569 570 def OnScrollChar(self, key, flag): 571 if key >= uiconst.VK_0 and key <= uiconst.VK_9 or key == uiconst.VK_BACK: 572 sm.ScatterEvent('OnBlueprintBrowserNumericInput', key, flag) 573 574 def SelectActivity(self, bpData, activityID = None): 575 self.callback(bpData, activityID) 576 577 def UpdateOwnerCombo(self): 578 options = [(localization.GetByLabel('UI/Industry/OwnedByMe'), OWNER_ME)] 579 if sm.GetService('blueprintSvc').CanSeeCorpBlueprints(): 580 options.append((localization.GetByLabel('UI/Industry/OwnedByCorp'), 581 OWNER_CORP, 582 None, 583 'res:/UI/Texture/classes/Industry/iconCorp.png')) 584 select = settings.user.ui.Get('IndustryBlueprintBrowserOwner', OWNER_ME) 585 self.ownerCombo.LoadOptions(options, select=select)