diff options
Diffstat (limited to 'window_main.c')
-rw-r--r-- | window_main.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/window_main.c b/window_main.c index bca438a..57c8885 100644 --- a/window_main.c +++ b/window_main.c @@ -1,10 +1,18 @@ #include <string.h> +#include <gdk-pixbuf/gdk-pixbuf.h> + #include "window_main.h" #include "walls_ui.h" #include "db.h" #include "walls_model.h" +GdkPixbuf *pixbuf = NULL; + +GtkImage *image = NULL; + +void on_filetree_selection_changed(GtkTreeSelection *treeselection, gpointer user_data); + inline static void filetree_create_model(GtkTreeView *filetree) { GtkTreeModel *tree_model; @@ -15,6 +23,7 @@ inline static void filetree_create_model(GtkTreeView *filetree) { inline static void filetree_init(GtkTreeView *filetree) { GtkTreeViewColumn *col1, *col2, *col3, *col4; GtkCellRenderer *renderer; + GtkTreeSelection *selection; col1 = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col1, "Name"); @@ -49,6 +58,68 @@ inline static void filetree_init(GtkTreeView *filetree) { gtk_tree_view_column_add_attribute(col4, renderer, "text", 3); filetree_create_model(filetree); + + selection = gtk_tree_view_get_selection(filetree); + g_signal_connect(selection, "changed", G_CALLBACK(on_filetree_selection_changed), filetree); +} + +static void load_pixbuf(struct wallpaper_t *wall) { + GdkPixbuf *pb, *pb2; + GError *error = NULL; + GdkWindow *window; + gint win_width, win_height, img_width, img_height, width, height; + gdouble scalex, scaley, width_ratio, height_ratio, max_ratio; + + pb = gdk_pixbuf_new_from_file(wall->filepath, &error); + if(!pb) { + g_warning("%s", error->message); + g_free(error); + return; + } + + window = gtk_widget_get_window(GTK_WIDGET(image)); + gdk_drawable_get_size(window, &win_width, &win_height); + img_width = gdk_pixbuf_get_width(pb); + img_height = gdk_pixbuf_get_height(pb); + + /* do we need to resize? */ + if(img_width > win_width || img_height > win_height) { + /* resize by width */ + width_ratio = (gdouble)img_width / (gdouble)win_width; + height_ratio = (gdouble)img_height / (gdouble)win_height; + if(width_ratio > height_ratio) { + width = win_width; + height = (gint)(1.0 / width_ratio * img_height); + scalex = (gdouble)width / (gdouble)img_width; + scaley = (gdouble)height / (gdouble)img_height; + } else { /* resize by height */ + height = win_height; + width = (gint)(1.0 / height_ratio * img_width); + scalex = (gdouble)width / (gdouble)img_width; + scaley = (gdouble)height / (gdouble)img_height; + } + pb2 = pb; + pb = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); + gdk_pixbuf_scale(pb2, pb, 0, 0, width, height, 0, 0, scalex, scaley, GDK_INTERP_BILINEAR); + gdk_pixbuf_unref(pb2); + } + + //gtk_image_set_from_file(image, wall->filepath); + gtk_image_set_from_pixbuf(image, pb); + gdk_pixbuf_unref(pb); +} + +void on_filetree_selection_changed(GtkTreeSelection *treeselection, gpointer user_data) { + GtkTreeModel *model; + GtkTreeIter iter; + struct wallpaper_t *wall; + + if(gtk_tree_selection_get_selected(treeselection, &model, &iter)) { + if(walls_model_get_record_type(model, &iter) == WALLS_MODEL_TYPE_WALL) { + walls_model_get_wall_record(model, &iter, &wall); + load_pixbuf(wall); + } + } } int gui_main(int argc, char **argv) { @@ -75,6 +146,8 @@ int gui_main(int argc, char **argv) { filetree = GTK_WIDGET(gtk_builder_get_object(builder, "filetree")); filetree_init(GTK_TREE_VIEW(filetree)); + image = GTK_IMAGE(gtk_builder_get_object(builder, "image")); + gtk_builder_connect_signals(builder, NULL); g_object_unref(G_OBJECT(builder)); |