+/** @brief (Re-)populate the playlist tree model */
+static void playlists_fill(void) {
+ GtkTreeIter iter[1];
+
+ if(!playlists_list)
+ playlists_list = gtk_list_store_new(1, G_TYPE_STRING);
+ gtk_list_store_clear(playlists_list);
+ for(int n = 0; n < nplaylists; ++n)
+ gtk_list_store_insert_with_values(playlists_list, iter, n/*position*/,
+ 0, playlists[n], /* column 0 */
+ -1); /* no more cols */
+ // TODO reselect whatever was formerly selected if possible, if not then
+ // zap the contents view
+}
+
+/** @brief Called when the selection might have changed */
+static void playlists_selection_changed(GtkTreeSelection attribute((unused)) *treeselection,
+ gpointer attribute((unused)) user_data) {
+ GtkTreeIter iter;
+ char *gselected, *selected;
+
+ /* Identify the current selection */
+ if(gtk_tree_selection_get_selected(playlists_selection, 0, &iter)) {
+ gtk_tree_model_get(GTK_TREE_MODEL(playlists_list), &iter,
+ 0, &gselected, -1);
+ selected = xstrdup(gselected);
+ g_free(gselected);
+ } else
+ selected = 0;
+ /* Eliminate no-change cases */
+ if(!selected && !playlists_selected)
+ return;
+ if(selected && playlists_selected && !strcmp(selected, playlists_selected))
+ return;
+ /* There's been a change */
+ playlists_selected = selected;
+ if(playlists_selected) {
+ fprintf(stderr, "playlists selection changed\n'"); /* TODO */
+ gtk_widget_set_sensitive(playlists_delete_button, 1);
+ } else
+ gtk_widget_set_sensitive(playlists_delete_button, 0);
+}
+
+/** @brief Called when the 'add' button is pressed */
+static void playlists_add(GtkButton attribute((unused)) *button,
+ gpointer attribute((unused)) userdata) {
+ /* Unselect whatever is selected */
+ gtk_tree_selection_unselect_all(playlists_selection);
+ fprintf(stderr, "playlists_add\n");/* TODO */
+}
+
+/** @brief Called when the 'Delete' button is pressed */
+static void playlists_delete(GtkButton attribute((unused)) *button,
+ gpointer attribute((unused)) userdata) {
+ GtkWidget *yesno;
+ int res;
+
+ if(!playlists_selected)
+ return; /* shouldn't happen */
+ yesno = gtk_message_dialog_new(GTK_WINDOW(playlists_window),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_YES_NO,
+ "Do you really want to delete user %s?"
+ " This action cannot be undone.",
+ playlists_selected);
+ res = gtk_dialog_run(GTK_DIALOG(yesno));
+ gtk_widget_destroy(yesno);
+ if(res == GTK_RESPONSE_YES) {
+ disorder_eclient_playlist_delete(client,
+ NULL/*playlists_delete_completed*/,
+ playlists_selected,
+ NULL);
+ }
+}
+
+/** @brief Table of buttons below the playlist list */
+static struct button playlists_buttons[] = {
+ {
+ GTK_STOCK_ADD,
+ playlists_add,
+ "Create a new playlist",
+ 0
+ },
+ {
+ GTK_STOCK_REMOVE,
+ playlists_delete,
+ "Delete a playlist",
+ 0
+ },
+};
+#define NPLAYLISTS_BUTTONS (sizeof playlists_buttons / sizeof *playlists_buttons)
+
+/** @brief Keypress handler */
+static gboolean playlists_keypress(GtkWidget attribute((unused)) *widget,
+ GdkEventKey *event,
+ gpointer attribute((unused)) user_data) {
+ if(event->state)
+ return FALSE;
+ switch(event->keyval) {
+ case GDK_Escape:
+ gtk_widget_destroy(playlists_window);
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+void edit_playlists(gpointer attribute((unused)) callback_data,