And change the GtkPaned widget to have a small handle. This sets the
division between the playlist manager and the playlist to a single line,
which I think looks really slick
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This is a small detail, but I like the idea of having an indicator when
tracks are loaded or not.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
We use this to load the next track without changing the pipeline state,
which should give us smoother audio switching.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
The common setup and tear down code helps keep everything in sync.
Additionally, we no longer need to wait for duration changes, which have
always been unreliable.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This helps us prepare for the about-to-finish signal by setting this
information when gstreamer starts playing the next track.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
We don't have a reason to set this anything other than True, so let's
just automatically start playing the track. Additionally, change the
playbin to READY instead of NULL to help playback start a little faster.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
I put a smaller progress bar into the header area that users can use for
seeking or checking the current position. I also add two labels to show
time played and time remaining in the current track.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
Users might have images or ripping logs mixed in with their tracks, so
let's make sure we don't crash if we try to scan one of these.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This lets me control size and justification of the text. Additionally, I
put everything into a scrolled window just in case a track has a really
long title name.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
I switch around the sidebar icons again, and also make the header bar
icons larger to make them easier to press with touchscreens
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
Library paths are directories on disk, so it makes sense to use the
folder-music icon to represent them.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
I'll eventually make this more complex when I add in more playlists, but
for now it just calls next on the Collection playlist
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
Converting between a TreeIter and a playlist is very useful, so
implement that functionality now.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
Some tracks in my library aren't formatted as expected, so let's improve
our parsing code to better handle integers.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This is a special tree model that translates our Playlist object into a
format that GTK understands.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
I was having trouble with bound methods when using notifications, since
all empty playlists were getting identified as the same empty list
object. Removing the inheritance fixes the problem.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This represents all tracks added to the collection, from across all
library paths. We also fix the value of Playlist.loop to "True" and
prevent changing it
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This makes removing tracks from playlists way easier, since there is
only ever one instance of the track.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
We want to make sure we get the expected results when calling next() on
empty playlists and with playlists that only have one track.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
I try to prevent the same track from getting selected twice in a row by
incrementing the current pointer rather than setting it directly, and
reducing the random range slightly.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
Now that we have a "new-track" notification, we can replace the add
function with a lookup function that more closely mirrors how we look up
album tags.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
We might want to use these outside of the playlist code, so let's move
this to a generic place so it can be easily used.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
The slash in the filepath was being intepreted as a subdirectory, so
let's change it into an underscore so everything is where we expect.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This replaces the code in playlist/__init__.py and turns it into a
class. This should make things easier to handle during testing, since we
can easily tear down the old instance and create a new one.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
I expect this will mostly get used by testing code as we create and
delete a bunch of different objects.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This is mostly needed by the UI but there are a few cases where we
might need it internally, such as adding newly creating tracks to all
the required playlists.
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>