#include #include #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; tree_model = GTK_TREE_MODEL(walls_model_new()); gtk_tree_view_set_model(filetree, GTK_TREE_MODEL(tree_model)); } 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"); gtk_tree_view_append_column(filetree, col1); col2 = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col2, "Size"); gtk_tree_view_append_column(filetree, col2); col3 = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col3, "Width"); gtk_tree_view_append_column(filetree, col3); col4 = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col4, "Height"); gtk_tree_view_append_column(filetree, col4); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col1, renderer, TRUE); gtk_tree_view_column_add_attribute(col1, renderer, "text", 0); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col2, renderer, TRUE); gtk_tree_view_column_add_attribute(col2, renderer, "text", 1); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col3, renderer, TRUE); gtk_tree_view_column_add_attribute(col3, renderer, "text", 2); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col4, renderer, TRUE); 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) { GtkWidget *window; GtkWidget *filetree; GtkBuilder *builder ; GError *error = NULL; if(!db_open()) return 1; gtk_init(&argc, &argv); builder = gtk_builder_new(); if(!gtk_builder_add_from_string(builder, ui_string, -1, &error)) { g_warning("%s", error->message); g_free(error); return 1; } window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); gtk_window_set_title(GTK_WINDOW(window), "walls"); 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)); gtk_widget_show_all(window); gtk_main(); db_close(); return 0; }