From 0fb5e8f3c060e54ab596f4a901d3e6a2869041e9 Mon Sep 17 00:00:00 2001 Message-Id: <0fb5e8f3c060e54ab596f4a901d3e6a2869041e9.1715843547.git.mdw@distorted.org.uk> From: Mark Wooding Date: Fri, 13 Jun 2008 11:40:53 +0100 Subject: [PATCH] Infrastructure for marking the playing track in a different color; not currently enabled. Organization: Straylight/Edgeware From: Richard Kettlewell --- disobedience/queue-generic.c | 38 ++++++++++++++++++++++++++---------- disobedience/queue-generic.h | 18 +++++++++++++++++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/disobedience/queue-generic.c b/disobedience/queue-generic.c index cc6bf53..e32cf85 100644 --- a/disobedience/queue-generic.c +++ b/disobedience/queue-generic.c @@ -150,7 +150,7 @@ struct queue_entry *ql_iter_to_q(GtkTreeModel *model, struct queuelike *ql = g_object_get_data(G_OBJECT(model), "ql"); GValue v[1]; memset(v, 0, sizeof v); - gtk_tree_model_get_value(model, iter, ql->ncolumns, v); + gtk_tree_model_get_value(model, iter, ql->ncolumns + QUEUEPOINTER_COLUMN, v); assert(G_VALUE_TYPE(v) == G_TYPE_POINTER); struct queue_entry *const q = g_value_get_pointer(v); g_value_unset(v); @@ -183,8 +183,19 @@ void ql_update_row(struct queue_entry *q, col, ql->columns[col].value(q, ql->columns[col].data), -1); - /* The hidden extra column is the queue entry */ - gtk_list_store_set(ql->store, iter, ql->ncolumns, q, -1); + gtk_list_store_set(ql->store, iter, + ql->ncolumns + QUEUEPOINTER_COLUMN, q, + -1); + if(q == playing_track) + gtk_list_store_set(ql->store, iter, + ql->ncolumns + BACKGROUND_COLUMN, BG_PLAYING, + ql->ncolumns + FOREGROUND_COLUMN, FG_PLAYING, + -1); + else + gtk_list_store_set(ql->store, iter, + ql->ncolumns + BACKGROUND_COLUMN, (char *)0, + ql->ncolumns + FOREGROUND_COLUMN, (char *)0, + -1); } /** @brief Update the list store @@ -287,7 +298,9 @@ void ql_new_queue(struct queuelike *ql, const struct newqueue_data *nqd = hash_find(h, q->id); if(nqd->new) { /* Tell this row that it belongs to the new version of the queue */ - gtk_list_store_set(ql->store, iter, ql->ncolumns, nqd->new, -1); + gtk_list_store_set(ql->store, iter, + ql->ncolumns + QUEUEPOINTER_COLUMN, nqd->new, + -1); it = gtk_tree_model_iter_next(GTK_TREE_MODEL(ql->store), iter); ++kept; } else { @@ -322,7 +335,9 @@ void ql_new_queue(struct queuelike *ql, gtk_list_store_append(ql->store, iter); } else gtk_list_store_prepend(ql->store, iter); - gtk_list_store_set(ql->store, iter, ql->ncolumns, q, -1); + gtk_list_store_set(ql->store, iter, + ql->ncolumns + QUEUEPOINTER_COLUMN, q, + -1); //fprintf(stderr, " add %s", q->id); ++inserted; } @@ -388,12 +403,13 @@ void ql_new_queue(struct queuelike *ql, /** @brief Initialize a @ref queuelike */ GtkWidget *init_queuelike(struct queuelike *ql) { D(("init_queuelike")); - /* Create the list store. We add an extra column to hold the ID. */ - GType *types = xcalloc(ql->ncolumns + 1, sizeof (GType)); - for(int n = 0; n < ql->ncolumns; ++n) + /* Create the list store. We add an extra column to hold a pointer to the + * queue_entry. */ + GType *types = xcalloc(ql->ncolumns + EXTRA_COLUMNS, sizeof (GType)); + for(int n = 0; n < ql->ncolumns + EXTRA_COLUMNS; ++n) types[n] = G_TYPE_STRING; - types[ql->ncolumns] = G_TYPE_POINTER; - ql->store = gtk_list_store_newv(ql->ncolumns + 1, types); + types[ql->ncolumns + QUEUEPOINTER_COLUMN] = G_TYPE_POINTER; + ql->store = gtk_list_store_newv(ql->ncolumns + EXTRA_COLUMNS, types); g_object_set_data(G_OBJECT(ql->store), "ql", (void *)ql); /* Create the view */ @@ -411,6 +427,8 @@ GtkWidget *init_queuelike(struct queuelike *ql) { (ql->columns[n].name, r, "text", n, + "background", ql->ncolumns + BACKGROUND_COLUMN, + "foreground", ql->ncolumns + FOREGROUND_COLUMN, (char *)0); gtk_tree_view_column_set_resizable(c, TRUE); gtk_tree_view_column_set_reorderable(c, TRUE); diff --git a/disobedience/queue-generic.h b/disobedience/queue-generic.h index 8f5b59f..1888602 100644 --- a/disobedience/queue-generic.h +++ b/disobedience/queue-generic.h @@ -91,6 +91,24 @@ struct queuelike { struct tabtype tabtype; }; +enum { + QUEUEPOINTER_COLUMN, + FOREGROUND_COLUMN, + BACKGROUND_COLUMN, + + EXTRA_COLUMNS +}; + +/* TODO probably need to set "horizontal-separator" to 0, but can't find any + * coherent description of how to set style properties in isolation. */ +#define BG_PLAYING 0 +#define FG_PLAYING 0 + +#ifndef BG_PLAYING +# define BG_PLAYING "#e0ffe0" +# define FG_PLAYING "black" +#endif + extern struct queuelike ql_queue; extern struct queuelike ql_recent; extern struct queuelike ql_added; -- [mdw]