Commit Graph

1069 Commits

Author SHA1 Message Date
5d18c336d5 sidebar: Create an AddPlaylistEntry
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
0152ba1431 sidebar: Create a custom ProgressBar
This takes the ProgressBar from the scanner widgets and puts in in a Box
with Labels on either side to reserve its space at all times.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
7beebbc7d1 sidebar: Create a Stack Switcher
This allocates a Stack during __init__(), which can then be displayed to
the user.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
16038a16f1 sidebar: Create a Stack with pages
Additionally, we save the current page when it is changed and restore on
startup.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
31695863de sidebar: Create a TableWindow scrolled window
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
2e4062a515 sidebar: Create a UserView list view
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
9dc466e8f1 sidebar: Create a TableView list view
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
869ab6d274 sidebar: Create a UserRow and UserRowFactory
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
e1cab1de6f sidebar: Create a TreeRow and {User,Library,}TreeRowFactorys
This is a Gtk.TreeExpander with some extra functions to work the way we
need it. We don't have a way to create Gtk.TreeListRows manually, so we
can't test the set_item() and unset_item() functions directly.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>

sidebar: Create a LibraryTreeRowFactory

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
3bd60b0f06 sidebar: Create a LibraryGrid
This adds a menu button with extra options for libraries

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
0e7cb81476 sidebar: Create a UserGrid
This adds a button users can click to remove the playlists they create.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
d1d84af228 sidebar: Create a row Grid
This contains the actual widgets used to display playlist information. I
override the GtkGrid.attach() function so it returns the attached widget
to simplify setup a little bit.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
b75fc78de7 sidebar: Create a row Label
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
fdc4bb7275 sidebar: Create a LibraryPopover
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
0014e5fa55 sidebar: Create a LibraryButtons box
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
59d9c3b484 sidebar: Create a UserSelection list model
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:54 -05:00
1d5a52623c sidebar: Create a TableSelection list model
Configured to allow unselecting items so we have a way of choosing an
item if it is the only one in the list.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-20 10:04:52 -05:00
b74f948acb sidebar: Create a FilterUserModel list model
With a custom filter that only displays playlists that users can add
tracks to directly.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-19 10:34:08 -05:00
43ec165a56 sidebar: Create a FilterTableModel list model
With a custom Regex filter that checks if the parent or any children
match the given pattern.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-19 10:34:08 -05:00
c982fe624b sidebar: Create a TreeListModel helper function
I can't inherit from Gtk.TreeListModel since the new() constructor is
the only way to set the create_child_func. Instead, use this wrapper
function to do the same thing.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-19 10:34:08 -05:00
17391acd4d sidebar: Create a ChildModel list model
This will be used to display the children of some of our playlists.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-19 10:34:08 -05:00
f02104a9c1 Emmental 2.8 AUR commit
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-19 10:32:12 -05:00
b62c7f1554 Emmental 2.8
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-19 10:29:59 -05:00
bc4c3588e6 ui: Convert Window code into a class
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 16:49:58 -05:00
b05ef737f2 ui: Convert Pane code into a class
This lets us create a new instance for each test we do, so we don't need
to keep resetting a single static instance.

Implements: #21 (Convert ui.pane.Pane into a class)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 16:49:58 -05:00
7979cb1a4a ui: Switch to the new audio.Header()
And delete the old ui/header.py code

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 16:49:58 -05:00
880f0a686b audio: Replace load_track() with change_track()
To mark tracks played and then emit the track-changed signal to start
the next track.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 16:49:58 -05:00
97a05efe7e audio: Give the Player a play_track() function
To load and play a different track

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 16:49:58 -05:00
96956c730d audio: Give the AutoPauseScale a keep_playing property
And a function to find out if we are about to pause or not.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 16:49:58 -05:00
049eeec38a audio: Implement a Header bar
This moves the code out of ui/ and turns it into a class for easier
testing.

Implements: Issue #22 (Move Gtk.HeaderBar code into audio/)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
03b3c4a806 audio: Fix GstOutputSelector pad negotiation
All sinks need to post the EOS message before the pipeline can pass it
on to our application. Using pad negotiation mode 2 means that the
message is only sent to the active path in the output selector, leaving
our application hanging waiting for the inactive path to post EOS as
well.

Fixes: #33 (Fix Autopause not resetting)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
20e4ab4ba5 db: Update icons for the Previous and QueuedTracks playlists
So they match the next and previous button icons

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
cc88dcab0a db: Give QueuedTracks a custom next_track() function
So we can remove tracks from the queue as they are played.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
2e57e1fe0a db: Preserve the current track when removing tracks
Again, we have to be careful not to check positions against playlists
where current == -1 for performance reasons.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
2f747ccaa6 db: Preserve the current track when adding tracks
We have to be careful not to check track positions against playlists
where current == -1, because this could drastically slow down adding new
tracks because SQLite would need to find the position for every track

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
e94a737718 db: Provide a passthrough for playlist_state.rowid
So the audio layer can easily access it when saving the current
playlist.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
ee6bf059c1 db: Replace years.year with albums.release in the default sort order
And remove the INNER JOIN with the years table since it is no longer
needed.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
0b818bc067 db: Attach release information to albums
This lets us sort albums by original release date, so if an artist
releases multiple albums in a year we can sort by month too.
Additionally, this helps us better handle albums with the same name that
were released in different years.

Implements: #40 (Store the full date in the year table)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
050a930376 db: Give the Previous playlist special next and previous functions
previous_track() moves deeper into the previous tracks list while
next_track() moves us closer to the start. I also make sure we reset
current track when new tracks are added to the playlist.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
7a46ffdf47 db: Give playlists a next_track() function
For picking the next track (with or without random enabled)

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
8a4590f0ed db: Preserve the current track when sorting
Implements: #39 (Preserve current track when sorting)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
23699a601d db: Have playlists clamp the current track value
And add a get_current_track() function to make it easier to get the
currently selected track. Clamping behaves differently if random or loop
are enabled to ensure a track is still picked.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
c658e873a6 db: Create a function to find playlists based on state id
So we can write the current playlist stateid to the settings file and
look it up later.

Implements: #36 (Find playlists based on playlist state id)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
6b5b2a745e db: Create a function for checking if this is a new database
So the tagdb can attempt to import tracks if none have been added to the
sql database yet.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
f82e299736 db: Add tracks.trackid ASC as a fallback sort option
This keeps us from ever completely clearing the sort field in the
playlist state, since that would lead to an incomplete SQL query error.

Fixes: #38 (PlaylistStates should not allow completely clearing sort)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
d8dbba0960 db: Commit after deleting a User playlist
Fixes: Issue #35 (Commit when creating or deleting new User playlists)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
adfbf8fdbc db: Give Discs a "number" property
So we can access the disc number when displaying tracks in the tracklist

Implements: Issue #34 (Give Discs a "number" property)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
ea31e1539a scanner: Adjust timing for the DirectoryChooserWidget test
Adding a brief sleep when checking main_context iterations gives the
widget a chance to update the path so the test can pass more reliably.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
472280ca9b sidebar: Don't pop up the dir chooser popover during testing
This can cause a segfault for some reason, but the test works perfectly
fine without it.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00
3d77e8cd2a scanner: Give ImportTasks a "playlists" argument
So users don't need to re-create their playlists when switching over to
the sqlite database.

Implements: #10 (Import user playlists)
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-11-18 10:20:24 -05:00