static gboolean playlist_picker_button(GtkWidget *widget,
GdkEventButton *event,
gpointer user_data);
+static gboolean playlist_editor_keypress(GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+static void playlist_editor_ok(GtkButton *button, gpointer userdata);
+static void playlist_editor_help(GtkButton *button, gpointer userdata);
/** @brief Playlist editing window */
static GtkWidget *playlist_window;
* - select/deselect all work
*/
static struct menuitem playlist_menuitems[] = {
- { "Track properties", ql_properties_activate, ql_properties_sensitive, 0, 0 },
- { "Play track", ql_play_activate, ql_play_sensitive, 0, 0 },
- { "Play playlist", playlist_playall_activate, playlist_playall_sensitive, 0, 0 },
- { "Remove track from queue", playlist_remove_activate, playlist_remove_sensitive, 0, 0 },
- { "Select all tracks", ql_selectall_activate, ql_selectall_sensitive, 0, 0 },
- { "Deselect all tracks", ql_selectnone_activate, ql_selectnone_sensitive, 0, 0 },
+ { "Track properties", GTK_STOCK_PROPERTIES, ql_properties_activate, ql_properties_sensitive, 0, 0 },
+ { "Play track", GTK_STOCK_MEDIA_PLAY, ql_play_activate, ql_play_sensitive, 0, 0 },
+ { "Play playlist", NULL, playlist_playall_activate, playlist_playall_sensitive, 0, 0 },
+ { "Remove track from playlist", GTK_STOCK_DELETE, playlist_remove_activate, playlist_remove_sensitive, 0, 0 },
+ { "Select all tracks", GTK_STOCK_SELECT_ALL, ql_selectall_activate, ql_selectall_sensitive, 0, 0 },
+ { "Deselect all tracks", NULL, ql_selectnone_activate, ql_selectnone_sensitive, 0, 0 },
};
static const GtkTargetEntry playlist_targets[] = {
/* Playlists menu ----------------------------------------------------------- */
static void playlist_menu_playing(void attribute((unused)) *v,
- const char *err) {
+ const char *err,
+ const char attribute((unused)) *id) {
if(err)
popup_submsg(playlist_window, GTK_MESSAGE_ERROR, err);
}
return;
}
for(int n = 0; n < nvec; ++n)
- disorder_eclient_play(client, vec[n], playlist_menu_playing, NULL);
+ disorder_eclient_play(client, playlist_menu_playing, vec[n], NULL);
}
/** @brief Called to activate a playlist
/** @brief Get entered new-playlist details
* @param namep Where to store entered name (or NULL)
* @param fullnamep Where to store computed full name (or NULL)
- * @param sharep Where to store 'shared' flag (or NULL)
+ * @param sharedp Where to store 'shared' flag (or NULL)
* @param publicp Where to store 'public' flag (or NULL)
* @param privatep Where to store 'private' flag (or NULL)
*/
if(privatep) *privatep = private;
if(namep) *namep = name;
if(fullnamep) {
- if(*sharedp) *fullnamep = *namep;
+ if(shared) *fullnamep = name;
else byte_xasprintf(fullnamep, "%s.%s", config->username, name);
}
}
}
/** @brief Update a section in the picker tree model
- * @param section Section name
+ * @param title Display name of section
+ * @param key Key to search for
* @param start First entry in @ref playlists
* @param end Past last entry in @ref playlists
*/
* @param title Display name of section
* @param key Key to search for
* @param iter Iterator to point at key
- * @param create If TRUE, key will be created if it doesn't exist
- * @param compare Row comparison function
+ * @param create Whether to create the row
* @return TRUE if key exists else FALSE
*
* If the @p key exists then @p iter will point to it and TRUE will be
GTK_STOCK_ADD,
playlist_picker_add,
"Create a new playlist",
- 0
+ 0,
+ NULL,
},
{
GTK_STOCK_REMOVE,
playlist_picker_delete,
"Delete a playlist",
- 0
+ 0,
+ NULL,
},
};
#define NPLAYLIST_PICKER_BUTTONS (sizeof playlist_picker_buttons / sizeof *playlist_picker_buttons)
static struct menuitem playlist_picker_menuitems[] = {
{
"Select playlist",
+ NULL,
playlist_picker_select_activate,
playlist_picker_select_sensitive,
0,
},
{
"Play playlist",
+ GTK_STOCK_MEDIA_PLAY,
playlist_picker_play_activate,
playlist_picker_play_sensitive,
0,
},
{
"Remove playlist",
+ GTK_STOCK_DELETE,
playlist_picker_remove_activate,
playlist_picker_remove_sensitive,
0,
static GtkWidget *playlist_editor_private;
static int playlist_editor_setting_buttons;
+/** @brief Buttons for the playlist window */
+static struct button playlist_editor_buttons[] = {
+ {
+ GTK_STOCK_OK,
+ playlist_editor_ok,
+ "Close window",
+ 0,
+ gtk_box_pack_end,
+ },
+ {
+ GTK_STOCK_HELP,
+ playlist_editor_help,
+ "Go to manual",
+ 0,
+ gtk_box_pack_end,
+ },
+};
+
+#define NPLAYLIST_EDITOR_BUTTONS (int)(sizeof playlist_editor_buttons / sizeof *playlist_editor_buttons)
+
static GtkWidget *playlists_editor_create(void) {
assert(ql_playlist.view == NULL); /* better not be set up already */
gtk_box_pack_start(GTK_BOX(hbox), playlist_editor_private,
FALSE/*expand*/, FALSE/*fill*/, 0);
playlist_editor_set_buttons(0,0,0);
+ create_buttons_box(playlist_editor_buttons,
+ NPLAYLIST_EDITOR_BUTTONS,
+ hbox);
GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), init_queuelike(&ql_playlist),
+ GtkWidget *view = init_queuelike(&ql_playlist);
+ gtk_box_pack_start(GTK_BOX(vbox), view,
TRUE/*expand*/, TRUE/*fill*/, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox,
FALSE/*expand*/, FALSE/*fill*/, 0);
+ g_signal_connect(view, "key-press-event",
+ G_CALLBACK(playlist_editor_keypress), 0);
return vbox;
}
+static gboolean playlist_editor_keypress(GtkWidget attribute((unused)) *widget,
+ GdkEventKey *event,
+ gpointer attribute((unused)) user_data) {
+ if(event->state)
+ return FALSE;
+ switch(event->keyval) {
+ case GDK_BackSpace:
+ case GDK_Delete:
+ playlist_remove_activate(NULL, NULL);
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
/** @brief Called when the public/private buttons are set */
static void playlist_editor_button_toggled(GtkToggleButton *tb,
gpointer userdata) {
ql_new_queue(&ql_playlist, newq);
}
+static void playlist_editor_ok(GtkButton attribute((unused)) *button,
+ gpointer attribute((unused)) userdata) {
+ gtk_widget_destroy(playlist_window);
+}
+
+static void playlist_editor_help(GtkButton attribute((unused)) *button,
+ gpointer attribute((unused)) userdata) {
+ popup_help("playlists.html");
+}
+
/* Playlist mutation -------------------------------------------------------- */
/** @brief State structure for guarded playlist modification