lib: Create a new Filter class

The intention is to have some common code that can be shared by both the
sidebar and the tracklist so they don't need to re-implement the same
things.

Implements: #4 (Create common filtering widgets)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-10-11 14:09:11 -04:00
parent 64a6fdca2d
commit aae99218e0
3 changed files with 65 additions and 0 deletions

View File

@ -5,6 +5,7 @@ gi.require_version("Gst", "1.0")
from . import bus
from . import data
from . import filter
from . import publisher
from . import settings
from . import tag

24
lib/filter.py Normal file
View File

@ -0,0 +1,24 @@
# Copyright 2021 (c) Anna Schumaker.
import re
from gi.repository import Gtk
class Regex(Gtk.Filter):
def __init__(self):
Gtk.Filter.__init__(self)
self.pattern = re.compile("")
def do_match(self, item):
raise NotImplementedError
def search(self, text):
return self.pattern.search(text) != None
def set_pattern(self, pattern):
change = Gtk.FilterChange.DIFFERENT
if pattern in self.pattern.pattern:
change = Gtk.FilterChange.LESS_STRICT
elif self.pattern.pattern in pattern:
change = Gtk.FilterChange.MORE_STRICT
self.pattern = re.compile(pattern, re.I)
self.changed(change)

40
lib/test_filter.py Normal file
View File

@ -0,0 +1,40 @@
# Copyright 2021 (c) Anna Schumaker.
import lib
import re
import unittest
from gi.repository import Gtk
class TestRegex(unittest.TestCase):
def changed(self, filter, how):
self.how = how
def test_init(self):
filter = lib.filter.Regex()
self.assertIsInstance(filter, Gtk.Filter)
self.assertIsInstance(filter.pattern, re.Pattern)
self.assertEqual(filter.pattern.pattern, "")
with self.assertRaises(NotImplementedError):
filter.do_match(None)
def test_set_pattern(self):
filter = lib.filter.Regex()
filter.connect("changed", self.changed)
filter.set_pattern("abc")
self.assertEqual(filter.pattern.pattern, "abc")
self.assertEqual(self.how, Gtk.FilterChange.MORE_STRICT)
filter.set_pattern("ab")
self.assertEqual(filter.pattern.pattern, "ab")
self.assertEqual(self.how, Gtk.FilterChange.LESS_STRICT)
filter.set_pattern("cd")
self.assertEqual(self.how, Gtk.FilterChange.DIFFERENT)
self.assertEqual(filter.pattern.pattern, "cd")
def test_search(self):
filter = lib.filter.Regex()
filter.set_pattern("ab")
self.assertTrue(filter.search("abc"))
self.assertFalse(filter.search("cde"))