rind: Parse text entered in the track search entry

And set up a regex pattern that we can use to match tracks later.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2019-07-07 09:21:45 -04:00
parent 37d621e48d
commit 57d77a5abd
3 changed files with 54 additions and 0 deletions

View File

@ -951,4 +951,20 @@ audio-volume-medium-symbolic</property>
</object>
</child>
</object>
<object class="GtkPopover" id="track_regex_popover">
<property name="can_focus">False</property>
<property name="relative_to">track_search</property>
<property name="position">bottom</property>
<property name="modal">False</property>
<child>
<object class="GtkLabel" id="track_regex_error">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
</child>
<style>
<class name="tooltip"/>
</style>
</object>
</interface>

View File

@ -5,6 +5,7 @@ from .. import audio
from .. import gtk
import curds
import os
import re
import unittest
from gi.repository import Gdk, GObject, Gtk, Gst
@ -27,8 +28,11 @@ class TestPlaylistView(unittest.TestCase):
def test_init(self):
self.assertIsInstance(view.Entry, Gtk.Entry)
self.assertIsInstance(view.Error, Gtk.Label)
self.assertIsInstance(view.Loop, Gtk.ToggleButton)
self.assertIsInstance(view.Model, model.PlaylistModel)
self.assertIsInstance(view.Pattern, re.Pattern)
self.assertIsInstance(view.Popover, Gtk.Popover)
self.assertIsInstance(view.Random, Gtk.ToggleButton)
self.assertIsInstance(view.TreeView, Gtk.TreeView)
self.assertIsInstance(view.Selection, Gtk.TreeSelection)
@ -36,6 +40,7 @@ class TestPlaylistView(unittest.TestCase):
view.reset()
self.assertEqual(view.Model.playlist, curds.playlist.lookup("Collection"))
self.assertEqual(view.Pattern.pattern, "")
def test_show_more_accel(self):
signal = GObject.signal_lookup("grab-focus", Gtk.SearchEntry)
@ -282,3 +287,18 @@ class TestPlaylistView(unittest.TestCase):
view.TreeView.emit("button-press-event", event)
for track in self.plist.list:
self.assertNotIn(track, curds.playlist.UpNext.list)
def test_filter_error(self):
view.Entry.set_text("*v")
view.Entry.emit("search-changed")
self.assertTrue(view.Entry.get_style_context().has_class("warning"))
self.assertTrue(view.Popover.is_visible())
self.assertEqual(view.Error.get_text(), "Nothing to repeat at position 0")
view.Entry.set_text("")
view.Entry.emit("search-changed")
gtk.main_loop(iteration_delay=0.01)
self.assertFalse(view.Entry.get_style_context().has_class("warning"))
self.assertFalse(view.Popover.is_visible())

View File

@ -3,11 +3,15 @@ from . import model
from .. import audio
from .. import gtk
import curds
import re
from gi.repository import Gtk
Entry = gtk.Builder.get_object("track_search")
Error = gtk.Builder.get_object("track_regex_error")
Loop = gtk.Builder.get_object("loop_button")
Model = None
Pattern = re.compile("")
Popover = gtk.Builder.get_object("track_regex_popover")
Random = gtk.Builder.get_object("random_button")
Runtime = gtk.Builder.get_object("runtime")
TreeView = gtk.Builder.get_object("playlist_treeview")
@ -76,6 +80,20 @@ for i, column in enumerate(TreeView.get_columns()):
column.connect("clicked", on_column_clicked, i)
def on_search_changed(entry):
global Pattern
try:
Pattern = re.compile(entry.get_text(), re.I)
Entry.get_style_context().remove_class("warning")
Popover.popdown()
except re.error as e:
Entry.get_style_context().add_class("warning")
Error.set_text(str(e).capitalize())
Popover.popup()
Entry.connect("search-changed", on_search_changed)
def on_add_track(plist, track, index):
if plist == Model.playlist:
Model.row_inserted(Gtk.TreePath(0), Gtk.TreeIter())