summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-12-20 20:16:55 +0100
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-12-20 20:16:55 +0100
commitca1f890764c5dbac509940530e74971e8351a02b (patch)
tree8e791a724bf15c0a5eb98b3561de739b41f7691c
parent247316a2d2625302f9d8c319d0f256f7a9ccdc87 (diff)
WIP playqueue in gtkui
-rw-r--r--deadbeef.h6
-rw-r--r--playlist.c46
-rw-r--r--playlist.h3
-rw-r--r--plugins.c5
-rw-r--r--plugins/gtkui/callbacks.c142
-rw-r--r--plugins/gtkui/callbacks.h17
-rw-r--r--plugins/gtkui/gtkplaylist.c2
7 files changed, 217 insertions, 4 deletions
diff --git a/deadbeef.h b/deadbeef.h
index 90fcd1f8..488c357c 100644
--- a/deadbeef.h
+++ b/deadbeef.h
@@ -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);
diff --git a/playlist.c b/playlist.c
index 934132c3..278a4335 100644
--- a/playlist.c
+++ b/playlist.c
@@ -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;
+}
diff --git a/playlist.h b/playlist.h
index c24392ea..14e6aed7 100644
--- a/playlist.h
+++ b/playlist.h
@@ -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
diff --git a/plugins.c b/plugins.c
index 69528b80..05135369 100644
--- a/plugins.c
+++ b/plugins.c
@@ -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;