Author: peter Date: 2007-02-25 19:23:21 +0000 (Sun, 25 Feb 2007) New Revision: 25033
Modified: squeeze/trunk/libsqueeze/archive-iter.c squeeze/trunk/libsqueeze/libsqueeze-archive.h squeeze/trunk/libsqueeze/libsqueeze-view.h squeeze/trunk/src/archive_store.c squeeze/trunk/src/archive_store.h Log: archive store can sort, has icon function, should ref correctly Modified: squeeze/trunk/libsqueeze/archive-iter.c =================================================================== --- squeeze/trunk/libsqueeze/archive-iter.c 2007-02-25 02:28:37 UTC (rev 25032) +++ squeeze/trunk/libsqueeze/archive-iter.c 2007-02-25 19:23:21 UTC (rev 25033) @@ -242,7 +242,7 @@ * LSQArchiveIter stuff * ************************/ -static LSQArchiveIter* +static LSQArchiveIter * lsq_archive_iter_new(LSQArchiveEntry *entry, LSQArchiveIter *parent, LSQArchive *archive) { #ifdef DEBUG @@ -288,8 +288,7 @@ /* iter has been found */ if(lsq_archive_iter_pool_find_iter(archive->pool, path->data, &iter, &pos)) { - lsq_archive_iter_ref(iter); - return iter; + return lsq_archive_iter_ref(iter); } /* create a new iter */ @@ -304,7 +303,7 @@ return iter; } -static LSQArchiveIter* +static LSQArchiveIter * lsq_archive_iter_get_with_parent(LSQArchiveEntry *entry, LSQArchiveIter *parent) { #ifdef DEBUG @@ -317,8 +316,7 @@ /* iter has been found */ if(lsq_archive_iter_pool_find_iter(parent->archive->pool, entry, &iter, &pos)) { - lsq_archive_iter_ref(iter); - return iter; + return lsq_archive_iter_ref(iter); } #ifdef DEBUG @@ -372,15 +370,17 @@ } } -void +LSQArchiveIter * lsq_archive_iter_ref(LSQArchiveIter* iter) { #ifdef DEBUG - g_return_if_fail(iter); + g_return_val_if_fail(iter, iter); #endif - g_return_if_fail(iter->ref_count); + g_return_val_if_fail(iter->ref_count, iter); iter->ref_count++; + + return iter; } gboolean @@ -422,7 +422,7 @@ return TRUE; } -LSQArchiveIter* +LSQArchiveIter * lsq_archive_iter_get_real_parent(LSQArchiveIter *iter) { #ifdef DEBUG @@ -437,7 +437,7 @@ back_stack = g_slist_prepend(back_stack, parent); parent = parent->parent; } - /* the root entry is archive root entry */ + /* the root entry is not archive root entry */ if(((LSQArchiveIter*)back_stack->data)->entry != iter->archive->root_entry) { g_slist_free(back_stack); @@ -458,8 +458,7 @@ } } g_slist_free(back_stack); - lsq_archive_iter_ref(iter); - return iter; + return lsq_archive_iter_ref(iter); } gboolean @@ -476,6 +475,18 @@ return FALSE; } +gboolean +lsq_archive_iter_has_parent(const LSQArchiveIter *iter) +{ + return iter->parent?TRUE:FALSE; +} + +LSQArchiveIter * +lsq_archive_iter_get_parent(LSQArchiveIter *iter) +{ + return lsq_archive_iter_ref(iter->parent); +} + guint lsq_archive_iter_n_children(const LSQArchiveIter *iter) { @@ -485,7 +496,7 @@ return lsq_archive_entry_n_children(iter->entry); } -LSQArchiveIter* +LSQArchiveIter * lsq_archive_iter_nth_child(LSQArchiveIter *parent, guint n) { #ifdef DEBUG @@ -617,6 +628,15 @@ return lsq_archive_entry_get_filename(iter->entry); } +const gchar* +lsq_archive_iter_get_mime(const LSQArchiveIter *iter) +{ +#ifdef debug + g_return_val_if_fail(iter, FALSE); +#endif + return lsq_archive_entry_get_mimetype(iter->entry); +} + gboolean lsq_archive_iter_get_prop_value(const LSQArchiveIter *iter, guint n, GValue *value) { Modified: squeeze/trunk/libsqueeze/libsqueeze-archive.h =================================================================== --- squeeze/trunk/libsqueeze/libsqueeze-archive.h 2007-02-25 02:28:37 UTC (rev 25032) +++ squeeze/trunk/libsqueeze/libsqueeze-archive.h 2007-02-25 19:23:21 UTC (rev 25033) @@ -51,8 +51,8 @@ GType lsq_archive_get_type(void); -void lsq_archive_iter_ref(LSQArchiveIter *); -void lsq_archive_iter_unref(LSQArchiveIter *); +LSQArchiveIter *lsq_archive_iter_ref(LSQArchiveIter *); +void lsq_archive_iter_unref(LSQArchiveIter *); G_END_DECLS Modified: squeeze/trunk/libsqueeze/libsqueeze-view.h =================================================================== --- squeeze/trunk/libsqueeze/libsqueeze-view.h 2007-02-25 02:28:37 UTC (rev 25032) +++ squeeze/trunk/libsqueeze/libsqueeze-view.h 2007-02-25 19:23:21 UTC (rev 25033) @@ -28,9 +28,12 @@ LSQArchiveIter *lsq_archive_iter_nth_child(LSQArchiveIter *, guint); LSQArchiveIter *lsq_archive_iter_get_child(LSQArchiveIter *, const gchar *); guint lsq_archive_iter_get_depth(const LSQArchiveIter *); +gboolean lsq_archive_iter_has_parent(const LSQArchiveIter *); +LSQArchiveIter *lsq_archive_iter_get_parent(LSQArchiveIter *); gboolean lsq_archive_iter_get_prop_value(const LSQArchiveIter *iter, guint n, GValue *value); const gchar *lsq_archive_iter_get_filename(const LSQArchiveIter *); +const gchar *lsq_archive_iter_get_mime(const LSQArchiveIter *); gchar *lsq_archive_iter_get_path(const LSQArchiveIter *archive); LSQArchiveIter *lsq_archive_get_iter(LSQArchive *archive, const gchar *path); Modified: squeeze/trunk/src/archive_store.c =================================================================== --- squeeze/trunk/src/archive_store.c 2007-02-25 02:28:37 UTC (rev 25032) +++ squeeze/trunk/src/archive_store.c 2007-02-25 19:23:21 UTC (rev 25033) @@ -16,10 +16,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* TODO: archive iter referencing */ -/* TODO: archive signaling */ -/* TODO: sorting */ -/* TODO: icon */ +/* archive iter referencing needs testing */ +/* TODO: archive signaling */ #include <config.h> #include <string.h> @@ -44,8 +42,8 @@ static void sq_archive_tree_model_init(GtkTreeModelIface *tm_interface); -/* static void */ -/* sq_archive_tree_sortable_init(GtkTreeSortableIface *ts_interface); */ +static void +sq_archive_tree_sortable_init(GtkTreeSortableIface *ts_interface); static void sq_archive_store_dispose(GObject *object); @@ -100,6 +98,11 @@ static gboolean sq_archive_store_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child); static void +sq_archive_store_ref_node (GtkTreeModel *tree_model, GtkTreeIter *iter); +static void +sq_archive_store_unref_node (GtkTreeModel *tree_model, GtkTreeIter *iter); + +static void sq_archive_store_refresh(SQArchiveStore *store); static void @@ -109,27 +112,30 @@ cb_sq_archive_store_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data); /* tree sortable */ -/* static gboolean */ -/* sq_archive_store_get_sort_column_id(GtkTreeSortable *sortable, gint *sort_col_id, GtkSortType *order); */ -/* static void */ -/* sq_archive_store_set_sort_column_id(GtkTreeSortable *sortable, gint sort_col_id, GtkSortType order); */ -/* static void */ -/* sq_archive_store_set_sort_func(GtkTreeSortable *, gint, GtkTreeIterCompareFunc, gpointer, GtkDestroyNotify); */ -/* static void */ -/* sq_archive_store_set_default_sort_func(GtkTreeSortable *, GtkTreeIterCompareFunc, gpointer, GtkDestroyNotify); */ -/* static gboolean */ -/* sq_archive_store_has_default_sort_func(GtkTreeSortable *); */ +static gboolean +sq_archive_store_get_sort_column_id(GtkTreeSortable *sortable, gint *sort_col_id, GtkSortType *order); +static void +sq_archive_store_set_sort_column_id(GtkTreeSortable *sortable, gint sort_col_id, GtkSortType order); +static void +sq_archive_store_set_sort_func(GtkTreeSortable *, gint, GtkTreeIterCompareFunc, gpointer, GtkDestroyNotify); +static void +sq_archive_store_set_default_sort_func(GtkTreeSortable *, GtkTreeIterCompareFunc, gpointer, GtkDestroyNotify); +static gboolean +sq_archive_store_has_default_sort_func(GtkTreeSortable *); -/* static gint */ -/* sq_archive_entry_compare(SQArchiveStore *store, LSQArchiveIter *a, LSQArchiveIter *b); */ -/* static void */ -/* sq_archive_quicksort(SQArchiveStore *store, gint left, gint right); */ -/* static void */ -/* sq_archive_insertionsort(SQArchiveStore *store, gint left, gint right); */ +static gint +sq_archive_entry_compare(SQArchiveStore *store, LSQArchiveIter *a, LSQArchiveIter *b); +static void +sq_archive_quicksort(SQArchiveStore *store, gint left, gint right); +static void +sq_archive_insertionsort(SQArchiveStore *store, gint left, gint right); -/* static void */ -/* sq_archive_store_sort(SQArchiveStore *store); */ +static void +sq_archive_store_sort(SQArchiveStore *store); +static const gchar * +sq_archive_store_get_icon_name_for_iter(SQArchiveStore *store, LSQArchiveIter *iter); + static void sq_archive_store_append_history(SQArchiveStore *store, LSQArchiveIter *entry); @@ -176,14 +182,14 @@ g_type_add_interface_static (sq_archive_store_type, GTK_TYPE_TREE_MODEL, &tree_model_info); - /* static const GInterfaceInfo tree_sort_info = */ - /* { */ - /* (GInterfaceInitFunc) sq_archive_tree_sortable_init, */ - /* NULL, */ - /* NULL */ - /* }; */ + static const GInterfaceInfo tree_sort_info = + { + (GInterfaceInitFunc) sq_archive_tree_sortable_init, + NULL, + NULL + }; - /* g_type_add_interface_static (sq_archive_store_type, GTK_TYPE_TREE_SORTABLE, &tree_sort_info); */ + g_type_add_interface_static (sq_archive_store_type, GTK_TYPE_TREE_SORTABLE, &tree_sort_info); return sq_archive_store_type; } @@ -203,17 +209,19 @@ iface->iter_n_children = sq_archive_store_iter_n_children; iface->iter_nth_child = sq_archive_store_iter_nth_child; iface->iter_parent = sq_archive_store_iter_parent; + iface->ref_node = sq_archive_store_ref_node; + iface->unref_node = sq_archive_store_unref_node; } -/* static void */ -/* sq_archive_tree_sortable_init(GtkTreeSortableIface *iface) */ -/* { */ - /* iface->get_sort_column_id = sq_archive_store_get_sort_column_id; */ - /* iface->set_sort_column_id = sq_archive_store_set_sort_column_id; */ - /* iface->set_sort_func = sq_archive_store_set_sort_func; |+NOT SUPPORTED+| */ - /* iface->set_default_sort_func = sq_archive_store_set_default_sort_func; |+NOT SUPPORTED+| */ - /* iface->has_default_sort_func = sq_archive_store_has_default_sort_func; */ -/* } */ +static void +sq_archive_tree_sortable_init(GtkTreeSortableIface *iface) +{ + iface->get_sort_column_id = sq_archive_store_get_sort_column_id; + iface->set_sort_column_id = sq_archive_store_set_sort_column_id; + iface->set_sort_func = sq_archive_store_set_sort_func; /*NOT SUPPORTED*/ + iface->set_default_sort_func = sq_archive_store_set_default_sort_func; /*NOT SUPPORTED*/ + iface->has_default_sort_func = sq_archive_store_has_default_sort_func; +} static void sq_archive_store_init(SQArchiveStore *as) @@ -221,9 +229,9 @@ as->stamp = g_random_int(); as->archive = NULL; as->support = NULL; - /* as->sort_column = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID; */ - /* as->sort_order = GTK_SORT_ASCENDING; */ - /* as->sort_list = NULL; */ + as->sort_column = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID; + as->sort_order = GTK_SORT_ASCENDING; + as->sort_list = NULL; as->icon_theme = NULL; as->props._show_icons = 0; as->props._show_up_dir = 1; @@ -424,7 +432,7 @@ gint index = indices[depth]; /* if this is the root entry we don't need the ".." */ - if(store->props._show_up_dir && lsq_archive_iter_get_parent(entry)) + if(store->props._show_up_dir && lsq_archive_iter_has_parent(entry)) index--; if(index == -1) @@ -435,9 +443,9 @@ else { /* as long as it is a list depth is 0 other wise current_entry should be synced ? */ - /* if(store->sort_list) */ - /* entry = store->sort_list[index]; */ - /* else */ + if(store->sort_list) + entry = lsq_archive_iter_ref(store->sort_list[index]); + else entry = lsq_archive_iter_nth_child(entry, index); if(!entry) @@ -470,7 +478,7 @@ LSQArchiveIter *entry = (LSQArchiveIter*)iter->user_data; gint pos = GPOINTER_TO_INT(iter->user_data3); - if(store->props._show_up_dir && lsq_archive_get_iter(archive, NULL) != lsq_archive_iter_get_parent(entry)) + if(store->props._show_up_dir && lsq_archive_iter_has_parent(entry)) pos++; GtkTreePath *path = gtk_tree_path_new(); @@ -497,10 +505,10 @@ { if(column == -1) { - /* if(store->props._show_icons) */ - /* FIXME: lsq_archive_iter_get_icon_name(archive, entry, value, store->icon_theme); */ - /* else */ - g_value_init(value, G_TYPE_STRING); + g_value_init(value, G_TYPE_STRING); + + if(store->props._show_icons) + g_value_set_string(value, sq_archive_store_get_icon_name_for_iter(store, entry)); } else { @@ -540,15 +548,23 @@ if(iter->stamp != store->stamp) return FALSE; - LSQArchiveIter *entry = lsq_archive_iter_get_parent((LSQArchiveIter*)iter->user_data); + LSQArchiveIter *entry = iter->user_data; + LSQArchiveIter *parent; gint pos = GPOINTER_TO_INT(iter->user_data3); pos++; - /* if(store->sort_list) */ - /* entry = store->sort_list[pos]; */ - /* else */ - entry = lsq_archive_iter_nth_child(entry, pos); + if(store->sort_list) + entry = lsq_archive_iter_ref(store->sort_list[pos]); + else + { + parent = lsq_archive_iter_get_parent(entry); + entry = lsq_archive_iter_nth_child(parent, pos); + lsq_archive_iter_unref(parent); + } + /* is this correct? */ + lsq_archive_iter_unref(iter->user_data); + if(!entry) return FALSE; @@ -584,16 +600,16 @@ /* only support lists: parent is always NULL */ g_return_val_if_fail(parent == NULL, FALSE); - if(store->props._show_up_dir && lsq_archive_iter_get_parent(entry)) + if(store->props._show_up_dir && lsq_archive_iter_has_parent(entry)) { entry = NULL; iter->user_data3 = GINT_TO_POINTER(-1); } else { - /* if(store->sort_list) */ - /* entry = store->sort_list[0]; */ - /* else */ + if(store->sort_list) + entry = lsq_archive_iter_ref(store->sort_list[0]); + else entry = lsq_archive_iter_nth_child(entry, 0); g_return_val_if_fail(entry, FALSE); @@ -638,7 +654,7 @@ /* only support lists: iter is always NULL */ g_return_val_if_fail(iter == NULL, FALSE); - return lsq_archive_iter_n_children(entry) + (lsq_archive_iter_get_parent(entry)?1:0); + return lsq_archive_iter_n_children(entry) + (lsq_archive_iter_has_parent(entry)?1:0); } static gboolean @@ -667,7 +683,7 @@ /* only support lists: parent is always NULL */ g_return_val_if_fail(parent == NULL, FALSE); - if(store->props._show_up_dir && lsq_archive_iter_get_parent(entry)) + if(store->props._show_up_dir && lsq_archive_iter_has_parent(entry)) n--; if(n == -1) @@ -676,9 +692,9 @@ } else { - /* if(store->sort_list) */ - /* entry = store->sort_list[n]; */ - /* else */ + if(store->sort_list) + entry = lsq_archive_iter_ref(store->sort_list[n]); + else entry = lsq_archive_iter_nth_child(entry, n); if(!entry) @@ -703,231 +719,262 @@ return FALSE; } +static void +sq_archive_store_ref_node (GtkTreeModel *tree_model, GtkTreeIter *iter) +{ + lsq_archive_iter_ref(iter->user_data); +} -/* static gboolean */ -/* sq_archive_store_get_sort_column_id(GtkTreeSortable *sortable, gint *sort_col_id, GtkSortType *order) */ -/* { */ - /* g_return_val_if_fail(SQ_IS_ARCHIVE_STORE(sortable), FALSE); */ +static void +sq_archive_store_unref_node (GtkTreeModel *tree_model, GtkTreeIter *iter) +{ + lsq_archive_iter_unref(iter->user_data); +} - /* SQArchiveStore *store = SQ_ARCHIVE_STORE(sortable); */ - /* if(sort_col_id) */ - /* *sort_col_id = store->sort_column; */ - /* */ - /* if(order) */ - /* *order = store->sort_order; */ +static gboolean +sq_archive_store_get_sort_column_id(GtkTreeSortable *sortable, gint *sort_col_id, GtkSortType *order) +{ + g_return_val_if_fail(SQ_IS_ARCHIVE_STORE(sortable), FALSE); - /* return store->sort_order >= 0; */ -/* } */ + SQArchiveStore *store = SQ_ARCHIVE_STORE(sortable); -/* static void */ -/* sq_archive_store_set_sort_column_id(GtkTreeSortable *sortable, gint sort_col_id, GtkSortType order) */ -/* { */ - /* g_return_if_fail(SQ_IS_ARCHIVE_STORE(sortable)); */ + if(sort_col_id) + *sort_col_id = store->sort_column; - /* SQArchiveStore *store = SQ_ARCHIVE_STORE(sortable); */ + if(order) + *order = store->sort_order; - /* if(store->sort_column == sort_col_id && store->sort_order == order) */ - /* return; */ + return store->sort_order >= 0; +} - /* if(sort_col_id == 0) */ - /* return; */ +static void +sq_archive_store_set_sort_column_id(GtkTreeSortable *sortable, gint sort_col_id, GtkSortType order) +{ + g_return_if_fail(SQ_IS_ARCHIVE_STORE(sortable)); - /* store->sort_column = sort_col_id; */ - /* store->sort_order = order; */ + SQArchiveStore *store = SQ_ARCHIVE_STORE(sortable); - /* sq_archive_store_sort(store); */ - /* sq_archive_store_refresh(store); */ + if(store->sort_column == sort_col_id && store->sort_order == order) + return; - /* gtk_tree_sortable_sort_column_changed(sortable); */ -/* } */ + if(sort_col_id == 0) + return; -/* static void */ -/* sq_archive_store_set_sort_func(GtkTreeSortable *s, gint i, GtkTreeIterCompareFunc f, gpointer p, GtkDestroyNotify d) */ -/* { */ - /* g_warning("%s is not supported by the SQArchiveStore model", __FUNCTION__); */ -/* } */ + store->sort_column = sort_col_id; + store->sort_order = order; -/* static void */ -/* sq_archive_store_set_default_sort_func(GtkTreeSortable *s, GtkTreeIterCompareFunc f, gpointer p, GtkDestroyNotify d) */ -/* { */ - /* g_warning("%s is not supported by the SQArchiveStore model", __FUNCTION__); */ -/* } */ + sq_archive_store_sort(store); + sq_archive_store_refresh(store); -/* static gboolean */ -/* sq_archive_store_has_default_sort_func(GtkTreeSortable *s) */ -/* { */ - /* return SQ_ARCHIVE_STORE(s)->props._sort_folders_first?FALSE:TRUE; */ -/* } */ + gtk_tree_sortable_sort_column_changed(sortable); +} -/* static gint */ -/* sq_archive_entry_compare(SQArchiveStore *store, LSQArchiveIter *a, LSQArchiveIter *b) */ -/* { */ - /* gint retval = 0; */ - /* gint column = 0; */ - /* gboolean cmp_a = 0; */ - /* gboolean cmp_b = 0; */ - /* GValue prop_a; */ - /* GValue prop_b; */ - /* memset(&prop_a, 0, sizeof(GValue)); */ - /* memset(&prop_b, 0, sizeof(GValue)); */ - /* if(store->props._sort_folders_first) */ - /* { */ - /* cmp_a = lsq_archive_iter_is_directory(store->archive, a); */ - /* cmp_b = lsq_archive_iter_is_directory(store->archive, b); */ +static void +sq_archive_store_set_sort_func(GtkTreeSortable *s, gint i, GtkTreeIterCompareFunc f, gpointer p, GtkDestroyNotify d) +{ + g_warning("%s is not supported by the SQArchiveStore model", __FUNCTION__); +} - /* if(cmp_a && !cmp_b) */ - /* return -1; */ - /* if(cmp_b && !cmp_a) */ - /* return 1; */ - /* } */ +static void +sq_archive_store_set_default_sort_func(GtkTreeSortable *s, GtkTreeIterCompareFunc f, gpointer p, GtkDestroyNotify d) +{ + g_warning("%s is not supported by the SQArchiveStore model", __FUNCTION__); +} - /* LSQArchiveIter *swap = b; */ - /* if(store->sort_order == GTK_SORT_DESCENDING) */ - /* { */ - /* b = a; */ - /* a = swap; */ - /* } */ +static gboolean +sq_archive_store_has_default_sort_func(GtkTreeSortable *s) +{ + return SQ_ARCHIVE_STORE(s)->props._sort_folders_first?FALSE:TRUE; +} - /* LSQArchive *archive = store->archive; */ - /* column = store->sort_column - 1; */ +static gint +sq_archive_entry_compare(SQArchiveStore *store, LSQArchiveIter *a, LSQArchiveIter *b) +{ + gint retval = 0; + gint column = 0; + gboolean cmp_a = 0; + gboolean cmp_b = 0; + GValue prop_a; + GValue prop_b; + memset(&prop_a, 0, sizeof(GValue)); + memset(&prop_b, 0, sizeof(GValue)); + if(store->props._sort_folders_first) + { + cmp_a = lsq_archive_iter_is_directory(a); + cmp_b = lsq_archive_iter_is_directory(b); - /* lsq_archive_iter_get_prop_value(archive, a, column, &prop_a); */ - /* lsq_archive_iter_get_prop_value(archive, b, column, &prop_b); */ + if(cmp_a && !cmp_b) + return -1; + if(cmp_b && !cmp_a) + return 1; + } - /* switch(lsq_archive_get_entry_property_type(archive, column)) */ - /* { */ - /* case G_TYPE_STRING: */ - /* if(g_value_get_string(&prop_a) == NULL) */ - /* { */ - /* retval = -1; */ - /* break; */ - /* } */ - /* if(g_value_get_string(&prop_b) == NULL) */ - /* { */ - /* retval = 1; */ - /* break; */ - /* } */ - /* switch(store->props._sort_case_sensitive) */ - /* { */ - /* case 0: |+ case insensitive +| */ - /* retval = g_ascii_strcasecmp(g_value_get_string(&prop_a), g_value_get_string(&prop_b)); */ - /* break; */ - /* case 1: |+ case sensitive +| */ - /* retval = strcmp(g_value_get_string(&prop_a), g_value_get_string(&prop_b)); */ - /* break; */ - /* } */ - /* break; */ - /* case G_TYPE_UINT64: */ - /* retval = g_value_get_uint64(&prop_a) - g_value_get_uint64(&prop_b); */ - /* break; */ - /* case G_TYPE_UINT: */ - /* retval = g_value_get_uint(&prop_a) - g_value_get_uint(&prop_b); */ - /* break; */ - /* } */ - /* g_value_unset(&prop_a); */ - /* g_value_unset(&prop_b); */ - /* return retval; */ -/* } */ + LSQArchiveIter *swap = b; + if(store->sort_order == GTK_SORT_DESCENDING) + { + b = a; + a = swap; + } -/* static void */ -/* sq_archive_store_sort(SQArchiveStore *store) */ -/* { */ - /* if(store->sort_list) */ - /* { */ - /* g_free(store->sort_list); */ - /* store->sort_list = NULL; */ - /* } */ + LSQArchive *archive = store->archive; + column = store->sort_column - 1; - /* if(store->sort_column < 0) */ - /* return; */ + lsq_archive_iter_get_prop_value(a, column, &prop_a); + lsq_archive_iter_get_prop_value(b, column, &prop_b); -/* #ifdef DEBUG */ - /* g_return_if_fail(store->navigation.present); */ - /* g_return_if_fail(store->navigation.present->data); */ -/* #endif */ + switch(lsq_archive_get_entry_property_type(archive, column)) + { + case G_TYPE_STRING: + if(g_value_get_string(&prop_a) == NULL) + { + retval = -1; + break; + } + if(g_value_get_string(&prop_b) == NULL) + { + retval = 1; + break; + } + switch(store->props._sort_case_sensitive) + { + case 0: /* case insensitive */ + retval = g_ascii_strcasecmp(g_value_get_string(&prop_a), g_value_get_string(&prop_b)); + break; + case 1: /* case sensitive */ + retval = strcmp(g_value_get_string(&prop_a), g_value_get_string(&prop_b)); + break; + } + break; + case G_TYPE_UINT64: + retval = g_value_get_uint64(&prop_a) - g_value_get_uint64(&prop_b); + break; + case G_TYPE_UINT: + retval = g_value_get_uint(&prop_a) - g_value_get_uint(&prop_b); + break; + } + g_value_unset(&prop_a); + g_value_unset(&prop_b); + return retval; +} - /* LSQArchiveIter *pentry = store->navigation.present->data; */ - /* gint psize = lsq_archive_iter_n_children(store->archive, pentry); */ - /* gint i = 0; */ +static void +sq_archive_store_sort(SQArchiveStore *store) +{ + if(store->sort_list) + { + LSQArchiveIter **iter; + for(iter = store->sort_list; *iter; iter++) + { + lsq_archive_iter_unref(*iter); + } + g_free(store->sort_list); + store->sort_list = NULL; + } - /* if(psize <= 1) */ - /* return; */ + if(store->sort_column < 0) + return; - /* store->sort_list = g_new(LSQArchiveIter*, psize+1); */ +#ifdef DEBUG + g_return_if_fail(store->navigation.present); + g_return_if_fail(store->navigation.present->data); +#endif - /* for(i = 0; i < psize; ++i) */ - /* { */ - /* store->sort_list[i] = lsq_archive_iter_nth_child(store->archive, pentry, i); */ - /* } */ - /* sq_archive_quicksort(store, 0, psize-1); */ - /* sq_archive_insertionsort(store, 0, psize-1); */ - /* store->sort_list[psize] = NULL; */ -/* } */ + LSQArchiveIter *pentry = store->navigation.present->data; + gint psize = lsq_archive_iter_n_children(pentry); + gint i = 0; -/* inline void */ -/* swap(LSQArchiveIter **left, LSQArchiveIter **right) */ -/* { */ - /* LSQArchiveIter *tmp = *right; */ - /* *right = *left; */ - /* *left = tmp; */ -/* } */ + if(psize <= 1) + return; -/* static void */ -/* sq_archive_quicksort(SQArchiveStore *store, gint left, gint right) */ -/* { */ - /* if(right-left < 30) return; */ + store->sort_list = g_new(LSQArchiveIter*, psize+1); - /* gint i = (left+right)/2; */ - /* gint j = right-1; */ - /* LSQArchiveIter *value = NULL; */ - /* LSQArchiveIter **list = store->sort_list; */ + for(i = 0; i < psize; ++i) + { + store->sort_list[i] = lsq_archive_iter_nth_child(pentry, i); + } + sq_archive_quicksort(store, 0, psize-1); + sq_archive_insertionsort(store, 0, psize-1); + store->sort_list[psize] = NULL; +} - /* if(sq_archive_entry_compare(store, list[left], list[i]) > 0) */ - /* swap(list+left, list+i); */ - /* if(sq_archive_entry_compare(store, list[left], list[right]) > 0) */ - /* swap(list+left, list+right); */ - /* if(sq_archive_entry_compare(store, list[i], list[right]) > 0) */ - /* swap(list+i, list+right); */ - /* */ - /* swap(list+i, list+j); */ - /* i = left; */ - /* value = list[j]; */ +static inline void +swap(LSQArchiveIter **left, LSQArchiveIter **right) +{ + LSQArchiveIter *tmp = *right; + *right = *left; + *left = tmp; +} - /* for(;;) */ - /* { */ - /* while(sq_archive_entry_compare(store, list[++i], value) < 0); */ - /* while(sq_archive_entry_compare(store, list[--j], value) > 0); */ - /* if(j<i) break; */ +static void +sq_archive_quicksort(SQArchiveStore *store, gint left, gint right) +{ + if(right-left < 30) return; - /* swap(list+i, list+j); */ - /* } */ - /* swap(list+i, list+right-1); */ - /* sq_archive_quicksort(store, left, j); */ - /* sq_archive_quicksort(store, i+1, right); */ -/* } */ + gint i = (left+right)/2; + gint j = right-1; + LSQArchiveIter *value = NULL; + LSQArchiveIter **list = store->sort_list; -/* static void */ -/* sq_archive_insertionsort(SQArchiveStore *store, gint left, gint right) */ -/* { */ - /* gint i = 0; */ - /* gint j = 0; */ - /* LSQArchiveIter *value = NULL; */ - /* LSQArchiveIter **list = store->sort_list; */ + if(sq_archive_entry_compare(store, list[left], list[i]) > 0) + swap(list+left, list+i); + if(sq_archive_entry_compare(store, list[left], list[right]) > 0) + swap(list+left, list+right); + if(sq_archive_entry_compare(store, list[i], list[right]) > 0) + swap(list+i, list+right); - /* for(i = left+1; i <= right; ++i) */ - /* { */ - /* j = i; */ - /* value = list[i]; */ - /* while(j > left && sq_archive_entry_compare(store, list[j-1], value) > 0) */ - /* { */ - /* list[j] = list[j-1]; */ - /* j--; */ - /* } */ - /* list[j] = value; */ - /* } */ -/* } */ + swap(list+i, list+j); + i = left; + value = list[j]; + for(;;) + { + while(sq_archive_entry_compare(store, list[++i], value) < 0); + while(sq_archive_entry_compare(store, list[--j], value) > 0); + if(j<i) break; + + swap(list+i, list+j); + } + swap(list+i, list+right-1); + sq_archive_quicksort(store, left, j); + sq_archive_quicksort(store, i+1, right); +} + +static void +sq_archive_insertionsort(SQArchiveStore *store, gint left, gint right) +{ + gint i = 0; + gint j = 0; + LSQArchiveIter *value = NULL; + LSQArchiveIter **list = store->sort_list; + + for(i = left+1; i <= right; ++i) + { + j = i; + value = list[i]; + while(j > left && sq_archive_entry_compare(store, list[j-1], value) > 0) + { + list[j] = list[j-1]; + j--; + } + list[j] = value; + } +} + +static const gchar * +sq_archive_store_get_icon_name_for_iter(SQArchiveStore *store, LSQArchiveIter *iter) +{ + ThunarVfsMimeDatabase *mimedb = thunar_vfs_mime_database_get_default(); + ThunarVfsMimeInfo *mime_info = thunar_vfs_mime_database_get_info(mimedb, lsq_archive_iter_get_mime(iter)); + const gchar *icon_name = thunar_vfs_mime_info_lookup_icon_name(mime_info, store->icon_theme); + if(icon_name && !gtk_icon_theme_has_icon(store->icon_theme, icon_name)) + icon_name = NULL; + /* may we do this? */ + thunar_vfs_mime_info_unref(mime_info); + g_object_unref(mimedb); + return icon_name; +} + GtkTreeModel * sq_archive_store_new(LSQArchive *archive, gboolean show_icons, gboolean show_up_dir, GtkIconTheme *icon_theme) { @@ -939,8 +986,8 @@ 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; */ + if(tree_model->props._sort_folders_first) + tree_model->sort_column = 1; sq_archive_store_set_archive(tree_model, archive); @@ -979,7 +1026,7 @@ if(store->treeview) { /* we need to add up dir .. */ - if(store->props._show_up_dir && lsq_archive_iter_get_parent(entry)) + if(store->props._show_up_dir && lsq_archive_iter_has_parent(entry)) { path_ = gtk_tree_path_new(); gtk_tree_path_append_index(path_, 0); @@ -1005,9 +1052,9 @@ gtk_tree_path_append_index(path_, i); iter.stamp = store->stamp; - /* if(store->sort_list) */ - /* iter.user_data = store->sort_list[i]; */ - /* else */ + if(store->sort_list) + iter.user_data = lsq_archive_iter_ref(store->sort_list[i]); + else iter.user_data = lsq_archive_iter_nth_child(entry, i); iter.user_data3 = GINT_TO_POINTER(i); @@ -1016,6 +1063,8 @@ else gtk_tree_model_row_inserted(GTK_TREE_MODEL(store), path_, &iter); + lsq_archive_iter_unref(iter.user_data); + gtk_tree_path_free(path_); } @@ -1062,7 +1111,7 @@ gint index = indices[depth]; - if(store->props._show_up_dir && lsq_archive_iter_get_parent(entry)) + if(store->props._show_up_dir && lsq_archive_iter_has_parent(entry)) index--; if(index == -1) @@ -1072,9 +1121,9 @@ } else { - /* if(store->sort_list) */ - /* entry = store->sort_list[index]; */ - /* else */ + if(store->sort_list) + entry = lsq_archive_iter_ref(store->sort_list[index]); + else entry = lsq_archive_iter_nth_child(entry, index); g_return_if_fail(entry); @@ -1086,13 +1135,14 @@ g_debug("file clicked"); #endif g_signal_emit(store, sq_archive_store_signals[SQ_ARCHIVE_STORE_SIGNAL_FILE_ACTIVATED], 0, lsq_archive_iter_get_filename(entry), NULL); + lsq_archive_iter_unref(entry); return; } sq_archive_store_append_history(store, entry); } - /* sq_archive_store_sort(store); */ + sq_archive_store_sort(store); sq_archive_store_refresh(store); g_signal_emit(store, sq_archive_store_signals[SQ_ARCHIVE_STORE_SIGNAL_PWD_CHANGED], 0,NULL); } @@ -1116,7 +1166,7 @@ sq_archive_store_append_history(store, entry); - /* sq_archive_store_sort(store); */ + sq_archive_store_sort(store); sq_archive_store_refresh(store); g_signal_emit(store, sq_archive_store_signals[SQ_ARCHIVE_STORE_SIGNAL_PWD_CHANGED], 0,NULL); } @@ -1136,11 +1186,16 @@ LSQArchiveIter *root_entry; /* free the sort data */ - /* if(store->sort_list) */ - /* { */ - /* g_free(store->sort_list); */ - /* store->sort_list = NULL; */ - /* } */ + if(store->sort_list) + { + LSQArchiveIter **iter; + for(iter = store->sort_list; *iter; iter++) + { + lsq_archive_iter_unref(*iter); + } + g_free(store->sort_list); + store->sort_list = NULL; + } /* notify the tree view, all rows are gone */ i = store->list_size; @@ -1195,7 +1250,7 @@ sq_archive_store_append_history(store, root_entry); - /* sq_archive_store_sort(store); */ + sq_archive_store_sort(store); /* lets notify the tree view we have new rows */ store->list_size = lsq_archive_iter_n_children(root_entry); @@ -1206,14 +1261,16 @@ gtk_tree_path_append_index(path_, i); iter.stamp = store->stamp; - /* if(store->sort_list) */ - /* iter.user_data = store->sort_list[i]; */ - /* else */ + if(store->sort_list) + iter.user_data = lsq_archive_iter_ref(store->sort_list[i]); + else iter.user_data = lsq_archive_iter_nth_child(root_entry, i); iter.user_data3 = GINT_TO_POINTER(i); gtk_tree_model_row_inserted(GTK_TREE_MODEL(store), path_, &iter); + lsq_archive_iter_unref(iter.user_data); + gtk_tree_path_free(path_); } } @@ -1251,19 +1308,22 @@ return NULL; const gchar *basename; - LSQArchiveIter *iter = store->navigation.present->data; + LSQArchiveIter *child = NULL, *iter = store->navigation.present->data; GSList *path = NULL; if(!iter) return NULL; /* we don't want to include de archive rootentry */ - while(lsq_archive_iter_get_parent(iter)) + while(lsq_archive_iter_has_parent(iter)) { basename = lsq_archive_iter_get_filename(iter); path = g_slist_prepend(path, g_strdup(basename)); iter = lsq_archive_iter_get_parent(iter); + lsq_archive_iter_unref(child); + child = iter; } + lsq_archive_iter_unref(child); return path; } @@ -1287,7 +1347,7 @@ { sq_archive_store_append_history(store, iter); - /* sq_archive_store_sort(store); */ + sq_archive_store_sort(store); sq_archive_store_refresh(store); g_signal_emit(store, sq_archive_store_signals[SQ_ARCHIVE_STORE_SIGNAL_PWD_CHANGED], 0,NULL); @@ -1344,12 +1404,12 @@ if(store->props._sort_case_sensitive != sort) { store->props._sort_case_sensitive = sort; - /* if(store->sort_column < 0) */ - /* store->sort_column = 1; */ + if(store->sort_column <= 0) + store->sort_column = 1; if(store->archive) { - /* sq_archive_store_sort(store); */ + sq_archive_store_sort(store); sq_archive_store_refresh(store); } } @@ -1363,32 +1423,17 @@ if(store->props._sort_folders_first != sort) { store->props._sort_folders_first = sort; - /* if(store->sort_column < 0) */ - /* store->sort_column = 1; */ + if(store->sort_column <= 0) + store->sort_column = 1; if(store->archive) { - /* sq_archive_store_sort(store); */ + sq_archive_store_sort(store); sq_archive_store_refresh(store); } } } -gchar * -sq_archive_store_get_filename(SQArchiveStore *store, GtkTreeIter *iter) -{ - LSQArchiveIter *entry = iter->user_data; - - const gchar *basename; - - basename = lsq_archive_iter_get_filename(entry); - - if(lsq_archive_iter_is_directory(entry)) - return g_strconcat(basename, "/", NULL); - else - return g_strdup(basename); -} - gboolean sq_archive_store_has_history(SQArchiveStore *store) { @@ -1420,7 +1465,7 @@ if(sq_archive_store_has_history(store)) store->navigation.present = store->navigation.present->prev; - /* sq_archive_store_sort(store); */ + sq_archive_store_sort(store); sq_archive_store_refresh(store); sq_archive_store_check_trailing(store); @@ -1443,7 +1488,7 @@ if(sq_archive_store_has_future(store)) store->navigation.present = store->navigation.present->next; - /* sq_archive_store_sort(store); */ + sq_archive_store_sort(store); sq_archive_store_refresh(store); sq_archive_store_check_trailing(store); @@ -1489,16 +1534,23 @@ { LSQArchiveIter *piter = store->navigation.present->data; LSQArchiveIter *titer = store->navigation.trailing; + LSQArchiveIter *child = NULL; if(titer) { while(titer) { if(titer == piter) + { + lsq_archive_iter_unref(child); return; + } titer = lsq_archive_iter_get_parent(titer); + lsq_archive_iter_unref(child); + child = titer; } + lsq_archive_iter_unref(child); } lsq_archive_iter_unref(store->navigation.trailing); @@ -1514,19 +1566,22 @@ #endif const gchar *basename; - LSQArchiveIter *iter = store->navigation.trailing; + LSQArchiveIter *child = NULL, *iter = store->navigation.trailing; GSList *path = NULL; if(!iter) return NULL; /* we don't want to include de archive rootentry */ - while(lsq_archive_iter_get_parent(iter)) + while(lsq_archive_iter_has_parent(iter)) { basename = lsq_archive_iter_get_filename(iter); path = g_slist_prepend(path, &basename); iter = lsq_archive_iter_get_parent(iter); + lsq_archive_iter_unref(child); + child = iter; } + lsq_archive_iter_unref(child); return path; } Modified: squeeze/trunk/src/archive_store.h =================================================================== --- squeeze/trunk/src/archive_store.h 2007-02-25 02:28:37 UTC (rev 25032) +++ squeeze/trunk/src/archive_store.h 2007-02-25 19:23:21 UTC (rev 25033) @@ -46,9 +46,9 @@ gint stamp; LSQArchive *archive; LSQArchiveSupport *support; - // gint sort_column; - // GtkSortType sort_order; - // LSQArchiveIter **sort_list; + gint sort_column; + GtkSortType sort_order; + LSQArchiveIter **sort_list; guint list_size; GtkIconTheme *icon_theme; GtkTreeView *treeview; @@ -93,16 +93,6 @@ void sq_archive_store_set_sort_case_sensitive(SQArchiveStore *, gboolean); void sq_archive_store_set_sort_folders_first(SQArchiveStore *, gboolean); -gchar * -sq_archive_store_get_filename(SQArchiveStore *store, GtkTreeIter *iter); - -/* want to depricate these */ -/*void -sq_archive_store_set_history(SQArchiveStore *store, GList *history, GList *pwd); -void -sq_archive_store_get_history(SQArchiveStore *store, GList **history, GList **pwd); -*/ -/* these replace them */ gboolean sq_archive_store_has_history(SQArchiveStore *store); gboolean _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits