Cleanup.
[jamendo] / src / track_listview.c
1 /*
2  * track_listview.c
3  *
4  *  Created on: 2009-10-22
5  *      Author: marcin
6  */
7
8 #include <hildon/hildon.h>
9 #include "track_listview.h"
10 #include "data_structs.h"
11 #include "jamendo_api.h"
12 #include "player.h"
13
14
15 /****************************************************************************
16  *
17  */
18
19 enum {
20         COLUMN_NAME, COLUMN_DURATION, COLUMN_RATING, COLUMN_TRACK_PTR, NUM_COLUMNS
21 };
22
23 /****************************************************************************
24  *
25  */
26 static void track_row_tapped(GtkTreeView* treeview, GtkTreePath* path, gpointer data) {
27         GtkTreeModel *model;
28         GtkTreeIter iter;
29         Track* track = NULL;
30
31         model = gtk_tree_view_get_model(treeview);
32         if (gtk_tree_model_get_iter(model, &iter, path)) {
33                 gtk_tree_model_get(model,&iter,COLUMN_TRACK_PTR,&track,-1);
34         }
35
36         play_track(track);
37 }
38
39 /*****************************************************************************
40  *
41  */
42 GtkTreeModel* track_listview_create_model(GList* track_list, gint flags) {
43         GtkListStore *store;
44         GtkTreeIter iter;
45
46         GList* track_iter;
47         gchar* stars[]={"","*","**","***","****","*****"};
48
49         store = gtk_list_store_new(NUM_COLUMNS,  G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
50
51         if (!track_list)
52                 return GTK_TREE_MODEL(store);
53
54         for (track_iter = g_list_first(track_list); track_iter; track_iter = track_iter->next) {
55                 Track* track = (Track*) track_iter->data;
56                 gchar* name;
57                 gchar* duration = g_strdup_printf("%02d:%02d",track->duration/60,track->duration%60);
58                 gchar* rating =  g_strdup_printf("<span color='orange' size='medium' weight='bold'>%s</span>", stars[(int)(track->rating * 5.0 + 0.5)]);
59                 if (flags & TRACK_LISTVIEW_ARTIST) {
60                         name = g_strdup_printf("%s - %s", track->artist_name, track->name);
61                 } else {
62                         name = g_strdup_printf("%s", track->name);
63                 }
64                 gtk_list_store_append(store, &iter);
65                 gtk_list_store_set(store, &iter,
66                                 COLUMN_NAME, name,
67                                 COLUMN_DURATION, duration,
68                                 COLUMN_RATING, rating,
69                                 COLUMN_TRACK_PTR, track,
70                                 -1);
71                 g_free(name);
72                 g_free(duration);
73                 g_free(rating);
74         }
75
76         return GTK_TREE_MODEL( store );
77 }
78
79 static void track_listview_add_columns(GtkTreeView *treeview) {
80         GtkCellRenderer *renderer;
81         GtkTreeViewColumn *column;
82
83         renderer = gtk_cell_renderer_text_new();
84         column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", COLUMN_NAME, NULL);
85         gtk_tree_view_column_set_expand(column,TRUE);
86         gtk_tree_view_column_set_sizing(column,GTK_TREE_VIEW_COLUMN_FIXED);
87         gtk_tree_view_append_column(treeview, column);
88
89         renderer = gtk_cell_renderer_text_new();
90         column = gtk_tree_view_column_new_with_attributes("Duration", renderer, "text", COLUMN_DURATION, NULL);
91         // TODO: width should be calculated runtime
92         gtk_tree_view_column_set_fixed_width(column,70);
93         gtk_tree_view_append_column(treeview, column);
94
95         renderer = gtk_cell_renderer_text_new();
96         column = gtk_tree_view_column_new_with_attributes("Rating", renderer, "markup", COLUMN_RATING, NULL);
97         // TODO: width should be calculated runtime
98         gtk_tree_view_column_set_fixed_width(column,60);
99         gtk_tree_view_append_column(treeview, column);
100 }
101
102 GtkWidget* track_listview_create(GList* track_list, gint flags) {
103         GtkWidget* treeview;
104         GtkTreeModel* model;
105
106         if(track_list) {
107                 model = track_listview_create_model(track_list, flags);
108                 treeview = gtk_tree_view_new_with_model(model);
109                 g_object_unref(model);
110         }
111         else {
112                 treeview = gtk_tree_view_new();
113         }
114
115         gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), GTK_SELECTION_NONE);
116         track_listview_add_columns(GTK_TREE_VIEW(treeview));
117
118         g_signal_connect(treeview, "hildon-row-tapped", G_CALLBACK(track_row_tapped), NULL);
119
120         return treeview;
121 }