Add custom renderer
[projects/chimara/chimara.git] / player / browser.c
1 /*
2  * Copyright (C) 2008, 2009, 2010, 2011 Philip Chimento and Marijn van Vliet.
3  * All rights reserved.
4  *
5  * Chimara is free software copyrighted by Philip Chimento and Marijn van Vliet.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  *    this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright notice,
13  *    this list of conditions and the following disclaimer in the documentation
14  *    and/or other materials provided with the distribution.
15  * 3. Neither of the names Philip Chimento or Marijn van Vliet, nor the name of
16  *    any other contributor may be used to endorse or promote products derived
17  *    from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #include <glib-object.h>
33 #include <glib/gi18n.h>
34 #include <gtk/gtk.h>
35 #include <gdk-pixbuf/gdk-pixbuf.h>
36 #include "browser.h"
37 #include "app.h"
38 #include "util.h"
39
40 typedef struct _ChimaraBrowserPrivate {
41         GtkActionGroup *action_group;
42         GtkListStore *library_model;
43 } ChimaraBrowserPrivate;
44
45 #define CHIMARA_BROWSER_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), CHIMARA_TYPE_BROWSER, ChimaraBrowserPrivate))
46 #define CHIMARA_BROWSER_USE_PRIVATE ChimaraBrowserPrivate *priv = CHIMARA_BROWSER_PRIVATE(self)
47
48 G_DEFINE_TYPE(ChimaraBrowser, chimara_browser, GTK_TYPE_WINDOW);
49
50 /* CALLBACKS */
51
52 static gboolean
53 on_browser_delete_event(GtkWidget *browser, GdkEvent *event)
54 {
55         gtk_main_quit();
56         return TRUE;
57 }
58
59 /* TYPE SYSTEM */
60
61 static void
62 chimara_browser_finalize(GObject *self)
63 {
64         CHIMARA_BROWSER_USE_PRIVATE;
65         g_object_unref(priv->action_group);
66         g_object_unref(priv->library_model);
67
68         /* Chain up */
69         G_OBJECT_CLASS(chimara_browser_parent_class)->finalize(self);
70 }
71
72 static void
73 chimara_browser_class_init(ChimaraBrowserClass *klass)
74 {
75         /* Override methods of parent classes */
76         GObjectClass *object_class = G_OBJECT_CLASS(klass);
77         object_class->finalize = chimara_browser_finalize;
78
79         /* Private data */
80         g_type_class_add_private(klass, sizeof(ChimaraBrowserPrivate));
81 }
82
83 static void
84 text_function(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
85 {
86         char *title, *author, *rendered_string;
87         unsigned year;
88         gtk_tree_model_get(model, iter,
89                 1, &title,
90                 2, &author,
91                 3, &year,
92                 -1);
93         rendered_string = g_strdup_printf("<big><big><b><i>%s</i></b></big>\nby %s</big> (%d)", title, author, year);
94         g_object_set(cell, "markup", rendered_string, NULL);
95 }
96
97 static void
98 chimara_browser_init(ChimaraBrowser *self)
99 {
100         CHIMARA_BROWSER_USE_PRIVATE;
101         ChimaraApp *theapp = chimara_app_get();
102
103         /* Set own properties */
104         g_object_set(self,
105                 "title", _("Chimara"),
106                 NULL);
107
108         /* Build user interface */
109         char *object_ids[] = {
110                 "browser_group",
111                 "browser-box",
112                 "library-model",
113                 NULL
114         };
115         GtkBuilder *builder = new_builder_with_objects(object_ids);
116
117         priv->action_group = GTK_ACTION_GROUP(load_object(builder, "browser_group"));
118         g_object_ref(priv->action_group);
119
120         GtkUIManager *uimanager = new_ui_manager("browser.menus");
121
122         gtk_ui_manager_insert_action_group(uimanager, priv->action_group, 0);
123         gtk_ui_manager_insert_action_group(uimanager, chimara_app_get_action_group(theapp), 1);
124         GtkWidget *menubar = gtk_ui_manager_get_widget(uimanager, "/browser_menu");
125         GtkWidget *toolbar = gtk_ui_manager_get_widget(uimanager, "/browser_toolbar");
126         GtkWidget *vbox = GTK_WIDGET(load_object(builder, "browser-box"));
127         gtk_container_add(GTK_CONTAINER(self), vbox);
128         gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
129         gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
130
131         priv->library_model = GTK_LIST_STORE(load_object(builder, "library-model"));
132         g_object_ref(priv->library_model);
133
134         GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(load_object(builder, "library-text-column"));
135         GtkCellRenderer *renderer = GTK_CELL_RENDERER(load_object(builder, "library-text-renderer"));
136         gtk_tree_view_column_set_cell_data_func(column, renderer, (GtkTreeCellDataFunc)text_function, NULL, NULL);
137
138         /* Make up some fake library data */
139         GdkPixbuf *fake_cover_art = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, 120, 120);
140         gdk_pixbuf_fill(fake_cover_art, 0xA4000000);
141         GtkTreeIter iter;
142         gtk_list_store_append(priv->library_model, &iter);
143         gtk_list_store_set(priv->library_model, &iter,
144                 0, "IFID-02343-234213D-23423",
145             1, "The Great Nose Picker",
146             2, "Hank Berriman",
147             3, 2004,
148             4, fake_cover_art,
149             -1);
150         gdk_pixbuf_unref(fake_cover_art);
151
152         g_signal_connect(self, "delete-event", G_CALLBACK(on_browser_delete_event), NULL);
153
154         g_object_unref(uimanager);
155         g_object_unref(builder);
156 }
157
158 /* PUBLIC FUNCTIONS */
159
160 GtkWidget *
161 chimara_browser_new(void)
162 {
163         return GTK_WIDGET(g_object_new(CHIMARA_TYPE_BROWSER,
164                 "type", GTK_WINDOW_TOPLEVEL,
165                 NULL));
166 }
167
168 /* GLADE CALLBACKS */
169
170 void
171 action_add_file(GtkAction *action, ChimaraBrowser *browser)
172 {
173 }
174
175 void
176 action_add_watched_folder(GtkAction *action, ChimaraBrowser *browser)
177 {
178 }
179
180 void
181 action_remove_file(GtkAction *action, ChimaraBrowser *browser)
182 {
183 }
184
185 void
186 action_play(GtkAction *action, ChimaraBrowser *browser)
187 {
188 }
189
190 void
191 action_more_info(GtkAction *action, ChimaraBrowser *browser)
192 {
193 }