[Xfce4-commits] r23398 - xarchiver/branches/xarchiver-psybsd/src

Stephan Arts stephan at xfce.org
Fri Oct 13 12:20:29 UTC 2006


Author: stephan
Date: 2006-10-13 12:20:28 +0000 (Fri, 13 Oct 2006)
New Revision: 23398

Modified:
   xarchiver/branches/xarchiver-psybsd/src/archive_store.c
   xarchiver/branches/xarchiver-psybsd/src/archive_store.h
Log:
Applied patch from Peter de Ridder <pc.ridder at zonnet.nl>
Enable sorting



Modified: xarchiver/branches/xarchiver-psybsd/src/archive_store.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-13 11:47:20 UTC (rev 23397)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-13 12:20:28 UTC (rev 23398)
@@ -43,7 +43,9 @@
 /* properties */
 enum {
 	XA_ARCHIVE_STORE_SHOW_ICONS = 1, 
-	XA_ARCHIVE_STORE_SHOW_UP_DIR
+	XA_ARCHIVE_STORE_SHOW_UP_DIR,
+	XA_ARCHIVE_STORE_SORT_FOLDERS_FIRST,
+	XA_ARCHIVE_STORE_SORT_CASE_SENSITIVE
 };
 
 /* signals */
@@ -191,8 +193,10 @@
 	as->stamp = g_random_int();
 	as->archive = NULL;
 	as->current_entry = NULL;
-	as->props._show_icons = FALSE;
-	as->props._show_up_dir = TRUE;
+	as->props._show_icons = 0;
+	as->props._show_up_dir = 1;
+	as->props._sort_folders_first = 1;
+	as->props._sort_case_sensitive = 1;
 	as->sort_column = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
 	as->sort_order = GTK_SORT_ASCENDING;
 	as->sort_list = NULL;
@@ -221,6 +225,20 @@
 		G_PARAM_READWRITE);
 	g_object_class_install_property(object_class, XA_ARCHIVE_STORE_SHOW_UP_DIR, pspec);
 
+	pspec = g_param_spec_boolean("sort_folders_first",
+		_("Sort folders before files"),
+		_("The folders will be put at the top of the list"),
+		TRUE,
+		G_PARAM_READWRITE);
+	g_object_class_install_property(object_class, XA_ARCHIVE_STORE_SORT_FOLDERS_FIRST, pspec);
+
+	pspec = g_param_spec_boolean("sort_case_sensitive",
+		_("Sort text case sensitive"),
+		_("Sort text case sensitive"),
+		TRUE,
+		G_PARAM_READWRITE);
+	g_object_class_install_property(object_class, XA_ARCHIVE_STORE_SORT_CASE_SENSITIVE, pspec);
+
 	xa_archive_store_signals[XA_ARCHIVE_STORE_SIGNAL_PWD_CHANGED] = g_signal_new("xa_pwd_changed",
 	   G_TYPE_FROM_CLASS(as_class),
 		 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
@@ -245,23 +263,39 @@
 	switch(prop_id)
 	{
 		case XA_ARCHIVE_STORE_SHOW_ICONS:
-			if(XA_ARCHIVE_STORE(object)->props._show_icons != g_value_get_boolean(value))
+			if(XA_ARCHIVE_STORE(object)->props._show_icons != g_value_get_boolean(value)?1:0)
 			{
 				if(XA_ARCHIVE_STORE(object)->current_entry)
 					prev_size = lxa_entry_children_length(((LXAEntry*)XA_ARCHIVE_STORE(object)->current_entry->data));
-				XA_ARCHIVE_STORE(object)->props._show_icons = g_value_get_boolean(value);
+				XA_ARCHIVE_STORE(object)->props._show_icons = g_value_get_boolean(value)?1:0;
 				xa_archive_store_refresh(XA_ARCHIVE_STORE(object), prev_size);
 			}
 			break;
 		case XA_ARCHIVE_STORE_SHOW_UP_DIR:
-			if(XA_ARCHIVE_STORE(object)->props._show_up_dir != g_value_get_boolean(value))
+			if(XA_ARCHIVE_STORE(object)->props._show_up_dir != g_value_get_boolean(value)?1:0)
 			{
 				if(XA_ARCHIVE_STORE(object)->current_entry)
 					prev_size = lxa_entry_children_length(((LXAEntry*)XA_ARCHIVE_STORE(object)->current_entry->data));
-				XA_ARCHIVE_STORE(object)->props._show_up_dir = g_value_get_boolean(value);
+				XA_ARCHIVE_STORE(object)->props._show_up_dir = g_value_get_boolean(value)?1:0;
 				xa_archive_store_refresh(XA_ARCHIVE_STORE(object), prev_size);
 			}
 			break;
+		case XA_ARCHIVE_STORE_SORT_FOLDERS_FIRST:
+			if(XA_ARCHIVE_STORE(object)->props._sort_folders_first != g_value_get_boolean(value)?1:0)
+			{
+				XA_ARCHIVE_STORE(object)->props._sort_folders_first = g_value_get_boolean(value)?1:0;
+				if(XA_ARCHIVE_STORE(object)->sort_column < 0)
+					XA_ARCHIVE_STORE(object)->sort_column = 1;
+				xa_archive_store_sort(XA_ARCHIVE_STORE(object));
+			}
+			break;
+		case XA_ARCHIVE_STORE_SORT_CASE_SENSITIVE:
+			if(XA_ARCHIVE_STORE(object)->props._sort_case_sensitive != g_value_get_boolean(value)?1:0)
+			{
+				XA_ARCHIVE_STORE(object)->props._sort_case_sensitive = g_value_get_boolean(value)?1:0;
+				xa_archive_store_sort(XA_ARCHIVE_STORE(object));
+			}
+			break;
 	}
 }
 
@@ -271,11 +305,17 @@
 	switch(prop_id)
 	{
 		case XA_ARCHIVE_STORE_SHOW_ICONS:
-			g_value_set_boolean(value, XA_ARCHIVE_STORE(object)->props._show_icons);
+			g_value_set_boolean(value, XA_ARCHIVE_STORE(object)->props._show_icons?TRUE:FALSE);
 			break;
 		case XA_ARCHIVE_STORE_SHOW_UP_DIR:
-			g_value_set_boolean(value, XA_ARCHIVE_STORE(object)->props._show_up_dir);
+			g_value_set_boolean(value, XA_ARCHIVE_STORE(object)->props._show_up_dir?TRUE:FALSE);
 			break;
+		case XA_ARCHIVE_STORE_SORT_FOLDERS_FIRST:
+			g_value_set_boolean(value, XA_ARCHIVE_STORE(object)->props._sort_folders_first?TRUE:FALSE);
+			break;
+		case XA_ARCHIVE_STORE_SORT_CASE_SENSITIVE:
+			g_value_set_boolean(value, XA_ARCHIVE_STORE(object)->props._sort_case_sensitive?TRUE:FALSE);
+			break;
 	}
 }
 
@@ -673,12 +713,25 @@
 static gboolean
 xa_archive_store_has_default_sort_func(GtkTreeSortable *s)
 {
-	return TRUE;
+	return XA_ARCHIVE_STORE(s)->props._sort_folders_first?FALSE:TRUE;
 }
 
 static gint
 xa_archive_entry_compare(XAArchiveStore *store, LXAEntry *a, LXAEntry *b)
 {
+	gint cmp_a = 0;
+	gint cmp_b = 0;
+	if(store->props._sort_folders_first)
+	{
+		cmp_a = strcmp(a->mime_type, "inode/directory");
+		cmp_b = strcmp(b->mime_type, "inode/directory");
+
+		if(cmp_a ==  0 && cmp_b != 0)
+			return -1;
+		if(cmp_b ==  0 && cmp_a != 0)
+			return 1;
+	}
+
 	LXAEntry *swap = b;
 	if(store->sort_order == GTK_SORT_DESCENDING)
 	{
@@ -694,9 +747,18 @@
 
 	column -= 2;
 
-	if(column < 0)
+	if(column < -1)
 		return;
 
+	if(column == -1)
+		switch(store->props._sort_case_sensitive)
+		{
+			case 0: /* case insensitive */
+				return g_ascii_strcasecmp(a->filename, b->filename);
+			case 1: /* case sensitive*/
+				return strcmp(a->filename, b->filename);
+		}
+
 	if(!props_a)
 	{
 		return props_b?-1:0;
@@ -706,12 +768,6 @@
 		return props_a?1:0;
 	}
 
-	if(column == -1)
-	{
-		props_a = &(a->filename);
-		props_b = &(b->filename);
-	}
-
 	for(i=0;i<column;i++)
 	{
 		switch(archive->property_types[i])
@@ -734,9 +790,11 @@
 	switch(archive->property_types[column])
 	{
 		case G_TYPE_STRING:
-			switch(/* string compare type */1)
+			switch(store->props._sort_case_sensitive)
 			{
-				default:
+				case 0: /* case insensitive */
+					return g_ascii_strcasecmp(*((gchar**)props_a), *((gchar**)props_b));
+				case 1: /* case sensitive */
 					return strcmp(*((gchar**)props_a), *((gchar**)props_b));
 			}
 		case G_TYPE_UINT64:
@@ -844,10 +902,13 @@
 
 	tree_model = g_object_new(XA_TYPE_ARCHIVE_STORE, NULL);
 
-	tree_model->props._show_icons = show_icons;
-	tree_model->props._show_up_dir = show_up_dir;
+	tree_model->props._show_icons = show_icons?1:0;
+	tree_model->props._show_up_dir = show_up_dir?1:0;
 	tree_model->icon_theme = icon_theme;
 
+	if(tree_model->props._sort_folders_first)
+		tree_model->sort_column = 1;
+
 	xa_archive_store_set_contents(tree_model, archive);
 
 	return GTK_TREE_MODEL(tree_model);
@@ -1200,6 +1261,8 @@
 	g_slist_free(store->current_entry);
 	store->current_entry = stack;
 
+	xa_archive_store_sort(store);
+
 	xa_archive_store_refresh(store, prev_size);
 	
 	return TRUE;

Modified: xarchiver/branches/xarchiver-psybsd/src/archive_store.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.h	2006-10-13 11:47:20 UTC (rev 23397)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.h	2006-10-13 12:20:28 UTC (rev 23398)
@@ -51,8 +51,10 @@
 	LXAEntry **sort_list;
 	GtkIconTheme *icon_theme;
 	struct {
-		gboolean _show_icons;
-		gboolean _show_up_dir;
+		guint _show_icons : 1;
+		guint _show_up_dir : 1;
+		guint _sort_folders_first : 1;
+		guint _sort_case_sensitive : 1;
 	} props;
 };
 



More information about the Xfce4-commits mailing list