ocarina: Add a random button to playlists

I reused my old dice png from several releases ago.  This implements the
"switch a playlist from set to queue and back again" feature that I
wanted.

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-09-16 10:29:11 -04:00
parent 848faa2bc6
commit d785b91c46
5 changed files with 47 additions and 17 deletions

View File

@ -16,6 +16,7 @@ def script(target, source, env):
extra_files = [
("ocarina.xml", "../lib/ocarina/ocarina.xml", copy),
("images/random.png", "../lib/ocarina/random.png", copy),
("images/ocarina.png", "../lib/ocarina/ocarina.png", copy),
("images/thumbs_up.png", "../lib/ocarina/thumbs_up.png", copy),
("images/thumbs_down.png", "../lib/ocarina/thumbs_down.png", copy),

View File

@ -39,6 +39,7 @@ void on_notify(notify_t event, void *data)
case PLAYLIST_DELETE:
case PLAYLIST_RENUMBER:
case PLAYLIST_DISABLE:
case PLAYLIST_RANDOM:
update_tabs(event, (libsaria::Playlist *)data);
break;
case PLAYLIST_ADD:

View File

@ -14,6 +14,7 @@ enum ExtraWidgets {
NO_EXTRA_WIDGETS = 0,
CLOSE_BUTTON = (1 << 0),
DISABLE_BUTTON = (1 << 1),
RANDOM_BUTTON = (1 << 2),
};
struct PlaylistWidgets {
@ -27,6 +28,7 @@ struct PlaylistWidgets {
GtkLabel *page_label;
GtkEntry *entry;
GtkToggleButton *disable;
GtkToggleButton *random;
};
/* library.cpp */

View File

@ -1,5 +1,6 @@
// Copyright (c) 2012 Bryan Schumaker
#include <track.h>
#include <library.h>
#include <stdlib.h>
#include "ocarina.h"
@ -389,6 +390,15 @@ static void playlist_disable(GtkToggleButton *button, gpointer data)
playlist->set_disabled(gtk_toggle_button_get_active(button));
}
static void playlist_random(GtkToggleButton *button, gpointer data)
{
struct libsaria::Playlist *playlist = (libsaria::Playlist *)data;
if (playlist == libsaria::library::get_playlist())
libsaria::library::set_random(gtk_toggle_button_get_active(button));
else
playlist->set_random(gtk_toggle_button_get_active(button));
}
void setup_widgets(struct PlaylistWidgets *widgets, libsaria::Playlist *playlist)
{
unsigned int num_columns = sizeof(types) / sizeof(GType);
@ -446,6 +456,19 @@ static GtkWidget *setup_disable_button(struct PlaylistWidgets *widgets)
return GTK_WIDGET(widgets->disable);
}
static GtkWidget *setup_random_button(struct PlaylistWidgets *widgets)
{
GtkWidget *image = gtk_image_new_from_file(lib_file("random.png").c_str());
widgets->random = GTK_TOGGLE_BUTTON(gtk_toggle_button_new());
gtk_button_set_image(GTK_BUTTON(widgets->random), image);
gtk_widget_set_name(GTK_WIDGET(widgets->random), "ocarina-small-button");
gtk_toggle_button_set_active(widgets->random, widgets->playlist->get_random());
g_signal_connect(GTK_WIDGET(widgets->random), "toggled", G_CALLBACK(playlist_random), widgets->playlist);
return GTK_WIDGET(widgets->random);
}
static void add_column(GtkTreeView *treeview, const string &title, int index,
GtkTreeViewColumnSizing sizing, unsigned int fixed_width)
{
@ -472,6 +495,8 @@ void setup_playlist_page(struct PlaylistWidgets *widgets, int flags)
if (flags & CLOSE_BUTTON)
gtk_box_pack_start(GTK_BOX(top_box), setup_close_button(widgets), FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(top_box), GTK_WIDGET(widgets->entry), TRUE, TRUE, 0);
if (flags & RANDOM_BUTTON)
gtk_box_pack_start(GTK_BOX(top_box), setup_random_button(widgets), FALSE, FALSE, 0);
if (flags & DISABLE_BUTTON)
gtk_box_pack_start(GTK_BOX(top_box), setup_disable_button(widgets), FALSE, FALSE, 0);

View File

@ -186,19 +186,13 @@ static void make_tab_label(const string &name, struct PlaylistWidgets *widgets)
gtk_widget_show_all(GTK_WIDGET(widgets->tab_box));
}
static void init_widgets(struct PlaylistWidgets *widgets, libsaria::Playlist *playlist,
int flags)
static void init_page(const string &name, struct PlaylistWidgets *widgets,
libsaria::Playlist *playlist, int page_num, unsigned int flags)
{
setup_widgets(widgets, playlist);
setup_playlist_page(widgets, flags);
}
static void add_static_page(const string &name, struct PlaylistWidgets *widgets,
libsaria::Playlist *playlist)
{
init_widgets(widgets, playlist, NO_EXTRA_WIDGETS);
make_tab_label(name, widgets);
add_page(GTK_WIDGET(widgets->page_box), GTK_WIDGET(widgets->tab_box), -1);
add_page(GTK_WIDGET(widgets->page_box), GTK_WIDGET(widgets->tab_box), page_num);
}
void init_tabs()
@ -206,9 +200,9 @@ void init_tabs()
tabs = GTK_NOTEBOOK(get_widget("PlaylistTabs"));
init_tab_action();
add_static_page("Library", &library_widgets, libsaria::library::get_playlist());
add_static_page("Recent", &recent_widgets, libsaria::deck::get_recent_plist());
add_static_page("Banned", &banned_widgets, libsaria::ban::get_banned_plist());
init_page("Library", &library_widgets, libsaria::library::get_playlist(), -1, RANDOM_BUTTON);
init_page("Recent", &recent_widgets, libsaria::deck::get_recent_plist(), -1, NO_EXTRA_WIDGETS);
init_page("Banned", &banned_widgets, libsaria::ban::get_banned_plist(), -1, NO_EXTRA_WIDGETS);
connect_signal("PlaylistTabs", "switch-page", G_CALLBACK(on_switch_page), NULL);
connect_signal("PlaylistTabs", "page-reordered", G_CALLBACK(on_page_reordered), NULL);
@ -218,11 +212,9 @@ static void new_playlist(libsaria::Playlist *playlist)
{
struct PlaylistWidgets *widgets = new struct PlaylistWidgets;
dynamic_widgets.push_back(widgets);
init_widgets(widgets, playlist, CLOSE_BUTTON | DISABLE_BUTTON);
make_tab_label(playlist->get_name(), widgets);
add_page(GTK_WIDGET(widgets->page_box), GTK_WIDGET(widgets->tab_box),
libsaria::deck::get_playlist_index(playlist));
init_page(playlist->get_name(), widgets, playlist,
libsaria::deck::get_playlist_index(playlist),
CLOSE_BUTTON | DISABLE_BUTTON | RANDOM_BUTTON);
gtk_notebook_set_tab_reorderable(tabs, GTK_WIDGET(widgets->page_box), true);
}
@ -260,6 +252,13 @@ static void disable_playlist(libsaria::Playlist *playlist)
gtk_widget_set_sensitive(GTK_WIDGET(widgets->tab_box), enabled);
}
static void random_playlist(libsaria::Playlist *playlist)
{
struct PlaylistWidgets *widgets = find_playlist_widgets(playlist);
if (widgets)
gtk_toggle_button_set_active(widgets->random, playlist->get_random());
}
void update_tabs(notify_t event, libsaria::Playlist *playlist)
{
if (event == PLAYLIST_NEW)
@ -270,4 +269,6 @@ void update_tabs(notify_t event, libsaria::Playlist *playlist)
renumber_playlist(playlist);
else if (event == PLAYLIST_DISABLE)
disable_playlist(playlist);
else if (event == PLAYLIST_RANDOM)
random_playlist(playlist);
}