summaryrefslogtreecommitdiff
path: root/window_main.c
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2009-12-23 17:10:39 +0100
committerJon Bergli Heier <snakebite@jvnv.net>2009-12-23 17:10:39 +0100
commit1f0ef0bc2e7d0b99feb05e57f1c15a5a739c48fa (patch)
treed9000823af75d35d8c0b7a18d51b250c4c674b28 /window_main.c
parenta539fdf38688cbed984d9db1f08deaaf34eaf9e0 (diff)
Reworked the main window.
Images are now placed in their own icon view. Folders are selected in the above tree view, while the icon view displays thumbnails of the images in the selected folder. The thumbnails are cached using the thumbnail specification (~/.thumbnails/).
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"));