From b613d3e312c8790cc2aa456d28bc383978cf435e Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 31 Jan 2020 00:37:35 +0300 Subject: [PATCH] Use market sorting in attribute override editor --- gui/builtinMarketBrowser/itemView.py | 16 +--------------- gui/propertyEditor.py | 28 ++++++++++++++++++++++++++++ service/market.py | 16 ++++++++++++++-- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index b78094cfe..740abedeb 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -49,8 +49,6 @@ class ItemView(Display): self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.itemActivated) self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.startDrag) - # Make reverse map, used by sorter - self.metaMap = self.makeReverseMetaMap() self.active = [] def delaySearch(self, evt): @@ -214,7 +212,7 @@ class ItemView(Display): parentname = sMkt.getParentItemByItem(item).name # Get position of market group metagrpid = sMkt.getMetaGroupIdByItem(item) - metatab = self.metaMap.get(metagrpid) + metatab = sMkt.META_MAP_REVERSE_INDICES.get(metagrpid) metalvl = item.metaLevel or 0 return catname, mktgrpid, parentname, metatab, metalvl, item.name @@ -259,18 +257,6 @@ class ItemView(Display): Display.refresh(self, items) - def makeReverseMetaMap(self): - """ - Form map which tells in which tab items of given metagroup are located - """ - revmap = {} - i = 0 - for mgids in self.sMkt.META_MAP.values(): - for mgid in mgids: - revmap[mgid] = i - i += 1 - return revmap - def columnBackground(self, colItem, item): if self.sFit.serviceFittingOptions["colorFitBySlot"]: return slotColourMap.get(Module.calculateSlot(item)) or self.GetBackgroundColour() diff --git a/gui/propertyEditor.py b/gui/propertyEditor.py index 7d24b9820..d3a159fb8 100644 --- a/gui/propertyEditor.py +++ b/gui/propertyEditor.py @@ -208,10 +208,38 @@ class ItemView(d.Display): sMkt.searchItems(search, self.populateSearch, 'everything') + def itemSort(self, item): + sMkt = Market.getInstance() + isFittable = item.group.name in sMkt.FIT_GROUPS or item.category.name in sMkt.FIT_CATEGORIES + catname = sMkt.getCategoryByItem(item).name + try: + mktgrpid = sMkt.getMarketGroupByItem(item).ID + except AttributeError: + mktgrpid = -1 + pyfalog.warning("unable to find market group for {}".format(item.name)) + parentname = sMkt.getParentItemByItem(item).name + # Get position of market group + metagrpid = sMkt.getMetaGroupIdByItem(item) + metatab = sMkt.META_MAP_REVERSE_INDICES.get(metagrpid) + metalvl = item.metaLevel or 0 + + return not isFittable, catname, mktgrpid, parentname, metatab, metalvl, item.name + def populateSearch(self, items): self.items = list(items) self.update(items) + def populate(self, items): + if len(items) > 0: + self.unselectAll() + items.sort(key=self.itemSort) + d.Display.populate(self, items) + + def refresh(self, items): + if len(items) > 1: + items.sort(key=self.itemSort) + d.Display.refresh(self, items) + class AttributeGrid(wxpg.PropertyGrid): def __init__(self, parent): diff --git a/service/market.py b/service/market.py index 58f5886a8..0345841c2 100644 --- a/service/market.py +++ b/service/market.py @@ -117,8 +117,8 @@ class SearchWorkerThread(threading.Thread): elif filterName == 'everything': filters = [ or_( - types_Category.name == 'Ship', - types_Group.name.in_(('Citadel', 'Engineering Complex', 'Refinery'))), + types_Category.name.in_(sMkt.FIT_CATEGORIES), + types_Group.name.in_(sMkt.FIT_GROUPS)), or_( types_Category.name.in_(sMkt.SEARCH_CATEGORIES), types_Group.name.in_(sMkt.SEARCH_GROUPS))] @@ -330,6 +330,7 @@ class Market: self.META_MAP["normal"] = frozenset((0, *(mg.ID for mg in eos.db.getMetaGroups() if mg.ID not in nonNormalMetas))) self.META_MAP.move_to_end("normal", last=False) self.META_MAP_REVERSE = {sv: k for k, v in self.META_MAP.items() for sv in v} + self.META_MAP_REVERSE_INDICES = self.__makeReverseMetaMapIndices() self.SEARCH_CATEGORIES = ( "Drone", "Module", @@ -353,6 +354,8 @@ class Market: 2203 # Structure Modifications ) self.SHOWN_MARKET_GROUPS = eos.db.getMarketTreeNodeIds(self.ROOT_MARKET_GROUPS) + self.FIT_CATEGORIES = ['Ship'] + self.FIT_GROUPS = ['Citadel', 'Engineering Complex', 'Refinery'] # Tell other threads that Market is at their service mktRdy.set() @@ -372,6 +375,15 @@ class Market: rev[value].add(item) return rev + def __makeReverseMetaMapIndices(self): + revmap = {} + i = 0 + for mgids in self.META_MAP.values(): + for mgid in mgids: + revmap[mgid] = i + i += 1 + return revmap + @staticmethod def getItem(identity, *args, **kwargs): """Get item by its ID or name"""