rind: Add previous button and playlist to the UI
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
e433097309
commit
16b5e1e990
30
emmental.ui
30
emmental.ui
|
@ -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>
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue