rind: Add previous button and playlist to the UI

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2019-03-24 17:32:16 -04:00
parent e433097309
commit 16b5e1e990
5 changed files with 59 additions and 22 deletions

View File

@ -19,6 +19,21 @@
<property name="can_focus">False</property>
<property name="spacing">5</property>
<property name="show_close_button">True</property>
<child>
<object class="GtkButton" id="previous_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-skip-backward-symbolic</property>
<property name="icon_size">3</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkButton" id="play_button">
<property name="visible">True</property>
@ -33,6 +48,9 @@
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="pause_button">
@ -48,7 +66,7 @@
</child>
</object>
<packing>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
<child>
@ -66,7 +84,7 @@
</child>
</object>
<packing>
<property name="position">2</property>
<property name="position">3</property>
</packing>
</child>
<child type="title">
@ -143,7 +161,7 @@
</object>
<packing>
<property name="pack_type">end</property>
<property name="position">3</property>
<property name="position">4</property>
</packing>
</child>
<child>
@ -156,7 +174,7 @@
</object>
<packing>
<property name="pack_type">end</property>
<property name="position">4</property>
<property name="position">5</property>
</packing>
</child>
<child>
@ -172,7 +190,7 @@
</object>
<packing>
<property name="pack_type">end</property>
<property name="position">5</property>
<property name="position">6</property>
</packing>
</child>
<child>
@ -184,7 +202,7 @@
</object>
<packing>
<property name="pack_type">end</property>
<property name="position">6</property>
<property name="position">7</property>
</packing>
</child>
</object>

View File

@ -14,6 +14,7 @@ NextButton = gtk.Builder.get_object("next_button")
PauseButton = gtk.Builder.get_object("pause_button")
PlayButton = gtk.Builder.get_object("play_button")
Position = gtk.Builder.get_object("position")
PrevButton = gtk.Builder.get_object("previous_button")
ProgScale = gtk.Builder.get_object("progress_scale")
Artist = gtk.Builder.get_object("artist")
Title = gtk.Builder.get_object("title")
@ -28,6 +29,7 @@ class EmmentalAudio:
self.bus_cb = self.bus.connect("message", self.on_message)
self.pause_cb = PauseButton.connect("clicked", self.pause)
self.play_cb = PlayButton.connect( "clicked", self.play)
self.prev_cb = PrevButton.connect( "clicked", self.previous)
self.next_cb = NextButton.connect( "clicked", self.next)
self.seek_cb = ProgScale.connect("change-value", self.seek)
@ -46,6 +48,7 @@ class EmmentalAudio:
PauseButton.disconnect(self.pause_cb)
PlayButton.disconnect(self.play_cb)
NextButton.disconnect(self.next_cb)
PrevButton.disconnect(self.prev_cb)
ProgScale.disconnect(self.seek_cb)
GLib.source_remove(self.timeout_cb)
self.playbin.set_state(Gst.State.NULL)
@ -94,6 +97,9 @@ class EmmentalAudio:
(res, cur) = self.playbin.query_position(Gst.Format.TIME)
return cur / Gst.SECOND if res == True else 0
def previous(self, *args):
self.load(curds.PlaylistManager.previous())
def progress(self):
pos = self.position()
dur = self.duration()

View File

@ -5,7 +5,7 @@ import curds
import threading
from gi.repository import GObject, Gtk, GLib
toplevel = [ "Collection", None, "Library" ]
toplevel = [ "Collection", "Previous", None, "Library" ]
class ManagerModel(GObject.GObject, Gtk.TreeModel):
def __init__(self, *args, **kwargs):

View File

@ -57,6 +57,7 @@ class TestGst(unittest.TestCase):
self.assertIsInstance(gst.PauseButton, Gtk.Button)
self.assertIsInstance(gst.PlayButton, Gtk.Button)
self.assertIsInstance(gst.Position, Gtk.Label)
self.assertIsInstance(gst.PrevButton, Gtk.Button)
self.assertIsInstance(gst.ProgScale, Gtk.Scale)
self.assertIsInstance(gst.Title, Gtk.Label)
@ -113,6 +114,8 @@ class TestGst(unittest.TestCase):
def test_gst_controls(self):
gst.NextButton.clicked()
self.assertIsNone(curds.PlaylistManager.track)
gst.PrevButton.clicked()
self.assertIsNone(curds.PlaylistManager.track)
curds.PlaylistManager["Library"].add(test_album)
curds.playlist.library.library_thread.join()
@ -153,7 +156,11 @@ class TestGst(unittest.TestCase):
self.assertNotEqual(curds.PlaylistManager.track, track2)
track3 = curds.PlaylistManager.track
gst.PrevButton.clicked()
self.main_loop_until(Gst.State.PLAYING)
self.assertEqual(curds.PlaylistManager.track, track2)
self.audio.seek(value=90)
self.main_loop_until(Gst.State.PLAYING)
self.main_loop(delay=1)
self.assertNotEqual(curds.PlaylistManager.track, track3)
self.assertNotEqual(curds.PlaylistManager.track, track2)

View File

@ -9,14 +9,15 @@ from gi.repository import Gtk, GObject, GLib
plist_mgr = curds.PlaylistManager
test_album = os.path.abspath("./trier/Test Library/Test Artist 02/Test Album 1")
toplevel_names = [ "Collection\n0 Tracks", "", "<big>Library</big>" ]
toplevel_icons = [ "media-playback-start", "", "folder" ]
toplevel_plist = [ plist_mgr["Collection"], None, plist_mgr["Library"] ]
toplevel_names = [ "Collection\n0 Tracks", "Previous\n0 Tracks", "", "<big>Library</big>" ]
toplevel_icons = [ "media-playback-start", "edit-undo", "", "folder" ]
toplevel_plist = [ plist_mgr["Collection"], plist_mgr["Previous"], None, plist_mgr["Library"] ]
class TestManager(unittest.TestCase):
def setUp(self):
curds.tags.tag_map.clear()
curds.PlaylistManager["Collection"].list.clear()
curds.PlaylistManager["Previous"].list.clear()
curds.PlaylistManager["Library"].clear()
curds.Notify.notify_me("new-track", curds.PlaylistManager["Collection"].add)
curds.Notify.notify_me("add-track", manager.MgrModel.on_add_track)
@ -46,7 +47,7 @@ class TestManager(unittest.TestCase):
path = Gtk.TreePath(0)
iter = model.get_iter(path)
self.assertEqual(model.iter_n_children(None), 3)
self.assertEqual(model.iter_n_children(None), 4)
self.assertEqual(iter.user_data, 1)
self.assertEqual(iter.user_data2, 0)
@ -88,7 +89,7 @@ class TestManager(unittest.TestCase):
model = manager.ManagerModel()
iter = model.find_playlist(plist_mgr["Library"])
self.assertEqual(iter.user_data, 3)
self.assertEqual(iter.user_data, 4)
self.assertEqual(iter.user_data2, 0)
self.assertEqual(iter.user_data3, 0)
self.assertFalse(model.iter_has_child(iter))
@ -98,25 +99,25 @@ class TestManager(unittest.TestCase):
self.assertEqual(model.iter_n_children(iter), 1)
child = model.iter_children(iter)
self.assertEqual(child.user_data, 3)
self.assertEqual(child.user_data, 4)
self.assertEqual(child.user_data2, 1)
self.assertEqual(child.user_data3, 0)
self.assertEqual(model.get_path(child).get_indices(), [ 2, 0 ])
self.assertEqual(model.get_path(child).get_indices(), [ 3, 0 ])
child = model.find_playlist(plist)
path = model.get_path(child)
self.assertEqual(child.user_data, 3)
self.assertEqual(child.user_data, 4)
self.assertEqual(child.user_data2, 1)
self.assertEqual(child.user_data3, 0)
self.assertEqual(model.iter_playlist(child), plist)
self.assertEqual(path.get_indices(), [ 2, 0 ])
self.assertEqual(path.get_indices(), [ 3, 0 ])
citer = model.get_iter(path)
self.assertEqual(citer.user_data, 3)
self.assertEqual(citer.user_data, 4)
self.assertEqual(citer.user_data2, 1)
self.assertEqual(citer.user_data3, 0)
iter = model.iter_parent(child)
self.assertEqual(iter.user_data, 3)
self.assertEqual(iter.user_data, 4)
self.assertEqual(iter.user_data2, 0)
self.assertEqual(iter.user_data3, 0)
@ -140,13 +141,18 @@ class TestManager(unittest.TestCase):
path.next()
selection.select_path(path)
self.assertFalse(selection.path_is_selected(path))
self.assertEqual(playlist.PlistModel.playlist, plist_mgr["Collection"])
self.assertTrue(selection.path_is_selected(path))
self.assertEqual(playlist.PlistModel.playlist, plist_mgr["Previous"])
path.next()
selection.select_path(path)
self.assertFalse(selection.path_is_selected(path))
self.assertEqual(playlist.PlistModel.playlist, plist_mgr["Collection"])
self.assertEqual(playlist.PlistModel.playlist, plist_mgr["Previous"])
path.next()
selection.select_path(path)
self.assertFalse(selection.path_is_selected(path))
self.assertEqual(playlist.PlistModel.playlist, plist_mgr["Previous"])
path.down()
selection.select_path(path)