Add custom renderer
[projects/chimara/chimara.git] / player / browser.c
index e7b9ccedaf99caee7cf677787af0dba1afa35c39..51dc6e7b33e0f1ce124644f543f9409c78e0f270 100644 (file)
 #include <glib-object.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
 #include "browser.h"
 #include "app.h"
 #include "util.h"
 
 typedef struct _ChimaraBrowserPrivate {
-       int dummy;
+       GtkActionGroup *action_group;
+       GtkListStore *library_model;
 } ChimaraBrowserPrivate;
 
 #define CHIMARA_BROWSER_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), CHIMARA_TYPE_BROWSER, ChimaraBrowserPrivate))
@@ -45,9 +47,24 @@ typedef struct _ChimaraBrowserPrivate {
 
 G_DEFINE_TYPE(ChimaraBrowser, chimara_browser, GTK_TYPE_WINDOW);
 
+/* CALLBACKS */
+
+static gboolean
+on_browser_delete_event(GtkWidget *browser, GdkEvent *event)
+{
+       gtk_main_quit();
+       return TRUE;
+}
+
+/* TYPE SYSTEM */
+
 static void
 chimara_browser_finalize(GObject *self)
 {
+       CHIMARA_BROWSER_USE_PRIVATE;
+       g_object_unref(priv->action_group);
+       g_object_unref(priv->library_model);
+
        /* Chain up */
        G_OBJECT_CLASS(chimara_browser_parent_class)->finalize(self);
 }
@@ -63,9 +80,24 @@ chimara_browser_class_init(ChimaraBrowserClass *klass)
        g_type_class_add_private(klass, sizeof(ChimaraBrowserPrivate));
 }
 
+static void
+text_function(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
+{
+       char *title, *author, *rendered_string;
+       unsigned year;
+       gtk_tree_model_get(model, iter,
+               1, &title,
+               2, &author,
+               3, &year,
+               -1);
+       rendered_string = g_strdup_printf("<big><big><b><i>%s</i></b></big>\nby %s</big> (%d)", title, author, year);
+       g_object_set(cell, "markup", rendered_string, NULL);
+}
+
 static void
 chimara_browser_init(ChimaraBrowser *self)
 {
+       CHIMARA_BROWSER_USE_PRIVATE;
        ChimaraApp *theapp = chimara_app_get();
 
        /* Set own properties */
@@ -73,14 +105,58 @@ chimara_browser_init(ChimaraBrowser *self)
                "title", _("Chimara"),
                NULL);
 
+       /* Build user interface */
+       char *object_ids[] = {
+               "browser_group",
+               "browser-box",
+               "library-model",
+               NULL
+       };
+       GtkBuilder *builder = new_builder_with_objects(object_ids);
+
+       priv->action_group = GTK_ACTION_GROUP(load_object(builder, "browser_group"));
+       g_object_ref(priv->action_group);
+
        GtkUIManager *uimanager = new_ui_manager("browser.menus");
 
-       gtk_ui_manager_insert_action_group(uimanager, chimara_app_get_action_group(theapp), 0);
+       gtk_ui_manager_insert_action_group(uimanager, priv->action_group, 0);
+       gtk_ui_manager_insert_action_group(uimanager, chimara_app_get_action_group(theapp), 1);
        GtkWidget *menubar = gtk_ui_manager_get_widget(uimanager, "/browser_menu");
-       gtk_container_add(GTK_CONTAINER(self), menubar);
+       GtkWidget *toolbar = gtk_ui_manager_get_widget(uimanager, "/browser_toolbar");
+       GtkWidget *vbox = GTK_WIDGET(load_object(builder, "browser-box"));
+       gtk_container_add(GTK_CONTAINER(self), vbox);
+       gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
+
+       priv->library_model = GTK_LIST_STORE(load_object(builder, "library-model"));
+       g_object_ref(priv->library_model);
+
+       GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(load_object(builder, "library-text-column"));
+       GtkCellRenderer *renderer = GTK_CELL_RENDERER(load_object(builder, "library-text-renderer"));
+       gtk_tree_view_column_set_cell_data_func(column, renderer, (GtkTreeCellDataFunc)text_function, NULL, NULL);
+
+       /* Make up some fake library data */
+       GdkPixbuf *fake_cover_art = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, 120, 120);
+       gdk_pixbuf_fill(fake_cover_art, 0xA4000000);
+       GtkTreeIter iter;
+       gtk_list_store_append(priv->library_model, &iter);
+       gtk_list_store_set(priv->library_model, &iter,
+               0, "IFID-02343-234213D-23423",
+           1, "The Great Nose Picker",
+           2, "Hank Berriman",
+           3, 2004,
+           4, fake_cover_art,
+           -1);
+       gdk_pixbuf_unref(fake_cover_art);
+
+       g_signal_connect(self, "delete-event", G_CALLBACK(on_browser_delete_event), NULL);
+
+       g_object_unref(uimanager);
+       g_object_unref(builder);
 }
 
 /* PUBLIC FUNCTIONS */
+
 GtkWidget *
 chimara_browser_new(void)
 {
@@ -89,3 +165,29 @@ chimara_browser_new(void)
                NULL));
 }
 
+/* GLADE CALLBACKS */
+
+void
+action_add_file(GtkAction *action, ChimaraBrowser *browser)
+{
+}
+
+void
+action_add_watched_folder(GtkAction *action, ChimaraBrowser *browser)
+{
+}
+
+void
+action_remove_file(GtkAction *action, ChimaraBrowser *browser)
+{
+}
+
+void
+action_play(GtkAction *action, ChimaraBrowser *browser)
+{
+}
+
+void
+action_more_info(GtkAction *action, ChimaraBrowser *browser)
+{
+}