[Xfce4-commits] r23290 - in xarchiver/branches/xarchiver-psybsd: libxarchiver src

Stephan Arts stephan at xfce.org
Thu Oct 5 13:44:19 UTC 2006


Author: stephan
Date: 2006-10-05 13:44:18 +0000 (Thu, 05 Oct 2006)
New Revision: 23290

Added:
   xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h
Modified:
   xarchiver/branches/xarchiver-psybsd/libxarchiver/Makefile.am
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
   xarchiver/branches/xarchiver-psybsd/src/archive_store.c
   xarchiver/branches/xarchiver-psybsd/src/main_window.c
Log:
Added custom (not working) treemodel



Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/Makefile.am
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/Makefile.am	2006-10-05 11:07:34 UTC (rev 23289)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/Makefile.am	2006-10-05 13:44:18 UTC (rev 23290)
@@ -3,6 +3,7 @@
 libxarchiver_a_SOURCES =            \
 	libxarchiver.c libxarchiver.h     \
 	internals.c internals.h \
+	slist.c slist.h \
 	archive.c archive.h \
 	archive-support.c archive-support.h \
   archive-support-zip.c archive-support-zip.h \

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c	2006-10-05 11:07:34 UTC (rev 23289)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c	2006-10-05 13:44:18 UTC (rev 23290)
@@ -31,7 +31,7 @@
 
 #include "internals.h"
 
-#define LXA_ENTRY_CHILD_BUFFER_SIZE 3
+#define LXA_ENTRY_CHILD_BUFFER_SIZE 300
 
 
 static void
@@ -266,43 +266,16 @@
 gboolean
 lxa_entry_add_child(LXAEntry *parent, LXAEntry *child)
 {
-	gint cmp = 1;
-	GSList *buffer_iter = parent->buffer;
-	GSList *prev_entry = NULL;
-	GSList *new_entry = NULL;
+	parent->buffer = lxa_slist_insert_sorted_single(parent->buffer, child);
 
-	for(; buffer_iter; buffer_iter = buffer_iter->next)
-	{
-		cmp = strcmp(child->filename, ((LXAEntry*)buffer_iter->data)->filename);
-
-		if(!cmp)
-		{
-			/* TODO: merge same as in flush */
-			return;
-		}
-		if(cmp < 0)
-			break;
-
-		prev_entry = buffer_iter;
-	}
-
-	new_entry = g_new(GSList, 1);
-	new_entry->next = buffer_iter;
-	new_entry->data = child;
-
-	if(prev_entry)
-		prev_entry->next = new_entry;
-	else
-		parent->buffer = new_entry;
-
-	if(g_slist_length(parent->buffer) == LXA_ENTRY_CHILD_BUFFER_SIZE)
+	if(lxa_slist_length(parent->buffer) == LXA_ENTRY_CHILD_BUFFER_SIZE)
 		lxa_entry_flush_buffer(parent);
 }
 
 LXAEntry *
 lxa_entry_get_child(LXAEntry *entry, const gchar *filename)
 {
-	GSList *buffer_iter = NULL;
+	LXASList *buffer_iter = NULL;
 	guint size = entry->n_children;
 	guint pos = 0;
 	guint begin = 0;
@@ -328,10 +301,10 @@
 
 	for(buffer_iter = entry->buffer; buffer_iter; buffer_iter = buffer_iter->next)
 	{
-		cmp = strcmp(filename, ((LXAEntry*)buffer_iter->data)->filename);
+		cmp = strcmp(filename, buffer_iter->entry->filename);
 
 		if(!cmp)
-			return buffer_iter->data;
+			return buffer_iter->entry;
 		if(cmp < 0)
 			break;
 	}
@@ -342,6 +315,9 @@
 void
 lxa_entry_flush_buffer(LXAEntry *entry)
 {
+	if(!entry->buffer)
+		return;
+
 	guint max_children = 0;
 	guint begin = 0;
 	guint pos = 0;
@@ -349,10 +325,10 @@
 	guint old_i = 0;
 	guint new_i = 0;
 	guint size = entry->n_children;
-	GSList *buffer_iter = NULL;
+	LXASList *buffer_iter = NULL;
 	LXAEntry **children_old = (LXAEntry **)entry->children;
 
-	max_children = (entry->n_children + g_slist_length(entry->buffer));
+	max_children = (entry->n_children + lxa_slist_length(entry->buffer));
 	
 	entry->children = g_new(LXAEntry *, max_children);
 	for(buffer_iter = entry->buffer;buffer_iter;buffer_iter = buffer_iter->next)
@@ -362,7 +338,7 @@
 		{
 			pos = (size / 2);
 
-			cmp = strcmp(((LXAEntry *)buffer_iter->data)->filename, children_old[pos+begin]->filename);
+			cmp = strcmp(buffer_iter->entry->filename, children_old[pos+begin]->filename);
 			if(!cmp)
 				break;
 
@@ -386,7 +362,7 @@
 			{
 				entry->children[new_i++] = children_old[old_i++];
 			}
-			entry->children[new_i++] = buffer_iter->data;
+			entry->children[new_i++] = buffer_iter->entry;
 		}
 	}
 	while(old_i < entry->n_children)
@@ -395,8 +371,7 @@
 	}
 	entry->n_children = new_i;
 	
-	if(entry->buffer)
-		g_slist_free(entry->buffer);
+	lxa_slist_free(entry->buffer);
 	entry->buffer = NULL;
 
 	g_free(children_old);
@@ -405,12 +380,13 @@
 guint lxa_entry_children_length(LXAEntry *entry)
 {
 	g_return_val_if_fail(entry, 0);
-	return entry->n_children;
+	return entry->n_children + lxa_slist_length(entry->buffer);
 }
 
 LXAEntry *lxa_entry_children_nth_data(LXAEntry *entry, guint n)
 {
 	g_return_val_if_fail(entry, NULL);
+	lxa_entry_flush_buffer(entry);
 	g_return_val_if_fail(n >= 0 && n < entry->n_children, NULL);
 	return entry->children[n];
 }

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h	2006-10-05 11:07:34 UTC (rev 23289)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h	2006-10-05 13:44:18 UTC (rev 23290)
@@ -31,8 +31,11 @@
 	LXA_ARCHIVESTATUS_USERBREAK
 } LXAArchiveStatus;
 
+
 typedef struct _LXAEntry LXAEntry;
 
+#include "slist.h"
+
 struct _LXAEntry {
 	gchar *filename;
 	gboolean is_folder;
@@ -40,7 +43,7 @@
 	/* */
 	LXAEntry **children;
 	guint   n_children;
-	GSList *buffer;
+	LXASList *buffer;
 };
 
 #define LXA_ARCHIVE(obj)         ( \

Added: xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c	                        (rev 0)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c	2006-10-05 13:44:18 UTC (rev 23290)
@@ -0,0 +1,60 @@
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "archive.h"
+
+LXASList *
+lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry)
+{
+	gint cmp = 1;
+	LXASList *iter = list;
+	LXASList *prev_entry = NULL;
+	LXASList *new_entry = NULL;
+
+	for(; iter; iter = iter->next)
+	{
+		cmp = strcmp(entry->filename, ((LXAEntry*)iter->entry)->filename);
+
+		if(!cmp)
+		{
+			/* TODO: merge same as in flush */
+			return;
+		}
+		if(cmp < 0)
+			break;
+
+		prev_entry = iter;
+	}
+
+	new_entry = g_new(LXASList, 1);
+	new_entry->next = iter;
+	new_entry->entry = entry;
+
+	if(!prev_entry)
+		return new_entry;
+	
+	prev_entry->next = new_entry;
+	return list;
+}
+
+guint
+lxa_slist_length(LXASList *list)
+{
+	guint size = 0;
+	for(; list; list = list->next)
+		size++;
+	return size;
+}
+
+void
+lxa_slist_free(LXASList *list)
+{
+	LXASList *next;
+	for(; list; list = next)
+	{
+		next = list->next;
+		g_free(list);
+	}
+}
+

Added: xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h	                        (rev 0)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h	2006-10-05 13:44:18 UTC (rev 23290)
@@ -0,0 +1,17 @@
+
+typedef struct _LXASList LXASList;
+
+struct _LXASList {
+	LXAEntry *entry;
+	LXASList *next;
+};
+
+LXASList *
+lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry);
+
+guint
+lxa_slist_length(LXASList *list);
+
+void
+lxa_slist_free(LXASList *list);
+

Modified: xarchiver/branches/xarchiver-psybsd/src/archive_store.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-05 11:07:34 UTC (rev 23289)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-05 13:44:18 UTC (rev 23290)
@@ -1,20 +1,20 @@
-/*
- *  Copyright (c) 2006 Stephan Arts <psybsd at gmail.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU Library General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
+	/*
+	 *  Copyright (c) 2006 Stephan Arts <psybsd at gmail.com>
+	 *
+	 *  This program is free software; you can redistribute it and/or modify
+	 *  it under the terms of the GNU General Public License as published by
+	 *  the Free Software Foundation; either version 2 of the License, or
+	 *  (at your option) any later version.
+	 *
+	 *  This program is distributed in the hope that it will be useful,
+	 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+	 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	 *  GNU Library General Public License for more details.
+	 *
+	 *  You should have received a copy of the GNU General Public License
+	 *  along with this program; if not, write to the Free Software
+	 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+	 */
 
 #include <config.h>
 #include <string.h>
@@ -79,9 +79,9 @@
 	if(xa_archive_store_type)
 		return xa_archive_store_type;
 
- 	if (!xa_archive_store_type)
+	if (!xa_archive_store_type)
 	{
- 		static const GTypeInfo xa_archive_store_info = 
+		static const GTypeInfo xa_archive_store_info = 
 		{
 			sizeof (XAArchiveStoreClass),
 			(GBaseInitFunc) NULL,
@@ -113,16 +113,16 @@
 {
 	iface->get_flags       = xa_archive_store_get_flags;
 	iface->get_n_columns   = xa_archive_store_get_n_columns;
-  iface->get_column_type = xa_archive_store_get_column_type;
-  iface->get_iter        = xa_archive_store_get_iter;
-  iface->get_path        = xa_archive_store_get_path;
-  iface->get_value       = xa_archive_store_get_value;
-  iface->iter_next       = xa_archive_store_iter_next;
-  iface->iter_children   = xa_archive_store_iter_children;
-  iface->iter_has_child  = xa_archive_store_iter_has_child;
-  iface->iter_n_children = xa_archive_store_iter_n_children;
-  iface->iter_nth_child  = xa_archive_store_iter_nth_child;
-  iface->iter_parent     = xa_archive_store_iter_parent;
+	iface->get_column_type = xa_archive_store_get_column_type;
+	iface->get_iter        = xa_archive_store_get_iter;
+	iface->get_path        = xa_archive_store_get_path;
+	iface->get_value       = xa_archive_store_get_value;
+	iface->iter_next       = xa_archive_store_iter_next;
+	iface->iter_children   = xa_archive_store_iter_children;
+	iface->iter_has_child  = xa_archive_store_iter_has_child;
+	iface->iter_n_children = xa_archive_store_iter_n_children;
+	iface->iter_nth_child  = xa_archive_store_iter_nth_child;
+	iface->iter_parent     = xa_archive_store_iter_parent;
 }
 
 static void
@@ -148,7 +148,7 @@
 {
 	g_return_val_if_fail(XA_IS_ARCHIVE_STORE(tree_model), (GtkTreeModelFlags)0);
 
-  return (GTK_TREE_MODEL_LIST_ONLY | GTK_TREE_MODEL_ITERS_PERSIST);
+	return (GTK_TREE_MODEL_LIST_ONLY | GTK_TREE_MODEL_ITERS_PERSIST);
 }
 
 static gint
@@ -177,6 +177,8 @@
 
 	g_return_val_if_fail(index < store->n_columns, G_TYPE_INVALID);
 
+	g_debug("xa_archive_store_get_column_type {%i} = %i", index, store->column_types[index]);
+
 	return store->column_types[index];
 }
 
@@ -187,12 +189,15 @@
 
 	XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
 	LXAArchive *archive = store->archive;
-	LXAEntry *entry = store->current_entry->data;
 
-	g_return_val_if_fail(archive, FALSE);
-	g_return_val_if_fail(entry, FALSE);
+	LXAEntry *entry = NULL;
+	if(!store->current_entry)
+		return FALSE;
+	else
+		entry = store->current_entry->data;
 
-  gint *indices = gtk_tree_path_get_indices(path);
+
+	gint *indices = gtk_tree_path_get_indices(path);
 	gint depth = gtk_tree_path_get_depth(path) - 1;
 
 	/* only support list: depth is always 0 */
@@ -221,6 +226,9 @@
 	iter->user_data = entry;
 	iter->user_data2 = store->current_entry->data;
 	iter->user_data3 = GINT_TO_POINTER(index);
+
+	g_debug("xa_archive_store_get_iter {%i, %s}", index, entry->filename);
+
 	return TRUE;
 }
 
@@ -244,6 +252,8 @@
 	GtkTreePath *path = gtk_tree_path_new();
 	gtk_tree_path_append_index(path, pos);
 
+	g_debug("xa_archive_store_get_path = %i", pos);
+
 	return path;
 }
 
@@ -253,6 +263,8 @@
 static void 
 xa_archive_store_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value)
 {
+	g_debug("xa_archive_store_get_value (%i)", column);
+
 	g_return_if_fail (XA_IS_ARCHIVE_STORE (tree_model));
 
 	XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
@@ -341,17 +353,22 @@
 	
 	entry = lxa_entry_children_nth_data(entry, pos);
 
-	g_return_val_if_fail(entry, FALSE);
+	if(!entry)
+		return FALSE;
 
 	iter->stamp = store->stamp;
 	iter->user_data = entry;
 	iter->user_data3 = GINT_TO_POINTER(pos);
+
+	g_debug("xa_archive_store_iter_next {%i, %s}", pos, entry->filename);
 	return TRUE;
 }
 
 static gboolean
 xa_archive_store_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent)
 {
+	g_debug("xa_archive_store_iter_children (%x)", parent);
+
 	g_return_val_if_fail(XA_IS_ARCHIVE_STORE(tree_model), FALSE);
 
 	XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
@@ -407,6 +424,7 @@
 	/* only support lists: iter is always NULL */
 	g_return_val_if_fail(iter == NULL, FALSE);
 
+	g_debug("xa_archive_store_iter_n_children = %i", lxa_entry_children_length(entry) + (&archive->root_entry == entry)?0:1);
 	return lxa_entry_children_length(entry) + (&archive->root_entry == entry)?0:1;
 }
 
@@ -444,6 +462,7 @@
 	iter->user_data2 = store->current_entry->data;
 	iter->user_data3 = GINT_TO_POINTER(n);
 
+	g_debug("xa_archive_store_iter_nth_child {%i}", n);
 	return TRUE;
 }
 
@@ -486,6 +505,7 @@
 	*/
 	tree_model->props._show_icons = show_icons;
 
+	xa_archive_store_set_contents(tree_model, archive);
 
 	return GTK_TREE_MODEL(tree_model);
 }
@@ -508,7 +528,7 @@
 	g_return_if_fail(archive);
 	g_return_if_fail(entry);
 
-  gint *indices = gtk_tree_path_get_indices(path);
+	gint *indices = gtk_tree_path_get_indices(path);
 	gint depth = gtk_tree_path_get_depth(path) - 1;
 
 	/* only support list: depth is always 0 */
@@ -522,7 +542,10 @@
 	GtkTreeIter *iter = NULL;
 
 	if(&archive->root_entry != entry)
+	{
+		prev_size++;
 		index--;
+	}
 
 	if(index == -1)
 	{
@@ -541,8 +564,7 @@
 
 	new_size = lxa_entry_children_length(entry);
 
-	if(&archive->root_entry != entry)
-	{
+	if(&archive->root_entry != entry) { 
 		path_ = gtk_tree_path_new();
 		gtk_tree_path_append_index(path_, 0);
 
@@ -606,13 +628,40 @@
 void
 xa_archive_store_set_contents(XAArchiveStore *store, LXAArchive *archive)
 {
-	g_return_if_fail(store);
-	g_return_if_fail(archive);
-
-	gint i= 0;
+	gint i = 0;
 	GtkTreePath *path_ = NULL;
 	GtkTreeIter *iter = NULL;
+	g_return_if_fail(store);
 
+	LXAEntry *entry = NULL;
+	gint prev_size =  0;
+
+	if(store->current_entry)
+	{
+		entry = store->current_entry->data;
+		prev_size = lxa_entry_children_length(entry);
+		
+
+		if(&store->archive->root_entry != entry)
+			prev_size++;
+
+	}
+
+	if(!archive)
+	{
+
+		for(i = 0; i < prev_size; i++)
+		{
+			path_ = gtk_tree_path_new();
+			gtk_tree_path_append_index(path_, i);
+
+			gtk_tree_model_row_deleted(GTK_TREE_MODEL(store), path_);
+		}
+
+		store->archive = NULL;
+		store->current_entry = NULL;
+		return;
+	}
 	store->archive = archive;
 	store->current_entry = g_slist_prepend(NULL, &archive->root_entry);
 
@@ -626,7 +675,7 @@
 
 	memcpy(store->column_types + 1, archive->column_types, archive->column_number);
 
-	for(; i < lxa_entry_children_length(&archive->root_entry); i++)
+	for(i = 0; i < lxa_entry_children_length(&archive->root_entry); i++)
 	{
 		path_ = gtk_tree_path_new();
 		gtk_tree_path_append_index(path_, i);

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-10-05 11:07:34 UTC (rev 23289)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-10-05 13:44:18 UTC (rev 23290)
@@ -569,7 +569,8 @@
 	GtkTreeModel *liststore = window->treemodel;
 	GList *columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(window->treeview));
 
-	gtk_list_store_clear(GTK_LIST_STORE(liststore));
+	//gtk_list_store_clear(GTK_LIST_STORE(liststore));
+	xa_archive_store_set_contents(XA_ARCHIVE_STORE(liststore), NULL);
 
 	while(columns)
 	{
@@ -707,8 +708,8 @@
 {
 	GtkCellRenderer *renderer = NULL;
 	GtkTreeViewColumn *column = NULL;
-	GtkListStore *liststore = NULL;
-	//GtkTreeModel *liststore = NULL;
+	//GtkListStore *liststore = NULL;
+	GtkTreeModel *liststore = NULL;
 	LXAArchive *archive = window->lp_xa_archive;
 	gint x = 0;
 	GList *columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(window->treeview));
@@ -727,8 +728,8 @@
 			column_types[x+1] = archive->column_types[x];
 		}
 		column_types[0] = G_TYPE_STRING;
-		liststore = gtk_list_store_newv(archive->column_number+1, column_types); 
-//		liststore = xa_archive_store_new(archive, TRUE);
+		//liststore = gtk_list_store_newv(archive->column_number+1, column_types); 
+		liststore = xa_archive_store_new(NULL /*archive*/, TRUE);
 
 		renderer = gtk_cell_renderer_pixbuf_new();
 		column = gtk_tree_view_column_new_with_attributes("", renderer, "icon-name", 0, NULL);
@@ -752,8 +753,8 @@
 		gtk_tree_view_set_search_column(GTK_TREE_VIEW(window->treeview), 1);
 	} else
 	{
-		liststore = gtk_list_store_newv(archive->column_number, archive->column_types); 
-		//liststore = xa_archive_store_new(archive, FALSE);
+		//liststore = gtk_list_store_newv(archive->column_number, archive->column_types); 
+		liststore = xa_archive_store_new(archive, FALSE);
 		for(x = 0; x < archive->column_number; x++)
 		{
 			switch(archive->column_types[x])
@@ -772,6 +773,7 @@
 	}
 	gtk_tree_view_set_model(GTK_TREE_VIEW(window->treeview), GTK_TREE_MODEL(liststore));
 	window->treemodel = GTK_TREE_MODEL(liststore);
+	xa_archive_store_set_contents(XA_ARCHIVE_STORE(liststore), archive);
 }
 
 void
@@ -785,10 +787,10 @@
 
 	gtk_tree_view_set_model(GTK_TREE_VIEW(main_window->treeview), NULL);
 
-	gtk_list_store_clear(GTK_LIST_STORE(liststore));
+	//gtk_list_store_clear(GTK_LIST_STORE(liststore));
+	xa_archive_store_set_contents(XA_ARCHIVE_STORE(liststore), NULL);
 
-	lxa_entry_flush_buffer(((LXAEntry *)main_window->working_node->data));
-
+/*
 	for(i=0;i<((LXAEntry *)main_window->working_node->data)->n_children; i++)
 		xa_main_window_add_item(((LXAEntry *)main_window->working_node->data)->children[i], main_window);
 
@@ -807,6 +809,7 @@
 		else
 			gtk_list_store_set_value(GTK_LIST_STORE(liststore), &iter, 0, main_window->parent_node);
 	}
+*/
 /*
 	if(g_slist_length(main_window->working_node) > 1)
 		xa_archive_store_set_contents(XA_ARCHIVE_STORE(liststore), item_tree, FALSE);



More information about the Xfce4-commits mailing list