[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