diff --git a/libsaria/collection/__init__.py b/libsaria/collection/__init__.py index ffd2b42b..0b6a6334 100644 --- a/libsaria/collection/__init__.py +++ b/libsaria/collection/__init__.py @@ -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) + diff --git a/libsaria/collection/index.py b/libsaria/collection/index.py index 1fa939dc..cfc3c7a1 100644 --- a/libsaria/collection/index.py +++ b/libsaria/collection/index.py @@ -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 + diff --git a/libsaria/collection/lens.py b/libsaria/collection/lens.py index 0693ac2b..68ea8cfc 100644 --- a/libsaria/collection/lens.py +++ b/libsaria/collection/lens.py @@ -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 diff --git a/ocarina/collection.py b/ocarina/collection.py index a53c1381..4afc23c2 100644 --- a/ocarina/collection.py +++ b/ocarina/collection.py @@ -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]) diff --git a/ocarina/entry.py b/ocarina/entry.py index 504def21..bceec621 100644 --- a/ocarina/entry.py +++ b/ocarina/entry.py @@ -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) diff --git a/ocarina/list.py b/ocarina/list.py index 990ded2a..2064d1bb 100644 --- a/ocarina/list.py +++ b/ocarina/list.py @@ -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() diff --git a/tests/dl_tree.py b/tests/dl_tree.py index a094649c..c9e865f4 100644 --- a/tests/dl_tree.py +++ b/tests/dl_tree.py @@ -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