X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/ad47bd4ceb35ce30440fb7ccc5a7d871375ea362..4265e5d362914f3732b4035dcf67162e525e0142:/disobedience/queue-generic.c diff --git a/disobedience/queue-generic.c b/disobedience/queue-generic.c index cc6bf53..aa29c28 100644 --- a/disobedience/queue-generic.c +++ b/disobedience/queue-generic.c @@ -2,23 +2,21 @@ * This file is part of DisOrder * Copyright (C) 2006-2008 Richard Kettlewell * - * This program is free software; you can redistribute it and/or modify + * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA + * along with this program. If not, see . */ /** @file disobedience/queue-generic.c - * @brief Queue widgets + * @brief Disobedience queue widgets * * This file provides contains code shared between all the queue-like * widgets - the queue, the recent list and the added tracks list. @@ -129,7 +127,9 @@ const char *column_length(const struct queue_entry *q, if(last_state & DISORDER_TRACK_PAUSED) l = playing_track->sofar; else { - time(&now); + if(!last_playing) + return NULL; + xtime(&now); l = playing_track->sofar + (now - last_playing); } byte_xasprintf(&played, "%ld:%02ld/%s", l / 60, l % 60, length); @@ -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); @@ -178,13 +178,27 @@ void ql_update_row(struct queue_entry *q, iter = my_iter; } /* Update all the columns */ - for(int col = 0; col < ql->ncolumns; ++col) + for(int col = 0; col < ql->ncolumns; ++col) { + const char *const v = ql->columns[col].value(q, + ql->columns[col].data); + if(v) + gtk_list_store_set(ql->store, iter, + col, v, + -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, - col, ql->columns[col].value(q, - ql->columns[col].data), + ql->ncolumns + BACKGROUND_COLUMN, (char *)0, + ql->ncolumns + FOREGROUND_COLUMN, (char *)0, -1); - /* The hidden extra column is the queue entry */ - gtk_list_store_set(ql->store, iter, ql->ncolumns, q, -1); } /** @brief Update the list store @@ -287,7 +301,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 { @@ -308,7 +324,6 @@ void ql_new_queue(struct queuelike *ql, for(struct queue_entry *q = newq; q; q = q->next) { const struct newqueue_data *nqd = hash_find(h, q->id); if(!nqd->old) { - GtkTreeIter iter[1]; if(after) { /* Try to insert at the right sort of place */ GtkTreeIter where[1]; @@ -322,7 +337,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 +405,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 +429,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);