Add 200ms delay on live search of market browser, so we don't repeatedly search while the user types

This commit is contained in:
cncfanatics
2010-08-23 19:02:39 +02:00
parent f805fca977
commit f6f9929e5d
2 changed files with 28 additions and 8 deletions

View File

@@ -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):

View File

@@ -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)