From 1ac8279bc8c6df9ed8aa81466f863942e23fe749 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sun, 24 Apr 2011 00:35:25 +0400 Subject: [PATCH] Performance optimizations --- gui/marketBrowser.py | 27 ++++++++++++--------- service/market.py | 58 ++++++++++++++++++++++++-------------------- 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 1aa29d214..a1aecf6ed 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -73,11 +73,13 @@ class MarketBrowser(wx.Panel): btn.Bind(wx.EVT_TOGGLEBUTTON, self.toggleMetaButton) btn.metaName = name self.metaButtons.append(btn) + # Make itemview to set toggles according to list contents self.itemView.setToggles() p.SetMinSize((wx.SIZE_AUTO_WIDTH, btn.GetSize()[1] + 5)) def toggleMetaButton(self, event): + """Process clicks on toggle buttons""" ctrl = wx.GetMouseState().ControlDown() ebtn = event.EventObject if not ctrl: @@ -92,20 +94,19 @@ class MarketBrowser(wx.Panel): # But the button is toggled by wx and we should deal with it activeBtns = set() for btn in self.metaButtons: - if (btn.GetValue() and btn != ebtn) or (not btn.GetValue() and btn == ebtn): + if (btn.GetValue() is True and btn != ebtn) or (btn.GetValue() is False and btn == ebtn): activeBtns.add(btn) # Do 'nothing' if we're trying to turn last active button off if len(activeBtns) == 1 and activeBtns.pop() == ebtn: # Keep button in the same state ebtn.SetValue(True) return - + # Leave old unfiltered list contents, just re-filter them and show self.itemView.filterItemStore() def jump(self, item): self.marketView.jump(item) - class SearchBox(wx.SearchCtrl): def __init__(self, parent): wx.SearchCtrl.__init__(self, parent, wx.ID_ANY, style=wx.TE_PROCESS_ENTER) @@ -122,6 +123,7 @@ class MarketTree(wx.TreeCtrl): self.sMarket = marketBrowser.sMarket self.marketBrowser = marketBrowser + # Form market tree root sMkt = self.sMarket for mktGrp in sMkt.getMarketRoot(): iconId = self.addImage(sMkt.getIconByMarketGroup(mktGrp)) @@ -139,6 +141,7 @@ class MarketTree(wx.TreeCtrl): return self.imageList.GetImageIndex(iconFile, "pack") def expandLookup(self, event): + """Process market tree expands""" root = event.Item child = self.GetFirstChild(root)[0] # If child of given market group is a dummy @@ -148,19 +151,19 @@ class MarketTree(wx.TreeCtrl): # And add real market group contents sMkt = self.sMarket currentMktGrp = sMkt.getMarketGroup(self.GetPyData(root)) - #for id, name, iconFile, more in sMkt.getMarketGroupChildren(mg): for childMktGrp in sMkt.getMarketGroupChildren(currentMktGrp): # If market should have items but it doesn't, do not show it - if not sMkt.marketGroupValidityCheck(childMktGrp): + if sMkt.marketGroupValidityCheck(childMktGrp) is False: continue iconId = self.addImage(sMkt.getIconByMarketGroup(childMktGrp)) childId = self.AppendItem(root, childMktGrp.name, iconId, data=wx.TreeItemData(childMktGrp.ID)) - if not sMkt.marketGroupHasTypesCheck(childMktGrp): + if sMkt.marketGroupHasTypesCheck(childMktGrp) is False: self.AppendItem(childId, "dummy") self.SortChildren(root) def jump(self, item): + """Open market group and meta tab of given item""" self.marketBrowser.searchMode = False sMkt = self.sMarket mg = sMkt.getMarketGroupByItem(item) @@ -267,7 +270,7 @@ class ItemView(d.Display): if len(metaIDs.intersection(btnMetas)) > 0: btn.Enable(True) # Select all available buttons if we're searching - if self.marketBrowser.searchMode: + if self.marketBrowser.searchMode is True: btn.SetValue(True) # Select explicitly requested button if forcedMetaSelect is not None: @@ -278,7 +281,7 @@ class ItemView(d.Display): if btn.GetValue(): anySelection = True # If no buttons are pressed, press first active - if not anySelection: + if anySelection is False: for btn in self.marketBrowser.metaButtons: if btn.Enabled: btn.SetValue(True) @@ -314,10 +317,10 @@ class ItemView(d.Display): self.filterItemStore() def itemSort(self, item): - if item.metaGroup is None: - return (item.name, 0, item.name) - else: - return (item.metaGroup.parent.name, item.metaGroup.ID , item.name) + sMkt = self.sMarket + parentname = sMkt.getParentItemByItem(item).name + mgid = sMkt.getMetaGroupIdByItem(item) + return (parentname, mgid, item.name) def contextMenu(self, event): # Check if something is selected, if so, spawn the menu for it diff --git a/service/market.py b/service/market.py index 15ea5d591..e839442a3 100644 --- a/service/market.py +++ b/service/market.py @@ -161,7 +161,6 @@ class Market(): self.les_grp.category = ships self.les_grp.categoryID = ships.ID self.les_grp.description = "" - # TODO: fetch proper icon for LES group self.les_grp.icon = None self.ITEMS_FORCEGROUP = { "Opux Luxury Yacht": self.les_grp, # One of those is wedding present at CCP fanfest, another was hijacked from ISD guy during an event @@ -175,8 +174,6 @@ class Market(): "Tempest Tribal Issue": self.les_grp, # AT4 prize "Apotheosis": self.les_grp, # 5th EVE anniversary present "Zephyr": self.les_grp, # 2010 new year gift - # TODO: check to which group assign iris - #"Prototype Iris Probe Launcher", # 2010 new year gift "Primae": self.les_grp, # Promotion of planetary interaction "Freki": self.les_grp, # AT7 prize "Mimir": self.les_grp, # AT7 prize @@ -420,14 +417,16 @@ class Market(): else: return None - def getParentItemByItem(self, item): + def getParentItemByItem(self, item, selfparent=True): """Get parent item by item""" mg = self.getMetaGroupByItem(item) if mg: parent = mg.parent # Consider self as parent if item has no parent in database - else: + elif selfparent is True: parent = item + else: + parent = None return parent def getVariationsByItem(self, item): @@ -460,24 +459,30 @@ class Market(): children.add(child) return children - def getItemsByMarketGroup(self, mg): + def getItemsByMarketGroup(self, mg, vars=True): """Get items in the given market group""" - # TODO: probably it's better to compose list of parents first, then request variations due to performance reasons - res = set() + result = set() + # Get items from eos market group baseitms = mg.items + # Add hardcoded items to set if mg.ID in self.ITEMS_FORCEDMARKETGROUP_R: baseitms += list(self.getItem(itmn) for itmn in self.ITEMS_FORCEDMARKETGROUP_R[mg.ID]) - for item in baseitms: - res.add(item) - vars = self.getVariationsByItem(item) - for var in vars: - # There's no poin int additional requests if we already added item to results - if var in res: - continue - # Exclude items with their own explicitly defined market groups - if self.getMarketGroupByItem(var, parentcheck=False) is None: - res.add(var) - return res + if vars: + for item in baseitms: + # Add one of the base market group items to result + result.add(item) + parent = self.getParentItemByItem(item, selfparent=False) + # If item has no parent, it's base item (or at least should be) + if parent is None: + # Fetch variations only for parent items + variations = self.getVariationsByItem(item) + for variation in variations: + # Exclude items with their own explicitly defined market groups + if self.getMarketGroupByItem(variation, parentcheck=False) is None: + result.add(variation) + else: + result = set(baseitms) + return result def marketGroupHasTypesCheck(self, mg): """If market group has any items, return true""" @@ -492,6 +497,8 @@ class Market(): def marketGroupValidityCheck(self, mg): """Check market group validity""" + # The only known case when group can be invalid is + # when it's declared to have types, but it doesn't contain anything if mg.hasTypes and not self.marketGroupHasTypesCheck(mg): return False else: @@ -502,11 +509,13 @@ class Market(): if mg.icon: return mg.icon.iconFile else: - if mg.hasTypes and len(mg.items) > 0: - item = mg.items[0] + if self.marketGroupHasTypesCheck(mg): + # Do not request variations to make process faster + # Pick random item and use its icon + item = self.getItemsByMarketGroup(mg, vars=False).pop() return item.icon.iconFile if item.icon else "" - elif len(mg.children) > 0: - return self.getIconByMarketGroup(mg.children[0]) + elif self.getMarketGroupChildren(mg) > 0: + return self.getIconByMarketGroup(self.getMarketGroupChildren(mg).pop()) else: return "" @@ -596,9 +605,6 @@ class Market(): filtered = set(filter(lambda item: self.getMetaGroupIdByItem(item) in metas, items)) return filtered - ################################# - # Price stuff, didn't modify it # - ################################# def getPriceNow(self, typeID): """Get price for provided typeID""" price = self.priceCache.get(typeID)