Index filtering

I have implemented simple filtering over the library.  This will return
a set of visible songs based on the search pattern.
This commit is contained in:
Bryan Schumaker 2010-10-10 23:06:54 -04:00
parent 168025fb60
commit 6c6477b677
7 changed files with 72 additions and 18 deletions

View File

@ -56,4 +56,8 @@ def lib_filter(text):
global library
library.filter(text)
def lib_is_visible(text):
global library
return library.is_visible(text)

View File

@ -1,5 +1,7 @@
# Bryan Schumaker (8/10/2010)
import re
translate = unicode.translate
split = unicode.split
space_ord = ord(" ")
@ -33,17 +35,37 @@ class Index(dict):
def insert(self, tags, id):
get = self.get
idset = set([id])
for tag in tags:
for word in format(tag):
ids = get(word, None)
if ids == None:
self[word] = idset
self[word] = set([id])
else:
ids.update(idset)
ids.add(id)
def filter(self, text):
text = unicode(text)
search = format(text)
print search
terms = format(text)
results = dict()
#results = set()
search = re.search
get = self.get
for t in terms:
results[t] = set()
for key in self.keys():
for term in terms:
if search(term, key):
results[term].update(get(key))
visible = set()
for i,t in enumerate(terms):
if i == 0:
visible.update(results[t])
else:
visible.intersection_update(results[t])
return visible

View File

@ -24,6 +24,8 @@ def set_badfiles():
class Library(collection.Collection):
def __init__(self):
collection.Collection.__init__(self, "DLTree_test")
self.filtered = False
self.visible = None
def scan(self, path):
print "Library scanning %s" % path
@ -35,7 +37,17 @@ class Library(collection.Collection):
self.disp()
def filter(self, text):
self.index.filter(text)
if len(text) > 0:
self.visible = self.index.filter(text)
self.filtered = True
else:
self.visible = None
self.filtered = False
def is_visible(self, id):
if self.filtered == False:
return True
return id in self.visible
def update(self, path):
global badfiles

View File

@ -12,10 +12,10 @@ gtk = ocarina.gtk
class Collection(gtk.ScrolledWindow):
def __init__(self, mouse_motion, select):
def __init__(self, mouse_motion, select, refilter):
gtk.ScrolledWindow.__init__(self)
self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.list = list.List()
self.list = list.List(refilter)
self.list.connect("motion-notify-event", self.on_mouse_motion)
self.list.connect("row-activated", self.row_activated)
@ -59,7 +59,8 @@ class Collection(gtk.ScrolledWindow):
class Library(Collection):
def __init__(self):
Collection.__init__(self, self.mouse_motion, self.select_row)
Collection.__init__(self, self.mouse_motion, self.select_row,
self.refilter)
libsaria.event.invite("POSTSTART", self.populate, bg=True)
libsaria.event.invite("POSTNEWSOURCE", self.refresh, bg=True)
@ -70,9 +71,6 @@ class Library(Collection):
after = datetime.datetime.now()
print "Populating took: %s" % (after-before)
def filter(self, text):
collection.lib_filter(text)
def refresh(self, arg):
self.clear()
self.populate()
@ -82,3 +80,10 @@ class Library(Collection):
def select_row(self, row):
collection.lib_play_id(row[0])
def filter(self, text):
collection.lib_filter(text)
self.list.refilter()
def refilter(self, list, iter):
return collection.lib_is_visible(list[iter][0])

View File

@ -1,6 +1,7 @@
# Bryan Schumaker (10/4/2010)
import ocarina
timeout = ocarina.gobject.timeout_add
gtk = ocarina.gtk
tabs = ocarina.tabs
@ -10,6 +11,13 @@ class FilterEntry(gtk.Entry):
gtk.Entry.__init__(self)
self.connect("changed", self.changed)
self.show()
self.count = 0
def changed(self, entry):
tabs.filter(entry.get_text())
self.count += 1
timeout(200, self.filter, entry.get_text())
def filter(self, text):
self.count -= 1
if self.count == 0:
tabs.filter(text)

View File

@ -7,10 +7,12 @@ gobject = ocarina.gobject
#UNI = gobject.TYPE_UNICHAR
class List(gtk.TreeView):
def __init__(self):
def __init__(self, refilter):
gtk.TreeView.__init__(self)
self.list = gtk.ListStore(int, str, str, str, str, int, str)
self.append = self.list.append
self.set_visible = refilter
cell = gtk.CellRendererText()
cell.set_fixed_height_from_font(1)
@ -30,12 +32,15 @@ class List(gtk.TreeView):
self.set_rules_hint(True)
self.set_tooltip_column(len(cols)-1)
self.filter_model = self.list.filter_new()
self.filter_model.set_visible_func(self.set_visible)
self.refilter = self.filter_model.refilter
self.set_model(self.filter_model)
self.show_all()
def freeze(self):
self.set_model(None)
self.freeze_child_notify()
@ -44,9 +49,6 @@ class List(gtk.TreeView):
self.set_model(self.filter_model)
self.thaw_child_notify()
def set_visible(self, a, b):
return True
def clear(self):
self.list.clear()

View File

@ -4,6 +4,7 @@
from libsaria import collection
collection.new_source("~/Music/")
collection.new_source("~/Desktop")
#collection.new_source("~/Music/")
#collection.new_source("/media/Music")
print collection.library.size