diff --git a/playlist/header.py b/playlist/header.py index 95471d3..c14b47d 100644 --- a/playlist/header.py +++ b/playlist/header.py @@ -1,4 +1,5 @@ # Copyright 2021 (c) Anna Schumaker. +import audio import db import lib from gi.repository import Gtk @@ -62,6 +63,29 @@ class SortButton(Gtk.MenuButton): self.set_sensitive(plist != db.user.Table.find("Previous")) +class FavoriteButton(Gtk.ToggleButton): + def __init__(self): + Gtk.ToggleButton.__init__(self) + self.set_icon_name("emmental-favorites") + self.track_changed(audio.Player, None, audio.Player.track) + audio.Player.connect("track-changed", self.track_changed) + + def set_playlist(self, plist): + pass + + def track_changed(self, player, old, new): + self.set_sensitive(new != None) + self.set_active(new in db.user.Table.find("Favorites").get_tracks()) + + def do_toggled(self): + if audio.Player.track: + fav = db.user.Table.find("Favorites") + if self.get_active(): + fav.add_track(audio.Player.track) + else: + fav.remove_track(audio.Player.track) + + class JumpButton(Gtk.Button): def __init__(self): Gtk.Button.__init__(self) @@ -88,6 +112,7 @@ class ControlBox(Gtk.Box): class TrackBox(ControlBox): def __init__(self): ControlBox.__init__(self) + self.append(FavoriteButton()) self.append(JumpButton()) def get_jump_button(self): diff --git a/playlist/test_header.py b/playlist/test_header.py index fbf0785..342a962 100644 --- a/playlist/test_header.py +++ b/playlist/test_header.py @@ -1,4 +1,5 @@ # Copyright 2021 (c) Anna Schumaker. +import audio import db import lib import unittest @@ -113,6 +114,52 @@ class TestSortButton(unittest.TestCase): self.assertTrue(sort.get_sensitive()) +class TestFavoriteButton(unittest.TestCase): + def setUp(self): + db.reset() + audio.Player.track = None + + def test_init(self): + fav = header.FavoriteButton() + self.assertIsInstance(fav, Gtk.ToggleButton) + self.assertEqual(fav.get_icon_name(), "emmental-favorites") + self.assertFalse(fav.get_sensitive()) + + def test_sensitive(self): + track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg") + fav = header.FavoriteButton() + fav.track_changed(audio.Player, None, track) + self.assertTrue(fav.get_sensitive()) + fav.track_changed(audio.Player, None, None) + self.assertFalse(fav.get_sensitive()) + + def test_active(self): + fav = header.FavoriteButton() + t1 = db.make_fake_track(1, 1, "Test Track 1", "/a/b/c/1.ogg") + t2 = db.make_fake_track(2, 2, "Test Track 2", "/a/b/c/2.ogg") + db.user.Table.find("Favorites").add_track(t1) + + fav.track_changed(audio.Player, None, t1) + self.assertTrue(fav.get_active()) + fav.track_changed(audio.Player, t1, t2) + self.assertFalse(fav.get_active()) + + def test_toggle(self): + track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg") + fav = header.FavoriteButton() + + fav.set_active(True) + self.assertEqual(db.user.Table.find("Favorites").get_n_tracks(), 0) + fav.set_active(False) + + audio.Player.track = track + self.assertNotIn(track, db.user.Table.find("Favorites").get_tracks()) + fav.set_active(True) + self.assertIn(track, db.user.Table.find("Favorites").get_tracks()) + fav.set_active(False) + self.assertNotIn(track, db.user.Table.find("Favorites").get_tracks()) + + class TestJumpButton(unittest.TestCase): def test_init(self): jump = header.JumpButton() @@ -148,6 +195,9 @@ class TestTrackBox(unittest.TestCase): box = header.TrackBox() child = box.get_first_child() + self.assertIsInstance(child, header.FavoriteButton) + + child = child.get_next_sibling() self.assertIsInstance(child, header.JumpButton) self.assertEqual(box.get_jump_button(), child)