Performance optimizations
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user