[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