summaryrefslogtreecommitdiff
path: root/window_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'window_main.c')
-rw-r--r--window_main.c73
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));