diff options
Diffstat (limited to 'window_main.c')
-rw-r--r-- | window_main.c | 131 |
1 files changed, 84 insertions, 47 deletions
diff --git a/window_main.c b/window_main.c index cfc24c6..e84144f 100644 --- a/window_main.c +++ b/window_main.c @@ -1,12 +1,16 @@ +//#include <unistd.h> #include <string.h> +#include <glib/gstdio.h> #include <gdk-pixbuf/gdk-pixbuf.h> #include "window_main.h" #include "walls_ui.h" #include "db.h" +#include "browse_model.h" #include "walls_model.h" #include "wallpapers.h" +#include "thumbnails.h" GdkPixbuf *orig_pixbuf = NULL; gint last_width = 0, @@ -16,59 +20,37 @@ gint last_width = 0, GtkImage *image = NULL; GtkWidget *layout = NULL; GtkStatusbar *statusbar; +GtkIconView *thumbview; -GThread *add_thread = NULL; +GThread *add_thread = NULL, + *thumb_thread = NULL; -void on_filetree_selection_changed(GtkTreeSelection *treeselection, gpointer user_data); +void on_foldtree_selection_changed(GtkTreeSelection *treeselection, gpointer user_data); -inline static void filetree_create_model(GtkTreeView *filetree) { +inline static void foldtree_create_model(GtkTreeView *foldtree) { GtkTreeModel *tree_model; - tree_model = GTK_TREE_MODEL(walls_model_new()); - gtk_tree_view_set_model(filetree, GTK_TREE_MODEL(tree_model)); + tree_model = GTK_TREE_MODEL(browse_model_new()); + gtk_tree_view_set_model(foldtree, GTK_TREE_MODEL(tree_model)); } -inline static void filetree_init(GtkTreeView *filetree) { - GtkTreeViewColumn *col1, *col2, *col3, *col4; +inline static void foldtree_init(GtkTreeView *foldtree) { + GtkTreeViewColumn *col1; 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); + gtk_tree_view_append_column(foldtree, col1); 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); + foldtree_create_model(foldtree); - selection = gtk_tree_view_get_selection(filetree); - g_signal_connect(selection, "changed", G_CALLBACK(on_filetree_selection_changed), filetree); + selection = gtk_tree_view_get_selection(foldtree); + g_signal_connect(selection, "changed", G_CALLBACK(on_foldtree_selection_changed), foldtree); } static void resize_pixbuf() { @@ -131,16 +113,14 @@ void on_window_hpane_resized(GObject *gobject, GParamSpec *pspec, gpointer user_ } } -static void load_pixbuf(struct wallpaper_t *wall) { +static void load_pixbuf(const gchar *filepath) { GdkPixbuf *pb; 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; if(orig_pixbuf) g_object_unref(orig_pixbuf); - orig_pixbuf = gdk_pixbuf_new_from_file(wall->filepath, &error); + orig_pixbuf = gdk_pixbuf_new_from_file(filepath, &error); if(!orig_pixbuf) { g_warning("%s", error->message); g_free(error); @@ -150,16 +130,70 @@ static void load_pixbuf(struct wallpaper_t *wall) { resize_pixbuf(); } -void on_filetree_selection_changed(GtkTreeSelection *treeselection, gpointer user_data) { +static void fill_wall_list(GtkListStore *liststore, GArray *array) { + GtkTreeIter iter; + + for(int i = 0; i < array->len; i++) { + struct wallpaper_t *wall; + wall = &g_array_index(array, struct wallpaper_t, i); + + gtk_list_store_append(liststore, &iter); + gtk_list_store_set(liststore, &iter, 0, NULL, 1, wall->filepath, -1); + g_free(wall->filepath); + } + g_array_free(array, TRUE); +} + +void on_foldtree_selection_changed(GtkTreeSelection *treeselection, gpointer user_data) { GtkTreeModel *model; GtkTreeIter iter; - struct wallpaper_t *wall; + struct directory_t *dir; + GArray *array; + GtkListStore *liststore; + GError *error = NULL; 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); + browse_model_get_dir_record(model, &iter, &dir); + + if(!db_get_wallpapers(dir->dirid, &array)) + return; + + liststore = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING); + fill_wall_list(liststore, array); + gtk_icon_view_set_model(thumbview, GTK_TREE_MODEL(liststore)); + + thumb_thread = g_thread_create(add_thumbs_thread, liststore, FALSE, &error); + + if(!thumb_thread) { + g_warning("%s", error->message); + g_free(error); + } + } +} + +void on_thumbview_selection_changed(GtkIconView *iconview, gpointer user_data) { + GList *list; + GValue value; + const gchar *filename; + GtkTreePath *path; + GtkTreeModel *model; + GtkTreeIter iter; + + list = gtk_icon_view_get_selected_items(iconview); + if(list) { + if(g_list_length(list) == 1) { + path = g_list_nth_data(list, 0); + model = gtk_icon_view_get_model(iconview); + gtk_tree_model_get_iter(model, &iter, path); + memset(&value, 0, sizeof(GValue)); + gtk_tree_model_get_value(model, &iter, 1, &value); + filename = g_value_get_string(&value); + load_pixbuf(filename); + g_value_unset(&value); } + + g_list_foreach(list, gtk_tree_path_free, NULL); + g_list_free(list); } } @@ -198,7 +232,7 @@ void on_add_dir_action_activate(GtkAction *action, gpointer user_data) { int gui_main(int argc, char **argv) { GtkWidget *window; - GtkWidget *filetree; + GtkWidget *foldtree; GtkWidget *window_hpane; GtkBuilder *builder ; GError *error = NULL; @@ -222,8 +256,11 @@ int gui_main(int argc, char **argv) { 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)); + foldtree = GTK_WIDGET(gtk_builder_get_object(builder, "foldtree")); + foldtree_init(GTK_TREE_VIEW(foldtree)); + + thumbview = GTK_ICON_VIEW(gtk_builder_get_object(builder, "thumbview")); + gtk_icon_view_set_pixbuf_column(thumbview, 0); image = GTK_IMAGE(gtk_builder_get_object(builder, "image")); layout = GTK_WIDGET(gtk_builder_get_object(builder, "layout")); |