diff --git a/gui/builtinViewColumns/attributeDisplay.py b/gui/builtinViewColumns/attributeDisplay.py index 0bf700b50..4b787f583 100644 --- a/gui/builtinViewColumns/attributeDisplay.py +++ b/gui/builtinViewColumns/attributeDisplay.py @@ -52,7 +52,10 @@ class AttributeDisplay(ViewColumn): self.columnText = info.displayName if info.displayName != "" else info.name def getText(self, mod): - attr = mod.getModifiedItemAttr(self.info.name) + if hasattr(mod, "item"): + attr = mod.getModifiedItemAttr(self.info.name) + else: + attr = mod.getAttribute(self.info.name) if attr: return (formatAmount(attr, 3, 0, 3)) else: @@ -66,4 +69,4 @@ class AttributeDisplay(ViewColumn): ("displayName", bool, False), ("showIcon", bool, True)) -AttributeDisplay.register() \ No newline at end of file +AttributeDisplay.register() diff --git a/gui/builtinViewColumns/name.py b/gui/builtinViewColumns/name.py index b77ec9bd8..b8a7fedd1 100644 --- a/gui/builtinViewColumns/name.py +++ b/gui/builtinViewColumns/name.py @@ -29,10 +29,12 @@ class StuffName(ViewColumn): self.columnText = "Name" def getText(self, stuff): - return stuff.item.name + item = getattr(stuff, "item", stuff) + return item.name def getImageId(self, mod): - iconFile = mod.item.icon.iconFile if mod.item.icon else "" + item = getattr(mod, "item", mod) + iconFile = item.icon.iconFile if item.icon else "" if iconFile: bitmap = bitmapLoader.getBitmap(iconFile, "pack") if bitmap is None: diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 02f55970c..aac4689a5 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -1,377 +1,280 @@ -#=============================================================================== -# Copyright (C) 2010 Diego Duclos -# -# This file is part of pyfa. -# -# pyfa is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# pyfa is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with pyfa. If not, see . -#=============================================================================== - -import sys -import wx -import wx.lib.newevent -import service -import bitmapLoader -import gui.mainFrame -from gui.cachingImageList import CachingImageList -from gui.contextMenu import ContextMenu - -ItemSelected, ITEM_SELECTED = wx.lib.newevent.NewEvent() - -class MarketBrowser(wx.Panel): - def __init__(self, parent): - wx.Panel.__init__(self, parent) - vbox = wx.BoxSizer(wx.VERTICAL) - self.SetSizer(vbox) - - #Add a search button on top - - #Add a WHOLE panel for ONE SINGLE search button - #We have to be able to give the search more size, which can't be done in another way. - #(That I found) - p = wx.Panel(self) - sizer = wx.BoxSizer(wx.HORIZONTAL) - p.SetSizer(sizer) - - vbox.Add(p, 0, wx.EXPAND) - self.search = wx.SearchCtrl(p, wx.ID_ANY, style=wx.TE_PROCESS_ENTER) - self.search.ShowCancelButton(True) - sizer.Add(self.search, 1, wx.EXPAND | wx.TOP, 2) - p.SetMinSize((wx.SIZE_AUTO_WIDTH, 27)) - - #Bind search - self.search.Bind(wx.EVT_TEXT_ENTER, self.scheduleSearch) - self.search.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, self.scheduleSearch) - self.search.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, self.clearSearch) - self.search.Bind(wx.EVT_TEXT, self.scheduleSearch) - - #Helper vars for search: INIT EM ALREADY - self.searching = False - self.searchResults = None - - self.searchTimer = wx.Timer() - self.searchTimer.SetOwner(self) - - self.splitter = wx.SplitterWindow(self, style = wx.SP_LIVE_UPDATE) - - vbox.Add(self.splitter, 1, wx.EXPAND) - - self.marketView = MarketTree(self.splitter) - listStyle = wx.LC_REPORT | wx.LC_NO_HEADER | wx.LC_SINGLE_SEL - self.itemView = wx.ListCtrl(self.splitter, style = listStyle) - - treeStyle = self.marketView.GetWindowStyleFlag() - treeStyle |= wx.TR_HIDE_ROOT - self.marketView.SetWindowStyleFlag(treeStyle) - - info = wx.ListItem() - info.m_mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE - info.m_image = -1 - info.m_text = "Name" - self.itemView.InsertColumnInfo(0, info) - - self.splitter.SplitHorizontally(self.marketView, self.itemView) - self.splitter.SetMinimumPaneSize(250) - - self.marketRoot = self.marketView.AddRoot("Market") - - self.marketImageList = CachingImageList(16, 16) - self.marketView.SetImageList(self.marketImageList) - - self.itemImageList = CachingImageList(16, 16) - self.itemView.SetImageList(self.itemImageList, wx.IMAGE_LIST_SMALL) - - cMarket = service.Market.getInstance() - - root = cMarket.getMarketRoot() - for id, name, iconFile in root: - iconId = self.addMarketViewImage(iconFile) - childId = self.marketView.AppendItem(self.marketRoot, name, iconId, data=wx.TreeItemData(id)) - self.marketView.AppendItem(childId, "dummy") - - self.marketView.SortChildren(self.marketRoot) - - #Bind our lookup method to when the tree gets expanded - self.marketView.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup) - self.marketView.Bind(wx.EVT_TREE_SEL_CHANGED, self.selectionMade) - - # Setup our buttons for metaGroup selection - # Same fix as for search box on macs, - # need some pixels of extra space or everything clips and is ugly - p = wx.Panel(self) - box = wx.BoxSizer(wx.HORIZONTAL) - p.SetSizer(box) - vbox.Add(p, 0, wx.EXPAND) - for name in ("normal", "faction", "complex", "officer"): - btn = wx.ToggleButton(p, wx.ID_ANY, name.capitalize(), style=wx.BU_EXACTFIT) - setattr(self, name, btn) - box.Add(btn, 1, wx.ALIGN_CENTER) - btn.Bind(wx.EVT_TOGGLEBUTTON, self.toggleMetagroup) - btn.metaName = name - - self.normal.SetValue(True) - cMarket.activateMetaGroup("normal") - p.SetMinSize((wx.SIZE_AUTO_WIDTH, btn.GetSize()[1] + 5)) - - #Bind context menus - self.itemView.Bind(wx.EVT_CONTEXT_MENU, self.contextMenu) - self.itemView.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.itemActivated) - - self.mainFrame = gui.mainFrame.MainFrame.getInstance() - - def jump(self, item): - mg = item.marketGroup - cMarket = service.Market.getInstance() - if mg is None and item.metaGroup is not None: - mg = item.metaGroup.parent.marketGroup - for btn in ("normal", "faction", "complex", "officer"): - getattr(self, btn).SetValue(False) - cMarket.disableMetaGroup(btn) - - - - metaGroup = cMarket.getMetaName(item.metaGroup.ID) - - getattr(self, metaGroup).SetValue(True) - cMarket.activateMetaGroup(metaGroup) - self.searching = False - - if mg is None: - return - - jumpList = [] - while mg is not None: - jumpList.append(mg.ID) - mg = mg.parent - - cMarket.MARKET_GROUPS - for id in cMarket.MARKET_GROUPS: - if id in jumpList: - jumpList = jumpList[:jumpList.index(id)+1] - - item = self.marketRoot - for i in range(len(jumpList) -1, -1, -1): - target = jumpList[i] - child, cookie = self.marketView.GetFirstChild(item) - while self.marketView.GetItemPyData(child) != target: - child, cookie = self.marketView.GetNextChild(item, cookie) - - item = child - self.marketView.Expand(item) - - self.marketView.SelectItem(item) - self.searching = False - - def addMarketViewImage(self, iconFile): - if iconFile is None: - return -1 - - return self.marketImageList.Add(iconFile, "pack") - - def addItemViewImage(self, iconFile): - if iconFile is None: - return -1 - - return self.itemImageList.Add(iconFile, "pack") - - def expandLookup(self, event): - root = event.Item - child, cookie = self.marketView.GetFirstChild(root) - if self.marketView.GetItemText(child) == "dummy": - cMarket = service.Market.getInstance() - #A DUMMY! Keeeel!!! EBUL DUMMY MUST DIAF! - self.marketView.Delete(child) - - #Add 'real stoof!' instead - for id, name, iconFile, more in cMarket.getChildren(self.marketView.GetPyData(root)): - iconId = self.addMarketViewImage(iconFile) - childId = self.marketView.AppendItem(root, name, iconId, data=wx.TreeItemData(id)) - if more: - self.marketView.AppendItem(childId, "dummy") - - self.marketView.SortChildren(root) - - - def selectionMade(self, event): - self.itemView.DeleteAllItems() - - if self.searching: - self.clearSearch(None, False) - - root = self.marketView.GetSelection() - if root.IsOk(): - if self.marketView.GetChildrenCount(root) != 0: - return - - cMarket = service.Market.getInstance() - idNameMap = {} - data, usedMetas = cMarket.getVariations(self.marketView.GetPyData(root)) - for id, name, iconFile in data: - iconId = self.addItemViewImage(iconFile) - index = self.itemView.InsertImageStringItem(sys.maxint, name, iconId) - idNameMap[id] = name - - self.itemView.SetItemData(index, id) - - self.itemView.SortItems(lambda id1, id2: cmp(idNameMap[id1], idNameMap[id2])) - self.itemView.SetColumnWidth(0, wx.LIST_AUTOSIZE) - width = self.itemView.GetColumnWidth(0) - maxWidth = self.itemView.GetSize()[0] - if maxWidth > width: - self.itemView.SetColumnWidth(0, maxWidth) - - self.toggleButtons(usedMetas) - - def toggleMetagroup(self, event): - ctrl = wx.GetMouseState().ControlDown() - cMarket = service.Market.getInstance() - btn = event.EventObject - if not ctrl: - for name in ("normal", "faction", "complex", "officer"): - button = getattr(self, name) - button.SetValue(False) - button.Enable(True) - - cMarket.disableMetaGroup(name) - - btn.SetValue(True) - cMarket.activateMetaGroup(btn.metaName) - else: - # Note: using the old value might seem weird, - # But the button hasn't been toggled by wx yet - target = btn.GetValue() - btn.SetValue(target) - if target: - cMarket.activateMetaGroup(btn.metaName) - else: - cMarket.disableMetaGroup(btn.metaName) - - if self.searching: - self.filteredSearchAdd() - else: - self.selectionMade(event) - - def scheduleSearch(self, event): - search = self.search.GetLineText(0) - if len(search) < 3: - self.clearSearch(event, False) - return - - cMarket = service.Market.getInstance() - if not self.searching: - for name in ("normal", "faction", "complex", "officer"): - getattr(self, name).SetValue(True) - cMarket.activateMetaGroup(name) - - self.searching = True - cMarket.searchItems(search, self.populateSearch) - - def clearSearch(self, event, clear=True): - self.itemView.DeleteAllItems() - if clear: - self.search.Clear() - - cMarket = service.Market.getInstance() - for name in ("normal", "faction", "complex", "officer"): - btn = getattr(self, name) - btn.Enable(True) - btn.SetValue(False) - cMarket.disableMetaGroup(btn.metaName) - - cMarket.activateMetaGroup("normal") - self.normal.SetValue(True) - - self.searching = False - - def populateSearch(self, results): - self.searchResults = results - self.filteredSearchAdd() - - def toggleButtons(self, usedMetas): - cMarket = service.Market.getInstance() - for name in ("normal", "faction", "complex", "officer"): - btn = getattr(self, name) - btn.SetValue(False) - btn.Enable(False) - - for meta in usedMetas: - btn = getattr(self, cMarket.getMetaName(meta)) - btn.SetValue(cMarket.isMetaIdActive(meta)) - btn.Enable(True) - - def filteredSearchAdd(self): - if self.searching is False: - return - - self.itemView.Freeze() - self.itemView.DeleteAllItems() - - idNameMap = {} - idGroupMap = {} - usedMetas = set() - cMarket = service.Market.getInstance() - for id, name, group, metaGroupID, iconFile in self.searchResults: - usedMetas.add(metaGroupID) - if cMarket.isMetaIdActive(metaGroupID): - iconId = self.addItemViewImage(iconFile) - index = self.itemView.InsertImageStringItem(sys.maxint, name, iconId) - idNameMap[id] = name - idGroupMap[id] = group - self.itemView.SetItemData(index, id) - - #Gray out empty toggles - self.toggleButtons(usedMetas) - - def sort(id1, id2): - grp = cmp(idGroupMap[id1], idGroupMap[id2]) - if grp != 0: - return grp - - return cmp(idNameMap[id1], idNameMap[id2]) - - self.itemView.SortItems(sort) - self.itemView.SetColumnWidth(0, wx.LIST_AUTOSIZE) - width = self.itemView.GetColumnWidth(0) - maxWidth = self.itemView.GetSize()[0] - if maxWidth > width: - self.itemView.SetColumnWidth(0, maxWidth) - - self.itemView.Thaw() - - def contextMenu(self, event): - #Check if something is selected, if so, spawn the menu for it - sel = self.itemView.GetFirstSelected() - selection = [] - cMarket = service.Market.getInstance() - while sel != -1: - itemId = self.itemView.GetItemData(sel) - sel = self.itemView.GetNextSelected(sel) - selection.append(cMarket.getItem(itemId)) - if len(selection) == 0: - return - menu = ContextMenu.getMenu(selection, "item" if self.searching is False else "itemSearch") - self.PopupMenu(menu) - - def itemActivated(self, event): - id = event.Item.GetData() - if id != -1: - wx.PostEvent(self.mainFrame, ItemSelected(itemID=id)) - - -class MarketTree(wx.TreeCtrl): - def __init__(self, parent): - wx.TreeCtrl.__init__(self, parent) - - def OnEraseBackGround(self, event): - #Prevent flicker by not letting the parent's method get called. - pass +#=============================================================================== +# Copyright (C) 2010 Diego Duclos +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +#=============================================================================== + +import gui.display as d +from gui.cachingImageList import CachingImageList +from gui.contextMenu import ContextMenu +import wx +import service + +ItemSelected, ITEM_SELECTED = wx.lib.newevent.NewEvent() + +class MarketBrowser(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent) + vbox = wx.BoxSizer(wx.VERTICAL) + self.SetSizer(vbox) + + #Add a search button on top + + #Add a WHOLE panel for ONE SINGLE search button + #We have to be able to give the search more size, which can't be done in another way. + #(That I found) + p = wx.Panel(self) + sizer = wx.BoxSizer(wx.HORIZONTAL) + p.SetSizer(sizer) + + vbox.Add(p, 0, wx.EXPAND) + self.search = SearchBox(p) + sizer.Add(self.search, 1, wx.EXPAND | wx.TOP, 2) + p.SetMinSize((wx.SIZE_AUTO_WIDTH, 27)) + + self.splitter = wx.SplitterWindow(self, style = wx.SP_LIVE_UPDATE) + vbox.Add(self.splitter, 1, wx.EXPAND) + + self.marketView = MarketTree(self.splitter) + self.itemView = ItemView(self.splitter, self) + + self.splitter.SplitHorizontally(self.marketView, self.itemView) + self.splitter.SetMinimumPaneSize(250) + + cMarket = service.Market.getInstance() + # Setup our buttons for metaGroup selection + # Same fix as for search box on macs, + # need some pixels of extra space or everything clips and is ugly + p = wx.Panel(self) + box = wx.BoxSizer(wx.HORIZONTAL) + p.SetSizer(box) + vbox.Add(p, 0, wx.EXPAND) + for name in ("normal", "faction", "complex", "officer"): + btn = wx.ToggleButton(p, wx.ID_ANY, name.capitalize(), style=wx.BU_EXACTFIT) + setattr(self, name, btn) + box.Add(btn, 1, wx.ALIGN_CENTER) + btn.Bind(wx.EVT_TOGGLEBUTTON, self.toggleMetagroup) + btn.metaName = name + + self.normal.SetValue(True) + cMarket.activateMetaGroup("normal") + p.SetMinSize((wx.SIZE_AUTO_WIDTH, btn.GetSize()[1] + 5)) + + def toggleMetagroup(self, event): + ctrl = wx.GetMouseState().ControlDown() + cMarket = service.Market.getInstance() + btn = event.EventObject + if not ctrl: + for name in ("normal", "faction", "complex", "officer"): + button = getattr(self, name) + button.SetValue(False) + button.Enable(True) + + cMarket.disableMetaGroup(name) + + btn.SetValue(True) + cMarket.activateMetaGroup(btn.metaName) + else: + # Note: using the old value might seem weird, + # But the button hasn't been toggled by wx yet + target = btn.GetValue() + btn.SetValue(target) + if target: + cMarket.activateMetaGroup(btn.metaName) + else: + cMarket.disableMetaGroup(btn.metaName) + + if self.itemView.searching: + self.itemView.filteredSearchAdd() + else: + self.itemView.selectionMade(event) + + +class SearchBox(wx.SearchCtrl): + def __init__(self, parent): + wx.SearchCtrl.__init__(self, parent, wx.ID_ANY, style=wx.TE_PROCESS_ENTER) + self.ShowCancelButton(True) + +class MarketTree(wx.TreeCtrl): + def __init__(self, parent): + wx.TreeCtrl.__init__(self, parent, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT) + self.root = self.AddRoot("CHRISTMAS TREE!") + + self.imageList = CachingImageList(16, 16) + self.SetImageList(self.imageList) + + cMarket = service.Market.getInstance() + + root = cMarket.getMarketRoot() + for id, name, iconFile in root: + iconId = self.addImage(iconFile) + childId = self.AppendItem(self.root, name, iconId, data=wx.TreeItemData(id)) + self.AppendItem(childId, "dummy") + + self.SortChildren(self.root) + + #Bind our lookup method to when the tree gets expanded + self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup) + + def addImage(self, iconFile): + if iconFile is None: + return -1 + + return self.imageList.Add(iconFile, "pack") + + def expandLookup(self, event): + root = event.Item + child, cookie = self.GetFirstChild(root) + if self.GetItemText(child) == "dummy": + cMarket = service.Market.getInstance() + #A DUMMY! Keeeel!!! EBUL DUMMY MUST DIAF! + self.Delete(child) + + #Add 'real stoof!' instead + for id, name, iconFile, more in cMarket.getChildren(self.GetPyData(root)): + iconId = self.addImage(iconFile) + childId = self.AppendItem(root, name, iconId, data=wx.TreeItemData(id)) + if more: + self.AppendItem(childId, "dummy") + + self.SortChildren(root) + +class ItemView(d.Display): + DEFAULT_COLS = ["Name"] + + def __init__(self, parent, marketBrowser): + d.Display.__init__(self, parent) + marketBrowser.Bind(wx.EVT_TREE_SEL_CHANGED, self.selectionMade) + self.searching = False + self.marketBrowser = marketBrowser + self.marketView = marketBrowser.marketView + + #Make sure our search actualy does intresting stuff + self.marketBrowser.search.Bind(wx.EVT_TEXT_ENTER, self.scheduleSearch) + self.marketBrowser.search.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, self.scheduleSearch) + self.marketBrowser.search.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, self.clearSearch) + self.marketBrowser.search.Bind(wx.EVT_TEXT, self.scheduleSearch) + + #Make sure WE do intresting stuff TOO + self.Bind(wx.EVT_CONTEXT_MENU, self.contextMenu) + self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.itemActivated) + + def itemActivated(self, event): + #Check if something is selected, if so, spawn the menu for it + sel = self.GetFirstSelected() + if sel == -1: + return + + wx.PostEvent(self.mainFrame, ItemSelected(itemID=self.active[sel].ID)) + + def selectionMade(self, event): + if self.searching: + self.clearSearch(None, False) + + root = self.marketView.GetSelection() + if root.IsOk(): + if self.marketView.GetChildrenCount(root) != 0: + return + + cMarket = service.Market.getInstance() + items, usedMetas = cMarket.getVariations(self.marketView.GetPyData(root)) + self.update(items) + self.toggleButtons(usedMetas) + + def clearSearch(self, event=None, clear=True): + self.DeleteAllItems() + if clear: + self.search.Clear() + + cMarket = service.Market.getInstance() + for name in ("normal", "faction", "complex", "officer"): + btn = getattr(self.marketBrowser, name) + btn.Enable(True) + btn.SetValue(False) + cMarket.disableMetaGroup(btn.metaName) + + cMarket.activateMetaGroup("normal") + self.marketBrowser.normal.SetValue(True) + + self.searching = False + + def scheduleSearch(self, event): + search = self.marketBrowser.search.GetLineText(0) + if len(search) < 3: + self.clearSearch(event, False) + return + + cMarket = service.Market.getInstance() + if not self.searching: + for name in ("normal", "faction", "complex", "officer"): + getattr(self.marketBrowser, name).SetValue(True) + cMarket.activateMetaGroup(name) + + self.searching = True + cMarket.searchItems(search, self.populateSearch) + + def populateSearch(self, results): + self.filteredSearchAdd(*results) + + def itemFilter(self, item): + pass + + def filteredSearchAdd(self, items=None, usedMetas=None): + if self.searching is False: + return + + self.items = items if items is not None else self.items + self.usedMetas = usedMetas if usedMetas is not None else self.usedMetas + self.update(self.items) + + #Gray out empty toggles + self.toggleButtons(self.usedMetas) + + def toggleButtons(self, usedMetas): + cMarket = service.Market.getInstance() + for name in ("normal", "faction", "complex", "officer"): + btn = getattr(self.marketBrowser, name) + btn.SetValue(False) + btn.Enable(False) + + for meta in usedMetas: + btn = getattr(self.marketBrowser, cMarket.getMetaName(meta)) + btn.SetValue(cMarket.isMetaIdActive(meta)) + btn.Enable(True) + + def contextMenu(self, event): + #Check if something is selected, if so, spawn the menu for it + sel = self.GetFirstSelected() + if sel == -1: + return + + menu = ContextMenu.getMenu(self.active[sel], "item" if self.searching is False else "itemSearch") + self.PopupMenu(menu) + + 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) + + def populate(self, stuff): + stuff.sort(key=self.itemSort) + self.active = stuff + d.Display.populate(self, stuff) + + def refresh(self, stuff): + stuff.sort(key=self.itemSort) + d.Display.refresh(self, stuff) diff --git a/service/market.py b/service/market.py index 5bdaadfc8..511664aa3 100644 --- a/service/market.py +++ b/service/market.py @@ -74,14 +74,16 @@ class SearchWorkerThread(threading.Thread): filter = (eos.types.Category.name.in_(Market.SEARCH_CATEGORIES), eos.types.Item.published == True) results = eos.db.searchItems(request, where=filter, join=(eos.types.Item.group, eos.types.Group.category), - eager=("icon", "group.category")) + eager=("icon", "group.category", "metaGroup", "metaGroup.parent")) + usedMetas = set() items = [] for item in results: if item.category.name in Market.SEARCH_CATEGORIES: - items.append((item.ID, item.name, item.group.name, item.metaGroup.ID if item.metaGroup else 1, item.icon.iconFile if item.icon else "")) + usedMetas.add(item.metaGroup.ID if item.metaGroup else 1) + items.append(item) - wx.CallAfter(callback, items) + wx.CallAfter(callback, (items, usedMetas)) def scheduleSearch(self, text, callback): self.cv.acquire() @@ -237,25 +239,21 @@ class Market(): return tuple() mg = eos.db.getMarketGroup(marketGroupId) - l = [] - done = set() + l = set() populatedMetas = set() for item in mg.items: populatedMetas.add(1) if 1 in self.activeMetas: - if item not in done: - done.add(item) - l.append((item.ID, item.name, item.icon.iconFile if item.icon else "")) + l.add(item) vars = eos.db.getVariations(item, eager=("icon", "metaGroup")) for var in vars: populatedMetas.add(var.metaGroup.ID) - if var not in done and var.metaGroup.ID in self.activeMetas: - done.add(var) - l.append((var.ID, var.name, var.icon.iconFile if var.icon else "")) + if var.metaGroup.ID in self.activeMetas: + l.add(var) - return l, populatedMetas + return list(l), populatedMetas def getPrices(self, typeIDs, callback): requests = []