diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2009-12-20 20:16:55 +0100 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2009-12-20 20:16:55 +0100 |
commit | ca1f890764c5dbac509940530e74971e8351a02b (patch) | |
tree | 8e791a724bf15c0a5eb98b3561de739b41f7691c | |
parent | 247316a2d2625302f9d8c319d0f256f7a9ccdc87 (diff) |
WIP playqueue in gtkui
-rw-r--r-- | deadbeef.h | 6 | ||||
-rw-r--r-- | playlist.c | 46 | ||||
-rw-r--r-- | playlist.h | 3 | ||||
-rw-r--r-- | plugins.c | 5 | ||||
-rw-r--r-- | plugins/gtkui/callbacks.c | 142 | ||||
-rw-r--r-- | plugins/gtkui/callbacks.h | 17 | ||||
-rw-r--r-- | plugins/gtkui/gtkplaylist.c | 2 |
7 files changed, 217 insertions, 4 deletions
@@ -318,6 +318,12 @@ typedef struct { void (*pl_set_item_duration) (DB_playItem_t *it, float duration); float (*pl_get_item_duration) (DB_playItem_t *it); void (*pl_sort) (int iter, int id, const char *format, int ascending); + // playqueue support + int (*pl_playqueue_push) (DB_playItem_t *it); + void (*pl_playqueue_clear) (void); + void (*pl_playqueue_pop) (void); + void (*pl_playqueue_remove) (DB_playItem_t *it); + int (*pl_playqueue_test) (DB_playItem_t *it); // cuesheet support DB_playItem_t *(*pl_insert_cue_from_buffer) (DB_playItem_t *after, const char *fname, const uint8_t *buffer, int buffersize, struct DB_decoder_s *decoder, const char *ftype, int numsamples, int samplerate); DB_playItem_t * (*pl_insert_cue) (DB_playItem_t *after, const char *filename, struct DB_decoder_s *decoder, const char *ftype, int numsamples, int samplerate); @@ -1560,11 +1560,42 @@ pl_get_item_duration (playItem_t *it) { } int +pl_format_item_queue (playItem_t *it, char *s, int size) { + int init = 1; + int initsize = size; + int len; + for (int i = 0; i < playqueue_count; i++) { + if (size <= 0) { + break; + } + if (playqueue[i] == it) { + len; + if (init) { + init = 0; + s[0] = '('; + s++; + size--; + len = snprintf (s, size, "%d", i+1); + } + else { + len = snprintf (s, size, ",%d", i+1); + } + s += len; + size -= len; + } + } + if (size != initsize && size > 0) { + len = snprintf (s, size, ")"); + s += len; + size -= len; + } + return initsize-size; +} + +int pl_format_title (playItem_t *it, char *s, int size, int id, const char *fmt) { if (id != -1) { char dur[50]; - //pl_format_title (it, dur, sizeof (dur), "%l"); - //char dur[50]; if (it->_duration >= 0) { int hourdur = it->_duration / (60 * 60); int mindur = (it->_duration - hourdur * 60 * 60) / 60; @@ -1601,6 +1632,8 @@ pl_format_title (playItem_t *it, char *s, int size, int id, const char *fmt) { snprintf (artistalbum, sizeof (artistalbum), "%s - %s", artist, album); const char *text = NULL; switch (id) { + case DB_COLUMN_PLAYING: + return pl_format_item_queue (it, s, size); case DB_COLUMN_ARTIST_ALBUM: text = artistalbum; break; @@ -1969,3 +2002,12 @@ pl_playqueue_remove (playItem_t *it) { } } } +int +pl_playqueue_test (playItem_t *it) { + for (int i = 0; i < playqueue_count; i++) { + if (playqueue[i] == it) { + return i; + } + } + return -1; +} @@ -224,4 +224,7 @@ pl_playqueue_pop (void); void pl_playqueue_remove (playItem_t *it); +int +pl_playqueue_test (playItem_t *it); + #endif // __PLAYLIST_H @@ -128,6 +128,11 @@ static DB_functions_t deadbeef_api = { // cuesheet support .pl_insert_cue_from_buffer = (DB_playItem_t *(*) (DB_playItem_t *after, const char *fname, const uint8_t *buffer, int buffersize, struct DB_decoder_s *decoder, const char *ftype, int numsamples, int samplerate))pl_insert_cue_from_buffer, .pl_insert_cue = (DB_playItem_t *(*)(DB_playItem_t *, const char *, struct DB_decoder_s *, const char *ftype, int numsamples, int samplerate))pl_insert_cue, + .pl_playqueue_push = (int (*) (DB_playItem_t *))pl_playqueue_push, + .pl_playqueue_clear = pl_playqueue_clear, + .pl_playqueue_pop = pl_playqueue_pop, + .pl_playqueue_remove = (void (*) (DB_playItem_t *))pl_playqueue_remove, + .pl_playqueue_test = (int (*) (DB_playItem_t *))pl_playqueue_test, // volume control .volume_set_db = plug_volume_set_db, .volume_get_db = volume_get_db, diff --git a/plugins/gtkui/callbacks.c b/plugins/gtkui/callbacks.c index 1c4c36e7..02f604f5 100644 --- a/plugins/gtkui/callbacks.c +++ b/plugins/gtkui/callbacks.c @@ -39,6 +39,8 @@ #include "gtkui.h" #define SELECTED(it) (deadbeef->pl_is_selected(it)) +#define SELECT(it, sel) (deadbeef->pl_set_selected(it,sel)) +#define VSELECT(it, sel) {deadbeef->pl_set_selected(it,sel);gtk_pl_redraw_item_everywhere (it);} #define PL_NEXT(it, iter) (deadbeef->pl_get_next(it, iter)) extern GtkWidget *mainwin; @@ -185,6 +187,95 @@ on_playlist_button_press_event (GtkWidget *widget, if (event->button == 1) { gtkpl_mouse1_pressed (ps, event->state, event->x, event->y, event->time); } + else if (event->button == 3) { + // get item under cursor + int y = event->y / rowheight + ps->scrollpos; + if (y < 0 || y >= ps->get_count ()) { + y = -1; + } + DB_playItem_t *it = deadbeef->pl_get_for_idx_and_iter (y, ps->iterator); + if (!it) { + // clicked empty space -- deselect everything and show insensitive menu + it = deadbeef->pl_get_first (ps->iterator); + while (it) { + SELECT (it, 0); + it = PL_NEXT (it, ps->iterator); + } + playlist_refresh (); + // no menu + } + else { + if (!SELECTED (it)) { + // item is unselected -- reset selection and select this + DB_playItem_t *it2 = deadbeef->pl_get_first (ps->iterator); + while (it2) { + SELECT (it2, 0); + it2 = PL_NEXT (it2, ps->iterator); + } + SELECT (it, 1); + playlist_refresh (); + } + { + int inqueue = deadbeef->pl_playqueue_test (it); + GtkWidget *playlist_menu; + GtkWidget *add_to_playback_queue1; + GtkWidget *remove_from_playback_queue1; + GtkWidget *separator9; + GtkWidget *remove2; + GtkWidget *separator8; + GtkWidget *properties1; + + playlist_menu = gtk_menu_new (); + add_to_playback_queue1 = gtk_menu_item_new_with_mnemonic ("Add to playback queue"); + gtk_widget_show (add_to_playback_queue1); + gtk_container_add (GTK_CONTAINER (playlist_menu), add_to_playback_queue1); + gtk_object_set_data (GTK_OBJECT (add_to_playback_queue1), "ps", ps); + + remove_from_playback_queue1 = gtk_menu_item_new_with_mnemonic ("Remove from playback queue"); + if (inqueue == -1) { + gtk_widget_set_sensitive (remove_from_playback_queue1, FALSE); + } + gtk_widget_show (remove_from_playback_queue1); + gtk_container_add (GTK_CONTAINER (playlist_menu), remove_from_playback_queue1); + gtk_object_set_data (GTK_OBJECT (remove_from_playback_queue1), "ps", ps); + + separator9 = gtk_separator_menu_item_new (); + gtk_widget_show (separator9); + gtk_container_add (GTK_CONTAINER (playlist_menu), separator9); + gtk_widget_set_sensitive (separator9, FALSE); + + remove2 = gtk_menu_item_new_with_mnemonic ("Remove"); + gtk_widget_show (remove2); + gtk_container_add (GTK_CONTAINER (playlist_menu), remove2); + gtk_object_set_data (GTK_OBJECT (remove2), "ps", ps); + + separator8 = gtk_separator_menu_item_new (); + gtk_widget_show (separator8); + gtk_container_add (GTK_CONTAINER (playlist_menu), separator8); + gtk_widget_set_sensitive (separator8, FALSE); + + properties1 = gtk_menu_item_new_with_mnemonic ("Properties"); + gtk_widget_set_sensitive (properties1, FALSE); + gtk_widget_show (properties1); + gtk_container_add (GTK_CONTAINER (playlist_menu), properties1); + gtk_object_set_data (GTK_OBJECT (properties1), "ps", ps); + + g_signal_connect ((gpointer) add_to_playback_queue1, "activate", + G_CALLBACK (on_add_to_playback_queue1_activate), + NULL); + g_signal_connect ((gpointer) remove_from_playback_queue1, "activate", + G_CALLBACK (on_remove_from_playback_queue1_activate), + NULL); + g_signal_connect ((gpointer) remove2, "activate", + G_CALLBACK (on_remove2_activate), + NULL); + g_signal_connect ((gpointer) properties1, "activate", + G_CALLBACK (on_properties1_activate), + NULL); + gtk_menu_popup (GTK_MENU (playlist_menu), NULL, NULL, NULL, widget, 0, gtk_get_current_event_time()); + } + } + } return FALSE; } @@ -755,7 +846,6 @@ on_playlist_load_activate (GtkMenuItem *menuitem, gtk_widget_destroy (dlg); if (fname) { int res = deadbeef->pl_load (fname); - printf ("load result: %d\n", res); g_free (fname); gtkplaylist_t *ps = &main_playlist; gtkpl_setup_scrollbar (ps); @@ -2122,3 +2212,53 @@ on_stop_after_current_activate (GtkMenuItem *menuitem, deadbeef->conf_set_int ("playlist.stop_after_current", gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem))); } + +void +on_add_to_playback_queue1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + GtkWidget *widget = GTK_WIDGET (menuitem); + GTKPL_PROLOGUE; + DB_playItem_t *it = deadbeef->pl_get_first (ps->iterator); + while (it) { + if (SELECTED (it)) { + deadbeef->pl_playqueue_push (it); + } + it = PL_NEXT (it, ps->iterator); + } + playlist_refresh (); +} + + +void +on_remove_from_playback_queue1_activate + (GtkMenuItem *menuitem, + gpointer user_data) +{ + GtkWidget *widget = GTK_WIDGET (menuitem); + GTKPL_PROLOGUE; + DB_playItem_t *it = deadbeef->pl_get_first (ps->iterator); + while (it) { + if (SELECTED (it)) { + deadbeef->pl_playqueue_remove (it); + } + it = PL_NEXT (it, ps->iterator); + } + playlist_refresh (); +} + + +void +on_remove2_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ +} + + +void +on_properties1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + diff --git a/plugins/gtkui/callbacks.h b/plugins/gtkui/callbacks.h index d7d2fd6a..a3b9b12b 100644 --- a/plugins/gtkui/callbacks.h +++ b/plugins/gtkui/callbacks.h @@ -725,3 +725,20 @@ on_stop_after_current1_activate (GtkMenuItem *menuitem, void on_stop_after_current_activate (GtkMenuItem *menuitem, gpointer user_data); + +void +on_add_to_playback_queue1_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_remove_from_playback_queue1_activate + (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_remove2_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_properties1_activate (GtkMenuItem *menuitem, + gpointer user_data); diff --git a/plugins/gtkui/gtkplaylist.c b/plugins/gtkui/gtkplaylist.c index f6add405..23629833 100644 --- a/plugins/gtkui/gtkplaylist.c +++ b/plugins/gtkui/gtkplaylist.c @@ -372,7 +372,7 @@ gtkpl_draw_pl_row (gtkplaylist_t *ps, int row, DB_playItem_t *it) { int x = -ps->hscrollpos; gtkpl_column_t *c; for (c = ps->columns; c; c = c->next) { - if (it == deadbeef->pl_getcurrent () && c->id == DB_COLUMN_PLAYING/* && !p_isstopped ()*/) { + if (it == deadbeef->pl_getcurrent () && c->id == DB_COLUMN_PLAYING) { int paused = deadbeef->get_output ()->state () == OUTPUT_STATE_PAUSED; int buffering = !deadbeef->streamer_ok_to_read (-1); uintptr_t pixbuf; |