168 lines
4.9 KiB
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);
|
|
}
|