[Xfce4-commits] [apps/squeeze] 02/03: Open archive connected to the new ui

noreply at xfce.org noreply at xfce.org
Sun Nov 16 16:58:17 CET 2014


This is an automated email from the git hooks/post-receive script.

peter pushed a commit to branch stephan/new-ui
in repository apps/squeeze.

commit 0c4e85dea8df7c73c0eddac3abf2a37d910195ed
Author: Peter de Ridder <peter at xfce.org>
Date:   Sat Nov 1 23:43:05 2014 +0100

    Open archive connected to the new ui
---
 libsqueeze/support-info.c |    2 +-
 src/archive_store.c       |  411 ++++++++------------------
 src/archive_store.h       |   85 ++----
 src/main.c                |    3 -
 src/main_window.c         |  715 ++++++++++++++++++++++++++++++---------------
 src/main_window.h         |   39 +--
 src/main_window_ui.xml    |   18 +-
 7 files changed, 675 insertions(+), 598 deletions(-)

diff --git a/libsqueeze/support-info.c b/libsqueeze/support-info.c
index 74071eb..f923ba3 100644
--- a/libsqueeze/support-info.c
+++ b/libsqueeze/support-info.c
@@ -192,5 +192,5 @@ lsq_support_info_get_all ( void )
 GList *
 lsq_support_info_get_all_mime_types ( void )
 {
-    return g_hash_table_get_values( lsq_support_info_table );
+    return g_hash_table_get_keys( lsq_support_info_table );
 }
diff --git a/src/archive_store.c b/src/archive_store.c
index f38979a..fc8862b 100644
--- a/src/archive_store.c
+++ b/src/archive_store.c
@@ -43,20 +43,10 @@ sq_archive_store_dispose(GObject *object);
 
 /* properties */
 enum {
-	SQ_ARCHIVE_STORE_SHOW_ICONS = 1,
-	SQ_ARCHIVE_STORE_SORT_FOLDERS_FIRST,
+	SQ_ARCHIVE_STORE_SORT_FOLDERS_FIRST = 1,
 	SQ_ARCHIVE_STORE_SORT_CASE_SENSITIVE
 };
 
-/* signals */
-enum {
-	SQ_ARCHIVE_STORE_SIGNAL_PWD_CHANGED = 0,
-	SQ_ARCHIVE_STORE_SIGNAL_NEW_ARCHIVE,
-	SQ_ARCHIVE_STORE_SIGNAL_FILE_ACTIVATED,
-	SQ_ARCHIVE_STORE_SIGNAL_COUNT
-};
-static gint sq_archive_store_signals[SQ_ARCHIVE_STORE_SIGNAL_COUNT];
-
 static GObjectClass *parent_class;
 
 static void
@@ -90,12 +80,6 @@ sq_archive_store_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, Gt
 static gboolean
 sq_archive_store_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child);
 
-static void
-sq_archive_store_file_activated(SQArchiveStore *store, GtkTreePath *path);
-
-static void
-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);
@@ -118,14 +102,33 @@ static GIcon *
 sq_archive_store_get_icon_name_for_iter(SQArchiveStore *store, LSQArchiveIter *iter);
 
 static void
-sq_archive_store_check_trailing(SQArchiveStore *store);
-
-static void
 sq_archive_store_refresh(SQArchiveStore *store);
 
 static void
 cb_sq_archive_store_archive_refreshed(LSQArchive *archive, gpointer user_data);
 
+struct _SQArchiveStore
+{
+    GObject parent;
+    gint stamp;
+    LSQArchive *archive;
+    LSQArchiveIter *entry;
+
+    gint sort_column;
+    GtkSortType sort_order;
+    LSQArchiveIter **sort_list;
+    guint list_size;
+    struct {
+        guint _sort_folders_first : 1;
+        guint _sort_case_sensitive : 1;
+    } props;
+};
+
+struct _SQArchiveStoreClass
+{
+    GObjectClass parent_class;
+};
+
 GType
 sq_archive_store_get_type(void)
 {
@@ -209,7 +212,6 @@ sq_archive_store_init(SQArchiveStore *as)
 	as->sort_column = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
 	as->sort_order = GTK_SORT_ASCENDING;
 	as->sort_list = NULL;
-	as->props._show_icons = 0;
 	as->props._sort_folders_first = 1;
 	as->props._sort_case_sensitive = 1;
 }
@@ -226,13 +228,6 @@ sq_archive_store_class_init(SQArchiveStoreClass *as_class)
 
     parent_class = g_type_class_peek_parent(as_class);
 
-	pspec = g_param_spec_boolean("show-icons",
-		_("Show mime icons"),
-		_("Show the mime type icons for each entry"),
-		FALSE,
-		G_PARAM_READWRITE);
-	g_object_class_install_property(object_class, SQ_ARCHIVE_STORE_SHOW_ICONS, pspec);
-
 	pspec = g_param_spec_boolean("sort-folders-first",
 		_("Sort folders before files"),
 		_("The folders will be put at the top of the list"),
@@ -254,9 +249,6 @@ sq_archive_store_set_property(GObject *object, guint prop_id, const GValue *valu
 	SQArchiveStore *store = SQ_ARCHIVE_STORE(object);
 	switch(prop_id)
 	{
-		case SQ_ARCHIVE_STORE_SHOW_ICONS:
-			sq_archive_store_set_show_icons(store, g_value_get_boolean(value));
-			break;
 		case SQ_ARCHIVE_STORE_SORT_FOLDERS_FIRST:
 			sq_archive_store_set_sort_folders_first(store, g_value_get_boolean(value));
 			break;
@@ -271,9 +263,6 @@ sq_archive_store_get_property(GObject *object, guint prop_id, GValue *value, GPa
 {
 	switch(prop_id)
 	{
-		case SQ_ARCHIVE_STORE_SHOW_ICONS:
-			g_value_set_boolean(value, SQ_ARCHIVE_STORE(object)->props._show_icons?TRUE:FALSE);
-			break;
 		case SQ_ARCHIVE_STORE_SORT_FOLDERS_FIRST:
 			g_value_set_boolean(value, SQ_ARCHIVE_STORE(object)->props._sort_folders_first?TRUE:FALSE);
 			break;
@@ -384,7 +373,6 @@ sq_archive_store_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter)
 {
 	SQArchiveStore *store;
 	LSQArchive *archive;
-	LSQArchiveIter *entry;
 	gint pos;
 	GtkTreePath *path;
 
@@ -395,12 +383,8 @@ sq_archive_store_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter)
 
 	g_return_val_if_fail(archive, NULL);
 
-	entry = (LSQArchiveIter *)iter->user_data;
 	pos = GPOINTER_TO_INT(iter->user_data3);
 
-	if(store->props._show_up_dir && lsq_archive_iter_has_parent(entry))
-		pos++;
-
 	path = gtk_tree_path_new();
 	gtk_tree_path_append_index(path, pos);
 
@@ -409,75 +393,58 @@ sq_archive_store_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter)
 
 
 static void 
-sq_archive_store_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value)
+sq_archive_store_get_value (
+        GtkTreeModel *tree_model,
+        GtkTreeIter *iter,
+        gint column,
+        GValue *value
+    )
 {
-	SQArchiveStore *store;
-	LSQArchive *archive;
-	LSQArchiveIter *parent, *entry;
-    g_debug("%s\n", __FUNCTION__);
-
-	g_return_if_fail (SQ_IS_ARCHIVE_STORE (tree_model));
-
-	store = SQ_ARCHIVE_STORE(tree_model);
-	archive = store->archive;
-	entry = iter->user_data;
-
-	g_return_if_fail(archive);
-
-	if(entry)
-	{
-		switch(column)
-		{
-			case SQ_ARCHIVE_STORE_EXTRA_PROP_PATH:
-				g_value_init(value, G_TYPE_STRING);
-
-				parent = lsq_archive_iter_get_parent(entry);
-				g_value_take_string(value, lsq_archive_iter_get_path(parent));
-				lsq_archive_iter_unref(parent);
-			break;
-			case SQ_ARCHIVE_STORE_EXTRA_PROP_ICON:
-				g_value_init(value, G_TYPE_ICON);
-
-				if(store->props._show_icons)
-					g_value_take_object(value, sq_archive_store_get_icon_name_for_iter(store, entry));
-			break;
-			case LSQ_ARCHIVE_PROP_FILENAME + SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT:
-				if(store->props._show_full_path)
-				{
-					g_value_init(value, G_TYPE_STRING);
-					g_value_take_string(value, lsq_archive_iter_get_path(entry));
-					if(!g_utf8_validate(g_value_get_string(value), -1, NULL))
-						g_value_take_string(value, g_convert(g_value_get_string(value), -1, "UTF-8", "WINDOWS-1252", NULL, NULL, NULL));
-					break;
-				}
-			default:
-				column -= SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT;
-				if(column < (gint)lsq_archive_n_entry_properties(archive))
-					lsq_archive_iter_get_prop_value(entry, column, value);
-				/* what if it isn't utf-8 */
-				if(G_VALUE_HOLDS_STRING(value) && g_value_get_string(value) && !g_utf8_validate(g_value_get_string(value), -1, NULL))
-					g_value_take_string(value, g_convert(g_value_get_string(value), -1, "UTF-8", "WINDOWS-1252", NULL, NULL, NULL));
-			break;
-		}
-	}
-	else
-	{
-		switch(column)
-		{
-			case SQ_ARCHIVE_STORE_EXTRA_PROP_ICON:
-				g_value_init(value, G_TYPE_ICON);
-				if(store->props._show_icons)
-					g_value_take_object(value, g_themed_icon_new(GTK_STOCK_GO_UP));
-			break;
-			case LSQ_ARCHIVE_PROP_FILENAME + SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT:
-				g_value_init(value, G_TYPE_STRING);
-				g_value_set_string(value, "..");
-			break;
-			default:
-				g_value_init(value, lsq_archive_get_entry_property_type(archive, column - SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT));
-			break;
-		}
-	}
+    SQArchiveStore *store;
+    LSQArchive *archive;
+    LSQArchiveIter *parent, *entry;
+    g_debug( "%s\n", __FUNCTION__ );
+
+    g_return_if_fail( SQ_IS_ARCHIVE_STORE( tree_model ) );
+
+    store = SQ_ARCHIVE_STORE( tree_model );
+    archive = store->archive;
+    entry = iter->user_data;
+
+    g_return_if_fail( entry );
+
+    g_return_if_fail( archive );
+
+    switch ( column )
+    {
+        case SQ_ARCHIVE_STORE_EXTRA_PROP_PATH:
+            g_value_init( value, G_TYPE_STRING );
+
+            parent = lsq_archive_iter_get_parent( entry );
+            g_value_take_string( value, lsq_archive_iter_get_path( parent ) );
+            lsq_archive_iter_unref( parent );
+            break;
+
+        case SQ_ARCHIVE_STORE_EXTRA_PROP_FULL_PATH:
+            g_value_init( value, G_TYPE_STRING );
+            g_value_take_string( value, lsq_archive_iter_get_path( entry ) );
+            break;
+
+        case SQ_ARCHIVE_STORE_EXTRA_PROP_ICON:
+            g_value_init( value, G_TYPE_ICON );
+
+            g_value_take_object( value, sq_archive_store_get_icon_name_for_iter( store, entry ) );
+            break;
+
+        default:
+            column -= SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT;
+            if ( column < (gint)lsq_archive_n_entry_properties( archive ) )
+                lsq_archive_iter_get_prop_value( entry, column, value );
+            break;
+    }
+    /* what if it isn't utf-8 */
+    if ( G_VALUE_HOLDS_STRING( value ) && g_value_get_string( value ) && ! g_utf8_validate( g_value_get_string( value ), -1, NULL ) )
+        g_value_take_string( value, g_convert( g_value_get_string( value ), -1, "UTF-8", "WINDOWS-1252", NULL, NULL, NULL ) );
 }
 
 static gboolean
@@ -530,19 +497,11 @@ sq_archive_store_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, Gtk
 
 #ifdef DEBUG
 	g_return_val_if_fail(archive, FALSE);
-	g_return_val_if_fail(entry, FALSE);
 #endif
 
 	/* only support lists: parent is always NULL */
 	g_return_val_if_fail(parent == NULL, FALSE);
 
-	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
@@ -551,7 +510,6 @@ sq_archive_store_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, Gtk
 		g_return_val_if_fail(entry, FALSE);
 	
 		iter->user_data3 = GINT_TO_POINTER(0);
-	}
 
 	iter->stamp = store->stamp;
 	iter->user_data = entry;
@@ -571,7 +529,6 @@ sq_archive_store_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter)
 {
 	SQArchiveStore *store;
 	LSQArchive *archive;
-	LSQArchiveIter *entry;
 
     g_debug("%s\n", __FUNCTION__);
 
@@ -584,7 +541,6 @@ sq_archive_store_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter)
 
 #ifdef DEBUG
 	g_return_val_if_fail(archive, 0);
-	g_return_val_if_fail(entry, 0);
 #endif
 
 	/* only support lists: iter is always NULL */
@@ -610,22 +566,12 @@ sq_archive_store_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, Gt
 
 #ifdef DEBUG
 	g_return_val_if_fail(archive, FALSE);
-	g_return_val_if_fail(entry, FALSE);
 	g_return_val_if_fail(iter, FALSE);
 #endif
 
 	/* only support lists: parent is always NULL */
 	g_return_val_if_fail(parent == NULL, FALSE);
 
-	if(store->props._show_up_dir && lsq_archive_iter_has_parent(entry))
-		n--;
-
-	if(n == -1)
-	{
-		entry = NULL;
-	}
-	else
-	{
 		if(store->sort_list)
 			entry = store->sort_list[n];
 		else
@@ -633,7 +579,6 @@ sq_archive_store_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, Gt
 	
 		if(!entry)
 			return FALSE;
-	}
 
 	iter->stamp = store->stamp;
 	iter->user_data = entry;
@@ -796,8 +741,8 @@ sq_archive_entry_compare(SQArchiveStore *store, LSQArchiveIter *a, LSQArchiveIte
 static void
 sq_archive_store_sort(SQArchiveStore *store)
 {
-	LSQArchiveIter *pentry;
-	guint psize;
+	LSQArchiveIter *entry;
+	guint size;
 	guint i = 0;
 
 	if(store->sort_list)
@@ -811,18 +756,25 @@ sq_archive_store_sort(SQArchiveStore *store)
 		store->sort_list = NULL;
 	}
 
-	store->sort_list = g_new(LSQArchiveIter *, psize+1);
+#ifdef DEBUG
+	g_return_if_fail(store->entry);
+#endif
+
+	entry = store->entry;
+	size = lsq_archive_iter_n_children(entry);
 
-	for(i = 0; i < psize; ++i)
+	store->sort_list = g_new(LSQArchiveIter *, size+1);
+
+	for(i = 0; i < size; ++i)
 	{
-		store->sort_list[i] = lsq_archive_iter_nth_child(pentry, i);
+		store->sort_list[i] = lsq_archive_iter_nth_child(entry, i);
 	}
-	if(psize && store->sort_column >= SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT)
+	if(size && store->sort_column >= SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT)
 	{
-		sq_archive_quicksort(store, 0, psize-1);
-		sq_archive_insertionsort(store, 0, psize-1);
+		sq_archive_quicksort(store, 0, size-1);
+		sq_archive_insertionsort(store, 0, size-1);
 	}
-	store->sort_list[psize] = NULL;
+	store->sort_list[size] = NULL;
 }
 
 static inline void
@@ -898,27 +850,17 @@ sq_archive_store_get_icon_name_for_iter(SQArchiveStore *store, LSQArchiveIter *i
     return g_content_type_get_icon( lsq_archive_iter_get_content_type( iter ) );
 }
 
-GtkTreeModel *
-sq_archive_store_new(gboolean show_icons, gboolean show_up_dir)
+SQArchiveStore *
+sq_archive_store_new (void)
 {
-	SQArchiveStore *tree_model;
-
-	tree_model = g_object_new(SQ_TYPE_ARCHIVE_STORE, NULL);
+    SQArchiveStore *store;
 
-	tree_model->props._show_icons = show_icons?1:0;
-	tree_model->props._show_up_dir = show_up_dir?1:0;
+    store = g_object_new( SQ_TYPE_ARCHIVE_STORE, NULL );
 
-	if(tree_model->props._sort_folders_first)
-		tree_model->sort_column = SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT + LSQ_ARCHIVE_PROP_FILENAME;
+    if ( store->props._sort_folders_first )
+        store->sort_column = SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT + LSQ_ARCHIVE_PROP_FILENAME;
 
-	return GTK_TREE_MODEL(tree_model);
-}
-
-void
-sq_archive_store_connect_treeview(SQArchiveStore *store, GtkTreeView *treeview)
-{
-	store->treeview = treeview;
-	g_signal_connect(G_OBJECT(treeview), "row-activated", G_CALLBACK(cb_sq_archive_store_row_activated), store);
+    return store;
 }
 
 static void
@@ -981,84 +923,6 @@ sq_archive_store_refresh(SQArchiveStore *store)
 
 	store->list_size = new_size;
 
-    printf("> %d\n", new_size);
-
-}
-
-static void
-cb_sq_archive_store_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
-{
-	sq_archive_store_file_activated(SQ_ARCHIVE_STORE(user_data), path);
-}
-
-static void
-sq_archive_store_file_activated(SQArchiveStore *store, GtkTreePath *path)
-{
-	LSQArchive *archive;
-	LSQArchiveIter *entry;
-	gint *indices;
-	gint depth;
-	gint index_;
-
-	archive = store->archive;
-
-	g_return_if_fail(archive);
-	g_return_if_fail(entry);
-
-	indices = gtk_tree_path_get_indices(path);
-	depth = gtk_tree_path_get_depth(path) - 1;
-
-	/* only support list: depth is always 0 */
-	g_return_if_fail(depth == 0);
-
-	index_ = indices[depth];
-
-	if(store->props._show_up_dir && lsq_archive_iter_has_parent(entry))
-		index_--;
-
-	if(index_ == -1)
-	{
-		entry = lsq_archive_iter_get_parent(entry);
-	}
-	else
-	{
-		if(store->sort_list)
-			entry = store->sort_list[index_];
-		else
-			entry = NULL;
-
-		g_return_if_fail(entry);
-
-		/* Signal file-activated */
-		if(!lsq_archive_iter_is_directory(entry))
-		{
-#ifdef DEBUG
-			g_debug("file clicked");
-#endif
-			g_signal_emit(store, sq_archive_store_signals[SQ_ARCHIVE_STORE_SIGNAL_FILE_ACTIVATED], 0, entry, NULL); 
-			return;
-		}
-	}
-
-	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, entry, NULL);
-}
-
-void
-sq_archive_store_go_up(SQArchiveStore *store)
-{
-	LSQArchive *archive = store->archive;
-	LSQArchiveIter *entry;
-
-	g_return_if_fail(archive);
-	g_return_if_fail(entry);
-
-	g_return_if_fail((entry = lsq_archive_iter_get_parent(entry)));
-
-	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, entry, NULL);
 }
 
 void
@@ -1066,9 +930,6 @@ sq_archive_store_set_archive(SQArchiveStore *store, LSQArchive *archive)
 {
 	guint i = 0;
 	GtkTreePath *path_ = NULL;
-	GtkTreeIter iter;
-	GList *list_iter;
-	LSQArchiveIter *root_entry;
 
 	g_return_if_fail(store);
 
@@ -1108,6 +969,8 @@ sq_archive_store_set_archive(SQArchiveStore *store, LSQArchive *archive)
 	{
 		g_signal_handlers_disconnect_by_func(store->archive, cb_sq_archive_store_archive_refreshed, store);
 		/* g_signal_handlers_disconnect_by_func(store->archive, cb_sq_archive_store_archive_path_changed, store); */
+		lsq_archive_iter_unref( store->entry );
+		store->entry = NULL;
 		g_object_unref(store->archive);
 		store->archive = NULL;
 	}
@@ -1124,57 +987,55 @@ sq_archive_store_set_archive(SQArchiveStore *store, LSQArchive *archive)
 	store->archive = archive;
     store->entry = lsq_archive_get_iter(archive, NULL);
 
+    ++store->stamp;
+
 	g_signal_connect(store->archive, "refreshed", G_CALLBACK(cb_sq_archive_store_archive_refreshed), store);
-    lsq_archive_operate( store->archive, LSQ_COMMAND_TYPE_REFRESH, NULL, NULL, NULL, NULL );
+    g_object_unref(lsq_archive_operate( store->archive, LSQ_COMMAND_TYPE_REFRESH, NULL, NULL, NULL, NULL ));
 
 }
 
 LSQArchiveIter *
-sq_archive_store_get_pwd(SQArchiveStore *store)
+sq_archive_store_get_root ( SQArchiveStore *store )
 {
-	LSQArchiveIter *iter;
 
 #ifdef DEBUG
-	g_return_val_if_fail(store, NULL);
-	g_return_val_if_fail(SQ_IS_ARCHIVE_STORE(store), NULL);
+    g_return_val_if_fail( SQ_IS_ARCHIVE_STORE( store ), NULL );
 #endif
 
-	return NULL;
+    return store->entry;
 }
 
 gboolean
-sq_archive_store_set_pwd(SQArchiveStore *store, LSQArchiveIter *path)
+sq_archive_store_set_root (
+        SQArchiveStore *store,
+        LSQArchiveIter *path
+    )
 {
-	/* should check if the iter is of the current archive */
+    /* should check if the iter is of the current archive */
 
-	g_return_val_if_fail(store, FALSE);
+    g_return_val_if_fail( SQ_IS_ARCHIVE_STORE( store ), FALSE );
 
-	if(!store->archive)
-		return FALSE;
+    if ( NULL == store->archive )
+        return FALSE;
 
-	if(lsq_archive_iter_is_directory(path))
-	{
-		sq_archive_store_sort(store);
-		sq_archive_store_refresh(store);
+    if ( NULL == path )
+        path = lsq_archive_get_iter( store->archive, NULL );
 
-		g_signal_emit(store, sq_archive_store_signals[SQ_ARCHIVE_STORE_SIGNAL_PWD_CHANGED], 0, path, NULL);
-		return TRUE;
-	}
-	else
-	{
-#ifdef DEBUG
-		g_debug("file activated");
-#endif
-		g_signal_emit(store, sq_archive_store_signals[SQ_ARCHIVE_STORE_SIGNAL_FILE_ACTIVATED], 0, lsq_archive_iter_get_filename(path), NULL); 
-	}
+    if ( ! lsq_archive_iter_is_directory( path ) )
+        return FALSE;
 
-	return FALSE;
-}
+    if ( path == store->entry )
+        return TRUE;
 
-gboolean
-sq_archive_store_get_show_icons(SQArchiveStore *store)
-{
-	return store->props._show_icons;
+    lsq_archive_iter_unref( store->entry );
+    store->entry = lsq_archive_iter_ref( path );
+
+    ++store->stamp;
+
+    sq_archive_store_sort(store);
+    sq_archive_store_refresh(store);
+
+    return TRUE;
 }
 
 gboolean
@@ -1190,20 +1051,6 @@ sq_archive_store_get_sort_folders_first(SQArchiveStore *store)
 }
 
 void
-sq_archive_store_set_show_icons(SQArchiveStore *store, gboolean show)
-{
-	show = show?1:0;
-
-	if(store->props._show_icons != show)
-	{
-		store->props._show_icons = show;
-		if(store->archive)
-			sq_archive_store_refresh(store);
-		g_object_notify(G_OBJECT(store), "show-icons");
-	}
-}
-
-void
 sq_archive_store_set_sort_case_sensitive(SQArchiveStore *store, gboolean sort)
 {
 	sort = sort?1:0;
@@ -1267,8 +1114,6 @@ static void
 cb_sq_archive_store_archive_refreshed(LSQArchive *archive, gpointer user_data)
 {
 	SQArchiveStore *store = SQ_ARCHIVE_STORE(user_data);
-	GList *iter;
-	LSQArchiveIter *aIter;
 
 
 	sq_archive_store_sort(store);
diff --git a/src/archive_store.h b/src/archive_store.h
index 191e626..49c3fa5 100644
--- a/src/archive_store.h
+++ b/src/archive_store.h
@@ -38,77 +38,56 @@
 
 typedef struct _SQArchiveStore SQArchiveStore;
 
-struct _SQArchiveStore
-{
-	GObject parent;
-	gint stamp;
-	LSQArchive *archive;
-    LSQArchiveIter *entry;
-
-	gint sort_column;
-	GtkSortType sort_order;
-	LSQArchiveIter **sort_list;
-	guint list_size;
-	GtkTreeView *treeview;
-	struct {
-		guint _show_full_path :1;
-		guint _show_icons : 1;
-		guint _show_up_dir : 1;
-		guint _sort_folders_first : 1;
-		guint _sort_case_sensitive : 1;
-	} props;
-};
-
 typedef struct _SQArchiveStoreClass SQArchiveStoreClass;
 
-struct _SQArchiveStoreClass
-{
-	GObjectClass parent_class;
-};
-
 /* archive iter extra props columns */
 enum {
 	SQ_ARCHIVE_STORE_EXTRA_PROP_PATH = 0,
+	SQ_ARCHIVE_STORE_EXTRA_PROP_FULL_PATH,
 	SQ_ARCHIVE_STORE_EXTRA_PROP_ICON,
 	SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT
 };
 
 GType sq_archive_store_get_type();
-GtkTreeModel *
-sq_archive_store_new (gboolean show_icons, gboolean show_up_dir);
-void sq_archive_store_connect_treeview(SQArchiveStore *store, GtkTreeView *treeview);
-void sq_archive_store_connect_iconview(SQArchiveStore *store, GtkIconView *iconview);
-void sq_archive_store_go_up(SQArchiveStore *store);
-LSQArchiveIter * sq_archive_store_get_pwd(SQArchiveStore *store);
-gboolean sq_archive_store_set_pwd(SQArchiveStore *store, LSQArchiveIter *path);
-void sq_archive_store_set_icon_theme(SQArchiveStore *store, GtkIconTheme *icon_theme);
-
-gboolean sq_archive_store_get_show_full_path(SQArchiveStore *);
-gboolean sq_archive_store_get_show_icons(SQArchiveStore *store);
-gboolean sq_archive_store_get_sort_case_sensitive(SQArchiveStore *store);
-gboolean sq_archive_store_get_sort_folders_first(SQArchiveStore *store);
-
-void sq_archive_store_set_show_full_path(SQArchiveStore *, gboolean);
-void sq_archive_store_set_show_icons(SQArchiveStore *, gboolean);
-void sq_archive_store_set_sort_case_sensitive(SQArchiveStore *, gboolean);
-void sq_archive_store_set_sort_folders_first(SQArchiveStore *, gboolean);
-
-LSQArchiveIter *sq_archive_store_get_archive_iter(SQArchiveStore *, GtkTreeIter *);
+SQArchiveStore *
+sq_archive_store_new (void);
 
+LSQArchiveIter *
+sq_archive_store_get_root ( SQArchiveStore * );
 gboolean
-sq_archive_store_has_history(SQArchiveStore *store);
+sq_archive_store_set_root (
+        SQArchiveStore *store,
+        LSQArchiveIter *path
+    );
+
+gboolean
+sq_archive_store_get_sort_case_sensitive ( SQArchiveStore * );
 gboolean
-sq_archive_store_has_future(SQArchiveStore *store);
+sq_archive_store_get_sort_folders_first ( SQArchiveStore * );
+
 void
-sq_archive_store_go_back(SQArchiveStore *store);
+sq_archive_store_set_sort_case_sensitive (
+        SQArchiveStore *,
+        gboolean
+    );
 void
-sq_archive_store_go_forward(SQArchiveStore *store);
+sq_archive_store_set_sort_folders_first (
+        SQArchiveStore *,
+        gboolean
+    );
+
 LSQArchiveIter *
-sq_archive_store_get_trailing(SQArchiveStore *store);
+sq_archive_store_get_archive_iter (
+        SQArchiveStore *,
+        GtkTreeIter *
+    );
 
 LSQArchive *
-sq_archive_store_get_archive(SQArchiveStore *archive_store);
+sq_archive_store_get_archive ( SQArchiveStore * );
 
-void sq_archive_store_set_archive(SQArchiveStore *archive_store, LSQArchive *archive);
+void sq_archive_store_set_archive (
+        SQArchiveStore *,
+        LSQArchive *
+    );
 
 #endif /* __SQRCHIVER_ARCHIVE_STORE_H__ */
diff --git a/src/main.c b/src/main.c
index 35b60de..c504636 100644
--- a/src/main.c
+++ b/src/main.c
@@ -89,10 +89,7 @@ main(int argc, char **argv)
     g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     gtk_widget_show_all (window);
 
-    GDK_THREADS_ENTER();
     gtk_main();
-    GDK_THREADS_LEAVE();
-    
 
     lsq_shutdown();
     xfconf_shutdown();
diff --git a/src/main_window.c b/src/main_window.c
index 52ca797..7f01ea5 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -37,274 +37,449 @@
 #define SQ_RECENT_FILES_GROUP "Accessories"
 
 static void
-sq_main_window_init(SQMainWindow *);
-static void
-sq_main_window_class_init(SQMainWindowClass *);
-static void
-sq_main_window_dispose(GObject *object);
-
-static GObjectClass *parent_class;
+sq_main_window_finalize ( GObject *object );
 
 static void
-cb_sq_main_window_open_archive (
-        GtkWidget *,
-        gpointer
-    );
+reset_columns ( GtkTreeView *treeview );
 
 static void
-cb_sq_main_window_save_copy (
-        GtkWidget *,
+cb_sq_main_window_open_archive (
+        GtkAction *,
         gpointer
     );
 
 static void
 cb_sq_main_window_properties (
-        GtkWidget *,
+        GtkAction *,
         gpointer
     );
 
 static void
 cb_sq_main_window_close (
-        GtkWidget *,
+        GtkAction *,
         gpointer
     );
 
 static void
 cb_sq_main_window_quit (
-        GtkWidget *,
+        GtkAction *,
         gpointer
     );
 
 static void
 cb_sq_main_window_preferences (
-        GtkWidget *,
+        GtkAction *,
+        gpointer
+    );
+
+static void
+cb_sq_main_window_reload (
+        GtkAction *,
         gpointer
     );
 
 static void
 cb_sq_main_window_contents (
-        GtkWidget *,
+        GtkAction *,
         gpointer
     );
 
 static void
 cb_sq_main_window_about (
-        GtkWidget *,
+        GtkAction *,
+        gpointer
+    );
+
+static void
+cb_sq_main_window_pathbar (
+        GtkToggleAction *,
+        gpointer
+    );
+
+static void
+cb_sq_main_window_toolbar (
+        GtkToggleAction *,
+        gpointer
+    );
+
+static void
+cb_sq_main_window_menubar (
+        GtkToggleAction *,
+        gpointer
+    );
+
+static void
+cb_sq_main_window_row_activated (
+        GtkTreeView *,
+        GtkTreePath *,
+	GtkTreeViewColumn *,
         gpointer
     );
 
 static GtkActionEntry action_entries[] =
 {
-/* File Menu */
-  { "file-menu",
-            NULL,
-            N_ ("_File"),
-            NULL, },
-  { "open",
-            "document-open", /* Icon-name */
-            N_ ("_Open..."), /* Label-text */
-            "<control>O", /* Keyboard shortcut */
-            N_ ("Open an archive"), /* Tooltip text */
-            G_CALLBACK (cb_sq_main_window_open_archive), },
-  { "save-copy",
-            GTK_STOCK_SAVE_AS, /* Icon-name */
-            N_ ("_Save copy..."), /* Label-text */
-            "<control>s", /* Keyboard shortcut */
-            N_ ("Save a copy of the image"), /* Tooltip text */
-            G_CALLBACK (cb_sq_main_window_save_copy), },
-  { "properties",
-            GTK_STOCK_PROPERTIES, /* Icon-name */
-            N_ ("_Properties..."), /* Label-text */
-            NULL, /* Keyboard shortcut */
-            N_ ("Show file properties"), /* Tooltip text */
-            G_CALLBACK (cb_sq_main_window_properties), },
-  { "close",
-            GTK_STOCK_CLOSE, /* Icon-name */
-            N_ ("_Close"), /* Label-text */
-            "<control>W", /* Keyboard shortcut */
-            N_ ("Close this archive"), /* Tooltip text */
-            G_CALLBACK (cb_sq_main_window_close), },
-  { "quit",
-            GTK_STOCK_QUIT, /* Icon-name */
-            N_ ("_Quit"), /* Label-text */
-            "<control>Q", /* Keyboard shortcut */
-            N_ ("Quit Squeeze"), /* Tooltip text */
-            G_CALLBACK (cb_sq_main_window_quit), },
-/* Edit Menu */
-  { "edit-menu",
-            NULL,
-            N_ ("_Edit"),
-            NULL, },
-  { "preferences",
-            GTK_STOCK_PREFERENCES, /* Icon-name */
-            N_ ("_Preferences..."), /* Label-text */
-            NULL, /* Keyboard shortcut */
-            NULL, /* Tooltip text */
-            G_CALLBACK (cb_sq_main_window_preferences), },
-/* Help Menu */
-  { "help-menu",
-            NULL,
-            N_ ("_Help"),
-            NULL, },
-  { "contents",
-            GTK_STOCK_HELP, /* Icon-name */
-            N_ ("_Contents"), /* Label-text */
-            "F1", /* Keyboard shortcut */
-            N_ ("Display squeeze user manual"), /* Tooltip text */
-            G_CALLBACK (cb_sq_main_window_contents), },
-  { "about",
-            GTK_STOCK_ABOUT,  /* Icon-name */
-            N_ ("_About"), /* Label-text */
-            NULL, /* Keyboard shortcut */
-            N_ ("Display information about squeeze"), /* Tooltip text */
-            G_CALLBACK (cb_sq_main_window_about), },
-  { "tb-menu",
-            NULL,
-            NULL,
-            NULL, }
+    /* File Menu */
+    { "file-menu",
+        NULL,
+        N_("_File"),
+        NULL },
+    { "open",
+        "document-open", /* Icon-name */
+        N_("_Open..."), /* Label-text */
+        "<control>O", /* Keyboard shortcut */
+        N_("Open an archive"), /* Tooltip text */
+        G_CALLBACK( cb_sq_main_window_open_archive ) },
+    { "properties",
+        GTK_STOCK_PROPERTIES, /* Icon-name */
+        N_("_Properties..."), /* Label-text */
+        NULL, /* Keyboard shortcut */
+        N_("Show file properties"), /* Tooltip text */
+        G_CALLBACK( cb_sq_main_window_properties ) },
+    { "close",
+        GTK_STOCK_CLOSE, /* Icon-name */
+        N_("_Close"), /* Label-text */
+        "<control>W", /* Keyboard shortcut */
+        N_("Close this archive"), /* Tooltip text */
+        G_CALLBACK( cb_sq_main_window_close ) },
+    { "quit",
+        GTK_STOCK_QUIT, /* Icon-name */
+        N_("_Quit"), /* Label-text */
+        "<control>Q", /* Keyboard shortcut */
+        N_("Quit Squeeze"), /* Tooltip text */
+        G_CALLBACK( cb_sq_main_window_quit ) },
+    /* Edit Menu */
+    { "edit-menu",
+        NULL,
+	N_("_Edit"),
+        NULL },
+    { "preferences",
+        GTK_STOCK_PREFERENCES, /* Icon-name */
+        N_("_Preferences..."), /* Label-text */
+        NULL, /* Keyboard shortcut */
+        N_("Edit Squeeze preferences"), /* Tooltip text */
+        G_CALLBACK( cb_sq_main_window_preferences ) },
+    /* View Menu */
+    { "view-menu",
+        NULL,
+        N_("_View"),
+        NULL },
+    { "reload",
+        GTK_STOCK_REFRESH, /* Icon-name */
+        N_("_Reload"), /* Label-text */
+        "<control>R", /* Keyboard shortcut */
+        N_("Reload the archive"), /* Tooltip text */
+        G_CALLBACK( cb_sq_main_window_reload ) },
+    { "view-location-selector-menu",
+        NULL,
+        N_("_Location Selector"),
+        NULL },
+    /* Help Menu */
+    { "help-menu",
+        NULL,
+        N_("_Help"),
+        NULL },
+    { "contents",
+        GTK_STOCK_HELP, /* Icon-name */
+        N_ ("_Contents"), /* Label-text */
+        "F1", /* Keyboard shortcut */
+        N_ ("Display Squeeze user manual"), /* Tooltip text */
+        G_CALLBACK( cb_sq_main_window_contents ) },
+    { "about",
+        GTK_STOCK_ABOUT,  /* Icon-name */
+        N_ ("_About"), /* Label-text */
+        NULL, /* Keyboard shortcut */
+        N_ ("Display information about Squeeze"), /* Tooltip text */
+        G_CALLBACK( cb_sq_main_window_about ) },
+    { "tb-menu",
+        NULL,
+        NULL,
+        NULL }
+};
+
+static const GtkToggleActionEntry toggle_action_entries[] =
+{
+    { "view-location-selector-pathbar",
+        NULL,
+        N_("_Pathbar Style"),
+        NULL,
+        N_("Modern approach with buttons that correspond to folders"),
+        G_CALLBACK (cb_sq_main_window_pathbar),
+        FALSE },
+    { "view-location-selector-toolbar",
+        NULL,
+        N_ ("_Toolbar Style"),
+        NULL,
+        N_ ("Traditional approach with location bar and navigation buttons"),
+        G_CALLBACK (cb_sq_main_window_toolbar),
+        FALSE },
+    { "view-menubar",
+        NULL,
+        N_("_Menubar"),
+        "<control>M",
+        N_("Change the visibility of this window's menubar"),
+        G_CALLBACK( cb_sq_main_window_menubar ),
+        TRUE }
 };
 
 
-struct _SQMainWindowPriv
+
+struct _SQMainWindow
 {
-    GtkWidget       *menubar;
+    GtkWindow parent;
 
-    GtkActionGroup        *action_group;
-    GtkUIManager          *ui_manager;
-    GtkRecentManager      *recent_manager;
+    GtkWidget *menubar;
 
-    GtkTreeModel          *archive_store;
+    GtkActionGroup   *action_group;
+    GtkUIManager     *ui_manager;
+    GtkRecentManager *recent_manager;
+
+    GtkWidget *tree_view;
+    SQArchiveStore *archive_store;
 };
 
-GType
-sq_main_window_get_type (void)
+struct _SQMainWindowClass
 {
-	static GType sq_main_window_type = 0;
-
-	if (!sq_main_window_type)
-	{
-		static const GTypeInfo sq_main_window_info = 
-		{
-			sizeof (SQMainWindowClass),
-			(GBaseInitFunc) NULL,
-			(GBaseFinalizeFunc) NULL,
-			(GClassInitFunc) sq_main_window_class_init,
-			(GClassFinalizeFunc) NULL,
-			NULL,
-			sizeof (SQMainWindow),
-			0,
-			(GInstanceInitFunc) sq_main_window_init,
-			NULL
-		};
-
-		sq_main_window_type = g_type_register_static (GTK_TYPE_WINDOW, "SQMainWindow", &sq_main_window_info, 0);
-	}
-	return sq_main_window_type;
-}
+    GtkWindowClass parent;
+};
+
+G_DEFINE_TYPE( SQMainWindow, sq_main_window, GTK_TYPE_WINDOW )
 
 static void
-sq_main_window_class_init(SQMainWindowClass *window_class)
+sq_main_window_class_init ( SQMainWindowClass *window_class )
 {
-	GObjectClass *object_class = G_OBJECT_CLASS (window_class);
-
-    parent_class = g_type_class_peek_parent(window_class);
+    GObjectClass *object_class = G_OBJECT_CLASS (window_class);
 
-	object_class->dispose	  = sq_main_window_dispose;
+    object_class->finalize = sq_main_window_finalize;
 }
 
 static void
-sq_main_window_dispose(GObject *object)
+sq_main_window_finalize ( GObject *object )
 {
-    SQMainWindow *window = SQ_MAIN_WINDOW (object);
+    SQMainWindow *window = SQ_MAIN_WINDOW( object );
 
-    if (window->priv)
-    {
-        if (window->priv->ui_manager)
-        {
-            g_object_unref (window->priv->ui_manager);
-            window->priv->ui_manager = NULL;
-        } 
+    g_object_unref( window->ui_manager );
+    g_object_unref( window->action_group );
 
-        g_free (window->priv);
-        window->priv = NULL;
-    }
-	parent_class->dispose(object);
+    g_object_unref( window->archive_store );
+
+    G_OBJECT_CLASS( sq_main_window_parent_class )->finalize( object );
 }
 
 static void
-sq_main_window_init(SQMainWindow *window)
+sq_main_window_init ( SQMainWindow *window )
 {
     GtkAccelGroup   *accel_group;
     GtkWidget       *main_vbox;
     GtkWidget       *scrolled_window;
-    GtkWidget       *tree_view;
 
-    main_vbox = gtk_vbox_new (FALSE, 0);
+    main_vbox = gtk_vbox_new( FALSE, 0 );
 
-    gtk_window_set_title (GTK_WINDOW (window), SQUEEZE_APP_TITLE);
+    gtk_window_set_title( GTK_WINDOW (window), SQUEEZE_APP_TITLE );
 
-    window->priv = g_new0(SQMainWindowPriv, 1);
-    window->priv->ui_manager = gtk_ui_manager_new ();
-    window->priv->recent_manager = gtk_recent_manager_get_default();
-    window->priv->action_group = gtk_action_group_new ("RsttoWindow");
+    /* Menu and toolbars */
+    window->ui_manager = gtk_ui_manager_new();
+    window->recent_manager = gtk_recent_manager_get_default();
+    window->action_group = gtk_action_group_new( "SqueezeWindow" );
 
-    gtk_action_group_set_translation_domain (
-            window->priv->action_group,
-            GETTEXT_PACKAGE );
-    gtk_action_group_add_actions (
-            window->priv->action_group,
+    gtk_action_group_set_translation_domain( window->action_group, GETTEXT_PACKAGE );
+    gtk_action_group_add_actions(
+            window->action_group,
             action_entries,
-            G_N_ELEMENTS (action_entries),
-            GTK_WIDGET (window) );
-
-
-    accel_group = gtk_ui_manager_get_accel_group (window->priv->ui_manager);
-    gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
-
-    gtk_ui_manager_insert_action_group (
-            window->priv->ui_manager,
-            window->priv->action_group,
-            0);
-    gtk_ui_manager_add_ui_from_string (
-            window->priv->ui_manager,
+            G_N_ELEMENTS( action_entries ),
+            window
+        );
+    gtk_action_group_add_toggle_actions(
+            window->action_group,
+            toggle_action_entries,
+            G_N_ELEMENTS( toggle_action_entries ),
+            window
+        );
+
+
+    accel_group = gtk_ui_manager_get_accel_group( window->ui_manager );
+    gtk_window_add_accel_group( GTK_WINDOW( window ), accel_group );
+
+    gtk_ui_manager_insert_action_group( window->ui_manager, window->action_group, 0 );
+    gtk_ui_manager_add_ui_from_string(
+            window->ui_manager,
             main_window_ui,
             main_window_ui_length,
-            NULL );
+            NULL
+        );
 
-    window->priv->menubar = gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu");
+    window->menubar = gtk_ui_manager_get_widget( window->ui_manager, "/main-menu" );
 
-    gtk_container_add (GTK_CONTAINER (window), main_vbox);
-    gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->menubar, FALSE, FALSE, 0);
+    gtk_container_add( GTK_CONTAINER( window ), main_vbox );
+    gtk_box_pack_start( GTK_BOX( main_vbox ), window->menubar, FALSE, FALSE, 0 );
 
-    scrolled_window = gtk_scrolled_window_new (NULL, NULL);
-    gtk_scrolled_window_set_policy (
-            GTK_SCROLLED_WINDOW (scrolled_window),
+    /* Main part of the window */
+    scrolled_window = gtk_scrolled_window_new( NULL, NULL );
+    gtk_scrolled_window_set_policy(
+            GTK_SCROLLED_WINDOW( scrolled_window ),
             GTK_POLICY_AUTOMATIC,
-            GTK_POLICY_AUTOMATIC);
-    gtk_scrolled_window_set_shadow_type (
-            GTK_SCROLLED_WINDOW (scrolled_window),
-            GTK_SHADOW_IN);
+            GTK_POLICY_AUTOMATIC
+        );
+    gtk_scrolled_window_set_shadow_type(
+            GTK_SCROLLED_WINDOW( scrolled_window ),
+            GTK_SHADOW_IN
+        );
+
+    gtk_box_pack_start( GTK_BOX( main_vbox ), scrolled_window, TRUE, TRUE, 0 );
+    window->tree_view = gtk_tree_view_new();
 
-    gtk_box_pack_start(GTK_BOX(main_vbox), scrolled_window, FALSE, FALSE, 0);
-    tree_view = gtk_tree_view_new ();
+    window->archive_store = sq_archive_store_new();
 
-    window->priv->archive_store = sq_archive_store_new (TRUE, TRUE);
+    gtk_tree_view_set_model(
+            GTK_TREE_VIEW( window->tree_view ),
+            GTK_TREE_MODEL( window->archive_store )
+	);
 
-    gtk_tree_view_set_model (
-            GTK_TREE_VIEW (tree_view),
-            GTK_TREE_MODEL (window->priv->archive_store));
+    reset_columns( GTK_TREE_VIEW( window->tree_view ) );
 
-    gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
+    g_signal_connect( G_OBJECT( window->tree_view ), "row-activated", G_CALLBACK( cb_sq_main_window_row_activated ), window );
+
+    gtk_container_add( GTK_CONTAINER( scrolled_window ), window->tree_view );
 }
 
 GtkWidget *
 sq_main_window_new (void)
 {
-	SQMainWindow *window;
+    SQMainWindow *window;
+
+    window = g_object_new( SQ_TYPE_MAIN_WINDOW, NULL );
+
+    return GTK_WIDGET( window );
+}
+
+static void
+reset_columns ( GtkTreeView *treeview )
+{
+    GtkCellRenderer *renderer;
+    GtkTreeViewColumn *column;
+    GList *columns, *iter;
+
+    columns = gtk_tree_view_get_columns( treeview );
+
+    for ( iter = columns; iter; iter = g_list_next( iter ) )
+    {
+        gtk_tree_view_remove_column( treeview, iter->data );
+    }
+
+    g_list_free( columns );
+
+    column = gtk_tree_view_column_new();
+
+    renderer = gtk_cell_renderer_pixbuf_new();
+    g_object_set(
+            G_OBJECT( renderer ),
+            "stock-size", GTK_ICON_SIZE_SMALL_TOOLBAR,
+            NULL
+        );
+    gtk_tree_view_column_pack_start( column, renderer, FALSE );
+    gtk_tree_view_column_set_attributes(
+            column, renderer,
+            "gicon", SQ_ARCHIVE_STORE_EXTRA_PROP_ICON,
+            NULL
+        );
+
+    renderer = gtk_cell_renderer_text_new();
+    gtk_tree_view_column_pack_start( column, renderer, TRUE );
+    gtk_tree_view_column_set_attributes(
+            column, renderer,
+            "text", LSQ_ARCHIVE_PROP_FILENAME + SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT,
+            NULL
+        );
+
+    gtk_tree_view_column_set_resizable( column, TRUE );
+    gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_AUTOSIZE );
+    gtk_tree_view_column_set_sort_column_id( column, LSQ_ARCHIVE_PROP_FILENAME + SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT );
+    gtk_tree_view_column_set_title(
+            column,
+            _("Name")
+        );
+    gtk_tree_view_append_column( treeview, column );
+}
+
+static void
+set_columns ( GtkTreeView *treeview, LSQArchive *archive )
+{
+    GtkCellRenderer *renderer;
+    GtkTreeViewColumn *column;
+    guint x = 0;
+
+    for ( x = LSQ_ARCHIVE_PROP_USER; x < lsq_archive_n_entry_properties( archive ); ++x )
+    {
+        switch ( lsq_archive_get_entry_property_type( archive, x ) )
+        {
+            default:
+                if ( LSQ_TYPE_DATETIME != lsq_archive_get_entry_property_type( archive, x ) )
+                {
+                    g_warn_if_reached();
+                    continue;
+                }
+            case G_TYPE_CHAR:
+            case G_TYPE_DOUBLE:
+            case G_TYPE_FLOAT:
+            case G_TYPE_INT:
+            case G_TYPE_INT64:
+            case G_TYPE_LONG:
+            case G_TYPE_STRING:
+            case G_TYPE_UINT:
+            case G_TYPE_UINT64:
+            case G_TYPE_ULONG:
+                renderer = gtk_cell_renderer_text_new();
+                column = gtk_tree_view_column_new_with_attributes(
+                        lsq_archive_get_entry_property_name( archive, x ),
+                        renderer,
+                        "text", x + SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT,
+                        NULL
+                    );
+                break;
+        }
+        gtk_tree_view_column_set_resizable( column, TRUE );
+        gtk_tree_view_column_set_sort_column_id( column, x + SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT );
+        gtk_tree_view_append_column( treeview, column );
+    }
+    gtk_tree_view_set_search_column( treeview, LSQ_ARCHIVE_PROP_FILENAME + SQ_ARCHIVE_STORE_EXTRA_PROP_COUNT );
+}
+
+
+static void
+sq_main_window_open_archive (
+        SQMainWindow *window,
+        GFile *file
+    )
+{
+    LSQArchive *archive;
+    GError *error = NULL;
+    GtkWidget *err_dialog;
 
-	window = g_object_new(SQ_TYPE_MAIN_WINDOW, NULL);
+    g_return_if_fail( file );
 
-	return GTK_WIDGET(window);
+    archive = lsq_open_archive( file, &error );
+    if ( NULL == archive )
+    {
+        err_dialog = gtk_message_dialog_new(
+                GTK_WINDOW( window ),
+                GTK_DIALOG_MODAL,
+                GTK_MESSAGE_ERROR,
+                GTK_BUTTONS_OK,
+                "%s", _("Could not open file")
+            );
+        gtk_message_dialog_format_secondary_text(
+                GTK_MESSAGE_DIALOG( err_dialog ),
+                "%s", error->message
+            );
+        gtk_dialog_run( GTK_DIALOG( err_dialog ) );
+        gtk_widget_destroy( err_dialog );
+        g_clear_error( &error );
+        return;
+    }
+
+    reset_columns( GTK_TREE_VIEW( window->tree_view ) );
+    /** Set tree-store with archive */
+    sq_archive_store_set_archive( window->archive_store, archive );
+    set_columns( GTK_TREE_VIEW( window->tree_view ), archive );
 }
 
 /** STATIC CALLBACKS **/
@@ -318,79 +493,74 @@ sq_main_window_new (void)
  */
 static void
 cb_sq_main_window_open_archive (
-        GtkWidget *widget,
+        GtkAction *action,
         gpointer   user_data
     )
 {
-    SQMainWindow *window = SQ_MAIN_WINDOW (user_data);
+    SQMainWindow *window = SQ_MAIN_WINDOW( user_data );
 
-    GtkWidget     *dialog, *err_dialog;
+    GtkWidget     *dialog;
+    GList         *mime, *iter;
     GtkFileFilter *filter;
     GFile         *file;
-    LSQArchive    *archive;
 
     gint response;
 
     filter = gtk_file_filter_new();
-
-    dialog = gtk_file_chooser_dialog_new(_("Open archive"),
-                                         GTK_WINDOW(window),
-                                         GTK_FILE_CHOOSER_ACTION_OPEN,
-                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                         GTK_STOCK_OPEN, GTK_RESPONSE_OK,
-                                         NULL);
-
-    gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), FALSE);
-
-    response = gtk_dialog_run(GTK_DIALOG(dialog));
-    gtk_widget_hide (dialog);
-    if(response == GTK_RESPONSE_OK)
+    mime = lsq_support_info_get_all_mime_types();
+    for ( iter = mime; NULL != iter; iter = g_list_next( iter ) )
+    {
+        gtk_file_filter_add_mime_type( filter, iter->data );
+    }
+    g_list_free( mime );
+
+    dialog = gtk_file_chooser_dialog_new(
+            _("Open archive"),
+            GTK_WINDOW( window ),
+            GTK_FILE_CHOOSER_ACTION_OPEN,
+            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+            GTK_STOCK_OPEN, GTK_RESPONSE_OK,
+            NULL
+        );
+
+    gtk_file_chooser_set_local_only( GTK_FILE_CHOOSER( dialog ), FALSE);
+    gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( dialog ), filter );
+
+    response = gtk_dialog_run( GTK_DIALOG( dialog ) );
+    gtk_widget_hide( dialog );
+    if ( GTK_RESPONSE_OK == response )
     {
-        file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
-        if ( file != NULL )
+        file = gtk_file_chooser_get_file( GTK_FILE_CHOOSER( dialog ) );
+        if ( NULL != file )
         {
-            archive = lsq_open_archive (file, NULL);
-            if (archive == NULL)
-            {
-                err_dialog = gtk_message_dialog_new(GTK_WINDOW(window),
-                                                GTK_DIALOG_MODAL,
-                                                GTK_MESSAGE_ERROR,
-                                                GTK_BUTTONS_OK,
-                                                _("Could not open file"));
-                gtk_dialog_run(GTK_DIALOG(err_dialog));
-                gtk_widget_destroy(err_dialog);
-                return;
-            }
-             
-            /** Set tree-store with archive */
-            sq_archive_store_set_archive (window->priv->archive_store, archive);
+            sq_main_window_open_archive( window, file );
         }
     }
-    return;
+    gtk_widget_destroy( dialog );
 }
 
 static void
-cb_sq_main_window_save_copy (
-        GtkWidget *widget,
+cb_sq_main_window_properties (
+        GtkAction *action,
         gpointer   user_data
     )
 {
     return;
 }
 
+
 static void
-cb_sq_main_window_properties (
-        GtkWidget *widget,
+cb_sq_main_window_close (
+        GtkAction *action,
         gpointer   user_data
     )
 {
     return;
 }
 
-
 static void
-cb_sq_main_window_close (
-        GtkWidget *widget,
+cb_sq_main_window_quit (
+        GtkAction *action,
         gpointer   user_data
     )
 {
@@ -398,8 +568,8 @@ cb_sq_main_window_close (
 }
 
 static void
-cb_sq_main_window_quit (
-        GtkWidget *widget,
+cb_sq_main_window_preferences (
+        GtkAction *action,
         gpointer   user_data
     )
 {
@@ -407,17 +577,22 @@ cb_sq_main_window_quit (
 }
 
 static void
-cb_sq_main_window_preferences (
-        GtkWidget *widget,
+cb_sq_main_window_reload (
+        GtkAction *action,
         gpointer   user_data
     )
 {
-    return;
+    SQMainWindow *window = SQ_MAIN_WINDOW (user_data);
+    LSQArchive *archive;
+
+    archive = sq_archive_store_get_archive( window->archive_store );
+    if ( NULL != archive )
+        g_object_unref( lsq_archive_operate( archive, LSQ_COMMAND_TYPE_REFRESH, NULL, NULL, NULL, NULL ) );
 }
 
 static void
 cb_sq_main_window_contents (
-        GtkWidget *widget,
+        GtkAction *action,
         gpointer   user_data
     )
 {
@@ -432,7 +607,7 @@ cb_sq_main_window_contents (
 
 static void
 cb_sq_main_window_about (
-        GtkWidget *widget,
+        GtkAction *action,
         gpointer   user_data
     )
 {
@@ -460,11 +635,89 @@ cb_sq_main_window_about (
     gtk_about_dialog_set_license((GtkAboutDialog *)about_dialog,
         xfce_get_license_text(XFCE_LICENSE_TEXT_GPL));
     gtk_about_dialog_set_copyright((GtkAboutDialog *)about_dialog,
-        "Copyright \302\251 2006-2013 Xfce Developers");
+        "Copyright \302\251 2006-2014 Xfce Developers");
 
     gtk_dialog_run(GTK_DIALOG(about_dialog));
 
     gtk_widget_destroy(about_dialog);
+}
+
+static void
+cb_sq_main_window_pathbar (
+        GtkToggleAction *action,
+        gpointer user_data
+    )
+{
+    SQMainWindow *window = SQ_MAIN_WINDOW (user_data);
+    gboolean active;
+    GtkAction *other_action;
+
+    active = gtk_toggle_action_get_active( action );
 
+    if ( active )
+    {
+        other_action = gtk_action_group_get_action(
+                window->action_group,
+                "view-location-selector-toolbar"
+            );
+
+        gtk_toggle_action_set_active( GTK_TOGGLE_ACTION( other_action ), FALSE );
+    }
+}
+
+static void
+cb_sq_main_window_toolbar (
+        GtkToggleAction *action,
+        gpointer user_data
+    )
+{
+    SQMainWindow *window = SQ_MAIN_WINDOW (user_data);
+    gboolean active;
+    GtkAction *other_action;
+
+    active = gtk_toggle_action_get_active( action );
+
+    if ( active )
+    {
+        other_action = gtk_action_group_get_action(
+                window->action_group,
+                "view-location-selector-pathbar"
+            );
+
+        gtk_toggle_action_set_active( GTK_TOGGLE_ACTION( other_action ), FALSE );
+    }
+}
+
+static void
+cb_sq_main_window_menubar (
+        GtkToggleAction *action,
+        gpointer user_data
+    )
+{
     return;
 }
+
+static void
+cb_sq_main_window_row_activated (
+        GtkTreeView *tree_view,
+        GtkTreePath *path,
+	GtkTreeViewColumn *column,
+        gpointer user_data
+    )
+{
+    SQMainWindow *window = SQ_MAIN_WINDOW (user_data);
+    GtkTreeIter iter;
+    LSQArchiveIter *entry;
+
+    if ( ! gtk_tree_model_get_iter( GTK_TREE_MODEL( window->archive_store ), &iter, path ) )
+        g_return_if_reached();
+
+    entry = sq_archive_store_get_archive_iter( window->archive_store, &iter );
+
+    if ( lsq_archive_iter_is_directory( entry ) )
+    {
+        sq_archive_store_set_root( window->archive_store, entry );
+    }
+
+    lsq_archive_iter_unref( entry );
+}
diff --git a/src/main_window.h b/src/main_window.h
index 2e7baae..6704eb9 100644
--- a/src/main_window.h
+++ b/src/main_window.h
@@ -21,41 +21,30 @@ G_BEGIN_DECLS
 
 #define SQ_TYPE_MAIN_WINDOW sq_main_window_get_type()
 
-#define SQ_MAIN_WINDOW(obj)		 ( \
-		G_TYPE_CHECK_INSTANCE_CAST ((obj),	\
-			sq_main_window_get_type(),	  \
-			SQMainWindow))
+#define SQ_MAIN_WINDOW(obj)                \
+        G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+            sq_main_window_get_type(),     \
+            SQMainWindow)
 
-#define SQ_IS_MAIN_WINDOW(obj)	  ( \
-		G_TYPE_CHECK_INSTANCE_TYPE ((obj),	\
-			sq_main_window_get_type()))
+#define SQ_IS_MAIN_WINDOW(obj)             \
+        G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+            sq_main_window_get_type())
 
-#define SQ_MAIN_WINDOW_CLASS(klass) ( \
-		G_TYPE_CHECK_CLASS_CAST ((klass),	 \
-			sq_main_window_get_type(),	  \
-			SQMainWindowClass))
+#define SQ_MAIN_WINDOW_CLASS(klass)        \
+        G_TYPE_CHECK_CLASS_CAST ((klass),  \
+            sq_main_window_get_type(),     \
+            SQMainWindowClass)
 
-#define SQ_IS_MAIN_WINDOW_CLASS(klass) ( \
-		G_TYPE_CHECK_CLASS_TYPE ((klass),		\
-			sq_main_window_get_type()))
+#define SQ_IS_MAIN_WINDOW_CLASS(klass)     \
+        G_TYPE_CHECK_CLASS_TYPE ((klass),  \
+            sq_main_window_get_type())
 
 typedef struct _SQMainWindowPriv SQMainWindowPriv;
 
 typedef struct _SQMainWindow SQMainWindow;
 
-struct _SQMainWindow
-{
-	GtkWindow parent;
-    SQMainWindowPriv *priv;
-};
-
 typedef struct _SQMainWindowClass SQMainWindowClass;
 
-struct _SQMainWindowClass
-{
-	GtkWindowClass parent;
-};
-
 GtkWidget *
 sq_main_window_new (void);
 
diff --git a/src/main_window_ui.xml b/src/main_window_ui.xml
index a6cfdc4..85f5444 100644
--- a/src/main_window_ui.xml
+++ b/src/main_window_ui.xml
@@ -4,8 +4,6 @@
             <menuitem action="open"/>
             <placeholder name="placeholder-open-recent"/>
             <separator/>
-            <menuitem action="save-copy"/>
-            <separator/>
             <menuitem action="properties"/>
             <menuitem action="close"/>
             <menuitem action="quit"/>
@@ -13,9 +11,25 @@
         <menu action="edit-menu">
             <menuitem action="preferences"/>
         </menu>
+        <menu action="view-menu">
+            <menuitem action="reload" />
+            <separator />
+            <menu action="view-location-selector-menu">
+                <menuitem action="view-location-selector-pathbar" />
+                <menuitem action="view-location-selector-toolbar" />
+            </menu>
+            <menuitem action="view-menubar" />
+        </menu>
         <menu action="help-menu">
             <menuitem action="contents"/>
             <menuitem action="about"/>
         </menu>
     </menubar>
+
+    <toolbar name="location-toolbar">
+        <toolitem action="back" />
+        <toolitem action="forward" />
+        <toolitem action="parent-node" />
+        <toolitem action="root-node" />
+    </toolbar>
 </ui>

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list