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

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)