Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions data/music.gschema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
<summary>The queue from last session to restore</summary>
<description>An array of strings representing the files played last</description>
</key>
<key type="s" name="uri-last-played">
<default>''</default>
<summary>The item that was playing when the user closed Music</summary>
<description>A string representing the uri of the last played music file</description>
</key>

<key name="window-height" type="i">
<default>475</default>
Expand Down
7 changes: 7 additions & 0 deletions src/Application.vala
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,16 @@ public class Music.Application : Gtk.Application {

settings.bind ("window-maximized", main_window, "maximized", SettingsBindFlags.SET);


// Restoring the queue overwrites the last played. So we need to retrieve it before
var? uri_last_played = settings.get_string ("uri-last-played");

// This needs to be done after window is constructed
// Else music plays but the queue seems empty
playback_manager.restore_queue ();
settings.set_string ("uri-last-played", uri_last_played);
playback_manager.restore_last_played ();

}

private static File[] list_directory (string directory) {
Expand Down
4 changes: 4 additions & 0 deletions src/AudioObject.vala
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,8 @@ public class Music.AudioObject : Object {
public AudioObject (string uri) {
Object (uri: uri);
}

public static bool equal_func (AudioObject a, AudioObject b) {
return (a.uri == b.uri);
}
}
25 changes: 25 additions & 0 deletions src/PlaybackManager.vala
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,8 @@ public class Music.PlaybackManager : Object {

var play_pause_action = (SimpleAction) GLib.Application.get_default ().lookup_action (Application.ACTION_PLAY_PAUSE);
play_pause_action.set_enabled (current_audio != null);

settings.set_string ("uri-last-played", current_audio.uri ?? "");
}

private void save_queue () {
Expand All @@ -531,4 +533,27 @@ public class Music.PlaybackManager : Object {
var files_to_play = Application.loop_through_files (last_session_files);
queue_files (files_to_play);
}

public void restore_last_played () {
var? uri_last_played = settings.get_string ("uri-last-played");
var? file_last_played = File.new_for_uri (uri_last_played);

if (( uri_last_played != "" ) && (file_last_played.query_exists ())) {
var audio_object = new AudioObject (uri_last_played);
uint position = -1;
int found_at = -1;

if (queue_liststore.find_with_equal_func (
audio_object,
(a, b) => {
return AudioObject.equal_func ((AudioObject)a, (AudioObject)b);
},
out position
)) {
found_at = (int)position;
}

current_audio = (AudioObject) queue_liststore.get_item (position);
}
}
}
14 changes: 10 additions & 4 deletions src/Views/NowPlayingView.vala
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,16 @@ public class Music.NowPlayingView : Gtk.Box {

playback_manager.notify["current-audio"].connect (() => {
if (playback_manager.current_audio != null) {
playback_manager.current_audio.bind_property ("artist", artist_label, "label", BindingFlags.SYNC_CREATE);
playback_manager.current_audio.bind_property ("title", title_label, "label", BindingFlags.SYNC_CREATE);
playback_manager.current_audio.bind_property ("duration", seekbar, "playback-duration", BindingFlags.SYNC_CREATE);
playback_manager.current_audio.bind_property ("texture", album_image.image, "paintable", BindingFlags.SYNC_CREATE);
artist_label.label = playback_manager.current_audio.artist;
title_label.label = playback_manager.current_audio.title;
album_image.image.paintable = playback_manager.current_audio.texture;

playback_manager.current_audio.bind_property (
"duration",
seekbar,
"playback-duration",
BindingFlags.SYNC_CREATE);

} else {
album_image.image.clear ();
artist_label.label = _("Not playing");
Expand Down