91 lines
2.6 KiB
Python
91 lines
2.6 KiB
Python
# Copyright 2021 (c) Anna Schumaker.
|
|
import db
|
|
import lib
|
|
from gi.repository import GObject
|
|
from gi.repository import Gio
|
|
from gi.repository import Gtk
|
|
|
|
class ChildModel(GObject.GObject, Gio.ListModel):
|
|
def __init__(self, parent):
|
|
GObject.GObject.__init__(self)
|
|
self.parent = parent
|
|
self.parent.connect("children-changed", self.children_changed)
|
|
|
|
def do_get_item_type(self): return GObject.TYPE_PYOBJECT
|
|
def do_get_n_items(self): return self.parent.get_n_children()
|
|
def do_get_item(self, n): return self.parent.get_child(n)
|
|
|
|
def children_changed(self, item, pos, rm, add):
|
|
self.emit("items-changed", pos, rm, add)
|
|
|
|
|
|
def create_child_func(item):
|
|
return ChildModel(item) if item.has_children() else None
|
|
|
|
def TreeListModel(table):
|
|
return Gtk.TreeListModel.new(table, passthrough=False, autoexpand=False,
|
|
create_func=create_child_func)
|
|
|
|
|
|
class Filter(lib.filter.Regex):
|
|
def do_check(self, item):
|
|
if self.search(item.name):
|
|
return True
|
|
if item.has_children():
|
|
for n in range(item.get_n_children()):
|
|
if self.do_check(item.get_child(n)):
|
|
return True
|
|
return False
|
|
|
|
def do_match(self, treeitem):
|
|
item = treeitem.get_item()
|
|
return self.do_check(item) if item else False
|
|
TableFilter = Filter()
|
|
|
|
|
|
class FilterTableModel(Gtk.FilterListModel):
|
|
def __init__(self, table):
|
|
Gtk.FilterListModel.__init__(self)
|
|
self.set_model(TreeListModel(table))
|
|
self.set_filter(TableFilter)
|
|
|
|
def get_table(self):
|
|
return self.get_model().get_model()
|
|
|
|
|
|
class TableSelection(Gtk.SingleSelection):
|
|
def __init__(self, table):
|
|
Gtk.SingleSelection.__init__(self)
|
|
self.set_model(FilterTableModel(table))
|
|
self.set_can_unselect(True)
|
|
self.set_autoselect(False)
|
|
|
|
def get_selected_playlist(self):
|
|
item = self.get_selected_item()
|
|
return None if item is None else item.get_item()
|
|
|
|
def get_playlist(self, n):
|
|
row = self.get_item(n)
|
|
return row.get_item() if row else None
|
|
|
|
def get_table(self):
|
|
return self.get_model().get_table()
|
|
|
|
|
|
class UserFilter(Gtk.Filter):
|
|
def do_match(self, item):
|
|
return item.name not in [ "Collection", "New Tracks", "Previous" ]
|
|
|
|
|
|
class FilterUserModel(Gtk.FilterListModel):
|
|
def __init__(self):
|
|
Gtk.FilterListModel.__init__(self)
|
|
self.set_model(db.user.Table)
|
|
self.set_filter(UserFilter())
|
|
|
|
|
|
class UserSelection(Gtk.SingleSelection):
|
|
def __init__(self):
|
|
Gtk.SingleSelection.__init__(self)
|
|
self.set_model(FilterUserModel())
|