From 3ee962b8f70a9d34152ad3bfd1d2d24f84b24255 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sun, 24 Apr 2011 11:38:41 +0400 Subject: [PATCH] Make market service to return item objects instead of tuples --- gui/shipBrowser.py | 40 ++++++++++++++++---------------- service/market.py | 57 +++++++++++++++++++++++----------------------- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index eb43c80e8..3b8b32d6e 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -142,9 +142,6 @@ class ShipBrowser(wx.Panel): def GetStage3ShipName(self): return self._stage3ShipName - def nameKey(self, info): - return info[1] - def stage1(self, event): self._lastStage = self._activeStage self._activeStage = 1 @@ -158,32 +155,32 @@ class ShipBrowser(wx.Panel): self.lpane.Freeze() self.lpane.RemoveAllChildren() if len(self.categoryList) == 0: - self.categoryList = sMarket.getShipRoot() - self.categoryList.sort(key=self.nameKey) - for ID, name in self.categoryList: - self.lpane.AddWidget(CategoryItem(self.lpane, ID, (name, 0))) + self.categoryList = list(sMarket.getShipRoot()) + self.categoryList.sort(key=lambda ship: ship.name) + for ship in self.categoryList: + self.lpane.AddWidget(CategoryItem(self.lpane, ship.ID, (ship.name, 0))) self.lpane.RefreshList() self.lpane.Thaw() RACE_ORDER = ["amarr", "caldari", "gallente", "minmatar", "ore", "serpentis", "angel", "blood", "sansha", "guristas", None] - def raceNameKey(self, shipInfo): - return self.RACE_ORDER.index(shipInfo[2]), shipInfo[1] + def raceNameKey(self, ship): + return self.RACE_ORDER.index(ship.race), ship.name - def stage2Callback(self,data): + def stage2Callback(self, data): if self.GetActiveStage() != 2: return - categoryID, shipList = data + ships = list(data[1]) sFit = service.Fit.getInstance() - shipList.sort(key=self.raceNameKey) - for ID, name, race in shipList: - fits = len(sFit.getFitsWithShip(ID)) + ships.sort(key=self.raceNameKey) + for ship in ships: + fits = len(sFit.getFitsWithShip(ship.ID)) if self.filterShipsWithNoFits: if fits>0: - self.lpane.AddWidget(ShipItem(self.lpane, ID, (name, fits), race)) + self.lpane.AddWidget(ShipItem(self.lpane, ship.ID, (ship.name, fits), ship.race)) else: - self.lpane.AddWidget(ShipItem(self.lpane, ID, (name, fits), race)) + self.lpane.AddWidget(ShipItem(self.lpane, ship.ID, (ship.name, fits), ship.race)) self.lpane.ShowLoading(False) @@ -210,6 +207,9 @@ class ShipBrowser(wx.Panel): self.hpane.ToggleNewFitSB(False) self.hpane.ToggleFitViewModeSB(True) + def nameKey(self, info): + return info[1] + def stage3(self, event): self.lpane.ShowLoading(False) @@ -272,15 +272,15 @@ class ShipBrowser(wx.Panel): self.lpane.RemoveAllChildren() if query: - shipList = sMarket.searchShips(query) + ships = sMarket.searchShips(query) fitList = sFit.searchFits(query) - for ID, name, race in shipList: - self.lpane.AddWidget(ShipItem(self.lpane, ID, (name, len(sFit.getFitsWithShip(ID))), race)) + for ship in ships: + self.lpane.AddWidget(ShipItem(self.lpane, ship.ID, (ship.name, len(sFit.getFitsWithShip(ship.ID))), ship.race)) for ID, name, shipID, shipName,timestamp in fitList: self.lpane.AddWidget(FitItem(self.lpane, ID, (shipName, name,timestamp), shipID)) - if len(shipList) == 0 and len(fitList) == 0 : + if len(ships) == 0 and len(fitList) == 0 : self.lpane.AddWidget(PFStaticText(self.lpane, label = "No matching results.")) self.lpane.RefreshList(doFocus = False) self.lpane.Thaw() diff --git a/service/market.py b/service/market.py index 5a9d240b1..8f38cd036 100644 --- a/service/market.py +++ b/service/market.py @@ -51,12 +51,12 @@ class ShipBrowserWorkerThread(threading.Thread): while True: try: callback, id = queue.get() - list = cache.get(id) - if list is None: - list = sMarket.getShipList(id) - cache[id] = list + set = cache.get(id) + if set is None: + set = sMarket.getShipList(id) + cache[id] = set - wx.CallAfter(callback, (id,list)) + wx.CallAfter(callback, (id, set)) except: pass finally: @@ -280,6 +280,12 @@ class Market(): ("complex", frozenset((6,))), ("officer", frozenset((5,)))]) self.SEARCH_CATEGORIES = ("Drone", "Module", "Subsystem", "Charge", "Implant") + self.ROOT_MARKET_GROUPS = (9, # Modules + 1111, # Rigs + 157, # Drones + 11, # Ammo + 1112, # Subsystems + 24) # Implants & Boosters # Tell other threads that Market is at their service mktRdy.set() @@ -364,6 +370,12 @@ class Market(): group = item.group return group + def getCategoryByItem(self, item): + """Get category by item""" + grp = self.getGroupByItem(item) + cat = grp.category + return cat + def getMetaGroupByItem(self, item): """Get meta group by item""" # Check if item is in forced metagroup map @@ -526,20 +538,6 @@ class Market(): pub = group.published return pub - def getShipRoot(self): - cat = self.getCategory("Ship") - root = [] - for grp in self.getGroupsByCategory(cat): - root.append((grp.ID, grp.name)) - return root - - ROOT_MARKET_GROUPS = (9, # Modules - 1111, # Rigs - 157, # Drones - 11, # Ammo - 1112, # Subsystems - 24) # Implants & Boosters - def getMarketRoot(self): """ Get the root of the market tree. @@ -553,13 +551,16 @@ class Market(): return root + def getShipRoot(self): + cat = self.getCategory("Ship") + root = set(self.getGroupsByCategory(cat)) + return root + def getShipList(self, grpid): - """Get ships for given group id""" - ships = [] - grp = self.getGroup(grpid, eager=("items", "items.marketGroup", "items.attributes")) - for item in grp.items: - if self.getPublicityByItem(item): - ships.append((item.ID, item.name, item.race)) + """Get ships for given group id""" + grp = self.getGroup(grpid, eager="items") + ships = set(filter(lambda ship: self.getPublicityByItem(ship), grp.items)) + #ships.append((item.ID, item.name, item.race)) return ships def getShipListDelayed(self, id, callback): @@ -569,10 +570,10 @@ class Market(): def searchShips(self, name): """Find ships according to given text pattern""" results = eos.db.searchItems(name) - ships = [] + ships = set() for item in results: - if self.getGroupByItem(item).category.name == "Ship" and self.getPublicityByItem(item): - ships.append((item.ID, item.name, item.race)) + if self.getCategoryByItem(item).name == "Ship" and self.getPublicityByItem(item): + ships.add(item) return ships def searchItems(self, name, callback):