# 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())