Author: stephan Date: 2006-09-14 11:28:44 +0000 (Thu, 14 Sep 2006) New Revision: 23154
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h xarchiver/branches/xarchiver-psybsd/src/main.h xarchiver/branches/xarchiver-psybsd/src/main_window.c xarchiver/branches/xarchiver-psybsd/src/main_window.h Log: archive navigation works :) Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c =================================================================== --- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c 2006-09-14 10:02:11 UTC (rev 23153) +++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c 2006-09-14 11:28:44 UTC (rev 23154) @@ -89,6 +89,9 @@ static void lxa_archive_init(LXAArchive *archive) { + archive->root_entry.filename = g_new0(GValue, 1); + archive->root_entry.filename = g_value_init(archive->root_entry.filename, G_TYPE_STRING); + g_value_set_string(archive->root_entry.filename, "/"); } static void @@ -97,6 +100,7 @@ LXAArchive *archive = LXA_ARCHIVE(object); if(archive->path) g_free(archive->path); + g_free(archive->root_entry.filename); } LXAArchive * @@ -159,15 +163,15 @@ gchar **path_items; LXAEntry *tmp_entry = NULL; path_items = g_strsplit_set(path, "/\n", -1); - tmp_list = g_slist_find_custom(archive->root_entries, path_items[0], (GCompareFunc)lxa_archive_lookup_dir); + tmp_list = g_slist_find_custom(archive->root_entry.children, path_items[0], (GCompareFunc)lxa_archive_lookup_dir); if(!tmp_list) { tmp_entry = g_new0(LXAEntry, 1); tmp_entry->filename = g_new0(GValue, 1); tmp_entry->filename = g_value_init(tmp_entry->filename, G_TYPE_STRING); g_value_set_string(tmp_entry->filename, path_items[0]); - archive->root_entries = g_slist_prepend(archive->root_entries, tmp_entry); - tmp_list = archive->root_entries; + archive->root_entry.children = g_slist_prepend(archive->root_entry.children, tmp_entry); + tmp_list = archive->root_entry.children; } for(i = 1; path_items[i]?strlen(path_items[i]):0;i++) { @@ -175,7 +179,7 @@ if(!tmp_list_children) { tmp_entry = g_new0(LXAEntry, 1); - tmp_entry->filename = g_new0(GValue, 1); + tmp_entry->filename = g_new0(GValue, 1); tmp_entry->filename = g_value_init(tmp_entry->filename, G_TYPE_STRING); g_value_set_string(tmp_entry->filename, path_items[i]); ((LXAEntry *)tmp_list->data)->children = g_slist_prepend(((LXAEntry *)tmp_list->data)->children, tmp_entry); @@ -187,22 +191,9 @@ return tmp_entry; } -/* FIXME: ***HACK*** ***HACK*** */ -GSList * -lxa_archive_get_children(LXAArchive *archive, gchar *path) +LXAEntry * +lxa_entry_get_child(LXAEntry *entry, const gchar *filename) { - gint i = 0; - GSList *tmp_list = archive->root_entries; - if(path[0] == '/') - i++; - gchar **path_items = g_strsplit_set(&path[i], "/\n", -1); - for(i = 0; path_items[i]?strlen(path_items[i]):0; i++) - { - tmp_list = g_slist_find_custom(tmp_list, path_items[i], (GCompareFunc)lxa_archive_lookup_dir); - if(!tmp_list) - break; - tmp_list = ((LXAEntry *)tmp_list->data)->children; - } - g_strfreev(path_items); - return tmp_list; + GSList *list = g_slist_find_custom(entry->children, filename,(GCompareFunc)lxa_archive_lookup_dir); + return (LXAEntry *)list->data; } Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h =================================================================== --- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h 2006-09-14 10:02:11 UTC (rev 23153) +++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h 2006-09-14 11:28:44 UTC (rev 23154) @@ -69,13 +69,13 @@ LXAArchiveStatus old_status; GPid child_pid; gpointer support; - GSList *root_entries; gchar *tmp_file; gchar *files; gboolean has_passwd; gint column_number; GType *column_types; gchar **column_names; + LXAEntry root_entry; }; typedef struct _LXAArchiveClass LXAArchiveClass; @@ -93,6 +93,7 @@ gint lxa_archive_lookup_dir(gpointer entry, gconstpointer filename); LXAEntry *lxa_archive_add_file(LXAArchive *archive, gchar *path); GSList *lxa_archive_get_children(LXAArchive *archive, gchar *path); +LXAEntry *lxa_entry_get_child(LXAEntry *, const gchar *); G_END_DECLS Modified: xarchiver/branches/xarchiver-psybsd/src/main.h =================================================================== --- xarchiver/branches/xarchiver-psybsd/src/main.h 2006-09-14 10:02:11 UTC (rev 23153) +++ xarchiver/branches/xarchiver-psybsd/src/main.h 2006-09-14 11:28:44 UTC (rev 23154) @@ -1,2 +1 @@ static LXAArchive *lp_xa_archive = NULL; - Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.c =================================================================== --- xarchiver/branches/xarchiver-psybsd/src/main_window.c 2006-09-14 10:02:11 UTC (rev 23153) +++ xarchiver/branches/xarchiver-psybsd/src/main_window.c 2006-09-14 11:28:44 UTC (rev 23154) @@ -17,6 +17,7 @@ */ #include <config.h> +#include <string.h> #include <glib.h> #include <gtk/gtk.h> #include <libxarchiver/libxarchiver.h> @@ -34,6 +35,9 @@ void cb_xa_main_item_activated(GtkTreeView *treeview, GtkTreePath *treepath, GtkTreeViewColumn *column, gpointer userdata); +void +xa_main_window_set_contents(XAMainWindow *, LXAArchive *, GSList *); + GType xa_main_window_get_type () { @@ -75,7 +79,10 @@ GtkWidget *tmp_image; GtkAccelGroup *accel_group = gtk_accel_group_new(); - window->working_dir = NULL; + window->working_node = NULL; + window->parent_node = g_new0(GValue, 1); + window->parent_node = g_value_init(window->parent_node, G_TYPE_STRING); + g_value_set_string(window->parent_node, ".."); gtk_window_set_default_icon_from_file(DATADIR "/pixmaps/xarchiver.png", NULL); main_vbox = gtk_vbox_new(FALSE, 0); @@ -352,8 +359,8 @@ gtk_tree_view_append_column(GTK_TREE_VIEW(main_window->treeview), column); } gtk_tree_view_set_model(GTK_TREE_VIEW(main_window->treeview), GTK_TREE_MODEL(liststore)); - GSList *items = lxa_archive_get_children(archive, ""); - xa_main_window_set_contents(main_window, archive, items, ""); + main_window->working_node = g_slist_prepend(main_window->working_node, &(archive->root_entry)); + xa_main_window_set_contents(main_window, archive, archive->root_entry.children); } } @@ -364,21 +371,24 @@ } void -xa_main_window_set_contents(XAMainWindow *main_window, LXAArchive *archive, GSList *items, gchar *path) +xa_main_window_set_contents(XAMainWindow *main_window, LXAArchive *archive, GSList *items) { GtkTreeIter iter; GtkTreeModel *liststore = gtk_tree_view_get_model(GTK_TREE_VIEW(main_window->treeview)); gtk_list_store_clear(GTK_LIST_STORE(liststore)); - main_window->working_dir = path; - while(items) { gtk_list_store_append(GTK_LIST_STORE(liststore), &iter); gtk_list_store_set_value(GTK_LIST_STORE(liststore), &iter, 0, ((LXAEntry *)items->data)->filename); items = items->next; } + if(g_slist_length(main_window->working_node) > 1) + { + gtk_list_store_prepend(GTK_LIST_STORE(liststore), &iter); + gtk_list_store_set_value(GTK_LIST_STORE(liststore), &iter, 0, main_window->parent_node); + } gtk_tree_view_set_model(GTK_TREE_VIEW(main_window->treeview), GTK_TREE_MODEL(liststore)); } @@ -386,6 +396,7 @@ cb_xa_main_item_activated(GtkTreeView *treeview, GtkTreePath *treepath, GtkTreeViewColumn *column, gpointer userdata) { GtkTreeIter iter; + GSList *items = NULL; GValue *value = g_new0(GValue, 1); XAMainWindow *main_window = userdata; @@ -394,13 +405,25 @@ gtk_tree_model_get_iter(tree_model, &iter, treepath); gtk_tree_model_get_value(tree_model, &iter, 0, value); - gchar *path = g_strconcat(main_window->working_dir, "/", g_value_get_string(value), NULL); + const gchar *item_filename = g_value_get_string(value); + if(!strcmp(item_filename, "..")) /* pop */ + { + main_window->working_node = g_slist_delete_link(main_window->working_node, main_window->working_node); + } + else + { + LXAEntry *entry = lxa_entry_get_child(((LXAEntry *)main_window->working_node->data), item_filename); + if(g_slist_length(entry->children)) + { + main_window->working_node = g_slist_prepend(main_window->working_node, entry); + } + else + { } + } + items = ((LXAEntry *)main_window->working_node->data)->children; - g_debug("%s\n", path); - - GSList *items = lxa_archive_get_children(lp_xa_archive, path); if(items) - xa_main_window_set_contents(main_window, lp_xa_archive, items, path); + xa_main_window_set_contents(main_window, lp_xa_archive, items); /* else*/ /* 'view' */ Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.h =================================================================== --- xarchiver/branches/xarchiver-psybsd/src/main_window.h 2006-09-14 10:02:11 UTC (rev 23153) +++ xarchiver/branches/xarchiver-psybsd/src/main_window.h 2006-09-14 11:28:44 UTC (rev 23154) @@ -88,7 +88,8 @@ GtkToolItem *tool_item_extract; GtkToolItem *tool_item_remove; } toolbar; - gchar *working_dir; + GValue *parent_node; + GSList *working_node; }; typedef struct _XAMainWindowClass XAMainWindowClass; @@ -106,7 +107,6 @@ void cb_xa_main_extract_archive(GtkWidget *widget, gpointer userdata); void xa_main_window_archive_status_changed(LXAArchive *archive, gpointer userdata); -void xa_main_window_set_contents(XAMainWindow *, LXAArchive *, GSList *, gchar *); G_END_DECLS #endif /* __XARCHIVER_MAIN_WINDOW_H__ */ _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits