#include "previewwidget.h" G_DEFINE_TYPE(PreviewWidget, PreviewWidget, GTK_TYPE_BIN) // widget = PreviewWidget // data = KonaImage void PreviewWidget_download_clicked( GtkWidget *widget, KonaImage* ki ) { kona_image_meta *meta; meta = kona_image_get_meta_from_konaimage(ki); printf("DOWNLOAD %s!\n", meta->image_url); fflush(stdout); } void PreviewWidget_image_clicked( GtkWidget *widget, gint event, KonaImage* ki ) { kona_image_meta *meta; meta = kona_image_get_meta_from_konaimage(ki); printf("IMAGE CLICKED: %d\n", meta->id); fflush(stdout); } void PreviewWidget_set_image(PreviewWidget *widget, gchar *url) { int height, width; float iheight, iwidth; GdkPixbuf *p, *ps; p = gdk_pixbuf_new_from_file(url, NULL); iheight = (float) gdk_pixbuf_get_height(p); iwidth = (float) gdk_pixbuf_get_width(p); if (gdk_pixbuf_get_width(p) < gdk_pixbuf_get_height(p)) { height = 150; width = iwidth / iheight * 150; } else { width = 200; height = iheight / iwidth * 200; } ps = gdk_pixbuf_scale_simple(p, width, height, GDK_INTERP_BILINEAR); g_object_unref(p); gtk_image_set_from_pixbuf(GTK_IMAGE(widget->image), ps); gtk_widget_set_visible(widget->image, TRUE); gtk_widget_set_visible(widget->spinner, FALSE); } enum { PROP_KI=1, PROP_COUNT }; static GParamSpec *properties [PROP_COUNT]; static void preview_widget_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { PreviewWidget *self = (PreviewWidget*)object; switch (prop_id) { case PROP_KI: g_value_set_pointer(value, self->ki); break; default: break; } } static void preview_widget_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { PreviewWidget *self = (PreviewWidget*)object; switch (prop_id) { case PROP_KI: self->ki = g_value_get_pointer(value); break; default: break; } } void PreviewWidget_class_init(PreviewWidgetClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); object_class->set_property = preview_widget_set_property; object_class->get_property = preview_widget_get_property; properties [PROP_KI] = g_param_spec_pointer("ki", "ki", "Pointer to corresponding KonaImage struct", G_PARAM_READWRITE); g_object_class_install_properties(object_class, PROP_COUNT, properties); } void PreviewWidget_init(PreviewWidget *klass) { GtkWidget *widget; GtkBuilder *builder; builder = gtk_builder_new(); gtk_builder_add_from_file(builder, "glade/previewWidget.glade", NULL); widget = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(builder), "previewWidget")); gtk_builder_connect_signals(builder, NULL); gtk_container_add(GTK_CONTAINER(klass), widget); klass->evBox = GTK_WIDGET(gtk_builder_get_object(builder, "evBox"));; gtk_widget_set_events (GTK_WIDGET(klass->evBox), GDK_DOUBLE_BUTTON_PRESS); // TODO: Does not work klass->image = GTK_WIDGET(gtk_builder_get_object(builder, "image")); klass->button = GTK_WIDGET(gtk_builder_get_object(builder, "button")); klass->spinner = GTK_WIDGET(gtk_builder_get_object(builder, "spinner")); //gdk_window_set_cursor(gtk_widget_get_window(klass->evBox), GDK_HAND1); // TODO: Does not work g_object_unref(G_OBJECT(builder)); } GtkWidget *PreviewWidget_new(KonaImage* ki) { PreviewWidget* w = g_object_new (TYPE_PREVIEWWIDGET, "ki", ki, NULL); // Connect KonaImage callbacks g_signal_connect_swapped(ki, "notify::previewFile", (GCallback)previewImage_update_preview_from_konaImage, w); g_signal_connect_swapped(ki, "notify::meta", (GCallback)previewImage_update_meta_from_konaImage, w); // Connect UI handlers g_signal_connect(w->button, "clicked", (GCallback)PreviewWidget_download_clicked, ki); g_signal_connect(w->evBox, "button_press_event", (GCallback)PreviewWidget_image_clicked, ki); // TODO: Click event foo here return GTK_WIDGET(w); } // TODO: DESTROY etc. void debugfoo(GtkButton *widget, GtkImage *img) { gtk_image_clear(img); gtk_widget_destroy(GTK_WIDGET(img)); } /* ------------------------ * * CALLBACKS FROM KONAIMAGE * * ------------------------ */ void previewImage_update_preview_from_konaImage(PreviewWidget *pv, guint propId, KonaImage *ki) { GValue val = G_VALUE_INIT; g_value_init(&val, G_TYPE_STRING); g_object_get_property(G_OBJECT(ki), "previewFile", &val); PreviewWidget_set_image(pv, (gchar*) g_value_get_string(&val)); } void previewImage_update_meta_from_konaImage(PreviewWidget *pv, guint propId, KonaImage *ki) { kona_image_meta *meta; gchar* text; meta = kona_image_get_meta_from_konaimage(ki); text = g_strdup_printf("Download @ %dx%d", meta->width, meta->height); gtk_button_set_label(GTK_BUTTON(pv->button), text); g_free(text); fflush(stdout); }