Disable temporary playlists

When a playlist is disabled I won't pick songs from it until the user
re-enables it.

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-05-18 11:25:51 -04:00
parent f6cdcae79c
commit 35d71efe58
5 changed files with 52 additions and 10 deletions

View File

@ -13,6 +13,7 @@ enum PlaylistFlags {
PL_NONE = (0),
PL_NO_DRAIN = (1 << 0),
PL_STATIC = (1 << 1),
PL_DISABLED = (1 << 2),
};
enum PlaylistType {
@ -72,11 +73,14 @@ namespace libsaria
void save(ofstream &);
bool is_static();
bool is_disabled();
void prepare_for_removal();
void reset_iterator();
void set_filter_text(string &);
bool is_visible(libsaria::Track *);
void set_disabled(bool);
virtual Track *next() = 0;
string &get_name();
void renumber(int);

View File

@ -16,6 +16,7 @@ namespace ocarina
GtkWidget *box;
GtkWidget *entry;
GtkWidget *treeview;
GtkWidget *disable_button;
GtkListStore *liststore;
GtkTreeModel *filter;
GtkTreeSelection *treesel;
@ -23,6 +24,7 @@ namespace ocarina
void set_label_text();
void set_length_label_text();
void setup_treeview();
GtkWidget *make_disable_button();
public:
Playlist(unsigned int);

View File

@ -27,6 +27,18 @@ static void renumber_playlists()
(*it)->renumber(n++);
}
static libsaria::Playlist *get_active_playlist()
{
list<libsaria::Playlist *>::iterator it;
for (it = playlist_deck.begin(); it != playlist_deck.end(); it++) {
if (!(*it)->is_disabled())
return *it;
}
return libsaria::library::get_playlist();
}
static bool check_play()
{
bool ret = true;
@ -76,15 +88,9 @@ namespace libsaria
void deck::next()
{
Playlist *plist;
Track *track;
Playlist *plist = get_active_playlist();
Track *track = plist->next();
if (playlist_deck.size() == 0)
plist = library::get_playlist();
else
plist = playlist_deck.front();
track = plist->next();
if (track)
track->load(check_play());

View File

@ -27,6 +27,19 @@ namespace libsaria
return (flags & PL_STATIC) == PL_STATIC;
}
bool Playlist::is_disabled()
{
return (flags & PL_DISABLED) == PL_DISABLED;
}
void Playlist::set_disabled(bool disabled)
{
if (disabled)
flags |= PL_DISABLED;
else
flags &= ~PL_DISABLED;
}
void Playlist::prepare_for_removal()
{
/*

View File

@ -10,6 +10,12 @@
#include <sstream>
using namespace std;
static void disable_playlist(GtkWidget *button, gpointer d)
{
libsaria::Playlist *plist = (libsaria::Playlist *)d;
plist->set_disabled(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
}
static void delete_playlist(GtkWidget *button, gpointer d)
{
libsaria::Playlist *plist = (libsaria::Playlist *)d;
@ -153,6 +159,7 @@ namespace ocarina
void Playlist::set_playlist(libsaria::Playlist *p)
{
GtkWidget *label_box = gtk_hbox_new(FALSE, 0);
GtkWidget *entry_box = gtk_hbox_new(FALSE, 0);
GtkWidget *close_button;
libsaria::PlaylistRenderer::set_playlist(p);
@ -166,13 +173,23 @@ namespace ocarina
entry = gtk_entry_new();
g_signal_connect(entry, "changed", G_CALLBACK(do_filter), this);
gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(entry_box), entry, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(box), entry_box, FALSE, FALSE, 0);
setup_treeview();
gtk_box_pack_start(GTK_BOX(label_box), number, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(label_box), name, TRUE, TRUE, 0);
if (!p->is_static()) {
/* Make disable button for playlists */
disable_button = make_toggle_button_data(GTK_STOCK_MEDIA_PAUSE,
disable_playlist,
p, true);
gtk_box_pack_start(GTK_BOX(entry_box), disable_button, FALSE, FALSE, 0);
/* Make close button for tabs */
close_button = make_button_data(GTK_STOCK_CLOSE, delete_playlist, p, true);
gtk_button_set_relief(GTK_BUTTON(close_button), GTK_RELIEF_NONE);
gtk_rc_parse_string(
@ -186,7 +203,7 @@ namespace ocarina
}
gtk_widget_show_all(label_box);
gtk_widget_show(entry);
gtk_widget_show_all(entry_box);
set_label_text();
renumbered(p->get_number());