konaclient-gtk/konaclient-gtk/previewwidget.c

168 lines
4.9 KiB
C

#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);
}