diff src/view_file_list.c @ 132:661cd91e5a7e

First implementation of marks for all photos.
author bruclik
date Fri, 13 Jul 2007 14:03:08 +0000
parents 55166d93498d
children 71e1ebee420e
line wrap: on
line diff
--- a/src/view_file_list.c	Thu Jul 12 20:46:28 2007 +0000
+++ b/src/view_file_list.c	Fri Jul 13 14:03:08 2007 +0000
@@ -26,6 +26,7 @@
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_tree_edit.h"
+#include "typedefs.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
 
@@ -37,6 +38,7 @@
 	FILE_COLUMN_SIZE,
 	FILE_COLUMN_DATE,
 	FILE_COLUMN_COLOR,
+    FILE_COLUMN_MARKS,
 	FILE_COLUMN_COUNT
 };
 
@@ -526,13 +528,20 @@
 	GtkTreePath *tpath;
 	GtkTreeIter iter;
 	FileData *fd = NULL;
-
+    GtkTreeViewColumn *column;
+    gint colnum;
+    
 	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
-					  &tpath, NULL, NULL, NULL))
+					  &tpath, &column, NULL, NULL))
 		{
 		GtkTreeModel *store;
+        colnum = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(column), "column"));
+        
+        if (colnum <= FILE_COLUMN_MARKS - 2 + FILEDATA_MARKS_SIZE && colnum >= FILE_COLUMN_MARKS - 2)
+            return FALSE;
+        
+        store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
 
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
 		gtk_tree_model_get_iter(store, &iter, tpath);
 		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
 #if 0
@@ -827,7 +836,8 @@
 		{
 		FileData *fd;
 		gchar *size;
-
+        int i;
+        
 		fd = work->data;
 		size = text_from_size(fd->size);
 		gtk_list_store_append(store, &iter);
@@ -837,7 +847,10 @@
 						 FILE_COLUMN_SIZE, size,
 						 FILE_COLUMN_DATE, text_from_time(fd->date),
 						 FILE_COLUMN_COLOR, FALSE, -1);
-		g_free(size);
+        for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
+            gtk_list_store_set(store, &iter, FILE_COLUMN_MARKS + i, fd->marks[i], -1);
+            
+        g_free(size);
 
 		if (select_list && select_list->data == fd)
 			{
@@ -1313,7 +1326,7 @@
 	column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_COLUMN_THUMB - 1);
 	if (!column) return;
 
-	gtk_tree_view_column_set_fixed_width(column, (thumb) ? thumb_max_width : 4);
+	gtk_tree_view_column_set_fixed_width(column, (thumb) ? thumb_max_width : FILE_COLUMN_MARKS);
 
 	list = gtk_tree_view_column_get_cell_renderers(column);
 	if (!list) return;
@@ -1367,7 +1380,8 @@
 		while (!done)
 			{
 			FileData *old_fd = NULL;
-
+            int i;
+            
 			if (valid)
 				{
 				gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, -1);
@@ -1398,7 +1412,10 @@
 								FILE_COLUMN_SIZE, size,
 								FILE_COLUMN_DATE, text_from_time(fd->date),
 								FILE_COLUMN_COLOR, FALSE, -1);
-				g_free(size);
+                for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
+                    gtk_list_store_set(store, &new, FILE_COLUMN_MARKS + i, fd->marks[i], -1);
+
+                g_free(size);
 
 				done = TRUE;
 				}
@@ -1528,7 +1545,7 @@
 		     "cell-background-set", set, NULL);
 }
 
-static void vflist_listview_add_column(ViewFileList *vfl, gint n, const gchar *title, gint image, gint right_justify)
+static void vflist_listview_add_column(ViewFileList *vfl, gint n, const gchar *title, gint image, gint right_justify, gint expand)
 {
 	GtkTreeViewColumn *column;
 	GtkCellRenderer *renderer;
@@ -1547,7 +1564,9 @@
 			}
 		gtk_tree_view_column_pack_start(column, renderer, TRUE);
 		gtk_tree_view_column_add_attribute(column, renderer, "text", n);
-		}
+        if (expand)
+            gtk_tree_view_column_set_expand(column, TRUE);
+        }
 	else
 		{
 		gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
@@ -1562,6 +1581,52 @@
 	gtk_tree_view_append_column(GTK_TREE_VIEW(vfl->listview), column);
 }
 
+static void vflist_listview_mark_toggled(GtkCellRendererToggle *cell, gchar *path_str, GtkListStore *store)
+{
+    GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
+    guint *marks;
+    GtkTreeIter iter;
+    FileData *fd;
+    gboolean mark;
+    guint column;
+ 
+    if (!path || !gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path))
+        return;
+
+    column = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(cell), "column"));
+    
+    gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &fd, column, &mark, -1);
+    mark ^= 1;
+    fd->marks[column] = mark;
+        
+    gtk_list_store_set(store, &iter, column, mark, -1);
+    gtk_tree_path_free(path);
+}
+
+static void vflist_listview_add_column_toggle(ViewFileList *vfl, gint n, const gchar *title)
+{
+    GtkTreeViewColumn *column;
+    GtkCellRenderer *renderer;
+    GtkListStore *store;
+    gint index;
+    
+	store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview)));
+
+    renderer = gtk_cell_renderer_toggle_new();
+    column = gtk_tree_view_column_new_with_attributes(title, renderer, "active", n, NULL);
+
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    g_object_set_data (G_OBJECT (column), "column", GUINT_TO_POINTER(n));
+    g_object_set_data (G_OBJECT (renderer), "column", GUINT_TO_POINTER(n));
+ 
+    index = gtk_tree_view_append_column(GTK_TREE_VIEW(vfl->listview), column);
+    gtk_tree_view_column_set_fixed_width(column, 16);
+    gtk_tree_view_column_set_visible(column, vfl->marks_enabled);
+
+        
+    g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(vflist_listview_mark_toggled), store);
+}
+
 /*
  *-----------------------------------------------------------------------------
  * base
@@ -1613,6 +1678,9 @@
 	GtkListStore *store;
 	GtkTreeSelection *selection;
 
+    GType *flist_types;
+    int i;
+    
 	vfl = g_new0(ViewFileList, 1);
 
 	vfl->path = NULL;
@@ -1639,9 +1707,20 @@
 	g_signal_connect(G_OBJECT(vfl->widget), "destroy",
 			 G_CALLBACK(vflist_destroy_cb), vfl);
 
-	store = gtk_list_store_new(6, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING,
-				   G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
-	vfl->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+    flist_types = g_new(GType, FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE);
+    flist_types[0] = G_TYPE_POINTER;
+    flist_types[1] = GDK_TYPE_PIXBUF;
+    flist_types[2] = G_TYPE_STRING;
+    flist_types[3] = G_TYPE_STRING;
+    flist_types[4] = G_TYPE_STRING;
+    flist_types[5] = G_TYPE_BOOLEAN;
+    for (i = FILE_COLUMN_MARKS; i < FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE; i++)
+        flist_types[i] = G_TYPE_BOOLEAN;
+
+    store = gtk_list_store_newv(FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE, flist_types);
+    g_free(flist_types);
+                               
+    vfl->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
 	g_object_unref(store);
 
 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
@@ -1651,24 +1730,28 @@
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vfl->listview), FALSE);
 	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vfl->listview), FALSE);
 
-	vflist_listview_add_column(vfl, FILE_COLUMN_THUMB, "", TRUE, FALSE);
-	vflist_listview_add_column(vfl, FILE_COLUMN_NAME, _("Name"), FALSE, FALSE);
-	vflist_listview_add_column(vfl, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE);
-	vflist_listview_add_column(vfl, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE);
+	vflist_listview_add_column(vfl, FILE_COLUMN_THUMB, "", TRUE, FALSE, FALSE);
+	vflist_listview_add_column(vfl, FILE_COLUMN_NAME, _("Name"), FALSE, FALSE, FALSE);
+	vflist_listview_add_column(vfl, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE, FALSE);
+	vflist_listview_add_column(vfl, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE, TRUE);
 
-	g_signal_connect(G_OBJECT(vfl->listview), "key_press_event",
+    for(i = 0; i < FILEDATA_MARKS_SIZE;i++)
+        vflist_listview_add_column_toggle(vfl, i + FILE_COLUMN_MARKS, "");
+            
+    g_signal_connect(G_OBJECT(vfl->listview), "key_press_event",
 			 G_CALLBACK(vflist_press_key_cb), vfl);
 
 	gtk_container_add (GTK_CONTAINER(vfl->widget), vfl->listview);
 	gtk_widget_show(vfl->listview);
 
 	vflist_dnd_init(vfl);
-
+    
 	g_signal_connect(G_OBJECT(vfl->listview), "button_press_event",
 			 G_CALLBACK(vflist_press_cb), vfl);
 	g_signal_connect(G_OBJECT(vfl->listview), "button_release_event",
 			 G_CALLBACK(vflist_release_cb), vfl);
-
+    
+    
 	if (path) vflist_set_path(vfl, path);
 
 	return vfl;
@@ -1697,6 +1780,26 @@
 	vflist_refresh(vfl);
 }
 
+void vflist_marks_set(ViewFileList *vfl, gint enable)
+{
+    GtkListStore *store;
+    GtkTreeViewColumn *column;
+    int i;
+    
+	if (vfl->marks_enabled == enable) return;
+
+	vfl->marks_enabled = enable;
+    
+    for (i = 0; i < FILEDATA_MARKS_SIZE; i++) {
+        /* index - 2 because column's store != tree view */
+        column = gtk_tree_view_get_column(GTK_TREE_VIEW(vfl->listview), i + FILE_COLUMN_MARKS - 2);
+        
+        gtk_tree_view_column_set_visible(column, enable);
+    }
+    
+    //vflist_refresh(vfl);
+}
+
 void vflist_set_layout(ViewFileList *vfl, LayoutWindow *layout)
 {
 	vfl->layout = layout;