From 1a29458d7cd1a065a7dba89f7e017ac42ec93737 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Tue, 24 May 2016 11:13:44 -0400 Subject: [PATCH] core/playlists/generic: Add a playlist_generic_remove() function Signed-off-by: Anna Schumaker --- core/playlists/generic.c | 5 +++ core/playlists/system.c | 69 ++++++++++++++++++--------------- include/core/playlists/system.h | 1 + include/core/playlists/type.h | 3 ++ 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/core/playlists/generic.c b/core/playlists/generic.c index f24f4156..286bbf54 100644 --- a/core/playlists/generic.c +++ b/core/playlists/generic.c @@ -29,6 +29,11 @@ bool playlist_generic_add_track(struct playlist *playlist, struct track *track) return true; } +bool playlist_generic_remove_track(struct playlist *playlist, struct track *track) +{ + return queue_remove_all(&playlist->pl_queue, track); +} + void playlist_generic_set_flag(struct playlist *playlist, enum queue_flags flag, bool enabled) { diff --git a/core/playlists/system.c b/core/playlists/system.c index 47ded1ba..08ffc354 100644 --- a/core/playlists/system.c +++ b/core/playlists/system.c @@ -6,8 +6,8 @@ #include static bool pl_system_add_track(const gchar *, struct track *); +static bool pl_system_remove_track(const gchar *, struct track *); static inline struct queue *__sys_pl_queue(enum sys_playlist_t); -static bool __sys_pl_remove(enum sys_playlist_t, struct track *); static void __sys_pl_save_collection(); static void __sys_pl_save(); @@ -36,6 +36,13 @@ static bool sys_pl_favorites_add(struct playlist *playlist, struct track *track) return ret; } +static bool sys_pl_favorites_remove(struct playlist *playlist, struct track *track) +{ + bool ret = playlist_generic_remove_track(playlist, track); + __sys_pl_save(); + return ret; +} + /* * Hidden tracks playlist operations. @@ -43,10 +50,21 @@ static bool sys_pl_favorites_add(struct playlist *playlist, struct track *track) static bool sys_pl_hidden_add(struct playlist *playlist, struct track *track) { bool ret = playlist_generic_add_track(playlist, track); - __sys_pl_remove(SYS_PL_COLLECTION, track); - __sys_pl_remove(SYS_PL_UNPLAYED, track); - __sys_pl_remove(SYS_PL_MOST_PLAYED, track); - __sys_pl_remove(SYS_PL_LEAST_PLAYED, track); + pl_system_remove_track("Collection", track); + pl_system_remove_track("Unplayed", track); + pl_system_remove_track("Most Played", track); + pl_system_remove_track("Least Played", track); + __sys_pl_save(); + return ret; +} + +static bool sys_pl_hidden_remove(struct playlist *playlist, struct track *track) +{ + bool ret = playlist_generic_remove_track(playlist, track); + pl_system_add_track("Collection", track); + pl_system_add_track("Unplayed", track); + pl_system_add_track("Most Played", track); + pl_system_add_track("Least Played", track); __sys_pl_save(); return ret; } @@ -127,42 +145,49 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = { [SYS_PL_FAVORITES] = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Favorites"), .spl_add = sys_pl_favorites_add, + .spl_remove = sys_pl_favorites_remove, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, }, [SYS_PL_HIDDEN] = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Hidden"), .spl_add = sys_pl_hidden_add, + .spl_remove = sys_pl_hidden_remove, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, }, [SYS_PL_COLLECTION] = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Collection"), .spl_add = sys_pl_collection_add, + .spl_remove = playlist_generic_remove_track, .spl_set_flag = sys_pl_collection_set_flag, .spl_sort = sys_pl_collection_sort, }, [SYS_PL_HISTORY] = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "History"), .spl_add = sys_pl_history_add, + .spl_remove = playlist_generic_remove_track, .spl_set_flag = playlist_noop_set_flag, .spl_sort = playlist_noop_sort, }, [SYS_PL_UNPLAYED] = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Unplayed"), .spl_add = sys_pl_unplayed_add, + .spl_remove = playlist_generic_remove_track, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, }, [SYS_PL_MOST_PLAYED] = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Most Played"), .spl_add = sys_pl_most_played_add, + .spl_remove = playlist_generic_remove_track, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, }, [SYS_PL_LEAST_PLAYED] = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Least Played"), .spl_add = sys_pl_least_played_add, + .spl_remove = playlist_generic_remove_track, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, }, @@ -276,25 +301,6 @@ static bool __sys_pl_can_add(enum sys_playlist_t plist, struct track *track, return plist == SYS_PL_MOST_PLAYED; } -static bool __sys_pl_remove(enum sys_playlist_t plist, struct track *track) -{ - if (!queue_remove_all(__sys_pl_queue(plist), track)) - return false; - - switch (plist) { - case SYS_PL_HIDDEN: - pl_system_add_track("Collection", track); - pl_system_add_track("Unplayed", track); - pl_system_add_track("Most Played", track); - pl_system_add_track("Least Played", track); - case SYS_PL_FAVORITES: - __sys_pl_save(); - default: - break; - } - return true; -} - static bool __sys_pl_update(enum sys_playlist_t plist) { struct sys_playlist *sys_pl = &sys_playlists[plist]; @@ -305,7 +311,7 @@ static bool __sys_pl_update(enum sys_playlist_t plist) if (__sys_pl_can_add(plist, TRACK(dbe), average)) sys_pl->spl_add(&sys_pl->spl_playlist, TRACK(dbe)); else - __sys_pl_remove(plist, TRACK(dbe)); + sys_pl->spl_remove(&sys_pl->spl_playlist, TRACK(dbe)); } queue_unset_flag(__sys_pl_queue(plist), Q_ADD_FRONT); @@ -332,10 +338,8 @@ static bool pl_system_add_track(const gchar *name, struct track *track) static bool pl_system_remove_track(const gchar *name, struct track *track) { - enum sys_playlist_t plist = __sys_pl_convert(name); - if (plist == SYS_PL_NUM_PLAYLISTS) - return false; - return __sys_pl_remove(plist, track); + struct sys_playlist *sys_pl = __sys_pl_lookup(name); + return sys_pl ? sys_pl->spl_remove(&sys_pl->spl_playlist, track) : false; } static void pl_system_update(const gchar *name) @@ -414,8 +418,11 @@ void pl_system_new_track(struct track *track) void pl_system_delete_track(struct track *track) { + struct sys_playlist *sys_pl; unsigned int i; - for (i = 0; i < SYS_PL_NUM_PLAYLISTS; i++) - __sys_pl_remove(i, track); + for (i = 0; i < SYS_PL_NUM_PLAYLISTS; i++) { + sys_pl = &sys_playlists[i]; + sys_pl->spl_remove(&sys_pl->spl_playlist, track); + } } diff --git a/include/core/playlists/system.h b/include/core/playlists/system.h index 3d263576..3ac667f3 100644 --- a/include/core/playlists/system.h +++ b/include/core/playlists/system.h @@ -21,6 +21,7 @@ struct sys_playlist { struct playlist spl_playlist; bool (*spl_add)(struct playlist *, struct track *); + bool (*spl_remove)(struct playlist *, struct track *); void (*spl_set_flag)(struct playlist *, enum queue_flags, bool); void (*spl_sort)(struct playlist *, enum compare_t, bool); }; diff --git a/include/core/playlists/type.h b/include/core/playlists/type.h index 5624f6b2..7ff4118a 100644 --- a/include/core/playlists/type.h +++ b/include/core/playlists/type.h @@ -64,6 +64,9 @@ void playlist_noop_sort(struct playlist *, enum compare_t, bool); /* Generic playlist add track operation. */ bool playlist_generic_add_track(struct playlist *, struct track *); +/* Generic playlist remove track operation. */ +bool playlist_generic_remove_track(struct playlist *, struct track *); + /* Generic playlist set_flag operation. */ void playlist_generic_set_flag(struct playlist *, enum queue_flags, bool);