From f6f9929e5d946fba8640b45ca90913fb14a957a6 Mon Sep 17 00:00:00 2001 From: cncfanatics Date: Mon, 23 Aug 2010 19:02:39 +0200 Subject: [PATCH] Add 200ms delay on live search of market browser, so we don't repeatedly search while the user types --- controller/market.py | 12 +++++++++--- gui/marketBrowser.py | 24 +++++++++++++++++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/controller/market.py b/controller/market.py index 2eabbf1eb..7e5d2ab2e 100644 --- a/controller/market.py +++ b/controller/market.py @@ -19,6 +19,7 @@ import eos.db import eos.types +from sqlalchemy.sql import or_ class Market(): instance = None @@ -28,6 +29,7 @@ class Market(): "faction": (4, 3), "complex": (6,), "officer": (5,)} + SEARCH_CATEGORIES = ("Drone", "Module", "Subsystem", "Charge", "Implant") @classmethod def getInstance(cls): @@ -82,12 +84,16 @@ class Market(): return ships def searchItems(self, name): - results = eos.db.searchItems(name, where=eos.types.Item.published == 1, - eager=("icon", "metaGroup")) + filter = (eos.types.Category.name.in_(self.SEARCH_CATEGORIES), eos.types.Item.published == 1) + results = eos.db.searchItems(name, where=filter, + join=(eos.types.Item.group, eos.types.Group.category), + eager=("icon", "group.category")) items = [] for item in results: - items.append((item.ID, item.name, item.metaGroup.ID, item.icon.iconFile if item.icon else "")) + if item.category.name in self.SEARCH_CATEGORIES: + items.append((item.ID, item.name, item.metaGroup.ID if item.metaGroup else 1, item.icon.iconFile if item.icon else "")) + return items def searchFits(self, name): diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 44175c848..bc45a204b 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -42,15 +42,19 @@ class MarketBrowser(wx.Panel): p.SetMinSize((wx.SIZE_AUTO_WIDTH, 27)) #Bind search - self.search.Bind(wx.EVT_TEXT_ENTER, self.startSearch) - self.search.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, self.startSearch) + 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.startSearch) + self.search.Bind(wx.EVT_TEXT, self.scheduleSearch) + self.Bind(wx.EVT_TIMER, self.startSearch) #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) @@ -192,8 +196,12 @@ class MarketBrowser(wx.Panel): self.selectionMade(event) + def scheduleSearch(self, event): + self.searchTimer.Stop() + self.searchTimer.Start(200, wx.TIMER_ONE_SHOT) + def startSearch(self, event): - search = self.shipMenu.search.GetLineText(0) + search = self.search.GetLineText(0) if len(search) < 3: self.clearSearch(event, False) return @@ -212,11 +220,17 @@ class MarketBrowser(wx.Panel): self.searching = False def filteredSearchAdd(self): + self.itemView.DeleteAllItems() + self.itemImageList.RemoveAll() + idNameMap = {} cMarket = controller.Market.getInstance() for id, name, metaGroupID, iconFile in self.searchResults: - if cMarket.isMetaActive(metaGroupID): + if cMarket.isMetaIdActive(metaGroupID): 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)