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